2021年2月18日掲載
いよいよRTKロボットカー作りの最終日です。部材をラジコンカーの車体に搭載し、ピン接続すれば本体は完成です。
RTKロボットカーの制御を行うマイコンにArduinoを使います。Arduinoは動作が安定していて、開発環境も整っています。Arduinoにはいろいろと種類がありますが、今回使うのはArduino Nano Everyです。Arduino Nano Everyは新しいボードで、小型で安いにもかかわらず、性能が良いのが特徴です。PWMにも対応し、Day2で設定した通りハードウェアシリアルを4つ(Serial, Serial1, Serial2, Serial3)使えます。小さくてもRTKロボットカーを制御する十分な性能を備えています。
下図はRTKロボットカー全体のピン接続のイメージ図です。下の手順書に詳しく説明しましたので、間違いのないように接続してください。
下図はAndroidスマホとBluetooth経由で送受信するデータのイメージ図です。完成するとロボットカーの状態や処理している情報をAndroidスマホ上で視覚的に確認することができます。
ラジコンカー本体の構成に関しては次のサイトを参考にしてください。
ラジコンカーの車体カバーを外し、RCシステム受信機を車体から取り外す。車体の空きスペースに耐震ジェル等でモバイルバッテリーを取り付ける。
【1】Day3で作ったプラスチックダンボール上の空きのミニブレッドボードに秋月RN-42②と③を取り付ける。
【2】秋月RN-42②と③をArduino Nano Everyに下記の通り接続する。
秋月RN-42② | Arduino Nano Every |
TX(J2 PIN6) | D7(Serial2 RX) |
RX(J2 PIN7) | D2(Serial2 TX) |
GND(J1 PIN12) | GND |
3.3V(J1 PIN11) | 3.3V |
秋月RN-42③ | Arduino Nano Every |
TX(J2 PIN6) | D3(Serial3 RX) |
RX(J2 PIN7) | D6(Serial3 TX) |
GND(J1 PIN12) | GND |
3.3V(J1 PIN11) | 3.3V |
【1】11.5cm×6.5cmのプラスチックダンボールを作り、F9P受信機等を載せたプラスチックダンボールとTの字型に接着する。
※車体のラジコンカーにTAMIYA Lunch Boxを使用した場合のサイズと配置。車体に合わせてサイズと配置を調整する。
【2】2周波アンテナの余分なケーブルをスペースに入れたうえで、ダブルクリップ等でプラスチックダンボールをラジコンカーの本体に取り付ける。
【1】スピードコントローラーとステアリングサーボの黒線同士、赤線同士をジャンパワイヤーで接続する(これでステアリングサーボの電源がスピードコントローラーから供給されるようになる)。
白線はArduino Nano Everyに下記の通り接続する(これで制御信号はArduino Nano Everyから送信されるようになる)。
スピードコントローラー | ステアリングサーボ | Arduino Nano Every |
黒線 | 黒線 | |
赤線 | 赤線 | |
白線 | D10 | |
白線 | D9 |
【1】Arduino Nano EveryをWindows PCにUSB接続する。
【2】Arduino IDEを起動し、本ページ下部のサンプルプログラムをコピー&ペーストする。
【3】Arduino IDEの[ツール]-[シリアルポート]でArduino Nano Everyのシリアルポートを指定して、書き込みボタンをクリックする。
【1】F9P受信機とArduino Nano Everyをモバイルバッテリーに接続する(動作を安定させるため、F9P受信機とArduino Nano Everyとの電源を独立にする)。
【2】車体のスピードコントローラーに走行用バッテリーを接続し、スピードコントローラーの電源を入れる。
【3】Androidスマホ①でLefebure NTRIP Clientを立ち上げる。トップ画面で左上の「Connect」ボタンを押す(秋月RN-42①に接続する)。RTK補正データ(RTCMデータ)がBluetooth経由でF9Pに送信される。
【4】Androidスマホ②でAgriBus-NAVIを立ち上げる(自動で秋月RN-42②に接続される)。衛星測位されている(=Bluetooth経由でArduino Nano EveryからNMEAを受信している)ことを確認する。
【5】Androidスマホ③でSerial Bluetooth Terminalを立ち上げる。トップ画面で右上の「Connect」ボタンを押す(秋月RN-42③に接続する)。コマンド入力欄に以下の文字を入力し送信ボタンを押してRTKロボットカーを走行制御する。
前進:a
ゆっくり進む:p
鋭く右に曲がる:R
緩く右に曲がる:r
鋭く左に曲がる:L
緩く左に曲がる:l
停止:s
【6】Androidスマホ②のAgriBus-NAVIにRTKロボットカーの走行軌跡が表示される。
// Arduino Nano EveryはSWSerialが使えないので全てHWSerialを使う
// Serial2,3はデフォルトでは使用できないので別途設定が必要
// Serial2 NMEA(7, 2); // Rx, Tx
// Serial3 COMMAND(3, 6); // Rx, Tx
#include <Servo.h>
Servo RCservo;
Servo RCmotor;
// 速度(機種によって異なるので微調整する)
#define add 76
#define pru 79
#define stp 100
// ステアリング(機種によって異なるので微調整する)
#define Straight 90
#define Turn_R 150
#define Turn_r 110
#define Turn_L 30
#define Turn_l 70
void setup()
{
// Serial.begin(115200);
Serial1.begin(115200);
Serial2.begin(115200);
Serial3.begin(115200);
// 制御信号を送る出力ピンの設定
RCservo.attach(9); // ラジコンステアリング
RCmotor.attach(10); // ラジコンモーター
}
void loop()
{
// データ受信したとき
if (Serial1.available()) {
char data = Serial1.read(); // 1文字ずつ受信
Serial2.print(data); // 1文字ずつ送信
}
if (Serial3.available()) {
char inByte;
inByte = Serial3.read();
switch(inByte)
{
// 前進
case 'a':
Serial3.println(inByte);
RCservo.write(Straight);
RCmotor.write(add);
break;
// ゆっくり進む
case 'p':
Serial3.println(inByte);
RCservo.write(Straight);
RCmotor.write(pru);
break;
// 鋭く右に曲がる
case 'R':
Serial3.println(inByte);
RCservo.write(Turn_R);
RCmotor.write(add);
break;
// 緩く右に曲がる
case 'r':
Serial3.println(inByte);
RCservo.write(Turn_r);
RCmotor.write(add);
break;
// 鋭く左に曲がる
case 'L':
Serial3.println(inByte);
RCservo.write(Turn_L);
RCmotor.write(add);
break;
// 緩く左に曲がる
case 'l':
Serial3.println(inByte);
RCservo.write(Turn_l);
RCmotor.write(add);
break;
// 停止
case 's':
Serial3.println(inByte);
RCservo.write(Straight);
RCmotor.write(stp);
break;
// 上記以外
default:
break;
}
}
}