ラズベリーパイとArduinoを連携!アナログ入力を応用してみた

本サイトはアフィリエイト広告を利用しています。
ラズベリーパイ(raspberry pi)

ラズベリーパイ単体ではアナログ入力がなく、AD変換が出来ません。

しかし、Arduinoと連携することでアナログ入力を使用可能となります。

ラズパイとArduinoをUSB接続で簡単に連携する方法を紹介します。

 

スポンサーリンク

ラズベリーパイとArduinoを連携!アナログ入力を応用してみた

ラズベリーパイとArduinoを連携させてAD変換をしてみました。

Pythonを使ってリアルタイムでアナログ電圧を測定・プロットしています。

 

本来ラズパイ単体ではアナログ入力のピン・機能がありません。

しかしArduinoとUSB接続すれば「アナログ入力」のデータを取得できます。

 

ラズパイ(Python)とArduinoのプログラム含めて、接続方法を紹介していきます。

 

動画で見るとラズパイで5Vレベルのアナログ電圧値が取得する様子が分かります。

是非一緒に合わせてご覧ください。

 

ArduinoのAD変換は簡単に対応可能

Arduinoのアナログ入力を使ったAD変換は簡単に実施可能です。

下記記事で接続方法からプログラム書き込み方法まで紹介しています。(リンク先はこちら)

ArduinoでAD変換!分解能10bitで電圧測定してみた
Arduino Unoのアナログ入力を使用してAD変換してみました。 分解能は10bitですが趣味の電圧測定には十分使用できるレベルです。 Arduinoとの接続方法からプログラムまで分かりやすく紹介します。

 

Arduinoは5Vの電圧レベルが入力できる

ラズパイがArduinoと連携することのメリットとして「アナログ入力」以外にもあります。

下記記事でも紹介しましたが、ラズベリーパイの電圧レベルは3.3Vです。(リンク先はこちら)

ラズパイに5Vは直接入力することはできません。

ラズベリーパイのGPIOの使い方!5V/12Vを制御してみた
ラズベリーパイのGPIOは3.3V出力のため直接5V/12Vは制御できません。しかしトランジスタを使うことで自由にON/OFFできることを紹介します。実際の回路図・プログラムまで載せていますので誰でも同様にテスト可能です。ラズベリーパイのG...

 

しかし、ArduinoのGPIO・アナログ入力の電圧レベルでは5Vです。5Vを直接入力可能です。

Arduino経由で5V信号をやり取りすることが可能となります。

 

USB接続のAD変換ボードもあります

今回はArduinoとラズパイでのAD変換ですが、別の方法もあります。(リンク先はこちら)

下記記事のAD変換ボードでは、10ch分のアナログ信号をまとめて読み取ることが可能です。

ラズベリーパイでデータロガー!電圧測定してグラフにしてみた
ラズベリーパイでデータロガーを格安で自作してみました。 USBで簡単に接続でき、10チャンネル分のアナログ電圧入力を測定可能です。 Pythonでデータ取得してリアルタイムでプロットするまでを一から紹介します。

 

ArduinoからUSB経由でデータ取得する

Arduinoにアナログ入力をUSB(シリアル)経由でデータを送るプログラムを書き込みます。

PCからArduinoへの書き込み方法の詳細については下記記事をご参考ください。

ArduinoでAD変換!分解能10bitで電圧測定してみた

 

今回はアナログ0chのAD変換値・電圧値を500ms周期で取得するようにしています。

今回使用したプログラムは下記です。

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の簡単な始め方
プログラミングを始めたい方にラズベリーパイを使った簡単な入門方法を紹介します。プログラミング言語の中でも初心者にもやさしく、人気なPythonがラズパイならば簡単にスタートできます。ラズベリーパイでプログラミング入門!Pythonの簡単な始...

 

PythonでArduinoとUSBシリアル通信

今回のプログラムは下記記事でラズパイのCPU温度をリアルタイムでプロットした応用版です。

ラズベリーパイのヒートシンクの効果は?ファンまで必要かを検証!

今回はCPU温度ではなく、USB接続されているArduinoのアナログ電圧値をプロットします。

 

pyserialをインストール

USB経由でデータを取得しますが、Arduino内部でUSBシリアル変換されています。

PythonでUSBシリアル通信するために「pyserial」のパッケージをインストールします。

下記コマンドで簡単にインストールできました

pip3 install pyserial

 

Pythonのプログラム

Pythonで500ms間隔でUSBシリアル通信をReadして、電圧を表示・プロットします。

実際に使用したプログラムは下記です。

#!/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と連携に関して紹介させていただきました。

記事をまとめますと下記になります。

ラズパイとArduinoはUSB1本で簡単に連携可能
PythonでArduinoのアナログ入力のデータを取得できます
5V電圧レベルの信号も入力できます

 

ラズベリーパイ(raspberry pi)とPythonでArduino Unoのアナログ入力をデータ取得できます。

ハードウェアの勉強や趣味・工作にも十分に使えます。是非皆さまも試してみて下さい。

コメント