レゴパワー機能を制御する
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 1 |
このプロジェクトについて
電気モーターとサーボモーターを備えた素晴らしいレゴパワーファンクションモデルの1つがありますか?このチュートリアルでは、Arduinoと最小限の電子部品を使用してレゴモデルを制御する方法を紹介します。このチュートリアルを初心者が理解しやすいように、回路とプログラミングについて詳しく説明します。自分で作成する必要のあるレゴモデル(息子がいない場合)は、サポートしません。
また、MITアプリの発明者を使用して独自のリモートコントロールAndroidアプリをプログラムする方法についても学びます。すぐに、あなたはあなたの裏庭にあなた自身のレゴマーズローバーを持っているでしょう!
これは私の最初のArduinoプロジェクトであり、息子はレゴパワー機能を備えた美しいレゴテクニックカーモデル(9398 4X4クローラー)を持っています。1つはステアリング用のレゴサーボモーター、2つは運転用のレゴLモーターです。彼は私がこのプロジェクトに車を使用することを許可しました(私がモーターケーブルを切断しない限り)。ここでは、完成したプロトタイプをテストします:
電源機能の配線について
まず、レゴパワーファンクションエクステンションワイヤー(レゴウェブショップのアイテム8886)を購入します。次に、それらを(真剣に)切り取ります。一方の端にレゴブロックがあり、もう一方の端にピンがある「ブレイクアウト」ケーブルをいくつか作成します。ピンなどをはんだ付けします。説明されている配線は次のとおりです。
<図>GNDは、バッテリーパック(アノード)のマイナス端子(-)であるアースを表します。 C1とC2は極性を切り替えて、モーターとサーボの方向を切り替えることができます。 TechnicRobotは、すべてを詳細に説明する素晴らしいビデオを作成しました。 (警告:これはご自身の責任で行ってください。何かを台無しにした場合、私は責任を負いません!)レゴサーボコネクタの場合、4本のケーブルすべてにピンをはんだ付けする必要があります。ライトグレーのプラグが使用できます。バッテリーボックスとブレッドボードを接続する電源ケーブルの場合、必要なのは+9ボルトとGNDだけですが、ダークグレーのプラグを使用する必要があります(オスコネクタが必要なため):
<図>モーターケーブルはC1とC2を接続するだけで、ライトグレーのプラグが使用できます。 (詳細については回路図を調べてください。)
L293Dチップでレゴモーターを制御する
DCモーターには可変速度制御、レゴサーボには位置制御が必要です。これは、パルス幅変調(PWM)によって実現されます。 Arduinoのプログラミング言語はPWMを使いやすくします。単にanalogWrite(pin、dutyCycle)を呼び出します。dutyCycleは0から255までの値です。PWMピンはarduinoで〜でマークされています。
Arduinoの出力ピンは5ボルトと最大です。 30 mA、レゴモーターは9ボルトを必要とし、それぞれ100mA以上を引き出します。その間にある種の「スイッチングデバイス」が必要です。また、DCモーターを両方向に運転できるようにしたいと考えています。これらの機能は、いわゆるHブリッジによって解決されます。 1つの集積チップ上に2つのHブリッジを含むL293Dを使用します。これは、レゴモーター(M)をチップの一方の側に並列に接続し、レゴサーボ(S)をチップのもう一方の側に接続できることを意味します。 (2つのモーターを個別に制御する場合は、2つ目のL293Dが必要になります)。レゴサーボもGNDとレゴ+9ボルトに接続する必要があります。
このチップは、レゴ+9ボルトとアルドゥイーノ+5ボルトを完全に分離します。それらを一緒に接続しないでください。接続すると、何かが損傷します。ただし、すべてのアース線をL293Dアースピンで接続する必要があります。
<図>Arduinoから、ピン9を使用してモーター速度を制御し、ピン2と5を使用して回転方向を制御します。レゴサーボはモーターのように制御されます。ピン3を位置に接続し、ピン6と8を方向(左または右)に接続します。
プログラムの先頭で、使用するArduinoピンを定数として定義します。さらに、モーターを制御するために使用するいくつかの変数を定義します。
//グローバル定数として定義されたモーター制御デジタル出力ピンconstint controlPin1A =2; const int controlPin2A =5; const int ENablePin =9; //グローバル定数として定義されたサーボ制御デジタル出力ピンconstint controlPin3A =6; const int controlPin4A =8; const intservoENablePin =3; //モーター制御グローバル変数:int motorSpeed =0; //モーター速度0..255intmotorDirection =1; //順方向(1)または逆方向(0)//サーボ制御グローバル変数:intsteering =0; //サーボ位置0..255intsteringDirection =0; //左(0)と右(1)
セットアップでは、これらのピンをpinmode()コマンドで出力として定義し、digitalWrite()で0ボルトに設定します。
void setup(){//その他.... //デジタル出力ピンを宣言します:pinMode(controlPin1A、OUTPUT); // 1A pinMode(controlPin2A、OUTPUT); // 2A pinMode(ENablePin、OUTPUT); // EN1,2 pinMode(controlPin3A、OUTPUT); // 3A pinMode(controlPin4A、OUTPUT); // 4A pinMode(servoENablePin、OUTPUT); // EN3,4 digitalWrite(ENablePin、LOW); //モーターをオフにしますdigitalWrite(servoENablePin、LOW); //ステアリング中心}
次に、L293Dチップがモーターの回転方向をどのように制御するかを理解する必要があります。次の信号を供給する必要があります(高==5ボルト;低==0ボルト):
- EN1,2 1A 2A
- 高高低モーターが左に曲がる(前進、motorDirection ==1)
- 高低高モーターが右に曲がる(逆方向、motorDirection ==0)
- EN3,4 3A 4A
- 高高低サーボが左に曲がる(steeringDirection ==0)
- 高低高サーボが右に曲がる(steeringDirection ==1)
Ok。方向と速度/位置のグローバル変数を読み取り、モーターとサーボを制御するサブルーチンを作成する準備が整いました。
void SetMotorControl(){if(motorDirection ==1)// Forward {digitalWrite(controlPin1A、HIGH); digitalWrite(controlPin2A、LOW); } else //リバース{digitalWrite(controlPin1A、LOW); digitalWrite(controlPin2A、HIGH); } analogWrite(ENablePin、motorSpeed); //速度if(steeringDirection ==0)//左{digitalWrite(controlPin3A、HIGH); digitalWrite(controlPin4A、LOW); } else //右{digitalWrite(controlPin3A、LOW); digitalWrite(controlPin4A、HIGH); } analogWrite(servoENablePin、steering); //サーボ位置}
ジョイスティック付きのシンプルなRCAndroidアプリ
次に、モデルを制御するための簡単なAndroidアプリを作成しましょう。 (完成したアプリを最初にテストしたい場合:Google Playストアで利用できるようにしました。リンクは次のとおりです:Arduino RCカーBluetooth)。
MIT App Inventor2を使用します。MITAppInventorは、プログラミングとアプリ作成の革新的な初心者向け入門書です。 GoogleのMarkFriedmanとMITのHalAbelson教授が、AppInventorの開発を共同で主導しました。これは、MITのモバイル学習センターのスタッフが管理するWebサービスとして実行されます。
Androidスマートフォンで、Google Playにアクセスし、MIT AI2Companionアプリをインストールします。コンピューターで、FirefoxまたはChromeブラウザー(Internet Explorerはサポートされていません)でRCアプリへのリンクを開きます。ソースコードを表示するには、Gmailアドレスを使用してログインし、アカウントを作成する必要があります。携帯電話でコンパニオンアプリを開くと、ブラウザでソースコードを確認し、変更を加えて、携帯電話ですぐにテストできます。
ブラウザに、アプリのデザイナビューが表示されます:
<図>下部には、青いジョイスティックボールが入ったオレンジ色のパッドがあります。次に、ブロックビューに変更してプログラムを表示します。プログラムの中心は、青いジョイスティックボールに触れたりドラッグしたりする指の動きを追跡するwhen-blockです。
<図>指の位置は、2つの変数 currentX で追跡されます。 および currentY 2つの変数ステアリングの値を計算するために使用されます および速度 (範囲:-100..0 .. + 100)。最初に、プログラムは指がパッドの外側にあるかどうかを確認し、値を+/- 100に制限します。指がパッドの内側にある場合、プログラムはステアリングの値を計算します。 および速度 。次に、プログラムは次の形式のコマンド文字列を生成します。
コマンドは、リモートコントロール用の「RC」で始まり(将来的には、さらに多くのコマンドが必要になる可能性があります)、その後にコンマが続きます。次に、ステアリングの値を送信します および速度 。コマンドの最後にある改行文字( '\ n')は、コマンドが完了したことをArduinoに通知します。このコマンド文字列は、Bluetooth経由でArduinoに送信されます。参考までに、文字列も画面に表示されます。
BluetoothコマンドをArduinoに読み込む
Bluetoothコマンド文字列を読み取るには、HC-05Bluetoothモジュールを接続する必要があります。モジュールを見てください:
<図>鉱山には6本のピンがあります。必要なピンは4つだけです。 VCCは(正の)供給電圧であり、GNDはグランドです。モジュールは6ボルトの供給電圧に耐えます。つまり、arduinoの5ボルトの電源ピンに接続できます。 TXDとRXDはシリアル信号です。線を越えてTXDをarduinoRXD(ピン0)に接続する必要があります。その逆も同様です。 注意: LEVEL:3.3Vと記載されています。これは、RXDができないことを意味します。 5V arduino TXD(ピン1)に直接接続します。 5Vの2/3の出力電圧を生成するには、3つの1 kOhm抵抗を備えた分圧器を構築する必要があります(回路図を参照)。一方、3.3VのTXD信号はArduinoRXDに直接接続できます。 Arduinoは3.3ボルトをHIGHとして認識します。
ピン0と1はArduinoのUSBポートと共有されているため、プログラムをUSB経由でボードにアップロードするときに、ピン0と1からRXD信号とTXD信号を切断する必要があります。ケーブルを外さないとアップロードは機能しません。
次に、HC-05モジュールをAndroidデバイスとペアリングする必要があります。 Bluetoothをオンにします。アプリを起動します。 「Bluetooth接続」を押します。スマートフォンを表示して、HC-05などのデバイスを探します。デバイスを選択します。コードの入力を求められます。 「1234」を押します。ジョイスティック画面に戻ると、緑色で「接続済み」と表示されます。
それでは、コードを見てみましょう:
//シリアルバッファサイズ:1つのコマンドに期待される最大入力サイズに基づいて計算#define INPUT_SIZE 30 void loop(){//シリアルBluetoothから次のコマンドを取得(最後の0に1バイトを追加)char input [ INPUT_SIZE + 1]; //タイプchar(C-string)の配列//改行またはバッファがいっぱいになるまでシリアルを読み取るか、バイトサイズがタイムアウトする=Serial.readBytesUntil( '\ n'、input、INPUT_SIZE); //最後の0を追加して、C文字列を終了しますinput [size] =0; //次の形式の文字列を分割します: "RC、steering、speed、\ n \ 0" char * command =strtok(input、 "、"); //コマンド(RC)//範囲内のRCsteering:-100(左).. 0 .. 100(右)char * RCsteering =strtok(NULL、 "、"); //範囲内のRCspeed:-100(フルスピードリバース).. 0 .. 100(フルスピードフォワード)char * RCspeed =strtok(NULL、 "、"); int iRCsteering =atoi(RCsteering); //文字列を整数に変換しますintiRCspeed =atoi(RCspeed); //文字列を整数に変換します//プログラムの残りの部分}
Androidアプリによって送信された文字列は、特別な文字列構成に読み込まれます。これは、nullで終了するC文字列です。 (0文字は、文字列の最後に到達したことをプログラムに通知します)。これは、関数Serial.readBytesUntil( '\ n'、input、...)を使用して実行されます。この関数は、シリアルインターフェイス(bluetooth)から改行文字( '\ n')を取得するまで読み取ります。そうすれば、 input に完全なコマンドが入るまで、バイトを読み続けます。 :
入力を処理するための非常に効率的な方法 は文字列トークン関数であり、区切り文字としてコンマを使用して文字列を部分に分割します。 strtok()を最初に呼び出すと、「RC」が返されます。次に、コマンドの後続の部分は、NULLをstrtok()に渡すことによって読み取られます。戻り値は RCsteering に保存されます および RCspeed 。これらの変数は、実際には入力の位置へのポインタです。 。関数atoi()は、それらを最終的に整数に変換します。今、私たちは持っています:
もうすぐ終わりです。これらの値をルーチンSetMotorControl()に渡す前に、これらの値に2.55を掛ける必要があります(モーター速度は0..255の範囲であったことに注意してください)。 CODEセクションでプログラムの残りの部分を調べ、回路を構築して、リモート制御されたレゴモデルをテストしてください!
次は何ですか?
レゴモデルを制御するArduinoができたので、そのモデルをロボットプラットフォームとして使用することをお勧めします。いくつかの超音波pingセンサーを追加し、独自の障害物回避ロジックをプログラムして、独自の自動運転ロボット火星ローバーを作成します。または、リモコンにコマンドを追加し、モデルに機能を追加します。しかし、最初に、ArduinoがモデルがBluetooth接続の範囲外に移動したことを把握し、モデルを停止する方法を見つけます。あなたの解決策について教えてください。
すぐに、ブレッドボードのプロトタイピングとケーブルの緩みは、移動モデルには適していません。大きな端子台コネクタを備えたadafruitモーターシールドを入手し、再配線して再プログラムします。これにより、代わりに入力に使用できるデジタル信号も解放されます。センサーの接続を改善するために、センサーシールドを検討することもできます。
既存のプロジェクトについて教えてください!
コード
- Legocar_v3_bluetooth
Legocar_v3_bluetooth Arduino
/ *ブルートゥースで制御されるLegoPowerfunctions車モデルArduinoUnoはモーターとサーボを制御しますMITApp Inventor 2で開発されたandroidアプリでリモート制御回路:*シリアル通信(Unoピン0,1を使用)Bluetoothモジュールが接続されています( USB経由でプログラムをロードするときに切り離されます)*モーター付きL293D(Unoデジタルピン2、5、9を使用)*サーボ付きL293D(Unoデジタルピン6、8、3を使用)* ///使用ライブラリ:#include//シリアルペリフェラルインターフェイスライブラリ#include //関数strtokが含まれています:文字列をトークンに分割します//シリアルバッファサイズ:Bluetoothシリアルインターフェイスで1つのコマンドに期待される最大入力サイズに基づいて計算します#defineINPUT_SIZE 30 / /グローバル定数として定義されたモーター制御デジタル出力ピン(2つのレゴモーターを備えた4輪駆動):const int controlPin1A =2; //ピン番号2のL293Dドライバ入力1Ahttp://www.ti.com/lit/ds/symlink/l293.pdfArduinoデジタル出力ピン2に接続constint controlPin2A =5; // Arduinoデジタル出力ピン5に接続されたピン番号7のL293Dドライバー入力2Aconstint ENablePin =9; // Arduinoデジタル出力ピン9に接続されたピン番号1のL293DENable(1,2)入力//グローバル定数として定義されたサーボ制御デジタル出力ピン(1つのレゴサーボを備えたサーボステアリング):const int controlPin3A =6; // Arduinoデジタル出力ピン6に接続されたピン番号10のL293Dドライバー入力3Aconstint controlPin4A =8; // Arduinoデジタル出力ピン8に接続されたピン番号15のL293Dドライバー入力4Aconst intservoENablePin =3; // Arduinoデジタル出力ピン3 //に接続されたピン番号9のL293DENable(3,4)入力//モーター制御グローバル変数:int motorSpeed =0; //モーター速度0..255intmotorDirection =1; //順方向(1)または逆方向(0)//サーボ制御グローバル変数:intsteering =0; //サーボ位置0..255intsteringDirection =0; //左(0)と右(1)void setup(){Serial.begin(9600); //シリアル通信を初期化しますSerial.setTimeout(1000); // 1000ミリ秒のタイムアウト//デジタル出力ピンを宣言します:pinMode(controlPin1A、OUTPUT); // 1A pinMode(controlPin2A、OUTPUT); // 2A pinMode(ENablePin、OUTPUT); // EN1,2 pinMode(controlPin3A、OUTPUT); // 3A pinMode(controlPin4A、OUTPUT); // 4A pinMode(servoENablePin、OUTPUT); // EN3,4 digitalWrite(ENablePin、LOW); //モーターをオフにしますdigitalWrite(servoENablePin、LOW); //ステアリング中心} void loop(){//シリアルBluetoothから次のコマンドを取得(最後の0に1バイトを追加)char input [INPUT_SIZE + 1]; // nullで終了するchar型(C文字列)の配列(https://www.arduino.cc/en/Reference/String)byte size =Serial.readBytesUntil( '\ n'、input、INPUT_SIZE); //改行またはバッファがいっぱいになるかタイムアウトになるまでシリアルを読み取ります//最後の0を追加してC文字列を終了しますinput [size] =0; //次の形式のC文字列であるコマンドを読み取ります: "RC、RCsteering、RCspeed、\ n \ 0"(改行文字とnullで終了)char * command =strtok(input、 "、"); //今のところコマンドを無視します(リモートコントロールのRCは、当面の間アプリによって送信される唯一のコマンドです)char * RCsteering =strtok(NULL、 "、"); //次は範囲内のRCsteeringです:-100(左).. 0 .. 100(右)char * RCspeed =strtok(NULL、 "、"); //次は次の範囲にあるRCspeedです:-100(フルスピードリバース).. 0 .. 100(フルスピードフォワード)int iRCsteering =atoi(RCsteering); //文字列RCsteeringを整数に変換しますiRCsteeringint iRCspeed =atoi(RCspeed); //文字列RCspeedを整数iRCspeedに変換します//モーターとサーボの制御変数を設定しますif(iRCsteering> 0)steingDirection =1; // iRCsteering =1..100の場合は右に曲がり、それ以外の場合はsteingDirection =0; // iRCsteering =-100..0ステアリング=int(2.55 * abs(iRCsteering));の場合は左に曲がります//コマンド0..100に基づくサーボ位置0..255if(iRCspeed> 0)motorDirection =1; // iRCspeed =1..100の場合は車を前方に設定し、それ以外の場合はmotorDirection =0; // iRCspeed =-100..0 motorSpeed =int(2.55 * abs(iRCspeed));の場合、車を後進に設定します。 //コマンド0..100に基づいて速度0..255を設定しますSetMotorControl(); //モーターの方向と速度を調整します} void SetMotorControl()/ * L293ロジック:EN1,2 1A 2A HHLモーターが左に曲がる(順方向; motorDirection ==1)HLHモーターが右に曲がる(逆方向; motorDirection ==0)EN3,4 3A 4A HHLサーボが左に曲がる(steeringDirection ==0)HLHサーボが右に曲がる(steeringDirection ==1)モーター速度:EN1,2のPWM信号(490 Hz;モーター速度のデジタル出力値0..255)サーボ位置:PWM信号がオンEN3,4(490Hz;位置のデジタル出力値0..255; 0は直進)* / {if(motorDirection ==1)// Forward {digitalWrite(controlPin1A、HIGH); digitalWrite(controlPin2A、LOW); } else //リバース{digitalWrite(controlPin1A、LOW); digitalWrite(controlPin2A、HIGH); } analogWrite(ENablePin、motorSpeed); //速度if(steeringDirection ==0)//左{digitalWrite(controlPin3A、HIGH); digitalWrite(controlPin4A、LOW); } else //右{digitalWrite(controlPin3A、LOW); digitalWrite(controlPin4A、HIGH); } analogWrite(servoENablePin、steering); //サーボ位置}
GithubLego-car-Arduino
ソースコードArduinoが含まれています。フリッツ図; MITアプリの発明者にアップロードするためのソースコードAndroidアプリhttps://github.com/Notthemarsian/Lego-car-Arduino 回路図
GithubLego-car-Arduino
ソースコードArduinoが含まれています。フリッツ図; MITアプリの発明者にアップロードするためのソースコードAndroidアプリhttps://github.com/Notthemarsian/Lego-car-Arduino レゴ%20rc%20car%20v2.fzz製造プロセス