2013年9月15日日曜日

最近気になるボードたち ~2013秋~

ようやく暑さも引いてきた昨今、CNXSoftさんのブログを眺めていて、秋の夜長を熱くするかもしれないボードがいくつか目に留まったのでメモ。

1. UDOO

http://www.udoo.org/
image from www.udoo.org

Kickstarterで64万ドルを調達。
コンセプトは、RaspberryPi 4枚分のパワーと、Arduinoの機能を一つに、というもの。 パワフルなLinuxミニPCと便利なフィジカル系ボードが一体になる上に、コネクティビティはEthernetとWi-Fiに加えUSB接続のBluetoothドングルに対応、グラフィックスはHDMIとLVDSタッチスクリーン、さらにはSATA、カメラコネクタ、USB Mini/USB Mini OTGと、全部盛り!そしてフィジカル側のコネクションはArduino Due互換配置の使いやすい2.54mmピッチピンソケット。
何より興味深いのは、Wandboardと同じ、Cortex-A9搭載Freescale i.MX 6と、Arduino Dueと同じCortex-M3搭載Atmel SAM3X8Eの、ダブルSoC構成!これら二つのプロセッサ間の接続は、こちらのページの説明によれば、USB OTGとUARTが用意されており、OTGを使ったAndroid ADK使用も可能だし、フィジカル入力をUART経由でi.MX上のLinuxに送る、なんてこともできちゃう。熱い!
2013年10月出荷に向け、99ドル、109ドル、129ドルの3ラインナップでプレオーダー受付中

2. MicroZed

http://www.zedboard.org/product/microzed
image from www.zedboard.org

今回のチョイスの中ではこれもかなり熱い。Cortex-A9 1GHz デュアルのハードコアを持つXilinx Zynq-7000 FPGA搭載ボードにして、$199のローコストぶり。プロセッサからはUART、USB、Ethernetなど基本的なコネクティビティが提供される一方、裏面にはプログラマブルロジックと接続可能なマイクロヘッダが用意されており、オリジナルのデバイスコントローラロジックを構築して入出力可能というわけです。フィジカル系のプロジェクトでちょっと大きい規模のシステムを構成しようとすると、外部回路がデジタルICの焼きそば回路になってしまう・・・そんな悩みを解決してくれそうです。
グラフィックス出力が欲しい場合は、上位版のZedBoardでHDMIとVGAが利用可能。価格は395ドル。

3. RFduino

http://www.rfduino.com/
image from www.rfduino.com

Kickstarterで35万ドルを集めたArduino互換ボードで、指先に乗るほどの超小型モジュールにまとめているというだけでも魅力的なのに、最大の特徴としてワイヤレスを謳っているあたりがにくい。Bluetooth 4.0でスマホとかと連携していろんなすごいことができちゃうというのが触れ込み。価格も$21~といい感じ。

4. $9 ARDUINO Compatible board

http://borderlesselectronics.org/
image from www.indiegogo.com

クラウドファンディングサイトindiegogoのプロジェクトで12万ドルの調達を達成した、Arduino Leonardo互換ボード。Arduinoって手軽すぎて、こまごまとしたプロジェクトを手元にどんどん増やしちゃうので、いくら使い回しがきくとは言ってもついつい買い増ししちゃうんですよね。でも気軽に何枚も買うには、やっぱりちょっと高い。それが10ドルを切るセカンドソースだっていうんだから嬉しい。(でも私はArduino Pro Miniラブなんですけどね。。。)
1枚ならシッピング込みで$12から、10枚や100枚というすごい単位でのまとめ売りもしています。何でも教育用に導入しやすいように、というのが目的だそうで。 本稿ポスト時点(2013/9/15)ではすべての販売単位で売り切れになっていますが、また増産されるかもしれません。Arduinoの浪費家にはぴったりかも。

5. MC HCK

http://mchck.org/
image from mchck.org
そんなArduinoコンパチよりもさらに安くて小さい、超小型マイコンボードがこちら。MC HCKはMcHackと発音するそうで、日本語ではマックハックとでも呼べばいいでしょうか。
このボードの触れ込みは、たった5ドルのコストで、自前でのファブリケーションが可能ということ。販売は消極的で、回路図、部品表、基板データといった設計情報を公開しています。
SoCはFreescaleのK20、コアはCortex-M4というガチガチ組み込み仕様。





基板がUSBコネクタになっているのもいい感じですね。実にミニマルにまとまっていてクールです。販売してたら即買いなんだけどなー。

6. Minnowboard

http://www.minnowboard.org/
image from uefidk.intel.com

Intel E640を搭載したx86ボード。1GHz 1コアとコンピューティングリソースにやや物足りなさがある上、$199とオンボードCPUのミニPCとして考えるとちょっと割高にも感じますが、x86アーキテクチャのボードでATX電源ではなくACアダプタ一本で動いちゃうお手軽さは、ニッチな需要をうまく突いてるなぁ、という感じ。OSはYoctoプロジェクトÅngströmを標準サポートするようですが、せっかくx86なんだし、いろいろ夢を広げたいですよね。ただしCNXSoftの記事に書かれているとおり、Gizmo Boardと比べると魅力に欠けるのは否めず。x86のAMD G-Series搭載で同じ$199なら、やっぱりGizmoかなぁ、というのが正直なところです。

