マイコンボードを中継器にして PC に電子部品を接続し、Ruby で制御してみた(温度センサ編)


この記事は、富士通ソーシアルサイエンスラボラトリ Advent Calendar 2018の 2 日目の記事です。

はじめに

@GORO_Neko です。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

えーっと、先にお断りをば一言。

自分、仕事では一切マイコンボードを利用した業務に携わったことがございません。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

PC に電子部品を接続したい & PC 上の Ruby で制御したい

はい、これを実現する手段として Firmata と言う技術があることを昨日の記事で紹介いたしました。

「 PC からの操作で電子部品を動かせる(発光ダイオードを点灯できる)のは解った。今度は電子部品から情報をとってきてみせろ。」そんな声が聞こえてきたので、引き続き電子部品から情報を取ってくる方法を書いてみます。

Arduino Uno を Firmata 対応にする

やり方は昨日の記事で説明しましたので割愛。

Arduino IDE を使って StandardFirmata アプリケーションをビルドして、 Arduino Uno に書き込んでおく。ただこれだけです。

温度センサをつないでみる。

手元に転がっていたという理由から、温度センサとして LM61CIZ を、Arduino Uno 経由で PC に接続します。

LM61CIZ と Arduino Uno の結線方法に関しては、以下の図を参照ください。

[回路図]

制御スクリプトについて

以前 GitHub で公開した「マイコンボード( GR-CITRUS )と温度センサ( LM61CIZ )を使った温度取得スクリプト」を改造して、制御スクリプトを作成します。

[制御スクリプト]

firmata-test-002.rb
# Author       : Yoshihiko Hara <[email protected]>
# last updated : 2018/12/2
# Overview     : Get temperature data from "LM61CIZ" connected to PC with Ruby.
# License      : MIT License

require "arduino_firmata"

def mapping_data(conversion_targetfloat,in_min,in_max,out_min,out_max)

  # Convert "conversion_targetfloat" from "in_min" to "in_max" range to "out_min” to ”out_max" range.
  return (conversion_targetfloat - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

end

# Minimum value and maximum value of data that each device can return
PIN_NUMBER_OF_A0               =    0
DELAY_TIME                     = 1000
MIN_INPUT_VALUE_OF_ANALOGPIN   =    0
MAX_INPUT_VALUE_OF_ANALOGPIN   = 1023
MIN_VOLTAGE_VALUE_OF_ANALOGPIN =    0
MAX_VOLTAGE_VALUE_OF_ANALOGPIN = 5000
MIN_VOLTAGE_VALUE_OF_SENSOR    =  300.0
MAX_VOLTAGE_VALUE_OF_SENSOR    = 1600.0
MIN_TEMP_VALUE_OF_SENSOR       =  -30.0
MAX_TEMP_VALUE_OF_SENSOR       =  100.0

# Prepare to control Arduino from PC.
arduino = ArduinoFirmata.connect "/dev/tty.usb-device-name"

# Repeat the following operations.
#  1. Read data from sensor.
#  2. Convert the read data to air temperature.
#  3. Show temperature data.
#  4. Stop operation for 1000 ms (1 s).
while true

  # Read data from sensor (A 0 → 0 pin)
  sensor_data = arduino.analog_read(PIN_NUMBER_OF_A0)

  # Convert the read data to a voltage value.
  voltage_data = mapping_data(sensor_data,MIN_INPUT_VALUE_OF_ANALOGPIN,MAX_INPUT_VALUE_OF_ANALOGPIN,MIN_VOLTAGE_VALUE_OF_ANALOGPIN,MAX_VOLTAGE_VALUE_OF_ANALOGPIN)

  # Convert voltage value to temperature
  temperature_data = mapping_data(voltage_data.to_f,MIN_VOLTAGE_VALUE_OF_SENSOR,MAX_VOLTAGE_VALUE_OF_SENSOR,MIN_TEMP_VALUE_OF_SENSOR,MAX_TEMP_VALUE_OF_SENSOR)

  # Output temperature data to STDOUT of PC.
  puts temperature_data.to_s

  # Stop operation for 1 S.
  sleep 1

end

上記のスクリプトを実行すると、約 1 秒間隔温で度センサから得られた気温データが PC 上に表示されます。

実行結果はこんな感じ。
途中から気温が上がっているように表示されているのは、指でセンサーを温めて、一生懸命感知される温度を押し上げたからです。

[実行結果]

無事 PC が簡易温度計に変じました。

では、また。