LoginSignup
3
6

More than 5 years have passed since last update.

【Python】Arduino で温度センサーから室温を取得して画面に表示する(前編)

Last updated at Posted at 2019-03-24

前回の記事:【Python】置き時計の画面表示と機能を整理してみた の続きです。

今回から電子工作も交えたプログラミングになります。

電子工作といえば、知る人ぞ知る定番マイコンボードの「Arduino」を使います。
とりあえず、数年前に買った旧式の「Duemilanove」で作ってみますがパターンが完成したら、小型のマイコンボードに移植する予定です。
なので、まだハンダ付けはしません。しばらくは食パンの板で我慢しましょう。

やりたいこと

  1. Arduino で温度センサーから室温を取得
  2. USB シリアル通信で RaspberryPi に室温データを送る
  3. 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 というアイコンが現れます。
ダブルクリックして起動します。
Screenshot_20190324[1].png

下のような感じの画面が表示されたらインストールは完了です。
(今回のスケッチを開いている状態ですがそこは気にしない)
Screenshot_20190324[2].png

回路図

こんなのをイメージしました。
温度センサーの回路図はシンプルです。
Screenshot_20190324[3].png

fritzing というソフトを使って書いてみました。
Arduino UNO が描かれていますが、大人の事情なので気にしない。

現物がこちら

IMG_1624.JPG

スケッチ

Arduino IDE でソフトウェア部分のコードを記述(スケッチ)します。

TempSensor.ino
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 にて
1. スケッチ → 検証・コンパイル を実行して、赤文字エラーが画面に表示されないことを確認
2. ツール → ボード → Arduino Duemilanove or Diecimila を選択
3. ツール → シリアルポート → /dev/ttyUSB0 を選択
4. スケッチ → マイコンボードに書き込む を実行して、問題なく書き込みが完了することを確認
5. ツール → シリアルモニタ を表示する

Screenshot_20190324[4].png
という感じで室温っぽいデータが表示されれば成功です。
後編では、このデータを Python で処理して画面に表示させます。

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6