【Ras2-D2プロジェクト】RCカー改造実験。ArduinoでRCカーを自動制御してみます。 | 「藍染 迅(超時空伝説研究所改め)」の部屋

「藍染 迅(超時空伝説研究所改め)」の部屋

小説家ワナビーの「藍染 迅(あいぞめ じん)」です。

書籍化・商業化を目指し、各種コンテストに挑戦しながら、カクヨム、小説家になろう、エブリスタ、アルファポリスなどに作品を投稿しています。

代表作は異世界ファンタジー「「飯屋のせがれ、魔術師になる。」。

ロボット制御研究の一環として、RC玩具をArduinoで自動制御してみました。
参考にしたのは、こちらのサイト。


本来RCカーですから、ラジコン信号の送受信により動作を制御するものですが、Arduinoを接続してラジコン信号をシミュレートし、受信用のIC=RX-2Bを直接制御します。

早速ですが、Arduino用のスケッチは次の通りです。
Here is the Arduino Sketch I used in this demo.

void setup()
{
 pinMode(11, OUTPUT); //ピン11をアウトプット用に設定
}

void loop()
{
  unsigned long startms; //動作開始時間取得用の変数
  
  startms = millis();
  while(millis() - startms < 2000) { //2秒間同じ動作を続けます
    FWD();
  }
  
  delay(1000); //動作の間のインターバル=1秒
  
  startms = millis();
  while(millis() - startms < 2000) {
    BAK();
  }
  
  delay(1000);
  
  startms = millis();
  while(millis() - startms < 2000) {
    LEFTFWD();
  }
  
  delay(1000);
  
    startms = millis();
  while(millis() - startms < 2000) {
    RIGHTFWD();
  }
  
  delay(1000);
  
  startms = millis();
  while(millis() - startms < 2000) {
    LEFTBAK();
  }
  
  delay(1000);
  
  startms = millis();
  while(millis() - startms < 2000) {
    RIGHTBAK();
  }
  
  delay(1000);
  
  startms = millis();
  while(millis() - startms < 2000) {
    LEFTSPIN();
  }
  
  delay(1000);
  
  startms = millis();
  while(millis() - startms < 2000) {
    RIGHTSPIN();
  }
  
  delay(1000);
  
}

void command(int mode) {
 for(int i=0; i<=3; i++) // This starts the communication 4 W2 pulses 500Hz 75% duty cycle 
 { //W2は初期化信号
   digitalWrite(11, HIGH);
   delayMicroseconds(1500);

   digitalWrite(11, LOW);
   delayMicroseconds(500);
 }
 for(int i=0; i<mode; i++) // This makes the car move, "mode" times of  W1 pulses 1kHz 50% duty cycle
 { //W1が動作信号本体です
   digitalWrite(11, HIGH);
   delayMicroseconds(500);

   digitalWrite(11, LOW);
   delayMicroseconds(500);
 }
 
}
 
void FWD(){
  command(28);
}

void BAK(){
  command(46);
}

void LEFTFWD(){
  command(58);
}

void RIGHTFWD(){
  command(10);
}

void LEFTBAK(){
  command(64);
}

void RIGHTBAK(){
  command(40);
}

void LEFTSPIN(){
  command(52);
}

void RIGHTSPIN(){
  command(34);
}

Arduinoのピン11を、RX-2Bのピン3につないで信号を送ります。
command(int mode)の部分がキモなのですが、delayMicroseconds()を利用してパルス信号を再現している訳です。

このデモでは、使用しているRC玩具のコード体系に合わせて、次のコードを送っています。

前進:  28 後退:  46 左前進: 58 右前進: 10
左後退: 64 右後退: 40 左旋回: 52 右旋回: 34

スケッチでは、それぞれの動作を2秒継続し、間に1秒のインターバルを入れて、ループ再生しています。
実際のロボットカー製作時には、コマンド入力や状況検知により適切な動作を実行することになります。

使用したRC玩具はこちら。

イメージ 1

不必要な操縦席部分を取り除くと、こうなります。

イメージ 2

操縦席部分からは、電池ボックスを取りだしたのでした。

イメージ 3

イメージ 4

実験用ハードの構成は、次にような感じです。

イメージ 5

回路図は、下記のイメージです。(RX-2Bのパーツイメージが見つからないので、IC部分は仮のものです)
分圧回路用の抵抗は、手持ちの2.2kΩを使用しました。

イメージ 6

ブレッドボード部のクローズアップ。

イメージ 7

RC玩具内の制御ボート。RX-2Bの#3ピンにArduino(#11ピン)からの出力をつなぎます。

イメージ 8

ArduinoのGNDと基板上のGNDを接続しました。(上の画像では、基板の影に隠れています)

キャタピラを駆動する電源は、電池ボックスから取りました。(単三×4本)

イメージ 9

それでは、自動操作のデモをご覧ください。


ご視聴ありがとうございました。