2021年2月18日掲載

Day4

RTKロボットカーの組み上げ

 

いよいよ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.ラジコンカーの準備

ラジコンカーの車体カバーを外し、RCシステム受信機を車体から取り外す。車体の空きスペースに耐震ジェル等でモバイルバッテリーを取り付ける。

手順2.秋月RN-42②と③の取り付け

【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

手順3.ラジコンカーへの部材の固定

【1】11.5cm×6.5cmのプラスチックダンボールを作り、F9P受信機等を載せたプラスチックダンボールとTの字型に接着する。

※車体のラジコンカーにTAMIYA Lunch Boxを使用した場合のサイズと配置。車体に合わせてサイズと配置を調整する。

 

【2】2周波アンテナの余分なケーブルをスペースに入れたうえで、ダブルクリップ等でプラスチックダンボールをラジコンカーの本体に取り付ける。

手順4.スピードコントローラーとステアリングサーボの接続

【1】スピードコントローラーとステアリングサーボの黒線同士、赤線同士をジャンパワイヤーで接続する(これでステアリングサーボの電源がスピードコントローラーから供給されるようになる)。

白線はArduino Nano Everyに下記の通り接続する(これで制御信号はArduino Nano Everyから送信されるようになる)。

スピードコントローラー ステアリングサーボ Arduino Nano Every
黒線 黒線  
赤線 赤線  
白線   D10
  白線 D9

手順5.Arduino Nano Everyへのプログラムの書き込み

【1】Arduino Nano EveryをWindows PCにUSB接続する。

 

【2】Arduino IDEを起動し、本ページ下部のサンプルプログラムをコピー&ペーストする。

 

【3】Arduino IDEの[ツール]-[シリアルポート]でArduino Nano Everyのシリアルポートを指定して、書き込みボタンをクリックする。

手順6.RTKロボットカーの起動と操作

  

【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;

    }

  }

}

 

2.F9P受信機のUART2とArduino UNOのHWシリアルを接続