ラベル Grove の投稿を表示しています。 すべての投稿を表示
ラベル Grove の投稿を表示しています。 すべての投稿を表示

2016年3月31日木曜日

irMagician と GrovePi でIoTリモコン - ハードウェア準備編 -

 今回のがらくたはDexter Industries社の「GrovePi」です。



 現在、販売されているのは「GrovePi+」という新型になっていて、自分の手元には新旧一つずつあるのですが、今回使っているのは古いタイプの「GrovePi」(ATMegaがDIPタイプ)です。



 このGrovePi(+)ですが、手に入れては見たものの、割りとすぎに飽きてしまい、放置されていました・・・。だって、あんまり動きがないので・・・。
 なんでまた、飽きて放置されていたGrovePiを引っ張り出してきたかというと、なんとなく久しぶりに学習リモコンを作ってみようかなと思いついたわけです。以前にArduinoで作ったことはあったんだけどPCにUSB接続して使う形態だったのでPCの電源を切っていると、(例えば)エアコンのスイッチを入れるのにまずPCを起動するっていう・・・リモコン普通に探せばいいじゃんってなってしまう展開でした。まあ、実用的なものを作るつもりはこれっぽっちも無いわけですが、Raspberry Pi 3 発売直前でRSコンポーネントとかでRaspberry Pi 2が値引き販売していたので、つい買ってしまい、なにか使いみちがないかと考えたところ、Raspberry Piなら電源入れっぱなしにして、学習リモコンとかその他IoTハブ的な感じで、家の中なら音声認識や無線LAN経由のタブレット操作で、家の外からもVPNでスマホなどで色々コントロールできると面白いんじゃないかってことで。
 で、使ってないGrovePiに白羽の矢が立ち、はじめはGroveの赤外線リモコンモジュールを使って、lircというLinuxで学習リモコンするときに定番らしいソフトで実現するつもりでしたが、日本のエアコン等の複雑(長い)で独自プロトコルな信号は再現できない場合がある(NEC/家製協/SONYフォーマット等のある程度決められたフォーマットを前提にしているため、独自の信号形式だと上手く行かないことがる)らしく、ネットで学習リモコンについて調べていたところ、大宮技研さんの「irMagician」というのを見つけました。このirMagicianはリモコン信号を時分割したOn/Off信号として記録するため、信号フォーマットによらずに比較的柔軟に色々なリモコン信号に対応できるらしいです。そこで、途中までGrovePiで進めてきたのをirMagicianを採用する方向に変更しました。

 準備したハード構成としては、下写真のような感じです。


 Raspberry Pi のUSBコネクタに、Juliusで音声認識させるための USBマイク と irMagician を接続してあります。irMagicain は Raspberry Pi からは CDC-ACMつまりシリアルポート(ttyACM0等)として認識されます。

 irMagician の本体は、GrovePiのケース(旧タイプのBrickPiのケースを使用しています。)に固定した中華安パン・チルトカメラ台に両面テープで貼り付けて、カメラとともにサーボで方向をコントロールできるようにしました。



 ところが、ここで困ったことが一つ発覚、Groveシリーズ(元のArduino)ではサーボの制御もできるので、GrovePiでも当然できると思っていたのですが、GrovePiのドキュメントを見ると「サーボは対象外、ノイズとか面倒だから」となっていて、GrovePiでのサーボ制御が出来ないことが判明しました。しかたがないので、Raspberry Pi の UART (GPIOのTx,Rx)ポートにレベル変換をかましてGrovePi上にPISER(Pi の UART)端子というのが出ているので、このPISER端子にArduino(Sainsmartの互換機)を接続して、Arduino経由でパン・チルトのサーボを制御するようにしました。


 なんか、強引ですが、とりあえずパン・チルト駆動はできました。Arduino側のサーボコントロールプログラムは、サーボの向きを変える時だけPWM信号を出力して、あとは信号出力を停止しておくようにしました。乗っているものがRaspberry PiカメラモジュールとirMagicianだけなので、常にトルク(制御)を掛けておかなくてもサーボの向きが変わってしまう(重さで下を向くとか)ことは無いので、常にPWMをかけておく無駄と「チーッ」という発信音がサーボからたまに出るのを防ぐことが出来ます。

 irMagician に関しては、とりあえず、部屋の証明のOn/Off と Panasonic のエアコンのOn/Off は動作確認できました。Panasonicのエアコンに関しては、リモコン側に状態を持っている(リモコンの電源OnOffボタンを押すたびに本体とは関係なくリモコン側の画面・ステータスが変わる)ことに今回はじめて気が付きました。たまに、電池切れかけの時などにエアコンが反応していないのにリモコン側はスイッチがOnになったことになっていて、あれっ?て思ったことがあったんですが、今までは全く気が付かない(というか考えていなかった)でいました。たしかに、本体とリモコンが相互通信でもしないかぎり、それぞれに状態を持っていているんだから、それがずれることだってあるでしょうよと、妙に納得しました。

 ちなみに irMagician の使い方については 大宮技研さんのこの辺りの情報とか、netbuffaloさんのこちらとかこちらを参考にさせていただきました。特に、Raspberry Pi 上でリモコン信号をキャプチャ、再生、ファイル保存をするpythonのプログラムをまんま利用させてもらっています。ありがとうございます。

 また、折角なので、追加で PIRモーションセンサも追加しました。


 サーボやirMagic、各Groveセンサはサンプルプログラム等で単体の動作は一通り確認できました。Raspberry Piカメラモジュールもここらへんを参考にmjpg-streamerでブラウザから画像が見れるようになりました。あとはリモコン信号の登録、Julius音声認識の辞書設定、ブラウザ操作のための仕組み構築といったあたりですが、最後のブラウザ操作でGPIOをどんな仕組みでやるか検討中です。GrovePi が pythonのサンプルが豊富なので pythonのtornado でやるか、node.js でやるか(一応GrovePiに node.js用のライブラリも提供されているみたいですが、サンプルが少ないので、どっちの知識も薄い自分的には python のほうがとっつきやすそう。)



 
 



