Intel Galileoでフィジカルコンピューティング第2弾!
~給餌装置をパワーアップ。全自動で猫の世話をしよう!~
更新履歴+進捗状況管理
2014/07/04 v0.1 (無線通信部)送信モジュール完成。TODO:受信部とプロトコル策定予定
2014/07/05 v0.1+ フォトセル入手。1次締切に向けて粗方の骨子案をまとめた。
2014/07/07 v0.1.1 加筆修正+スイッチングについて。
2014/07/07 v0.2 給水機構タンク編、水やり部分完成(メカ部分は除く)
2014/07/09 v0.3 給水機構メカニカル編まで完成。
2014/07/10 台風によりメカニカル部分の電線が破損、復旧作業中、版変更なし。
2014/07/16 v0.4 筆者充電完了、文章追加。ガスセンサ駆動スケッチ(仮)貼付。
2014/07/17 v0.5 ガスセンサ駆動スケッチ(改)貼付、ガスセンサ未だ駆動せず。
2014/07/18 v0.6 ガスセンサ僅かに駆動。ハード面でのデバッグが必要か。
2014/07/20 v0.7 ガスセンサ確かに駆動。プロトタイプをリリースバージョンにせよ。
2014/07/21 v0.8 一次公開にむけて。センサモジュール完成。
2014/07/21 v0.81 センサがGalileoで動かない! ~MoM Moduleの提案と構想 ~
2014/07/24 v0.91 ~MoM ModuleでArduinoをシールド部品に落とし込め!~
2014/07/25 v0.92 ~MoM Module"I/O" プロトタイプお披露目~
2014/08/05 v0.93 臭気検知で飼い主に知らせる手段の模索、アンプまで完成。
2014/08/06 v0.94 MoM Module"I/O"完成。音声合成LSI単独駆動に成功。
2014/08/08 v0.95 Galileo側スケッチの骨子が完成。デザインコンセプトについて記述。
2014/08/14 v0.96 開発方式と現状について記載。
2014/09/17 v0.98 音声合成ボード、I2Cハブ完成
2014/09/24 v1.00 完成への宇宙旅行。
2014/09/30 v1.10 試作機完成(課題達成)、試作機レビュー
2014/10/04 v1.20 試作機が完成したので後書きを書きなおした。
おことわり
今回の試作機開発にあたっては、工作範囲がGalileo用のスケッチ(プログラム)や、センサ回路やモーターの制御プログラム、無線通信、ユニバーサル基板を使ったモジュール作成、電子工作など広範囲に渡り、試作機自体が複雑な構成になると予想されるため、全てのスケッチにおいて、正確性を十分に保証しません。現状有姿のままで執筆、掲載しています。
それでも、参考にしていただければ幸いです。また、読み物としても楽しんでいただければ筆者としても嬉しく思います。
始めに(開発に至った経緯)
先日、(2月から3月にかけて)Intel Galileo開発ボードでオリジナルの試作機を作るというプレミアムレビューの機会を頂いた。
今回も縁があって同じGalileoボードでもう一つ試作機を完成させ、その試作機をレビューせよ!という機会に恵まれたので、素人な筆者であるが、参戦(?)させていただいた次第である。
また、第一次締め切りの7/21までに可能な限り多くの研究結果を発表できるように、若干先走り感が否めないが、敢えてレビュー原稿を公開した。(2014/07/05)
少々読み辛い点もあるかと思うが、お付き合いいただけたら幸いである。
目次
今回も、長文になることが予想されるので、冒頭に簡単な目次を付けてみた。
- おことわり
- 初めに
- 目次
- 概略
- 2枚目のボード到着
- 一つ目の課題~レーザー通信~
- 一つ目の課題・解決編
- 次なる課題
- 二つ目の課題・給水機構タンク編
- ウォータータンク作成手順
- 二つ目の課題・給水機構メカニカル編(続く)
- 部品が届いたよ!
- ガスセンサとの格闘その1(失敗編)
- ガスセンサモジュール組み立て ~シールド製作過程と発覚したハード的なバグ~
- ガスセンサモジュール組み立て ~プロトタイプ完成~
- ガスセンサモジュール組み立て ~リリースバージョンと数値解析~
- ガスセンサスケッチコンパイル失敗 ~機種固有命令使用による弊害をMoMで解決~
- 中間報告
- MoM Module/Shield作成過程 ~07/24 その1 考察編~
- MoM Module ”I/O"作成過程 ~07/25 その2 プロトタイプ完成~
- 音声で飼い主に猫の変化を伝えよう。
- アンプ完成。
- MoM Module"I/O"完成報告と音声合成LSI単独駆動報告
- Galileoでフィジカルコンピューティングの宇宙へ ~試作機のデザインコンセプト~
- 音声合成ボード完成。
- I2Cハブ完成。
- 試作機プロトタイプ完成。
- プログラム(スケッチ)について。
- 試作機完成とそのレビュー
- 試作機レビュー、写真と解説
- まとめ
- 参考文献
- あとがき
- 謝辞
概略
今回作成する試作機の概略としては、ペット自動給餌装置パワーアップキット(仮称)と題して、次の2点を満たす試作機を開発したい。
- 以前作成した給餌機能のみの試作機と連携して、水量監視、臭気監視を行う。
- 前回の試作機と今回作成予定の試作機とは無線で通信を行う。
また、外出時も困らないように、
(私の技術範囲で可能であれば)ログを携帯端末(スマホとかケータイ)に送信したい。
筆者としてもどこまでやれるか甚だ疑問であるが、挑戦していきたいと思う。
2枚目のGalileo君が到着。
さて、そうこうしているうちに2枚目のGalileo開発ボードが届いた。右の箱に入っているブツがそれである。
What will you make?(again!)
早速箱を開けてみる。
今回はシリアルナンバーのシールの貼り付け位置が良かったので、ちゃんとDESIGNED IN IRELANDのシルク印刷が見える。
またしてもグラサンを付けたガリレオが「何を作る?」と誘惑している。(違う)
よもやこの2人のガリレオさんにタップリ悩まされる工作日記になろうとは、筆者を含めどのくらいの人々が予想していただろうか。
ハードウェアオーバービューは以前やったので、ザックリと割愛させていただきたい。
とはいうものの、やはりこの記事を読むのが初めての読者のために申し訳程度の解説を少々行っていきたい。
前回の自動給餌機作成までの顛末を読んだ読者や、Galileo開発ボードについてもう知っているという方は、この項は読み飛ばしてもらっても結構だ。
今回も、筆者のもとに届いたのはGalileo開発ボードであるが、この開発ボード、6月27日に発表が予定されているGalileo 2開発ボードではなく、従来のGalileo開発ボードである。
というわけで、ハードウェア構成としては、前回の記事で紹介したとおり、
- 586(Pentium)互換のQuark SoC X1000アプリケーションプロセッサ
- MicronのDDR3メモリ256MB
を軸に、内蔵のNORフラッシュに書き込まれた組み込みLinux上でArduinoの機能をエミュレーションしている。
NORフラッシュの位置。前回説明したところはフラッシュメモリではなく、SoC端子をArduino準拠端子に引き出すために必要なI/Oエキスパンダであった。
ArduinoでいうところのスケッチはLinux上で実行可能なELFバイナリにコンパイルされて実行され、電源を切るとスケッチは消失してしまうが、別途microSDカードを導入することによって、コンパイルしたスケッチはArduinoと同じように不揮発性となる。
また、Arduinoとは一味違い、色々とシールドを継ぎ足さなくてもいいように、初めからLAN, SD, Ethernet, USBホスト、更にはmini PCI Expressスロットが装備されている。そういうボードである。ちなみにArduino1.0配列に準拠しているこの開発ボードのピンであるが、この部分はCPUに直につながっているArduinoと違い、SoCからIOエキスパンダ経由で接続されている。
そのため、若干(というか結構)I/Oの速度は遅い。しかし、今回もメカトロ部分がメインになる開発記事になる予定なので、この欠点はさほど問題にならないと思う。
前回のボードと同様だから当たり前なのであるが、SoCの修正されていないバグやGPIOの遅さもそっくりそのまま健在だ。
今回は前回作成した給餌装置と似た機能をもつ、給水装置を作るのであるから、メインは恐らくメカニカルな部分を掘り下げる形になるだろう。ただし一つ重要な点がある。今回は水を扱う試作機を開発するため、浸水には十分注意が必要なのだ。せっかくの開発ボードが水でおじゃんになるのは筆者としても避けたいシチュエーションだ。
2枚並べてみた。都合上シリアルナンバーとMACアドレスは上に紙を貼ってマスクしてある。
開発にあたり、どれが1枚目でどれが2枚目か分からなくなる事態を避けるため、MACアドレスの16進数上位4桁を紙の上に書き、識別できるようにした。
MACアドレスはxx:xx:xx:yy:yy:yyと表せるが上位6桁(xx:xx:xx)はOUI(ベンダID)で、幸いなことに筆者のもとに届いた2枚目のボードは3桁目からが1枚目とは違う数字になっているので、これを判別方法の一つとする。
一つ目の課題
さて、1枚目と2枚目のボード間で情報をやり取りするために、筆者のチャレンジ内容としては通信方式として無線を申告したのだが、こいつが非常に厄介だ。
無線モジュールを買う手も考えたが、せっかくの電子工作、ありきたりなもので事を足らすのではなく少しオリジナリティを出したい、と筆者は考えた。
考えた結論としては
「2台のGalileo間をレーザー光線で通信する」
という(個人的には)無謀ともいえる方法に落ち着いた。
さて、ここからが大変である。
1台目を送信専用、2台目を受信専用機にして運用する予定なのだが、既に稼働している1台目のGalileo開発ボードのデジタルピンは5Vで動いている。これにレーザーモジュールを繋ぐと壊れてしまう(レーザーモジュールの動作電圧は3.0±10%(2.8-3.4V)、40mA以下である)。レーザーモジュールも1個しか持ち合わせがないので失敗が出来ない。
いきなりエクストリームである。
現在(2014/07/03)、I/Oピンの電圧とレーザーモジュールの許容電圧の範囲の不一致で開発が頓挫しているのが現状だ。
ぶっつけ本番
(2014/07/04)さて、電源の不整合でいつまでもふさぎ込んでいても仕方がない。
考えあぐねること1日。遂にレーザー通信送信部を作成することにした。
レーザーモジュールは半完成品で、赤い線が+、白い線が-なのでLEDと考えることが出来る。
要はここにIntel Galileoからの3v3端子とグラウンドから電源を供給し、適宜のタイミングでON/OFF出来るようにすればいいのだ。
で、ブレッドボード上に作り付けてみたのがこれ。
Galileo#2 LaserTx Module プロトタイプ
分かりにくいと思うが、レーザーモジュールの電源をIntel galileoの3v3端子から取り、定電流ダイオードで電流を制限し、なんと・・・
トランジスタでモジュールのON/OFF制御をしている。
この筆者の行動は
実に興味深い。
恥ずかしながら、筆者は今までトランジスタをハンダ付け以外で能動部品として作動させるために(この場合は増幅兼スイッチ)扱ったことが無かったのだ。
回路図としては単純なものになるが、この場合使用したNPNトランジスタはバイポーラトランジスタで、電流駆動タイプのため、ベースからの漏れ電流がエミッタに加算されていることも考えなければいけない。おそらく申し訳程度だが、定電流ダイオードからの電流18mAに加え、若干の電流も漏れている(盛れている)だろう。
しば は1レベル アップ した!(ファンファーレ)
Galileoの電源ラインの方の(ボード下部の)ピン、3v3端子からは最大で800mAまで出るとのことなので、最初はLEDを点滅させる通称「Lチカ」と同じく、電流制御抵抗を噛ませて制御しようと思ったのだが、電流の測定が手元のテスターでは上手くいかず(00.1mAとかいうふざけた値を出しやがる)、ショートしてボードがリセットしたり、LEDを何個か殺ってしまった。
そこで定電流ダイオード(※注:ダイオードと名は付いているが厳密にはダイオードでは無い素子だ。)を使って電流を制限し、点滅制御はGalileo開発ボードの上部ピンヘッダに装着されている13本のデジタルピンからトランジスタをスイッチと増幅器の兼用として制御する方法を採った。
(後日談:こういうデジタルな回路を分析するにはテスターでは歯が立たず、ロジックアナライザやオシロスコープが必要だ。しかし生憎筆者は相も変わらず貧乏なのでそれらの機械を持っていない。テスターと関数電卓、そして人類初の偉大な記録媒体、ノート(紙)を手にして、乱暴に勘ピュータで解決していく。
無謀にも見えるかもしれないが、古代の発明家エジソンやライト兄弟、電気法則を発見した学者なんかもきっとこんな感じだったのだろう。いやきっとそうに違いない。
彼らがRPG内で革の鎧と短剣(計算尺)しか持って無い戦士だとすれば、現代に生まれた我々は超高級の鎧、小手、結果を素早く出せる機関銃(計算機、電算機)を持った最強戦士であるのではないか。セレンディピティに出会えることを信じて続きに取り組んでいきたい。)
動作確認も無事に済んだので、改めてプロトタイプをリリースバージョン(基板)に起こしてみたのが以下の写真である。
手前味噌だが、なかなか表面はすっきりとした配線になっている。
制御用のデータピンはGalileo側で使っていない任意のピンが指定可能だ。入力はHigh/Lowの2値としてある。PWM出力時のレーザーの挙動の定義と実装をするのを忘れていたので、PWM出力時の振る舞いについては定義していない。使用時は十分注意して使う必要がある。
さて、当たり前であるが、このモジュール、ちゃんと発振してレーザー光を出してくれた。
コーヒーブレイクがてら、これを使ってかのジョン・レノンが感銘を受けたという有名な前衛的な作品、Ceiling paintingのオマージュにも挑戦してみた。興味のある方は以下の動画を参照していただけたら幸いである。
なかなかそれっぽくなっているではないか!
次なる課題
さて、レーザーモジュールの発光制御が出来たということで、次にレーザーを使っての通信プロトコルの実装などに着手したい。まだまだ今回の最終的なゴール、水やりのメカニカル部分へは程遠いが、コツコツとやっていくしかないだろう。
(2014/07/05ここまで)
あとは受光部と水やりのメカニカル部、水量検知部、臭気検知部を作成すれば今回の課題はクリアできる…はず。
いよいよ給水機構(タンク編)
さて、いよいよというかやっとというか、この試作機の要ともいえる「給水機構」の開発に取り掛かる。
最初はこんな感じで水が通る配管チューブ(矢印を描くのを忘れたので分かりにくいであろうが、この図だと左から右へ流れる)を重りで潰して給水を止める、或いは電磁石と鉄片でサンドするといった構造を考えたのだが、確実性に欠けるということで没になった。
台形が重り又は鉄片、一番下の四角形が台座または電磁石である。
配管チューブには容易に潰れて(変形して)くれるしなやかさと柔らかさが求められるので、ホームセンターで売っている量り売りのチューブではなく、これを使用した。
電気絶縁用の熱収縮チューブである。
潰れて変形してほしくないところには、ストローを鞘状に切り裂いてはめ込んでいる。(上部写真参照)
後で後述するが、上部写真に写っている排水管のココの部分はある特殊な工夫により、水の制御弁も兼ねている。
水をためておくタンクには、現代科学の粋を結集したこれを使用した。
何を隠そう(隠してない)、飲料水用のペットボトルである。
数多あるペットボトルの中からこれを選んだ理由は、元に入っていた内容物が猫に無害な軟水であったこと、そしてプラスチックの量をケチったことによるボトルの柔らかさ、つまり加工性の良さである。流石環境大国アメリカ、といったところか。
Making watering tank.
さて、ここからが濡れ場見せ場である。
まず、キャップを外し、中心部にφ2mm程度の熱収縮チューブを挿入する。
デモンストレーション用のチューブが無かったので、金属棒で代用した。
このようにチューブを刺す。
漏出の無いように、出来るだけキツキツなほうがいいだろう。
筆者は稼働する前に漏出確認のためにエアダスターを使用した。
チューブを刺し終わったら、水の漏出が起きないように接着剤や封止剤で穴の廻りを念入りにシールする。筆者は赤のホットボンドを使った。
次に、ボトル底部付近の気に入った場所に吊り下げ兼、通気用の穴を開ける。
予め鉄線を熱しておいて、PETボトルにブスッと刺してもいいかもしれない。(代替案)
ピアノ線が横一文字に通ったところで、ここに紐或いは釣り糸を通して吊り下げる。
出来上がったウォータータンクは釣糸で吊り下げているが、上図のようにピアノ線を通し、紐で吊り下げたほうがいいかもしれない。
最後に水を入れて、ふたを閉めるとウォータータンク部分は完成である。
出来上がり。ちゃんと水も入ってます!!
さて、次は水の流れを止めたり開いたりする「止水弁」部分の製作だ。
電磁ポンプなどの方法も考えたが、すぐに錆びついて使い物にならなくなるだろうし、機械油が水に混じりこんでしまっては猫も飲んでくれない。
テーマがガリレオということで、某ドラマを見たり、林檎を食べてみたりすること数日、ふと素晴らしいアイディアが脳内にひらめいたので、ここで紹介したい。
先ほど一悶着あると言っていた止水弁の部分だ。
ちなみにこの状態では「給水」状態だ。ペットボトルから水が供給される。
確かに、これだけ見れば
「管が1本あるだけ」
にしかみえない。
では、この管の何処が「止水弁」なのか。答えは下の写真で判明する。
この状態が「止水」状態である。
先ほどとどう違うのか?
答えにつながるヒントは「給水」状態よりも管の折れ曲がり角度が大きいところと、折れ曲がり部分がウォータータンクより高い位置にあることにある。
実はこの管、よく写真を見てもらうとわかるのだが、径の大きい管の中に先ほどのウォータータンクから出ている「φ2mmの管」を突っ込んでいるのだ。
こうすることによって、給水状態ではウォータータンクの通気口を通して掛かる大気圧と重力により、水が供給され、止水状態では管の中に管が入っている部分が完全に折れ曲がり、水の供給をストップしてくれるのだ。すべてはつながった!!
給水、止水に大きな動力を必要としない、自然エネルギーを利用した効率の良い方法が完成した。
給水タンクを駆動させよ!
さて、今回の試作機編では、給水タンクを上げ下げすることによって、給水と止水を制御させる方式を採った。
いよいよ給水タンクをきちんと動かすための仕組みを作っていきたいと思う。
タンクの吊り下げと吊り上げをどういった方式にするか、これは悩みどころである。
そこでこんなものを買って解決しようと試みた。
前回と同じく、ギヤボックスによりモーターのトルクを稼ぐ方法だ。
但し前回のギヤボックスとは違い、ハイパワーのモーターを積めるタイプだ。
筆者としては、滑車がわりのものを使ってモーターで巻き上げ、巻き戻すという作戦を練ったのだが、これが厄介だ。何せ前回とは違い、負荷荷重が半端じゃないので、タンクを引き上げるためにギアボックスを固定しなければならない。一応手で押さえると固定することはできるが、24時間365日手で押さえているわけにもいかない。
三日三晩考えた結果、この結論に達した。
筆者が原稿を執筆している椅子の裏側にタイラップで固定した。
椅子自体は数kgもの重さがあるので、ちょうどいいのだ。
この辺りは生活スタイルに合った物にギアボックスユニットをくっつけたので、ギヤボックスを固定する場所は各人によって異なるだろう。
椅子の下から出ているVFFケーブルはギヤボックス内のモーターの延長コードだ。
椅子上部に出ている緑の線はハメコミ合成ではなく、ナイロンのビニールロープだ。
タコ糸やテグスなど、いかにも物を吊り下げるのに適した材料も試してみたのだが、この材料に収まった。何より安価であるし、後述する滑車がわりの部分となるところとの摩擦が少なく、巻き上げに専念できるのか嬉しい。スペアのビニールロープ糸を準備しておけば万一の時の修復も簡単だ。
で、これが滑車がわりになる部分だ。
何の変哲もないカーテンレールである。
アルミっぽい合金でできているし、もともとカーテンを吊り下げるものだからウォータータンクの数百gの荷重などにもびくともせずに耐えてくれるのがこれまたうれしい誤算である。
さて、あとは制御プログラムと臭気監視、1枚目との通信、という課題をクリアすれば粗方完成が見えてくる…!
部品を発注したのだが、まだ届いていないため、今日(2014/07/09)はここまでになってしまった。申し訳ない。
部品が届いたよ!(1回目)
2014/07/16
さて、台風が明けた次の日、部品が届いた。筆者としても待ちわびた瞬間である。
作って遊べるArduino互換機のパーツセットを買ってArduino互換機を作ったり、AE-ATMegaマイコンボードキットを作ってArduino化して早速2台のArduinoを組み上げた。(ただハンダ付けしただけだろというツッコミは無しの方向で(^^;))
それに、今回の試作機で気になった点などを書き留めておくノートがめでたくページ一杯になったので、研究ノートが2冊目に突入した。
本邦初公開!?これが研究ノートである。
ちなみに、電子系の工作やプログラムソースなどを書くときはB5よりもA4ノートのほうが断然使いやすい。
覚えておかなければならない事を書き留めたり、ふと浮かんだ「いけそうな」アイディアを書いていくと自然と枚数も増加する。
日付やページ番号も振ってあるので、どこぞの研究リーダーなんかよりも余程優れていると思う。
ちなみにこのページのプランでは頁上部にXbeeモジュールを使うとか書いている。素直にモジュールでも使っておけばよかったかな、と今少し後悔している。
モジュールを使わず敢えて「茨の道コース」を選んだのは、こっちの方が苦労した分面白くなるだろうと踏んでの筆者の挑戦である。
また、9歳からハンダごてを握って工作したことのある筆者のちっぽけな意地も少し…ある。
さて、まだこのページに書かれている受信モジュールが完成していない。
では臭気監視部分はどうかというと、ガスセンサは届いたものの、電源電圧の制限とON時間の制限で苦労している。
一応ガスセンサで値を読み取るスケッチは書いたので、研究成果として、ここに添付しておく。
/* TGS2450 Test program.
// (c) 2014 Shiva/R (A.Fujimoto)
// blog : http://physicalelec.blogspot.jp/
// E-Mail : see my first page of blog article.
// License : GPL v3
*/
// declare variables.
const int heaterPin = 3; // pin No. for heater on TGS2450.
const int sensorPin = 11; // sensor pin out to TGS2450.
const int odorPin = A0; // sensor output to Arduino AnalogIn pin.
const int pwmOffset = 81; // 81 : 1.588v / 82 : 1.607v
const int selector = 1; //write method: 0 for digital, 1 for analog.
int odor;
// In each cases...
//出力ピンを1.6Vまで落とす必要あり。
//
void setup(){
pinMode(heaterPin, OUTPUT); // initiate heater pin as output.
pinMode(sensorPin, OUTPUT); // to work sensor well.
pinMode(odorPin, INPUT); // read sensor from analog in.
Serial.begin(9600);
// first, turn off TGS2450 sensor.
digitalWrite(heaterPin, LOW); // turn off heater on TGS2450.
digitalWrite(sensorPin, LOW); // turn off sensor on TGS2450.
}
void loop(){
switch(selector){
case 0: // needs voltage modification.
//
//出力ピンを抵抗分圧等で1.6Vまで落とす必要あり。
//
digitalWrite(heaterPin, LOW);
digitalWrite(sensorPin, LOW);
delay(242); // sensor and heater off to protect device.
// measure odor.
digitalWrite(heaterPin, HIGH); // heat for 8ms.(5 for sensor,+3 additional heater.)
digitalWrite(sensorPin, HIGH);
delay(5);
odor = analogRead(odorPin); // read odor sensor value.
digitalWrite(heaterPin, HIGH);
delay(3); // end heating the heater.
break;
case 1: // an alternative method with PWM voltage control. (not accurate?)
digitalWrite(heaterPin, LOW);
digitalWrite(sensorPin, LOW);
delay(242);
analogWrite(heaterPin, pwmOffset);
analogWrite(sensorPin,255);
delay(5);
odor = analogRead(odorPin);
analogWrite(heaterPin, pwmOffset);
delay(3);
break;
default:
Serial.println(odor);
}
}
まず最初にTGS2450(ガスセンサ)の電源を切っておく。
次に、250ms中、8msの間ヒーターをONに、その8msの間の最初の5msの間、センサ部分をONにして値を読み取る仕組みだ。残りの242msはヒーターをONにしてはいけない。センサ部分も残りの245msの間はONにしてはいけない。これが1サイクルなので1秒間に4回実行される計算になる。スケッチ実行上のピン切り替え、命令実行のオーバーヘッドは微々たるものだろうと予測されるのでソコのところの処理は、筆者としても迷ったのだが、思い切って省略した。
スケッチのコメントにも書いてあるように、TGS2450のヒーターは1.6Vで動作し、ヒーター加熱時間、センサ駆動時間もシビアなので現在どう料理しようか悩んでいるのが現状である。
2014/07/17 ~ガスセンサと格闘~
昨日書いたスケッチにバグが沢山あったので直してみた。例によってスケッチ自体は長文になるため、少し文字を小さくしてみる。この項が不要だという方は読み飛ばしてもらっても結構だ。
今回は実際にガスセンサを動かすところまでやってみた。(※後述、あまり期待しないように(^^;))
/* TGS2450 Test program.
// (c) 2014 Shiva/R (A.Fujimoto)
// blog : http://physicalelec.blogspot.jp/
// E-Mail : see my first page of blog article.
// License : GPL v3
*/
// declare variables.
const int heaterPin = 3; // pin No. for heater on TGS2450.
const int sensorPin = 11; // sensor pin out to TGS2450.
const int odorPin = A0; // sensor output to Arduino AnalogIn pin.
const int pwmOffset = 81; // 81 : 1.588v / 82 : 1.607v
const int selector = 1; //write method: 0 for digital, 1 for analog.
int odor; // store sensor value.
int led = 13; // working LED.
// In each cases...
//出力ピンを1.6Vまで落とす必要あり。
//
void setup(){
pinMode(heaterPin, OUTPUT); // initiate heater pin as output.
pinMode(sensorPin, OUTPUT); // to work sensor well.
pinMode(odorPin, INPUT); // read sensor from analog in.
pinMode(led, OUTPUT);
Serial.begin(9600);
// first, turn off TGS2450 sensor.
digitalWrite(heaterPin, LOW); // turn off heater on TGS2450.
digitalWrite(sensorPin, LOW); // turn off sensor on TGS2450.
digitalWrite(led, LOW);
}
void loop(){
switch(selector){
case 0: // needs voltage modification.
//
//出力ピンを抵抗分圧等で1.6Vまで落とす必要あり。
//
digitalWrite(heaterPin, LOW);
digitalWrite(sensorPin, LOW);
digitalWrite(led, LOW);
delay(242); // sensor and heater off to protect device.
// measure odor.
digitalWrite(heaterPin, HIGH); // heat for 8ms.(5 for sensor,+3 additional heater.)
digitalWrite(sensorPin, HIGH);
digitalWrite(led, HIGH);
delay(5);
odor = analogRead(odorPin); // read odor sensor value.
digitalWrite(heaterPin, HIGH);
digitalWrite(led, HIGH);
delay(3); // end heating the heater.
break;
case 1: // an alternative method with PWM voltage control. (not accurate?)
digitalWrite(heaterPin, LOW);
digitalWrite(sensorPin, LOW);
delay(242);
analogWrite(heaterPin, pwmOffset);
analogWrite(sensorPin,255);
digitalWrite(led, HIGH);
delay(5);
odor = analogRead(odorPin);
analogWrite(heaterPin, pwmOffset);
digitalWrite(led, HIGH);
delay(3);
break;
default:
break;
}
Serial.println(odor);
digitalWrite(led, LOW);
digitalWrite(heaterPin, LOW);
digitalWrite(sensorPin, LOW);
}
赤字で示したように、スケッチのloop()メソッド内のラストで、センサを切るのを忘れていた。
早速、ブレッドボード上にテスト回路を組み、PWM出力モードで動かしてみた。
このように組み立てた。黄色の線がセンサに、赤色の線がGalileo側のデジタル出力ピンから出る5VのPWMで疑似的に1.6V、青色の線がGNDとなるように組み立て、スケッチを転送し、出力が安定したところでガスセンサ(ブレッドボード上の丸い部品)の上にあるスイッチをONにして作動させた。
これで動けば大幅な回路節約になる…と期待していたのだが……。
センサの値をシリアルモニタに出力。
今はまだプロトタイプなので、TGS2450からのセンサ出力をシリアルモニタ上に表示するようにして、シリアルモニタを起動したのだが、うんともすんとも言わない。センサに匂いのあるものを色々と近づけたのだが、それでもダメ。
正直これで動けば、電子工作は簡単なものと認識され、ホビイスト人口ももっと増えていた事だろう。こんなんで動けば奇跡以外の何物でもない。(何)
ここでアナログピンの値が1023で連続していることに気づき、すぐにスイッチを切った。
ガスセンサであるTGS2450はヒーター電圧印加時間が8msと決まっているのだ。
もちろんスケッチでもそのように書いたが、ADCの値が1023というのは即ち、アナログピンにかかっている電圧が5Vということを意味している。(Galileo(Arduino)のADC分解能は10bit)
センサを一つ殺ってしまったかもしれない。またもや筆者絶体絶命である。
電源を切って冷静になった後、Galileoの仕様書を探ってみると、ピン1つあたりにつき、高々20mA位しか出力できないと書いてあった。
思うに、異臭もしなかったことから(駆動に成功した先人たちのWebページを見ていると、初回起動時には検知化合物半導体を熱するので「何かが焼けたような臭い」がするそうだ。臭いセンサなのに臭いを出すとは…。)、Galileoからのデジタル出力ピンからはヒーター駆動が出来なかったのではないかと推測する。
また、それから察するに、駆動できていないので壊れていないのではないか、と判断しこの部品を再利用してきちんと駆動させてみたい。
2014/07/18 ~ガスセンサモジュール組み立て~
悩んでいても始まらないので、前回のガスセンサを基板上に組み立て、センサモジュールを作る。
本当は自分で回路も作りたかったのだが、
- どのようにしたら1.6Vを作り出せるか(これはLM317などの3端子レギュレーターを使えばどうにかなりそうだ)
- トランジスタのスイッチ周りをどうするか(くどいようだが8msだの5msだのといったヒーターとセンサ回路の制御時間がシビアなのでスライドスイッチなどが全く使えない。)
といった課題や、何しろオシロスコープもロジックアナライザも持っていないため設計しても回路の動き(センサが動いているか)を確認できない問題点が発覚した。
そして極めつけは電子工作初心者の筆者の経験不足の露呈だ。こんなのでマトモな回路が設計出来るわけがないではないか。(←)
その為、今回は後ろ髪を引かれる思いで、仕方なくラトルズから発刊されている「ボクのArduino工作ノート」より、殆どリファレンスの回路図でユニバーサル基板上に回路を作った。本稿末の参考文献や謝辞の項目でも申し上げるが、著者の鈴木哲哉氏に感謝申し上げる。
とりあえずリファレンス通りに部品を取り付けてみた。
317でセンサの電圧である1.6Vを生成し、Galileoからのデジタル出力から2つのトランジスタに入力し、ヒーター、センサ回路のスイッチングを賄う。
裏面はこのようになっている。
まだ途中だが、部品の間隔が狭かったため、かなりいっぱいいっぱいである。
そして半田面が汚い。
写真を見てもらうとわかるが、部品配置の時に急いで部品を基板の中央に配置しなかったせいで、ひどく扱いづらい配置になった。レイアウトも重要だということを思い知らされた。
ハンダ付けもしづらく、ブリッジすることも多々あったが、この調子でハンダ付けしていく。
余談だが、ぐるぐる巻きになっている配線材はこのように、吸い取りの終わったハンダ吸い取り線で留めると扱いやすくなる。廃材の有効利用である。
この間約数時間。やっと完成である。半田面が凄く汚い。(本当は見せたくなかった(^^;))
製作中は、コテの劣化もそうだが、使用したユニバーサル基板がどうやら吸湿などで劣化していてハンダのノリは悪いわ、ちょっと無理な力を掛けたらランドが剥がれるわで散々だった。
と、まあそのような紆余曲折を経て、この突貫工事的な基板デザインの所為で、完成したセンサーシールドはこんな感じになった。
なんと、8ピンからの配列しか組まれていない。
しかも縦長のシールドになったため、このシールドを載せてしまうと他のシールドが一切載せられない。まあ2枚目のボードは水量と臭気監視だからこれでも一応どうにかなるのだが…
赤のワイヤーはGalileo開発ボードの5V端子に、黒はGND端子に、緑はアナログ入力端子につなぐ。
次に、製作したシールドをArduino上に装着する。
Galileoに載せる前にArduinoを使う理由は主に2つある。一つはボード破損防止のためで、もう一つはピン配置のレイアウトや追加できるアイデアを見て考えるためだ。
センサーシールドを取り付けるとこのようになる。
孫シールドを取り付けられないという、互換性が低いシールドになってしまった。
3端子レギュレーターのLM317があられもない姿になっているのは、一度部品を外したからである。ニッパーでピンを切断して摘出した後、揚げ足取り法(個人的に使っている用語です。足の根元に何かする事から、筆者は便宜上こう呼んでいます。)でスズめっき線を接続した。これにより317の故障を判定することもできるし、ブレッドボードで実験もできるのだ。
それでも筆者なりに頑張って、Analog1~5と
Digital0~6までは引き出せるようにデザインした。
(ホントは縦長シールドのデザインになってしまったことによる副産物であるが、嬉しい誤算ではある。)
さて、センサーシールドについての作製記と前振りはこのくらいにして、早速スケッチを書き込み、シリアルモニタ上で実行してみた結果が以下のようになった。
なんと、筆者の予感的中である。動かない。
いや、正確には動くのだがまともに動かないのだ。
センサモジュールの電源(2枚上の写真の15列目に配置してあるスライドスイッチ)OFF時でアナログピンの値が5(0.024V)で安定しているのはまあ想定の範囲内として、電源ON時で測定している値の最大値が7(0.034V)までしか行かない。
さて、どうしよう。またもや問題発生である。分析と考察を繰り返し、ハード的な面でデバッグする必要がある。骨の折れる作業である。
読者には申し訳ないが、とりあえず今日はここまでにしたい。
(続く)
2014/07/20 ~ガスセンサモジュール・解決編~
本当は19日に上げて20日に基板を起こしたかったのだが、筆者は原因究明のために遠出をしたりしたので、少し遅れてしまった。まあ最終締切期限が8/31なのでまだまだ大丈夫だろうとは思うが、油断大敵である。
さて、閑話休題。話を元に戻そう。
18日に作成したガスセンサモジュールであるが、ご覧のとおり全く動かなかったので部品屋まで足を運んで原因を探っていた。
その結果、ハンダ付けの不良(盛りすぎ)と熱による破損(熱しすぎ)だということが判明した、また、このようなものを作るときは基板に起こす前にブレッドボード上で実験をせよ、とのありがたいアドバイスを頂いた。
帰宅後、早速ブレッドボード上にガスセンサモジュールの回路を組み立てる。
背は高くなるし、ジャンプワイヤが沢山いるが、プスプスと穴に部品を刺していくだけで基板と同じ働きをするのだから、便利なものが出来たものだ、と実感する。
最近では、裏面にブレッドボードのパターンが印刷されたユニバーサル基板が販売されている。
線間容量や発振はしないのかどうか、そこのあたりが少し気になるのだが、小規模なものならそれを使ってもいいかもしれない。
プロトタイプ完成である。
いろいろ工夫してます。
工夫した点
- スケッチが動くまでピンの値が不定だったらずっと回路がONになってしまうので、入り口にスライドスイッチを付けた。
- 定電圧レギュレータICのLM317はそのままでは基板に入りづらかったので、ピンヘッダを3列カットして先端に付けた。
左上が5V供給部だ。
右下はグランドだ。
少し見にくいが、ガスセンサのピンの下部分に差し込まれているのがアナログピンへ行くためのセンサー出力だ。
早速実行してみると、このようになる。
末尾の数字がセンサの値だ。
ガスセンサ自体についてだが、初回駆動時の立ち上がりが結構遅く、値が安定するのに20~30分も掛かった。2回目以降はガスセンサのデータシートから読み解くに、初回駆動でガスと反応する半導体部分の表面に酸化膜が形成され、活性化状態になったため、安定するまで2,3分で終わる。
ちなみに、これが今の筆者の環境での空気の汚れ具合だ。(0~1023までの1024分割での値)
875/1023と出た。
最近掃除をさぼっているのも汚染度が高くなった一因であろうが、やはり一緒の部屋で居住しているため、猫の蓄積された動物的な臭いがそのまま通常状態の環境になっている。
筆者は毎日猫の世話をしているので鼻がもう慣れてしまったのであろうが、やはり機械は精確だ。
くさいものはくさいとハッキリ言ってくれている。
875というと、どのくらいになるのだろうか。
ともあれ、中ボスである「ガスセンサモジュール」は、この段階で半ば倒したのと同じ状態になったといえる。あとはこのプロトタイプを基板に起こしてリリースバージョンに仕上げると臭気監視部分は完成だ。
2014/07/20 ~ガスセンサモジュール・解決編~
さて、失敗ばかりを書いてるこの記事を読んで半ば飽きてきた方には朗報だ。もちろん普通に読んでいる方にも朗報があるのでお伝えしたい。
7月19日のガスセンサであるが、モジュールが完成したのでその過程を説明したい。
部品を配置する。
紙エポキシの基板を使い果たしたので、今回からガラスエポキシ基板での作成である。落ち着いた高級感と、曲げや割れに強い強靭性が魅力的だ。しかしガラスを浸み込ませている構造上、加工性は悪いので、もし加工するならば十分注意する必要がありそうだ。
部品を配置する。ちなみにこの部品のうち、トランジスタ以外のすべての部品を、失敗した(2項目前を参照)センサモジュール基板から拝借した。
裏面はこんな感じだ。ブレッドボードから基板を起こしたので、縦配線が多くなっている。
この基板も例によって工夫した点がいくつかある。
- 2穴幅ほどの縦配線は半田ブリッジで配線した。
- ブレッドボード上で導通している方向に離れた部分に挿したピンは極力最短距離で配線した。
- 長い縦配線は、部品のあまりのリード線を配置して極力ハンダの量を節約した。
- 電源用ケーブルとセンサー回路用ケーブルは切れないように途中で結び目を作り、ロックした。
黄色のケーブルはどっちがどっちにつながるか分かるようにラベルを貼って…
ラベルを貼って完成!
(テープライターを打ち間違えて「ュ」が無いのは秘密だ(^^;))
いやー、ここまで長かったが、これでセンサモジュールが完成した。今回はシールドの形にせず、配線していくタイプの拡張ユニットの形にした。
早速動作確認をしてみる。ガスセンサは硫黄系化合物に特に強く反応するそうだから、こんな形で動作確認をしてみた。
シリアルモニタ上にCSVデータを生成するようにスケッチを書き換え、任意の区間で表計算ソフトに貼り付けてグラフを作成した。
グラフを見るに、通常時は3~5/1024の範囲で振動し、安定している。反応時は16秒程かけて最高値の721まで跳ね上がっているのが分かる。ピークになったところで臭気を掛けるのをやめたので、そこからだらだらと40秒程かけて、通常値まで下降している。
回路の配線長の見直しなどの結果として、ブレッドボード上でのプロトタイプの振る舞いと違い、リリースバージョンは通常時の臭気レベルが170ほど減少した。
ちなみに全ての区間において一定区間ごとに0~4ほど値がフラつく。ついでなので、この時の差分(ある時間においてのセンサの値 - ある時間の一つ前の時間においてのセンサの値)もグラフ化してみた。
最も多いのは通常時の0~2の増減で、反応時には単位時間ごとにどんなに頑張っても+3程度が限界だ。
このことから、臭いセンサは確かに臭いを検出できるものの、近くの臭気でないと急峻な変化を感知できない事、また立ち上がりが結構遅いため、定期的に雰囲気臭気を測り、前回と比較する方法を採ると検出できることが証明された。
2014/07/21 ~ガスセンサモジュールはGalileo上で動くか~
さて、今回の試作機作製に関して、必要になるモジュールやシールドなどの製作と確認にはArduino Uno
を使用してきた。
ガスセンサも無事動いたところなので、臭気監視のスケッチをコンパイルにかけて、転送する。
・
・
・
コンパイルが通らないではないか。
実は、このページに書いた突貫工事ソースではなく、より正確なコードを書籍を参考に書いてコンパイルしていたのだ。
その為、Galileoエミュレーション層側でbitSetやanalogReference(INTERNAL)など、AVRマイコンを前提としたハードウェア層レベルでの操作が出来ず、コンパイラが通らなかったのだ。
そこで、このようなものを作ろうと計画している。
名付けてMoM Moduleである。
MoM :Module on Module.とは、今とっさに決めた造語である。
Arduino互換のGalileo外箱に描かれているガリレオのイラストから発想した。
ガリレオ・ガリレイはイタリア人
↓
Arduinoはイタリアで生まれた製品
↓
イタリア人は家族を大切にする(特に母親系が重要らしい)
↓
Mommy
↓
MoM(短縮)
こんな感じで決まった、実に安直である。
実は…Arduinoで動くModuleがGalileo用としてのModule基板に載っている。という後出しジャンケン的な意味付けもあったりする(^^;)
モジュールの中にモジュールを格納するためにATMega328Pなどの部品を買った。
残機数(チップの余りの数)があと5個しかないが、まあ何とかなるだろう。(←
勘のいい方ならお気づきかと思うがPoP Moduleは無いの?というツッコミにお答えしよう。
答えは、作ろうと思えば作れるだろうがアクロニムを考え出す余裕も必要性もないので、無い。
もう一つの理由としては、PoPなんて略すると別の用語になってしまうからだ。
MoM Shieldをどうやって作るか、現在考え中である。
2014/07/21 ~中間報告~
とりあえず、中間報告として、今現在で完成している項目は
- トランジスタで制御するレーザー送信部分(受光部はまだ)
- 給水機構メカニカル部分(ソフト側はまだ。)
- 臭気監視のハードウェア部分(ソフト側は途中)
この3つだ。今回はかなり難産だが、最終期限までに間に合うだろうか。
少し不安を覚えている筆者である。
2014/07/24 ~Arduinoをシールド部品に落とし込め!~
先日、苦労して作ったものの、そのままではGalileo上で動かないガスセンサモジュールをどう解決するか、という課題への回答として、筆者が考えたMoM Shield(若しくはMoM Module)という案であるが、具体的には次のような条件を満たすものとして、開発を進めていくことにした。
- 電源はGalileoから拝借する。(条件がシビアなら外部電源でも可能とする)
- MoM ShieldはArduinoスケッチのAVRマイコン用のバイナリをネイティブ実行する。
- MoM Shieldが処理した結果をGalileoに渡す。(なるべく少ないピン数で。)
上記の処理を実行するにあたって、一番必要なのがArduino用のブートローダーを焼きこんだAVRマイコンチップだ。市販のものできちんとoptibootが焼きこまれたチップが販売されているが、筆者は第1弾レビューの時の開発資材として購入させていただいた
- 書籍「作って遊べるArduino互換機」付属基板
- 秋月電子通商から調達した書籍用のパーツセット
この2点を用いて、完成後の製品に使用されているUSB-SerialインタフェースICであるFT232RLのBit-Bang ModeとBit-Bang Mode版avrdudeを用いてブートローダー焼きこみ済みのATMega328P-PUを大量生産した。(といってもまだ2,3個くらいだが(^^;))
optiboot焼きこみ済みATMegaチップ量産の図。
Fuseの値はMCUによって違うことを付記しておく。Mega328Pなら上図の様にセットして、ブートローダーを「Erase-Write-Verify」ボタン押下で焼きこみます。フラッシュメモリなので少々失敗しても大丈夫だ。
上図に焼けました。
この調子で何個か作っていく。
一通り予備も含めて作り終えたら
マイコンICにラベルを貼ってブレッドボード上で扱いやすい形にまで落とし込み、フットプリントを縮小する。
adafruitから提供されているラベルを貼ると、なんということでしょう!本来Arduinoの上部と下部に装着されていたピンソケットと同じ働きをするピンが殆ど出ている。
回りくどい書き方になってしまったが、MoM Shield/Moduleの目指さんとしている物は、Arduinoに使われているATMegaシリーズのマイコンを軸に、Galileoだけでは賄いきれない、或いはGalileoには勿体ないといった、低レベルの処理を受け持つ、いわばコプロセッサみたいなボードである。
例えていうと、MPU基板の上にさらに補助MCUを載せる案である。486時代のWeitekのコプロみたいなものだ。
ん?コストが高くなって実用的でない?
趣味の電子工作の範囲だからあまり関係ないのだ。(キリッ)
取り敢えず、一番最初に作る記念すべきMoM Module/Shieldは、周囲の空気のにおいを感知するガスセンサモジュールを駆動させ、顕著な変異があればGalileo側に伝える通信役のModule/Shieldを作っていきたい。
臭気をインプットとしてとらえ、大規模な変化をアウトプットとしてGalileoに報告することから、このMoM Module/Shieldの名前はガリレオ衛星から「イオ(I/O)」と名付けた。
MoMモジュールがいくつできるのかは今後の課題の進行具合にもよる。ガリレオ衛星に合わせて4つも作るのはそれはそれで面白いのだが、Galileoで出来ることは極力そちらに任せたい。
早速、「イオ」をModuleの形に落とし込むために、Arduinoとしての中核部分を抜き出した。
マイコンICにラベルを貼ってブレッドボード上で扱いやすい形にまで落とし込み、フットプリントを縮小し、中核部分だけで構成されたArduinoを作成する。
adafruitから提供されているラベルを貼ると、なんということでしょう!
本来Arduinoの上部と下部に装着されていたピンソケットと同じ働きをするピンが殆ど出ているではないか。
これが、表題に書いた「Arduinoをシールド部品に落とし込め」に対する筆者の回答だ。Arduinoを名乗れこそしないものの、MCU内のソフトは紛れもなくArduinoスケッチだ。出力も、しかるべきピンから出る。
動作確認として、Arduino IDEのスケッチの例に登録されている"Blink"を焼きこんだ。発振子と電源、LEDを繋ぐとこの石一つだけでもLEDがチカチカ動くのだ。
あとはこれにガスセンサモジュールの値の変動を監視するスケッチを描き、Galileo側に報告する仕組みを考え、Galileo側の受信部分を作りこんでやればMoM Module"I/O"は完成する。
2014/07/25 ~MoM Module"I/O" プロトタイプ~
さて、そうこうしているうちにMoM Moduleの「I/O(イオ)」のプロトタイプを作った。
今回のモジュール作成では
このキットに入っているブレッドボードでは幅が足りなかったので、
筆者の持っている別のブレッドボード上にプロトタイプを起こした。正直このサイズのブレッドボードを本格的に使うのはこれが初めてではないだろうか(^^;)。
臭気センサモジュールからの信号をスケッチの書かれたATMega328Pで処理した後、LCDに表示している。臭気の変動がある一定より上回る変動をすると、左下のLEDが光る仕組みだ。黒いタクトスイッチはLCDのバックライト点灯用、白いタクトスイッチはMoM Moduleのリセットボタンだ。
実はLCDもプロトタイプと基板バージョンの動作確認のためだけにあるようなもので、実質Galileoに行くデータはマイコンチップのピン19(Arduinoで言うところのDigital 13)のHigh/Low信号しかない。
回路図はこんな感じになる。
少しぼやけたが、大体はわかるだろう。
実はクロック生成源として水晶振動子を選択したのだが、発振部分を推奨回路図通りにGNDに落とす回路にしてみると上手く発振せず、マイコンが動作しなかった。
十数pFオーダーのセラコンを持っていなかったので、0.1μFの積層セラミックコンデンサで代用した。こんなのでいいのだろうか?
発振回路の設計がその筋の方に言わせるとタコな感じもするが、動いたのだからそれでいいのだ。ましてや私はプロではなく、一介の趣味人なのだから。
ここは電子工作を楽しむうえでも、下手に悩んで時間を浪費せずに効率を上げるためにも、細かいことは気にせずご都合主義的に大胆に行こう。
と、ここまではよかったのだが、プロトタイプを基板に起こすと発振しなくなった…。
設計の甘さが見事に露呈してしまった。
なかなか動いてくれないので、またもや筆者は足止めを食らっている。
2014/08/05 音声で飼い主に状態を伝えよう。
大変長らく更新が滞って申し訳ない。実はこんなものを頼んでいて、猫の状態変化を飼い主に伝える方法を模索していたのだ。
Aquest社製のAquesTalk Picoという音声合成エンジン搭載LSIである。
実はこれ、普通のATMega328PにAquest社謹製の音声合成ファームウェア、AquesTalkをマイコン上で動作できるようにしたPicoバージョンを焼きこんだ製品なのだ。
Arduinoのブートローダー部分が音声合成エンジンに置き換わったものだと考えてくれればいいかと。ちなみに、AtmelのATMegaシリーズは全品Flash ROM採用なので、万が一このチップをイレースしてしまうとただのATMega328Pになってしまう。あと、音声合成を目的として設計されたチップなので、ブートローダーを焼きこんで使うといったことは出来ない。
わかりやすく書くと、初音ミクやゆっくりボイスをワンチップ化したものだ。
こんなものだが850円もする。生のAtmega328チップが250円なので、ファームウェアで600円も取られている計算になる、だが侮りがたし、さすがというべきか、アクセントをきちんと指定してやると、結構人間っぽい声でしゃべってくれる。
とはいうものの、筆者が購入したのはよりにもよって「ロボ声」のAquesTalk Pico LSIなのでちょっと違和感があるのだが、今回の試作機では猫の状態を機械で監視するのがメインなので、大体雰囲気的に合っているのではないだろうか。
これを適当なArduino(互換機でも可)のマイコンと入れ替え、シリアル通信で喋らせるのだ。
喋らせる内容は無愛想&言葉遣いが少々汚いが、上記画面のように、
「猫が糞をしました、早く交換してください。」
とした。
このチップはRC発振によって、自己発振するようにファームウェアを焼かれているので、別途発振子は必要ない。
Arduino側のDigital PWM#6ピンとグランドにスピーカーを繋げば音が鳴る。
ただ、直接スピーカーを繋いだだけでは音量が不足するので、共鳴させてなんちゃってバスレフ仕様に加工した。
エンクロージャーを設計する余裕がなかったので、共鳴箱はペットボトルの下半分をかぶせただけの即席エンクロージャーである。こんななりでも無加工時と比べると立派に鳴ってくれるのだ。
さっそく、鳴動させたところを動画に撮ってみたので、お聞きいただければ幸いである。ちなみに動画撮影時はマイクをスピーカーに向けたので、映像は映したくても映せなかった。
またしてもミネラルウォーターのペットボトル、大活躍である。
音を増幅するため、トランジスタでアンプを作ることにした。
正直上手く増幅出来ているかが微妙な出来になってしまった。またしても筆者の経験不足がこういう形で露呈してしまい、読み辛くなってしまったことをお詫びしたい。
現在、AquesTalk Pico LSIをArduinoなしで前述のMoM Moduleのようにする手段と、MoM Moduleによってスタンドアロン化したAquesTalk Pico LSIにメッセージを送信し、発生させる方法、アンプ回路を研究中である。残された時間はあと20数日、頑張れ筆者である。
2014/08/05 ~簡易アンプ完成~
さて、先ほどの失敗回路を眺めること数時間、トランジスタによる簡易アンプが完成した。
こちらも例によって、動けばいいタイプの即席回路だが、これでもきちんと増幅してくれている。
原理としては2SC1815を1石使い、エミッタを接地、Arduinoの5V端子からブレッドボード上の電源ラインに+Vを引き出し、途中にスピーカーを噛ませてコレクタに接続、AquesTalk Picoの音声出力(Arduinoに装着した状態だとデジタル6番ピン、生のAquesTalk Pico LSIのピン番号だと12ピン)をベースに接続し、制御している。トランジスタはhFEという増幅率があり、簡易アンプで筆者が使用したのはGRランクといって増幅率の高いものの選別品なので、これを使用した。
実を言うと、筆者はまだ完ぺきにトランジスタの原理を分かっていない。
トランジスタの回路図から見るに、コレクタからエミッタへ電気が流れるのをベース電流で制御する、ということぐらいしかわかっていないのだ。本物の回路設計者から見ればトホホな回路であろう。
1石簡易アンプ。
それでは、これによって増幅された音を早速アップロードしてみたので、聞いていただければ幸いである。ちなみにメッセージも文面をきれいにして発生させなおしてみた。
前回と違い、音が大きくなって違いがはっきり分かるようになった。
実はこの簡易アンプ、極限まで配線を落とすとここまで簡略化できる。本当はベースの前とエミッタの後ろに抵抗を入れたほうがいいのだが、入れると音量が小さくなってしまったのでこのままにした。
ここまで来ると空中配線でスピーカーとアンプを一体化できそうだ。
かくして、アンプ部分が完成した。次なる課題は、この音声合成LSIを単独で動かすことだ。
2014/08/05 ~MoM Module"I/O"と音声合成LSI単独駆動報告~
さて、若干グダグダ気味で読むのが疲れた読者に朗報をお伝えしたい。
この度、プロトタイプ完成を報告したままおざなりになっていたMoM Moduleであるが、完成した。
百聞は一見に如かずということで、早速写真を見ていただければ幸いだ。
あちゃー、若干ピンボケになったが許してほしい。
Arduino用のピッチ配置の基板に、臭気監視のスケッチを焼きこんだAVRマイコンと、必要な部品を載せ、ピンソケットを取り付けてIntel Galileoに取り付けられるようにモジュール化した。
裏面はこのようになっている。
センサの値が大きく変動すると12番ピンに信号を送るようになっている。
このようにモジュール化することによって、Galileo側のスケッチとしては
const int isOdor = 12;
void setup(){
pinMode(isOdor, INPUT);
}
void loop(){
if(digitalRead(isOdor) == HIGH){
// 臭気検知、音声呼び出しの処理
}
}
と、センサ周りの一切合財の処理を任せることによって、ここまで単純化できるのだ。
それと、もう一つ朗報がある。8月5日に懸案事項になっていた音声合成LSIの単独駆動であるが、ついに単独で駆動させることに成功した、…といっても大したことはしていない。
製造元からArduinoで駆動させるためのライブラリとサンプルスケッチが配布されていただけなので、ライブラリを使い、サンプルスケッチを参考にスケッチを組むと動いたのだ。
最初は色々と悩まされたり、間違った方向に電圧を掛けてしまったりしてLSIが過熱し、冷や汗をかいたり落胆したりしたものだが、こうして少しずつであるが、完成に向かって前進していくのは素直に嬉しい。
動画を撮影してみたので、ご覧いただければ幸いだ。この動画も例によって(←何)ピンボケしているが、筆者の所有しているコンパクトデジカメの性能がこんなものだからまあ笑って許してほしい。記事とは関係ないが、YouTubeにアップした際、フィルタを掛けたのでピンボケが大分きれいになっている。
白いスイッチを押すと「こんにちは、猫がトイレに行ったようです、様子を見に行ってあげてください。」と喋るのだ。
ブレッドボード上での回路はこんな感じだ。
SDAとSCL端子を使ってI2Cで通信している。
後述するが、写真下部のプルダウン抵抗がこの項のミソだ。
回路を組むときにつまずいたのは、「プルアップ・プルダウン抵抗」の存在だ。
I2Cで通信を行う際、SDA端子とSCL端子から各々のデバイスに繋ぐ際、プルアップ抵抗というものを取り付けなければいけないようだ。
この辺りは筆者も解らなかったので「とりあえず繋いでおけば通信がうまく行く」程度の認識でしかなかったのだが、いざ発声用のタクトスイッチを繋いだときに問題が露呈した。
なんと、音声合成LSIが通電中の間、ずっと喋りっぱなしになってしまうのだ。
ここで筆者は「プルアップ・プルダウン抵抗」の必要性と役割を初めて理解できた。
マイコン関連で入力周りにプルアップ若しくはプルダウン抵抗を付けろ、とよく言われているが、これは信号が入力されていないときにマイコンの端子に掛かる電圧が不定になるのを防ぐため、いわば逃げ道として準備するべきものなのだ、と筆者は学習した。
こういう機会が無ければプルアップ・プルダウン抵抗について学ぶ機会はなかっただろう。貴重な体験だ。
今回は、上図のブレッドボードの白いタクトスイッチの末端に4.7kΩのプルダウン抵抗を付けて、ボタンを押していないときに信号がLOWになるようにして対処した。
スケッチはこんな感じである。
さて、これをいざGalileoで実行しようとコンパイルした所、Arduino用IDEでは出なかったエラーに遭遇した。
型宣言が許されていないタイプ(意訳)だ、とエラーを吐いてきた。
ちなみにArduinoではこうなる。
恐らく、avr-gcc用に書かれたライブラリとx86用のgccとの処理系の間での非互換が原因かと思われる。残念ながら筆者はまだ自力でライブラリを書く域に達していないので、代替案を模索中である。
2014/08/08 ~Galileo側のプログラム試作~
さて、お待たせした。これでようやく、この試作機の要であるGalileoボードのスケッチを描く準備が整った。
今までのはなんだったんだと訝る方もいらっしゃるが、お許しいただきたい。そう、これはGalileoという宇宙旅行への壮大な前振りだったのだ。
さて、イントロダクションはこのくらいにして、Galileo側のスケッチでどのようなことをやるのかをお伝えしたい。
具体的には以下の5つである。
- 水量監視
- ボード1の監視
- 臭気検知
- 音声で臭気検知を飼い主に伝達
- 水量減少時に給水
なんと、5つもあるではないか。これらの作業をポーリング方式(USBとかで使われている方式)で検知し、検知対象に適した処理を実行していく計画だ。
さて、GalileoはI/Oが少し遅いので、これらをloop()関数内で処理していこうとすると、例えば給水中にボード1の異常を感知できない、といった問題が発生する恐れがある。(給水などは30秒程度かかると見越しているため)
よって、スケッチは最低でも毎秒1回以上ループするように、こんな感じで描いた。スケッチ名は「NekoBoardMain2」だ。
なんと、処理する仕事は多いが、loop()関数(main()に相当)内の記述はこのくらいしかない。
古代ローマの言葉を借りるなら、Galileoは各種のセンサや伝達機構を「分割して」「統治」しているのだ。
2014/08/14 ~現在の開発状況の報告~
全体としてのブロックダイヤグラムはこのようになっている。
開発の流れとしては、上図のように、Galileoに衛星の如くぶら下がる各モジュールをボトムアップ方式で設計し、それと並行してGalileoボード側のスケッチをトップダウン形式で設計していく。最後に結合テストを行うというサンドウィッチテストという開発方式を採用した。
2014/08/14現在、ボトムアップテストの出来が非常に悪く、難儀している。
サンドウィッチテスト概略。上矢印と下矢印が併合したら一応ベータ版が完成する。
(その後に細かい修正が必要だが。)
Galileoボード側のトップダウンテストは、ただ単にスタブ
(例:
int module1Work(){
/* 処理 */
return result1;
}
)を作っていけば何とかなっているのが現状だ。
2014/08/25 ~水位監視装置が完成したよ~
長らく更新していなかったが、お待たせした。先日、生産能力の低さに定評のある筆者が、やっとこさ水位監視のモジュールを作って完成させたので、報告させていただく。
これが本体である。MoM I/Oの時と同様、例によってAVRマイコンを単体駆動させ、ADCと水位検出電極を直結してある。
こちらはモニタ部分だ。各ADCの値の表示にはLCDを使った。
上から順に、A0, A1, A2, Δグラフ、健康マーク、
A0値の前回との差分、A3, A4, A5の数値が表示されている。
実はこの液晶、コントローラがHD44780互換なので、CGRAM0~CGRAM7の領域に変更を加えることによってオリジナルのキャラクタを8つまで作成できる。
以下が筆者の作ったオリジナルキャラクタである。ちなみにこのオリジナルキャラクタは水位監視モジュールの電源投入時に表示される。
電源投入時。
最後の4つのバーは後述するバーグラフ作成のために定義した。
水位監視モジュールに実験的要素として、バーグラフと健康マークを付けてみた。下の写真の1行目末尾がそれである。
水が足りているときは、検知電極間に水が導体として入っていることにより、電気の伝達が行われ、ADCに電圧が印加される。また、その状態で安定しているため、ADCの値はそれなりに落ち着く。健康マークはニコニコ顔になっている。
逆に水が無いときは、回路が非常に不安定になり、ADCの値が逐一変化する。水位検出にはこの性質を利用した。
この場合、健康マークは怒り顔になるようにした。また、バーグラフも7以上の変動があるとこのように1マス真っ黒になる。
LCDを着脱式にする意味はあったのだろうか(^^;)
ちなみに、このモジュールで測定するADCの値は、100回測定した平均を取っている。ホントはGalileoでやりたかったのだが、いかんせんI/Oポートの遅さがボトルネックになり、期待に応えられる結果にならなかった。そこで苦肉の策として、I/Oが高速になるように設計されたマイクロコントローラーの力を(また)借りた、というわけである。
2014/09/15 ~音声合成ボード完成~
さて、前回の更新から久しく間が空いたが、猫の状況を伝える音声合成ボードが完成した。
左のボードから音声合成ボードに与える音声列を送信し、右側の音声合成LSIでそれを受け取り、PWM出力で合成された音声をダーリントン接続した2石のトランジスタで増幅し、スピーカーでしゃべらせる、というものだ。
信号線による制御(正論理)で発声のON/OFFを制御する。
Galieo上のスケッチとしては、こんな感じだ。関数化しておくと後後の作業が楽になる。
int talkInvoke(int x, int y, int z){
// talk status to speaker.
// send HIGH to digital(x), and wait for (y) ms, and then, deactivate digital(x), and do nothing while (z) ms passes.
digitalWrite(x, HIGH);
delay(y);
digitalWrite(x, LOW);
delay(z);
return 0;
}
2014/09/17 ~I2Cハブ完成~
加えて、GalileoとI2Cで協調動作するためのハブボードを作成した。
詳しい説明は下のコラムに譲るので、ご覧いただければ幸いだ。
2014/09/24 ~試作機プロトタイプ完成~
読者の皆様、大変お待たせした。今日の日を以て、ようやく試作機のプロトタイプが完成した。
多数の衛星ボードを繋げたこの試作機の全景は、以下のようになった。非常に周りが汚いので、クリックせずに閲覧することをお勧めする。(何)
大変部屋が汚いので、Galileoメイン基板とサブボード以外の部分はモザイクを掛けさせていただいた。
写真中央左から順に、臭気センサモジュール、センサコントロール基板、電源ブレイクアウト・ボード、電源分岐・兼レーザー受信基板(電源ブレイクアウト・ボードの右に紙エポキシの基板で見えづらいですが写ってます)、USBシリアル変換モジュール(これは今回の試作機の本質には関係なく、単にデバッグ用として繋いでいるものがそのまま写ったのだ(^^;))、その下部に水位検出ボード、また、水位監視モジュール右上にホットボンドで接着された基板は水位監視モジュールのモニタ基板だ。合計で(モニタ基板はカウントしないので)5つものMoM Moduleもとい衛星ボードが接続されている算段になる。
また、電源ブレイクアウト・ボードの下にはArduino motor shield、その下には1枚目のGalileoボードが潜んでいる多層ビル構造になっている。
自分で言うのも少々アレだが、基板の合計は9枚、メンテナンス性は非常に悪い基板に仕上がった。
2014/09/24 ~プログラム~
2枚目のボードのプログラムの一部を以下に示す。
諸々の初期化宣言。
ボード主要機能である水位監視と臭気監視。
スケッチ名がpinMonitorとなっているが、これはもともとGalileoのデジタルピン入力の監視のために書いたスケッチを流用したから、こうなったのだ。
さて、この項の冒頭にも書いたとおり、スケッチは「一部」しか載せていない。残りの部分をあげる予定は今のところ無い。
これは意地悪でもなんでもなく、ここまでの経過を読んでくださった読者へのささやかな、世間一般では課題ともいうプレゼントである。(やっぱり意地悪じゃないかm(__)m)
音声合成ボードのライブラリ(avr-gcc用)は開発元のAquestで配布されているし、水位監視に関しても、仕掛けは単純な導線2本で構成されるセンサだ、両方ともArduino bootloaderを書き込んだAVRマイコンで動かし、電源をGalileoから拝借し、信号線をぶち込み、それに対応するスケッチを組めばいいだけの話である。
ね、簡単でしょ?
(・・・なのかな)
試作機レビュー編
今回開発した、試作機「猫の給水装置~NekoBoard2 powered by Intel galileo~」(長い)の概略を紹介する。
利点
- 猫の給餌装置に追加する1枚目のレーザーモジュール(目次第7項参照)と2枚目のGalileoボードに追加する受光モジュールで給餌装置の稼働/非稼働を確認し、連携して動作。
- それぞれの機能ブロックをモジュール化することによって、故障を容易に判断できる
- 給水機構の簡素化(ペットボトルウォータータンク)によるメンテナンス性の向上
- ライフスタイルに合わせた巻き上げ機構(巻き上げたい始点にギヤボックスのプラモを取り付ける)による柔軟な対応性
- 自動水量監視で水が足りなくなったら自動的に給水、真夏も安心(目次第10,11項参照 提出課題1/2クリア)
- 自動臭気監視、臭気レベルが閾値以上になると音声で飼い主に通知(提出課題2/2クリア)
欠点
- それぞれの機能ブロックをほとんどすべてモジュラー式にした功罪としてのコスト上昇
- MoM Module(機能ブロック/衛星ボード)に内包されるプログラムの修正が煩雑(修正にはArduinoを使うことになってしまう)
- 水位監視モジュールのセンサ電極にただの導線を使用しているので、サビ発生が本質的に避けられず、その結果ランニングコストが多少上がってしまう
- MoM ModuleはIntel Galileoから見ると電源をもらって1か0の信号しか返さない、というブラックボックス
大まかに利点と欠点を列挙すると、このようになった。それでも利点の方が欠点より2つ多く、また、ここまで紆余曲折はあったものの、プロジェクト始動時に提出した課題を満たし、動作しているので、筆者としては及第点を与えたい。(自分に甘い)
試作機レビュー編 ~実際に使用してみてどうか~
<実際の使用風景>
水位検出部。センサ電極には絶対に半田メッキをしてはいけません。
(猫が中毒になってしまいます)
巻き上げ機構モーター部。
動力伝達の糸には釣り糸を使用した。
一見不恰好に見えて、処理されていないタイラップの末端であるが、実はこれがテグスのガイドレールの役割を果たしている。
巻き上げ機構・動力伝達部(滑車部分)
レーザー光通信部(送信部分)
Galileoボード1からビーコン信号を送り、制御します。
レーザー光通信部(受光部分)
受光素子には毎度お馴染み、安価で使い道の用途の広いCdSセルを利用した。紙エポキシ基板が隠れているのは日光による誤検知を避けるため。
2枚目のボードのADCに接続し、Galileoボード1の死活監視を行う。
給水タンク(止水状態)
モーター駆動部(Arduino motor shield使用)
今回は給水用にBチャンネルを使っています。
撮影上、Ch.Aの配線を外してますが、Aチャンネルは給餌用のモーターを繋ぎます。
モーターシールドを噛ませると、使える入出力ピンが減るので難儀しました。
詳細は↑参照のこと。
取り敢えず、こんな感じで動いています。
ホントは動画も取りたかったのですが、水は猫が飲みたいときに勝手に飲む上に、全くと言っていいほど飲まないときもあるのでタイミングが合いませんでした。猫の習性というものを改めて学習しました。
臭気検知部(再掲)
臭気検知部は反応するには反応し、結果を音声に変換しているので、仕様上の要件は満たしているのですが、如何せん飼い主である筆者の鼻の方が先に反応してしまい、トイレのお手入れを済ませたころに鳴動する、といった感じです。
猫が排出する糞尿に含まれるあの鼻につく独特の臭いには、硫黄化合物だけの検知では不十分かと思われる。(インドール系の化合物を検知できれば(そのようなセンサがTGS2450と置き換えられるならば)感度は向上するものと思われる)
まとめ
今回の試作機開発の企画は、前回の自動給餌装置と比べて、かなりというか、物凄く難産な企画でした。(内心、「発想はいいけど、実現が困難」という地雷な例をモロに踏んづけちゃった、って感じです。)
それでも、開発していく中で開発方針を Galileo2ボード+モーター方式 から Galileo2ボード+MoM Modulesによるモジュラー開発方式 によって難題を解決するという、コロンブスの卵的な発想を独力で出来たこと・・・!
また、前回と比べて今回は必要となる知識がArduinoスケッチ用のプログラムから始まり、複数の基板を製作する電子工作技術、C++、ライブラリの多用、はたまたプラスチックの加工、熱可塑性樹脂による接着、ボード台を作る木工技術、猫の習性を直接的に学ぶ事、それら総て、またそれ以上のものとの素晴らしいコラボレーションを達成することが出来た。
前回、筆者は「この試作機開発はトライアスロンだ」と述べたが、今回はGalileoの名に恥じぬ「宇宙旅行」にまで昇華させることが出来たことを誇りに思う。
自分で構想を練り、設計した試作機が動く瞬間は感動の極みだ。頑張れば、頑張った分だけ幸せになれる、というのがGalileoを代表とするマイコン開発の楽しみでもあり、醍醐味である、と紹介したい。
総評して、苦労はしたけれど、「楽しかった」です!!
皆様にも記事を通じて、この楽しみを共有することができたら筆者としても本望です。(*^-^*)
参考文献
- 鈴木哲哉 著 作って遊べるArduino互換機(ソシム社)
- 鈴木哲哉 著 ボクのArduino工作ノート(ラトルズ)pp.12-23, 136-145.
- Arduinoをはじめよう 第2版, Massimo Banzi 著, 船田巧 訳
- アナログ電子回路の基礎 藤井信生 著 (昭晃堂)
あとがき(仮)
課題は一応クリアしたものの、筆者は絶賛開発中である。よって、新しい発見や改良があれば、最終締め切り日である10/31まで、研究、開発の成果を綴っていくので、これからの更新にも、乞うご期待ください!
謝辞
ここまで読んでいただき、ありがとうございました!
zigsow内のGalileoページ、コミュニティの皆様方、激励をくださったzigsowおものだちの皆様方、また、リアルでの友人達に感謝します。
また、1度ならず2度までもこのような貴重な機会を授けてくださったzigsow様、およびインテル様、ならびに関係企業様各位に、改めて、この場を借りてお礼を申し上げます。本当にありがとうございました(*^-^*)
ZIGSOWにログインするとコメントやこのアイテムを持っているユーザー全員に質問できます。