更新履歴
2014/12/21 v0.1 初版
2014/12/22 v0.2 1章の大幅加筆:FTDI社のサイト追加、FWアップデートの追加
2015/01/05 v0.3 3章の概要と詳細の追加、書きかけ、機能ブロックの開発中
2015/01/12 v0.4 温度センサとSSR駆動装置の写真と本文の追加、PIRセンサの予告
2015/01/13 v0.41 シリアルポートをわかりやすく図示した。
2015/01/23 v0.5 SSRによる自動式電燈が完成。
2015/02/19 v0.6 PIRセンサによる人体検出が完成。
2015/03/05 v1.0 全体がようやく完成。
2015/03/06 v1.1 本文微修正。
TODO::
PIR
リモコン解析、再現
無線通信
概要
この記事は、Intel Edison kit for Arduinoを用いて作るスマートハウス制御基板の実現に向けて書かれたものです。
目次
0~1.序文
- ハードウェアオーバービュー
- 試作機のコンセプト提案
- 機能ブロックの概説
- 温度計(完成)
- 無線通信(書きかけ)
- マイコンからのSSR駆動
- PIRセンサで人体を検知しよう
- リモコンの解析、発射
- まとめ
おことわり
ソフトウェア、ハードウェアについては十分に設計、検査していますが、どのボードでも筆者の望んだとおりの機能を発揮することは保証できかねます。その点ご留意の上、お読みいただければ幸いです。
また、更新履歴上のバージョンが1.0になるまでは、書きかけの箇所やまだ書いていない箇所が散在します、大目に見ていただければ幸いです。
0-1.開梱~セットアップ
本体を包む箱です。エジソンが発明した電球があしらわれています。今回もエジソン様はグラサンを掛けてます。
Galileoとの比較。幅はほぼ同じですが、厚みが半分になってます。箱は帯が巻かれていて、この帯をスライドさせて箱を開けます。
1.ハードウェアオーバービュー
まず、Edison本体を取り出します。
ご覧の写真のように、非常に小さいです。
各所でSDカード大と言われているように、本当にSDカードよりちょっと大きいくらいの大きさです。
この中にメインCPUとして、500MHzで駆動するSilvermontコアの22nmデュアルコアAtomと、マイクロコントローラーとして、Intel Galileoで初登場したSoC, Quark X1000(100MHz)を内包しています。シールド左下のセメント抵抗みたいなものは無線LANのアンテナです。
また、メインCPUコアがAtomということもあって、
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology nonstop_tsc aperfmperf nonstop_tsc_s3 pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 movbe popcnt tsc_deadline_timer aes rdrand lahf_lm 3dnowprefetch ida arat epb dtherm tpr_shadow vnmi flexpriority ept vpid tsc_adjust smep erms
と、cat /proc/cpuinfo内のflags情報がとてつもなく素晴らしいことになっています。Galileoとはえらい違いですw
MMX命令は勿論のこと、組み込みボードでSSE無印、SSE2, 3, 4.1, 4.2や3dNow!のprefetch命令にまで対応しています。使う人によっては魅力的な機能だと思います。筆者はArduino+α的なボードだと捉えているので、拡張命令を積極的に使う機会はあまり無いかと思われます。
つまりこのEdisonモジュールの中に、Galileoの数倍もの機能が詰まっているのです。
モジュール本体裏面にはヒロセ社のDFシリーズのコネクタが取り付けられています。挿抜の最低保証回数は30回と少ないので、頻繁に脱着する用途には向いていません。
しかしながら、さすがにそこから信号線を出すのは普通に出来る芸当ではないので、Edison kit for Arduinoでは、裏面コネクタからの汎用出力をArduinoのピンアウトと機能に変換する「台座」(筆者はそう呼んでます。以後、Arduinoのピンアウトと機能に変換するボードのことを「台座」と呼称します)が付属します。
Edison kit breakoutでは台座の種類が変わります。
>Edison kit for Arduino台座の紹介
台座は複数のIC/LSIと数多の能動部品・受動部品から出来ていて、それがArduinoたらしめるものになるように設計されています。簡単に各々のIC, LSIについて、着目すべき点を述べていきたいと思います。
>EdisonをArduino台座に取り付けよう
台座にEdisonモジュールをハメ込むだけです。超簡単。コネクタの部分はしっかり押してください。
最後にナットを取り付けますが、このナット、すんごく小さいので失くさないように注意が必要です。
筆者は手が小さいのですが、親指と比べても如何に小さいかが分かります。
最後に、プラ足を取り付けます。
さて、やっとこれでハード的にはArduinoと互換が取れたものが出来上がりました。
次に、Lチカをやるまでの手順を説明して、第一部を終わらせたいと思います。
<手順>
■1■
FTDIドライバのインストール
Edisonとの通信にシリアルUSB変換ICとして、FTDI社のFT232RQを搭載していますので、ドライバが無い場合は、FTDI社のサイトからダウンロードして、仮想COMポートドライバ(VCP Driver)をインストールする必要があります。
■2■
Edison側のドライバのインストール
次に、Edison本体のドライバをここからインストールします。
ちなみに、Galileoでドライバ未インストール時の時は、デバイスマネージャー内の「不明なデバイス」欄に"Gadget serial v2.4"などと表示されていましたが、今回のEdisonでドライバをインストールしていない場合、次の写真のように
MERRIFIELDと表示されます。
Edisonドライバをインストールしていない場合は、ここから右クリックして、ドライバのインストールを行います・・・が、詳細はパスが筆者でもわからないので、素直に「Edisonドライバのインストール」→「Intel Edison kit for Arduinoの接続」の手順で装着したほうが良いと思われます。
■3■
ファームウェアのアップデート
Tera Term VTやPuTTY(筆者はPuTTYの日本語版、PuTTYごった煮版を使用しています。以下、画面の端末エミュレータはPuTTYになります。Tera Term VTの方は適宜読み替えてください。)などでEdisonと通信する場合には、初期搭載されているファームウェアにバグがありますので、以下の手順でファームウェアをアップデートします。
ご覧のように、コンソールに入力する最初の1文字目を認識しない、などのバグがあります。
<手順>
Edison Yocto complete imageをダウンロードし、展開します。初期状態でのuname -aの結果は
root@edison:~# uname -a
Linux edison 3.10.17-poky-edison+ #1 SMP PREEMPT Wed Aug 20 16:09:18 CEST 2014 i686 GNU/Linux
このようになっています。
PuTTYコンソールの設定は、下の写真のように、COMポートをデバイスマネージャーで表示されるEdison側のUSB serial portの番号に合わせ、ボーレートをGalileoと同じく、115200に設定します。
各人によってCOMポートの番号は違うはずなので、試行錯誤してみてください。
次に、Win+EでPCを開き、リムーバブルドライブとして認識されているEdisonを開きます。
ここ(Edisonのルート)に、先ほどダウンロードしたEdison Yocto complete imageをファイル構造を変えずに解凍します。その前にリムーバブルドライブとして認識されているEdison(ドライブレター:)内に何かあったら削除しておいてください。
コピーが済んだら、PuTTYなどの端末エミュレーターを起動してシリアル・ポートに接続します。
アップデート中の電源喪失を防ぐため、DCジャックには電源を挿しておいてください。
Edisonにログインします。
edison login : と出たら、ユーザー名としてrootと入力します。
root@edison:~# と出たら、スーパーユーザーモードなので、そのままreboot otaと入力し、Enterを押します。先述の文字取りこぼしバグがあるので、状態によってはrreboot otaと入力する感じになるかと思います。
ここからメッセージが大量に流れ、FWのアップデートが始まります。気長に待ちましょう。
Reached target shutdownと出たら間もなく再起動されます。
EdisonモジュールのeMMCから新規イメージを読み込み、再度リブートがかかります。
MMC writeと出ているのはEdisonモジュール内蔵のeMMCに書き込みをしています。
再起動は何回か掛かります。
間もなくリブートが掛かります。リブート直後にエクスプローラがEdisonモジュール内のeMMC内容(さっき書き込んだイメージファイルの一覧が表示されます)を表示するかもしれませんが、×ボタンを押して結構です。
新規イメージ受信状態です。
数回再起動し、edison login : が再び表示されたら、ひとまず成功です、お疲れ様でした。
root@edison:~# uname -a
Linux edison 3.10.17-poky-edison+ #1 SMP PREEMPT Tue Oct 14 15:19:49 CEST 2014 i686 GNU/Linux
root@edison:~# cat /etc/version
edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19
uname-a と /etc/version の日付が新しく(2014年8月20日→2014年10月14日)なっていたら成功です。
これでシリアルコンソール上での作業が快適に行えます。バグも治っているはずです。
次に、無線環境のセットアップを行います。
configure_edison --setupと入力し、設定ウィザードに入ります。
まず、Edisonのrootユーザーは、初期状態ではパスワードが無いので、不正アクセスを防ぐためにrootのパスワードを決めてください。
パスワードはUnix/Linuxの例によって、2回訊かれます。
WiFiの設定をする場合はYを押下してください。
検索されたSSIDが表示されていれば、それを選択し、SSIDのパスワードを入力します。
このように表示されれば、シリアルsshではなく、ネットワーク越しのssh接続が出来ます。
背景がブラウザ上の表示、左がWiFi経由のssh接続、右が設定に使用したシリアル経由のssh接続ウインドウです。
■4■
Arduino IDE for Intel Edisonのインストール
インテルx86ボード用のArduino IDEをここからダウンロードします。
実はこのIDEはGalileo Gen1, Gen2にも対応しています。
上のように、IDE上の「マイコンボード」はIntel Edisonを選択してください。選ぶボード毎にコンパイル後に吐き出されるELFバイナリの内容が違うので、注意してください。
電源の確保
Edisonの電源アダプタジャックには、「内径φ2.1mm、外径φ5.5mmのセンター+」かつ「出力電圧7~15V」の仕様を満たす電源アダプタを接続します。マイクロUSBレセプタクルにケーブル2本差しして、PCに接続しても一応は動きます(Lチカぐらいは出来る)が、Arduino配列のピンソケットにLEDを挿してみたところ、明滅しなかったので、安定した動作にはやはり電源が必要かと思われます。(追記:ACアダプタ経由で電源を供給した状態でも、外付けLEDが点滅しませんでした。ドライブ電流が足りないのでしょうか、それとも接続に問題があったのか、現在調査中です。)
追記:いったん全ての電源を切って、FTDIドライバをインストールし直すと上手く動きました。
液晶シールドもうまく動いたには動いたのですが、Galileo Gen1同様、なんだかGPIOが遅いです。
1602サイズの液晶の画面更新に1400ms程度かかります。表示させ続けるとこの更新時間、微妙に増えてきています。
ファームアップに期待。
追記:またピンソケットから信号が出なくなりました。再起動しても一緒なので格闘中…
追記:代替品のボードが来たので、開発がしやすくなりました。
IDEの起動
普通にIntel用のArduino IDE を起動するだけです。あとはボードとシリアルポートを適宜設定して、スケッチ転送ボタンを押すとスケッチがELFバイナリにコンパイルされ、Edisonに転送されます。
スケッチの転送は先代のGalileoとは違い、FTDI社製のUSBシリアル変換チップを内蔵しているためか、Galileoで起きていた、にっくき「Transfer incomplete」に遭遇する割合が少なくなっています。
IDE上ではいっぱいCOMポートの候補が出ていて、迷うかもしれませんが、デバイスマネージャーのポート(COMとLPT)一覧で、「Virtual COM Port」と表示されているデバイスがスケッチを転送するポートにあたります。
デバイスマネージャーで選択されているポートがスケッチ用のポートです。
↑これね。
この点も改善されていてうれしい限りです。
Intel Edison kit for Arduinoボード(台座)のICSPヘッダ横のDS2とシルク印刷されたチップLEDがArduinoで言うところの13番ピンの内蔵LEDにあたります。これが点滅すればLチカは完了です。お疲れ様でした。
2.私の考えた、Edison kit for Arduinoを使っての試作機開発の概要
つぎに、表題のとおり、このキットを使っての試作機の開発について、簡単に説明させていただきたいと思います。
筆者が製作しようと思案しているのは、ズバリ、「スマートハウス」です。それをこのキットで実現させようという、少々無茶な挑戦です。
さて、スマートハウスというのにも、いろいろ定義はありますが、筆者としては、その条件として
- 人を感知して電燈を制御し
- 温度を監視してエアコンを入り切りしたり
- 人の気配を感知してテレビを点けてくれる
そんな「お節介」な機能を搭載し、主を「(今よりも)ぐうたら人間」にさせるものを、筆者的に、スマートハウスと定義します。
最低でも上記に挙げた3つの機能を実装したものを作っていきたいと思います。
3.機能ブロックの製作
今回の試作機の開発方式はEdisonを軸に、各種の機能を持ったマイコンボードとの相互通信を無線で行うため、末端の機能ブロックを作成し、中枢のEdisonにスター型に接続する。
中枢が華々しいEdisonと、それぞれの末端モジュールを端末に見立てているため、開発方式は名付けて中華思想方式である。・・・とはいうものの本質的には前回の試作機開発で採用したボトムアップ・トップダウン併用のサンドウィッチテスト方式であることには変わりはない。
<ここより下は書きかけ 進捗目安 0 10 20 40 50 60 80 100>
I2C時計
<バグ>
解決しました。
I2C LCDボード
<ピン数を 少なくできるよ I2C>
SDに稼働状況を書き込むことにより解決しました。
IR送信ボード
<受信>
<解析>
<設置など>
記事§9.をご覧ください。
4.温度計モジュール
温度計にはナショセミことNational Semiconductor社(現Texas Instruments)のLM61BIZを使用した。
左から、Vcc(+5V), Vout, Gnd.
TO-92パッケージの2番目の足からVoutが出ているので、これをEdisonのAnalog inにつなげれば容易に温度計が実現できる。
精度を高めるため、オペアンプで信号を3倍に増幅したものも作ってみた。が、どうもうまく増幅していないので、改良版を使わずに今回はLM61BIZ単体で温度を測定する。
高感度を狙って増幅版を作ってみたものの、EdisonのADCはArduinoと同じ10bitもの分解能があるので、室温の測定には何ら不自由はない。
むしろ高感度版で温度にフラッターが生じ、温度に依存するモジュールがひっきりなしに誤動作してしまう方が問題だ。ちなみに、高感度版だと測定可能な温度範囲-25~50℃になる。筆者の居住値は滅多に雪が降らないので、低温領域は少しオーバースペックかもしれない。問題は高温領域だ。ギリギリまで増幅したので空きが10℃しかない。(真夏は40℃になることがまれにある)
5.XBee通信
<初めての 無線通信 事始め>
無線通信はEdison標準添付の無線モジュールで実現しました…。
6.SSR制御
秋月からSSRモジュールが出ていたので、電燈の制御にはSSRという部品を利用した。SSRというのは、ソリッドステートリレーの略である。旧作AC版DDRのStep step revolutionではない。(寒いうえに、少々ネタが古いかな?)
裏面のACラインの部分はホットボンドで絶縁してある。(そんな絶縁で大丈夫なんだろうか(^^;))
ACラインとマイコンからの制御線を止める部分はターミナル端子を使っているので、堅牢性も期待できる。マイコンボードの方を吊り下げることも可能だろう。
電線(余ったPCケーブル)をプラグとコンセントに加工した。端から出ている線はアースだ。
Edisonらしく、制御対象は昔ながらの白熱電球だ。豪華に100Wを使用した。
本当は蛍光灯などを使いたかったのだが、蛍光灯は頻繁に点灯、点滅をする用途には向いていない。その次に考えたのはやはりというかなんというか、LED式の電球なのだが、まだまだ高価で筆者の手の届く範囲にはないので、結局この白熱電球に落ち着いた。
今はほとんどの電球がLEDに代わっていたため、探すのに少々苦労したが、まだ需要があるらしく、ゲットできた。
LEDやFLライトにはない、ぼんやりとしてゆったりした色合いが魅力だ。
コイツの利点は何といっても半導体式の継電器なので、駆動音がないというのが最大のメリットだ。
これなら筆者の神経質な点にも触れず、また音がないのでとってもスマートである。
以下に動作している風景を載せる。
これはただ単にBlinkスケッチからの出力をSSRの入力に入れて、電燈を駆動させている。
CdSなどの照度センサと組み合わせると、町の街灯のように、自動的に雰囲気照度に応じて電源が入るようになった。
反面、重い負荷になると発熱が無視できなくなるので、重い負荷を駆動する際はそれなりの放熱対策をした方がよいと思われる。
7.PIRセンサで人感装置を作る
PIRセンサを用いて人体を検出し、動きに応じて電気製品の電源を制御する機能については、最初はPIRセンサ単体で実験していたのですが、検出範囲がシビアだったので、別途モジュール
を用いることによって解決しました。詳しくは上記の記事をご覧いただければ幸いです。
8.リモコン信号を解析する
正直ここが一番手間取ったし、こいつが一番苦労した。リモコンの解析を好んでやろうという輩がいたら多分そいつはいい意味での変態さんである。少なくとも筆者は二度とやりたくない。
この記事の関係上、詳しいことは詳細を省くが、赤外線リモコンは解析に苦労することだけは請け合いである。エアコンなんかは1度に9発も発射するので苦労すること請け合いである。
ものぐさな筆者はライブラリを使って解決した。Arduinoの高速PWMを使用して、38kHzパルス位置変調(PPM)の信号を生成し、リモコン操作をエミュレートしている。といっても、主要なことはほぼすべてライブラリ任せなので、筆者が実装したのはEdison側からArduino互換ボードを制御し、自作のIR(赤外線)ボードを制御するくらいなのだが…(^^;)
電源ケーブルは写真の撮影上外してあるが、右のAE-UM232RモジュールにminiUSBコネクタ経由で5Vを供給する。供給された電源はArduino pro mini互換基板に渡り、焦電型赤外線センサを通じて室内の人の気配をモニタする。2Fの電燈は白熱電球なので、電源ON時に赤外線を発することに伴い焦電型赤外線センサが反応し、左のnano互換基板に「エアコンとTVの電源を入れろ」という信号を送り、nano互換基板が自作のIRボードを制御し、リモコンの信号を送る。ここまででEdisonが登場していないではないか、というツッコミの声にお応えしたいのだが、画面に出ていないだけでちゃんとEdisonは登場しているし、役目を果たしている。Raspberry pi 2に繋がれたネットワークケーブルからEdisonの情報を取得し、動作した際には、Edisonに報告しているのだ。
ちなみに、pro mini互換基板とnano互換基板、並びに自作のIRボードを固定していないのは、筆者の惰性ではなく、この方がより効果的に赤外線を発射でき、位置の変更にも対処できるからだ。
9.まとめ
今回はかなりしんどかったです。Arduino、x86ボード、電子工作、赤外線の解析、温度の検知、無線通信、ネットワーク…さまざまなことを要求されました、正直辛かったです、やめようと思ったことも何度もありました、でも、部屋に入って電燈を点けるとエアコンの電源が入り、TVの電源が入り筆者を出迎えてくれる、その瞬間といったら!!…スマートハウスが実現できた時の感動は何物にも代えがたいです。それはまるで、(もういないけど)彼女が身の回りの世話をしてくれるように!!
ただ、反省すべき点としては、ボードの設計の甘さがモロに露呈してしまい、開発の自由度が損なわれた点が悔やまれます。これは私の設計もあるのでしょうが、Edisonボード単体で38kHzの信号を生成できなかったことは痛かったです。何せ、それが出来ないために赤外線発射装置が遅れに遅れたのですから。関数一発で38kHz PPM変調の信号を発射できるようなライブラリを標準添付してくれればいいな、と思いました。( ppmShot(int pinNo, int PPMwavelength_in_Khz, byte sendData) みたいな)
スペック的には文句なし。
SDカードサイズで500MHzのSilvermont Atomデュアルコアが動いているのは凄いです。
MCUにはGalileoで初登場したIntel quark x1000が100MHzで動作しています。
Wi-Fiアンテナは村田製作所製です。小さい割に結構電波を拾ってくれる、凄いヤツ。
Arduino台座の出来とソフトウェアが少し…
本家Arduinoと一応互換は取れているのですが、PWMは4つしかありません。例によってこのボードもI2CエキスパンダでGPIOポートの数を増やしている設計上、本家と比べてI/Oピンの反応の遅さも目立ちます。
また、DDRBとかPINBとかPORTB |= 0b000001000とかTIMSK0とかOVF_Vectや_BVなどのavr-gcc固有の機能が働きません。よってI2C通信などではライブラリが使えないとx86コンパイラがエラーを吐きます。その場合はライブラリを退避させて一からコードを書いてあげなければなりません。
インテルらしい高級感。
流石はインテルの作るIoTボード、正常に動き出すと、誤動作も少なく安心です。
今回採用したAtomでLinuxがちゃんと動くことも要因の一つですが、やはりUSBシリアル変換にFTDIを使ったのが奏功を成したと思われます。
まだまだ荒削り
ボード裏面なのですが、テストパターンがやけに多いです。筆者の調べた限りではTP83までありました。
こういうのを見ると、なんだか「切羽詰まっているけど開発したよ」、的な印象を受けます。(←え、筆者のことじゃないかって?
あと、ジャンパが7箇所、謎のミニスライドスイッチがUSBポート脇に1か所あります。
7箇所のジャンパの内の一つは5v/3.3v切り替えなのですが、残りのジャンパをどう設定したら本家Arduinoより2つ減った4つのPWMの位置を設定できるのかが分かりません。ここら辺も親切な解説が欲しかったところ。
ちなみに、台座のボードにシルク印刷されているintelのロゴマークはよく見るとiの上の「・」が印刷されていません…。
jakeさん
2015/03/06
自分はかなり短期間で終わらせたので、仕様を割り切りすぎました。
こだわった分、時間がかかるのは仕方ないかと。
慣れないし情報も少ないマイコンでさたからね。
しばさん
2015/03/08
コメントありがとうございます(*^-^*)
自分は最初の仕様でかなりこだわってしまった(心の中ではこれくらい余裕だろうという誤算があった)ので、マイコンボード側のプログラムもx86、ARM、AVRとやる羽目に…苦笑。
いぐなっちさん
2015/03/08
皆さんそれぞれ、たくさんの苦労と戦いながら開発されてますね。
LCD表示の不調は、初期不良だったのでしょうか。
私も頻繁に起動に失敗したり、Analog inの値がグチャグチャになったりということで、初期不良対応してもらいました。