RC Quadrotor helikopter (19 / 37 steg)
Steg 14: Arduino Demo: Sensor behandlingen
Dessa två sensorer är anslutna till din microcontroller med I2C bussen. Denna typ av buss är utformat för att flera enheter att kommunicera tillsammans med bara två kablar.
Jag har också bifogat den logik analyzer vågformer I2C bus signaler. (både skärmdump och Saleae logik 1.1.8 sessionsfil)
För mer information:
- http://en.wikipedia.org/wiki/I%C2%B2C
- < min andra instructable som förklarar I2C
- I2C Tutorial - inbäddade Lab
- BMA180 datablad
- ITG-3200 datablad
Kontrollermjukvaran flyg kommer att initiera accelerometern genom att första återställa det, sedan ställa in en 10 Hz-lågpassfilter och ange Läs allt till +/-2 G. Läs dess datablad och se min demo kod för mer information om hur du gör detta. Det finns andra funktioner som avbryter, tryck på upptäckt, etc, som vi inte använder.
Kontrollermjukvaran flyg kommer att initiera gyro sensoren vid första resetting den, sedan ställa dess 10 Hz-lågpassfilter, och säga till den att använda sin egen intern oscillator. Läs dess datablad och se min demo kod för mer information om hur du gör detta. Denna sensor kan du använda en extern oscillator och har också digital temperatur utgångar, men vi använder inte dessa funktioner.
Här är koden:
#include < Wire.h >void setup()
{
Serial.BEGIN(115200);
Wire.BEGIN();
Serial.println ("Demo började, initierar sensorer");
AccelerometerInit();
GyroInit();
Serial.println ("sensorer har initierats");
}
void AccelerometerInit()
{
Wire.beginTransmission(0x40); adressen till accelerometern
återställa accelerometern
Wire.send(0x10);
Wire.send(0xB6);
Wire.endTransmission();
Delay(10);
Wire.beginTransmission(0x40); adressen till accelerometern
lågpassfilter, inställningar
Wire.send(0x0D);
Wire.send(0x10);
Wire.endTransmission();
Wire.beginTransmission(0x40); adressen till accelerometern
Wire.send(0x20); Läs här
Wire.endTransmission();
Wire.requestFrom(0x40, 1);
byte data = Wire.receive();
Wire.beginTransmission(0x40); adressen till accelerometern
Wire.send(0x20);
Wire.send (data & 0x0F); lågpassfilter till 10 Hz
Wire.endTransmission();
Wire.beginTransmission(0x40); adressen till accelerometern
Wire.send(0x35); Läs här
Wire.endTransmission();
Wire.requestFrom(0x40, 1);
data = Wire.receive();
Wire.beginTransmission(0x40); adressen till accelerometern
Wire.send(0x35);
Wire.send ((data & 0xF1) | 0x04); intervallet +/-2g
Wire.endTransmission();
}
void AccelerometerRead()
{
Wire.beginTransmission(0x40); adressen till accelerometern
Wire.send(0x02); uppsättning läsa pekaren till data
Wire.endTransmission();
Wire.requestFrom(0x40, 6);
läsa i 3 axel data, är var och en 16 bitar
skriva ut data till terminal
Serial.Print ("Accelerometer: X =");
korta data = Wire.receive();
data += Wire.receive() << 8.
Serial.Print(data);
Serial.Print (", Y =");
data = Wire.receive();
data += Wire.receive() << 8.
Serial.Print(data);
Serial.Print (", Z =");
data = Wire.receive();
data += Wire.receive() << 8.
Serial.Print(data);
Serial.println();
}
void GyroInit()
{
Wire.beginTransmission(0x69); adressen till gyrot
återställa gyrot
Wire.send(0x3E);
Wire.send(0x80);
Wire.endTransmission();
Wire.beginTransmission(0x69); adressen till gyrot
lågpassfilter 10 Hz
Wire.send(0x16);
Wire.send(0x1D);
Wire.endTransmission();
Wire.beginTransmission(0x69); adressen till gyrot
använda intern oscillator
Wire.send(0x3E);
Wire.send(0x01);
Wire.endTransmission();
}
void GyroRead()
{
Wire.beginTransmission(0x69); adressen till gyrot
Wire.send(0x1D); uppsättning läsa pekaren
Wire.endTransmission();
Wire.requestFrom(0x69, 6);
läste i 3 axel för data, 16 bitar vardera, skriva ut till terminal
korta data = Wire.receive() << 8.
data += Wire.receive();
Serial.Print ("Gyro: X =");
Serial.Print(data);
Serial.Print (", Y =");
data = Wire.receive() << 8.
data += Wire.receive();
Serial.Print(data);
Serial.Print (", Z =");
data = Wire.receive() << 8.
data += Wire.receive();
Serial.Print(data);
Serial.println();
}
void loop()
{
AccelerometerRead();
GyroRead();
Delay(500); sakta ner produktionen
}