コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

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)基本コマンド

基本コマンドには下記があります。

  • pinMode(pin, mode)
  • digitalWrite(pin, value)
  • digitalRead(pin)
  • analogWrite(pin, value)
  • analogRead(pin)
  • analogWriteDAC(pin, value)
  • analogReference(type)
  • analogWriteDAC(valueHz)
  • pulseIn(pin, value[, timeout])
  • delay(msec)
  • millis()

基本コマンド 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)

シリアル通信コマンド XBee通信初期化: Serial.XBee

Serial.XBee([baudrate])
  baudrate: ボーレート
  stdin: 標準
   省略時は9600bpsです

シリアル通信コマンド 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キャラクタ液晶に表示することができるコマンドです。

液晶表示コマンド 液晶表示: Lcd.write

Lcd.write(string[,pos])
  string: 文字
  pos: 0:上段, 1:下段

以上です。

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の使い方などを随時紹介していきたいと思います。