ラズベリーパイでデータロガーを格安で自作してみました。
USBで簡単に接続でき、10チャンネル分のアナログ電圧入力を測定可能です。
Pythonでデータ出力、またリアルタイムでグラフにするまでを一から紹介します。
ラズベリーパイでデータロガー!電圧測定してグラフにしてみた
ラズベリーパイでデータロガーを自作してみました。
USB接続のAD変換のボードですので簡単に電圧測定が可能です。
AD変換のボードで電圧が測定できるため、スイッチ・温度センサーなども接続可能です。
ラズパイで測定したデータをタイムスタンプと共にファイル出力できます。
Pythonでアナログの電圧値を確認して、データ収集からグラフ化まで対応できます。
接続方法からプログラムまで詳細を紹介していきます。
下記動画でも分かりやすく紹介していますので是非一緒にご覧ください。
パソコンでもデータロガーにできます
今回はラズベリーパイをデータロガーにしていますが、Windowsのパソコンでも可能です
下記記事で紹介しています。(リンク先はこちら)
今回使用したのはUSB接続のAD変換ボードです。値段は1000円程度です。
「温度や電圧などのアナログ値」を「データ用のデジタル値」に変換するボードです。
USBシリアル接続のため、WindowsのソフトでもラズパイのPythonでも対応可能です。
データロガーのセンサーを自由に選択可能
今回のデータロガーとするUSBのボードは電圧値を取得します。
端子台形状になっており、ジャンパー線で自由にセンサーを接続できます。
ジャンパー線に関しては市販のジャンパー線(オスーオス)です。
端子台とブレットボードを接続しています。下記記事で紹介したものを使用しています。
ラズベリーパイとセットで購入するべき おすすめ部品/パーツ/キット
今回は「スイッチ」と「温度センサー」の情報をデータ収集します。
データロガーの配線図
今回のデータロガーとしての配線図としては下記形になります。特に難しいことはしていません。
「温度センサー」「10kΩプルダウン+スイッチ」を接続しました。
プルダウンが無いとスイッチ押されていないとき、0Vに固定されないので接続します。
測定可能な電圧は3.3Vまで
今回のデータロガーの注意点としては測定可能な最大電圧は3.3Vとなります。
基本的には3.3Vで動作するのセンサーを用意する必要があります。
端子台からAD変換しているCPUに直結しているためだと思われます。
Arduinoを使えば5V電圧レベルも可能
5Vの信号・センサーを使いたいという方は下記記事をご参考ください。(リンク先はこちら)
Arduinoとラズパイを連携することで5Vの入力をAD変換をしています。
データロガーのチャンネル数は10ch
今回のAD変換ボードは最大10チャンネルまでまとめて測定可能です。
特に設定など必要なく、自動的に10チャンネル分データが確認できます。
データロガーの分解能は12bit
今回のAD変換の精度(分解能)は12bitとなります。
明確なデータシートはありませんが、CPUがSTM32ですので12bit_AD変換のようです。
0~3.3Vまでを12bit(2^12)のため、単純換算で約0.8mV(3.3÷4096)単位の精度です。
実際に測定した所、約3.3VをAD変換時には4096付近の値を取っていました。
データロガーのサンプリング周期は500ms
今回のデータロガーとしてのサンプリング周期は約500ms(0.5秒)です。
タイムスタンプを入れて実際に確認してみました。
AD変換ボードから約500ms周期で10チャンネル分のデータが送られてきます。
Pythonでデータロガーとしてファイル出力
ラズベリーパイでPythonを使い、データロガーとしてファイル出力します。
ラズパイにはデフォルトでPythonがインストールされており、誰でも簡単に使用できます。
初心者の方でも大丈夫です。下記記事で使い方を紹介しています。(リンク先はこちら)
Pythonでシリアルデータをそのまま読み出す
まずは単純にAD変換ボードの値をそのまま読み出します。
USBシリアル接続のため「pyserial」というライブラリで簡単にデータ取得可能です。
設定に関しては2行目に記載しているボーレートの115200ぐらいです。
Pythonのシリアル通信の詳細については下記記事で紹介しています。(リンク先はこちら)
プログラムなどは下記に記載していますが、あくまで一例です。
今回のデータロガーの仕様に合わせていますので、参考レベルでお願いします。
(筆者のテストレベルのため、結構いい加減のプログラムです)
1 2 3 4 5 6 7 8 |
import serial ser = serial.Serial('/dev/ttyUSB0', 115200) a=ser.readline() while ser.in_waiting: a= a + ser.readline() print(a) |
出力結果は下記結果となり、バイトデータで10ch分のAD変換値を取得できています。
Pythonで時間情報含めてファイル出力する
時間情報(タイムスタンプ)含めてデータをPythonでファイル出力します。
出力方法に関しては色々ありますが、今回はテキストベースで出力しています。
AD変換値と電圧値はボードから貰えるため、タイムスタンプを足すだけです。
実際のプログラムは下記形です。
1秒間隔で5回分のデータをタイムスタンプと一緒にファイル出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import time import serial import datetime ser = serial.Serial('/dev/ttyUSB0', 115200) f = open('logger.txt', 'w') start = time.time() while time.time() - start <= 5: f.writelines([str(datetime.datetime.now()),'\t',ser.readline().decode()]) while ser.in_waiting: f.writelines([str(datetime.datetime.now()),'\t',ser.readline().decode()]) time.sleep(1) f.close() |
Pythonのプログラムと同じフォルダ場所に「logger.txt」としてファイル出力できました。
ラズパイにはLibreOfficeというエクセルのようなフリーソフトもインストールされています。
ファイル出力したテキストデータをエクセル同様に表・グラフ化も可能です。
Pythonで電圧測定した値をグラフ化
Pythonで電圧測定した値をリアルタイムでグラフ化してみます。
今回のプログラムは下記記事でCPU温度をリアルタイムでプロットした応用版です。
ラズベリーパイのヒートシンクの効果は?ファンまで必要かを検証!
今回例ではスイッチの入力電圧(CH5)を測定しました。
スイッチがOFFの場合は0V、ONの場合は約3.3Vが電圧測定されています。
冒頭でも紹介しましたが、動画でみると実際のアナログ値の動きが分かりやすいです。
是非一緒にご覧ください。
実際のプログラムが下記となります。
CH5の電圧値を10ch分のデータから(結構)無理やり分割して抽出しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import itertools import math import numpy as np import serial ser = serial.Serial('/dev/ttyUSB0', 115200) from matplotlib import pyplot as plt from matplotlib import animation from subprocess import getoutput def _update(frame, x, y): """グラフを更新するための関数""" # 現在のグラフを消去する plt.cla() # データを更新 (追加) する x.append(frame) # CH*の電圧を取得する a="" a=ser.readline() while ser.in_waiting: a= a + ser.readline() a2= a.split(b'CH5:') a3 = a2[1].split(b'\t') a4 = a3[1].split(b'V') y.append(float(a4[0])) # 折れ線グラフを再描画する plt.plot(x, y) # グラフのタイトルに電圧を表示する plt.title("CH* = "+ str(y[-1]) +" V") # グラフの縦軸_電圧の範囲を指定する plt.ylim(0,3.5) def main(): # 描画領域 fig = plt.figure(figsize=(10, 6)) # 描画するデータ x = [] y = [] params = { 'fig': fig, 'func': _update, # グラフを更新する関数 'fargs': (x, y), # 関数の引数 (フレーム番号を除く) 'interval': 1000, # 更新間隔 (ミリ秒) 'frames': itertools.count(0, 0.1), # フレーム番号を無限に生成するイテレータ } anime = animation.FuncAnimation(**params) # グラフを表示する plt.show() if __name__ == '__main__': main() |
Pythonで温度センサーの値をグラフ化
電圧同様に温度センサーのデータをリアルタイムでグラフ化してみます。
センサーから電圧出力されるので、温度換算すれば測定できます。
実際にセンサーを手で温めると温度が上昇することを確認しました。
実際のプログラムが下記となります。
内容としては電圧測定のとほぼ同じです。計算・文言など修正したのみです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import itertools import math import numpy as np import serial ser = serial.Serial('/dev/ttyUSB0', 115200) from matplotlib import pyplot as plt from matplotlib import animation from subprocess import getoutput def _update(frame, x, y): """グラフを更新するための関数""" # 現在のグラフを消去する plt.cla() # データを更新 (追加) する x.append(frame) # CH*の温度センサMCP9700の値を取得する a="" a=ser.readline() while ser.in_waiting: a= a + ser.readline() a2= a.split(b'CH7:') a3 = a2[1].split(b'\t') a4 = a3[1].split(b'V') y.append(float(a4[0])/0.01-50) # 折れ線グラフを再描画する plt.plot(x, y) # グラフのタイトルに温度を表示する plt.title("CH* = "+ str(y[-1]) +"degrees") # グラフの縦軸_温度の範囲を指定する plt.ylim(24,29) def main(): # 描画領域 fig = plt.figure(figsize=(10, 6)) # 描画するデータ x = [] y = [] params = { 'fig': fig, 'func': _update, # グラフを更新する関数 'fargs': (x, y), # 関数の引数 (フレーム番号を除く) 'interval': 1000, # 更新間隔 (ミリ秒) 'frames': itertools.count(0, 0.1), # フレーム番号を無限に生成するイテレータ } anime = animation.FuncAnimation(**params) # グラフを表示する plt.show() if __name__ == '__main__': main() |
まとめ
今回はラズパイのデータロガー化に関して紹介させていただきました。
記事をまとめますと下記になります。
ラズベリーパイ(raspberry pi)とAD変換ボードを組み合わせて、データロガーにできます。
さらにPythonを使えばファイル出力・グラフ化など多くの対応が可能です。
是非皆さまもデータロガーを試してみて下さい。
コメント
はじめまして。自作抵抗値ロガーを作る方法がないか調べていたときにこちらのサイトを見つけ、アドバイスをいただけないかと思い、書き込みさせていただきました。ラズパイ使用で測定結果まで出力できるという非常に魅力的な物ですごく感動しています。今回は電圧測定ということでしたが抵抗値の測定ログを取ることは可能でしょうか?品質管理の面でリレーの接点抵抗値のログを取りたく、なにかいい方法がないか調べており行き詰まっております。なにかいい方法があれば教えていただけないでしょうか?よろしくお願いします。
お世話になっております。
管理人のミソジです。
>>今回は電圧測定ということでしたが抵抗値の測定ログを取ることは可能でしょうか?
⇒難しいと思われます。
本格的に抵抗測定をしたい場合は、専用の抵抗測定器からアナログ出力してそれを読み取るのが一般的かと考えます。
今回の記事のように簡易的にテストするならば、抵抗挟んで測定することも考えました。
ただリレーの接点抵抗だと数Ωの単位だと考えられるので、今回のガジェットレベルの分解能では難しいかと思います。
(精度良く、熱容量も大きい抵抗をR1に使えば可能かもしれませんが…)
(例)
3.3V--抵抗(R1)--リレーa/b接点(R2)--GND
↑
ここの電圧値を読み取れば、一応は抵抗が逆算できる
仮にR1=100Ω,R2=0Ωとすると電圧値は3.3V
仮にR1=100Ω,R2=1Ωとすると電圧値は3.3V×R2/(R1+R2)=0.03V
仮にR1=100Ω,R2=10Ωとすると電圧値は3.3V×R2/(R1+R2)=0.3V
説明のあったSTM32F103C8T6を載せて
あるボードを購入し、パソコンで試験をしました。
最初は、パソコン用ドライバーが不明でしたが、CH34xで通信が出来ました。
ありがとうございました。
次に、ボードに付いているRT,TX,GNDを使ってRS232C通信を行おうとしましたが、
データは、受信出来るようですが、上手く行きませんでした。
何が悪いのか、ハードの不得意な私にはわかりません。
もし、分ければお教え下さい。
他の質問
1)付いているジャンパーはどんな時、使用しますか
2)RT,TX,GNDを使ってのRS232C通信の
ボーレート、データビット長等