ラズベリーパイ単体ではアナログ入力がなく、AD変換が出来ません。
しかし、Arduinoと連携することでアナログ入力を使用可能となります。
ラズパイとArduinoをUSB接続で簡単に連携する方法を紹介します。
ラズベリーパイとArduinoを連携!アナログ入力を応用してみた
ラズベリーパイとArduinoを連携させてAD変換をしてみました。
Pythonを使ってリアルタイムでアナログ電圧を測定・プロットしています。
本来ラズパイ単体ではアナログ入力のピン・機能がありません。
しかしArduinoとUSB接続すれば「アナログ入力」のデータを取得できます。
ラズパイ(Python)とArduinoのプログラム含めて、接続方法を紹介していきます。
動画で見るとラズパイで5Vレベルのアナログ電圧値が取得する様子が分かります。
是非一緒に合わせてご覧ください。
ArduinoのAD変換は簡単に対応可能
Arduinoのアナログ入力を使ったAD変換は簡単に実施可能です。
下記記事で接続方法からプログラム書き込み方法まで紹介しています。(リンク先はこちら)
Arduinoは5Vの電圧レベルが入力できる
ラズパイがArduinoと連携することのメリットとして「アナログ入力」以外にもあります。
下記記事でも紹介しましたが、ラズベリーパイの電圧レベルは3.3Vです。(リンク先はこちら)
ラズパイに5Vは直接入力することはできません。
しかし、ArduinoのGPIO・アナログ入力の電圧レベルでは5Vです。5Vを直接入力可能です。
Arduino経由で5V信号をやり取りすることが可能となります。
USB接続のAD変換ボードもあります
今回はArduinoとラズパイでのAD変換ですが、別の方法もあります。(リンク先はこちら)
下記記事のAD変換ボードでは、10ch分のアナログ信号をまとめて読み取ることが可能です。
ArduinoからUSB経由でデータ取得する
Arduinoにアナログ入力をUSB(シリアル)経由でデータを送るプログラムを書き込みます。
PCからArduinoへの書き込み方法の詳細については下記記事をご参考ください。
ArduinoでAD変換!分解能10bitで電圧測定してみた
今回はアナログ0chのAD変換値・電圧値を500ms周期で取得するようにしています。
今回使用したプログラムは下記です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void setup() { // put your setup code here, to run once: Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: float analog_0 = analogRead(0); float voltage_0 = (analog_0*5)/1024; Serial.print("ADC="); Serial.print(analog_0); Serial.print("\t"); Serial.print("V="); Serial.print(voltage_0); Serial.println(""); delay(500); } |
プログラムを書き終えたら、開発環境で「マイコンボードに書き込む」を選択すればOKです。
一度書き込んだらAruduinoのプログラムは次回から自動的に立ち上がります。
PCからラズパイにUSB接続を変更してもらえれば大丈夫です。
可変抵抗で5Vの電圧調整をする
今回テスト回路としては、可変抵抗を調整して0V~5VをArduinoにアナログ入力させます。
回路としても非常に簡単です。部品としては可変抵抗しか使用していません。
市販の電子工作セットのブレッドボードとジャンパー線を使用して接続させただけです。
PythonでラズパイとArduinoを通信させる
ラズパイにはデフォルトでPythonがインストールされており、誰でも簡単に使用できます。
初心者の方でも大丈夫です。下記記事で使い方を紹介しています。(リンク先はこちら)
PythonでArduinoとUSBシリアル通信
今回のプログラムは下記記事でラズパイのCPU温度をリアルタイムでプロットした応用版です。
ラズベリーパイのヒートシンクの効果は?ファンまで必要かを検証!
今回はCPU温度ではなく、USB接続されているArduinoのアナログ電圧値をプロットします。
pyserialをインストール
USB経由でデータを取得しますが、Arduino内部でUSBシリアル変換されています。
PythonでUSBシリアル通信するために「pyserial」のパッケージをインストールします。
下記コマンドで簡単にインストールできました
Pythonのプログラム
Pythonで500ms間隔でUSBシリアル通信をReadして、電圧を表示・プロットします。
実際に使用したプログラムは下記です。
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 |
#!/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) # Arduino*の電圧を取得する a="" a=ser.readline() while ser.in_waiting: a= a + ser.readline() a2= a.split(b'V=') a3= a2[1].split(b'\r') y.append(float(a3[0])) # 折れ線グラフを再描画する plt.plot(x, y) # グラフのタイトルに電圧を表示する plt.title("CH* = "+ str(y[-1]) +" V") # グラフの縦軸_電圧の範囲を指定する plt.ylim(0,5.5) def main(): # 描画領域 fig = plt.figure(figsize=(10, 6)) # 描画するデータ x = [] y = [] params = { 'fig': fig, 'func': _update, # グラフを更新する関数 'fargs': (x, y), # 関数の引数 (フレーム番号を除く) 'interval': 500, # 更新間隔 (ミリ秒) 'frames': itertools.count(0, 0.1), # フレーム番号を無限に生成するイテレータ } anime = animation.FuncAnimation(**params) # グラフを表示する plt.show() if __name__ == '__main__': main() |
アナログ入力をリアルタイムでプロットしてみる
ラズパイのPythonのプログラムを起動するとグラフがプロットされます。
タイトル箇所にその瞬間の電圧値も表示されます
実際のテスト動画が下記になります。
冒頭でも紹介しましたが、動画だとリアルタイムでプロットしている様子が分かります。
可変抵抗を調整することで、グラフ上の電圧値が変動しています。
500msのサンプリング周期でもプロットできていることが分かります。
まとめ
今回はラズベリーパイとArduinoと連携に関して紹介させていただきました。
記事をまとめますと下記になります。
ラズベリーパイ(raspberry pi)とPythonでArduino Unoのアナログ入力をデータ取得できます。
ハードウェアの勉強や趣味・工作にも十分に使えます。是非皆さまも試してみて下さい。
コメント