Marida2を公開しました
LuaridaのAndroid UI処理部分を独立させたものをMaridaとして公開していましたが、新たにMarida2として公開しました。Android Ver 2.3.3以降対応となっています。機能は現在のところMaridaとほぼ同じです。
ダウンロードはGooglePlayからお願いします。Marida2のダウンロード
SakuLua Ver1.08をリリースしました
SakuLua Ver1.08では、変数をフラッシュに格納したり取り出したりできるコマンドを実装しました。sys.push()とsys.pop()です。
説明はSakuLuaコマンド一覧に追加しました。
これで、フラッシュメモリを複数のスクリプトから共通して呼び出すメモリ領域として使えます。ただし、GR-SAKURAのフラッシュメモリは5万回程度の書き換え回数ですので、注意して使ってください。
しかも、今回のコマンドは連続アドレス書き換えに対応したので、連続した2バイトに書き込みを行うと、4回書くことになり、さらにフラッシュ寿命が半分になります。
システムコマンド フラッシュメモリに書き込みます: sys.push
sys.push(address, buf, length) address: 書き込み開始アドレス(0x0000〜0x7fff) buf: 書き込むデータ length: 書き込むサイズ 戻り値 1:成功, 0:失敗
システムコマンド フラッシュメモリから読み出します: sys.pop
sys.pop(address, length) address: 読み込みアドレス(0x0000〜0x7fff) length: 読み込みサイズ 戻り値 読み込んだデータ
SakuLua用Luaスクリプトをターミナルから手打ちする
SakuLua用のスクリプトをシリアル接続した端末から手入力するためのLuaスクリプトを書いてみました。
ちょっとテスト的にスクリプトをテストしたいとか、ターミナルからプログラムを打ち込みたいときのために、PCのターミナルで複数行書いたLuaスクリプトを実行できるLuaスクリプトを書きました。
----Multi Lines Run Serial.println("Input end with [Ctrl-z]") m="" while(true)do repeat k = Serial.read() until(k>0) if(k==26)then break end if(k==8)then m=m:sub(1,m:len()-1) else m=m..string.format("%c",k) end Serial.print(string.format("%c",k)) end Serial.print("\n") if(m:len()==0)then Serial.println("\n loader.lua Running...") sys.setrun("loader.lua") else m = m:gsub("^%s*(.-)%s*$", "%1") SD.open( 0, "linesrus.lua", 2 ) SD.write(0, m, m:len()) m=";if(a~=nil)then Serial.println(a) end;" SD.write(0, m, m:len()) SD.close(0) sys.setrun("linesrus.lua") end
使い方
端末からプログラムを入力します。編集は[BS]のみ対応しています。入力の終了は[Ctrl-z]を押します。下記は入力例です。
Input end with [Ctrl-z] for i=0,3 do pinMode(100+i,1) end for j=1,10 do for i=0,3 do digitalWrite(100+i,1) end delay(500) for i=0,3 do digitalWrite(100+i,0) end delay(500) end Input end with [Ctrl-z]
LED 4個が点滅します。
Ctrl-zを入力できない端末の場合は、適宜、if(k==26)のif文を変更してください。あと、プログラムを見れば気づくと思いますが、Ctrl-zのみを入力するとloader.luaが呼ばれます。
また、変数 aを使って、a= と代入する形で書けば、aの内容を表示するようにしました。例えば下記のように計算式を入れると、結果を表示してくれます。
Input end with [Ctrl-z] a=math.sin(45) 0.85090357065201 Input end with [Ctrl-z]
こうなってくると、ファイル名を指定して保存したり、SDメモリカードにあるLuaスクリプトを選択実行できる機能が欲しくなってきますね。
SakuLuaコマンド一覧 (2013/02/1現在)
SakuLuaの実装コマンドを説明します。
(1)基本コマンド
基本コマンドには下記があります。
基本コマンド PINのモード設定: pinMode
pinMode(pin, mode) pin: ピンの番号 mode: 0: INPUTモード 1: OUTPUTモード 3: OUTPUT_HIGH モード(高駆動出力
基本コマンド デジタルライト: digitalWrite
digitalWrite(pin, value) pin: ピンの番号 mode: 0: LOW 1: HIGH
基本コマンド デジタルリード: digitalRead
digitalRead(pin) pin: ピンの番号 戻り値 0:LOW 1:HIGH
基本コマンド アナログライト: analogWrite
analogWrite(pin, value) pin: ピンの番号 value: 出力PWM比率(0〜255)
基本コマンド アナログリード: analogRead
analogRead(pin) pin: ピンの番号 戻り値 10ビットの値(0〜1023)
基本コマンド アナログDAC出力: analogWriteDAC
analogWriteDAC(pin, value) pin: ピンの番号 value: DAC出力10BIt(0〜4095)
基本コマンド アナログリファレンス: analogReference
analogReference(type) type: 0: DEFAULT 1: INTERNAL 2: EXTERNAL 3: RAW12BIT
基本コマンド アナログPWM周波数設定: analogWriteFrequency
analogWriteDAC(valueHz) valueHz: 設定する周波数(12〜184999Hz)
基本コマンド ピンに入力されるパルスを検出: pulseIn
pulseIn(pin, value[, timeout]) pin: ピンの番号 value: パルスの種類(HIGH(1)またはLOW(0)) timeout: timeout タイムアウトまでの時間(単位・マイクロ秒) デフォルトは1秒 戻り値 パルス時間
基本コマンド 指定時間待ちます: delay
delay( msec ) msec: 時間(msec)
基本コマンド ミリ秒を取得します: millis
millis() 戻り値 起動してからのミリ秒数
(2)システムコマンド
システムコマンドには下記があります。
- sys.setrun( filename )
- sys.ver()
- sys.exit()
システムコマンド Luaファイルを実行します: sys.setrun
sys.setrun( filename ) filename: 実行するLuaファイル名 このコマンドを呼べは直ぐにLuaファイルが実行されるわけではない。 今動いているLuaスクリプトを終了させたときに呼び出される。
システムコマンド バージョンを取得します: sys.ver
sys.ver() 戻り値 SakuLuaのバージョン
システムコマンド 終了します: sys.exit
sys.exit() 現在走っているLuaスクリプトを強制終了させるのですが、 SakuLuaは続けてsys.setrun()で設定されたLuaスクリプトを実行します。 本当に止めたいときは、while(true)do end として無限ループにしてください。
システムコマンド フラッシュメモリに書き込みます: sys.push
sys.push(address, buf, length) address: 書き込み開始アドレス(0x0000〜0x7fff) buf: 書き込むデータ length: 書き込むサイズ 戻り値 1:成功, 0:失敗
システムコマンド フラッシュメモリから読み出します: sys.pop
sys.pop(address, length) address: 読み込みアドレス(0x0000〜0x7fff) length: 読み込みサイズ 戻り値 読み込んだデータ
(3)RTCコマンド
RTCコマンドには下記があります。
- RTC.set(year, mon, day, hour, min, sec)
- RTC.get()
RTCコマンド RTCの時計をセットする: RTC.set
RTC.set(year, mon, day, hour, min, sec) year: 西暦 mon: 月 day: 日 hour: 時 min: 分 sec: 秒
RTCコマンド RTCの時計を取得する: RTC.get
RTC.get() 戻り値 6つ 西暦, 月, 日, 時, 分, 秒 year, mon, day, hour, min, sec = RTC.get() のように受けてください。
(4)I2Cコマンド
I2Cコマンドには下記があります。
I2Cコマンド I2C送信開始準備: Wire.beginT
Wire.beginT(address) address: ターゲットデバイスのアドレス 0〜0x7Fまでの純粋なアドレスを与えること
I2Cコマンド 送信する1byteのセット: Wire.writeB
Wire.writeB(byte) byte: 送信したいデータ 戻り値 成功: 1 失敗: 0
I2Cコマンド 送信するデータのセット: Wire.writeI
Wire.writeI(int) int: 送信したいデータ 戻り値 成功: 送信したバイト数 失敗: 0
I2Cコマンド 送信する文字列のセット: Wire.writeT
Wire.writeT(text) text: 文字列 戻り値 成功: 送信したバイト数 失敗: 0
I2Cコマンド 送信するデータブロックのセット: Wire.writeA
Wire.writeA(array, length) array: データ配列 length: データサイズ 戻り値 成功: 送信したバイト数 失敗: 0
I2Cコマンド I2Cに送信する: Wire.endT
Wire.endT() 戻り値: 0: 成功 1: 送信バッファ溢れ 2: スレーブアドレス送信時にNACKを受信 3: データ送信時にNACKを受信 4: その他のエラー
I2Cコマンド SDA,SCLピンの割り当て任意のピンに変更する: Wire.SdaScl
Wire.SdaScl(sda, scl) sda: データ端子ピン番号 scl: クロック端子ピン番号
I2Cコマンド I2Cマスターとして初期化する: Wire.master
Wire.master()
(5)シリアル通信コマンド
シリアル通信コマンドには下記があります。
- Serial.XBee([baudrate])
- Serial.USB([baudrate])
- Serial.setDef()
- Serial.print([str])
- Serial.println([str])
- Serial.read()
- Serial.write(buf,len)
シリアル通信コマンド USB通信初期化: Serial.USB
Serial.USB([baudrate]) baudrate: ボーレート 省略時は9600bpsです
シリアル通信コマンド 標準出力に対応させます: Serial.setDef
Serial.setDef()
シリアル通信コマンド シリアルに出力します: Serial.print
Serial.print([str]) str: 文字列 省略時は何も出力しません
シリアル通信コマンド シリアルに\r\n付きで出力します: Serial.println
Serial.println([str]) str: 文字列 省略時は何も出力しません
シリアル通信コマンド シリアルから1バイト取得します: Serial.read
Serial.read() 戻り値 0x00〜0xFFの値、データが無いときは-1が返ります
シリアル通信コマンド シリアルにデータを出力します: Serial.write
Serial.write( buf, len ) buf: 出力データ len: 出力データサイズ 戻り値 出力したバイト数
(6)SDメモリカードコマンド
SDメモリカードコマンドには下記があります。同時に開けるファイルは2つです。
- SD.read(number)
- SD.seek(number, byte)
- SD.write(number, buf, len)
- SD.open(number, filename[, mode])
- SD.close(number)
SDメモリカードコマンド openしたファイルから1バイト読み込みます: SD.read
SD.read( number ) number: ファイル番号 0 または 1 戻り値 0x00〜0xFFが返る。ファイルの最後だったら-1が返る。
SDメモリカードコマンド openしたファイルの読み出し位置を移動する: SD.seek
SD.seek( number, byte ) number: ファイル番号 0 または 1 byte: seekするバイト数(-1)でファイルの最後に移動する 戻り値 成功: 1, 失敗: 0
SDメモリカードコマンド openしたファイルバイナリデータを書き込む: SD.write
SD.write( number, buf, len ) number: ファイル番号 0 または 1 buf: 書き込むデータ len: 書き込むデータサイズ 戻り値 実際に書いたバイト数
SDメモリカードコマンド ファイルをオープンします: SD.open
SD.open( number, filename[, mode] ) number: ファイル番号 0 または 1 filename: ファイル名(8.3形式) mode: 0:Read, 1:Append, 2:New Create 戻り値 成功: 番号, 失敗: -1
SDメモリカードコマンド ファイルをクローズします: SD.close
SD.close( number ) number: ファイル番号 0 または 1
(7)液晶表示コマンド
液晶表示コマンドには下記があります。
- Lcd.write(string[,pos])
液晶表示に関しては、ストロベリーリナックス製のI2Cキャラクタ液晶に表示することができるコマンドです。
SakuLua Ver 1.07リリース
GR-SAKURAってご存知でしょうか?若松通商とルネサスが共同開発したマイコンボードです。詳しくは下記のサイトで見てください。
http://japan.renesas.com/press/news/2012/news20120619.jsp
http://japan.renesas.com/products/promotion/gr/index.jsp
このGR-SAKURA通称SAKURAボードで動くLuaソフト「さくるあ」のVer1.07を公開しました。本ブログでは初めての紹介なので、使い方などを書きたいと思います。
入手方法
SakuLuaはオープンソースとしてgithubで公開しています。場所は下記です。
https://github.com/tarosay/SakuLua
ここからダウンロードしてください。
ビルド方法
sketch.binは付属しているのですが、自分のプログラムにLuaを組み込もうという人のために、ソースを公開しています。ちょっと複雑なことをさせようとすると、どうしてもメモリが足りなくなると思います。そんなときには、自分に不必要なライブラリを削って再ビルドもできるように公開しました。
どうぞ、私のサイトからforkしていじってください。
ビルドの方法だけ簡単に書いておきます。
Lua-5.1.5をダウンロードしてください。Lua-5.2も試したのですが、5.1.5の方がサイズが小さくなったので、こちらを採用しました。Lua-5.1.5は下記のURLにあります。
Lua Version history(http://www.lua.org/versions.html#5.1)
Lua-5.1.5を解凍した後、srcフォルダから以下のファイルを取り出して、gr_Lua/luaフォルダに置いてください。そして、lua-5.1.5.patchを当ててください。
gr_Lua/lua/ に下記のファイルを置く。
lapi.c lapi.h lauxlib.c lauxlib.h lbaselib.c lcode.c lcode.h ldebug.c ldebug.h ldo.c ldo.h
ldump.c lfunc.c lfunc.h lgc.c lgc.h linit.c llex.c llex.h llimits.h lmathlib.c lmem.c lmem.h
lobject.c lobject.h lopcodes.c lopcodes.h lparser.c lparser.h lstate.c lstate.h lstring.c
lstring.h lstrlib.c ltable.c ltable.h ltablib.c ltm.c ltm.h lua.h luaconf.h lualib.h
lundump.c lundump.h lvm.c lvm.h lzio.c lzio.h
$ patch < lua-5.1.5.patch
Luaの準備は以上です。
SakuLuaをビルドするには、Renesas Web CompilerにSakuLua一式をアップロードし、2つのライブラリをインポートしてください。ライブラリは「SDMMC Library for GR-SAKURA」と「I2C Library for GR-SAKURA」です。
これでビルド可能なのでbuildを実行し、sketch.binを生成してください。
SakuLuaの使い方
SakuLuaはSAKURAボードをLuaスクリプトで制御仕様というものです。LuaスクリプトはSAKURAボードのマイクロSDメモリカードに入れておきます。電源オンするとこのスクリプトが実行されます。
では、最初に実行されるファイルは何で決まるかというと、マイクロSDメモリカードにあるsakulua.xmlに書いておきます。
以下がsakulua.xmlファイルの中身です。
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <Config> <Start file="loader.lua" /> </Config>
file=に起動時に動かしたいLuaスクリプトファイルを指定しておいてください。ちなみに、SAKURAボードのファイル形式は8.3形式なので、ロングファイル名などは使えません。
実はソースを見てもらえれば分かると思うのですが、特にxmlパーサを実装しているわけではなく、file=を検索しているだけです。暴露しておきます。
実装していないLuaライブラリ
使用メモリサイズを小さくするため、標準のLuaライブラリを削っています。lua-5.1.5.patchの下の方に書いていますが、下記のライブラリは使用していません。
luaopen_package luaopen_io luaopen_os luaopen_debug、string や mathも、もし使わないのであれば、好みで削ってしまってもいいかもしれません。
実装したコマンド類
SAKURAボード用に新たに追加したコマンドを次のブログで書きたいと思います。
SakuLuaコマンド一覧へのリンク
ターミナルからSDカードに書き込み
SakuLuaのプログラムを作っているときに、いちいちSAKURAボードからSDメモリカードを引き抜き、SDメモリカードに書き込んで、SAKURAボードに挿すという一連の手間が非常に面倒に感じてきます。
そこで、PCの端末からシリアル経由でSAKURAボードのSDメモリカードに書き込むLuaスクリプトを書いてみました。
このスクリプトはgithubにある/SakuLua/gr_Lua/Script_Sample/フォルダに入っています。
loader.lua
loader.luaを簡単に説明します。下記がloader.luaのソースです。
----LuaLoader fm="" Serial.print("\nInput Lua filename>") while(true)do repeat k = Serial.read() until(k>0) if(k==10)then break end fm=fm..string.format("%c",k) Serial.print(string.format("%c",k)) end fm = fm:gsub("^%s*(.-)%s*$", "%1") Serial.println("\nFilename:["..fm.."]") fp = 0 SD.open( fp, fm, 2 ) SD.write( fp, "--"..fm.."\n", fm:len()+3 ) eflg=0 while(true)do t=millis()+1000 repeat k = Serial.read() if(t<millis())then Serial.println("Close?(Enter)") repeat l = Serial.read() until(l>0) if(l==10)then eflg = 1 break else k=l end t=millis()+1000 end if(k==0)then k=10 end until(k>0) if(eflg==1)then break end SD.write( fp, string.format("%c",k), 1 ) Serial.print(string.format("%c",k)) end SD.close( fp ) sys.setrun(fm)
実行すると、Input Lua filename>と送信するLuaファイル名の入力待ちになります。
Input Lua filename>
SDメモリカードに保存したいファイル名を入力しください。ファイル名を入力してEnterキーを押すと、スクリプト入力モードになります。
Input Lua filename>test.lua Close?(Enter)
ここで、Luaスクリプトファイルを送信してください。送信が終了すると再びClose?(Enter)と聞いてくるので、Enterキーを押すとSDメモリカードにLuaスクリプトが書かれて実行されます。
Input Lua filename>test.lua Filename:[test.lua] Close?(Enter) ----test for i=1,10 do Serial.print(i.." ") end Close?(Enter)
ここでEnterを押します。
Input Lua filename>test.lua Filename:[test.lua] Close?(Enter) ----test for i=1,10 do Serial.println(i.." ") end Close?(Enter) 1 2 3 4 5 6 7 8 9 10 Input Lua filename>
loader.luaがsakulua.xmlに書かれていれば、Luaスクリプトの実行が終了すると再びLuaファイル待ちになります。
手入力も可能
loader.luaプログラムを見ても分かるように、Close?(Enter)を無視して手打ちを続ければ、スクリプトの手入力も可能です。
Input Lua filename>test.lua Filename:[test.lua] Close?(Enter) -- for i=1,10Close?(Enter) do Close?(Enter) Serial.println(Close?(Enter) i..Close?(Enter) "Close?(Enter) Close?(Enter) "..iClose?(Enter) )Close?(Enter) Close?(Enter) end Close?(Enter) 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
Close?(Enter)を回避しながら、無理やり手入力した例です(^^;。実際のプログラムは下記のようです。
-- for i=1,10 do Serial.println(i.." "..i) end
CTRL-Zか何かを終了コードにしてClose?(Enter)を消すのもありかもしれませんね。
ドットインストールさんで「Luaの基礎」レッスンが公開されました
ブログ更新が約半年振りとなりました。ご無沙汰しています。
ついに、待っていました。あのドットインストールさんで、Lua言語のレッスンが始まりました。
Lua言語に興味のある方は、是非、チャレンジしてみてください。基礎編があるのだから、応用編も近いうちにあるに違いない・・・。
近況を報告しますと、最近、ルネサスのGR-SAKURAというボードで遊んでいます。このボードにLuaを移植しました。アプリ名はSakuLua(さくるあ)といいます。"さくら"+"るあ"で"さくるあ"です。
これがGR-SAKURA通称さくらボードでLuaが動いている写真です。プログラムはオープンソースとしてgithubに公開しています。https://github.com/tarosay/SakuLua
ブログでSakuLuaの使い方などを随時紹介していきたいと思います。