工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ArduinoとBitVoicerサーバーを備えた2WD音声制御ロボット

コンポーネントと消耗品

>
Arduino UNO
× 1
Pololu DualMC33926モータードライバーシールド
× 1
SparkFunXBeeシールド
× 1
MicrochipRN171VXモジュール
× 1
SparkFunElectretマイクブレイクアウト
× 1
2WDロボットカーシャーシ
× 1
>
Texas Instruments LM1117(TO-220)電圧レギュレーター
× 1
コンデンサ10µF
× 1
LED(汎用)
× 4
抵抗330オーム
× 4
単三電池
× 4
9Vバッテリー(汎用)
× 1
9Vからバレルジャックへのアダプター
× 1
ジャンパー線(汎用)
× 17
通常の銅線
× 1
固定用のネジと柔軟なプラスチッククランプ
× 1

必要なツールとマシン

>
はんだごて(汎用)
ペンチ
ドライバー

アプリとオンラインサービス

BitVoicer Server 1.0

このプロジェクトについて

このチュートリアルでは、2WD音声制御ロボットの構築方法を紹介します。私はロボットを動かすためにDCモーターのみを制御していますが、同じアプローチをステッピングモーターとサーボモーターの音声制御に使用できるため、機械的な動きを実行する音声制御ロボットの構築を計画している場合、このチュートリアルは次のように役立ちます。プロジェクトのリファレンス。

<図>

このロボットを構築するには、基本的に2輪シャーシ1つ、Arduinoボード1つ、DCモータードライバーシールド1つ、BitVoicerサーバーライセンス1つ、WiFiモジュール1つ、プリアンプマイク1つが必要です。コンポーネントに関しては、市場には多種多様なものがあり、さまざまな組み合わせを使用して同じ結果を得ることができます。ステップ1では、ロボットで使用されるいくつかのコンポーネントについていくつか詳しく説明します。そのため、それらのいくつかを変更する必要がある場合は、同様の機能を持つコンポーネントを探してください。

音声コマンドをロボットの動きに変換するには、次の手順を実行します。

  • 1。音声波は、Sparkfun ElectretBreakoutボードによってキャプチャおよび増幅されます。
  • 2。増幅された信号は、アナログ-デジタルコンバーター(ADC)を使用してArduinoでデジタル化およびバッファリングされます。
  • 3。オーディオサンプルは、MicrochipWiFiモジュールを使用してBitVoicerサーバーにストリーミングされます。
  • 4。 BitVoicerサーバーはオーディオストリームを処理し、そこに含まれる音声を認識します。
  • 5。認識された音声は、Arduinoに送信される事前定義されたコマンドにマッピングされます;
  • 6。 Arduinoはコマンドを識別し、どのDCモーターをどのくらいの時間、どの速度で使用するかを定義します。
  • 7。モータードライバーがアクティブになり、モーターを動かすために必要な電圧と電流が供給されます。

資料のリスト:

  • Arduino UNO:〜U $ 25.00
  • Pololu Dual MC33926モータードライバーシールド:US 29.95
  • SparkFun XBeeシールド:U $ 14.95
  • アンテナ付きマイクロチップRN171VXモジュール:34.95米ドル
  • SparkFun Electretマイクブレイクアウト:7.95米ドル
  • BitVoicer Server 1.0:U $ 8.90
  • 2WDロボットカーシャーシ:15.95米ドル
  • Texas Instruments LM1117(TO-220)電圧レギュレーター:〜U $ 1.95
  • 10μF電解コンデンサ:〜U $ 0.35
  • 4 x LED:〜US 1.00
  • 4 x 330オーム抵抗器:〜U $ 0.75
  • 4 x 1.5V単三電池:〜US 2.00
  • 9Vバッテリー:〜US 2.00
  • 9V-バレルジャックアダプター:〜US 2.50
  • ジャンパー線と通常の線:〜U $ 2.00
  • 固定用のネジと柔軟なプラスチッククランプ
  • はんだごてとはんだ

ステップ1:コンポーネントを理解する

このステップでは、ロボットのコンポーネントと、それらを取り付けるための準備方法に関するいくつかの重要な情報を提供します。

そもそも、ロボットの心臓部であるArduino UNOR3です。私はArduinoUNOを使用していますが、他のArduinoボードを使用してロボットをマウントできます。 Arduino UNOは、これまでで最も人気のあるArduinoボードであり、より多くの人がこのロボットを再構築できるため、ArduinoUNOを使用することにしました。 Arduino DUEを使用している場合は、このチュートリアルで行ったように、ロボットに音声応答を追加することもできます。

DCモーターを動かすために、私はこのPololuシールドを使用しました。これは、5〜28VのDCモーターを制御し、モーターごとに最大3Aの連続電流を供給することができるデュアルモータードライバーです。これは非常に優れたシールドだと思いますが、Pololuの製品で最も印象に残ったのは、明確で詳細なドキュメントです。さらに、Pololuは、モーターの制御を非常に簡単にするArduinoライブラリを提供します。速度と方向(負または正の値)を setSpeeds に渡すだけです。 関数。別のDCモータードライバーを使用する場合は、ドライバーが使用するピンに注意してください。ロボットが使用する他のピンと競合することはありません。 Pololuシールドは次のArduinoピンを使用します:デジタル4、7、8、9、10および12。アナロジック0および1;接地;および5V。ここで最も重要な点は、ピン9と10のみがPWMピンとして使用され、これらのピンでパルスを生成するために使用されるタイマーは、BitSophiaのBVSMicクラスで使用されるタイマー(UNOのタイマー2)とは異なることです。

> <図>

サーバーとの通信を確立し、BitVoicerサーバーサービスにアクセスするには、Microchip WiFiRN171VXモジュールを使用します。このモジュールでは、2つの主な機能が際立っています。すべての通信は、シリアルポートを介して簡単に実行できます。モジュールのフォームファクタは、一般的なXBeeモジュールのほとんどと同じです。つまり、すでにXBeeシールドをお持ちの場合は、このロボットで使用しているSparkfunシールドを購入する必要はほとんどありません。

XBeeシールドをMicrochipWiFiモジュールと一緒に使用すると、ロボットの取り付けが非常に簡単になりました。しかし、私はこの組み合わせの問題を特定しました。ラジオの操作は非常に複雑で、「ブードゥーの魔法」と見なされる人もいることが知られています。さて、WiFiアダプターがオンになっていてデータを送信しているときに、ArduinoADCによって測定されたオーディオ信号に強い干渉が発生することに気づきました。この干渉の原因を正確に特定することはできませんでしたが、考えられる原因は2つあります。モジュールのピーク電流引き込み(最大240mA)が適切に分離されておらず、ArduinoADCに供給される基準電圧が低下しています。または、アンテナから放射された信号が、モジュールのすぐ下にある露出したピンによって拾われています。通常、WiFiモジュールの製造元は、この種の問題を防ぐために、アンテナの近くに何か(グランドプレーンでさえ)を正確に配置しないように設計者に指示しています。

上記の問題を修正するために、3.3V電圧レギュレーターと1つの10μF電解コンデンサーをSparkfunシールドにはんだ付けして、ArduinoADCに基準電圧を供給できるようにしました。同じ電源がSparkfunエレクトレットマイクで使用されています。 BitVoicerサーバーマネージャーで見られたピークボリュームの問題を解決しました。沈黙期間中であっても、サーバーモニターのオーディオレベルは35(0-100)に達していました。プロジェクトで同じことが起こっているのを見つけたら、ArduinoADCによって測定されたオーディオ信号で何が起こっているのかを調べてください。

また、Sparkfunシールドで利用可能なプロトタイピングスペースを使用して、BitVoicerサーバーの一部の機能のステータスを示すいくつかのLEDをはんだ付けすることにしました。下の写真では、左から右に、次の情報がLEDによって公開されています。

  • BitVoicerサーバーが実行されているかどうか、および/または接続がアクティブなままであるかどうかを示します。
  • データ転送サービスが実行されているかどうかを示します。
  • 音声認識エンジンがArduinoに割り当てられているかどうかを示します。
  • アクティブ化ワードアクティブ化期間にあるかどうかを示します。このLEDは、アクティベーションワードが識別された場合にのみ点灯します。
<図> <図>

事前増幅されたエレクトレットマイクに関しては、Sparkfun、Adafruit、RoboCore、Hackerstore、そしておそらく他の多くのオプションが市場に出回っています。このチュートリアルに投稿しているコードを使用するには、購入するマイクがアナログであり、必要な電圧がArduinoボードで利用可能であり、Arduino ADCの増幅が十分に高い(通常はエレクトレットマイクの場合は100倍)ことを確認してください。

ロボットで使用される2WDシャーシは、eBayで最も安価で最も人気のあるものの1つです。キット一式には、アクリル製プラットフォーム1つ、プラスチック/ゴム製ホイール2つ、360°ホイール1つ、ギア付きDCモーター2つ(1:48比)、4xAAバッテリーホルダー1つ、スピードエンコーダーディスク2つ、ネジ一式が含まれています。

ステップ2:取り付け

仕事に取り掛かりましょう!この手順では、下の図に示すように、すべてのコンポーネントをシャーシに取り付ける必要があります。

<図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図>

XBeeシールドにLEDと電圧レギュレーターをはんだ付けしたくない場合は、下の図に示すように、小さなブレッドボードに取り付けることができます。この場合、それ以上問題なくシャーシのどこかに固定できるように、縮小サイズのブレッドボードを選択してください。

<図>

上の写真では、マイクを保持するために鉄線のサポートを作成したことがわかります。また、360度のホイールの周りにフェルト生地のストリップを接着したこともわかります。ロボットが動いているときにマイクから発生するノイズを低減するために、この2つの対策を講じました。マイクのワイヤーをサポートから分離するために、スポンジの小片をカットしました。もちろん、100%効果的ではありませんでしたが、ノイズが少し減少し、音声認識の精度が向上しました。

ステップ3:WiFiモジュールのセットアップ

ステップ1で述べたように、Microchip RN171VXWiFiモジュールはシリアルポートを介して完全に操作できます。これにより、すべてのコマンドがArduinoシリアルポートを介して送信される単純な文字列であるため、モジュールのセットアップが非常に簡単になります。コマンドモードに入るには「$$$」を含む文字列を送信し、コマンドを送信してから「exit」を含む文字列を送信するだけでデータモードに戻ります。

WiFiモジュールのセットアップという名前のコード このチュートリアルの下部には、ホームネットワークでWiFiモジュールを設定するために使用したコードがあります。 「XXXXXX」とマークされたコードの部分をWiFiネットワークからの情報で変更する必要があります。 3つのコマンドを変更する必要があります:

  • set wlan ssid XXXXXX :XXXXXXをネットワーク名(SSID)に置き換えます。
  • 無線LANフレーズXXXXXXを設定 :XXXXXXをネットワークパスワードに置き換えます;
  • IPアドレスXXXXXXを設定 :XXXXXXをWiFiモジュールに設定するIPアドレス(静的)に置き換えます。

私のWiFiネットワークでは、認証方法はWPA2-PSKです。ネットワークで別の認証方法を使用している場合は、 set wlan auth も変更する必要があります 指図。 WiFiモジュールのドキュメント(セクション4.3コマンドの設定)をチェックして、ネットワークに適した値を見つけてください。

重要があります Sparkfunシールドとその小さなスイッチの詳細(下の写真)。 USBインターフェースを使用してArduinoにコードをアップロードするには、スイッチをDLINEの位置に設定する必要があります。 Arduinoがシリアルポートを使用してWiFiモジュールを介してデータを送受信するには、スイッチをUARTの位置に設定する必要があります。これが必要なのは、ArduinoUNOのWiFiモジュールとUSBチップがATmegaマイクロコントローラーの同じシリアルポートを使用しているためです。スイッチがUARTに設定されていて、コードをArduinoにアップロードしようとすると、ArduinoIDEにエラーメッセージが表示されます。

<図>

WiFiモジュール設定をアップロードするには Arduinoにコードを記述し、ArduinoがWiFiモジュールをセットアップできるようにするには、以下の手順に従います。

  • 1。スイッチをDLINEの位置に設定します;
  • 2。 Arduino IDEを開き、コードを貼り付けてArduinoにアップロードします;
  • 3。アップロードが完了するとすぐに、コマンドがWiFiモジュールに送信される前に、スイッチをUART位置に変更するための5秒(コードの先頭での遅延)があります。最初のコマンドが失われると、他のコマンドは機能しなくなります。この場合、Arduinoをリセットするだけで、スケッチを最初からやり直すことができます。

約25秒かかるモジュール構成中、モジュールのLEDは標準パターンとは異なる方法で点滅します。この時点で、WiFiモジュールが構成されていることがわかります。

モジュールの構成後、 set ip address で指定されたIPアドレスを使用してモジュールにpingを実行してみてください(コマンドプロンプト->「ping [IPアドレス]」-> Enterキーを押してください)。 指図。モジュールから応答がない場合は、前の手順で問題が発生しました。

ステップ4:ロボットの動きを計画する

ロボットには2つのDCモーターしかありませんが、一連の複雑な動きを実行することができます。このチュートリアルをできるだけ単純にするために、基本的な均一な動きを約3ダースだけ定義し、基本的な動きの組み合わせによって形成される複雑な動きをいくつか定義することにしました。

手順2の写真でわかるように、私は車輪の回転センサー、超音波センサー、またはその他のタイプのセンサーを使用して、物体からの距離や移動距離を測定していません。これにより、ロボットが高精度の動作を実行できなくなります。ただし、モーターの方向と速度のみを制御することで、ロボットを動かすのに十分なレベルの精度を達成できます。

各動作に必要な実行時間を計算できるようにするために最初に知っておく必要があるのは、ロボットの平均速度です。これを行うには、巻尺をロボットと平行に配置し、両方のモーターを1〜2秒間同時にアクティブにして、移動距離を測定し、速度を推定します。私の構成では、最大モーター速度の62.5%を使用して1秒あたり13.7センチメートルを取得しました(250/400、Pololu Arduinoライブラリを参照)。つまり、ロボットを1メートル(100 cm)先に動かすには、モーターを7.299270…秒間同時に作動させる必要がありました。時間のカウントをミリ秒の解像度で維持することを選択しましたが、より高い移動精度を実現したい場合は、解像度をマイクロ秒に上げることを検討してください。簡単に言うと、ロボットを1メートル動かすには、両方のモーターを同時に7299ミリ秒起動する必要があります。この数から、他の距離ではすべてが三つのルールになります。円弧または円の動きを実行するには、一方のホイールがもう一方のホイールよりも速く移動する必要があります。ロボットを横向きにするには、片方の車輪だけをアクティブにするか、両方を反対方向に動かす必要があります(それ自体の軸を回転させるため)。ここでは、三角法を使用して、各ホイールが移動した距離と、各モーターをアクティブにする必要がある時間を把握する必要があります。これらの概念の良い出発点は、次のリンクにあります(ここでこれ以上詳しく説明するつもりはありません):http://rossum.sourceforge.net/papers/CalculationsForRobotics/CirclePath.htmおよびhttp:// math .stackexchange.com / questions / 60176 / move-two-wheeled-robot-from-one-point-to-another。

<図>

下のビデオの最後にあるように、私はロボットに床にいくつかの基本的な幾何学的形状(正方形、三角形、円)を「描画」させます。これらの動きは、基本的な動き(たとえば、前進、方向転換、前進、方向転換など)の組み合わせによって実現されます。これらの動きの組み合わせはBitVoicerServer Voice Schemaで行われ、次のステップで提示されるArduinoスケッチには表示されません。

ステップ5:コードをArduinoにアップロードする

このステップでは、ロボットソースコードという名前のスケッチをアップロードする必要があります。 、このチュートリアルの下部にあるArduinoにあります。以下のリンクからArduinoスケッチをダウンロードすることもできます。 Arduinoにコードを送信するには、手順3で説明したように、SparkfunシールドのスイッチをDLINEの位置に設定する必要があります。コードをアップロードする前に、BitVoicerサーバーとPololuモータードライバーライブラリをArduinoIDEに正しくインストールする必要があります。 (.zipライブラリのインポート)。

ロボットのソースコード :BVS_Demo3.ino

このスケッチの一部は、以前のチュートリアルの1つで使用した部分と類似しており、BitVoicerサーバー(BVSPおよびBVSMicクラス)との通信を扱います。このチュートリアルでは、スケッチの新しい部分の説明に固執します。 BVSPクラスとBVSMicクラスの使用方法について詳しく知りたい場合は、上記のチュートリアルを参照することをお勧めします。

  • 定数宣言 :スケッチの冒頭で、コード全体で使用される一連の定数を宣言します。モーター設定を持つ定数のグループは、デフォルトのモーター速度と2つの方向定数を定義します。 Pololuモータードライバーライブラリは、モーター速度に-400〜 + 400の値を受け入れます。ここで、ゼロはオフを意味します。負の値は逆回転を示します。私のようにモーターワイヤーを逆さにした場合は、正回転を示します。コマンド値を持つ定数のグループは、BitVoicerサーバーから送信されるコマンドを参照します。このスケッチでは、バイトの基本的なコマンドを40個だけ定義しました。 タイプしますが、これらのコマンドを組み合わせて、より複雑な動きを実行できます。
  • 実行制御変数 :コマンドの実行を制御するために、コードの先頭に5つの変数が定義されています( motorSpeed cmdDuration cmdStartTime cmdRunning e lastFwdCmd )。 motorSpeed 変数は現在のモーター速度を保持します。 ArduinoがBitVoicerServerからモーター速度を更新するコマンドを受信した場合、この変数は速度定数によって定義されたデフォルト値の1つで更新されます。 cmdDuration 変数は、現在のコマンドの合計期間を保持します。この変数は、 cmdStartTime に対してチェックされます。 ループのすべての反復で変数 cmdRunning の場合は関数 true 。コマンドの実行時間が経過した場合、 RunCommand 関数はモーターを停止するために呼び出されます。 lastFwdCmd 変数は、最後の「go / moveforward」コマンドを保持します。この変数は、「カムバック」コマンドを実行できるように、最後に移動した距離を知るために使用されます。このコマンドを使用するには、最初にロボットに向きを変えるように指示する必要があることに注意してください。
  • WiFi接続 :スケッチの最後に、BitVoicerサーバーに接続および切断するための2つの関数を定義します(接続 および切断 )。これらの機能は、Microchip WiFiモジュールをコマンドモードにし、TCP / IP接続を開いたり閉じたりして、モジュールをデータモードに戻します。 ループの内部 接続された変数が true でない場合、関数 、私は Connect と呼んでいます 関数。 BVSPクラスがサーバーステータスの有効期限が切れたことを報告した場合、つまり、最後のステータスリクエストに対する応答が受信されなかった場合、接続が失われたと見なし、切断を呼び出します。 関数。これにより、次のループ反復で新しい接続が強制的に試行されます。
  • RunCommand 機能 :この関数は、BitVoicerサーバーからコマンドを受信するたびに呼び出されます。 バイトかかります スケッチの最初の定数で定義された基本コマンドの1つに対応する値。各基本コマンドはスイッチ内で識別されるため、適切なモーター速度とコマンド期間を設定できます。関数の最後に、 cmdRunning 変数が true に設定されている ミリスが返す時間 関数は cmdStartTime に保存されます 変数。これにより、Arduinoは上記のようにコマンドの実行を制御できます。各コマンドの時間(ミリ秒単位)は、前の手順で説明したように取得されました。

ステップ6:BitVoicerサーバーのセットアップ

このステップでは、認識される文とArduinoに送信されるコマンドを使用してBitVoicerサーバー音声スキーマを構築する必要があります。このステップの最後に、このチュートリアルで使用されるすべてのBitVoicerサーバーソリューションオブジェクトを含むファイルへの2つのリンクがあります。すべてのソリューションオブジェクトを1つずつ作成したくない場合は、これらのファイルを使用してインポート(ソリューションオブジェクトのインポート)できます。

音声スキーマの構築を開始する前に、BitVoicerサーバーでArduinoを表すデバイスを作成する必要があります。混合デバイスを作成し、ArduinoUnoWiFiという名前を付けます。 [通信]タブで[TCP / IP]を選択し、手順3でWiFiモジュールに割り当てられたIPアドレスを入力します。[キュー]タブで、アクティブ化期間の開始を有効にします。 およびアクティブ化期間の終了 合図。両方のキューに対してInt16SendDataコマンドを選択し、コマンドのターゲットとしてArduinoUnoWiFiデバイスを選択します。 [データ]フィールドに、アクティブ化期間の開始に1を入力します アクティブ化された期間の終了のキューと0 合図。これらの手がかりは、アクティベーションワードが認識されるたびにArduinoに1つのLEDをオンにします。アクティブ化された期間(音声スキーマで定義)が経過すると、このLEDはオフになります。

それでは、音声スキーマを作成しましょう。ロボットには40の基本コマンドしかありませんが、同じコマンドをトリガーする多くの単語の組み合わせを作成したい場合があります。例として、「1メートル進む」と「1メートル進む」という文で同じコマンドをトリガーしたい場合があります。さらに、一連の一時的なコマンドを順番にトリガーする「正方形を実行する」などの複雑なコマンドを作成することもできます。そのため、音声スキーマは大幅に拡大し、40を超える基本的なコマンドを使用できるようになります。 BitVoicerサーバーは無制限の文をサポートしているので、必要な数の文を定義できます(私の場合は80文以上になりました)。ここでは、2つのヒントを紹介します。BitVoicerサーバーマネージャーオプションでデフォルトコマンドを作成します。複製したコマンドを1つの文から別の文にコピーして貼り付けます。

<図>

文コマンドはバイトを送信します Arduinoへのデータ型。スケッチの最初に定義された定数を使用して、各コマンドに送信する必要のある値を確認します。複雑なコマンドは多くの値を順番に送信するため、前のコマンドの実行中に値が送信されないように、それらの間の間隔(遅延)を制御する必要があります。遅延フィールドを使用して、コマンド間の間隔を設定します。

ソリューションオブジェクトファイル

Device.sof

VoiceSchema.sof

ステップ7:結論

単三電池を入れて、9V電池をArduinoの電源ジャックに接続するだけで、ロボットに命を吹き込むことができます。コードをArduinoにアップロードした後、Sparkfunシールドに取り付けられているスイッチをUARTの位置に回すことを忘れないでください。そうしないと、WiFiモジュールはArduinoシリアルポートから送信されたデータを受信しません。

ロボットの電源を入れた後、ステータスLEDが点灯するまで少し時間がかかります。 WiFiモジュールが通信を開始し、TCP / IP接続が確立されると、モジュールのLEDの1つが点灯します。数秒後、4つのステータスLEDのうち3つも点灯します。これは、1つの音声認識エンジンがArduinoに割り当てられていることを意味します。これから、ロボットはコマンドを実行する準備が整います。

ロボットでテストした結果、音声認識にはかなり満足しましたが、コマンドが常に100%認識されるわけではありませんでした。この点で、BitVoicerサーバーは本当に私を驚かせました。しかし、ロボットの動きの精度にはあまり満足していませんでした。この問題を解決するには、ホイールに回転センサーを追加する必要があります。ロボットで使用したシャーシキットには、ギアに取り付けることができるデコーダーディスクがすでに付属しています。これらのディスクにセンサーを適用すると、実際の移動距離に基づいてロボットを動かすことができるため、ロボットの動きがより正確になります。家具にぶつからないように超音波センサーを追加することもできます。私はおそらくいつかそれをするでしょう、しかし今のところ、私はそれをあなたに任せます。

またね!


コード

  • WiFiモジュールのセットアップ
  • ロボットのソースコード
WiFiモジュールのセットアップ Arduino
Arduinoシリアルポートを使用してMicrochipWiFiRN171VXモジュールを構成します。
 voidsetup(){Serial.begin(115200); pinMode(13、OUTPUT); delay(5000); Serial.print( "$$$"); delay(1000); Serial.println( "set wlan auth 4"); delay(1000); Serial.println( "set wlanphrase XXXXXX"); delay(1000); Serial.println( "set wlan ssid XXXXXX"); delay(1000); Serial.println( "set wlan channel 0"); delay(1000); Serial.println( "set wlan join 1"); delay(1000); Serial.println( "set wlan tx 0"); delay(1000); Serial.println( "set ip dhcp 0"); delay(1000); Serial.println( "set ip address XXXXXX"); delay(1000); Serial.println( "set comm remote 0"); delay(1000); Serial.println( "set comm close 0"); delay(1000); Serial.println( "set comm open 0"); delay(1000); Serial.println( "set comm size 500"); delay(1000); Serial.println( "通信時間50を設定"); delay(1000); Serial.println( "set uart baud 115200"); delay(1000); Serial.println( "set uart flow 0"); delay(1000); Serial.println( "保存"); delay(1000); Serial.println( "exit"); delay(1000); digitalWrite(13、LOW);} void loop(){} 
