Arduino si Processing – comunicare seriala
 Pe net , se gãsete literaturã suficientã, tutoriale şi exemple privind
comunicarea serialã
intre placa duino şi
PC. Una din variantele cele mai accesibile de abordat este Processing 2.0. O sa
postez câteva
din încercãrile mele , care au
funcţionat,
fãrã prea multe referiţe teoretice .Doar
strictul nrcesar pentru cine vrea sã încerce. 
1.Date
de la Arduino la Processing :
- am încãrcat în Arduino Uno sketch-ul
“serialAut”:
/* serialAut – trimite secvental
la ‘serialIn’ din Processing  expresia
“Hello World!”
Pe portul serial Com3 – in cazul meu */
 void setup() 
{
// initialize serial
communications at a 9600 baud rate
Serial.begin(9600);
}
void loop()
{
//
trimite  'Hello, world!'  la portul serial 
Serial.println("Hello,
world!");
      //asteaptã  100 millisecunde 
delay(100);
}
........................................................................................................................ 
Dupa încãrcarea pe Arduino şi verificarea în Serial Monitor , programul Arduino 
1.0  poate fi oprit.
Afişarea stringulu transmis se face în Processing  
Programul din
Processing care peia datele serial de la Com3 trimise de Arduino:
……………………………………………………………………………………………………..
//serialIn.pde
//merge !
Serial myPort;   // Creazã un obiect
din clasa Serial 
String val;          // reţine datele primate de la portul seria
  // aflat în lista Serial.list()[0].  In  Windows, la mine se      //deschid COM1 şi COM3. In Processing
primul port deschis //apare cu (0) iar al doilea cu (1)
void setup(){
String portName =
Serial.list()[1]; //schimb  0 la 1 
//sau portul pe care
lucreazã
Arduino ! 
myPort = new
Serial(this, portName, 9600); 
}
void draw(){
  if ( myPort.available() > 0)  {  // daca
au intrat date pe port,
       val = myPort.readStringUntil('\n');    
     // le citeşte şi le preia în  variabila val
  } 
println(val);      //print it out in the console
}
………………………………………………………………….
Datele preluate
(Hello World) sînt
afişate
în
partea de
jos a interfeţei Processing.
2.Date
transmise de la Processing la Arduino 
In acest exemplu, sketch-ul
“ardIn” primeşte caracterul 1 trimis
din Processing de la  “outPro”. Dacã facem click  (sau ţine apasat  butonul stânga mouse) în mini displayul afişat de Processing la
rulare, ledul de la pin 13 se aprinde.
3.Comunicare
bilaterala (partea 1)  “Shaking Hands”
 Până acum am arătat
că Arduino și Processing pot comunica serial
atunci când unul “vorbește” și celălalt  “ascultã”. Putem face
un link care permite datelor să circule în ambele sensuri, astfel încât Arduino
și Processing
sa trimita  și sa primeasca date?
 În biz acest lucru este
denumit “Shaking Hands” (strângere de mână) , deoarece ambele părți trebuie să fie de acord atunci când  trimit și
primesc  date.
Pe aceasta paginã și următoarea, vom combina cele două
exemple  anterioare, în așa fel încât Processing poate primi  "Bună ziua, lume!" de la Arduino și poate trimite un 1 înapoi la Arduino pentru a
comuta un LED. 
Desigur, acest lucru înseamnă, de asemenea, că Arduino
trebuie să fie capabil să trimită "Bună ziua, lume!" în timp ce asculta pe
portul serial  pentru a primi  un 1 de la Processing. !
Să începem cu partea
Arduino a lucrurilor. Pentru ca acest lucru să ruleze fără probleme, ambele părți trebuie să știe
ce să asculte și ce trebuie sã trimitã  cealaltă parte, ce așteaptă să audă.
 De asemenea,
dorim să reducem la minimum traficul de pe portul serial așa ca sã putem obține
mai multe răspunsuri în timp util.
Avem nevoie de o
variabilă pentru datele noastre de intrare și
o variabilă pentru pinul LED pe care  dorim sa îl  aprindem. In Arduino se încarca scriptul   arduWR.ino:
………………………………………………………………………………………….
/*  arduWR  
*/
char val;                                          //retine data receptionata de la
portul serial
int ledPin = 13;                                // seteaza    pin-ul 13 pentru pentru led   
boolean ledState =
LOW;                             //
retine starea LED-ului si o initializeaza LOW 
void setup() 
{
  pinMode(ledPin, OUTPUT);             // seteaza  pinul  ca
 OUTPUT
                                                      //initializeaza
comunicarea seriala la 9600 baud 
  Serial.begin(9600);
  establishContact();  // trimite un byte pentru a stabli contactul atit
timp cit  recetorul raspunde 
}
void loop()
{
  if (Serial.available() > 0) {     // daca datele sint disponibile pt a fi
citite
   val = Serial.read();            // 
citeste si le preia in variabila 
val
   if(val == '1')                      //daca a fost 
trimis ‘1’
    {
       ledState = !ledState;      // comuta starea anterioara a LED-ului:
dca a fost stins il aprinde, si invers 
       digitalWrite(ledPin, ledState); 
    }
    delay(100);                 
  } 
    else {
    Serial.println("Hello, world!");          //altfel daca nu este ‘1’ trimite
inapoi sirul hello world
    delay(50);
    }
}
void
establishContact() {
  while (Serial.available() <= 0) {
  Serial.println("A");   // trimite caracterul   A
  delay(300);
  }
}
………………………………………………………………………………………………………..
 In Processing , se editeaza / deschide
scriptul “procWR”
…………………………………………………………………..
//procWR
 import processing.serial.*; //import the
Serial library
 Serial myPort; 
//the Serial port object
 String val;  
// deoarece facem “serial handshaking”, 
//
este nevoie sa verificam ce auzim de la microcontroller
boolean firstContact
= false;
void setup() {
  size(200, 200);       //make our canvas 200 x 200 pixels big
                               // 
initialize your serial port and set the baud rate to 9600
  myPort = new Serial(this, Serial.list()[1],
9600);
  myPort.bufferUntil('\n'); 
}
void draw() { //  putem pstra metoda draw goala
                   // pentru că toate
programul nostru se petrece în serialEvent (vezi mai jos)}
void serialEvent(
Serial myPort) {
//
preia data sosita intr-un String
//
'\n' este delimitatorul   final, care
indica sfirsitul pachetului de date care a fost primit  complet
val =
myPort.readStringUntil('\n');
//
verificam daca datele noastre nu sint nule , inainte de a continua
if (val != null) {
                  //eliminam  spațiile
goale și caracterele de formatare (cum ar
fi retur de car)
  val = trim(val);
 println(val);
      //
ne uitam
dupa șirul  "A" 
noastre pentru “start
the handshake”
       //daca sirul ‘a’ este prezent, golim  the buffer-ul , si trimitem o cerere de date (
request for data)
  if (firstContact == false) {
    if (val.equals("A")) {
      myPort.clear();
      firstContact = true;
      myPort.write("A");
      println("contact");
    }
  }
  else { // daca am stability udeja un contact,
pastram achizitia si preluam datele si le analizam
    println(val);
    if (mousePressed == true) 
    {                           //if we clicked in
the window
      myPort.write('1');        //send a 1
      println("1");
    }
                              //
when you've parsed the data you have, ask for more:
    myPort.write("A");
    }
  }
}
…………………………………………………………………………………………..
Cu board-ul Arduino
cuplat la portul serial ( si avind montat LED-ul cu resistor la pin13), se ruleazã “procWR” cu Processing 2 .
 La rularea programului , la click-uri
consecutive  în miniDisplay-ul
deschis din Processing, LED-ul se aprinde şi se stinge. 
Atentie : dacã portul serial este
scris corect în
Processing, totul merge din prima încercare !
Porturile în Processing sunt
numerotate cu 0; 1; 2; 3. Eu am pus 1 pentru cã am douã porturi active :
Com1 şi
COM3. La mine în
PC, portul  COM3 este al doilea port
serial si se deschide când
cuplez boardul Arduino    
Tutorialul original se regãseãte la link-ul  
https://learn.sparkfun.com/tutorials/connecting-arduino-to-processing/to-processing
Niciun comentariu:
Trimiteți un comentariu