LUAスクリプト
ライントレースのみのコード
2つのセンサーからの信号に応じて、左右のモーターをオンオフさせます。無線LANによるリモートコントロールが不要であれば、 このコードのみでライントレースができます。まずは、これでセンサーおよびモーターの動作確認ができます。
trace.lua
local s, indata, sens
s, indata = fa.pio(0x18, 0x00)
while (true) do
sens = bit32.band(indata, 0x06)
if (sens == 0x00 or sens == 0x06) then
s, indata = fa.pio(0x18, 0x18)
elseif (sens == 0x02) then
s, indata = fa.pio(0x18, 0x08)
elseif (sens == 0x04) then
s, indata = fa.pio(0x18, 0x10)
end
sleep(5)
end
2行目: センサーを読み込みます。
4行目:
0x06でマスクして2ビットを抽出します。各ビットの1が白、0が黒を意味します。5、6行目: センサーが両方とも白か、両方とも黒の場合は、左右のモーターをオンし、同時にセンサーを読み込みます。
7、8行目: 左センサーが白、右センサーが黒の場合は、左モーターをオン、右モーターをオフにし、同時にセンサーを読み込みます。
9、10行目: 左センサーが黒、右センサーが白の場合は、左モーターをオフ、右モーターをオンにし、同時にセンサーを読み込みます。
無線LANによる通信を含むコード
共有メモリに書き込まれた情報を読み出して、ライントレース、前進、左回転、右回転、停止を行います。 共有メモリの使い方については綾瀬ヒロさんにご教示いただきました。
trace2.lua
local i, b, c, h, s, sens
local indata = 0
sleep(15000)
collectgarbage("stop")
b,c,h = fa.request("http://127.0.0.1/command.cgi?op=131&ADDR=0&LEN=1&DATA=T")
i = 0
while (true) do
if (i % 10 == 0) then
b,c,h = fa.request("http://127.0.0.1/command.cgi?op=130&ADDR=0&LEN=1")
end
if (i % 10 == 5 ) then
collectgarbage("collect")
end
if (b == "T") then
sens = bit32.band(indata, 0x06)
if (sens == 0x00 or sens == 0x06) then
s, indata = fa.pio(0x18, 0x18)
elseif (sens == 0x02) then
s, indata = fa.pio(0x18, 0x08)
elseif (sens == 0x04) then
s, indata = fa.pio(0x18, 0x10)
end
elseif (b == "R") then
s, indata = fa.pio(0x18, 0x10)
elseif (b == "L") then
s, indata = fa.pio(0x18, 0x08)
elseif (b == "F") then
s, indata = fa.pio(0x18, 0x18)
else
s, indata = fa.pio(0x18, 0x00)
end
i = i + 1
if (i > 9999) then
i = 0
end
end
3行目: 無線LANの接続などのために15秒待ちます。
4行目: 自動ガベージコレクションを停止させます。
5行目: 共有メモリーに初期値として
T(トレース)を書き込みます。8-10行目: 繰り返しの10回に1回、メモリーから一文字読み出し、
bに格納します。11-13行目: 繰り返しの10回に1回、強制的にガベージコレクションを実行させます。
14-22行目:
Tならライントレース。この部分は上記trace.luaとほぼ同じです。23-31行目:
Rなら右回転、Lなら左回転、Fなら直進、それ以外は停止。