LRA1のBASICで、I2C,PWMを全部やってみた!
この記事について
LRA1のBASICが便利すぎる…という話の続編です。
一般的なLoRaモジュールって、センサやLEDをつなげようとすると、マイコン(MPU)を別で用意する必要 があるんですよね。
I2CやSPI、PWM、ADCなんて当然その外側。
でもLRA1は違います。
これ1つで、LoRaも、センサも、表示もできちゃう。
しかもBASICで!
今回は「I2C」「PWM」の2つを取り上げて、その実力を紹介します。
🎀 LoRaモジュールって、LoRaの送受信しかできないものだと思ってない…?
LRA1なら、余計な部品いらないし、配線もコードもめっちゃ楽〜!
LRA1-ATOM(しゃちらぼ製)
この記事で使っているのは、しゃちらぼ製の小型ボード「LRA1-ATOM」。
LRA1とUSB-UARTだけを載せた極限ミニマム仕様で、ブレッドボードに直挿しOKです。
「LRA1さえあれば動く」ってことを実感してもらいたくて、このボードを選びました。
非売品ですが、「それ欲しい!」って声があれば…ちょっと考えてみようかな〜と。
🎀 ブレッドボードに“すっ”て挿すだけで使えるの、ちょっと感動なんだよ〜!
I2Cの制御
LRA1では、I2Cがそのまま使えます。
つまり、いろんなセンサやデバイスがLRA1単体でつながるということ!
🎀 I2Cセンサがポンっとつなげるって…地味に感動しない?
I2Cに使えるポートはあらかじめ決まっています。
* SDA : PA16
* SCL : PA17
🎀 ブレッドボードでつなぐときは、この2本だけチェックしてね〜!
使うコマンドはとてもシンプルで、たとえば:
- 書き込み:
I2CW
- 読み取り:
I2CR
- 受信データのバッファ:
I2CD
でアクセス
🎀 このコマンドだけで、I2Cの面倒なやりとりができちゃう!
❓ ちなみに「I2C」って、どう読むの?
正式には “アイ・スクエアド・シー(I-squared-C)”。
でも、ふつうは「アイツーシー」って読む人が多いです。
🎀 「ろらたんは“アイツーシー”派だよ〜✨(※でもたまに“アイスク”ってドヤ顔で言いたくなるっ)」
🧪DHT20で温湿度を読み取ってみた
今回はI2Cセンサとして「DHT20」を使ってみます。
温湿度が測れるI2Cセンサで、秋月電子でも手に入ります。
🎀 今回はDHT20っていう、よく使われる温湿度センサで試してみたよ〜。
I2Cタイプだから、LRA1だけでばっちり動くのがうれしいねっ!
🔍 今回は「LRA1のBASICでI2Cを使う」ことがテーマなので、DHT20センサ自体の仕様や使い方の詳細までは触れていません。
🔌接続構成
- LRA1-ATOM(しゃちらぼ製)
- DHT20(I2Cセンサ、アドレス0x38)
- ブレッドボードにて接続(3.3V / GND / SDA / SCL)
🎀 この4本(電源とI2Cの2本ずつ)をつなぐだけでOKだよ〜。
ブレッドボードなら、さくっと試せるから安心してねっ!
📟 LRA1 BASICでの読み取りコード
まずは、DHT20からステータスを読んでみます。
I2Cアドレスの0x38に、ステータス読み取りコマンドの0x71を送信して、1バイトのステータスを読み込みます。
>I2cR $38,$71,1:Print $(I2cD(0),-2) 18 Ok
18 が取得できたら、DHT20と接続して動作していることがわかります。
“Device access error” になったときは接続エラーなので、配線を確認しましょう。
次に、計測開始コマンドを送信します。
デバイスに、計測コマンド0xacと、パラメーターの0x33,0x00を送信します。
>I2cD(0)=$33:I2cD(1)=$0:I2cW $38,$AC,2 Ok
デバイスから、ステータス(1バイト)と計測値(6バイト)を読み込みます。
>I2cR $38,-1,7 Ok
I2cD(0)にステータス、I2cD(1~6)に計測値とCRCが読み込まれているはずです。
🎀 このへんのやりとりがうまくいけば、ちゃんとセンサとつながってるってことだよ〜。
‘Ok’ が出たら、まずはひと安心っ!
📐 温湿度の計算(整数スケーリング)
取得した計測値は、そのままではデバイス内部の単位なので、
スケーリングする必要があります。
>T = (((I2cD(3) AND &HF) << 16) + (I2cD(4) << 8) + I2cD(5)) * 200 / 1048576 - 50 >H = ((I2cD(1) << 12) + (I2cD) << 4) + (I2cD(3) >> 4)) * 100 / 1048576
🎀 そのままの値じゃなくて、ちゃんと“スケーリング”してあげると、温度や湿度が人間にもわかる形になるんだよ〜。
ちょっとひと手間だけど、大事なステップだね
プログラムからやってみよう
この例では、センサのアドレスに命令を送って、結果を読み取り、整数演算でスケーリングして表示します。
スケーリングは0.1単位にしました。
100 I2cR $38,$71,1 110 Print "Stat="$(I2cD(0),-2) 120 Delay 10 130 I2cD(0)=$33:I2cD(1)=$0 140 I2cW $38,$AC,2 150 Delay 80 160 I2cR $38,-1,6 170 Print "Data=";:For I=0 To 6:Print $(I2cD(I),-2)" ";:Next:Print 180 T=((I2cD(3)&$F)<<16)+(I2cD(4)<<8)+I2cD(5) 190 H=(I2cD(1)<<12)+(I2cD(2)<<4)+(I2cD(3)>>4) 200 Print "Temp="((T*2000)/1048576-500) 210 Print "Hume="((H*1000)/1048576)
実行例
>run Stat=18 Data=18 9C C6 96 61 09 00 Temp=297 Hume=612 OK
こうした一連の流れが、わずか数行のBASICで完結するのが大きな特徴です。
🎀 I2C通信って普通は結構めんどくさいけど、これだけで制御できちゃうのはすごいかもっ!
LoRaで送信
LRA1はLoRaモジュールなので、もちろんI2Cデバイスから取得した値はLoRaで送信できます。
さきほどのプログラムに、温度と湿度をLoRaで送信する部分を追加します。
220 #="1234" 230 Txdw[8]=T 240 Txdw[10]=H 250 Send
🎀 つまり、“I2Cで読んで、そのままLoRaで送信”って、数行でできちゃうんだよ〜!
📝 `#=1234″` っていうのは裏技で、`#=Null:Txd[7]=4` の代わりなんです。
4文字ならなんでもいいよ。
PWMの制御
PWM(Pulse Width Modulation)は、
GPIOの出力を細かくON/OFFしながら、電力をうまく調整する仕組みです。
たとえばLEDなら、「ちょっとだけ光らせる」みたいなことができるんです。
🎀 GPIOが勝手にチカチカしてくれて、“いい感じの明るさ”に見えるってわけ〜!
💡LEDを点滅させる!
GPIOのポート25(PA25)にLEDを接続して、点滅させてみます。
PWMの周期は、PWMコマンドの2番目の引数に 2MHz/周期+1 で指定します。
まずは、1秒周期でLEDを点滅させてみます。
>pwm 25, 2000000
💡LEDをゆっくりフェード点滅してみた
PWMでは、「ONとOFFの時間の割合(=デューティ比)」を変えることで出力を調整します。
たとえばLEDなら、ONの時間が長いほど明るく、短いほど暗く見えるんです。
🎀 ずっとONならまぶしいし、チラッとONだけならほんのり光るよ〜!
PWMコマンドの3番目の引数でDutyを指定できます。
このDUTYを少しずつ変化させていくと、
LEDがじわ〜っと明るくなったり、す〜っと暗くなったりする「フェード点滅」ができます。
PWMの周期を10KHz、点滅周期を1000msec、10msec毎にDutyを変更させてみました。
10 H=10000:Q=1000:D=10 20 P=2000000/H:S=P*D*2/Q 30 Do 40 For I=0 To P Step S:Pwm 25,P,I:Delay D:Next 50 For I=P To 0 Step -S:Pwm 25,P,I:Delay D:Next 60 Loop
🎀 LEDがゆっくり明るくなって、またゆっくり暗くなるよ〜✨
⚠️補足:PWMの制限とグループ制御
- PWM対応ピンは限られています
- ピンは「グループ」に分かれていて、グループ内では周波数が共通
- ポート番号 0, 1 / 8, 9, 18, 19 / 24, 25 の3グループに分かれています
🎀 別の周波数で出したいときは、グループを分ける必要があるよ〜
PWMの応用
PWMは、この記事の例のようにLEDの明るさを変化させることもできますが、
モーターの回転数を制御したり、
PWMポートに🔊スピーカーを付けたら音階で音を出したりできます。
簡単な曲程度ならブザー代わりになりそうですね。
✅まとめ
今回は、しゃちらぼ製のLRA1-ATOMボードを使って、I2Cセンサの読み取り、PWM制御 をBASICだけでやってみました。
全部、LRA1単体で完結。
MPUもライブラリも不要、ただのテキスト入力で制御できるってすごくない?
🎀 LoRaモジュールに見えて、実は“小さな万能マイコン”なんだよ〜!
📪 お問い合わせなど
技術的なご相談やご質問などありましたら、
📩お問い合わせフォーム
または、
📮info@shachi-lab.com までお気軽にどうぞ。
🎀 もし“これ試してみたい!”とか“ここがうまくいかないかも…”って思ったら、気軽にお問い合わせしてね〜!
ろらたん、できるかぎりサポートしちゃうよっ📩
🔗 関連リンク
しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:
- 🌐しゃちらぼ公式サイト
- 🐦 X(旧Twitter):@shachi_lab
- 📗 Qiita:@shachi-lab
- 🐙 GitHub:@shachi-lab
- 📸 Instagram:@shachi_lab
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬
コメント
更新お疲れ様です。
いつも楽しみにしてます!
しゃちラボさん自作のLRA1-ATOM素晴らしいですね!
無駄がなくてコンパクトです。
欲しいですねー
現在テラタームでlra1と通信しています。
テラタームのログ機能を使って、データを取って蓄積しています。これだと少し効率が悪いと思っています。
しゃちらぼさんはどのように取得したデータを蓄積する際は、どのように保存されておられますか?
めんさん、コメントありがとうございます!
更新を楽しみにしていただいてるとのことで、とても励みになります。
LRA1-ATOMも見てくださってありがとうございます!
コンパクトさを褒めてもらえるの、嬉しいです。
機会を見て、何らかの形で頒布できたらと思っています。
ぼくもTeraTermのログ機能を使うことは多いですが、最近は用途に応じていくつか使い分けています。
– LoRaWANの場合は、LRA1からのデータをWebHookでサーバーに直接POSTして、DBに保存しています。受け取ったJSONをそのままファイルやデータベースに入れる感じです(このブログのサーバーを使ってます)。
– P2Pでの試験やローカルログが欲しいときは、LRA1からの出力をJSON形式にして、Pythonスクリプトでシリアルを読み取ってCSVに追記したりしています。
– マイコン単体でログを残したいときには、OpenLogをUART接続して直接microSDに保存しています。OpenLogは、独立動作+長時間記録したいときに重宝します。
🎀「目的に合わせて“自動保存”か“ローカル記録”かを選べると、運用の幅がグッと広がるよ〜!」
TeraTermで始めて、そろそろ効率を上げたいなという方には、どれもおすすめです。