ラズベリーパイ(以下、ラズパイ)はMathematicaが無償で利用できます。ラズパイ4になってCPUの処理能力が上がったので、3Dの描画も延々と待たなくて済むようになりました。ラズパイは、GPIOやI2C、SPIなどのハードをアクセスできるのが特徴のLinuxマシンです。現在は、Raspbian Buster が2019年6月から利用できるようになりました。
ターミナルからMathematicaを立ち上げる
sudo Mathematicaと実行すれば、root権限でMathematicaが立ち上がります。通常piユーザは、GPIO、I2C、SPIをroot権限がなくてもアクセスできます。ここでは、MathematicaでMEMSセンサのBME280から温度を読み出し、グラフ化します。
BME280のデバイス・ドライバの登録
ラズパイには、コンパイル済みのセンサのデバイス・ドライバがたくさん用意されています。詳細は、/boot/overlays/READMEに書かれています。といっても簡単な説明だけです。ドライバの多くはiioです。
最初は、メイン・メニューのPreferencesからRaspberry Pi Configurationをクリックし、Interfaceのタブを選び、I2Cにチェックを入れOKを押すことで、I2Cインターフェースを有効にします。Buster からは、リブートは不要になりました。
sudo nano /boot/config.txt
で、設定ファイルconfig.txtを開き、最後の行に、
dtoverlay = i2c-sensor,bme280,param=0x76
を加え、上書きで保存し、終了、リブートをすると、BME280がI2Cインターフェースで有効になります。確認は、i2cdetect -y 1を実行し、0x76にUUと表示が出るとOKです。
その前にセンサの接続をします。
BME280はアマゾンで購入
820円で、翌日配達でした。
「HiLetgo BME280 温度 センサー 湿度 センサー 気圧 センサー Arduino センサー 大気圧センサ 温湿度センサー ブレイクアウト Arduinoに対応 [並行輸入品]」
次のようにI2Cで接続します。BME280自体はSPIとI2Cの両方に対応していますが、このボードはI2C専用になっていますし、デバイス・ドライバもI2C用です。
温度データの読み取り
デバイス・ドライバを組み込むと、/sysの下に読み取ったデータがテキスト・ファイルで、随時更新されています。
次のように読み取ります。整数で、千倍の値が書かれています。
cat /sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input
Pythonで、
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input')
Temp = round(int(f.read()) / 1000.0, 1)
f.close
print(Temp)
で読み出せます。
MathematicaでPythonのプログラムを利用する
MathematicaからPythonのプログラムを利用するには、ExternalSessions機能を使います。Pythonのプログラムは関数にします。ExternalValueでその関数を呼び出し、値を受け取ります。
dataList = {};
Do[
session = StartExternalSession["Python"];
ExternalEvaluate[session, "def temp():
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input');
Temp = round(int(f.read()) / 1000.0, 1);
f.close;
return Temp
"];
v = ExternalValue[session, "temp()"];
DeleteObject[session];
AppendTo[dataList, v]
, {v, 1, 10}
]
dataList
ListLinePlot[dataList]
リアルタイムにグラフを更新するプログラムは、https://www.denshi.club/pc/raspi/linux-3-mathematicabme280.html を参考にしてください。