前回の記事:【Python】置き時計の画面表示と機能を整理してみた の続きです。
今回から電子工作も交えたプログラミングになります。
電子工作といえば、知る人ぞ知る定番マイコンボードの「Arduino」を使います。
とりあえず、数年前に買った旧式の「Duemilanove」で作ってみますがパターンが完成したら、小型のマイコンボードに移植する予定です。
なので、まだハンダ付けはしません。しばらくは食パンの板で我慢しましょう。
やりたいこと
- Arduino で温度センサーから室温を取得
- USB シリアル通信で RaspberryPi に室温データを送る
- Python で受信して画面に室温を表示する
前半で用意するもの
- Arduino Duemilanove
- Arduino IDE 1.8.9 (Linux ARM 版)
- ブレッドボード
- 温度センサー LM61BIZ(秋月電子通商)
- Raspberry pi 3 Model B Rev 1.2 - Raspbian 9.6 (Stretch)
Arduino IDE のセットアップ
Arduino IDE をダウンロードします。
https://www.arduino.cc/en/Main/Software
Linux ARM 32 bits を選択
ダウンロードしたファイルを RaspberryPi に転送します。
$ scp ~/Downloads/arduino-1.8.9-linuxarm.tar.xz pi@192.168.X.X:~
転送したファイルを RaspberryPi 側で解凍してインストールします。
$ ssh pi@192.168.X.X
pi@192.168.X.X's password:
$ xzcat arduino-1.8.9-linuxarm.tar.xz | tar xfv -
$ cd ~/arduino-1.8.9
$ sudo ./install.sh
※2019/03/25 追記
GUI から /home/pi/arduino-1.8.9/install.sh をダブルクリックして実行しないとデスクトップにアイコンが現れないようです。
デスクトップに Arduino IDE というアイコンが現れます。
ダブルクリックして起動します。
下のような感じの画面が表示されたらインストールは完了です。
(今回のスケッチを開いている状態ですがそこは気にしない)
回路図
こんなのをイメージしました。
温度センサーの回路図はシンプルです。
fritzing というソフトを使って書いてみました。
Arduino UNO が描かれていますが、大人の事情なので気にしない。
現物がこちら
スケッチ
Arduino IDE でソフトウェア部分のコードを記述(スケッチ)します。
int sensorPin = A0;
int sensorValue = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
sensorValue = analogRead(sensorPin);
float temp = modTemp(sensorValue);
Serial.println(temp);
delay(1000);
}
float modTemp(int analog_val) {
float v = 5000;
float tempC = (((v * analog_val) / 1024) - 600) / 10;
return tempC;
}
ソースコード参考:Arduinoで作る簡易百葉箱 | Device Plus - デバプラ
Serial.begin
で 9,600 bps のシリアル通信を開始。
loop()
に突入すると、analogRead(sensorPin = A0)
で温度センサーの情報を読み取ります。modTemp(analog_val)
にてアナログな入力値をデジタルな温度に変換し、Serial.println
で温度をシリアル出力します。これを 1 秒ごとに繰り返す処理ですね。
今回の回路の特性として、
- Arduino アナログポートは 0-5V の入力をデジタルな数値 0-1023 で表現する
- 0 ℃ のときに温度センサーの出力電圧は 600 mV となる
- 温度センサーは 5V を入力すると -30 〜 100 ℃ の間で、300 mV から 1600mV を出力する(らしい)
- 1 ℃ 変化すると、出力電圧は 10mV 変化する
ということなので、modTemp(analog_val)
関数は以下のような処理をしてデジアナ変換を行なっています。
入力電圧 v = 5,000 mV、analog_val = 168 の状態であるとき
(((5,000 * 168) / 1024) - 600) / 10 を評価する。評価の過程は以下の通り。
以下の計算式で、Arduino の A/D 変換値から温度センサーの出力電圧に変換する。
5,000 * 168 = 840,000
840,000 / 1024 = 822.722820763956905 (mV)
0 °C のときの出力電圧 600 mV を計算から除外する。
822.722820763956905 - 600 = 222.722820763956905 (mV)
1 °C あたり 10mV 変化するため 10 で割る。
222.722820763956905 / 10 = 22.27 (°C)
スケッチを実行する
Arduino IDE にて
-
スケッチ → 検証・コンパイル
を実行して、赤文字エラーが画面に表示されないことを確認 -
ツール → ボード → Arduino Duemilanove or Diecimila
を選択 -
ツール → シリアルポート → /dev/ttyUSB0
を選択 -
スケッチ → マイコンボードに書き込む
を実行して、問題なく書き込みが完了することを確認 -
ツール → シリアルモニタ
を表示する