Page 1 sur 3

Arduino & PureBasic

Publié : ven. 13/avr./2012 18:20
par G-Rom
Suite à ce post : http://www.purebasic.fr/french/viewtopi ... =1&t=12714
voici une brève explication sur la communication entre le module Arduino & PureBasic.

L'Arduino utilise le rs232 pour communiquer entre lui & son IDE de programmation ( même si il est branché en usb... )
L'arduino possède une librairie interne qui gère la communication serial , comme purebasic , à partir de là, on peut faire communiqué les 2 ( vive les standard de com ! )

une petite vidéo de démo :
http://www.youtube.com/watch?v=DsyJhQhF ... Cmh3ETU%3D

dans ce petit exemple , je contrôle une led bgr via une interface purebasic et 3 trackbars
le principe est simple :

PureBasic envois dans un premier temps quelle couleur il veut modifier , rouge , vert ou bleu. ( 0 , 1 ou 2 )
il attend un petit delais ( 10ms voir moins ) puis il envois une valeur de 0 à 255 qui sera l'intensité du signal pwm en sortie de l'arduino.


le code PB:

Code : Tout sélectionner

Declare SendLedValue(LedID.i, value.c)


#ARDUINO_COM = "COM35" ; CHANGE MOI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#LED_RED   = 0
#LED_GREEN = 1
#LED_BLUE  = 2



CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Port$ = #ARDUINO_COM
CompilerElse
  Port$ = "/dev/ttyS0"
CompilerEndIf


