ArduinoとAndroidデバイスでルンバロボットを制御する
コンポーネントと消耗品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
|
このプロジェクトについて
<図>
Instructables Robotics Contest 2016の受賞者の1人として、iRobot RoombaCreate2を賞品として受け取りました。これは、ロボット工学開発のための優れた非常に手頃なプラットフォームであり、約200米ドルの費用がかかります。 Create 2では、さまざまなプログラミング方法が可能です。まず、ArduinoとAndroid APPを使用して、ロボットを動かしました。この最初のチュートリアルでは、シリアルポートを介してArduinoをルンバに接続する方法と、モーター、LED、およびサウンドをコマンドする方法について説明します。今後のプロジェクトでは、センサーを調べ、RaspberryPiを使用してルンバをインターネットに接続します。
ベロー、ルンバロボットをプログラミングした最初の結果を示すビデオ:
ステップ1:部品表 <図>
- iRobot Create2
- Arduino UNO
- BluetoothモジュールHC-06
- プッシュボタン
ステップ2:ルンバCreate2 <図> <図>
ルンバは、2輪とフロントキャスターを備えた差動駆動ロボットです。その速度は最大500mm / sになり、上向きまたは後ろ向きに移動するように命令できます。
信号化については、4つの7セグメントディスプレイと5つのLEDでカウントできます(図を参照):
- クリーン
- スポット
- ドック
- 警告/確認
- 汚れ/破片
内部センサーとして、特に次のものがあります:
- クリフディテクター(前面に4つ)
- バンプ検出器(前面に2つ)
- ホイールエンコーダ
プログラミングには、ドキュメント:iRobot®Create®2OpenInterface(OI)を使用する必要があります。ルンバは3つのモードでプログラムできます:
パッシブモード:
- Startコマンドまたはクリーニングモードコマンド(Spot、Clean、Seek Dockなど)のいずれかを送信すると、OIはパッシブモードになります。 OIがパッシブモードの場合、任意のセンサーコマンドを使用してセンサーデータを要求および受信できますが、アクチュエーター(モーター、スピーカー、ライト、ローサイドドライバー、デジタル出力)の現在のコマンドパラメーターを別のものに変更することはできません。 。
セーフモード:次の安全関連の条件を除いて、ルンバを完全に制御できます。
- 充電器が接続され、電源が入っています。
- (任意のホイールでの)ホイールドロップの検出。
- 前進中(または回転半径が小さく、ロボットの半径が1未満で後退中)の崖の検出。
- OIがセーフモードのときに上記の安全関連の状態のいずれかが発生した場合、ルンバはすべてのモーターを停止し、パッシブモードに戻ります。
フルモード:
- ルンバ、そのすべてのアクチュエーター、およびOIがセーフモードのときに制限されるすべての安全関連条件を完全に制御できます。フルモードでは、崖、ホイールドロップ、および内部充電器の安全機能が遮断されます。 。
ステップ3:シリアル接続 <図> <図> <図>
ルンバとArduino間の通信には、シリアルポートが使用されます。デフォルトでは、ルンバは115,200ボーで通信しますが、Arduinoと通信するために、19,200ボーに切り替えます。
ルンバのボーレートを設定するには、次の2つの方法があります。
- ルンバの電源をオフにしている間、ライトがオフになったら、クリーン/電源ボタンを押し続けます。約10秒後、ルンバは下降ピッチの曲を演奏します。ルンバは、プロセッサがバッテリ電源を失うか、ボーレートがOIによって明示的に変更されるまで、19,200ボーで通信します。
- ボーレート変更ピン(Mini-DINコネクタのピン5)を使用して、ルンバのボーレートを変更します。ルンバをオンにした後、2秒間待ってから、ボーレート変更を3回ローパルスします。各パルスは50〜500ミリ秒続く必要があります。ルンバは、プロセッサがバッテリ電源を失うか、ボーレートがOIによって明示的に変更されるまで、19200ボーで通信します。
上の図は、ArduinoをRoombaMini-DINコネクタに接続する方法を示しています
ステップ4:ルンバを開始する
ルンバをプログラミングするときに最初に行わなければならないことは、次のとおりです。
- ロボットを「ウェイクアップ」する
- モードを定義する(セーフまたはフル)
以下の機能に示すように、Mini-DINピン5(デバイス入力の検出)にLowパルスを送信して「ウェイクアップ」できます。
void wakeUp(void){setWarningLED(ON); digitalWrite(ddPin、HIGH); delay(100); digitalWrite(ddPin、LOW); delay(500); digitalWrite(ddPin、HIGH); delay(2000);}
ルンバを起動するには、常に2つのコードを送信する必要があります。「START」[128]とモード(この場合は「SAFEMODE」[131])です。 「フルモード」が必要な場合は、代わりにコード[132]を送信する必要があります。
void startSafe(){Roomba.write(128); // Roomba.write(131);を開始します//セーフモードdelay(1000);}
ステップ5:LEDとディスプレイをオンにする <図> <図>
LEDをオンにする
はじめに説明したように、ルンバには5つのLEDがあります:
- 電源/クリーン(2色の赤/緑と強度制御)
- スポット(緑、固定強度)
- ドック(緑、固定強度)
- 警告/チェック(オレンジ、固定強度)
- 汚れ/破片(青、固定強度)
すべてのLEDは、コード[139]を使用して命令できます。電源LEDを制御するには、「色」と「強度」の2つのデータバイトをルンバに送信する必要があります。
色:
- 緑=0
- オレンジ=128
- red =255
強度:
- 低=0
- 最大=255
関数 setPowerLED(byte setColor、byte setIntensity) します:
void setDigitLEDs(bytedigit1、bytedigit2、bytedigit3、bytedigit4){Roomba.write(163);ルンバ.write(digit1);ルンバ.write(digit2);ルンバ.write(digit3); Roomba.write(digit4);}
たとえば、半分の強度でオレンジ色のPOWER LEDをオンにするには、次のように関数を呼び出すことができます。
setPowerLED(128、128);
残りの4つのLEDをオンにするには、次の機能を使用する必要があります。
setDebrisLED(ON); setDockLED(ON); setSpotLED(ON); setWarningLED(ON);
上記のすべての関数には、次のようなコードがあります。
void setDebrisLED(bool enable){debricLED =enable;ルンバ.write(139); Roomba.write((debrisLED?1:0)+(spotLED?2:0)+(dockLED?4:0)+(warningLED?8:0)); Roomba.write((byte)color); Roomba.write((byte)intensity);}
基本的に違いは次のようになります:
debrisLED =enable;
他のLED( spotLED、dockLED、warningLED )をそれぞれ有効にするように変更する必要があります 。
表示するメッセージの送信
ルンバには、2つの異なる方法でメッセージを送信するために使用できる4つの7セグメントディスプレイがあります。
- コード[163]:数字LED生(数値)
- コード[164]:数字LED ASCII(文字と特別なコードの概算)
数字を表示するのはとても簡単です。表示される4桁の後に、コード[163]を送信する必要があります。関数: setDigitLEDs(bytedigit1、bytedigit2、bytedigit3、bytedigit4) あなたのためにこれを行います:
void setDigitLEDs(bytedigit1、bytedigit2、bytedigit3、bytedigit4){Roomba.write(163);ルンバ.write(digit1);ルンバ.write(digit2);ルンバ.write(digit3); Roomba.write(digit4);}
たとえば、「1、2、3、4」を表示するには、次の関数を呼び出す必要があります。
setDigitLEDs(1、2、3、4);
コード[164]を使用すると、ASCIIの近似を送信できます。関数 setDigitLEDFromASCII(byte Digit、char letter) これは私たちに行います:
void setDigitLEDFromASCII(byte digit、char letter){switch(digit){case 1:digit1 =letter;壊す;ケース2:digit2 =文字;壊す;ケース3:digit3 =文字;壊す;ケース4:digit4 =文字;壊す; } Roomba.write(164);ルンバ.write(digit1);ルンバ.write(digit2);ルンバ.write(digit3); Roomba.write(digit4);}
簡単にするために、4桁を同時に送信する新しい関数を作成します:
void writeLEDs(char a、char b、char c、char d){setDigitLEDFromASCII(1、a); setDigitLEDFromASCII(2、b); setDigitLEDFromASCII(3、c); setDigitLEDFromASCII(4、d);}
たとえば、「STOP」を表示するには、次の関数を呼び出す必要があります。
writeLEDs( 's'、 't'、 'o'、 'p');
ステップ6:ルンバを動かす <図>
機動性のために、ルンバには最大500mm / sで動作するようにプログラムできる2つの独立したDCモーターがあります。ロボットを駆動するために使用できるいくつかのコマンドがあります。主なものは次のとおりです。
- コード[137]:ドライブ==> +/-速度(mm / s)および+/-半径(mm)を送信する必要があります
- コード[145]:ドライブダイレクト==>左/右の速度をmm / sで送信する必要があります(前進の場合は+、後退の場合は-)
- コード[146]:ドライブPWM ==>左ホイールと右ホイールの+/- PWMデータを送信する必要があります
以下は、これら3つのオプションのコードです。
void drive(int speed、int radius){clamp(velocity、-500、500); //最大速度と最小速度をmm / sで定義clamp(radius、-2000、2000); //最大半径と最小半径をmm単位で定義Roomba.write(137); Roomba.write(velocity>> 8); Roomba.write(velocity); Roomba.write(radius>> 8); Roomba.write(radius);} // ---------------------------------------- ----------------------- void driveWheels(int right、int left){clamp(right、-500、500);クランプ(左、-500、500);ルンバ.write(145); Roomba.write(右>> 8);ルンバ.write(右); Roomba.write(左>> 8);ルンバ.write(左); } // ----------------------------------------------- ---------------- void driveWheelsPWM(int rightPWM、int leftPWM){clamp(rightPWM、-255、255);クランプ(leftPWM、-255、255);ルンバ.write(146); Roomba.write(rightPWM>> 8);ルンバ.write(rightPWM); Roomba.write(leftPWM>> 8); Roomba.write(leftPWM);}
「クランプ」機能は、入力できる最大値と最小値を定義することに注意してください。この関数は、ファイル rombaDefines.h:で定義されています。
#defineクランプ(値、最小、最大)(値<最小?最小:値>最大?最大:値)
上記のコードを使用すると、ルンバを動かすためのより簡単な関数を作成できます。
/ ------------------------------------------- -------------------- void turnCW(unsigned short speed、unsigned shortdegrees){drive(velocity、-1);クランプ(速度、0、500); delay(6600); drive(0,0);} // ---------------------------------------- ----------------------- void turnCCW(unsigned short speed、unsigned shortdegrees){drive(velocity、1);クランプ(速度、0、500); delay(6600); drive(0,0);} // ---------------------------------------- ----------------------- void driveStop(void){drive(0,0);} // ----------- -------------------------------------------------- --void driveLeft(int left){driveWheels(left、0);} // ------------------------------- -------------------------------- void driveRight(int right){driveWheels(0、right);}
>
角度を変えるには、「遅延」引数を特定の速度に対して特別に計算する必要があることに注意してください。モーターのテストに使用できるいくつかの例を以下に示します。
turnCW(40、180); //時計回りに180度回転し、stopdriveWheels(20、-20); // driveLeft(20);をスピンします//左に曲がる
モーターをテストするには、外部プッシュボタン(私の場合はArduinoピン12に接続)を追加することをお勧めします。これにより、コードをArduinoにダウンロードして、ルンバを起動しますが、プッシュボタンが押されるまで実行を停止します。通常、モーターのテストでは、コードのセットアップ部分で実行できます。
例として、以下の簡単なArduinoコードを参照してください(コードは以前に開発された関数と定義を使用していることに注意してください):
#include "roombaDefines.h" #include // Roomba Create2 connectionint rxPin =10; int txPin =11; SoftwareSerial Roomba(rxPin、txPin); // ------ --------------------------------------- void setup(){Roomba.begin(19200); pinMode(ddPin、OUTPUT); pinMode(buttonPin、INPUT_PULLUP); // Arduinoピン12に接続され、delay(2000)の「開始」に使用されます。起きろ (); //ルンバを起こしますstartSafe(); // Roombaをセーフモードで起動しますwhile(digitalRead(buttonPin)){} //ボタンが押されるのを待ってコードを継続的に実行しますturnCW(40、180); //ルンバを時計回りに180度回転させて停止する} // ----------------------------------- ---------- void loop(){}
ステップ7:Bluetooth経由でルンバを制御する <図> <図> <図>
プロジェクトの最初の部分を完了するために、Bluetoothモジュール(HC-06)をArduinoにインストールしましょう。上の図はそれを行う方法を示しています。通常、HC-06は9,600のボーレートで工場から決済されます。 Arduino-ルンバの通信速度に対応するために、19,200に変更することが重要です。モジュールにATコマンドを送信することでそれを行うことができます(AT + BAUD5、ここで「5」は19,200のコードです)。
HC-06がどのように機能するかについて疑問がある場合は、私のチュートリアル「Bluetooth / Android / Arduinoを介した「もの」の接続」をご覧ください。
ルンバを制御するには、MIT AppInventor 2:「MJRoBotBT Remote Control」を使用して、私が開発した汎用アプリを使用して移動ロボットを制御します。アプリは、リンクを介してGoogleストアから無料でダウンロードできます:アプリ:MJRoBotBTリモートコントロール。
このアプリはシンプルなインターフェースを備えており、テキストモードで、または事前にプログラムされたボタンを介して直接BTモジュールにコマンドを送信できます(ボタンが押されるたびに、文字が送信されます):
- w:序文
- s:後方
- d:そうです
- a:左
- f:停止
- p:オン/オフ(この最初の部分では使用されません)
- m:手動/自動(セーフモードで崖などの障害物が見つかった場合にルンバを再起動するために使用されます)
- +:速度+
- -:速度-
必要に応じて、他のコマンドをテキストとして送信することもできます。 BTモジュールから受信したメッセージのテキストウィンドウもあります。この機能はテスト段階で非常に重要であり、「シリアルモニター」と同じように使用できます。
loop() コードの一部はBluetoothデバイスを「リッスン」し、受信したコマンドに応じてアクションを実行します。
void loop(){checkBTcmd(); //コマンドがBTリモコンから受信されているかどうかを確認しますmanualCmd();}
関数 checkBTcmd() 以下に示します:
void checkBTcmd()//コマンドがBTリモートコントロールから受信されたかどうかを確認します{if(BT1.available()){command =BT1.read(); BT1.flush(); }}
コマンドを受信すると、関数 manualCmd() 適切なアクションを実行します:
void manualCmd(){switch(command){case'm ':startSafe(); Serial.print( "セーフモードのルンバ"); BT1.print( "Roomba BT Ctrl OK-セーフモード"); BT1.println( '\ n');コマンド='f'; playSound(3);壊す;ケース 'f':driveStop(); //両方のモーターをオフにしますwriteLEDs( 's'、 't'、 'o'、 'p');状態=コマンド;壊す;ケース 'w':ドライブ(motorSpeed、0); writeLEDs( ''、 'g'、 'o'、 '');状態=コマンド;壊す;ケース 'd':driveRight(motorSpeed); writeLEDs( 'r'、 'i'、 'g'、 'h');壊す;ケース 'a':driveLeft(motorSpeed); writeLEDs( 'l'、 'e'、 'f'、 't');壊す;ケース 's':ドライブ(-motorSpeed、0); writeLEDs( 'b'、 'a'、 'c'、 'k');状態=コマンド;壊す;ケース '+':if(state =='w'){motorSpeed =motorSpeed + 10; if(motorSpeed> MAX_SPEED){motorSpeed =MAX_SPEED; }コマンド='w'; } else {command =state;} break;ケース '-':if(state =='w'){motorSpeed =motorSpeed-10; } if(motorSpeed
ステップ8:結論 <図>
ここで使用されている完全なArduinoコードと関連ドキュメントは、私のGITHUB:Roomba_BT_Ctrlにあります。
このチュートリアルでは、すべてのルンバアクチュエータがコメントされているわけではないことに注意してください。掃除に使用される他のモーター、スケジュールに使用される他のLED、ボタン、センサーなどがあります。
プログラムで作成した関数のいくつかは、DomAmatoによって開発されたCreate2ライブラリに基づいていました。完全なライブラリは、 https://github.com/brinnLabs/Create2 からダウンロードできます。 。
ここでの私の意図は、シンプルに保ち、ルンバで遊び始めるための開始プラットフォームを提供することでした。将来的には、Raspberry-Piを使用して他のチュートリアルを公開したり、ルンバをインターネットに接続したり、センサーを読んだりするふりをします。
いつものように、このプロジェクトが、他の人がエレクトロニクスとロボット工学のエキサイティングな世界で自分の道を見つけるのに役立つことを願っています!
その他のプロジェクトについては、私のブログ(ポルトガル語)にアクセスしてください:
MJRoBot.org
世界の南からのサルド!
次のチュートリアルでお会いしましょう!
ありがとう
マルセロ
コード
Github
https://github.com/Mjrovai/Roomba_BT_Ctrl製造プロセス
- 実際のセンサーで効果を制御する
- Samsung SAMIIO、Arduino UNO、RaspberryPiで数分で火災探知機を作る
- ArduinoとRaspberryPiを使用してインターネット制御のビデオストリーミングロボットを構築する
- Arduino、1Sheeld、Androidを使用したユニバーサルリモコン
- サーボモーター付きロボット回避障害物
- Androidデバイスを搭載したポータブル体温計
- ArduinoとMPU6050によるサーボモーターの制御
- BoltとArduinoを使用したLEDの明るさの制御
- u-blox LEA-6H 02GPSモジュールとArduinoおよびPython
- Arduinoによる音声認識と合成
- ArduinoUnoでLEDマトリックスを制御する