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!
Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

4 commenti:

  1. ciao,
    bel progetto.
    Che risoluzione ha?
    A me servirebbe 0,1 °

    ciao

    RispondiElimina
  2. complimenti
    un informazione posso utilizzare un display 1602A ???

    RispondiElimina
  3. Ottimo, proprio quello che cercavo. è possibile utilizzare l'Arduino nano per questo progetto?

    RispondiElimina
  4. se volessi collegarlo ad un sistema quadrante led tipo bolla a 5x5 led come potrei fare?

    RispondiElimina

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

Altri Post