Fórum témák

» Több friss téma
Cikkek » MMA7260QT gyorsulásmérő használata AVR-rel
MMA7260QT gyorsulásmérő használata AVR-rel
Szerző: Fizikus, idő: Szept 21, 2010, Olvasva: 25841, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   5 / 9

Az ATMega8 által a soros porton keresztül érkező adatokat akarjuk grafikusan megjeleníteni. Ehhez először azt kell kideríteni, hogy az általam használt USB-TTL átalakító által létrehozott COM17-es virtuális soros porthoz a Processing milyen sorszámot rendelt. Az alábbi kis Processing program kilistázza az elérhető soros portokat:

Processing kód:

  1. import processing.serial.*;
  2. Serial myPort;  // Create object from Serial class
  3. println(Serial.list());  // This will print a lisi of serial ports

A képről látható, hogy a COM17 sorszáma a [2]. A Processing kódban, amikor létrehozzuk a soros kapcsolatot, akkor ezzel a sorszámmal tudunk hivatkozni a COM17-es portra.

Grafikus adatábrázoló rutin Processing-gel

Azért, hogy az AVR-t ne nagyon terheljük le, csak a nyers mérési eredményeket küldjük a PC-re, az adatok feldolgozása (amelyekkel az AVR csak igen lassan boldogulna) a Processing-gel történik majd. Nézzük meg, hogyan!

Amint azt korábban már láthattuk, az AVR kódja elég egyszerű: a soros porton keresztül kapott parancs után (`m` karakter) beolvassa a gyorsulásmérő analóg kimeneteit, majd az eredményt UART-on keresztül elküldi a PC-re. Ezt felhasználhatjuk a Processing-gel történő szinkronizálásra egy ún. call-and-response módszert használva. Az AVR nem méri és küldi magától folyamatosan a gyorsulásmérő jeleit a Processing-nek. Mert nem akarjunk azt feleslegesen leterhelni. Az AVR csak akkor végez el egy mérést és továbbítja annak eredményét a PC felé, ha előtte  a Processing-től erre utasítást kap.


Ennek megfelelően a Processing programunk főbb lépései a következők lesznek:

  1. egy `m` karakter küldésével arra utasítja az AVR-en futó kódot, hogy végezzen el egy mérést
  2. a mérés eredményét UART-on keresztül küldje el a PC-re, a Processing-nek
  3. a Processing a soros porton beérkező adatokat egy pufferbe olvassa mindaddig amíg egy “újsor” `\n` karaktert nem kap
  4. a beérkezett adatokat a vesszőknél szétválasztja, majd újra számokká alakítja
  5. a számokat a Processing kód grafikusan megjeleníti

A program futása közben az `x` , `y` vagy `z` billentyűt lenyomva kiválaszthatjuk hogy melyik tengely mentén mért értékeket jelenítse meg a program.


Az alábbi ábra az X tengely értékeit mutatja. A gyorsulásmérőt vízszintes helyzetből indítva, először balra, majd jobbra döntöttem, majd ismét vissza a vízszintes helyzetbe.

(a videóhoz kattints a képre)

Az alábbi ábra az Y tengely értékeit mutatja. A gyorsulásmérőt vízszintes helyzetből indítva, először előre, majd hátra döntöttem, majd ismét vissza a vízszintes helyzetbe.

(a videóhoz kattints a képre)

Az alábbi ábra a Z tengely értékeit mutatja. A gyorsulásmérőt vízszintesen tartva, először gyorsan felfelé, majd lefelé mozgattam.

(a videóhoz kattints a képre)

A fent látható grafikus adatábrázoló Processing kódja:

  1. /* Grafikus adatabrazolas Processing-gel
  2. - az x billentyu lenyomasakor az X tengelyen mert adatok lesznek abrazolva a grafikonon
  3. - az y billentyu lenyomasakor az Y tengelyen mert adatok lesznek abrazolva a grafikonon
  4. - az z billentyu lenyomasakor az Z tengelyen mert adatok lesznek abrazolva a grafikonon */
  5.  
  6. import processing.serial.*;
  7. Serial myPort;  
  8. int[] serialInArray = new int[3];    
  9. int i = 1;                  
  10. int xpos, ypos, zpos = 0;
  11. boolean firstContact = false;
  12.  
  13. void setup ()
  14. {
  15.  size(400, 300);        // ablak merete
  16.  // elerheto soros portok kilistazasa
  17.  println(Serial.list());
  18.  // azUSB-TTL atalakito COM17 port sorszama: [2]
  19.  myPort = new Serial(this, Serial.list()[2], 9600);
  20.  // a soros porton beerkezo adatokat "ujsor" karakterig puffereljuk
  21.  myPort.bufferUntil('\n');
  22.  // fekete hatterszin :
  23.  background(0);
  24.  // `m` karakter kuldese az AVR-nek, hogy vegezzen el egy uj merest
  25.  myPort.write('m');  
  26. }
  27.  
  28. void draw ()
  29. {  
  30.  // ha az AVR-tol nem erkezik valasz, akkor addig kuldjuk ujra az `m`-et, amig valasz nem erkezik
  31.  if (firstContact == false)
  32.  {
  33.  delay(300);
  34.  myPort.write('m');
  35.  }
  36. }
  37.  
  38. void drawGraph ()
  39. {
  40.  int valueToGraph = 0;
  41.  // kivalasztjuk, hogy melyik tengely erteket abrazoljuk  
  42.  if (keyCode == 88)    //x billentyu: x tengely
  43.  {  
  44.   valueToGraph = xpos;
  45.   stroke(255,0,0);
  46.  }
  47.  
  48.  if (keyCode == 89)     //y billentyu: y tengely
  49.  {  
  50.  valueToGraph = ypos;
  51.  stroke(0,255,0);
  52.  }
  53.  
  54.  if (keyCode == 90)    //z billentyu: z tengely
  55.  {    
  56.  valueToGraph = zpos;
  57.  stroke(0,0,255);
  58.  }
  59.  
  60.  // fuggoleges vonal megrajzolasa:
  61.  line(i, height, i, height - valueToGraph);
  62.  
  63.  // a kepernyo szelenek ekeersekor visszaugras az elejere
  64.  if (i >= width-2)
  65.  {
  66.  i = 0;
  67.  background(0);
  68.  }
  69.  else
  70.  {
  71.  i++;
  72.  }
  73. }
  74.  
  75. void serialEvent(Serial myPort)
  76.  {
  77.  firstContact = true;
  78.  // a bejovo adatokat beolvassuk egy pufferbe, amig egy ujsor karakter nem erkezik:
  79.  String myString = myPort.readStringUntil('\n');
  80.  // ha a bejuvo karakterek az ujsor karaktertol kulonbozoek, akkor a bejovo adatot a vesszoknel szetvalasztjuk es ujra szamma alakitjuk vissza
  81.  if (myString != null)
  82.  {
  83.  myString = trim(myString);
  84.  int sensors[] = int(split(myString, ','));
  85.  // ha mindharom tengely eredmenye megerkezett, akkor kivalasztjuk a megfelelot es abrazoljuk
  86.  if (sensors.length >= 3)
  87.   {
  88.   xpos = (sensors[0]*3)/8;
  89.   ypos = (sensors[1]*3)/8;
  90.   zpos = (sensors[2]*3)/8;  
  91.   drawGraph();  // grafikon kirajzolasa
  92.   myPort.write('m');   // `m` karakter kuldese az AVR-nek, hogy vegezzen el egy uj merest
  93.   }
  94.  }
  95. }


A cikk még nem ért véget, lapozz!
Következő: »»   5 / 9
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem