インコ特訓器バージョンその1
▼
インコを3羽飼っています。
見るたび「こんにちは」と話しかけてはいますが、頻度的に覚えてくれるような気がしません。
さらに、3羽だと鳥同士でしゃべってしまうので言葉を覚えにくいとも聞いたことがあります。
▼
そこで、「こんにちは」を繰り返し発声してくれる装置をarduinoで作ってみました。

電源とスピーカーをつないで出来上がり。
エネループ4本の4.8V電源をaruduinoの5Vピンにさしてます。(ギリ動きます。)
▼

スピーカーを紙コップの底につけて拡声させればできあがり。
ためしに1回の起動で30秒に1回のペース、100回まで繰り返すようにしてみました。
あんまりしつこくやるのもストレスになるかもしれないですし。
▼

興味津々の白インコ青インコと、ちょっと身構える黄インコ。
家族からは「繰り返し同じのを聞かされてちょっとかわいそうかもしれない」という意見も出まして、
「みんなでもっと『こんにちは』と話しかけるようにしよう!」という結論になりました。
▼
バージョンその2ではSDカードを足して音楽用の容量を増やし、同じこんにちはでもいろいろなニュアンスのものを聞かせたり、時間によって別の言葉を流すようにしてみたり、うぐいすの鳴き声なども聞かせられるようにしてみたいと思います。
LEDが光るのもちょっと怖いかもしれないので隠したり、なるべくストレスフリーな方向にバージョンアップしたいです。
▼
植物やペットがIoTの力でより人間とフレンドリーになる「スーパーペット」というジャンルが将来くるだろうと予想しています。
機械を話し相手にするのは少し虚しいものがありますが、血の通ったペットには心もあるし、お話し相手にはうってつけですもんね。
▼
以下コードメモ。
コード化は「おもちゃメモ」さんを参考にさせていただきました。
http://nn-hokuson.hatenablog.com/entry/2017/09/01/092945
インコを3羽飼っています。
見るたび「こんにちは」と話しかけてはいますが、頻度的に覚えてくれるような気がしません。
さらに、3羽だと鳥同士でしゃべってしまうので言葉を覚えにくいとも聞いたことがあります。
▼
そこで、「こんにちは」を繰り返し発声してくれる装置をarduinoで作ってみました。

電源とスピーカーをつないで出来上がり。
エネループ4本の4.8V電源をaruduinoの5Vピンにさしてます。(ギリ動きます。)
▼

スピーカーを紙コップの底につけて拡声させればできあがり。
ためしに1回の起動で30秒に1回のペース、100回まで繰り返すようにしてみました。
あんまりしつこくやるのもストレスになるかもしれないですし。
▼

