Arduino

Sujets variés concernant le développement en PureBasic
gigi75
Messages : 8
Inscription : mer. 01/mars/2017 22:40

Arduino

Message 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.
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Arduino

Message 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:
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
gigi75
Messages : 8
Inscription : mer. 01/mars/2017 22:40

Re: Arduino

Message 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
Avatar de l’utilisateur
François
Messages : 26
Inscription : mar. 14/juin/2016 12:31

Re: Arduino

Message 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).
gigi75
Messages : 8
Inscription : mer. 01/mars/2017 22:40

Re: Arduino

Message 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
gigi75
Messages : 8
Inscription : mer. 01/mars/2017 22:40

Re: Arduino

Message 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
gigi75
Messages : 8
Inscription : mer. 01/mars/2017 22:40

Re: Arduino

Message 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
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Arduino

Message 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:
gigi75
Messages : 8
Inscription : mer. 01/mars/2017 22:40

Re: Arduino

Message par gigi75 »

Tu ne ferais pas de la thermo?
gigi75
Messages : 8
Inscription : mer. 01/mars/2017 22:40

Re: Arduino

Message 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.
gigi75
Messages : 8
Inscription : mer. 01/mars/2017 22:40

Re: Arduino

Message 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)
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Arduino

Message 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);
}
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Arduino

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
François
Messages : 26
Inscription : mar. 14/juin/2016 12:31

Re: Arduino

Message 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".
Répondre