2015年2月22日日曜日

GrovePi お試し。

 本日のガラクタは、GrovePi です。一ヶ月以上も前に Dexter Industries社に直接発注してあったんですが、Dexter社は即日発送してくれたにもかかわらず、その後USPS(アメリカの郵便局?)に荷物が渡った後、トラッキング照会すると、3週間以上前にシカゴに着いたまま荷動きがありません。通関業務で止まってしまっているのか?このまま、どこかへ消滅してしまうのかはわかりませんが、そんなこんなしている間に、スイッチサイエンスさんから GrovePi+ が発売されていたので、まずは、そちらで手に入れました。GrovePi+ は GrovePi の改良版で、GrovePi を Raspberry Pi B+ にスタックするとLANコネクタやUSBコネクタで基盤裏側のパーツのハンダランドがショートしてしまうのですが、GrovePi+ では裏側に部品のランドが出ない(内層)形になっています。それに合わせて、Arduino部分のチップがDIPから表面実装に変わっています。あと、カメラのフラットケーブルを通せるスリットが開いています。それ以外の違いは、自分はわかりませんが、以前のGrovePi (+じゃない)でも、LAN、USBコネクタの位置にGrovePiの裏側にマスキングテープなどを貼れば、問題なく使えるはずです。
 で、GrovePi は、Arduino の Grove System シリーズのセンサーなどをRaspbery Piで利用できるようにするベースシールド的なものですが、通常のベースシールドはArduinoの各ピンと接続されているわけですが、GrovePi ではGrove コネクタがRaspberry Pi にすべて直に接続されているわけではなく(されているコネクタもある。UARTとかI2Cとか。)て、間にArduino相当のマイコンを挟んでいます。
 GrovePi のWikiにある画像を借りると、



 上記のような感じで、 Raspberry Pi から UARTとI2CがGroveコネクタにつながっているほか、Raspberry Pi と GrovePi(上のArduino)がSPIとI2Cで接続されいて、GrovePiのSerial, Digital IO(PWMも), Analog入力を利用できるようになっています。自分がよく使う Raspberry Pi と Arduino (Micro) をUSBかUARTで接続して組み合わせるパターンに似ていますが、GrovePIではI2CでArduinoを制御して、SPI接続でRasperyy PI側からAVRのファームの書き換えも行えるようになっているようです。
 もともと、Grove のセンサやLCD等をいくつか持っているので、このGrovePi も試してみようと思っていました。


 以下、開封したところ。


 裏側。


  Raspberry Pi B+ にスタックしたところ。



 以下、Grove RGB LCD をサンプルソースで動かしてみたところです。GrovePi を利用するためのライブラリは Python で提供されていますので、コードは Python で記述することになりますが、適用されているPythonのサンプルとライブラリのソースを見れば、各GroveモジュールやAVRとのI2Cでのやりとりは解析できそうなので、C/C++などでも利用することは可能ではないでしょうか。
 Grove はハンダ付け無しでブロック感覚で色々遊べるのが楽しいですが、ブレッドボードと併用して、ちょっとした試作にも便利だと思います。









2015年2月16日月曜日

Galileo で Windows for IoT その2

 今回のガラクタは、前回に引き続き Windows for IoT with Galileo です。Windows for IoT の良いところは、やはり、Visual Studio で Windows (のコンソール)アプリとして、開発・デバッグが出来るところではないかと思います。ただ、Realtime OS や Arduino のようなOSなしマイコン直接操作 みたいのに比べるとリアルタイム性は無いので、そういった必要性があるところには使えません。逆に言うと、じゃあ、どんなところに使えるんだ?って話で、Raspberry Pi を使うようなネットワークやら、計算・画像処理なんかの重めのところをやらせるのがいいんじゃないでしょうか?まあ、自分の中では、その手の用途は Raspberry Pi + Arduino (Micro) のコンビがデフォルトになっているわけですが、今回は、Windows for IoT で遊ぶということで、Galileo で WinSock (Socket) 通信を試してみようと思います。
 基本的には、こちらにあるサンプルの流用となりますが、Galileo側で WinSock Server プログラムを動かして、Windows PC からWinSock Client プログラムで接続して、文字を送信、Galileo 側が受信文字によってAnalogRead()の値をClient側に返すというシンプルなものです。また、ついでに、前回のLCDシールドも使って、応答文字列をLCDにも表示しています。
 今回は GroveシールドとLCDシールドをスタックしています。Grove も DigitalWrite() や DigitalRead() などで使える簡単なものは動きますが、超音波距離センサを使おうと思ったところ pulseIn()関数が使えないようでした。


 PCのクライアントソフトで接続して、x とか y とか送信すると、AnalogRead() でジョイスティックの値を読み込んで、LCDに表示しつつ、クライアント側に応答送信します。



  Galileo側の WinSock Server のソースはこちらPC側のテスト用クライアントのソースはこちら にあります。
 一応、Galileo側のコードだけ以下に掲載。