最近,研究に使う関係で色々なマイコンを調べていますが,その中でも比較的最近発売された netduino 3 wifi というのがおもしろそうだったので,個人的に購入して遊んでみました.
netduino 3 wifi の特徴は
- C#でプログラムが書ける(.NET Micro Frameworkで動く)
- インターネットにアクセスするのに十分なスペック
- WiFi内蔵
- Cortex-M4 (168MHz)
- ROM 1408 KB
- RAM 164+ KB
- Arduinoと同等のサイズ感
といったところです.この特徴を活かせる物が作りたかったので,最近欲しいと思っていた雨量確認ガジェットを作ることにしました.
雨量確認ガジェットは株式会社バニーホップさんが
雨量確認ガジェットは株式会社バニーホップさんが
で公開されているもので,Yahooの気象情報APIを使って降水量の経過と推定値を取得し,外出時に傘を持っていくかどうかを判断するための情報を表示します.
OLEDディスプレイ
netduino 3 wifi にはWiFiとLEDが最初からついているので,雨量情報を取得して傘の必要性を表示するという最低限の機能であれば 単体で実現できるのですが,せっかく大きめのメモリーがあるので,表示をちょっと豪華にすることにしました.
個人的にOLEDディスプレイのコントラストが好きなので,ここでは
を使っています.あいにくnetduinoから表示をおこなうライブラリは存在しませんでしたが,netduinoで似たようなOLEDディスプレイを利用する記事とライブラリ
が公開されていたので,Adafruitさんが公開しているArduno用のライブラリ
と組み合わせて,ライブラリを作りました.以下で公開しておきます.
また,ビットマップデータをリソースとして埋め込むために,画像データをOLEDコントローラのVRAMと同じ構造のバイナリファイルに変換するプログラムがあると便利です.探せば汎用性のあるツールがありそうな気がしますが,探すより作ったほうが速そうだったのでこれも作りました.このプログラムは以下のようになります.
配線はOLEDディスプレイとnetduinoの間だけです.Arduino用のプロトタイプシールドを使えば楽に配線できそうですが,OLEDモジュールの面積が小さいためにのっぺらぼうになる部分が大きくなり,netduinoの基板が見えていた方が格好良くなるように思ったので,適当なパーツを作ってOLEDモジュールをnetduino上部に固定し,配線は空中で行っています.
ちなみに,スタンド部分はあり合わせのレゴブロックで作っています.
アイコン類は適当に描いたものを使っていますが,OLEDのコントラストのおかげでそれなりにカッコよく納まっているとおもいます.
今回一番苦労したのは傘が不要な時の表示です.何も表示しないほうがわかりやすい気もしましたが,寂しい気がしたので傘立てに入っているかさを表示することにしました.
一方,はまりやすい点は .NET Micro Framework と .NET Framework の違いによる部分でしょうか.予想外の使えない機能がちょくちょくあります.たとえば,.NET Micro Framework では多次元配列は使えず,配列の配列を使うか適当にインデックス計算を実装しないといけないようです.そもそもC#を使ったことが数えるほどしか無いので,逐一ネットで調べつつコードを書きましたが,そのあたりで何回か困りました.
また,ビットマップデータをリソースとして埋め込むために,画像データをOLEDコントローラのVRAMと同じ構造のバイナリファイルに変換するプログラムがあると便利です.探せば汎用性のあるツールがありそうな気がしますが,探すより作ったほうが速そうだったのでこれも作りました.このプログラムは以下のようになります.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from PIL import Image | |
import numpy | |
infile="norain.png" | |
outfile="norain.bin" | |
img = Image.open(infile) | |
print(img.size) | |
pix= img.load() | |
binarray = numpy.zeros((img.size[1]*img.size[0],),dtype=numpy.int16) | |
k=0 | |
with open(outfile, "wb") as fout: | |
for y in range(img.size[1]): | |
for x in range(img.size[0]): | |
c=0 | |
c = pix[x,y][0]>>3 | |
c <<= 6 | |
c |= pix[x,y][1]>>2 | |
c <<= 5 | |
c |= pix[x,y][2]>>3 | |
binarray[k]=c | |
k=k+1 | |
fout.write(binarray) |
プロキシ越しのインターネットアクセス
WiFiにつなぐのはnetduinoをPCに接続し“.NET Micro Framework Deploy Tool” の[Target]-[Configuration]-[Network]で設定すれば特にプログラムを書くこともなくDHCPでIPアドレスなどを取得するところまでやってくれるのですが,プロキシ越しのインターネットアクセスについては以下のサンプルを参考にしました.
以前のバージョンのSDKには付属していたサンプルが最新のSDKには付属しなくなっているようで,探すのがちょっと面倒でした.気象情報APIからのデータの利用
気象情報APIはJSONもしくはXMLで結果を返してくれます.ネットで簡単に調べてみたところによるとXMLを解釈するライブラリは重く,netduinoには荷が勝ちすぎるようだったので,JSON形式でデータを取得し,
を使って解釈することにしました.
完成品
![]() |
レゴブロックで作ったスタンド |
既に雨が降っているときは開いた傘を表示.
下のグラフは過去2時間と今後1時間の降水量(実測/予測値)
|
![]() |
一時間以内に降水が予想されるときには,たたんだ傘のアイコンを表示 |
![]() |
今後1時間に降水が予測されないときは傘立てを表示. |
今回一番苦労したのは傘が不要な時の表示です.何も表示しないほうがわかりやすい気もしましたが,寂しい気がしたので傘立てに入っているかさを表示することにしました.
感想・まとめ
netduino 3 wifi は,Arduinoなどと比べるとかなりスペックに余裕があり,C#でプログラムを書ける点がすごく良いと思います.
Raspberry Pi はマイコンというよりは小さいPCなので,セットアップやデプロイのお手軽さという点では今一つですが,その点 netduino はもろもろのセットアップがお手軽で, インターネットに接続する単機能ガジェットを作るのに適していると思います.
一方,はまりやすい点は .NET Micro Framework と .NET Framework の違いによる部分でしょうか.予想外の使えない機能がちょくちょくあります.たとえば,.NET Micro Framework では多次元配列は使えず,配列の配列を使うか適当にインデックス計算を実装しないといけないようです.そもそもC#を使ったことが数えるほどしか無いので,逐一ネットで調べつつコードを書きましたが,そのあたりで何回か困りました.
2 件のコメント:
Hello, can you share the code .ino, thanks.
コメントを投稿