Raspberry Piで田無タワー風天気予報ガジェットを作る(ソフトウェア編)

前回(ハードウェア編)から続く...

今回はソフトウェアの実装をまとめていきます。ソフトで実現すべきことは、
  • 天気予報のAPIを叩いて明日の天気を取得する
  • 取得した天気に応じてGPIOでLEDを点灯させる
の二つです。

これらを実現する方法はいくつもあると思いますが、ここではコンパイル不要で再修正も楽なPythonを使ってみることにします。Python用にRaspberry PiのGPIO操作ライブラリRPi.GPIOが提供されているので、ファイルIOで直接叩くよりも比較的シンプルに実装できます。

公式からダウンロードしたRaspbian wheezyのイメージにはデフォルトでRPi.GPIOがインストールされているはずです。もしモジュールのimportに失敗する場合はこちらの手順などを参考にインストールします。

OpenWeatherMap

インターネットで天気予報を提供するAPIのひとつに、OpenWeatherMapというものがあります。OpenWeatherMapは、天気を知りたい場所を指定してHTTPでリクエストを送ると、XMLまたはJSON形式でレスポンスを返してくれます。予報だけでなく、現在の天気を知ることもできます。取得したレスポンスを適当に処理して、天気とか気温とかを取り出します。

まずは、試しにレスポンスを取得してみます。公式のAPIサンプルに、下記のリクエスト例が置いてあります。


これをベースに編集してみましょう。
地名はLondonからTokyoに変更、レスポンス形式はXMLからJSONへ、unitsはそのまま、cntは翌一日分のみで十分ですので1にします。
http://api.openweathermap.org/data/2.5/forecast/daily?q=Tokyo&mode=json&units=metric&cnt=1
こんな感じかな。試しにブラウザのURL欄に入力してみると、、
{"cod":"200","message":0.0176,"city":{"id":1850147,"name":"Tokyo","coord":{"lon":139.691711,"lat":35.689499},"country":"JP","population":8336599},"cnt":1,"list":[{"dt":1378605600,"temp":{"day":25.58,"min":19.64,"max":25.58,"night":19.64,"eve":20.69,"morn":25.58},"pressure":1018.16,"humidity":91,"weather":[{"id":502,"main":"Rain","description":"heavy intensity rain","icon":"10d"}],"speed":1.81,"deg":275,"clouds":92,"rain":16}]}
ってな感じでレスポンスが返ってきました。問題なさそうですね。

では、このリクエストをPythonコードから投げて、レスポンスを取得してみましょう。 適当な作業ディレクトリにPythonファイルを作って編集していきます。 実行してみます。 ブラウザで表示させた時と同様、JSON形式のレスポンスが返ってきたでしょうか?
次に、このJSONレスポンスをスクレイピングして、天気の部分だけを取り出してみます。 これを実行すると、天気の部分のテキストだけが抽出されるはずです。 こんな風に↓

GPIO

続いてLEDを点灯させるためのGPIO操作をPythonプログラムに追加していきます。まずGPIO.setmode()でピン番号の指定方法を銘記します。これに合わせ、あらかじめR、G
、B変数にはRPiボードのP1コネクタ上でのピン番号を入れておきます。続くGPIO.serwarnings()は、GPIOを再操作した時に、既に当該ピンが使用中である旨の警告が出るので、これを抑止するために書いておきます。次にGPIO.setmode()で各ピンを出力に設定。あとは、天気予報に合わせた色をRGBで各ピンに設定するだけです!

さて、天気をどの色で表現するか。ご所望の田無タワーが、どの天気のときにどの色で光るかを調べてみるわけですけどね。。

スカイタワー西東京さん(公式)によれば
曇りは緑雨は水色に決定し、残りの紫が晴れ

Wikipedia先生によれば
晴れ=紫色 曇り=黄緑色 雨=青色

西東京市さんによれば
紫色:晴れ緑色:曇り青色:雨

と、若干矛盾系の殺伐とした雰囲気が感じられるんですが、とりあえずここでは
  • 晴れ:R+Gで紫
  • 曇り:Gで明るい緑
  • 雨:G+Bで水色
ということにしましょう。いずれでもない場合はとりあえず例外ということでだけ光らせておきます。

最終的なPythonコードは下記のようになります。 では実行してみましょうか。 天気予報によって異なる色でLEDが点灯するのを確認できます。

「曇り」のとき
「晴れ」のとき
カメラの露出開けすぎた?なんだか眩しい・・・


(おまけ) Raspbian起動時に実行、定期的に実行

自動化してみたいと思います。
上で作成したPythonファイルを、あらかじめ/usr/local/bin/にインストールしておきます。
それから、/usr/local/bin/getweather.pyの冒頭に次の1行(Shebang)を追加しておきます。 /usr/local/bin/にはPATHが通っているので、こうすることでgetweather.pyとだけコマンドすれば実行できるようになるわけです。

