Bolla elettronica 2 assi con mpu6050 e Arduino


Ciao!

Questo progetto nasce da un'esigenza di Dino che mi ha scritto nella sezione "chiedi e rispondi".
Il progetto è composto da un accelerometro a 3 assi mpu6050 (link eBay) da un display lcd i2c (io ho usato quello della Seeed, link ebay) e ovviamente dal nostro Arduino.

Il progetto consiste in una bolla elettronica, un oggetto in grado di restituire un valore diverso in base all'angolo di rotazione sugli assi X e Y.
Il limite di questo oggetto è che, mancando il magnetometro, oltre un certo angolo su un asse non si riesce ad ottenere un valore coerente sull'altro asse. 
Nel nostro caso questo problema può non essere rilevante, in quanto l'obbiettivo è misurare variazioni di pochi gradi rispetto al piano perpendicolare all'asse Z.

Ecco un video che ne mostra il funzionamento





Per prima cosa è necessario collegare i componenti in questo modo, ovviamente potete anche utilizzare una breadboard per aiutarvi nel collegare i componenti





Se non l'avete ancora fatto scaricate ed installate questa libreria per il display della Seeed,
poi caricate nell'Arduino lo sketch che trovate qui sotto:


  1. #include <Wire.h>
  2. #include "rgb_lcd.h"
  3. rgb_lcd lcd;
  4. const int MPU = 0x68;
  5. int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
  6. int16_t RollVal, PitchVal, PrevRollVal, PrevPitchVal;
  7. void setup() {
  8.   Serial.begin(115200);
  9.   Wire.begin();
  10.   Wire.beginTransmission(MPU);
  11.   Wire.write(0x6B);
  12.   Wire.write(0);    
  13.   Wire.endTransmission(true);
  14.   lcd.begin(162);
  15.   lcd.setRGB(50100200);
  16.   lcd.setCursor(00);
  17.   lcd.print("DanieleAlberti");
  18.   lcd.setCursor(131);
  19.   lcd.print(".It");
  20.   delay(3000);
  21.   lcd.clear();
  22.   lcd.setRGB(200100200);
  23.   lcd.setCursor(00);
  24.   lcd.print("Bolla");
  25.   lcd.setCursor(51);
  26.   lcd.print("Elettronica");
  27.   delay(3000);
  28.   lcd.clear();
  29.   lcd.setRGB(255255255);
  30. }
  31. void loop() {
  32.   Wire.beginTransmission(MPU);
  33.   Wire.write(0x3B);
  34.   Wire.endTransmission(false);
  35.   Wire.requestFrom(MPU, 14true); // request a total of 14 registers
  36.   AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  37.   AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  38.   AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  39.   Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  40.   GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  41.   GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  42.   GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  43.   PrevPitchVal = PitchVal;
  44.   PrevRollVal = RollVal;
  45.   PitchVal = atan2(AcX , AcZ) * 57.3;
  46.   RollVal = atan2(AcY , AcZ) * 57.3;
  47.   lcd.setCursor(00);
  48.   lcd.print("X angle: ");
  49.   lcd.print(PitchVal);
  50.   lcd.setCursor(01);
  51.   lcd.print("Y angle: ");
  52.   lcd.print(RollVal);
  53.   Serial.print("x: ");
  54.   Serial.println(AcX);
  55.   Serial.print("y: ");
  56.   Serial.println(AcY);
  57.   Serial.print("z: ");
  58.   Serial.println(AcZ);
  59.   Serial.print("Roll: ");
  60.   Serial.println(RollVal);
  61.   Serial.print("Pitch: ");
  62.   Serial.println(PitchVal);
  63.   delay(500);
  64.   lcd.clear();
  65. }


Ora non vi resta che alimentare il tutto (con un power bank o con un pacco batterie come mostrato qui) e costruirvi un case per proteggere l'elettronica.


Questo è tutto!
segui Daniele Alberti su Google+ per rimanere sempre aggiornato su nuovi post!

1 commento:

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post