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: 25921, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   8 / 9

Az alábbi ábrán látható, hogy ha egy tárgy dőlésszögét már 2 irányban akarjuk meghatározni, akkor az előző oldalon tárgyalt esethez képest kicsit bonyolultabb a helyzet (a gyorsulásmérő a G gravitációs gyorsulás X, Y és Z tengely irányú komponensét méri).

De amint az alábbi képeken és a videón is látható, két atan2() függvényt alkalmazva megoldható a probléma.

(a videóhoz kattints a képre)

Processing kód:

  1. /*  Dolesszogmeres 2 tengely iranyaban  */
  2. import processing.serial.*;      
  3. int graphPosition = 0;           // teglalap kezdeti pozicioja
  4. int[] vals = new int[3];         // gyorsulasmero altal mert ertekek
  5. int[] maximum = new int[3];      // maximalis ertek
  6. int[] minimum = new int[3];      // minimalis ertek
  7. int[] mid = new int[3];        // kozepertek
  8. float[] attitude = new float[3]; // szamolt dolesszog ertekek
  9. float position;                  
  10.  
  11. Serial myPort;                
  12. boolean madeContact = false;  
  13.  
  14. void setup ()
  15. {
  16.   smooth();
  17.   frameRate(30);
  18.   size(400, 400, P3D);
  19.   fill(204);
  20.   background(255);
  21.   // a kalibracioval mert maximum, minimum es kozepertekek
  22.   maximum[0] = 540;
  23.   minimum[0] = 180;
  24.   mid[0] = 335;
  25.  
  26.   maximum[1] = 530;
  27.   minimum[1] = 170;
  28.   mid[1] = 335;
  29.  
  30.   maximum[2] = 530;
  31.   minimum[2] = 170;
  32.   mid[2] = 335;
  33.  
  34.   position = width/2;
  35.   PFont myFont = createFont(PFont.list()[2], 18);
  36.   textFont(myFont);
  37.  
  38.   myPort = new Serial(this, Serial.list()[2], 9600);
  39.   myPort.bufferUntil('\n');
  40.  
  41.   fill(204);
  42. }
  43.  
  44. void draw ()
  45. {
  46.   background(255);
  47.   translate(width / 2, height / 2, -width);
  48.   if (madeContact == false)
  49.   {
  50.     myPort.write('m');
  51.   }
  52.  
  53.   setAttitude();
  54.   tilt();
  55. }
  56.  
  57. void setAttitude()
  58. {
  59.   for (int i = 0; i < 2; i++)
  60. {
  61.     attitude[i] = atan2(mid[2] - vals[2], mid[i] - vals[i]);
  62.   }
  63. }
  64.  
  65. void tilt()
  66. {
  67.   rotateX(attitude[1] - PI/16);
  68.   rotateY(attitude[0] - PI/2-0.1);
  69.  
  70.   noStroke();
  71.   rect(-200, -100, 400, 200);
  72.   stroke(0);
  73.   strokeWeight(3);
  74.   line(0, 0, -250, 0, 0, 250);
  75.   stroke(100);
  76.   line(0, 150, 0, 0, -150, 0);
  77.   line(250, 0, 0, -250, 0, 0);
  78. }
  79.  
  80. void serialEvent(Serial myPort)
  81. {
  82.   madeContact = true;
  83.   String myString = myPort.readStringUntil('\n');
  84.  
  85.   if (myString != null)
  86. {
  87.     myString = trim(myString);
  88.     int sensors[] = int(split(myString, ','));
  89.     if (sensors.length >= 3)
  90. {
  91.       vals[0] = sensors[0];
  92.       vals[1] = sensors[1];  
  93.       vals[2] = sensors[2];
  94.       delay(100);
  95.       myPort.write('m');
  96.     }
  97.   }
  98. }


A cikk még nem ért véget, lapozz!
Következő: »»   8 / 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