ロボットソースコード Arduino
Controls the robot movements, captures audio, manages the TCP/IP connection and communicates with BitVoicer Server.
#include #include #include // Defines the Arduino pins that will be used to control// LEDs and capture audio#define BVS_RUNNING 2#define BVS_SRE 5#define BVS_DATA_FWD 3#define BVS_ACT_PERIOD 6#define BVSM_AUDIO_INPUT 3// Defines the constants that will be passed as parameters to // the BVSP.begin functionconst unsigned long STATUS_REQUEST_INTERVAL =2000;const unsigned long STATUS_REQUEST_TIMEOUT =1000;// Defines the size of the mic bufferconst int MIC_BUFFER_SIZE =64;// Initializes a new global instance of the BVSP classBVSP bvsp =BVSP();// Initializes a new global instance of the BVSMic classBVSMic bvsm =BVSMic();// Initializes a new global instance of the // DualMC33926MotorShield classDualMC33926MotorShield ms =DualMC33926MotorShield();// Creates a buffer that will be used to read recorded s amples // from the BVSMic classbyte micBuffer[MIC_BUFFER_SIZE];// Creates a global variable that indicates whether the // Arduino is connected to BitVoicer Serverboolean connected =false;// Defines some constants for the motor settingsconst int SPEED_STOP =0;const int SPEED_SLOW =100;const int SPEED_NORMAL =250;const int SPEED_FAST =400;const int DIRECTION_FRONT =-1;const int DIRECTION_BACK =1;// Declares a global variables to hold the current motor speed.// The default is SPEED_NORMAL, but there are voice // commands that change this setting.int motorSpeed =SPEED_NORMAL;// Stores the command duration in millisecondsunsigned long cmdDuration =0;// Stores the time the command started runningunsigned long cmdStartTime =0;// Stores whether a command is running or notbool cmdRunning =false;// Stores the last MOVE_FORWARD command. This variable // is used only for the COME_BACK command.byte lastFwdCmd =0;// Defines some constants for command names/values// Just to make the code more readableconst byte CMD_STOP =0;const byte CMD_MOVE_FORWARD =1;const byte CMD_MOVE_FORWARD_1_CM =2;const byte CMD_MOVE_FORWARD_2_CM =3;const byte CMD_MOVE_FORWARD_5_CM =4;const byte CMD_MOVE_FORWARD_10_CM =5;const byte CMD_MOVE_FORWARD_25_CM =6;const byte CMD_MOVE_FORWARD_50_CM =7;const byte CMD_MOVE_FORWARD_1_M =8;const byte CMD_MOVE_BACKWARD =9;const byte CMD_MOVE_BACKWARD_1_CM =10;const byte CMD_MOVE_BACKWARD_2_CM =11;const byte CMD_MOVE_BACKWARD_5_CM =12;const byte CMD_MOVE_BACKWARD_10_CM =13;const byte CMD_MOVE_BACKWARD_25_CM =14;const byte CMD_MOVE_BACKWARD_50_CM =15;const byte CMD_MOVE_BACKWARD_1_M =16;const byte CMD_TURN_AROUND =17;const byte CMD_TURN_AROUND_RIGHT =18;const byte CMD_TURN_AROUND_LEFT =19;const byte CMD_DO_360 =20;const byte CMD_TURN_RIGHT =21;const byte CMD_TURN_RIGHT_10 =22;const byte C MD_TURN_RIGHT_25 =23;const byte CMD_TURN_RIGHT_45 =24;const byte CMD_TURN_LEFT =25;const byte CMD_TURN_LEFT_10 =26;const byte CMD_TURN_LEFT_25 =27;const byte CMD_TURN_LEFT_45 =28;const byte CMD_DO_CIRCLE =29;const byte CMD_COME_BACK =30;const byte CMD_MOVE_FORWARD_2_M =31;const byte CMD_MOVE_FORWARD_3_M =32;const byte CMD_MOVE_BACKWARD_2_M =33;const byte CMD_MOVE_BACKWARD_3_M =34;const byte CMD_SET_SPEED_SLOW =35;const byte CMD_SET_SPEED_NORMAL =36;const byte CMD_SET_SPEED_FAST =37;const byte CMD_TURN_LEFT_45_BACKWARD =38;const byte CMD_TURN_RIGHT_45_BACKWARD =39;void setup(){ // Starts serial communication at 115200 bps Serial.begin(115200); // Sets the Arduino pin modes pinMode(BVS_RUNNING, OUTPUT); pinMode(BVS_SRE, OUTPUT); pinMode(BVS_DATA_FWD, OUTPUT); pinMode(BVS_ACT_PERIOD, OUTPUT); AllLEDsOff(); // Sets the Arduino serial port that will be used for // communication, how long it will take before a status request // times out and how often status requests should be sent to // BitVoicer Server bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // Sets the function that will handle the frameReceived // event bvsp.frameReceived =BVSP_frameReceived; // Prepares the BVSMic class timer bvsm.begin(); // Prepares the motor shield class (pins and timer1) ms.init();}void loop() { // If it is not connected to the server, opens a TCP/IP // connection, sets connected to true and resets the BVSP // class if (!connected) { Connect(Serial); connected =true; bvsp.reset(); } // Checks if the status request interval has elapsed and if it // has, sends a status request to BitVoicer Server bvsp.keepAlive(); // Checks if there is data available at the serial port buffer // and processes its content according to the specifications // of the BitVoicer Server Protocol bvsp.receive(); // Gets the respective status from the BVSP class and sets // the LEDs on or off digitalWrite(BVS_RUNNING, bvsp.isBVSRunning()); digitalWrite(BVS_DATA_FWD, bvsp.isDataFwdRunning()); // Checks if there is a SRE assigned to the Arduino if (bvsp.isSREAvailable()) { // Turns on the SRE available LED digitalWrite(BVS_SRE, HIGH); // If the BVSMic class is not recording, sets up the audio // input and starts recording if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL); bvsm.startRecording(); } // Checks if the BVSMic class has available samples if (bvsm.available) { // Makes sure the inbound mode is STREAM_MODE before // transmitting the stream if (bvsp.inboundMode ==FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // Reads the audio samples from the BVSMic class int bytesRead =bvsm.read(micBuffer, MIC_BUFFER_SIZE); // Sends the audio stream to BitVoicer Server bvsp.sendStream(micBuffer, bytesRead); } } else { // There is no SRE available // Turns off the SRE and ACT_PERIOD LEDs digitalWrite(BVS_SRE, LOW); digitalWrite(BVS_ACT_PERIOD, LOW); // If the BVSMic class is recording, stops it if (bvsm.isRecording) bvsm.stopRecording(); } // If the status has timed out, the connection is considered // lost if (bvsp.hasStatusTimedOut()) { // If the BVSMic is recording, stops it if (bvsm.isRecording) bvsm.stopRecording(); // Closes the TCP/IP connection Disconnect(Serial); AllLEDsOff(); connected =false; } // If a command is running, checks if its duration has // expired. If it has, stop the motors. if (cmdRunning) if (millis() - cmdStartTime>=cmdDuration) RunCommand(CMD_STOP);}// Handles the frameReceived eventvoid BVSP_frameReceived(byte dataType, int payloadSize){ // Performs the appropriate actions based on the frame // data type. If the data type is byte, it is a command. // If the data type is int, changes the activated // period LED. switch (dataType) { case DATA_TYPE_BYTE:RunCommand(bvsp.getReceivedByte());壊す; case DATA_TYPE_INT16:digitalWrite(BVS_ACT_PERIOD, bvsp.getReceivedInt16());壊す; }}// Runs the command received from the servervoid RunCommand(byte cmd){ switch (cmd) { case CMD_STOP:ms.setSpeeds(SPEED_STOP, SPEED_STOP); cmdRunning =false;戻る; case CMD_MOVE_FORWARD:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =60000;壊す; case CMD_MOVE_FORWARD_1_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =23;壊す; case CMD_MOVE_FORWARD_2_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =47;壊す; case CMD_MOVE_FORWARD_5_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =117;壊す; case CMD_MOVE_FORWARD_10_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =234;壊す; case CMD_MOVE_FORWARD_25_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =468;壊す; case CMD_MOVE_FORWARD_50_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =1170;壊す; case CMD_MOVE_FORWARD_1_M:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =2339;壊す; case CMD_MOVE_FORWARD_2_M:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =4678;壊す; case CMD_MOVE_FORWARD_3_M:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =7018;壊す; case CMD_MOVE_BACKWARD:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =60000;壊す; case CMD_MOVE_BACKWARD_1_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =23;壊す; case CMD_MOVE_BACKWARD_2_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =47;壊す; case CMD_MOVE_BACKWARD_5_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =117;壊す; case CMD_MOVE_BACKWARD_10_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =234;壊す; case CMD_MOVE_BACKWARD_25_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =468;壊す; case CMD_MOVE_BACKWARD_50_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =1170;壊す; case CMD_MOVE_BACKWARD_1_M:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =2339;壊す; case CMD_MOVE_BACKWARD_2_M:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =4678;壊す; case CMD_MOVE_BACKWARD_3_M:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =7017;壊す; case CMD_TURN_AROUND:ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration =540;壊す; case CMD_TURN_AROUND_RIGHT:ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration =540;壊す; case CMD_TURN_AROUND_LEFT:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_FRONT); cmdDuration =540;壊す; case CMD_DO_360:ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration =1065;壊す; case CMD_TURN_RIGHT:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =503;壊す; case CMD_TURN_RIGHT_10:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =56;壊す; case CMD_TURN_RIGHT_25:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =140;壊す; case CMD_TURN_RIGHT_45:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =252;壊す; case CMD_TURN_LEFT:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =503;壊す; case CMD_TURN_LEFT_10:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =56;壊す; case CMD_TURN_LEFT_25:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =140;壊す; case CMD_TURN_LEFT_45:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =252;壊す; case CMD_DO_CIRCLE:ms.setSpeeds( SPEED_NORMAL * DIRECTION_FRONT, SPEED_NORMAL * DIRECTION_FRONT * 0.60); cmdDuration =4587;壊す; case CMD_COME_BACK:RunCommand(lastFwdCmd);戻る; case CMD_SET_SPEED_SLOW:motorSpeed =SPEED_SLOW;戻る; case CMD_SET_SPEED_NORMAL:motorSpeed =SPEED_NORMAL;戻る; case CMD_SET_SPEED_FAST:motorSpeed =SPEED_FAST;戻る; case CMD_TURN_LEFT_45_BACKWARD:ms.setSpeeds(motorSpeed * DIRECTION_BACK, 0); cmdDuration =252;壊す; case CMD_TURN_RIGHT_45_BACKWARD:ms.setSpeeds(0, motorSpeed * DIRECTION_BACK); cmdDuration =252;壊す; } // Sets the command start time cmdStartTime =millis(); // Sets cmdRunning to true cmdRunning =true;}// Opens a TCP/IP connection with the BitVoicer Servervoid Connect(HardwareSerial &serialPort){ serialPort.print("$$$"); delay(500); // Use the IP address of the server and the TCP port set // in the server properties serialPort.println("open 192.168.0.11 4194"); delay(1000); serialPort.println("exit"); delay(500);}// Closes the TCP/IP connection with the BitVoicer Servervoid Disconnect(HardwareSerial &serialPort){ serialPort.print("$$$"); delay(500); serialPort.println("close"); delay(1000); serialPort.println("exit"); delay(500);}// Turns all LEDs offvoid AllLEDsOff(){ digitalWrite(BVS_RUNNING, LOW); digitalWrite(BVS_SRE, LOW); digitalWrite(BVS_DATA_FWD, LOW); digitalWrite(BVS_ACT_PERIOD, LOW);}

回路図


製造プロセス

  1. Bluetoothで制御されるRaspberryPi Robot
  2. ArduinoとRaspberryPiを使用してインターネット制御のビデオストリーミングロボットを構築する
  3. PythonでArduinoとRFIDを使用した出席システム
  4. NeoPixelリングでジャイロスコープを楽しむ
  5. ラズベリーモーターシールドを使用したAndroid制御玩具
  6. サーボモーター付きロボット回避障害物
  7. ArduinoとAndroidデバイスでルンバロボットを制御する
  8. Nunchuk制御ロボットアーム(Arduino付き)
  9. 音声制御ロボット
  10. OKGoogleのBluetooth音声制御アプライアンス
  11. Arduinoによる音声認識と合成