FlashAirのLua機能を使いPIO制御を行って見ます4
("秋月電子のFlashAir DIP IO ボード"用ライブラリ編)
〔FlashAir買ってみた編〕
〔PIO制御1〕
〔2〕
〔3〕
〔iSDIO機能〕
〔マイコンのトップに戻る〕
前ページで、"秋月電子のFlashAir DIP IO ボード"でのI2C通信を行いログ機能を実験して見ました。
このページでは、ログ取りを行う場合に有った方が良さげなデバイスをもう少しぶら下げて、
ライブラリを作成して置きます、ファイルのダウンロードは最後の方に記述しています。
本来は関数群をライブラリ化して、require("xxx");あたりで取込んで動作させた方が良いのですがぁ..
上手く動作しなかったのでありま〜す、コピーッペしてメインのLuaプログラムに取り込んで下さい。
尚、メモリ節約の為には、使わない関数は削除したり、コメントも削除すれば良いと思います。
"Seg_faul"さんの「FlashAirでLuaスクリプトを組む時のコツ」を一読して置きましょう。
《大気圧センサ:LPS25H》
LPS25Hは電源3.3Vで、260〜1260hPa(精度:±1hPa以内)まで測定可能な大気圧センサです。
こちらで購入のLPS25Hモジュールは、モジュール裏の半田ジャンパーにてI2C用プルアップ抵抗
10KΩが可能です。(LPS25HはLPS25HBに代替えしています。 *1) )
I2Cアドレスは2種類有り、SDO(4番)ピンをVDD接続で7ビット"1011101:0x5D"となり、
GND接続で"1011100:0x5C"となります。(ここのプログラムは0x5Cを使っています)
尚、LPS25HはSPI/I2C両方可で、I2CはCS(5番)ピンをVDDに接続します。
LPS25Hの詳しい操作内容や接続等はこちらのページを参照下さい。
LPS25Hから気圧値を得る為の関数集の使い方を説明します。
LPS_ADRS=0x5C -- LPS25HのI2Cアドレス(SDO=LOW)
と有りますので、0x5D(SDO=HIGH)としたい人は書き換えましょう。
【 LPS25H操作の関数群 】
ans = lpsInit( )
LPS25Hの初期化を行う処理
動作は有効モード、データ変換レートは1Hzで初期化。(それ以外はデフォルト動作)
ans :0=正常 これ以外の数値は、SC18IS600の"I2CStat"情報を返します。
1=指定したアドレスに対して応答がない。
2=指定したアドレスからACKが返ってこない。
3=I2CバスのBusy、これはマルチマスター時の"バスの衝突"と思います、
なので、通常は発生しないと思いますがぁ....。(英語なのでぇにゃんともぉ)
9=指定したデータ長さとデータが異なる。
ans,pres = lpsRead( )
LPS25Hから気圧を読出す処理
ans :0=正常 これ以外の数値は、上記lpsInit()のans情報を参照。
pres:気圧値を260.0〜1260.0hPaで返します。
例) spiSetup(50)
i2cInit(5)
lpsInit()
ans,pres = lpsRead()
print("pres=",pres)
左は、LPS25HセンサのlpsRead( )関数とHDC1000センサの
hdcRead( )関数の結果を表示させた物です。
LPS25Hも温度値を得られるのですが、プログラムに記述
していません、欲しい人はご自分で作成しましょう。
又、LPS25Hはパワーダウンコマンドの発行も出来るので
低消費電力可能です、これもご自分で作成しましょう。
《温度センサ:ADT7410》
このADT7410は温度専用センサで、電源2.7-5.5V、精度±0.44℃(3.3V)、分解能0.0078℃(16bit)、
温度-55-150℃と高精度・高分解能と広い測定温度のセンサです。
A0 |
A1 |
アドレス(7bit) |
0 |
0 |
0x48 |
0 |
1 |
0x49 |
1 |
0 |
0x4A |
1 |
1 |
0x4B |
こちらで購入のモジュールですが、モジュール表の"PU"場所を
半田盛りすれば10KΩでI2C用のプルアップ抵抗が施されます。
I2Cアドレスは4種類あり、"A0"・"A1"部分に半田を盛れば左表の
様にアドレスが選択出来ます。
盛らない場合のデフォルトは、0x48(7ビット)です。
因みに、"1"で半田盛りです。
ADT7410の詳しい操作内容や接続等はこちらのページを参照下さい。
ADT7410から温度値を得る為の関数集の使い方を説明します。
【 ADT7410操作の関数群 】
ans = adt74Mode(adrs,pd)
ADT7410の動作モードを設定する処理
adrs:I2Cアドレス(7bit)を指定します。(0x48〜0x4B)
pd :動作モードを指定します。(0=連続測定 3=シャットダウン)
ans :0=正常 これ以外の数値は、上記lpsInit()のans情報を参照。
ans,temp = adt74Read(adrs)
ADT7410から温度値を読出す処理
連続測定でも、測定するのに240ms程掛かるようです。
adrs:I2Cアドレス(7bit)を指定します。(0x48〜0x4B)
ans :0=正常 これ以外の数値は、上記lpsInit()のans情報を参照。
temp:読み込んだ温度値(℃)を返します。
例) ADT74_ADRS=0x48 -- ADT7410のI2Cアドレス(A1/A0=GND)
spiSetup(50)
i2cInit(5)
adt74Mode(ADT74_ADRS,0) -- 連続測定を行う
sleep(300)
ans,temp = adt74Read(ADT74_ADRS)
print(" temp=",temp)
《雷センサ:AS3935》
このセンサは文字通り雷さまの強さや雷さまでの距離を測定出来るモジュールです。
こちらで購入しました、電源は2.4-5.5Vです。
ですがぁ、このモジュールは手元に有るのですが実験がまだ済んでいないので、後日追記します。
《A/Dコンバータ:ADS1015》
ADS1015は、アナログ値(0-5V)をデジタル値(12ビット)に変換してくれるICです、
スイッチサイエンスかマルツオンラインか秋月電子か
アマゾン
等で購入可能です。
(秋月電子はadafruitのモジュールからオリジナル品に切り替えた用ですね *1) )
このモジュールは、4個の入力チャンネルが有り、電源はは2-5.5Vです。
I2C用のプルアック抵抗は10KΩで内蔵しています、I2Cアドレスは4種類有ります。
ADDR |
アドレス(7bit) |
GND |
0x48 |
VDD |
0x49 |
SDA |
0x4A |
SCL |
0x4B |
ADDRピンについて
ADDRピンを左表の様に繋ぐ事によりスレーブアドレスを4個から選択
出来ます。
尚、モジュールは10KでGNDに配線して有るので何処にも繋が無い場合は
0x48となります。
ADS1015の詳しい操作内容や接続等はこちらのページを参照下さい。
ADS1015からアナログ値を得る為の関数集の使い方を説明します。
ADS5_ADRS=0x48 -- ADS1015のI2Cアドレス(ADDR=GND)
と有りますので、他のアドレスにしたい人は書き換えましょう。
【 ADS1015操作の関数群 】
ans = ads5Init(ch,g)
ADS1015の初期化を行う処理
動作は連続変換モード、サンプリングレートは1600SPS、ALERTは機能させないで初期化。
ch :入力するチャンネルのポートを指定します。(A0=0 A1=1 A2=2 A3=3)
シングル・エンド入力のみ対応で、差動入力は行いません。
g :ゲインを指定します。(0-5)
0: FS = ±6.144V(2/3倍) 3: FS = ±1.024V(4倍)
1: FS = ±4.096V(1倍) 4: FS = ±0.512V(8倍)
2: FS = ±2.048V(2倍) 5: FS = ±0.256V(16倍)
ans:0=正常 これ以外の数値は、上記lpsInit()のans情報を参照。
ans,val = ads5Read(ch)
ADS1015の指定ポートからアナログ値を読出す処理
ch :入力するチャンネルのポートを指定します。(A0=0 A1=1 A2=2 A3=3)
前回入力したチャンネルと異なる場合は、新たにチャンネルを設定し直します。
ans:0=正常 これ以外の数値は、上記lpsInit()のans情報を参照。
val :アナログ値を返す。
例) spiSetup(50)
i2cInit(5)
ads5Init(0,2) -- ch=A0,gain x2
ans,val = ads5Read(1) -- Input from A1
print("val=",val)
《A/Dコンバータ:MCP3425》
MCP3425は、1チャンネルのみですが、デジタル値は16ビットで変換してくれる安価なICです。
ですが、現在これは手元にないので手に入れたら追記します。
《D/Aコンバータ:MCP4725/4726》
このセンサは、電源2.7-5.5Vでデジタル値(12ビット)をアナログ値に変換出力する1チャンネルのICです
MCP4725
こちらから購入のMCP4725モジュールは、モジュール裏の"J1"・"J2"に半田を盛れば2.7KΩで
I2C用のプルアップ抵抗が施されます。
I2Cアドレスは2種類有り、"A0"ピンをVDD接続で0x61となり、GND接続で0x60となります。
MCP4726
こちらから購入のMCP4726モジュールは、
I2C用のプルアップ抵抗は外付けです。
I2Cアドレスは"A0"ピンがないので、0x60の1種類となります。
なので、"A0"ピンの場所は"VREF"となっていてアナログ電圧リファレンス端子として機能します。
尚、VDD/VREFピンには0.1uF(セラミック)と10uF(タンタル)を取付ける様に推奨しています。
MCP4725との違いは、端子配列と、電圧リファレンスがVDD/VREF/VREF(Buffered)から選択可能で、
出力ゲインも1x/2xから選べます。
MCP4725/4726の詳しい操作内容や接続等はこちらのページを参照下さい。
MCP4725/4726からアナログ値を出力する為の関数集の使い方を説明します。
【 MCP4725/4726操作の関数群 】
ans = mcp47Write(adrs,val)
MCP4725/26からアナログ値を出力する処理
adrs:I2Cアドレス(7bit)を指定します。(0x60 0x61)
val :出力する電圧のステップ数を指定します。(0-4095)
ans:0=正常 これ以外の数値は、上記lpsInit()のans情報を参照。
例) spiSetup(50)
i2cInit(5)
mcp47Write(0x60,2000)
ans = mcp4726dtSet(vref,g)
MCP4726のコンフィグにデータをセットする処理
この関数は、MCP4725は利用できません。
vref:電圧リファレンスの指定をします。(1=VDD 2=VREF 3=VREF and Use buffer)
g :出力ゲインを指定します。(0=1x 1=2x)
ans :0=正常 これ以外の数値は、上記lpsInit()のans情報を参照。
又、MCP4725/4726はパワーダウンコマンドの発行も出来るので低消費電力可能ですが、
この機能についはご自分で作成しましょう。
《ダウンロードファイルについて》
このページ記述のライブラリは、↓からダウンロードして下さい。
FlashAir_LIB.lzh
このページのライブラリには前ページで説明している、
”SC18IS600でGPIO/I2C操作の共通関数群”と”SSC18IS600でI2C操作の関数群”が必要です。
解凍したファイルは以下です。
boot_DIPIO_WEBtoLOG.lua - 前ページで説明の共通部分とI2C操作部分を含むLuaファイル
DIPIO_LIB.lua - このページで説明したライブラリ群のLuaファイル
《その他》
他にも、I2Cアドレスがダブった時やプルアップ抵抗の調整等に使用する、
I2Cバス切換器のPCA9547D-I2Cマルチプレクサー。
入出力するピンが不足した場合に入出力ピンを増やすICのMCP23017等も有ります。
I2Cデバイスであれば殆ど接続可能でしょう、マイコンもスレーブ動作させれば接続可能です。
実際、I2Cの接続実験時にArduinoUNOをスレーブにて動作させています。
次ページでFlashAirのiSDIO機能について一部記事にしています。
リンク切れ見直し(*1) 2020/03/15
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.