2012年12月23日日曜日

シリアル通信(bluetooth)リモコンカーを作ってみる




こちらの投稿で、arduino-PC間がbluetooth接続によるシリアル通信ができるようになりましたので、bluetooth接続によるリモコンカーを作ってみます。
今回もライントレーサーとして組み立て、赤外線リモコンカーに改造したものを、bluetoothリモコンカーにします。

今回もライントレーサー用に取り付けたフォトリフレクタ部分は取り外していません。
モータードライバシールドのヒートシンクの隙間に突き刺さってるのが、bluetoothモジュールのSBDBTです。

ハードはSBDBTにD0、D1、GND、3.3Vを接続するだけ。

PC側ではシリアル通信ソフトを立ち上げ、bluetoothの仮想シリアルポートをオープン。
今回はオープンソースのTera Termを使いました。

arduinoIDEのシリアルモニターでもいいですが、コマンド入力後、enterを押すか送信ボタンを押さないといけないです。

◆コマンド
Q W E
A S D
Z X C
キーボード左部分に集めました。直進、後進、左右旋回、左右その場旋回(超信地旋回)、停止
R、F 速度UP、DOWN



◆スケッチ
// シリアル通信リモコンカー by cranberry
// http://cranberrytree.blogspot.jp/
//                           2012/12/23

byte pin_sig[2][2] = {     //INPUT PWM to IN1,IN2
{10,9},                    //motor0:pin10,9
{5,6},                     //motor1:pin5,6
};
boolean cwccw = true;
byte limit_pwm = 100;      //percent (100 means 255)
byte mpow = 50;
byte divi = 2;             //旋回で内側の車輪を mpow/divi で遅く回す
char last_command;
boolean flag_pw = false;

void setup(){
  Serial.begin(9600);
  for(byte pin = 5; pin < 11; pin++){
    pinMode(pin, OUTPUT);
  }
}

void loop(){
  char chr;
  if(flag_pw == true){
    chr = last_command;
    flag_pw = false;
  }
  if(Serial.available()){
    chr = Serial.read();
    Serial.print("command = \t");
    Serial.println(chr);
  }
  switch(chr){
    case 'q':
      motor(0, mpow, true);
      motor(1, mpow/divi, true);
      last_command = 'q';
      break;
    case 'w':
      motor(0, mpow, true);
      motor(1, mpow, true);
      last_command = 'w';
      break;
    case 'e':
      motor(0, mpow/divi, true);
      motor(1, mpow, true);
      last_command = 'e';
      break;
    case 'a':
      motor(0, mpow/divi, true);
      motor(1, mpow/divi, false);
      last_command = 'a';
      break;
    case 's':
      motor_stop(0, 0);
      motor_stop(1, 0);
      last_command = 's';
      break;
    case 'd':
      motor(0, mpow/divi, false);
      motor(1, mpow/divi, true);
      last_command = 'd';
      break;
    case 'z':
      motor(0, mpow, false);
      motor(1, mpow/divi, false);
      last_command = 'z';
      break;
    case 'x':
      motor(0, mpow, false);
      motor(1, mpow, false);
      last_command = 'x';
      break;
    case 'c':
      motor(0, mpow/divi, false);
      motor(1, mpow, false);
      last_command = 'c';
      break;
    case 'r':
      mpow += 10;
      if(mpow > limit_pwm){
        mpow = limit_pwm;
      }
      Serial.print("speed = ");
      Serial.println(mpow);
      flag_pw = true;
      break;
    case 'f':
      mpow -= 10;
      if(mpow < 10){
        mpow = 10;
      }
      Serial.print("speed = ");
      Serial.println(mpow);
      flag_pw = true;
      break;
    default:
      if(chr != NULL){
        Serial.print(chr);
        Serial.println(" is Not command");
      }
  }
}

void motor(byte num, byte pw, boolean cw){
  pw = map(pw, 0, 100, 0, 255);
  if(cwccw != cw){
    Serial.println("CW/CCW Changed!");
    digitalWrite(pin_sig[num][0],LOW);
    digitalWrite(pin_sig[num][1],LOW);
    delay(1);
  }
  if(cw == true){
    cwccw = true;
    analogWrite(pin_sig[num][0], pw);
    analogWrite(pin_sig[num][1], 0);
  }
  else{
    cwccw = false;
    analogWrite(pin_sig[num][0], 0);
    analogWrite(pin_sig[num][1], pw);
  }
}

void motor_stop(byte num,int dur){
  digitalWrite(pin_sig[num][0],LOW);
  digitalWrite(pin_sig[num][1],LOW);
  if(dur >0){
    delay(dur);
  }
}

void motor_brake(byte num,int dur){
  digitalWrite(pin_sig[num][0],LOW);
  digitalWrite(pin_sig[num][1],LOW);
  delay(1);
  digitalWrite(pin_sig[num][0],HIGH);
  digitalWrite(pin_sig[num][1],HIGH);
  if(dur >0){
    delay(dur);
  }
}


環境:arduinoUNO、arduino1.0.2、win7






0 件のコメント:

コメントを投稿