STM32F4DICOVERY+Wi-Fiモジュール+mrubyでWebサーバ
STM32F4DISCOVERYでmrubyを動かせましたが、次になにかしたいなと思っていたところ、簡単にマイコンに接続できるWi-Fiモジュールの存在を知りました。
このモジュールは、マイコンとシリアル通信上でATコマンドを使って簡単にWirelessの設定、TCP/IP通信ができるというものです。菅工房さんのページに詳しく解説されています。
菅工房 低消費電流 Wi-Fiモジュール
ATコマンドの詳細なリファレンスの入手には本来NDA契約の手続きが必要で、自分は契約書のコピーをファイルで送ったりしたのですが、うんともすんとも連絡が来ないので、WebでPDFを見つけて来ました^^;
で、このGS1011とSTM32F4DISCOVERYを接続し、簡易Webサーバを書いて基板上にある4色のLEDを制御してみました。
実装
GS1011とのシリアル通信を含むTCPライブラリをCで書き(かなり適当)、その上にこれまた適当なWebサーバをC/mrubyの混合ででっち上げ、その上のWebアプリ(?)とLEDの制御をmrubyで書きました。
一番上のWebアプリ的なものはSinatraライクに書けるようにしてあります。こんな感じ。多少はRubyらしいでしょうか?
include RouterDSL #sinatraの超簡易版 get() include Arduino #mruby-arduino。pinMode()やdigitalWrite() #各LEDのPIN番号 LED_GREEN = 60 LED_ORANGE = 61 LED_RED = 62 LED_BLUE = 63 #LEDの初期化 [LED_GREEN, LED_ORANGE, LED_RED, LED_BLUE].each do |led| pinMode(led, OUTPUT); end html = <<EOS <html> <head><title>STM32F4-Discovery LED Controller</title></head> <body align=center> <p>Hello mruby Wifi Web Server</p> <li><a href="/control/green/on"> green on</a></li> <li><a href="/control/green/off"> green off</a></li> <li><a href="/control/orange/on"> orange on</a></li> <li><a href="/control/orange/off"> orange off</a></li> <li><a href="/control/red/on"> red on</a></li> <li><a href="/control/red/off"> red off</a></li> <li><a href="/control/blue/on"> blue on</a></li> <li><a href="/control/blue/off"> blue off</a></li> </body> </html> EOS get "/" do html end get "/control/:color/:onoff" do |color, onoff| pin = case color when "green" LED_GREEN when "orange" LED_ORANGE when "red" LED_RED when "blue" LED_BLUE else return "I don't have color:#{color}" end if (onoff == "on") digitalWrite(pin, HIGH) elsif (onoff == "off") digitalWrite(pin, LOW) else return "Bad control:#{onoff}. should be on or off" end html end
HTTPヘッダの解析なんかも正規表現ライブラリmasamitsu-murase/mruby-hs-regexpを使わせてもらってかなり楽ができました。
で、ブラウザからアクセスするとこんな感じのページが表示されます。
"green on"をクリックすると緑色のLEDが点灯、"orange off"をクリックするとオレンジ色のLEDが消灯、、といった感じです。この基板は青色LEDが綺麗です。
メモリ
で、本当はLEDの状態に合わせてHTMLも変えたいのですが、文字列を色々操作しているとRAM不足に陥りました。
ただ、STM32F4DISCOVERYのもう一つのメモリ空間(64KB)がほとんど余っています。ここにベースとなるHTMLのテンプレートを置いたり、mrubyの初期化で確保している大きめの領域(20kb程度)を置けばまだいける!はず?