はじめに
PicoCalcでMachiKania phyllosomaが動作するようになったのでPicoMiteのときと同じようにいろいろなデバイス接続を試してみようと思い、まず最初にI2Cで動作する温度センサーADT7410の温度を取得して表示するプログラムをMMBasicで作成したプログラムを元に作成しました。
MachiKania phyllosomaの日本語表示機能を利用して測定閣下は日本語で表示するようにしました。
検証した環境
- PcioCalc : コアをRaspberry Pi Pico 2 Wに交換
- ファームウェア : MachiKania phyllosoma : 1.5.2.0 KM-1509
- ADT7410 : 秋月電子通商のAE-ADT7410
接続
ADT7410とPicoCalcとの接続は下記のとおりです。
| ADT7410 | PicoCalc |
|---|---|
| VDD | 3V3 OUT |
| SCL | GP5 |
| SDA | GP4 |
| GND | GND |
実体配線図を以下に示します。
利用するI2Cピンの設定
MachiKaniaIでI2Cを利用する場合、SDカードのルートディレクトリに配置する設定ファイルMACHIKAP.INIの143と144行目でSDAとSCLに割り当てるピン番号を指定します。PicoCalcはGP2からGP5とGP21、GP28の合計6ピンが外部に開放されているのでその中からI2Cのチャンネル0で使用できるGP4、GP5、GP21、GP28からSDAとSCLピンを選択します。今回はGP4とGP5を使ったので下記のように指定しました。
<略>
143 I2CSDA=4
144 I2CSCL=5
<略>
プログラム
以前、MMBasicで作成したプログラムを元にケンケンのホームページのMachiKania type Pのページに掲載されているプログラムI2CSAMPP.BASを参考に下記のプログラムを作成しました。測定結果はMachiKaniaの日本語表示機能を利用して表示するようにしました。日本語を含むソースファイルはUTF-8のBOMなしで保存します。
1 REM ------------------------------------
2 REM AE-ADT7410 13bit output
3 REM I2C bus#0, SDA=GP4, SCL=GP5 100kHz
4 REM I2C address $48
5 REM ------------------------------------
6 USEGRAPHIC
7 USECLASS CKNJ16
8 USEVAR RAW, TEMP#
9 DIM D(1)
10
11 K=new(CKNJ16, "UTF-8")
12 POINT 0, 0
13 K.GPRT("ADT7410での温度測定", 7, 0)
14 I2C 100 :REM 100kHz
15
16 DO
17 REM Read data
18 I2CREADDATA $48, D, 2
19
20 REM Get raw data
21 RAW = PEEK(D) << 8 OR PEEK(D+1)
22 RAW = RAW >> 3
23
24 REM Calculate temperature
25 IF RAW >= $1000 THEN RAW = RAW - $2000
26 TEMP# = FLOAT#(RAW) / 16
27
28 REM Display results
29 POINT 0, 18
30 K.GPRT(STRFTIME$("%Y-%m-%d %H:%M:%S"),7, 1)
31 POINT 0, 36
32 K.GPRT("温度:"+SPRINTF$("%3.1f",TEMP#)+"℃", 7, 2)
33
34 WAIT 600
35 LOOP
36 END
日本語を表示するにはSDカードのルートディレクトリに配布されているファイル(machikania-p-152.zip)に含まれるライブラリディレクトリLIBを保存しておく必要があります。以下がその内容です。
$ tree /Volumes/NO\ NAME/LIB/CKNJ16
/Volumes/NO NAME/LIB/CKNJ16
├── CKNJ16.BAS
├── font
│ ├── shinonome2jis.php
│ └── shinonome2uni.php
├── help.txt
├── SINONOME.JIS
└── SINONOME.UNI
2 directories, 6 files
測定手順
ADT7410での温度測定の手順は次のとおりです。プログラムでは2から5を繰り返し実行しています。ADT7410から読み取るデータはデフォルトの13ビットです。
- I2Cチャンネル0を開く(14行目)
- ADT7410のI2Cのアドレス$48から2バイト分のデータを読み込む(18行目)
- 読み取ったデータを13バイトの生データに変換
- 最初の8ビットのデータを左へ8ビットシフトし、次の8ビットのデータと加算し16ビットのデータにする(21行目)
- 16ビットのデータを右へ3ビットシフトして13ビットのデータにする(22行目)
- 2の補数の生データを正数あるいは負数に変換する
- MSBが1の$1000(409610)より小さい場合は正数なので何もせず、$1000以上の場合は負数になるので生データから213=8192(=$2000)を引いて負数にする(25行目)
- 生データを16で割り、温度を求める(26行目)
- 温度を取得できたらその結果を時刻と共に表示する(28〜32行目)。
日本語表示のコードはMachiKania type P/PU ver 1.5.2からダウンロードしたmachikania-p-152.zipに含まれている日本語クラスに関するファイルLIB\CKNJ16\help.txtを参考にしまして作りました。
実行結果
実行結果を以下に示します。
さいごに
PcioCalc版MachiKaniaとADT7410のI2C接続は特に問題なく実行できた。16ビット出力のコードを示していないが、こちらも問題なく実行できました。また、MachiKaniaは日本語表示ができる点がありがたい。

