Close

Using 10 Arduinos

A project log for Lord of the Rings

Utilizing 8 accelerometers mounted on 3D printed rings, LOTR gives users the ability to type anywhere and anyway.

rishi-salwiRishi Salwi 10/16/2017 at 03:360 Comments

We decided to use 10 Arduinos to communicate with the 10 accelerometers. This was very difficult to code, but it still was able to take in data from all the MPU-6050s. Each Arduino took in data for one column of the keyboard. For example, here is the code for keys RFV: 

// MPU-6050 Short Example Sketch
// By Arduino User JohnChi
// August 17, 2014
// Public Domain
#include<Wire.h>
const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
int count;
void setup(){
  count=10;
  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,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)
  if (AcY>-4000){
    count=0;
  }
  if (count<4){
    count++;
  }
  if (count==4){
    if (AcZ<16000){
      if (AcY>-7500){
        Serial.write("r");
      }
      else if (AcY<-13000){
        Serial.write("v");
      }
      else{
        Serial.write("f");
      }
    }
    else{
      if (AcY>-8000){
        Serial.write("t");
      }
      else if (AcY<-11500){
        Serial.write("g");
      }
      else{
        Serial.write("b");
      }
    }
    count++;
  }
  /*Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.println(AcZ);
  /*Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);*/
  delay(333);
}

Discussions