ジョイスティック制御のRCカー
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
このプロジェクトについて
1.車に乗ってください!
まず、古いRCカーが必要です。幸いなことに、私はモンスタートラックを見つけました。これは非常に興味深いものになる可能性があります!
2つのモーターを制御するためのケーブルを除くすべての電子機器を取り外します。
<図>
2.Arduinoとシールド
Arduinoボード(私はArduino UNOを選択しました)を取り、USBホストシールドを接続します。
<図>
3.Arduinoを車に取り付けます
ArduinoUNOとUSBHostシールドの上にシールドを差し込み、車にねじ込みます。古い電子回路用の穴の1つを使用しました。
<図>
4.回路を作る
ブレッドボードで作成しましたが、パフォーマンスボードで作成することもできます。基本的に、回路は2つのドライバ(L293DまたはSN754410)と2つの電圧安定器で構成されています。電圧安定器は、バッテリーからの電圧を制限するために使用されます。実際、最大電圧を15〜18 Vにして、RCカーで遊ぶ時間を増やすために、10〜12本のAA1.5V電池を使用することをお勧めします。モーターには大量の電流が必要なため、車を静止位置(約2A)から動かすには、78S12のような強力な電圧安定器が必要です。
ドライバーの動作について詳しく知りたい場合は、こちらをご覧ください!
<図>
5.回路を車に取り付けます
あなたがサーキットを置くことができたなら、RCカーの空いている場所を見つけてください。私が持っているモンスタートラックには、たくさんのスペースがあります。配置したら、回路を2つのモーターに接続します。最後に、ワイヤレスレシーバーをUSBホストシールドに接続します。
<図>
6.コード
このコードは、Circuits @homeのKristianLauszusによってGitHubでホストされているUSBHost Library2.0の例に基づいています
USB_Host_Shield_2.0 / * Xbox WirelessReciverライブラリのスケッチ例-KristianLauszusが開発ワイヤレスで最大4つのコントローラーをサポート詳細については、ブログ投稿を参照してください:http://blog.tkjelectronics.dk/2012/12 / xbox-360-receiver-added-to-the-usb-host-library /または電子メールを送ってください:[email protected] * /#include // IDEを満足させてください。 inoのインクルードステートメント。#ifdef dobogusinclude#include #endifUSB Usb; XBOXRECV Xbox(&Usb); #define motorPinOne 5 //選択したピンにはPWMが必要PWM#define motor2PinOne 4 #define motor2PinTwo 7#define BRAKE 2 / *モーターの回転速度を定義します。 0から255の間でなければなりません。* / intパルス=0; intフォワード=0; intブレーキオン=0; void setup(){TCCR1B =TCCR1B&0b11111000 | 0x02; Serial.begin(115200); if(Usb.Init()==-1){Serial.print(F( "\ r \ nOSCが開始しませんでした")); while(1); // motors_stop();を停止します中心(); } Serial.print(F( "\ r \ nXboxワイヤレスレシーバーライブラリが開始されました")); pinMode(motorPinOne、OUTPUT); pinMode(motorPinTwo、OUTPUT); pinMode(motor2PinOne、OUTPUT); pinMode(motor2PinTwo、OUTPUT); pinMode(BRAKE、OUTPUT); digitalWrite(BRAKE、LOW);} void loop(){Usb.Task(); if(Xbox.XboxReceiverConnected){for(uint8_t i =0; i <4; i ++){if(Xbox.getButtonPress(L2、i)){Serial.print( "L2:"); Serial.print(Xbox.getButtonPress(L2、i));パルス=Xbox.getButtonPress(L2、i);フォワード=0;時計回り(); } if(Xbox.getButtonPress(R2、i)){Serial.print( "R2:"); Serial.println(Xbox.getButtonPress(R2、i));パルス=Xbox.getButtonPress(R2、i);フォワード=1; counterClockwise(); } if(Xbox.getAnalogHat(LeftHatX、i)> 7500 || Xbox.getAnalogHat(LeftHatX、i)<-7500 || Xbox.getAnalogHat(LeftHatY、i)> 7500 || Xbox.getAnalogHat(LeftHatY、i)<- 7500 || Xbox.getAnalogHat(RightHatX、i)> 7500 || Xbox.getAnalogHat(RightHatX、i)<-7500 || Xbox.getAnalogHat(RightHatY、i)> 7500 || Xbox.getAnalogHat(RightHatY、i)<- 7500){if(Xbox.getAnalogHat(LeftHatX、i)> 7500){Serial.print(F( "LeftHatX:")); Serial.print(Xbox.getAnalogHat(LeftHatX、i)); Serial.print( "\ t"); if(Xbox.getAnalogHat(LeftHatX、i)> 26000)turn_right(); else center(); } if(Xbox.getAnalogHat(LeftHatX、i)<-7500){Serial.print(F( "LeftHatX:")); Serial.print(Xbox.getAnalogHat(LeftHatX、i)); Serial.print( "\ t"); if(Xbox.getAnalogHat(LeftHatX、i)<-26000)turn_left(); else center(); } if(Xbox.getAnalogHat(LeftHatY、i)> 7500 || Xbox.getAnalogHat(LeftHatY、i)<-7500){Serial.print(F( "LeftHatY:")); Serial.print(Xbox.getAnalogHat(LeftHatY、i)); Serial.print( "\ t"); } if(Xbox.getAnalogHat(RightHatX、i)> 7500){Serial.print(F( "RightHatX:")); Serial.print(Xbox.getAnalogHat(RightHatX、i)); Serial.print( "\ t"); } if(Xbox.getAnalogHat(RightHatX、i)<-7500){Serial.print(F( "RightHatX:")); Serial.print(Xbox.getAnalogHat(RightHatX、i)); Serial.print( "\ t"); } if(Xbox.getAnalogHat(RightHatY、i)> 7500 || Xbox.getAnalogHat(RightHatY、i)<-7500){Serial.print(F( "RightHatY:")); Serial.print(Xbox.getAnalogHat(RightHatY、i)); } Serial.println(); } if(Xbox.getButtonClick(UP、i)){Serial.println(F( "Up")); } if(Xbox.getButtonClick(DOWN、i)){Serial.println(F( "Down")); } if(Xbox.getButtonClick(LEFT、i)){Serial.println(F( "Left")); } if(Xbox.getButtonClick(RIGHT、i)){Serial.println(F( "Right")); } if(Xbox.getButtonClick(START、i)){Serial.println(F( "Start")); } if(Xbox.getButtonClick(BACK、i)){Serial.println(F( "Back")); } if(Xbox.getButtonClick(L3、i))Serial.println(F( "L3")); if(Xbox.getButtonClick(R3、i))Serial.println(F( "R3")); if(Xbox.getButtonClick(L1、i))Serial.println(F( "L1")); if(Xbox.getButtonClick(R1、i))Serial.println(F( "R1")); if(Xbox.getButtonClick(XBOX、i)){Xbox.setLedMode(ROTATING、i); Serial.println(F( "Xbox")); } if(Xbox.getButtonClick(A、i)){Serial.println(F( "A")); } if(Xbox.getButtonClick(B、i)){Serial.println(F( "B")); digitalWrite(BRAKE、HIGH); broken_on =1;パルス=100; if(前方)clockly();そうでなければcounterClockwise(); } if(Xbox.getButtonClick(X、i))Serial.println(F( "X")); if(Xbox.getButtonClick(Y、i)){Serial.println(F( "Y")); motors_stop(); }}} delay(1);} void clockly(){Serial.print( "回転は時計回りで速度は"); Serial.println(pulse); analogWrite(motorPinOne、pulse); // Hブリッジのレッグ1を低く設定しますanalogWrite(motorPinTwo、0); if(brake_on){delay(600); digitalWrite(BRAKE、LOW);ブレーキオン=0;パルス=0; }} void counterClockwise(){Serial.print( "回転は反時計回りで、速度は"); Serial.println(pulse); analogWrite(motorPinOne、0); // Hブリッジのレッグ1を低く設定しますanalogWrite(motorPinTwo、pulse); if(brake_on){delay(600); digitalWrite(BRAKE、LOW);ブレーキオン=0;パルス=0; }} void turn_left(){digitalWrite(motor2PinOne、HIGH); // Hブリッジのレッグ1を低く設定しますdigitalWrite(motor2PinTwo、LOW);} void turn_right(){digitalWrite(motor2PinOne、LOW); // Hブリッジのレッグ1を低く設定しますdigitalWrite(motor2PinTwo、HIGH);} void motors_stop(){analogWrite(motorPinOne、0); analogWrite(motorPinTwo、0);パルス=0;} void center(){digitalWrite(motor2PinOne、LOW); digitalWrite(motor2PinTwo、LOW);}
コード
- コードスニペット#1
コードスニペット#1 Arduino
/ * Xbox WirelessReciverライブラリのスケッチ例-KristianLauszusによって開発されました。ワイヤレスで最大4つのコントローラーをサポートします。詳細については、ブログ投稿を参照してください:http://blog.tkjelectronics.dk/2012/12/xbox-360 -receiver-added-to-the-usb-host-library /または電子メールを送ってください:[email protected] * /#include//インクルードステートメントを確認するだけでよいIDEを満足させるino。#ifdef dobogusinclude#include #endifUSB Usb; XBOXRECV Xbox(&Usb); #define motorPinOne 5 //選択したピンにはPWM#define motorPinTwo 6 //選択したピンにはPWM#defineが必要motor2PinOne 4 #define motor2PinTwo 7#define BRAKE 2 / *モーターの回転速度を定義します。 0から255の間でなければなりません。* / intパルス=0; intフォワード=0; intブレーキオン=0; void setup(){TCCR1B =TCCR1B&0b11111000 | 0x02; Serial.begin(115200); if(Usb.Init()==-1){Serial.print(F( "\ r \ nOSCが開始しませんでした")); while(1); // motors_stop();を停止します中心(); } Serial.print(F( "\ r \ nXboxワイヤレスレシーバーライブラリが開始されました")); pinMode(motorPinOne、OUTPUT); pinMode(motorPinTwo、OUTPUT); pinMode(motor2PinOne、OUTPUT); pinMode(motor2PinTwo、OUTPUT); pinMode(BRAKE、OUTPUT); digitalWrite(BRAKE、LOW);} void loop(){Usb.Task(); if(Xbox.XboxReceiverConnected){for(uint8_t i =0; i <4; i ++){if(Xbox.getButtonPress(L2、i)){Serial.print( "L2:"); Serial.print(Xbox.getButtonPress(L2、i));パルス=Xbox.getButtonPress(L2、i);フォワード=0;時計回り(); } if(Xbox.getButtonPress(R2、i)){Serial.print( "R2:"); Serial.println(Xbox.getButtonPress(R2、i));パルス=Xbox.getButtonPress(R2、i);フォワード=1; counterClockwise(); } if(Xbox.getAnalogHat(LeftHatX、i)> 7500 || Xbox.getAnalogHat(LeftHatX、i)<-7500 || Xbox.getAnalogHat(LeftHatY、i)> 7500 || Xbox.getAnalogHat(LeftHatY、i)<- 7500 || Xbox.getAnalogHat(RightHatX、i)> 7500 || Xbox.getAnalogHat(RightHatX、i)<-7500 || Xbox.getAnalogHat(RightHatY、i)> 7500 || Xbox.getAnalogHat(RightHatY、i)<- 7500){if(Xbox.getAnalogHat(LeftHatX、i)> 7500){Serial.print(F( "LeftHatX:")); Serial.print(Xbox.getAnalogHat(LeftHatX、i)); Serial.print( "\ t"); if(Xbox.getAnalogHat(LeftHatX、i)> 26000)turn_right(); else center(); } if(Xbox.getAnalogHat(LeftHatX、i)<-7500){Serial.print(F( "LeftHatX:")); Serial.print(Xbox.getAnalogHat(LeftHatX、i)); Serial.print( "\ t"); if(Xbox.getAnalogHat(LeftHatX、i)<-26000)turn_left(); else center(); } if(Xbox.getAnalogHat(LeftHatY、i)> 7500 || Xbox.getAnalogHat(LeftHatY、i)<-7500){Serial.print(F( "LeftHatY:")); Serial.print(Xbox.getAnalogHat(LeftHatY、i)); Serial.print( "\ t"); } if(Xbox.getAnalogHat(RightHatX、i)> 7500){Serial.print(F( "RightHatX:")); Serial.print(Xbox.getAnalogHat(RightHatX、i)); Serial.print( "\ t"); } if(Xbox.getAnalogHat(RightHatX、i)<-7500){Serial.print(F( "RightHatX:")); Serial.print(Xbox.getAnalogHat(RightHatX、i)); Serial.print( "\ t"); } if(Xbox.getAnalogHat(RightHatY、i)> 7500 || Xbox.getAnalogHat(RightHatY、i)<-7500){Serial.print(F( "RightHatY:")); Serial.print(Xbox.getAnalogHat(RightHatY、i)); } Serial.println(); } if(Xbox.getButtonClick(UP、i)){Serial.println(F( "Up")); } if(Xbox.getButtonClick(DOWN、i)){Serial.println(F( "Down")); } if(Xbox.getButtonClick(LEFT、i)){Serial.println(F( "Left")); } if(Xbox.getButtonClick(RIGHT、i)){Serial.println(F( "Right")); } if(Xbox.getButtonClick(START、i)){Serial.println(F( "Start")); } if(Xbox.getButtonClick(BACK、i)){Serial.println(F( "Back")); } if(Xbox.getButtonClick(L3、i))Serial.println(F( "L3")); if(Xbox.getButtonClick(R3、i))Serial.println(F( "R3")); if(Xbox.getButtonClick(L1、i))Serial.println(F( "L1")); if(Xbox.getButtonClick(R1、i))Serial.println(F( "R1")); if(Xbox.getButtonClick(XBOX、i)){Xbox.setLedMode(ROTATING、i); Serial.println(F( "Xbox")); } if(Xbox.getButtonClick(A、i)){Serial.println(F( "A")); } if(Xbox.getButtonClick(B、i)){Serial.println(F( "B")); digitalWrite(BRAKE、HIGH); broken_on =1;パルス=100; if(前方)clockly();そうでなければcounterClockwise(); } if(Xbox.getButtonClick(X、i))Serial.println(F( "X")); if(Xbox.getButtonClick(Y、i)){Serial.println(F( "Y")); motors_stop(); }}} delay(1);} void clockly(){Serial.print( "回転は時計回りで速度は"); Serial.println(pulse); analogWrite(motorPinOne、pulse); // Hブリッジのレッグ1を低く設定しますanalogWrite(motorPinTwo、0); if(brake_on){delay(600); digitalWrite(BRAKE、LOW);ブレーキオン=0;パルス=0; }} void counterClockwise(){Serial.print( "回転は反時計回りで、速度は"); Serial.println(pulse); analogWrite(motorPinOne、0); // Hブリッジのレッグ1を低く設定しますanalogWrite(motorPinTwo、pulse); if(brake_on){delay(600); digitalWrite(BRAKE、LOW);ブレーキオン=0;パルス=0; }} void turn_left(){digitalWrite(motor2PinOne、HIGH); // Hブリッジのレッグ1を低く設定しますdigitalWrite(motor2PinTwo、LOW);} void turn_right(){digitalWrite(motor2PinOne、LOW); // Hブリッジのレッグ1を低く設定しますdigitalWrite(motor2PinTwo、HIGH);} void motors_stop(){analogWrite(motorPinOne、0); analogWrite(motorPinTwo、0); pulse =0;} void center(){digitalWrite(motor2PinOne、LOW); digitalWrite(motor2PinTwo、LOW);}
Github
https://github.com/felis/USB_Host_Shield_2.0https://github.com/felis/USB_Host_Shield_2.0製造プロセス