はじめに
アナログ温度センサーLM61をRaspberry Pi PicoのADCに接続して温度を測定し、液晶AQM0802に表示するプログラムをMachiKania type PでSDカード不要の組み込み形式で作成しました。
検証環境
以下の環境でプログラムの作成と検証を行ないました。
- macOS : Tahoe 26.0.1
- PicoCalc : Raspberry Pi Pico W
- MachiKania : Phyllosoma 1.6.0
使用部品
下記の部品を使用しました。
- 温度センサー:LM61CIZ
- ディスプレイ:I2C接続小型8文字×2行液晶 AQM0802A
配線
LM61との接続
Raspberry Pi PicoとLM61CIZとの接続を次の表に示す。
| LM61CIZのピン | Picoのピン(物理ピン) |
|---|---|
| +VS(1) | 3v3(5) |
| VOUT(2) | GP27(32) |
| GND(3) | GND(33) |
液晶との接続
Raspberry Pi Picoと液晶との接続を次の表に示す。
| 液晶のピン | Picoのピン(物理ピン) |
|---|---|
| VDD | 3V3(36) |
| GND | GND(38) |
| SDA | GP4(6) |
| SCL | GP5(7) |
配線図
配線図を以下に示す。
処理手順
今回のプログラムの処理手順は次のとおりです。
- I2Cの初期化
- 下記の処理を5秒間隔で実行
- Raspberry Pi Pico WのADC1から取得したデータを元に温度計算
- 算出した温度の文字列を液晶の2行目に表示
I2C設定
MachiKaniaではI2Cを利用する場合は設定ファイルMACHIKAP.INIにSDAおよびSCLで使用するピン番号を指定します。今回は接続に示したGP4とGP5を使用するので下記の設定をしました。
I2CSDA=4
I2CSCL=5
液晶の初期化コード
以前、MMBasicで作成したAQM0802の初期化プログラムを元にKM-BASICのコードの書き換え、サブルーチンにしました。
REM AQM0802の初期化プログラム
LABEL ILCD
DELAYMS 40
GOSUB LCD, $38 : GOSUB LCD, $39
GOSUB LCD, $14 : GOSUB LCD, $70
GOSUB LCD, $56 : GOSUB LCD, $6C
DELAYMS 200
GOSUB LCD, $38 : GOSUB LCD, $0C
GOSUB LCD, $01
DELAYMS 2
RETURN
温度センサーデータの読み取りと変換
Raspberry Pi PicoはADCを内蔵しているのでアナログ温度センサーを接続すればディジタルに変換された値を取得できます。MachiKania type PではGP26からGP29までの4ピンがADC0からADC3として利用できます。 今回はGP27(ADC1)にアナログ温度センサーのLM61を接続しました。
入門MachiKaniaの33ページにtype PでADCを使う方法と例が示されているのでそれをそのまま使用しました。
最終的に液晶に表示するので文字列に変換しました。
REM LM61の出力値を読み取り、温度に換算
TP# = FLOAT#(ANALOG(14)) * 322 / 4000 - 60
TS$ = SPRINTF$("%3.2f",TP#)
液晶への表示
AQM0802の2行目に算出した温度を表示します。文字列出力サブルーチンWSTRに文字列を渡すと一文字ずつ取り出して表示します。
℃という文字が液晶では表示できないので°とCを組み合わせて表示しました。
GOSUB WSTR, TS$+CHR$($43)+CHR$($DF)
...
REM 文字列表示
LABEL WSTR
VAR S
S$ = ARGS$(1)
FOR I = 0 TO LEN(S$)
I2CWRITE A, $40, ASC(S$(I, 1))
NEXT
RETURN
プログラム全体
REM LM61の温度をAQM0802に表示する
A = $3E : REM AQM0820 I2C address
REM I2Cを開く
I2C 100 : REM 100kHz
GOSUB ILCD
GOSUB LCD, $01
REM 液晶の1行目にオンドと表示
GOSUB WSTR, CHR$($B5)+CHR$($DD)+CHR$($DE)+CHR$($C4)
REM 測定と表示
DO
GOSUB LCD, $C0
TP# = FLOAT#(ANALOG(14)) * 322 / 4000 - 60
TS$ = SPRINTF$("%3.2f",TP#)
PRINT TS$
GOSUB WSTR, TS$+CHR$($43)+CHR$($DF)
DELAYMS 5000
LOOP
END
REM 液晶初期化ルーチン
LABEL ILCD
DELAYMS 40
GOSUB LCD, $38 : GOSUB LCD, $39
GOSUB LCD, $14 : GOSUB LCD, $70
GOSUB LCD, $56 : GOSUB LCD, $6C
DELAYMS 200
GOSUB LCD, $38 : GOSUB LCD, $0C
GOSUB LCD, $01
DELAYMS 2
RETURN
REM LCDへのコマンド送信
LABEL LCD
VAR C
C = ARGS(1)
I2CWRITE A, $00, C
DELAYMS 2
RETURN
REM 文字列出力
LABEL WSTR
VAR S
S$ = ARGS$(1)
FOR I = 0 TO LEN(S$)
I2CWRITE A, $40, ASC(S$(I, 1))
NEXT
RETURN
プログラムを組み込み形式に変換
MachiKaniaはSDカードせずに実行するプログラムをUF2ファイルに組み込み起動時に実行するにはボードごとに配布されているファイル中のembedディレクトリにあるphpスクリプトのconvert_kb.phpやconvert.phpを使ってプログラムを組み込みます。自動実行するBASICのファイルの名前はMACHIKAP.BASにし、embedディレクトリの保存します。
次のように実行するとプログラムを組み込んだUF2ファイルresult.uf2が作成されます。
このUF2ファイルをRaspberry Pi PicoにBOOTSELボタンを押しながらUSBケーブルを挿入後にMacに表示されたドライブのドラッグ&ドロップします。
UF2ファイルの書き込み完了後、プログラムが自動実行されます。
$ php convert.php
Investigating uf2 file...
MACHIKAP.BAS found: maximum length: 65536 bytes
CLASS001.BAS found: maximum length: 65536 bytes
CLASS002.BAS found: maximum length: 16384 bytes
CLASS003.BAS found: maximum length: 16384 bytes
CLASS004.BAS found: maximum length: 16384 bytes
CLASS005.BAS found: maximum length: 4096 bytes
CLASS006.BAS found: maximum length: 4096 bytes
CLASS007.BAS found: maximum length: 4096 bytes
CLASS008.BAS found: maximum length: 4096 bytes
CLASS009.BAS found: maximum length: 1024 bytes
CLASS00A.BAS found: maximum length: 1024 bytes
CLASS00B.BAS found: maximum length: 1024 bytes
CLASS00C.BAS found: maximum length: 1024 bytes
CLASS00D.BAS found: maximum length: 1024 bytes
CLASS00E.BAS found: maximum length: 1024 bytes
CLASS00F.BAS found: maximum length: 1024 bytes
Investigating BASIC files in current directory...
MACHIKAP.INI found: 4296 bytes (fits to 65536 bytes area; CLASS001)
MACHIKAP.BAS found: 1001 bytes (fits to 65536 bytes area; MACHIKAP)
done! result.uf2 was created.
実行結果
プログラムの実行結果を示します。
さいごに
組み込み形式にするとコンパイルエラーを修正するのに手間がかかりましたがうまく動作させられました。