興味津々の白インコ青インコと、ちょっと身構える黄インコ。
家族からは「繰り返し同じのを聞かされてちょっとかわいそうかもしれない」という意見も出まして、
「みんなでもっと『こんにちは』と話しかけるようにしよう!」という結論になりました。
▼
バージョンその2ではSDカードを足して音楽用の容量を増やし、同じこんにちはでもいろいろなニュアンスのものを聞かせたり、時間によって別の言葉を流すようにしてみたり、うぐいすの鳴き声なども聞かせられるようにしてみたいと思います。
LEDが光るのもちょっと怖いかもしれないので隠したり、なるべくストレスフリーな方向にバージョンアップしたいです。
▼
植物やペットがIoTの力でより人間とフレンドリーになる「スーパーペット」というジャンルが将来くるだろうと予想しています。
機械を話し相手にするのは少し虚しいものがありますが、血の通ったペットには心もあるし、お話し相手にはうってつけですもんね。
▼
以下コードメモ。
コード化は「おもちゃメモ」さんを参考にさせていただきました。
http://nn-hokuson.hatenablog.com/entry/2017/09/01/092945
スポンサーサイト
シリアル書き込みスケッチのユーザー関数化その1
▼
VS-RC003をArduinoのシリアル経由で操作するプロジェクトがまだ続いています。
一気に最後まで作ってしまうべきかもしれませんが、Arduinoの練習がてら完成まで少しずつ前進中です。
今回新たに試したことは、
・ユーザー定義関数を使う。
・ストリング関数を使う。
・配列、文字列、16進数などの相互変換を行う。
のあたりです。
▼
今回定義したユーザー関数は、
VSRC_WnV(x,y)
です。
xには変数番号(0〜255)
yには数値データ(0〜65535)
をそれぞれ入れて使います。
変数番号(たとえばコントローラの接続設定は240)と数値データ(たとえばゲームパッド未接続なら0)を整数で指定して実行すると、アドレスと16進数リトルエンディアンを自動的に作成して書き込んでくれるという、VS-RC使いにとってはなかなか便利な関数です。
書き込みに成功すればtrue、失敗ならfalseを返してくれるようにしてみました。
▼
今回はまだテストで、シリアルモニタで結果を見られるようになっています。
この後、このユーザー関数はarduino nanoなどでも使えるようにハードウェアシリアル(0番1番ピン)用に作り直し、モニタリング機能も排除する予定です。
また、コントロール関連専用のユーザー関数VSRC_CONTROL()や、読み込み専用のVSRC_READ()、ベリファイなしの書き込みVSRC_WRITE()なども同時に作成予定です。
自分的に難しいところは超えたので、あとは作業をしていくだけです。
一通り完成し、実際にロボットを安定的に動かすテストまでできれば、自分的にはVS-RCのシリアルは攻略完了となります。
▼
以下、スケッチです。
▼
実行したシリアルモニタは下記のようになります。
VS-RC003をArduinoのシリアル経由で操作するプロジェクトがまだ続いています。
一気に最後まで作ってしまうべきかもしれませんが、Arduinoの練習がてら完成まで少しずつ前進中です。
今回新たに試したことは、
・ユーザー定義関数を使う。
・ストリング関数を使う。
・配列、文字列、16進数などの相互変換を行う。
のあたりです。
▼
今回定義したユーザー関数は、
VSRC_WnV(x,y)
です。
xには変数番号(0〜255)
yには数値データ(0〜65535)
をそれぞれ入れて使います。
変数番号(たとえばコントローラの接続設定は240)と数値データ(たとえばゲームパッド未接続なら0)を整数で指定して実行すると、アドレスと16進数リトルエンディアンを自動的に作成して書き込んでくれるという、VS-RC使いにとってはなかなか便利な関数です。
書き込みに成功すればtrue、失敗ならfalseを返してくれるようにしてみました。
▼
今回はまだテストで、シリアルモニタで結果を見られるようになっています。
この後、このユーザー関数はarduino nanoなどでも使えるようにハードウェアシリアル(0番1番ピン)用に作り直し、モニタリング機能も排除する予定です。
また、コントロール関連専用のユーザー関数VSRC_CONTROL()や、読み込み専用のVSRC_READ()、ベリファイなしの書き込みVSRC_WRITE()なども同時に作成予定です。
自分的に難しいところは超えたので、あとは作業をしていくだけです。
一通り完成し、実際にロボットを安定的に動かすテストまでできれば、自分的にはVS-RCのシリアルは攻略完了となります。
▼
以下、スケッチです。
// VS-RC003のシリアルを書き込み、ベリファイする関数のモニタリング付きスケッチ。 |
▼
実行したシリアルモニタは下記のようになります。
Serial1_write_command: w 200886 eb 0d Serial1 vsrc_read_command: r 200886 02 serial1 read data: w 200886 eb 0d Veriy OK! |
シリアル読取&書き込みスケッチのリファイン
▼
見えるぞ!私にもシリアルが見える!!
▼
「VS-RC003→Arduinoのシリアル解読」でVS-RC003のデータ表示に挑戦した後、
「シリアル検証スケッチ」でシリアルの厳密な配列が判明してきました。
前回やや当てずっぽうだった必要データの切り出し方法を厳密なものに改め、スケッチを書き直してみました。
さらに、書き込んでベリファイするものも書いてみました。
だいぶスッキリしました。
▼
PCでモニタリングするプログラムのため、
Arduinoはハードウェアシリアルが使えるMEGAがおすすめです。
Serial1が使えるMICROやLeonardoでも動くと思います。
VS-RC003の設定で好きな方をシリアルに設定し、また、
ArduinoのRXピン、TXピン、5V、GNDを、VS-RC003のTXピン、RXピン、5V,GNDにそれぞれ接続します。
▼
補足ですが、VS-RC003の拡張コネクタは、
CN6:ゲームパッド使える/IXBUS使えない/シリアル使える
CN7:ゲームパッド使えない/IXBUS使える/シリアル使える
となっているようです。
IXBUS機器を複数使う場合CN7に数珠つなぎにします。
CN6にはコントロールパッドの代わりにシリアルをつなぐことが可能です。
▼
まず読み取りです。
電圧の取得を例にします。
指定したアドレスのデータを読み込み、データを表示。
さらにエンディアンを交換し、整数データとして表示するところまでを行います。
実行結果は、
のように表示されます。
▼
次に書き込みです。
VS-RC003にシリアルで指定アドレスに変数を書き込みます。
同じアドレスを読み取って比較することで書き込みの成否までを確認します。
こちらの実行結果は、
のように表示されます。
▼
実際にロボットと接続してみて安定的に動くようであれば、ベリファイの部分を省略してしまうのもArduinoへの負担が減ってよいかと思います。
ついでにユーザー関数化やライブラリ化ができれば運用しやすいのですが、そのやり方はまだいまいちわかっていません><
▼
これでついにVS-RC003&Arduinoのシリアル制御を完全攻略!
・・・ができたような気がします^^
ここまでできれば、SBDBTのファームを書き換えてVS-RC003に直付けすることもできてしまいそうです。
(これはライト級的に欲しい機能です。)
見えるぞ!私にもシリアルが見える!!
▼
「VS-RC003→Arduinoのシリアル解読」でVS-RC003のデータ表示に挑戦した後、
「シリアル検証スケッチ」でシリアルの厳密な配列が判明してきました。
前回やや当てずっぽうだった必要データの切り出し方法を厳密なものに改め、スケッチを書き直してみました。
さらに、書き込んでベリファイするものも書いてみました。
だいぶスッキリしました。
▼
PCでモニタリングするプログラムのため、
Arduinoはハードウェアシリアルが使えるMEGAがおすすめです。
Serial1が使えるMICROやLeonardoでも動くと思います。
VS-RC003の設定で好きな方をシリアルに設定し、また、
ArduinoのRXピン、TXピン、5V、GNDを、VS-RC003のTXピン、RXピン、5V,GNDにそれぞれ接続します。
▼
補足ですが、VS-RC003の拡張コネクタは、
CN6:ゲームパッド使える/IXBUS使えない/シリアル使える
CN7:ゲームパッド使えない/IXBUS使える/シリアル使える
となっているようです。
IXBUS機器を複数使う場合CN7に数珠つなぎにします。
CN6にはコントロールパッドの代わりにシリアルをつなぐことが可能です。
▼
まず読み取りです。
電圧の取得を例にします。
指定したアドレスのデータを読み込み、データを表示。
さらにエンディアンを交換し、整数データとして表示するところまでを行います。
// VS-RC003のシリアルを読み取るプログラム作例 |
実行結果は、
#2009dc 02 00 98 0f Big endian : 0f 98 ASCII to HEX to DEC : 0 15 9 8 VCC : 3992 #2009dc 02 00 8f 0f Big endian : 0f 8f ASCII to HEX to DEC : 0 15 8 15 VCC : 3983 (以降くりかえし) |
のように表示されます。
▼
次に書き込みです。
VS-RC003にシリアルで指定アドレスに変数を書き込みます。
同じアドレスを読み取って比較することで書き込みの成否までを確認します。
// VS-RC003のシリアルを書き込み、ベリファイするスケッチ例 |
こちらの実行結果は、
wrote:w 2009f6 01 00 read :w 2009f6 01 00 Veriy OK! wrote:w 2009f6 01 00 read :w 2009f6 01 00 Veriy OK! (以降くりかえし) |
のように表示されます。
▼
実際にロボットと接続してみて安定的に動くようであれば、ベリファイの部分を省略してしまうのもArduinoへの負担が減ってよいかと思います。
ついでにユーザー関数化やライブラリ化ができれば運用しやすいのですが、そのやり方はまだいまいちわかっていません><
▼
これでついにVS-RC003&Arduinoのシリアル制御を完全攻略!
・・・ができたような気がします^^
ここまでできれば、SBDBTのファームを書き換えてVS-RC003に直付けすることもできてしまいそうです。
(これはライト級的に欲しい機能です。)
VS-RC003変数番地計算機
▼
VS-RC003の変数番号を、VS-RC003がシリアル受信で理解できる番地に変換するプログラムのarduino版です。
使いたい変数を設定したスケッチをArduinoにアップすると、シリアルモニタに答えを表示します。
あとで必要になりそうな単機能のスケッチです。
▼
VS-RC003の変数番号を、VS-RC003がシリアル受信で理解できる番地に変換するプログラムのarduino版です。
使いたい変数を設定したスケッチをArduinoにアップすると、シリアルモニタに答えを表示します。
あとで必要になりそうな単機能のスケッチです。
▼
//使いたい変数番号を設定すると、PCのシリアルモニタに番地を |
シリアル検証スケッチ
▼
VS-RC003のシリアル関連についてですが、前回のスケッチでは動くもののデータの切り出し方にちょっと無駄がありました。
シリアルの情報は公式に開示されているのですが、細かな点が素人にはちょっとわかりづらいです。
コールバック、#プロンプト、[CR]、[LR]の受信順について厳密に理解しておくため、改めて専用のスケッチを作って検証しておきたいと思います。いそがばまわれ。
▼
使うのは例によってハードウェアシリアルの安定性も高いMEGAです。
Serial1のTX,RXピンをVS-RC003のRX,TXとそれぞれ繋ぎます。
LeonardoやMICROでもたぶん大丈夫だと思います。
▼
まず、読み込みのテストです。
r 2009dc 04[CR][LR]を送信すると、帰ってくるのは、
という結果になりました。
Cは[CR]、Lは[LF]を示します。
1発目はVS-RC003からの返信がこないことが多いので扱いに注意が必要ということがわかります。
最初の#は、VS-RC003からのコマンド受領合図です。[CR]を受け取るとまずこの#を返してきます。
また、2回目の#よりも前の文字列は、送信したコマンドのコールバック(受領したデータを一文字ずつ返してくる仕様)になりますので、データとしては不要なものです。
[LF]#と2バイト連なる文字列を受け取ってから、次の[CR]が来るまでの文字列を読み取るようにプログラムすれば、欲しいデータを切り出せそうです。
▼
次に、書き込みのテストです。
w 2009f6 01 00を送信すると、帰ってくるのは、
という結果になりました。
書き込みコマンドを受領したVS-RC003は、[CR]を受け取ってすぐに#を返してくれることがわかります。
書き込みが成功しているかのチェックは、もう一度該当箇所を読み込んで比較するのが良さそうです。
▼
そこで、書き込んだ後に読み込み実行するスケッチも簡易的に書いてみました。
こちらを実行すると、ずらずらと改行なしで結果を出力します。
どういう順番でシリアルが帰ってくるのでしょうか。
実行結果は、
となります。
ここから上手に該当箇所を切り出すことができれば、ArduinoとVS-RC003は晴れて通信開通となる・・・はずです。
パズルゲームを遊んでいるようで、面倒ながらも楽しいです^^
VS-RC003のシリアル関連についてですが、前回のスケッチでは動くもののデータの切り出し方にちょっと無駄がありました。
シリアルの情報は公式に開示されているのですが、細かな点が素人にはちょっとわかりづらいです。
コールバック、#プロンプト、[CR]、[LR]の受信順について厳密に理解しておくため、改めて専用のスケッチを作って検証しておきたいと思います。いそがばまわれ。
▼
使うのは例によってハードウェアシリアルの安定性も高いMEGAです。
Serial1のTX,RXピンをVS-RC003のRX,TXとそれぞれ繋ぎます。
LeonardoやMICROでもたぶん大丈夫だと思います。
|
▼
まず、読み込みのテストです。
r 2009dc 04[CR][LR]を送信すると、帰ってくるのは、
Arduino read... r 2009dc 04C#L from Serial1. Arduino read... r 2009dc 04C#L#2009dc 02 00 d2 0f CL from Serial1. Arduino read... r 2009dc 04C#L#2009dc 02 00 d2 0f CL from Serial1. (以降繰り返し) |
という結果になりました。
Cは[CR]、Lは[LF]を示します。
1発目はVS-RC003からの返信がこないことが多いので扱いに注意が必要ということがわかります。
最初の#は、VS-RC003からのコマンド受領合図です。[CR]を受け取るとまずこの#を返してきます。
また、2回目の#よりも前の文字列は、送信したコマンドのコールバック(受領したデータを一文字ずつ返してくる仕様)になりますので、データとしては不要なものです。
[LF]#と2バイト連なる文字列を受け取ってから、次の[CR]が来るまでの文字列を読み取るようにプログラムすれば、欲しいデータを切り出せそうです。
▼
次に、書き込みのテストです。
w 2009f6 01 00を送信すると、帰ってくるのは、
Arduino read... w 2009f6 01 00C#L from Serial1. Arduino read... w 2009f6 01 00C#L from Serial1. Arduino read... w 2009f6 01 00C#L from Serial1. (以降繰り返し) |
という結果になりました。
書き込みコマンドを受領したVS-RC003は、[CR]を受け取ってすぐに#を返してくれることがわかります。
書き込みが成功しているかのチェックは、もう一度該当箇所を読み込んで比較するのが良さそうです。
▼
そこで、書き込んだ後に読み込み実行するスケッチも簡易的に書いてみました。
こちらを実行すると、ずらずらと改行なしで結果を出力します。
どういう順番でシリアルが帰ってくるのでしょうか。
|
実行結果は、
w 2009f6 00 00C#Lr 2009f6 02C#L#2009f6 00 00 CLw 2009f6 00 00C#Lr 2009f6 02C#L#2009f6 00 00 CLw 2009f6 00 00C#Lr 2009f6 02C#L#2009f6 00 00 CL (以下繰り返し) |
ここから上手に該当箇所を切り出すことができれば、ArduinoとVS-RC003は晴れて通信開通となる・・・はずです。
パズルゲームを遊んでいるようで、面倒ながらも楽しいです^^