FlashAirのLua機能を使いPIO制御を行って見ます3
("秋月電子のFlashAir DIP IO ボード"でI2C編)
〔FlashAir買ってみた編〕
〔PIO制御1〕
〔2〕
〔4〕
〔iSDIO機能〕
〔マイコンのトップに戻る〕
前のページでは、"秋月電子のFlashAir DIP IO ボード"でGPIO編"を書きましたね、
このページでは、"I2C編"を記事にしますが、前のページと前々のページに書いた物はここでは
省きますので、話の流れからしても前・前々を見てからここを読む事を勧めます。
"秋月電子のFlashAir DIP IO ボード"でI2C通信を行うには、Lua機能(fa.spi)を使いSC18IS600IBSに
コマンドとデータを送れば、SC18IS600IBSがI2C通信を行ってくれます。
I2C通信でデバイス(センサ等)へ書込み指示(R/W=0)を送るには、SC18IS600のメッセージコマンド0で
行い、読込み指示(R/W=1)を送る場合は、メッセージコマンド1を発行後コマンド6で読み出します。
メッセージコマンドの詳しい説明はここでは省きますので、データシートを参照願います。
SC18IS600IBSのデータシートはこちらのサイト(NXP)からどうぞ。
NICTのNTP時間について
今回センサ値のログ取りを行う為に、
NICT(National Institute of Information and Communications Technology:情報通信研究機構)が
NTPサーバを公開しているので利用します。(公開先サイトはこちらです) *1)
<(`^´)> 私は、NTPサーバより関鯖派です。 \(^^;ナンデヤネン
・現在時刻を文字列で得たい場合(ここではこれを利用しています)
"https://ntp-a1.nict.go.jp/cgi-bin/time"
ここにアクセスすれば、
"Fri Feb 19 14:54:11 2016 JST"
と文字列が返されます。
・現在時刻を通算秒で得たい場合
"https://ntp-a1.nict.go.jp/cgi-bin/ntp"
ここにアクセスすれば、
"3664850612.270 "
と返されます。
・現在時刻をJSON形式で得たい場合
"https://ntp-a1.nict.go.jp/cgi-bin/jsont"
jsont( {
"id": "ntp-b1.nict.go.jp",
"it": 0.000,
"st": 1455615440.986,
"leap": 35,
"next": 1435708800,
"step": 1
} )
とファイル(jsont.js)で返されます。
上記のアクセスには制限が有り、下記注意事項が書いて有ります。
1) 16秒間隔以上でのポーリングを推奨します 。
2) 1時間平均で20回(1日の合計が480回)を超えない様にして下さい。
それ以上が必要な場合は事前にご連絡下さい。
FlashAirの同時接続機能について
今回の実験では、NTP時間を得る為に5分毎(1時間に16回)に上記サイトにアクセスを行いますので、
インターネットに接続出来る様に、FlashAirの"インターネット同時接続機能を有効にする"操作を行う
必要が有ります。
@ ”FlashAirTool”を起動させます。(無論FlashAirはPCに接続)
A ツールのメニューから"ネットワーク設定"をクリックします。
B "インターネット同時接続機能を有効にする"にチェックを入れて、接続先の"SSID"と"パスワード"
を設定後、[適用]ボタンをクリックします。
《実験回路》
回路の電源は5Vです。
スイッチは"GPIO1"ピンに10KΩでプルアップ
配線です。
HDC1000は、電源が3-5Vです。
HDC1000は湿度と温度が計測出来ます。
I2C用のプルアップ抵抗は10KΩがHDC1000
モジュールに内蔵されています。
HDC1000のI2Cアドレスは、0x40(7bit)固定です、HDC1000の詳しい内容は、こちらを参照下さい
PS. *2)
現在HDC1000からSHT31-DISに切換っています、SHT31-DISについてはこちらを参照下さい
《動作させて見る》
動作させると、ブラウザに湿度と温度を約3秒毎に表示させられます。
センサ値は1秒毎に共有メモリに書き込んでいますが、ファイルの書き込みは5分毎に行っています。
(ふと気になったぁ、共有メモリの書込みってぇ、何万回とか制限有るんだろうか?、有れば1秒毎は.....)
尚、ログファイルはブラウザから削除したり、ダウンロードしたり出来ます。
※ 約5分毎の書込みですがぁ、これはsleep(1000)を284回数えたら5分としている事に注意しましょう、
300でなく284です、その他の処理で遅れるのでこの位です。
注意) この実験回路の電源を切る場合や、スロットからFlashAirを抜き取る場合は、必ずスイッチを
押しながら行って下さい、でないともしファイルの書込み動作中に電源を切ったりした場合に
ファイルが壊れます。
12:40:55,67.59,14.52,
12:45:54,68.23,15.68,
12:50:53,67.84,14.36,
12:55:52,74.52,12.59,
とぉ、こんな感じでCSV型式(時刻,湿度,温度,)で保存されています。
"16Feb1812.log"と言うファイル名は"年月日時"を表しますので、ひにちは解ると思います。
@ 下記からダウンロードしたHTMLファイル(DIPIO_WEBtoLOG.htm)をFlashAirの
ルートディレクトリにコピーします。
A 下記からダウンロードしたスクリプトファイル(boot_DIPIO_WEBtoLOG.lua)をFlashAirの
ルートディレクトリにコピーします。
B LUA_RUN_SCRIPT=/boot_DIPIO_WEBtoLOG.lua と書き換えて、SD起動時に実行させます。
C 後は、5秒後に"Lua"が起動するでしょう。
で、共有メモリには書込み始まりますが、ファイル書込みはこの後の5分してから始まります。
では、センサ値をブラウザでみて見ましょう、FlashAirのSSIDにパソコンの無線接続を切り換えてますね
D ブラウザのアドレスバーで"http://flashair/DIPIO_WEBtoLOG.htm"を実行すれば下図の様に
表示されます。

これも[Google Chrome Vr48][Firefox 44]は動作しますが、IE10はダメです。
共有メモリには[hhh.hh,ttt.tt,]の文字列で書込まれています。(h:湿度 t:温度)
"fa.spi"でI2C通信を行う為の関数集の使い方を説明します。
(この関数集は"秋月電子のFlashAir DIP IO ボード"に限定した内容です)
(この関数集には前ページの"SC18IS600でGPIO/I2C操作の共通関数群"が必要です)
【 SSC18IS600でI2C操作の関数群 】
i2cInit(clk)
I2Cの初期設定を行う処理
clk :I2Cの通信速度を指定します。(5=369KHz 18=102KHz)
5-255まで指定可能です、255で2.7KHz程らしぃ。
ans = i2cSend(adrs,len,dt)
指定のI2Cデバイスにデータを送信する処理
adrs :送信するデバイスの7bitアドレスを指定します。
len :送信するデータの長さを指定します。(MAX 96byte)
dt :送信データを配列で指定します。
ans :0=正常 これ以外の数値は、SC18IS600の"I2CStat"情報を返します。
1=指定したアドレスに対して応答がない。
2=指定したアドレスからACKが返ってこない。
3=I2CバスのBusy、これはマルチマスター時の"バスの衝突"と思います、
なので、通常は発生しないと思いますがぁ....。(英語なのでぇにゃんともぉ)
9=指定したデータ長さとデータが異なる。
※ ans=3以外はSSC18IS600のINTピンがLOWに駆動されます。
(駆動後は、"I2CStat"情報を読み出せばリセットされます)
例) locat dt = {}
spiSetup(50)
i2cInit(5)
dt[1] = 0x77
ans = i2cSend(0x40,1,dt)
アドレスは7ビットで表します、左図の1〜7ビットです。
0ビット目はR/Wでこれはデバイスに対する読書き指示ビットです。
R/W=0 : 書き込み要求です(デバイスは受信モード)
R/W=1 : 読み込み要求です(デバイスは送信モード)
例えば、このHDC1000は固定("1000000":40h)("1000000"+R/W)となりますので
R/W=0書込みなら"1000000"+"0"で0x80、R/W=1読込みなら"1000000"+"1"で0x81となりますが
ここでは7ビットで指定なので0x40となります。
ans,dt = i2cReceive(adrs,len)
指定のI2Cデバイスからデータを受信する処理
adrs :受信するデバイスの7bitアドレスを指定します。
len :受信するデータの長さを指定します。
ans :0=正常 これ以外の数値は、上記i2cSend()のans情報を参照。
dt :受信データを配列として返します。
例) locat dt = {}
spiSetup(50)
i2cInit(5)
ans,dt = i2cReceive(0x40,1)
print(dt[1])
ans = byte2int(hbyte,lbyte)
HIGHbyte/LOWbyteをintに結合する処理
ans :HIGHバイト(MSB)とLOWバイト(LSB)を1WORDにして返します。
例) ans = byte2int(1,123) -- 123(0x7B)
print(ans) -- 379(0x17B)
ログ取集を行う為の関数集の使い方を説明します。
(この関数集を使う場合は、同時接続機能が有効でないと動作しません)
【 ログの関数群 】
fputlog(fname,txt)
ログデータをファイルに書込む処理
指定したファイルが存在しない場合はFlashAirのルートディレクトリに作成されます、
指定のデータはファイルの最後に追加書き込みされます。
fname :ファイル名を指定します。
txt :書込む文字列を指定します。
※ ファイル作成時の作成・更新日時はセットされません、メモ帳やEXCEL等は表示されますが、
"TeraPad V1.09"は表示しないので、表示出来ないツールが有るかもね。
f,t = GetFnameTime()
NICTのNTP時間でファイル名生成と時間を得る処理
NTP時間が得られなかった場合は"nil"を返します。
f :NTP時間で作成したファイル名(xxxx.log)を返します。
t :NTP時間を"hh:mm:ss"で返します。
ファイル名ですが、[yymmmddhh.log]で作成していまして、現在のプログラムは下の1)で作っています
なので、1)の場合は時間毎にファイル名が変わります、って事はログは1時間毎の記録となります。
1日毎の記録なら2)を使い、ひと月毎の記録なら3)を使いって感じでプログラムを書き換えて下さい、
プログラムに切替え処理を組み込んでも良いのですがぁ、ファイルサイズを小さくしたい物でぇ...
1) [16Feb1914.log]型式のファイル名
n = string.sub(s,23,24)..string.sub(s,5,7)..string.sub(s,9,10)..
string.sub(s,12,13)..string.char(0x2E).."log"
2) [16Feb19.log]型式のファイル名
n = string.sub(s,23,24)..string.sub(s,5,7)..string.sub(s,9,10)..
string.char(0x2E).."log"
3) [16Feb.log]型式のファイル名
n = string.sub(s,23,24)..string.sub(s,5,7)..string.char(0x2E).."log"
※ NTP時間が得られなかった場合は、記録が抜けますが、MYヘァは抜けません。
HDC1000から湿度・温度を得る為の関数集の使い方を説明します。
(この関数集には前ページの"SC18IS600でGPIO/I2C操作の共通関数群"が必要です)
(この関数集には上記の"SSC18IS600でI2C操作の関数群"が必要です)
【 HDC1000操作の関数群 】
ans = hdcInit()
HDC1000の初期化を行う処理
温度(14bit)・湿度(14bit)で個別にデータを読出しで初期化
ans :0=正常 これ以外の数値は、上記i2cSend()のans情報を参照。
ans,humi,temp = hdcRead()
HDC1000から湿度と温度を読出す処理
ans :0=正常 これ以外の数値は、上記i2cSend()のans情報を参照。
humi :湿度を0.0〜100.0%で返します。
temp :温度を-40.0〜125.0℃で返します。
例) spiSetup(50)
i2cInit(5)
hdcInit()
ans,humi,temp = hdcRead()
print("humi=",humi)
print("temp=",temp)
《ログファイル削除とPCへの保存》
作成されたログファイルの操作方法を書いて置きます。
以下の方法は、FlashAirが"秋月電子のFlashAir DIP IO ボード"に刺さっている場合を想定しています。
当然、FlashAirのSSIDにパソコンの無線接続を切り換えますよ。
[削除]について
ログファイルが溜まってきたので整理したいと言う事が有るでしょう、たぶん。
FlashAirの組み込みCGIの"upload.cgi"を使います。
(正規なリファレンスマニュアルはこちら(閉鎖)ここですが、注意書き等有るので一読を勧めます) *2)
@ まず、"upload.cgi"を使うには、FlashAirの [SD_WLAN]フォルダー内"CONFIG"ファイルを開きます
そして、ファイル内の最後の行に"UPLOAD=1"を追記します。
A ブラウザのアドレスバーで下記を実行させて下さい。(xxxx.xxxはファイル名です)
"http://flashair/upload.cgi?DEL=/xxxxx.xxx"
B ブラウザに成功すると SUCCESS、失敗すると ERROR が表示されます。
※ アドレスバーで"http://flashair/"とするとFlashAirのファイル内容が表示されるので、
ファイル名は解るでしょう。
[PCへの保存]について
PC等でログファイルから解析したりグラフ表示したりぃのを行う場合に、FlashAirからPCへダウンロード
する操作です。
@ ブラウザのアドレスバーで"http://flashair/"を実行させて下さい。
A 表示された一覧から、保存したいファイルのアイコンを右クリックします。
サブ操作メニューが表示されるのでそこから[対象をファイルに保存(A)...]を操作すればOKです。
[FlashAirへの書込み]について
PCからFlashAirにファイルをアップロードする場合もメモして置きます。
"upload.cgi"を使います。
@ ブラウザのアドレスバーで
"http://flashair/upload.cgi"を実行
させて下さい。左が表示されます。
A 画面の[参照]ボタンをクリック操作し送りたいファイル名を選択します、選択後[submit]ボタンを
クリックすればFlashAirのルートディレクトリにコピーされます。
※ ルートディレクトリ以外にコピーしたい場合は、
"http://flashair/upload.cgi?UPDIR=/xxxxx"としてディレクトリを指定します。
"xxxx"にディレクトリ名を指定、もしディレクトリが存在しない場合は作成されます。
《ダウンロードファイルについて》
↓からダウンロードして下さい、このページで使うファイルを纏めて置きました。
FlashAir_LOG.lzh
解凍したファイルは以下です。
boot_DIPIO_WEBtoLOG.lua - センサのログを収集するスクリプトファイル(起動時実行)
DIPIO_WEBtoLOG.htm - ブラウザにセンサ値を表示させるHTMLファイル(ブラウザから実行)
《その他》
上記のログファイル操作ですがぁ、
HTML記述で操作画面でも作成すれば操作しやすいのですがぁ...後は、ご自身でえ。
次ページで、気圧センサや他のセンサと、D/AにA/DコンバータIC等などの記事をもう少し書いて
置こうと思います。
iSDIO機能を使い共有メモリに読み書きする話と、HTTPリクエストを行う話の記事はこちらに追記
しています。
リンク切れ見直し(*2) 2020/03/15
リンク切れ見直し(*1) 2017/01/12
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.