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
poi caricate nell'Arduino lo sketch che trovate qui sotto:
- #include <Wire.h>
- #include "rgb_lcd.h"
- rgb_lcd lcd;
- const int MPU = 0x68;
- int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
- int16_t RollVal, PitchVal, PrevRollVal, PrevPitchVal;
- void setup() {
- Serial.begin(115200);
- Wire.begin();
- Wire.beginTransmission(MPU);
- Wire.write(0x6B);
- Wire.write(0);
- Wire.endTransmission(true);
- lcd.begin(16, 2);
- lcd.setRGB(50, 100, 200);
- lcd.setCursor(0, 0);
- lcd.print("DanieleAlberti");
- lcd.setCursor(13, 1);
- lcd.print(".It");
- delay(3000);
- lcd.clear();
- lcd.setRGB(200, 100, 200);
- lcd.setCursor(0, 0);
- lcd.print("Bolla");
- lcd.setCursor(5, 1);
- lcd.print("Elettronica");
- delay(3000);
- lcd.clear();
- lcd.setRGB(255, 255, 255);
- }
- void loop() {
- Wire.beginTransmission(MPU);
- Wire.write(0x3B);
- Wire.endTransmission(false);
- Wire.requestFrom(MPU, 14, true); // request a total of 14 registers
- AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
- AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
- AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
- Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
- GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
- GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
- GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
- PrevPitchVal = PitchVal;
- PrevRollVal = RollVal;
- PitchVal = atan2(AcX , AcZ) * 57.3;
- RollVal = atan2(AcY , AcZ) * 57.3;
- lcd.setCursor(0, 0);
- lcd.print("X angle: ");
- lcd.print(PitchVal);
- lcd.setCursor(0, 1);
- lcd.print("Y angle: ");
- lcd.print(RollVal);
- Serial.print("x: ");
- Serial.println(AcX);
- Serial.print("y: ");
- Serial.println(AcY);
- Serial.print("z: ");
- Serial.println(AcZ);
- Serial.print("Roll: ");
- Serial.println(RollVal);
- Serial.print("Pitch: ");
- Serial.println(PitchVal);
- delay(500);
- lcd.clear();
- }
Questo è tutto!
Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!
ciao,
RispondiEliminabel progetto.
Che risoluzione ha?
A me servirebbe 0,1 °
ciao
complimenti
RispondiEliminaun informazione posso utilizzare un display 1602A ???
Ottimo, proprio quello che cercavo. è possibile utilizzare l'Arduino nano per questo progetto?
RispondiEliminase volessi collegarlo ad un sistema quadrante led tipo bolla a 5x5 led come potrei fare?
RispondiElimina