UseJPEGImageDecoder()
img = LoadImage(#PB_Any,"led.jpg")

wnd = OpenWindow(#PB_Any,0,0,640,255,"ARDUINO LED RGB")



ImageGadget(#PB_Any,10,10,1,1,ImageID(img),#PB_Image_Border )

TextGadget(#PB_Any,190 + 64,10 ,120,32,"RED",#PB_Text_Center)
TextGadget(#PB_Any,190 + 196,10,120,32,"GREEN",#PB_Text_Center)
TextGadget(#PB_Any,190 + 328,10,120,32,"BLUE",#PB_Text_Center)

RED_GADGET      = TrackBarGadget(#PB_Any ,190+64+46  , 40,32,190,0,255,#PB_TrackBar_Vertical)
GREEN_GADGET    = TrackBarGadget(#PB_Any ,190+196+46 , 40,32,190,0,255,#PB_TrackBar_Vertical)
BLUE_GADGET     = TrackBarGadget(#PB_Any ,190+328+46 , 40,32,190,0,255,#PB_TrackBar_Vertical)




If OpenSerialPort(0, Port$, 9600,  #PB_SerialPort_NoParity  , 8, 1, #PB_SerialPort_XonXoffHandshake, 4, 4)

  
  Repeat
    event = WindowEvent()
    
    
      If event = #PB_Event_Gadget
        gadgetID.i = EventGadget()
                
        If gadgetID = RED_GADGET
          value = GetGadgetState(RED_GADGET)
          SendLedValue(#LED_RED,value)
        EndIf 
        
        
        If gadgetID = GREEN_GADGET
          value = GetGadgetState(GREEN_GADGET)
          SendLedValue(#LED_GREEN,value)
        EndIf 
        
        
        If gadgetID = BLUE_GADGET
          value = GetGadgetState(BLUE_GADGET)
          SendLedValue(#LED_BLUE,value)
        EndIf 
      EndIf 




  Until event = #PB_Event_CloseWindow
  
  SendLedValue(#LED_RED,0)
  SendLedValue(#LED_GREEN,0)
  SendLedValue(#LED_BLUE,0)
  
  End 
  

Else
	MessageRequester("Error", "Can't open the serial port: "+Port$)
EndIf





Procedure SendLedValue(LedID.i, value.c)
  Protected LED_COMP.c = 0  
  
  Select LedID
    Case #LED_RED
      LED_COMP = 0
      WriteSerialPortData(0, @LED_COMP, 1)
      
    Case #LED_GREEN
      LED_COMP = 1
      WriteSerialPortData(0, @LED_COMP, 1)
      
    Case #LED_BLUE
      LED_COMP = 2
      WriteSerialPortData(0, @LED_COMP, 1)
      
  EndSelect
  Delay(1) ; Delais important , sinon risque pour l'arduino de recevoir en même temps les 2 données...
    myValue.c = value
    WriteSerialPortData(0, @myValue , 1)
  Delay(1)
EndProcedure





le code Arduino:

Code : Tout sélectionner

// ARDUINO UNO ET INTERFACAGE AVEC PUREBASIC 
// COMMANDE D'UNE LED BGR VIA LE PORT SERIE  

// PUREBASIC ENVOIS LA COMMANDE EN 2 FOIS
// LA COMPOSANTE DANS UNE PREMIER TEMPS : R G ou B
// PUIS LA VALEUR DE 0 A 255


int byteReceived    = 0; // Nombre d'octet recu par PB
#define LED_RED         3
#define LED_GREEN       5
#define LED_BLUE        6
int CURRENT_LED_PIN = 0;

byte RED_VALUE   = 0;
byte GREEN_VALUE = 0;
byte BLUE_VALUE  = 0;


// 0 = Attente de la composante
// 1 = Attente de la valeur
int MESSAGE_MODE  = 0;


void setup()
{
  // On ouvre le port serie , les pin 0 & 1 sont inutilisable
  // sur la carte arduino
  Serial.begin(9600);

  // On passe les pin de commande de la led en mode "sortie"
  /*
  pinMode(LED_RED,   OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE,  OUTPUT);
*/
}


void loop()
{
TOP:

  if (Serial.available() > 0) 
  {
    byteReceived = Serial.read();


    byte data = byte(byteReceived);

    if ( MESSAGE_MODE == 0 ) // On recois une commande pour selectionné la composante
    {
      switch(data)
      {
      case 0:
        CURRENT_LED_PIN = LED_RED;
        break;

      case 1:
        CURRENT_LED_PIN = LED_GREEN;
        break;

      case 2:
        CURRENT_LED_PIN = LED_BLUE;
        break;
      }

      MESSAGE_MODE = 1; 
      goto TOP;
    }


    if ( MESSAGE_MODE == 1 )
    {
      byte value = byte(byteReceived);
      switch(CURRENT_LED_PIN)
      {
        case (LED_RED):
          RED_VALUE = value;
        break;

        case (LED_GREEN):
          GREEN_VALUE = value;
        break;

        case (LED_BLUE):
          BLUE_VALUE = value;
        break;
      }
      MESSAGE_MODE = 0; 
      goto TOP;
    }
  }
  
  
 // Mise à jour de la led
  analogWrite(LED_RED,RED_VALUE); 
  analogWrite(LED_GREEN,GREEN_VALUE); 
  analogWrite(LED_BLUE,BLUE_VALUE); 


}




Re: Arduino & PureBasic

Publié : ven. 13/avr./2012 19:43
par Droopy
Bon exemple.
On doit pouvoir faire la même chose en bluetooth

Re: Arduino & PureBasic

Publié : ven. 13/avr./2012 19:45
par G-Rom
Tu peut tout faire , avec ou sans Arduino (max232 & pic) , du moment que tu as un module qui communique avec PB, tout est faisable , on pourrais gérer une maison complète en domotique avec PureBasic.

Re: Arduino & PureBasic

Publié : ven. 13/avr./2012 19:55
par Backup
c'est pas Golfy qui a fait ça ( Velbus ) ? (domotique )
http://www.purebasic.fr/french/viewtopi ... lit=velbus

Re: Arduino & PureBasic

Publié : ven. 13/avr./2012 20:24
par G-Rom
c'est pas pareil , ici on parle de communication série avec le hardware arduino. lui utilise une dll fournie. ;)

Re: Arduino & PureBasic

Publié : sam. 21/avr./2012 5:03
par MetalOS
Milles merci G-Rom grace à toi je vais pouvoir faire plein de truc avec PB et ma carte Arduino. Encore merci.

Re: Arduino & PureBasic

Publié : jeu. 21/févr./2013 20:19
par MetalOS
Je relance un peut le sujet car j'aurais voulu savoir si il était possible de programmer un moniteur série pour récupérer les messages de la carte Arduino sans le compilateur de l'IDE Arduino. Le lib RS232 et t'elle suffisante ?

Re: Arduino & PureBasic

Publié : ven. 22/févr./2013 22:08
par G-Rom
Bien sur , du moment que le com & baud correspondent à ton programme arduino , pas de problème.
tu peut tout faire , commander des volets , ta cafetière , etc...

d'ici quelques mois j'attaquerais une cnc avec un logiciel de routage fait en PB ! ;)

Re: Arduino & PureBasic

Publié : ven. 22/févr./2013 22:54
par wood51
[HS]
Et j'espère que le compilateur sera fonctionnel :mrgreen:
[/HS]

Re: Arduino & PureBasic

Publié : sam. 23/févr./2013 0:17
par MetalOS
Une CNC ??? Pour faire de la gravure de CI à l'anglaise ?

Re: Arduino & PureBasic

Publié : sam. 23/févr./2013 1:18
par MetalOS
Voilà, je partage ici ce que je voulais faire. L'exemple et très simple et marche très bien sous Ubuntu. Il faut que je test encore sous Windows et Mac OS X.

Code : Tout sélectionner

;by MetalOS


OpenSerialPort(1,"/dev/ttyACM0",9600,#PB_SerialPort_EvenParity,8,1,#PB_SerialPort_NoHandshake,1024,1024) ;Changer le port et la vitesse au besoin
OpenWindow(1,0,0,500,500,"Moniteur série Arduino",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  ButtonGadget(1,5,5,70,25,"Effacer")
  EditorGadget(2,5,40,490,400,#PB_Editor_ReadOnly)

  Repeat
    event=WaitWindowEvent(20)
    Select event
      Case #PB_Event_CloseWindow
        CloseSerialPort(1)
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            SetGadgetText(2,"")
        EndSelect
    EndSelect
    If IsSerialPort(1)
      input=AvailableSerialPortInput(1)
      If input
        a$=Space(input)
        ReadSerialPortData(1,@a$,input)
        text$=GetGadgetText(2)+a$
        SetGadgetText(2,text$)

      EndIf
    EndIf
  Until event=#PB_Event_CloseWindow
Par-contre j'aimerais bien que l'EditorGadget défile en même temps que le texte pour qu'il ne reste pas bloqué sur les première lignes. Je suis peut être un pinpin sur le coup là mais impossible de trouver comment faire. :oops:

Re: Arduino & PureBasic

Publié : sam. 23/févr./2013 4:12
par graph100
tu peux aussi ajouter ton texte au début pour que les dernier évènements soit affichés en haut !

Re: Arduino & PureBasic

Publié : sam. 23/févr./2013 5:47
par MetalOS
Tu fais ça comment ?

Re: Arduino & PureBasic

Publié : sam. 23/févr./2013 8:12
par wood51
Salut ,
Il faut que tu utilise SetGadgetItemText a la place de SetGadgetText

Re: Arduino & PureBasic

Publié : sam. 23/févr./2013 9:05
par MetalOS
C'est ce que je pensais utiliser aussi mais rien ne s'affiche. Ce qui est plutôt bizarre.