はじめに
今回は温度センサーADT7310とPicoCalc版MachiKaniaを接続し、SPI通信でADT7310で測定した温度データを取得できたのでその結果をまとめました。
検証した環境
次の環境で検証しました。
- PcioCalc : コアをRaspberry Pi Pico 2 Wに交換
- ファームウェア : MachiKania phyllosoma : 1.5.2.0 KM-1509
- 温度センサー : ADT7310使用 高精度・高分解能 SPI・16Bit 温度センサーモジュール
接続
ADT7310とPicoCalcの接続は次のとおりです。PicoCalcで外部に開放されているGP2〜GP5、GP21、GP28のうち、SPIで使用できるのはGP2〜5のみなのでこれを使用します。
ADT7310 | PicoCalc | |
---|---|---|
VDD | 3V3 OUT | |
SCL | GP2 | SPI CLK |
SDO | GP4 | SPI RX |
SDI | GP3 | SPI TX |
CS | GP5 | |
GND | GND |
実体配線図を以下に示します。
利用するSPIピンの設定
MachiKania phyllosomaでSPIピンを使用する場合はSDカードのルートディレクトリに配置されている設定ファイルMACHIKAP.INI
の119行目から121行めでMISO、MOSI、CLKの3つのSPIのピン番号を指定しておきます。上記の接続にあわせて下記のように設定しました。CSピンはプログラム中で指定します。
$ grep -n ^SPI /Volumes/NO\ NAME/MACHIKAP.INI
119:SPIMISO=4
120:SPIMOSI=3
121:SPICLK=2
プログラム
以前作成したMMBasicで作成したプログラムを元に、入門MachiKaniaやケンケンのホームページのMachiKania type Pを参考に下記のプログラムを作成しました。
測定結果はMachiKaniaの日本語表示機能を利用して表示するようにしました。日本語を含むソースファイルはUTF-8のBOMなしで保存します。
1 REM -----------------------------------
2 REM AE-ADT7310 13bit output
3 REM SPI bus#0, MISO=GP4, MOSI=GP3, SCL=GP5 10MHz
4 REM SPI address $48
5 REM -----------------------------------
6 USEGRAPHIC
7 USECLASS CKNJ16
8 DIM D(1)
9 USEVAR RAW, TEMP#
10
11 K=new(CKNJ16, "UTF-8")
12 POINT 0, 0
13 K.GPRT("ADT7310での温度測定", 7, 0)
14
15 REM Open SPI,1MHz, 8bit, mode 2, CS:GP5
16 SPI 1000, 8, 3, 5
17
18 DO
19 REM Read data
20 SPIREADDATA D, 2, $54
21 SPIWRITE $FF,$FF,$FF,$FF
22
23 REM Get raw data
24 RAW = PEEK(D) << 8 OR PEEK(D+1)
25 RAW = RAW >> 3
26
27 REM Calculate temperature
28 IF RAW >= $1000 THEN RAW = RAW - $2000
29 TEMP# = FLOAT#(RAW) / 16
30
31 REM Display results
32 POINT 0, 18
33 K.GPRT(STRFTIME$("%Y-%m-%d %H:%M:%S"),7, 1)
34 POINT 0, 36
35 K.GPRT("温度:"+SPRINTF$("% 3.1f",TEMP#)+"℃", 7, 2)
36
37 WAIT 600
38 LOOP
39 END
KM-BASICでのCSの扱い
MachiKaniaのKM-BASICではSPIデバイスのCSピンはSPIコマンドの4番目のパラメータとして指定します。
CSの操作はSPI関連の関数実行時にCSがローになり、関数実行終了後にハイにするように作られていますので明示的な操作は必要ありません(入門MachiKaniaの36ページ)。
処理手順
以下の手順で処理を行なっている。手順2から6は繰り返し実行している。
- SPI通信を1MHz、1ワードを8ビット、モード3、CSピンをGP5として初期化(16行目)
- 連続読み取りモードコマンド($54)をSPIデバイスに出力した後、バッファDに2ワード(バイト)の温度データを読み込む(20行目)
- SPIデバイスの入力に32シリアルクロック周期以上の1を加えてインターフェースをリセットする。リセットしないとうまく動作してくれなかったため挿入しました。(21行目)
- 読み取ったデータを13バイトの生データに変換
- 最初の8ビットのデータを左へ8ビットシフトし、次の8ビットのデータと加算し16ビットのデータにする(24行目)
- 16ビットのデータを右へ3ビットシフトして13ビットのデータにする(25行目)
- 2の補数の生データを正数あるいは負数に変換する
- MSBが1の$1000(409610)より小さい場合は正数なので何もせず、$1000以上の場合は負数になるので生データから213=8192(=$2000)を引いて負数にする(28行目)
- 生データを16で割り、温度を求める(28行目)
- 温度を取得できたらその結果を時刻と共に表示する(32〜35行目)。
KM-BASICでSPIデバイスからデータを読み取る関数はパラメータに指定されたデータを書き込んだ後に1ワードだけの読み取りのSPIREAD
と3番目のパラメータ以降のデータを書き込んだ後に、2つ目のパラメータで指定ワード分を読み取り、1つ目のパラメータで指定したバッファに保存するSPIREADDATA
の2つがある。
ここでは2ワード(2バイト)のデータを読み取るのでSPIREADDATA
関数を使いました。
日本語表示
日本語表示のコードはMachiKania type P/PU ver 1.5.2からダウンロードしたmachikania-p-152.zipに含まれている日本語クラスに関するファイルLIB\CKNJ16\help.txt
を参考にしまして作りました。
日本語を表示するには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
実行結果
実行画面を以下に示します。
さいごに
PicoCalc版MachiKaniがリリースされてADT7410での温度測定ができたので次にADT7310を試したらうまく動作せず、Xにそのことを投稿したら作者の方の目に留まり、状況を伝えるなどのやり取りをして修正が加えられて正しくデータを取得できるようになりました。素早い対応をしていただいた作者の方々に感謝です。