STM32F4DICOVERY+Wi-Fiモジュール+mrubyでWebサーバ

STM32F4DISCOVERYでmrubyを動かせましたが、次になにかしたいなと思っていたところ、簡単にマイコンに接続できるWi-Fiモジュールの存在を知りました。

GAINSPAN GS1011シリーズ
http://www.sugakoubou.com/doku/lib/exe/fetch.php?hash=2c0bd5&media=http%3A%2F%2Fwww.sugakoubou.com%2Fstore%2Fimages%2Froboba023.jpg

このモジュールは、マイコンとシリアル通信上で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程度)を置けばまだいける!はず?