リモートコントロール(RC)戦車をつくる【(XBeeコントロール)組み上げ~動作確認】 [RC戦車]
【組み上げ】
【車体(上面)】
【XBeeリモコン戦車とXBeeコントロール送信機】
XBeeコントロール送信機で見えるピンクのリボンは、電池をケースから外すときに引っ張るリボンです。これが無いと固くて外れません。。。
【動作確認】
XBeeコントロールRC戦車のシェイクダウンです。なかなかスムーズに動作できたと思います。
再生できない場合、ダウンロードは🎥こちら
【このシリーズはこれで完了します】
最初にリモートコントロールの戦車を作ろうと思い立ってから、2年も経っているんですねー。途中休み休みでしたが、何とかこのレベルまでは自作することができました。
赤外線とXBeeの両方で、前後左右とコントロールしてRC戦車を動作させることは出来ましたので、一旦はこのシリーズを完了としたいと思います。ベーシックな動作のところが出来れば、あとは、センサーだったりカメラだったり制御のためのインプットデータの違いはあるにせよ、応用編かな、と考えるからです。
これからも、興味の向くままに基礎知識を身につけて、バージョンアップができればいいなー、と思います。
【車体(上面)】
【XBeeリモコン戦車とXBeeコントロール送信機】
XBeeコントロール送信機で見えるピンクのリボンは、電池をケースから外すときに引っ張るリボンです。これが無いと固くて外れません。。。
【動作確認】
XBeeコントロールRC戦車のシェイクダウンです。なかなかスムーズに動作できたと思います。
再生できない場合、ダウンロードは🎥こちら
【このシリーズはこれで完了します】
最初にリモートコントロールの戦車を作ろうと思い立ってから、2年も経っているんですねー。途中休み休みでしたが、何とかこのレベルまでは自作することができました。
赤外線とXBeeの両方で、前後左右とコントロールしてRC戦車を動作させることは出来ましたので、一旦はこのシリーズを完了としたいと思います。ベーシックな動作のところが出来れば、あとは、センサーだったりカメラだったり制御のためのインプットデータの違いはあるにせよ、応用編かな、と考えるからです。
これからも、興味の向くままに基礎知識を身につけて、バージョンアップができればいいなー、と思います。
リモートコントロール(RC)戦車をつくる【XBeeコントロール受信機】 [RC戦車]
XBeeコントロール受信機を作製します。
RC戦車搭載のArduino Pro Miniとモータドライバが5V仕様なので、XBeeとの接続するためにBee3.3V⇔5V変換アダプタを使います。
XBeeエクスプローラ5Vマイコン用
"https://www.switch-science.com/catalog/1166/"
コネクタは6ピンインターフェースに合わせて、L字型をチョイスして付けました。
【スケッチ】
RC戦車搭載のArduino Pro Miniとモータドライバが5V仕様なので、XBeeとの接続するためにBee3.3V⇔5V変換アダプタを使います。
XBeeエクスプローラ5Vマイコン用
"https://www.switch-science.com/catalog/1166/"
コネクタは6ピンインターフェースに合わせて、L字型をチョイスして付けました。
【スケッチ】
/******************************************************************************* XBeeコントロール受信機 ++++++ note ++++++ ・ペアとして、XBeeコントロール送信機が必要 ・ジョイスティックの方向と出力値のマッピング 7 8 9 ↑ 4 ← 5 → 6 ↓ 1 2 3 *******************************************************************************/ #define VERSION "1.00a0" #define SPEED_0 0 //モータへの電圧(スピード)を3種類用意 #define SPEED_1 153 //0~255(MAX):Vref電圧を3Vまでに制限 int val = 0; //ジョイスティックからの受信データを一時格納する変数を定義 // set pin numbers: // 右キャタピラ用ピン const int R_Vref = 5; //D5(PWM) const int R_OUT1 = 3; //D3 const int R_OUT2 = 4; //D4 // 左キャタピラ用ピン const int L_Vref = 6; //D6(PWM) const int L_OUT1 = 7; //D7 const int L_OUT2 = 8; //D8 // 初期化(電源投入/リセット時1回のみ実行): void setup() { // initialize the motor driver pin as an output(Arduinoにモータドライバへのピンが出力であることを伝える) pinMode(R_Vref, OUTPUT); pinMode(R_OUT1, OUTPUT); pinMode(R_OUT2, OUTPUT); pinMode(L_Vref, OUTPUT); pinMode(L_OUT1, OUTPUT); pinMode(L_OUT2, OUTPUT); Serial.begin(9600); //9600bpsでシリアルポートを開く } // main loop: void loop() { if(Serial.available() > 0){ //受信したデータが存在する val = Serial.read(); //受信データを読み込み、その値をvalに代入 switch(val){ case '8': //前進 analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_1); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case '6': //右超信地旋回 analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_1); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case '4': //左超信地旋回 analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_1); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; case '2': //後進 analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_1); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; case '9': //右前進緩旋回 analogWrite(R_Vref, SPEED_0); //右キャタピラの速度を遅く(停めて) analogWrite(L_Vref, SPEED_1); //左キャタピラの速度を速く digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case '7': //左前進緩旋回 analogWrite(R_Vref, SPEED_1); //右キャタピラの速度を速く analogWrite(L_Vref, SPEED_0); //左キャタピラの速度を遅く(停めて) digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case '3': //右後進緩旋回 analogWrite(R_Vref, SPEED_0); //右キャタピラの速度を遅く(停めて) analogWrite(L_Vref, SPEED_1); //左キャタピラの速度を速く digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; case '1': //左後進緩旋回 analogWrite(R_Vref, SPEED_1); //右キャタピラの速度を速く analogWrite(L_Vref, SPEED_0); //左キャタピラの速度を遅く(停めて) digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; case '5': //中立ニュートラル(Stop) analogWrite(R_Vref, SPEED_0); //モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_0); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); //ブレーキ digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, HIGH); digitalWrite(R_OUT1, LOW); //ストップ digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); break; default: break; } } }
リモートコントロール(RC)戦車をつくる【XBeeコントロール送信機③】 [RC戦車]
XBeeコントロール送信機の送信回路部を作製します。
XBeeはリモコンボックスの電源回路から3.3Vを印加できるので、XBee用2.54mmピッチ変換基板("http://akizukidenshi.com/catalog/g/gP-05060/")の電圧レギュレータを取り除いて、直付けします。
Arduino Pro MiniとXBeeは24ピンDIPソケットで実装しています。
コネクタは電源とGNDで2ピン、ジョイスティックからの信号用を4ピンコネクタとしました。
ジョイスティックのレバーが中立(ニュートラル)の状態では、モータを停止状態にしてRC戦車をしっかりと停めたいわけですが、電気的にオープン(どこにも繋がっていない状態)のようですので、このままでは電圧がフラフラしてしまいます。そこで、Arduinoのジョイスティックからの入力信号ピンを33kΩの抵抗を介してGNDに接続しています(プルダウン抵抗)。これでジョイスティックがニュートラル時でも入力ピンの値をLOWに確定できます。
【基盤実装】
・Top view
・Bottom view
【回路図】
【組み立て】
【スケッチ】
XBeeはリモコンボックスの電源回路から3.3Vを印加できるので、XBee用2.54mmピッチ変換基板("http://akizukidenshi.com/catalog/g/gP-05060/")の電圧レギュレータを取り除いて、直付けします。
Arduino Pro MiniとXBeeは24ピンDIPソケットで実装しています。
コネクタは電源とGNDで2ピン、ジョイスティックからの信号用を4ピンコネクタとしました。
ジョイスティックのレバーが中立(ニュートラル)の状態では、モータを停止状態にしてRC戦車をしっかりと停めたいわけですが、電気的にオープン(どこにも繋がっていない状態)のようですので、このままでは電圧がフラフラしてしまいます。そこで、Arduinoのジョイスティックからの入力信号ピンを33kΩの抵抗を介してGNDに接続しています(プルダウン抵抗)。これでジョイスティックがニュートラル時でも入力ピンの値をLOWに確定できます。
【基盤実装】
・Top view
・Bottom view
【回路図】
【組み立て】
【スケッチ】
/******************************************************************************* XBeeコントロール送信機 ++++++ note ++++++ ・ジョイスティックの方向と出力値のマッピング 7 8 9 ↑ 4 ← 5 → 6 ↓ 1 2 3 *******************************************************************************/ #define VERSION "1.00a0" const int L_RED = 2; const int L_WHITE = 3; const int R_RED = 6; const int R_WHITE = 7; // 初期化(電源投入/リセット時1回のみ実行): void setup() { // initialize the remote_box signal pin as an input //(Arduinoにリモコンボックスからのピンが入力であることを伝える) pinMode(L_RED, INPUT); pinMode(L_WHITE, INPUT); pinMode(R_RED, INPUT); pinMode(R_WHITE, INPUT); Serial.begin(9600); //9600bpsでシリアルポートを開く } // main loop: void loop() { if((digitalRead(L_RED) == HIGH)&(digitalRead(R_RED) == HIGH)){ //前進 Serial.print('8'); delay(100); //シリアルポートを溢れさせないように ※delay():単位ms } else if((digitalRead(L_RED) == HIGH)&(digitalRead(R_WHITE) == HIGH)){ //右超信地旋回 Serial.print('6'); delay(100); //シリアルポートを溢れさせないように ※delay():単位ms } else if((digitalRead(L_WHITE) == HIGH)&(digitalRead(R_RED) == HIGH)){ //左超信地旋回 Serial.print('4'); delay(100); //シリアルポートを溢れさせないように ※delay():単位ms } else if((digitalRead(L_WHITE) == HIGH)&(digitalRead(R_WHITE) == HIGH)){ //後進 Serial.print('2'); delay(100); //シリアルポートを溢れさせないように ※delay():単位ms } else if(digitalRead(L_RED) == HIGH){ //右前進緩旋回 Serial.print('9'); delay(100); //シリアルポートを溢れさせないように ※delay():単位ms } else if(digitalRead(R_RED) == HIGH){ //左前進緩旋回 Serial.print('7'); delay(100); //シリアルポートを溢れさせないように ※delay():単位ms } else if(digitalRead(L_WHITE) == HIGH){ //右後進緩旋回 Serial.print('3'); delay(100); //シリアルポートを溢れさせないように ※delay():単位ms } else if(digitalRead(R_WHITE) == HIGH){ //左後進緩旋回 Serial.print('1'); delay(100); //シリアルポートを溢れさせないように ※delay():単位ms } else{ Serial.print('5'); //中立ニュートラル(Stop) delay(100); //シリアルポートを溢れさせないように ※delay():単位ms } }
リモートコントロール(RC)戦車をつくる【ミスったー。。。】 [RC戦車]
やっちゃいましたー、プラスとマイナスの逆挿し!
見事にショートです。 orz
もちろん、注意していたつもりなんですけどねー。ちょっと手元が暗かったかなー?
ジャンパー線の赤と黒、交差にもなっていたので、見誤って挿しちゃいましたね。
すぐに白煙が上がって、焼けた臭いが凄いです。
損害は、
・XBee × 2
・XBee3.3V⇔5V変換アダプタ × 1
XBeeは”s2"という販売終了品を使っていたので、片方がダメになったらペアで不用品となってしまいました。せっかく利活用出来ていたのに、残念です。。。
XBee3.3V⇔5V変換アダプタは、RC戦車搭載のArduino Pro Miniとモータドライバが5V仕様なので、XBeeとの接続するために準備したものでした。作成記事を書く前に召されてしまいましたね。。。
XBeeエクスプローラ5Vマイコン用
"https://www.switch-science.com/catalog/1166/"
XBeeとXBeeの変換アダプタは買い直さないとダメだから、大体6,000円強ですかね、被害総額は。。。
注意一秒、6,000円ですね。
#後日、XCTUでXBeeにアクセスしたところ、設定値とか読み出せたので壊れていなかったようです。買い直しもXBeeの変換アダプタだけで済んだので、よかったです。次は失敗しないように、電源を入れる前には念入り確認ですね。
見事にショートです。 orz
もちろん、注意していたつもりなんですけどねー。ちょっと手元が暗かったかなー?
ジャンパー線の赤と黒、交差にもなっていたので、見誤って挿しちゃいましたね。
すぐに白煙が上がって、焼けた臭いが凄いです。
損害は、
・XBee3.3V⇔5V変換アダプタ × 1
XBee3.3V⇔5V変換アダプタは、RC戦車搭載のArduino Pro Miniとモータドライバが5V仕様なので、XBeeとの接続するために準備したものでした。作成記事を書く前に召されてしまいましたね。。。
XBeeエクスプローラ5Vマイコン用
"https://www.switch-science.com/catalog/1166/"
#後日、XCTUでXBeeにアクセスしたところ、設定値とか読み出せたので壊れていなかったようです。買い直しもXBeeの変換アダプタだけで済んだので、よかったです。次は失敗しないように、電源を入れる前には念入り確認ですね。
リモートコントロール(RC)戦車をつくる【XBeeコントロール送信機②】 [RC戦車]
------------------------------------------------------------------------
【トピックス】2020年5月。前回更新から約4ヶ月程度経ちました。その間に世界中で新型コロナウイルスの感染が広がり、日本でも”緊急事態宣言”が出されて極端な外出自粛となっています。そのため、この今年のGWは「ステイホーム週間」として家に留まることを強く要請され、観光や繁華街の人通りもまばらとなり、経済にも大きな影を落としています。たとえ感染拡大が落ち着いたとしても今まで通りの生活に戻ることはなく、ウイルスとの共生を前提とした新しいライフスタイルを模索していくことになる、と言われています。
------------------------------------------------------------------------
一応、送信機の方針は決めたのですが、レイアウトや実装をどのようにするか?は別問題です。
配置に失敗してもそう簡単には一からやり直すことができませんので、ここでのアイデアを慎重にまとめるため、多くの時間がかかっています。。。
単三電池ケースをリモコンボックスの電池ケース内に入れたいので、リューターでプラスチックの出っ張りを削っていきます。
リモコンボックスからの電源ラインを外へ引き出すため、ドリルで穴を開けました。φ3mmです。
昇圧回路を結線します。昇圧回路はミニユニバーサル基板の上に載せて、単三電池ケースからのラインとジョイスティックへの電源ライン、あと先ほどのドリルで開けた穴を通すXBeeとArduino用の電源ラインを結線します。
リモコンボックス内に単三電池と昇圧回路を両面テープ(超強力タイプ)で取り付けます。
テープ基材がクッションのようで柔らかいので多少のでこぼこは吸収してくれて、なかなかいい感じです。
次に、XBeeとArduino、コネクタの部位配置を検討しています。
下に見えるユニバーサル基板が、リモコンボックスの外側で搭載するのにちょうど良い大きさなので、このまま使用するとして、キツキツの実装になりました。
【トピックス】2020年5月。前回更新から約4ヶ月程度経ちました。その間に世界中で新型コロナウイルスの感染が広がり、日本でも”緊急事態宣言”が出されて極端な外出自粛となっています。そのため、この今年のGWは「ステイホーム週間」として家に留まることを強く要請され、観光や繁華街の人通りもまばらとなり、経済にも大きな影を落としています。たとえ感染拡大が落ち着いたとしても今まで通りの生活に戻ることはなく、ウイルスとの共生を前提とした新しいライフスタイルを模索していくことになる、と言われています。
------------------------------------------------------------------------
一応、送信機の方針は決めたのですが、レイアウトや実装をどのようにするか?は別問題です。
配置に失敗してもそう簡単には一からやり直すことができませんので、ここでのアイデアを慎重にまとめるため、多くの時間がかかっています。。。
単三電池ケースをリモコンボックスの電池ケース内に入れたいので、リューターでプラスチックの出っ張りを削っていきます。
リモコンボックスからの電源ラインを外へ引き出すため、ドリルで穴を開けました。φ3mmです。
昇圧回路を結線します。昇圧回路はミニユニバーサル基板の上に載せて、単三電池ケースからのラインとジョイスティックへの電源ライン、あと先ほどのドリルで開けた穴を通すXBeeとArduino用の電源ラインを結線します。
リモコンボックス内に単三電池と昇圧回路を両面テープ(超強力タイプ)で取り付けます。
テープ基材がクッションのようで柔らかいので多少のでこぼこは吸収してくれて、なかなかいい感じです。
次に、XBeeとArduino、コネクタの部位配置を検討しています。
下に見えるユニバーサル基板が、リモコンボックスの外側で搭載するのにちょうど良い大きさなので、このまま使用するとして、キツキツの実装になりました。
リモートコントロール(RC)戦車をつくる【XBeeコントロール送信機①】 [RC戦車]
”ドアベルプロジェクト”でXBee間のシリアル通信ができたので、これを応用してXBeeコントロール送信機を作ります。
タミヤの"レスキュークローラー"のリモコンボックスが手元にあった(?)ので、これを改造してArduino Pro Mini + XBeeを組み込んでいきたいと思います。
楽しい工作シリーズ(セット) No.169 レスキュークローラー工作セット (3chリモコン)
"https://www.tamiya.com/japan/products/70169/index.html"
それで、やっぱり最初に考えるのは電源をどうするか?です。
リモコンボックスは単一乾電池を2個直列で使うレイアウトになっていますので、そのままでも3.3VのArduinoとXBeeを動作させることは可能です。
ただもともと有線経由で本体のモータへ電力を供給していたのですが、今回はそこまでのハイパワーは必要ありません。そこで単三のエネループと昇圧回路を組み込んだ電源回路を考えたいと思います。
【消費電流】
Arduino Pro Mini(以下Mini)とXBeeの消費電流を調べます。
①Mini:25mA
→Arduino互換機ボードなのですが、ネットで調べると大体20~22mAとかのようなので、
ちょっと切り上げて25mAくらいとします。
②XBee S2:送信 35mA/45mA(ブーストモード@3.3V DC)
受信 38mA/40mA(ブーストモード@3.3V DC)
→こちらはカタログスペックです。
① + ② = 65mA
【エネループ】
ふだん使いしている割には、あまり気にしたことがなかったですねー。。。
ニッケル水素電池は1.2Vなんですね。単三だと1,900mAhだそうです。
連続送受信するわけではないですが、それでも30時間くらいは持ちそうです。
これならラジコンで遊ぶ分には問題なさそうです。
【昇圧回路】
以前にストロベリーリナックスで購入して、手元にあるDC-DCコンバータを使います。これです↓
MCP1640 2.0V~5.5V可変DC-DCコンバータモジュール
"http://strawberry-linux.com/catalog/items?code=12033"
出力設定3.3V時
入力1.2V→出力100mA
入力2.4V→出力300mA
これを使うとちょうどやりたいことのイメージが。。。こんな感じです↓
タミヤの"レスキュークローラー"のリモコンボックスが手元にあった(?)ので、これを改造してArduino Pro Mini + XBeeを組み込んでいきたいと思います。
楽しい工作シリーズ(セット) No.169 レスキュークローラー工作セット (3chリモコン)
"https://www.tamiya.com/japan/products/70169/index.html"
それで、やっぱり最初に考えるのは電源をどうするか?です。
リモコンボックスは単一乾電池を2個直列で使うレイアウトになっていますので、そのままでも3.3VのArduinoとXBeeを動作させることは可能です。
ただもともと有線経由で本体のモータへ電力を供給していたのですが、今回はそこまでのハイパワーは必要ありません。そこで単三のエネループと昇圧回路を組み込んだ電源回路を考えたいと思います。
【消費電流】
Arduino Pro Mini(以下Mini)とXBeeの消費電流を調べます。
①Mini:25mA
→Arduino互換機ボードなのですが、ネットで調べると大体20~22mAとかのようなので、
ちょっと切り上げて25mAくらいとします。
②XBee S2:送信 35mA/45mA(ブーストモード@3.3V DC)
受信 38mA/40mA(ブーストモード@3.3V DC)
→こちらはカタログスペックです。
① + ② = 65mA
【エネループ】
ふだん使いしている割には、あまり気にしたことがなかったですねー。。。
ニッケル水素電池は1.2Vなんですね。単三だと1,900mAhだそうです。
連続送受信するわけではないですが、それでも30時間くらいは持ちそうです。
これならラジコンで遊ぶ分には問題なさそうです。
【昇圧回路】
以前にストロベリーリナックスで購入して、手元にあるDC-DCコンバータを使います。これです↓
MCP1640 2.0V~5.5V可変DC-DCコンバータモジュール
"http://strawberry-linux.com/catalog/items?code=12033"
出力設定3.3V時
入力1.2V→出力100mA
入力2.4V→出力300mA
これを使うとちょうどやりたいことのイメージが。。。こんな感じです↓
リモートコントロール(RC)戦車をつくる【スケッチ_モータ制御②】 [RC戦車]
前回の記事(リモートコントロール(RC)戦車をつくる【赤外線コントロール②】)で赤外線リモコンのコードが判ったのでスケッチを修正するのですが、もう一つ修正する箇所があります。
これまでは
>#define SPEED 128 //モータへの電圧(スピード)は一定
として、どの方向に対してもスピードを一定にしていましたが、緩旋回では左右のキャタピラのスピードに差分をつけるため、左右のモータへかける電圧(Vref)を変える必要があります。
ジョイスティックであればアナログ的に電圧を変化させる(スピードを変化させる)ことができるのですが、今回はリモコンボタンのため2種類の電圧を組み合わせての変化とします。
他にも全般的にスケッチを見直して修正しています。
【スケッチ】
※#include <IRremote.h>は表示の不具合で全角<>で記載しています。本当は半角<>ですのでご注意ください。
【動作確認】
早速、動かしてみます。
右/左と緩旋回もできています。動作の変化時のwaitも外したので、前回よりスムーズに動作してラジコンらしい動きになりました。直進でやや左に寄ってしまうのはおそらく車軸がずれているか?、それともVref電圧に少々の電圧差があるのかもしれません。真っ直ぐ走らせるためにはこのズレを補正する形でVref電圧を調整すればよいのですが、今回はやりません。(動けばOK!だったので。。。)
これまでは
>#define SPEED 128 //モータへの電圧(スピード)は一定
として、どの方向に対してもスピードを一定にしていましたが、緩旋回では左右のキャタピラのスピードに差分をつけるため、左右のモータへかける電圧(Vref)を変える必要があります。
ジョイスティックであればアナログ的に電圧を変化させる(スピードを変化させる)ことができるのですが、今回はリモコンボタンのため2種類の電圧を組み合わせての変化とします。
他にも全般的にスケッチを見直して修正しています。
【スケッチ】
/* SparkFun Electronics 2013 Playing with Infrared Remote Control IR Receiver Breakout (SEN-8554): Supply voltage of 2.5V to 5.5V Attach OUT: To pin 13 on Arduino GND: GND VCC: 5V This is based on Ken Shirriff's code found on GitHub: https://github.com/shirriff/Arduino-IRremote/ This code works with cheap remotes. If you want to look at the individual timing of the bits, use this code: http://www.arduino.cc/playground/Code/InfraredReceivers */ #include <IRremote.h> // 赤外線送受信用ヘッダファイル int RECV_PIN = 11; // 赤外線受信モジュール IRrecv irrecv(RECV_PIN); // 赤外線受信用オブジェクトの設定 decode_results results; // 赤外線受信結果を格納する #define POWER 0x8F71BE4 #define A 0x8F71FE0 #define B 0x8F71EE1 #define C 0x8F71AE5 #define UP 0x8F705FA #define DOWN 0x8F700FF #define LEFT 0x8F708F7 #define RIGHT 0x8F701FE #define SELECT 0x8F704FB #define UP_LEFT 0x8F78D72 #define DOWN_LEFT 0x8F78877 #define UP_RIGHT 0x8F7847B #define DOWN_RIGHT 0x8F7817E #define SPEED_0 0 //モータへの電圧(スピード)を3種類用意 #define SPEED_1 77 #define SPEED_2 153 //0~255(MAX):Vref電圧を3Vまでに制限 // set pin numbers: // 右キャタピラ用ピン const int R_Vref = 5; //D5(PWM) const int R_OUT1 = 3; //D3 const int R_OUT2 = 4; //D4 // 左キャタピラ用ピン const int L_Vref = 6; //D6(PWM) const int L_OUT1 = 7; //D7 const int L_OUT2 = 8; //D8 // 初期化(電源投入/リセット時1回のみ実行): void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver // initialize the motor driver pin as an output(Arduinoにモータドライバへのピンが出力であることを伝える) pinMode(R_Vref, OUTPUT); pinMode(R_OUT1, OUTPUT); pinMode(R_OUT2, OUTPUT); pinMode(L_Vref, OUTPUT); pinMode(L_OUT1, OUTPUT); pinMode(L_OUT2, OUTPUT); } // main loop: void loop() { if (irrecv.decode(&results)) //(★これが無いと動作しない) { switch(results.value) { case UP: //UPなら前進 analogWrite(R_Vref, SPEED_2); // モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_2); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case RIGHT: //RIGHTなら右超信地旋回 analogWrite(R_Vref, SPEED_2); // モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_2); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case LEFT: //LEFTなら左超信地旋回 analogWrite(R_Vref, SPEED_2); // モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_2); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; case DOWN: //DOWNなら後進 analogWrite(R_Vref, SPEED_2); // モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_2); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; case SELECT: //SELECTなら停止(ブレーキ→ストップ) analogWrite(R_Vref, SPEED_0); // モータドライバのスピードを指定 analogWrite(L_Vref, SPEED_0); digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); //ブレーキ digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, HIGH); digitalWrite(R_OUT1, LOW); //ストップ digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); break; case UP_RIGHT: //UP_RIGHTなら右前進緩旋回 analogWrite(R_Vref, SPEED_1); // 右キャタピラの速度を遅く analogWrite(L_Vref, SPEED_2); // 左キャタピラの速度を速く digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case DOWN_RIGHT: //DOWN_RIGHTなら右後進緩旋回 analogWrite(R_Vref, SPEED_1); // 右キャタピラの速度を遅く analogWrite(L_Vref, SPEED_2); // 左キャタピラの速度を速く digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; case UP_LEFT: //UP-LEFTなら左前進緩旋回 analogWrite(R_Vref, SPEED_2); // 右キャタピラの速度を速く analogWrite(L_Vref, SPEED_1); // 左キャタピラの速度を遅く digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, HIGH); digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, HIGH); digitalWrite(L_OUT2, LOW); break; case DOWN_LEFT: //DOWN-LEFTなら左後進緩旋回 analogWrite(R_Vref, SPEED_2); // 右キャタピラの速度を速く analogWrite(L_Vref, SPEED_1); // 左キャタピラの速度を遅く digitalWrite(R_OUT1, LOW); //貫通電流防止(ストップ) digitalWrite(R_OUT2, LOW); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, LOW); digitalWrite(R_OUT1, LOW); digitalWrite(R_OUT2, HIGH); digitalWrite(L_OUT1, LOW); digitalWrite(L_OUT2, HIGH); break; default: break; } irrecv.resume(); // 受信機をリセットする(★これが無いと1回のみの制御となる) } }
※#include <IRremote.h>は表示の不具合で全角<>で記載しています。本当は半角<>ですのでご注意ください。
【動作確認】
早速、動かしてみます。
右/左と緩旋回もできています。動作の変化時のwaitも外したので、前回よりスムーズに動作してラジコンらしい動きになりました。直進でやや左に寄ってしまうのはおそらく車軸がずれているか?、それともVref電圧に少々の電圧差があるのかもしれません。真っ直ぐ走らせるためにはこのズレを補正する形でVref電圧を調整すればよいのですが、今回はやりません。(動けばOK!だったので。。。)
リモートコントロール(RC)戦車をつくる【赤外線コントロール②】 [RC戦車]
これまで使った赤外線リモコン(SparkFun 赤外線リモコン COM-11759)では4方向のボタンしかありませんので、前後進と左右の4方向の動きしかできません。特に左右に曲がる場合には超信地旋回(スピンターン)というものでしていますが、ふつうに曲がりたいわけです(緩旋回というらしいです)。
で、もうちょっと方向ボタンがあるリモコンがないかなー?と探していたらありました。
↓これです。秋月電子で300円(税抜)です。
オプトサプライ赤外線リモコン[OE13KIR]
"http://akizukidenshi.com/catalog/g/gM-07245/"
取扱説明書を読むとデータフォーマットは"NECフォーマット"で、受信したときのコードもこれまでのSparkFunの赤外線リモコンと同じなので、プログラムにはデータコードを追記するだけでそのまま流用できそうです。
が。。。、そうは簡単にはいかないもので、試しにやってみると全く動きません
追加したところ以外の前後進と左右も動きませんので、今回改造した部分が悪いわけではなさそうです。
そうなると赤外線リモコンが壊れているか? or 取扱説明書とは別のコードを発信しているか?ですが、オシロで見たところ何らかの信号は出ているので壊れてはいないようです。
となると、”別のコードを発信してる?”となるわけですが、それをどう確かめるかです。
ググると純粋に”赤外線リモコンを作ろー!”的なサイトがたくさんありますので、リーダーコードから順次読み込んでいくようなプログラムも掲載されているのですが、そこまで手を広げるとちょっと難易度も上がるので避けたいところです。
で、ありました。Arduinoのサンプルスケッチで受信したコードをシリアルモニタに表示してくれるのが。。。
”IRrecvDumpV2”というスケッチです。
早速、これをArduino unoにダウンロードして使ってみます。
Auduino unoの配線図とかはこちら↓を参照してください。
リモートコントロール(RC)戦車をつくる【赤外線コントロール】
うーん、違いますねー。。。
取扱説明書ではSparkFun COM-11759と同じですから、次のようになっています。
UP :0x10EFA05F
DOWN:0x10EF00FF
LEFT :0x10EF10EF
RIGHT:0x10EF807F
なぜ取扱説明書と違うかは今は気にせず(ごめんね、いい加減で)、判ったコードでスケッチを書き直してみます。
で、もうちょっと方向ボタンがあるリモコンがないかなー?と探していたらありました。
↓これです。秋月電子で300円(税抜)です。
オプトサプライ赤外線リモコン[OE13KIR]
"http://akizukidenshi.com/catalog/g/gM-07245/"
取扱説明書を読むとデータフォーマットは"NECフォーマット"で、受信したときのコードもこれまでのSparkFunの赤外線リモコンと同じなので、プログラムにはデータコードを追記するだけでそのまま流用できそうです。
が。。。、そうは簡単にはいかないもので、試しにやってみると全く動きません
追加したところ以外の前後進と左右も動きませんので、今回改造した部分が悪いわけではなさそうです。
そうなると赤外線リモコンが壊れているか? or 取扱説明書とは別のコードを発信しているか?ですが、オシロで見たところ何らかの信号は出ているので壊れてはいないようです。
となると、”別のコードを発信してる?”となるわけですが、それをどう確かめるかです。
ググると純粋に”赤外線リモコンを作ろー!”的なサイトがたくさんありますので、リーダーコードから順次読み込んでいくようなプログラムも掲載されているのですが、そこまで手を広げるとちょっと難易度も上がるので避けたいところです。
で、ありました。Arduinoのサンプルスケッチで受信したコードをシリアルモニタに表示してくれるのが。。。
”IRrecvDumpV2”というスケッチです。
早速、これをArduino unoにダウンロードして使ってみます。
Auduino unoの配線図とかはこちら↓を参照してください。
リモートコントロール(RC)戦車をつくる【赤外線コントロール】
うーん、違いますねー。。。
取扱説明書ではSparkFun COM-11759と同じですから、次のようになっています。
UP :0x10EFA05F
DOWN:0x10EF00FF
LEFT :0x10EF10EF
RIGHT:0x10EF807F
なぜ取扱説明書と違うかは今は気にせず(ごめんね、いい加減で)、判ったコードでスケッチを書き直してみます。
リモートコントロール(RC)戦車をつくる【組み上げ~動作確認】 [RC戦車]
制御回路部の作製ができたので、ベース車体を組み上げます。
制御回路部とモバイルバッテリーの高さは、なるべく上面をツラ一に合わせるようにして、フラットな感じにしました。
周辺部の赤外線受光部は、暫定的にブレッドボードに実装してモバイルバッテリーに仮置き、ジャンパワイヤで接続しています。
【組み上げ】
【車体①(上面)】
【車体②(側面)】
【動作確認】
いよいよシェイクダウンです。どんなものでも初物はドキドキです。
再生できない場合、ダウンロードは🎥こちら
動作ロジックは間違いなさそうです。
ただ、動作を変えるタイミングで停止(ストップ)と100μsのwaitを入れているので、少々かったるい感じはします。
制御回路部とモバイルバッテリーの高さは、なるべく上面をツラ一に合わせるようにして、フラットな感じにしました。
周辺部の赤外線受光部は、暫定的にブレッドボードに実装してモバイルバッテリーに仮置き、ジャンパワイヤで接続しています。
【組み上げ】
【車体①(上面)】
【車体②(側面)】
【動作確認】
いよいよシェイクダウンです。どんなものでも初物はドキドキです。
再生できない場合、ダウンロードは🎥こちら
動作ロジックは間違いなさそうです。
ただ、動作を変えるタイミングで停止(ストップ)と100μsのwaitを入れているので、少々かったるい感じはします。