では、まずRPiの電源を入れてSDカードからRaspbianが立ち上がったときに一度実行させる方法。まず/etc/init.d/の下に適当な名前(ここではgetweather)でテキストファイルを作ります。
中身には次のスクリプトを書きます。
スクリプトファイルを実行可能に。
update-rc.dコマンドでスクリプトを登録します。今はinsserv使う方がナウいのかな?

次に、一定時間ごとに更新する方法。OpenWeatherMapの更新間隔というのもあると思いますが、ここでは単純に1時間おきのcronジョブを設定します。
rootのcrontabを編集します。この辺の扱いは諸説あると思いますが(crontab -eは間違えて-rで全消ししそうで危ないとか、直接エディタを使うのは行儀が悪いとか)、まぁ好みの方法でやったらいいと思います。
で、毎時0分に更新が行われるよう、下記の行を追加します。


参考情報

Free weather data API for developers - Open Weather Map
Weather information from openweathermap.org JSON API by Python - Techdoc Blog 
1: Getting Started with Raspberry Pi GPIO and Python - OPENMICROS.org
RPi Low-level peripherals - eLinux.org
How to add a program to run at startup in Ubuntu Linux Server edition - Temp Variable

Raspberry Piで田無タワー風天気予報ガジェットを作る(ハードウェア編)

日本の各地に、西にそびえる山にかかる雲を見て翌日の大まかな天気を知るという文化があるといいます。天気が西から東へ移り変わるという性質を利用したもので、私の故郷でも、気象情報に関する各種の観測、伝達技術が発達した現代にありながら、局所的で簡易な天気予報の手段として重宝されています。
テレビやラジオで天気予報を得るには、放送を待つ、あるいはタイミングに合わせて視聴する必要があります。インターネットや電話(177)の場合、いくつかの操作が必要です。場所や時間の制約が緩やかで、かつ何らの操作も無しに情報を得られることには、究極的な利便性が潜んでいると思います。たとえその情報量が、その他の比較的複雑な手段によって得られるものよりも少ないとしても。
こと天気予報に関しては、古くから使われてきた原始的な情報ということもあり、簡便な伝達手段がいろいろ考えられてきました。そのひとつとして有名なのが大阪の通天閣。塔の上に設置されたネオンサインの色で翌日の天気を伝えており、山にかかる雲を見上げるのと同じように、非常に簡単に情報を得ることができるわけです。これと同様の設備が、西東京市にある電波塔、通称「田無タワー」にも設置されています。かつてこの田無タワーを日々眺めていたことのある私にとっては、かろうじて愛着が無くもない存在です。

そんなわけで、今回、田無タワーっぽい感じで翌日の天気を教えてくれる自家製ガジェットをRaspberry Piを使ってこさえてみました。

まずはハードウェア部分についてまとめて行きたいと思います。


部品

  • ユニバーサル基板ダイセン電子工業 PU26x44 手頃なサイズだったので。両面に部品配置しはんだ付けしたかったので、両面スルーホールにしました。千石共立チップワンストップあたりで買えます。
  • ピンソケット - 2x13ピンソケット RPiのP1ヘッダに合わせて。
  • フルカラーLED - OSTA71A1D アノードコモンのRGBフルカラー角型LED。明るい。
  • トランジスタ - 2SC1815 LEDドライブ用のNPN。まとめ買いして家にストックしておくと便利ですよ。RPiのGPIOはパッドあたりデフォルトで8mAのシンク/ソースしか許容できないため、このようなドライブの手段が必要です。
  • 抵抗 - LEDの電流制限用に91Ω、240Ω、330Ωを一つずつ(この辺はRGBのカンデラ比を考慮して順方向電流を調整するためざっくり計算しています)、それからトランジスタのベース入力用に1kΩを三つ。いずれも2012サイズのチップを選びました。



回路



組み立て

(1) 画像の位置にB面からピンソケットを配置してA面ではんだ付けします。

(2) LEDとトランジスタをA面に配置してB面側からはんだ付けします。

(3) B面に、まず抵抗を取りつけていきます。R、G、B各チャネル用のトランジスタのエミッタ(E)がつながっているランドに、電流制限抵抗を取りつけます。また各ベース(B)には、1kΩを取りつけます。電流制限抵抗の反対側は、LEDのRGBそれぞれのカソード(K)の足に接続します。ベース入力抵抗はA面で接続しますので、ベースの反対側のランドにはんだ付けすればOKです。最後に、トランジスタのコレクタ(C)の足をまとめてピンヘッダのグラウンド(GND)につながるようにします。画像では、配線の取り回しで、途中からA面にしています。
配線ミスってはんだ付けをやり直したので、ヤニが汚い・・・
(4) A面の配線です。トランジスタのベース入力抵抗を、RPiのP1ピンヘッダの、11ピン、13ピン、15ピンに接続します。Rev.2のボードなら、それぞれGPIO17、GPIO27、GPIO22に対応しています。Rev.1の場合は、13ピンがGPIO27ではなくGPIO21となります。B面から引き揚げたGNDラインも忘れずに25ピンへ接続。LEDのアノード(A)足へは2ピンの5Vから。

(5) RPiに取りつけたところ。