Arduino GyroCAR

by BumTaeng in Circuits > Robots

2421 Views, 9 Favorites, 0 Comments

Arduino GyroCAR

20170521_185845.jpg
20170521_185831.jpg
20170413_105620.jpg
20170521_185857.jpg
20170529_130205.jpg
20170529_195849.jpg
20170529_195955.jpg

Arduino bluretooth Master, Slave comunication

first Please understand me if I speak English well.

when send the sesor value to Slave, only 0~255 amount of value can transmission

so I transform the value of X axis and Y axis to one signal

Here is Slave's code

#include //시리얼 통신 라이브러리 호출
#include SoftwareSerial BTSerial(3,2); //블루투스 연결 int RMS = 11; //우측 바퀴 핀연결 int RMd1 = 13; int RMd2 = 12;

int Rd1; //우측 바퀴 회전방향 변수선언 int Rd2;

int LMS = 10; //왼쪽 바퀴 핀연결 int LMd1 = 9; int LMd2 = 8;

int Ld1; //왼쪽 바퀴 회전방향 변수선언 int Ld2;

int accel; int x; void setup() { Serial.begin(9600); BTSerial.begin(9600);

pinMode(RMS,OUTPUT); //dc모터 연결 핀 형식을 출력으로 설정 pinMode(RMd1,OUTPUT); pinMode(RMd2,OUTPUT); pinMode(LMS,OUTPUT); pinMode(LMd1,OUTPUT); pinMode(LMd2,OUTPUT); } void loop() { int ax = 0, ay = 0, az = 0, temp = 0, gx = 0, gy = 0, gz = 0; int Raccel=0; //회전속도 변수선언 int Laccel=0; /* if(BTSerial.available()) Serial.write(BTSerial.read()); /* if(Serial.available()) BTSerial.write(Serial.read());*/

if(BTSerial.available()){ //블루투스로 받아온 신호를 읽어 변수 x에 대입한다. x=BTSerial.read(); Serial.print("x:"); Serial.println(x); ax=x/10; //받아온 한개의 신호를 x축, y축으로 분리해서 알맞게 변환후 변수에 대입한다. ay=x-ax*10; ax=map(ax,10,24,-9,9); ay=map(ay,1,9,-4,4); } ax=ax*33; ay=ay*25; accel = ax; if(ax<=-50){ //기울기 값을 이용하여 각 모터의 속도 변수에 대입한다. Raccel = accel + ay; Laccel = accel - ay; }else if(ax>-50 && ax<50){ Raccel = -ay; Laccel = ay; } else{ Raccel = accel - ay; Laccel = accel + ay; }

if(Raccel < 0){ //기울기가 반대로, 즉 마이너스가 되면 모터의 회전방향을 바꾸어 후진할수 있도록한다. Rd1 = LOW; //역방향 Rd2 = HIGH; Raccel = -Raccel; }else{ Rd1 = HIGH; //정방향 Rd2 = LOW; } if(Laccel < 0){ Ld1 = LOW; //역방향 Ld2 = HIGH; Laccel = -Laccel; }else{ Ld1 = HIGH; //정방향 Ld2 = LOW; } if (Raccel > 255) //계산중 속도가 255넘으면 255로 해준다. Raccel = 255; if (Laccel > 255) Laccel = 255; /* Serial.print(" AX : "); Serial.print(ax); Serial.print(" AY : "); Serial.println(ay);*/ Serial.print(" Raccel : "); //각 모터의 속도값을 시리얼모니터에 출력한다. Serial.print(Raccel); Serial.print(" Laccel : "); Serial.println(Laccel);

analogWrite(RMS, Raccel); //오른쪽 바퀴 출력 digitalWrite(RMd1, Rd1); digitalWrite(RMd2, Rd2); analogWrite(LMS, Laccel); //왼쪽 바퀴 출력 digitalWrite(LMd1, Ld1); digitalWrite(LMd2, Ld2); delay(100);

}

and Master's code

#include //시리얼 통신 라이브러리 호출
#include //연결RXD 2번 TXD 3번 SoftwareSerial BTSerial(3,2); int a;

void setup(){ // Wire.begin(); //각속도 측정센서 Serial.begin(9600); BTSerial.begin(9600); //블루투스 통신속도 Wire.beginTransmission(0x68); Wire.write(0x6B); Wire.write(0x0); Wire.endTransmission(); }

void loop(){ if (BTSerial.available()) { Serial.write(BTSerial.read()); } if (Serial.available()) { BTSerial.write(Serial.read()); }

Wire.beginTransmission(0x68); //각속도값을 읽음 Wire.write(0x3B); Wire.endTransmission(); int ax = 0, ay = 0, az = 0, temp = 0, gx = 0, gy = 0, gz = 0; Wire.requestFrom(0x68, 14); ax = Wire.read() << 8; ax |= Wire.read(); ay = Wire.read() << 8; ay |= Wire.read(); az = Wire.read() << 8; az |= Wire.read(); temp = Wire.read() << 8; temp |= Wire.read(); gx = Wire.read() << 8; gx |= Wire.read(); gy = Wire.read() << 8; gy |= Wire.read(); gz = Wire.read() << 8; gz |= Wire.read();

ax = map(ax,-18000,18000,10,24); ay = map(ay,-18000,18000,1,11); if(ay>9) ay=9;

ax=ax*10; a=ax+ay; BTSerial.write(a);

/*Serial.print("AX : "); Serial.print(ax); Serial.print(" AY : "); Serial.println(ay);*/ delay(100); }

This is operation video

Downloads