FlashAirのLua機能を使いPIO制御を行って見ます2
("秋月電子のFlashAir DIP IO ボード"でGPIO編)
〔FlashAir買ってみた編〕
〔PIO制御1〕
〔3〕
〔4〕
〔iSDIO機能〕
〔マイコンのトップに戻る〕
前ページではPIO制御の基本編を記事にしました、ですので前ページを見ているものとして書きます。
これが、"秋月電子のFlashAir DIP IO ボード"です。
SPI-I2CインタフェースICのSC18IS600IBSを搭載しています。
SC18IS600IBSはこの様にSPI信号をI2C信号に変換してくれます、しかもGPIO付きです。
FlashAir側からは、Lua機能(fa.spi)を使いPIO制御にてSPI(ソフト)でSC18IS600IBSと通信を行います。
このボードは電源2.8-6V入力で3.3Vレギュレータを内蔵なので内部は3.3V回路です、
ですが端子は5Vトレラント入力の様ですね。
ですがぁ回路を3.3Vで構成する場合に、レギュレータをパスして3.3V入力可としてほしいぞぉ。
ってかぁ3.3V電源出力を出してほしいぞぉ。 秋月さん!
PS. ボードに3.3V電源を入れて動かした所、動作しました、3.3V回路構成は大丈夫かもぉ。
このボードの裏に有るジャンパー(J1/J2)を半田盛すれば10KΩでI2C用としてプルアップが出来ます。
SC18IS600IBSの操作方法はここでは説明を省きますので、データシートを参照願います。
SC18IS600IBSのデータシートはこちらのサイト(NXP)からどうぞ。
PS.
SC18IS600IBSの"INT"端子とFlashAirの"D3"端子が接続されているが、あんまり意味ないです、
どうせなら"INT"でなく"WAKEUP"端子に接続してもらい、「Power-down」コマンドが発行出来るので
Power-down後、fa.spi("wakeup",LOW/HIGH)でおこすってして欲しいぞぉ、 秋月さん! 東芝さん!
《FlashAirのファームウェアバージョンチェック》
このページの実験には、FlashAirのファームウェアバージョンがV3.00.01以上でないと動作しません。
チェックは、FlashAirの\SD_WLAN\CONFIGファイルを開きます、”VERSION=FA9CAW3AW3.00.01”と
なっていればOKですが、そうでなければぁ、東芝サイトのソフトウェア更新ツールをダウンロードして
実行しましょう。
実行後は設定情報が買った時の状態に戻ります、注意ですね!!
(FlashAirTool.exeツールを実行してもバージョンは表示されますです、ハイ。)
《実験回路》
こんな感じで、電源は5Vです。
LEDは"GPIO0"ピンに1kΩ抵抗を介しての配線です。
スイッチは"GPIO1"ピンに10KΩでのプルアップ配線
SC18IS600IBSのGPIO端子ですがぁ、
初期値設定が双方向出力となっていてます、なのでぇ、
電源が入ると弱プルアップされていますので若干電流を
出力(Hi-Z)しています。
(LEDが薄っすらと私の髪みたいについているぞぉ)
端子をLOWに指示すればGNDに接続されるので出力は止まるのですがぁね。
このボードのI2C実験は次ページで行い、このページではGPIOのみ書きます。
《動作させて見る》
動作させる為の準備は前ページを読んでいますねぇ〜。
スイッチでLED点灯スクリプトファイル
@ 下記からダウンロードしたスクリプトファイル(boot_DIPIO_SWtoLED.lua)をFlashAirの
ルートディレクトリにコピーします。
A LUA_RUN_SCRIPT=/boot_DIPIO_SWtoLED.luaと書き換えて下さいねぇ〜。
B FlashAirを挿入し、電源ON、LED私の髪状態、約5秒後、LED消えます、さあスイッチを押す押忍♂
Luaスクリプトについて
基本は前ページを読んでいますねぇ〜。
PIO端子でSPI通信する為のFlashAir専用関数で"fa.spi"の使い方を説明します。
正規なリファレンスマニュアルはこちら(閉鎖)です。(ここに在り) *1)
ans = fa.spi(command,data)
SDインターフェースのPIOを使いSPI通信を行います。
command:SPI通信のコマンドを指示します、"init"、"mode"、"bit"、"write"、"read"、"cs"
data :各commandに付随するデータ
init = SPI通信速度の変更を行う。(デフォルト値は1000)
"init"値の話はこちらの"Segmentation Fault"さんサイトが詳しいです。
mode = SPIモード(データの送信タイミング)の指定を行う。(引数:0〜3、デフォルト値は3)
モード0:SCKがアイドル0Vで、0V->5Vに変化でデータを転送
モード1:SCKがアイドル0Vで、5V->0Vに変化でデータを転送
モード2:SCKがアイドル5Vで、5V->0Vに変化でデータを転送
モード3:SCKがアイドル5Vで、0V->5Vに変化でデータを転送
bit = 転送ビット数の指定を行う。(デフォルト値は8)
write = data値を送信します。
read = このコマンドの使い方が今一よく解らないですぅ。
cs = チップセレクト信号の制御。(引数1でCSはON、0でCSはOFF)
ans :wrie/readコマンドを発行した場合の受信データを返します。
これ以外の場合はステータスらしい?
例1) SPI通信の初期化
fa.spi("init",100)
fa.spi("mode",3)
例2) データを出力する
fa.spi("cs",0)
ans = fa.spi("write",0xFF) -- 1バイト送信と受信
fa.spi("cs",1)
fa.spi("read") -- この行は不必要で有るがぁ、な〜ぜかぁ無いと上手く動作しない!
print(ans) -- 受信データの表示
"fa.spi"でSPI通信を行う為の関数集の使い方を説明します。
(この関数集は"秋月電子のFlashAir DIP IO ボード"に限定した内容です)
【 SC18IS600でGPIO/I2C操作の共通関数群 】
RegisterWrite(adrs,dt)
"SC18IS600"の指定レジスタアドレスにデータを書込む処理
adrs:書込むレジスタのアドレスを指定します。
dt :書込むデータを指定します。
ans = RegisterRead(adrs)
"SC18IS600"の指定レジスタアドレスからデータを読込む処理
adrs:読込むレジスタのアドレスを指定します。
ans :読込んだデータを返します。
spiSetup(rate)
"SC18IS600"とSPI通信を行う為の初期化を行う処理。
SPIモードは3(アクティブLOW、立上がりで読取り)で初期化です。
rate:SPI通信の速度を指定します。(5=1MHz 46=400KHz 240=100KHz)
上記の"fa.spi"の"init"の値をそのままセットします。
【 SC18IS600でGPIO操作の関数群 】
pinMode(pin,mode)
"FlashAir DIP IO ボード"のGPIOピンの入出力を指定する処理
pin :設定するピンを指定します。(GPIO0/GPIO1/GPIO2/GPIO3)
mode:入力or出力を指定します。(INPUT/OUTPUT)
※ SC18IS600IBSのピン設定は実は4種類設定可能です。
双方向出力 = 入出力両方可能な設定(デフォルト)
入力専用 = 入力オンリーな設定(この関数の使う"INPUT"設定はこれです)
プッシュプル出力 = 電源を出力な設定(この関数の使う"OUTPUT"設定はこれです)
オープンドレイン出力 = 電源を外部から入れるぽいな設定
pinOutput(pin,value)
指定のポートピンにHIGH/LOW出力を行う処理
pin :出力するピンを指定します。(GPIO0/GPIO1/GPIO2/GPIO3)
value:出力値を指定します。(HIGH/LOW)
ans = pinInput(pin)
指定のポートピンから状態入力を行う処理
pin:入力するピンを指定します。(GPIO0/GPIO1/GPIO2/GPIO3)
ans:ピンの状態を返します。(HIGH=true LOW=false)
※ この関数集の部分を別ファイルにして、require("xxx");を行ったが上手く動作しませんでした。
なぁ〜ぜぇ、ファ〜イィ、バァキットォ。
《ブラウザから動作させて見る》
今度は、LED点灯をブラウザから行って見ます。
ブラウザからは"command.cgi"でFlashAirの共有メモリにデータを書き込みます、
で、FlashAirはLuaスクリプトが共有メモリ情報を読み、その内容でLEDをON/OFFさせると言う事です。
共有メモリは512バイト有ります、0-511番地で指定します。尚、電源切ったらメモリ内容は消えます。
※ 実行する場合は勿論、FlashAirのSSIDにパソコンの無線接続を切り換えますよ、念の為。
(切り換えはこちらを参考にしましょう)
ちょっとぉ実験
ブラウザのアドレスバーで下記を実行させて下さい。
"command.cgi"の正規なリファレンスマニュアルはこちら(閉鎖)です。(ここに在り) *1)
http://flashair/command.cgi?op=131&ADDR=0&LEN=5&DATA=ABCDE
op=131:共有メモリに書き込む為のコマンドです
ADDR :書き込むメモリの番地を指定します(0-511)
LEN :書き込むデータの長さを指定します(0-512)
DATA :書き込むデータをセットします(LEN長の文字列)
成功すれば、"SUCCESS"がブラウザに表示されます。
http://flashair/command.cgi?op=130&ADDR=1&LEN=3
op=130:共有メモリから読み込む為のコマンドです
ADDR :読み込むメモリの番地を指定します(0-511)
LEN :読み込むデータの長さを指定します(0-512)
成功すれば、"BCD"が表示されます、失敗は"400 Bad Request"が返るらしい。
HTMLで実行
@ 下記からダウンロードしたHTMLファイル(DIPIO_WEBtoLED.htm)をFlashAirの
ルートディレクトリにコピーします。
A 下記からダウンロードしたスクリプトファイル(boot_DIPIO_WEBtoLED.lua)をFlashAirの
ルートディレクトリにコピーします。
B LUA_RUN_SCRIPT=/boot_DIPIO_WEBtoLED.luaと書き換えて、SD起動時に実行させます。
C ブラウザのアドレスバーで"http://flashair/DIPIO_WEBtoLED.htm"を実行すれば下図の様に
表示されます。
これも[Google Chrome Vr48][Firefox 44]は動作しますが、IE10はダメです。
LuaのFlashAir専用関数"fa.sharedmemory"の使い方を説明します。
正規なリファレンスマニュアルはこちら(閉鎖)です。(ここに在り) *1)
ans = fa.sharedmemory(command, addr, len, wdata)
共有メモリにアクセスする為の関数です。
command:読み書きの動作を指示します、"write"、"read"
addr :読み書きするメモリの番地を指定します(0-511)
len :読み書きするデータの長さを指定します(0-512)
wdata :書き込む文字列データをセットします("read"時は0x00)
ans :"read"時はlen分の読込んだデータを返し、"write"時は 1=成功 nil=失敗
例) 共有メモリの0番地から1バイト読込む
ans = fa.sharedmemory("read", 0, 1, 0)
print(ans)
《ダウンロードファイルについて》
↓からダウンロードして下さい、このページで使うファイルを纏めて置きました。
FlashAir_DIPIO.lzh
解凍したファイルは以下です。
boot_DIPIO_SWtoLED.lua - スイッチでLED点灯スクリプトファイル(起動時実行)
boot_DIPIO_WEBtoLED.lua - ブラウザからLED点灯スクリプトファイル(起動時実行)
DIPIO_WEBtoLED.htm - ブラウザからLED点灯 HTMLファイル(ブラウザから実行)
《その他》
意外と簡単にPIO制御出来てしまいますねぇ、ちょっとぉバグ?不具合付きですがぁ。
"FlashAir DIP IO ボード"+"FlashAir"の組み合わせ結構な電気食いですねぇ、
この実験の為に新調した9V四角電池がもうなんだかぁ...."FlashAir"無線起動しっぱなしぃなので、
上手くスリープモードみたいなぁ出来ないのかしらねぇ。 東芝さん!。
次ページ以降で"FlashAir DIP IO ボード"でI2Cを行う予定です、
これが出来れば色々センサを付けてブラウザに表示させたりぃのみたいなぁデ〜タロガァが
出来てしまうですよぉ、その為にも電池で起動させたいぞぉ、 東芝さん!。
あぁ、太陽電池にすればぁ....でもぉ、コスパー高なカンジィ?。
(ノω\*) え、コスプレガイジン、キャツ ヾ( ̄ヘ ̄; )
リンクの見直し(*1) 2020/03/15
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.