ラズベリーモーターシールドを使用したAndroid制御玩具
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
| |||
| ||||
|
このプロジェクトについて
プロジェクトの最後に、Androidデバイスのアクセラレータセンサーによって制御される地形車両を管理します
このプロジェクトには、モーターシールド、ラズベリーパイ、arduino、およびDCモーターデバイスが含まれています。
ステップ1
まず、ラズベリーパイとarduinoの間にI2Cバスを作成する必要があります。ここからI2Cを選択した理由がわかります。
以下に示すように、I2Cとモーターシールドプロセスの両方を含む必要なコードを見つけることができます。
#include #define MyAddress 0x40#include AF_DCMotor motorhiz(3); AF_DCMotor motoryon(4); byte DataToBeSend [1]; byte ReceivedData; int counter =0; void setup(){Serial.begin(9600 ); / * I2Cスレーブを初期化し、コールバック関数 'onReceive'を 'I2CReceived'に割り当てます* / Wire.begin(MyAddress); Wire.onReceive(I2CReceived); Wire.onRequest(I2CRequest); motorhiz.setSpeed(254); motorhiz.run(RELEASE); motoryon.setSpeed(254); motoryon.run(RELEASE);} void loop(){/ * DataToBeSendを毎秒インクリメントし、0から99の範囲であることを確認します* / // DataToBeSend [0] =(DataToBeSend [0]> =99)? 0:DataToBeSend [0] + 1;} / *この関数は、RPi2がこのI2Cスレーブにデータを送信するときに自動的に呼び出されます* / void I2CReceived(int NumberOfBytes){// counter ++; // String counterStr =String(counter); //Serial.println("ReceivedData: "+ counterStr); / * WinIoTはデータバイトを送信しました。読む* / ReceivedData =Wire.read(); int ReceivedDataInt =(int)ReceivedData; String ReceivedDataStr =String(ReceivedData); Serial.println(ReceivedDataInt); if(ReceivedDataInt> =100)//XDatası{Serial.println( "DataX:" + ReceivedDataStr); if(ReceivedDataInt> 145 &&ReceivedDataInt <154){Serial.println( "RELEASE"); motorhiz.run(RELEASE); } else if(ReceivedDataInt> =100 &&ReceivedDataInt <104){Serial.println( "RELEASE"); motorhiz.run(RELEASE); } else if(ReceivedDataInt> =155){ReceivedDataInt =ReceivedDataInt -155; int motorSpeed =(ReceivedDataInt * 10)+50; if(motorSpeed> 254){motorSpeed =254; } motorhiz.setSpeed(motorSpeed); motorhiz.run(BACKWARD);文字列motorSpeedStr =String(motorSpeed); Serial.println( "MotorHiz:" + motorSpeedStr); } else if(ReceivedDataInt> =105){ReceivedDataInt =ReceivedDataInt -105; int motorSpeed =(ReceivedDataInt * 10)+50; if(motorSpeed> 254){motorSpeed =254; } motorhiz.setSpeed(motorSpeed); motorhiz.run(FORWARD);文字列motorSpeedStr =String(motorSpeed); Serial.println( "MotorHiz:" + motorSpeedStr); }} else //YDatası{Serial.println( "DataX:" + ReceivedDataStr); if(ReceivedDataInt> 45 &&ReceivedDataInt <54){Serial.println( "RELEASE"); motoryon.run(RELEASE); } else if(ReceivedDataInt> =0 &&ReceivedDataInt <4){Serial.println( "RELEASE"); motoryon.run(RELEASE); } else if(ReceivedDataInt> =55){ReceivedDataInt =ReceivedDataInt -55; int motorSpeed =(ReceivedDataInt * 12)+50; if(motorSpeed> 254){motorSpeed =254; } motoryon.setSpeed(motorSpeed); motoryon.run(BACKWARD);文字列motorSpeedStr =String(motorSpeed); Serial.println( "MotorHiz:" + motorSpeedStr); } else if(ReceivedDataInt> =5){ReceivedDataInt =ReceivedDataInt -5; int motorSpeed =(ReceivedDataInt * 12)+50; if(motorSpeed> 254){motorSpeed =254; } motoryon.setSpeed(motorSpeed); motoryon.run(FORWARD);文字列motorSpeedStr =String(motorSpeed); Serial.println( "MotorHiz:" + motorSpeedStr); }}} / *この関数は、RPi2がこのI2Cスレーブからのデータを要求したときに自動的に呼び出されます* / void I2CRequest(){// Serial.println( "DataToBeSend"); / * WinIoTにデータを送信します* / //Wire.write(DataToBeSend,1);}
<図> 上記の写真のarduinoとラズベリーパイの間の通信のためのI2Cのピンスキーマ。 arduinoには外部電源を使用する必要はありません。 ArduinoはラズベリーパイのVoutピンから電力を取得します。
ステップ2
以下に示すように、I2Cを介してarduinoにデータを送信するラズベリーパイ(Webサーバーとして機能)に必要なコード。
コードはページの最後のコードを見つけることができます(コードセクション)。
ステップ3
ajaxリクエストを使用して加速度センサーのデータをウェブサーバーに送信するVisualStudio CordovaAndroidアプリケーションを開発しています。
コードはページの最後のコードを見つけることができます(コードセクション)。
簡単に
1-)Androidアプリケーションは、センサーデータ(Androidフォンの加速度計データ)をラズベリーパイで実行されるWebサーバーに送信します。
2-)WebサーバーはI2Cを使用してデータをarduinoに送信します(raspberry piはAndroidフォンの加速度センサーからデータを取得します)。
3-)Arduinoはデータを処理し、モーターシールドを使用してモーターを実行します。
コード
- Wiri.hI2C通信およびモトシールドAndroidコード
- Androidリモコン
- Windows IOTWebサーバー
Wiri.hI2C通信およびモトシールドAndroidコード Arduino
arduinoとラズベリーpiarduinoコード間のI2C通信。これは、最小の入出力ソースを持つ2つのデバイスのシリアル通信用です。#include#define MyAddress 0x40#include AF_DCMotor motorhiz(3); AF_DCMotor motoryon(4); byte DataToBeSend [ 1]; byte ReceivedData; int counter =0; void setup(){Serial.begin(9600); / * I2Cスレーブを初期化し、コールバック関数 'onReceive'を 'I2CReceived'に割り当てます* / Wire.begin(MyAddress); Wire.onReceive(I2CReceived); Wire.onRequest(I2CRequest); motorhiz.setSpeed(254); motorhiz.run(RELEASE); motoryon.setSpeed(254); motoryon.run(RELEASE);} void loop(){/ * DataToBeSendを毎秒インクリメントし、0から99の範囲であることを確認します* / // DataToBeSend [0] =(DataToBeSend [0]> =99)? 0:DataToBeSend [0] + 1;} / *この関数は、RPi2がこのI2Cスレーブにデータを送信するときに自動的に呼び出されます* / void I2CReceived(int NumberOfBytes){// counter ++; // String counterStr =String(counter); //Serial.println("ReceivedData: "+ counterStr); / * WinIoTはデータバイトを送信しました。読む* / ReceivedData =Wire.read(); int ReceivedDataInt =(int)ReceivedData; String ReceivedDataStr =String(ReceivedData); Serial.println(ReceivedDataInt); if(ReceivedDataInt> =100)//XDatası{Serial.println( "DataX:" + ReceivedDataStr); if(ReceivedDataInt> 145 &&ReceivedDataInt <154){Serial.println( "RELEASE"); motorhiz.run(RELEASE); } else if(ReceivedDataInt> =100 &&ReceivedDataInt <104){Serial.println( "RELEASE"); motorhiz.run(RELEASE); } else if(ReceivedDataInt> =155){ReceivedDataInt =ReceivedDataInt -155; int motorSpeed =(ReceivedDataInt * 10)+50; if(motorSpeed> 254){motorSpeed =254; } motorhiz.setSpeed(motorSpeed); motorhiz.run(BACKWARD);文字列motorSpeedStr =String(motorSpeed); Serial.println( "MotorHiz:" + motorSpeedStr); } else if(ReceivedDataInt> =105){ReceivedDataInt =ReceivedDataInt -105; int motorSpeed =(ReceivedDataInt * 10)+50; if(motorSpeed> 254){motorSpeed =254; } motorhiz.setSpeed(motorSpeed); motorhiz.run(FORWARD);文字列motorSpeedStr =String(motorSpeed); Serial.println( "MotorHiz:" + motorSpeedStr); }} else //YDatası{Serial.println( "DataX:" + ReceivedDataStr); if(ReceivedDataInt> 45 &&ReceivedDataInt <54){Serial.println( "RELEASE"); motoryon.run(RELEASE); } else if(ReceivedDataInt> =0 &&ReceivedDataInt <4){Serial.println( "RELEASE"); motoryon.run(RELEASE); } else if(ReceivedDataInt> =55){ReceivedDataInt =ReceivedDataInt -55; int motorSpeed =(ReceivedDataInt * 12)+50; if(motorSpeed> 254){motorSpeed =254; } motoryon.setSpeed(motorSpeed); motoryon.run(BACKWARD);文字列motorSpeedStr =String(motorSpeed); Serial.println( "MotorHiz:" + motorSpeedStr); } else if(ReceivedDataInt> =5){ReceivedDataInt =ReceivedDataInt -5; int motorSpeed =(ReceivedDataInt * 12)+50; if(motorSpeed> 254){motorSpeed =254; } motoryon.setSpeed(motorSpeed); motoryon.run(FORWARD);文字列motorSpeedStr =String(motorSpeed); Serial.println( "MotorHiz:" + motorSpeedStr); }}} / *この関数は、RPi2がこのI2Cスレーブからのデータを要求したときに自動的に呼び出されます* / void I2CRequest(){// Serial.println( "DataToBeSend"); / * WinIoTにデータを送信します* / //Wire.write(DataToBeSend,1);}
Androidリモコン C#
Androidリモートコントローラープレビューなし(ダウンロードのみ)。
Windows IOTWebサーバー C#
Windows IOT Webサーバープレビューなし(ダウンロードのみ)。
カスタムパーツとエンクロージャー
Arduinoからラズベリーピンの図 回路図
詳細については、https://www.hackster.io/AnuragVasanwala/home-automation-0dcefcをご覧ください。 製造プロセス
- RaspberryPiを使用したモーションセンサー
- ラズベリーパイとブリッジシールドを使用したロボット
- Bluetoothで制御されるRaspberryPi Robot
- ArduinoとRaspberryPiを使用してインターネット制御のビデオストリーミングロボットを構築する
- RaspberryPiを使用したジェスチャー制御ロボット
- ANDROID SMARTPHONEから制御されるRASPBERRYPI WIFI ROBOT
- RaspberryPiを使用したWifi制御ロボット
- ArduinoUnoを使用した人間検出ロボティクスシステム
- Arduino Spybot
- Arduino、1Sheeld、Androidを使用したユニバーサルリモコン
- RaspberryPiを介したAlexa制御LED