LRA1のBASICで、I2CとPWMをやってみた!

黒いフードパーカー姿のろらたんが基板を手に持って微笑みながら指さしているアイキャッチ画像。テキスト「LRA1のBASICで、I2CとPWMをやってみた!」入り。 LRA1実践

LRA1のBASICで、I2C,PWMを全部やってみた!

この記事について

LRA1のBASICが便利すぎる…という話の続編です。

一般的なLoRaモジュールって、センサやLEDをつなげようとすると、マイコン(MPU)を別で用意する必要 があるんですよね。
I2CやSPI、PWM、ADCなんて当然その外側。
でもLRA1は違います。

これ1つで、LoRaも、センサも、表示もできちゃう。
しかもBASICで!

今回は「I2C」「PWM」の2つを取り上げて、その実力を紹介します。

ろらたんがLEDとDHT20をもってる画像

🎀 LoRaモジュールって、LoRaの送受信しかできないものだと思ってない…?
LRA1なら、余計な部品いらないし、配線もコードもめっちゃ楽〜!

LRA1-ATOM(しゃちらぼ製)

この記事で使っているのは、しゃちらぼ製の小型ボード「LRA1-ATOM」。
LRA1とUSB-UARTだけを載せた極限ミニマム仕様で、ブレッドボードに直挿しOKです。

LRA1-ATOMの写真

「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)

LRA1-ATOMにDHT20を接続した写真

🎀 この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

LRA1-ATOMのLED写真

🎀 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 までお気軽にどうぞ。

🎀 もし“これ試してみたい!”とか“ここがうまくいかないかも…”って思ったら、気軽にお問い合わせしてね〜!
ろらたん、できるかぎりサポートしちゃうよっ📩

🔗 関連リンク

しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:

💬「シャチラボ」で検索してきた方も大歓迎!
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬

コメント

  1. めん より:

    更新お疲れ様です。
    いつも楽しみにしてます!

    しゃちラボさん自作のLRA1-ATOM素晴らしいですね!
    無駄がなくてコンパクトです。
    欲しいですねー

    現在テラタームでlra1と通信しています。
    テラタームのログ機能を使って、データを取って蓄積しています。これだと少し効率が悪いと思っています。

    しゃちらぼさんはどのように取得したデータを蓄積する際は、どのように保存されておられますか?

    • shachi-lab より:

      めんさん、コメントありがとうございます!
      更新を楽しみにしていただいてるとのことで、とても励みになります。

      LRA1-ATOMも見てくださってありがとうございます!
      コンパクトさを褒めてもらえるの、嬉しいです。
      機会を見て、何らかの形で頒布できたらと思っています。

      ぼくもTeraTermのログ機能を使うことは多いですが、最近は用途に応じていくつか使い分けています。

      – LoRaWANの場合は、LRA1からのデータをWebHookでサーバーに直接POSTして、DBに保存しています。受け取ったJSONをそのままファイルやデータベースに入れる感じです(このブログのサーバーを使ってます)。

      – P2Pでの試験やローカルログが欲しいときは、LRA1からの出力をJSON形式にして、Pythonスクリプトでシリアルを読み取ってCSVに追記したりしています。

      – マイコン単体でログを残したいときには、OpenLogをUART接続して直接microSDに保存しています。OpenLogは、独立動作+長時間記録したいときに重宝します。

      🎀「目的に合わせて“自動保存”か“ローカル記録”かを選べると、運用の幅がグッと広がるよ〜!」

      TeraTermで始めて、そろそろ効率を上げたいなという方には、どれもおすすめです。

タイトルとURLをコピーしました