Page 1 sur 1

Arduino

Publié : mer. 01/mars/2017 22:47
par gigi75
Bonjour à tous,

Je débute, 45 ans, et je vous écris pour avoir une aide sur ardin.
Programmer la carte, je sais faire. Pure basic je ne connais pas.
Pourriez vous me donner un exemple en trois lignes, juste pour envoyer un caractère du pc à la carte, et recevoir de la carte au pc.
Si le langage me convient, j'achèterais une licence.
Je dis trois lignes, je ne veux pas un programme avec plusieur fonction, juste envoyer et recevoir simplement pour comprendre.

Merci beaucoup.

Re: Arduino

Publié : mer. 01/mars/2017 23:21
par JohnJohnsonSHERMAN
Vite fait, tu peux utiliser la librairie Serial Port qui permet le contrôle des ports RS232 avec PB. Comme l'Arduino est virtuellement mappé sur un port COM virtuel (il me semble), il est possible de communiquer avec depuis un programme Purebasic, d'ailleurs divers codes ont déja été postés sur le forum :)

Voici un tuto trés intéressant :
Arduino & Purebasic, par G-Rom

Là sur le moment je n'ai pas de code à te donner, mais le tuto de G-Rom en propose d'assez simples à comprendre. Je suppose que tu connais les bases du langage? (Au pire ca s'apprend vite :) )

Un peu plus bas dans le tuto, il y a un code qui recoit toute info envoyée par l'Arduino

Ben dis donc tu viens de me redonner l'envie d'acheter une Arduino, maintenant que je m'y suis un peu replongé :P Vu que ca fait environ 2-3 ans que j'y pense, serait p'têtre temps que je passe a la case achat :mrgreen:
PS : Tu peux dans un premier temps utiliser la version démo de Purebasic qui sera amplement suffisante pour de petits programmes interagissant avec l'arduino, et une fois que t'as bien tout en main et que t'est content, acheter la license pour faire de plus gros projets...
En tant qu'irréductible utilisateur de la démo je vais encore me faire huer du reste de la communauté :mrgreen:

Re: Arduino

Publié : jeu. 02/mars/2017 8:24
par gigi75
Salut,

Merci pour le tuto, je l'avais déjà vu. Un peut complique pour l'instant. Mon idéal serait de faire une fonction pour envoyer un caractere sur l'arduino pour récupérer un résultat. La carte est déjà programmée. J'envois "L", elle me renvoie un nombre.

Merci déjà pour avoir répondu. En basic256, tu as :
Openserial (1, "COM1", 9600) ´´´ tu ouvres le port.
Write (1,"L"). ´´´ tu envoies sur le port

Ou

Tu lis sur le port. Read (1,a$)

Gilles

Re: Arduino

Publié : jeu. 02/mars/2017 8:38
par François
Bonjour gigi75,

Bienvenue sur le forum.

J'utilise PureBasic pour contrôler un Arduino. C'est assez simple et voici un exemple (beaucoup de ligne car pas mal de commentaires) :

Code : Tout sélectionner

;-----------------------------------------------------------------------:
;     --- Choix du "bon" vieux mode console du temps du MS-DOS ---      :
;-----------------------------------------------------------------------:
OpenConsole()

;-------------------------------------------:
; Adresse du port série (11 dans mon cas)   :
;-------------------------------------------:
NPort.s = "COM11" 

;-----------------------:
;   Ouverture du port   :
;-----------------------:
PortId.i = OpenSerialPort(#PB_Any, NPort, 9600, #PB_SerialPort_NoParity  , 8, 1, #PB_SerialPort_XonXoffHandshake, 4, 4)   

;---------------------------------:
;   Texte à envoyer à l'Arduino   :
;---------------------------------:
Cmd.s = "0:25:0:0:0"

;--------------------------------------------:
;   Terminaison de la chaîne de caractères   :
;--------------------------------------------:
EOL = 13 

;-------------------------:
;   Ecriture surle port   :
;-------------------------:
WriteSerialPortString(PortId, Cmd", #PB_Ascii)       ; Envoi sur port série.
WriteSerialPortData(PortId, @EOL, 1)


;------------------------------------------:    
;    Dimensionnement buffer de réception   :    
;------------------------------------------:
    b_size = 100                                      ; Taille du buffer.
    *Byte = AllocateMemory(b_size)                    ; Pointeur pour retour.
      
    Bytes = AvailableSerialPortInput(NPort)           ; Initialisation 
    
    While(Bytes = 0)                                  ; Boucle jusqu'à retour réponse.
        Delay(100)
        Bytes = AvailableSerialPortInput(NPort)
    Wend
      
    Result = ReadSerialPortData(NPort, *Byte, Bytes)  ; Lecture réponse.
    
    Rep.s = PeekS(*Byte, Result, #PB_Ascii)           ; Transfert mémoire vers Rep 

a$=Input()                  ; Pause avant fermeture du programme.

CloseSerialPort(PortId)     ; Fermeture du port.
J'ai vu que la lecture pouvait être plus simple que ce que j'ai fait

Evidemment, j'ai tout intégré dans des fonctions et également créé une DLL (en PureBasic) pour utiliser mes dispositifs avec d'autres langages (python, ImageJ, VBA Excel, ...).

J'espère que cela peut t'aider.

PS : la version payante de PureBasic n'est pas très coûteuse et l'acheter peut aider ceux qui l'a développe (dont je ne suis pas).

Re: Arduino

Publié : jeu. 02/mars/2017 17:08
par gigi75
Bonjour à vous,

Pour envoyer un caractère à la carte, j'ai bien compris, et cela fonctionne bien.

Code : Tout sélectionner

ardu.i=OpenSerialPort (#PB_Any,"COM3", 9600, #PB_SerialPort_NoParity,8,1, #PB_SerialPort_NoHandshake,0,0)
OpenConsole()
WriteSerialPortString (ardu.i, "V", #PB_Ascii)
En trois lignes.
Mais pour recevoir un nombre ou une chaine de caractères de la carte, là je nage, et je coule. En trois lignes, n'est pas possible? Si je lis bien l'exemple, je passe les données en mémoire pour allez les afficher.
Je couleeeeee, là

Gilles

Re: Arduino

Publié : jeu. 02/mars/2017 17:27
par gigi75
Re bonjour,

Lorsque j'écris votre exemple, le programme me dit : Que le port com n'est pas réinitialisé.

Code : Tout sélectionner

Bytes = AvailableSerialPortInput (NPort)
Gilles

Re: Arduino

Publié : jeu. 02/mars/2017 17:27
par gigi75
Re bonjour,

Lorsque j'écris votre exemple, le programme me dit : Que le port com n'est pas réinitialisé.

Code : Tout sélectionner

Bytes = AvailableSerialPortInput (NPort)
Gilles

Re: Arduino

Publié : jeu. 02/mars/2017 17:29
par Marc56
gigi75 a écrit : Mais pour recevoir un nombre ou une chaine de caractères de la carte, là je nage, et je coule. En trois lignes, n'est pas possible? Si je lis bien l'exemple, je passe les données en mémoire pour allez les afficher.
Un petit code que j'avais fait (dérivé d'un code d'Infratec)

Code : Tout sélectionner

; Read datas from Arduino who send random number 10-99
; Based on the infratec proposed solution on topic: RS-232 receive data
; http://www.purebasic.fr/english/viewtopic.php?f=13&t=64875&hilit=ReadSerialPortData

Enumeration
     #Win
     #Incoming
     #hPort
     #Sec
EndEnumeration

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
     Port$ = "/dev/ttyACM0"
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
     Port$ = "COM4"
CompilerEndIf

OpenWindow(#Win, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#Incoming, 10, 10, 480, 280)
AddWindowTimer(#Win, #Sec, 100)

If OpenSerialPort(#hPort, Port$, 9600,
                  #PB_SerialPort_NoParity, 8, 1,
                  #PB_SerialPort_NoHandshake, 1024, 1024)
     Debug "OK Port " + Port$ + " Open"
     Debug "Waiting for incoming data..."
Else
     Debug ~"Serial Port not initialized.\r\nProgram Ends."
     End
EndIf     

Delay(2000)

Procedure Read_Arduino()
     While AvailableSerialPortInput(#hPort)
          If ReadSerialPortData(#hPort, @Buffer, 1)
               Debug Buffer
               AddGadgetItem(#Incoming, -1, Str(Buffer))
          EndIf
     Wend
EndProcedure 


Repeat
     Select WaitWindowEvent()
          Case #PB_Event_Timer
               Read_Arduino()
          Case #PB_Event_CloseWindow
               CloseSerialPort(#hPort)
               End
     EndSelect
ForEver

End 
Le Delay(2000) est important car la carte arduino se réinitialise à la connexion donc il faut un temps d'attente

:wink:

Re: Arduino

Publié : jeu. 02/mars/2017 17:42
par gigi75
Tu ne ferais pas de la thermo?

Re: Arduino

Publié : jeu. 02/mars/2017 17:51
par gigi75
Voila le rapport :

[17 :45 :49] [COMPILER] Ligne 9: Mauvais type de parametre: nombre attendu a la place d'une chaine de caracteres.
[17 :46 :14] Attente du démarrage du programme...
[17 :46 :14] Type d'exécutable: Windows - x64 (64bit, Unicode)
[17 :46 :14] Exécutable démarré.
[17 :46 :22] [ERREUR] essais.pb (Ligne: 14)
[17 :46 :22] [ERREUR] Le #SerialPort spécifié n'est pas initialisé.
[17 :46 :29] Exécution du programme terminée.
[17 :47 :38] Attente du démarrage du programme...
[17 :47 :38] Type d'exécutable: Windows - x64 (64bit, Unicode)
[17 :47 :38] Exécutable démarré.
[17 :47 :43] [ERREUR] essais.pb (Ligne: 15)
[17 :47 :43] [ERREUR] Le #SerialPort spécifié n'est pas initialisé.
[17 :47 :46] Exécution du programme terminée.
[17 :47 :54] Attente du démarrage du programme...
[17 :47 :54] Type d'exécutable: Windows - x64 (64bit, Unicode)
[17 :47 :54] Exécutable démarré.
[17 :48 :09] [ERREUR] essais.pb (Ligne: 15)
[17 :48 :09] [ERREUR] Le #SerialPort spécifié n'est pas initialisé.
[17 :48 :12] Exécution du programme terminée.
[17 :48 :51] Attente du démarrage du programme...
[17 :48 :51] Type d'exécutable: Windows - x64 (64bit, Unicode)
[17 :48 :51] Exécutable démarré.
[17 :49 :08] [ERREUR] essais.pb (Ligne: 15)
[17 :49 :08] [ERREUR] Le #SerialPort spécifié n'est pas initialisé.
[17 :49 :11] Exécution du programme terminée.

je ferme même le port, puis je l'ouvre, j'ai même mis Delay (5000), toujours le même Pb.
Cette erreur n'est pas au niveau de l'écriture vers la carte mais pour la lecture.

Re: Arduino

Publié : jeu. 02/mars/2017 17:55
par gigi75
Voilà mon premier programme :

Code : Tout sélectionner

ardu.i=OpenSerialPort (#PB_Any,"COM3", 9600, #PB_SerialPort_NoParity,8,1, #PB_SerialPort_NoHandshake,0,0)
OpenConsole()

OpenSerialPort (#PB_Any,"COM3", 9600, #PB_SerialPort_NoParity,8,1, #PB_SerialPort_NoHandshake,4,4)
Delay (5000)
b_size = 100
*Byte = AllocateMemory(b_size)
Bytes = AvailableSerialPortInput (NPort)

While(Bytes = 0)
  Delay(100)
  Bytes = AvailableSerialPortInput(NPort)
Wend
Result = ReadSerialPortData(NPort, *Byte, Bytes)
Rep.s = PeekS(*Byte, Result, #PB_Ascii)
Print (Rep)

Input()
CloseConsole()
L'éditeur montre l'erreur ici :

Code : Tout sélectionner

Bytes = AvailableSerialPortInput (NPort)

Re: Arduino

Publié : jeu. 02/mars/2017 18:05
par Marc56
Tu mélanges un peu deux façons de faire (#Pb_Any) :|
Ton NPort ne correspond à rien.
Tu utilises #PB_Any mais n'utilise pas le résultat

non (enfin, oui possible aussi)

Code : Tout sélectionner

ardu.i=OpenSerialPort (#PB_Any ...
Plus simple à utiliser

Code : Tout sélectionner

OpenSerialPort (ardu ...
...

Code : Tout sélectionner

Bytes = AvailableSerialPortInput (ardui)
etc

Essaye mon exemple avant d'en créer un nouveau

Pour bien comprendre chaque commande, clique dessus (dans l'éditeur) et presse F1 :wink:

PS. Le code qui tourne sur ma carte

Code : Tout sélectionner

long randNumber;

void setup(){
  Serial.begin(9600);
  // if analog input pin 0 is unconnected, random analog
  // noise will cause the call to randomSeed() to generate
  // different seed numbers each time the sketch runs.
  // randomSeed() will then shuffle the random function.
  randomSeed(analogRead(0));
}

void loop() {
  // print a random number from 10 to 99
  randNumber = random(10, 99);
  Serial.println(randNumber);

  delay(1000);
}

Re: Arduino

Publié : mar. 07/mars/2017 9:45
par microdevweb
Pour ma part même si Pb reste un excellent langage il n'est pas idéal pour le développement de microcontrôleurs.

Il vaut mieux utilisé Atmel Studio (gratuit) en C/C++, mais cela requière certaines connaissances aux point de vue des opérateurs logiques et des registres de µs concerné pour la configuration des timers et l'usart.

Le logiciel Arduino reste le plus simple avec ses librairies qui demande nettement moins de connaissances, une connaissance basique du C est juste nécessaire.

Re: Arduino

Publié : mar. 07/mars/2017 10:39
par François
J'utilise l'Arduino pour des applications professionnelles car, comme le signale "microdevweb", sa programmation est très simple et la communauté autour est très active. Il existe une version "pro" chez ST avec le Nucleo qui est presque compatible.

La quantité de projet autour d'Arduino est très grande et il existe de nombreux "shields", des cartes et composants tout faits très simple à mettre en oeuvre : la réalisation de prototypes fonctionnels peut être très rapide.

J'ai un peu galéré pour communiquer avec PureBasic via le FTDI (mais pas moins qu'avec Visual Basic 6) : PureBasic est trop rapide et il faut bien contrôler les échanges. J'ai mis en place un protocole de communication, simpliste coté Arduino, un peu plus évolué côté PC. Ce protocole d'échange est très fiable. J'ai également encapsulé les fonctions principales dans une DLL écrite en PureBasic (que c'est facile à faire, du PureB...onheur) que j'exploite en PureBasic, évidemment, en python et bientôt avec le logiciel de traitement d'image ImageJ.

Quand j'aurai suffisamment finalisé ce travail, je prévoie de le proposer au Forum sous forme de tutoriel. Si des personnes sont intéressés aujourd'hui, je pourrai leur transmettre "en l'état".