見出し画像

エアサーボの試験機を作りたい その1

試験機を作りたい!
エアシリンダーやサーボバルブを自作している私ですが、製品のように耐久性や性能の試験を行いたいなと思っています。

構想

raspberry piとarduinoをシリアル通信させて動かそうと考えています。
ラズパイにGUIと試験開始、停止の指示とCSVの出力。
arduinoにサーボ動作、バルブを動かしたりセンサー値の取得。

GUIの目標イメージ

GUIはこんな感じにしたいと構想しています。最終的には試験データをCSVにまとめて偏差の大きさなど評価したいと考えていますが、とりあえず普段のサーボ動作にも使い勝手が良いものができればよいなと思います。

課題1 シリアル通信

サーボ制御やアナログ信号の取得をarduinoで行うためRaspberry Piとシリアル通信をする必要があります。
もちろんRaspberry Piではpythonを使用しますが、開発の現段階ではVScodeを使用したいためWindowsPCで進めていきます。
私はプログラミングに疎いのでChat-GPT頼りで進めます。

Arduinoのスケッチ

void setup() {
  Serial.begin(9600); // シリアル通信の初期化
}

void loop() {
  int sensorValue = analogRead(A0); // アナログデータの読み取り
  Serial.println(sensorValue); // データのシリアル送信
  delay(100); // 適切な遅延を追加
}

まずはArduinoのスケッチです。
最初なのでシンプルでいいですね。
A0のアナログデータを読み取って送ります。

pythonコード

import serial
import time
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# グローバル変数
max_data_points = 100  # グラフに表示する最大データ数
x_data = []
y_data = []

def read_serial_data(port, baudrate, timeout=1):
    try:
        ser = serial.Serial(port, baudrate, timeout=timeout)
        print(f"Serial port {port} opened successfully.")

        # グラフの初期化
        fig, ax = plt.subplots()
        line, = ax.plot(x_data, y_data)
        ax.set_ylim(0, 1023)  # グラフの縦軸の範囲を設定

        def update(frame):

            # データの読み取り
            data = ser.readline().decode('utf-8').strip()
            print(f"Received data: {data}")

            # データを処理
            try:
                value = int(data)
                x_data.append(frame)
                y_data.append(value)

                # データの数が最大データ数を超えた場合、先頭のデータを削除
                if len(x_data) > max_data_points:
                    x_data.pop(0)
                    y_data.pop(0)
            except ValueError:
                print("Invalid data format")

            # グラフの更新
            line.set_data(x_data, y_data)
            ax.relim()
            ax.autoscale_view()

        # アニメーションの設定
        ani = FuncAnimation(fig, update, frames=None, repeat=False, interval=50)  # 例: 50ミリ秒ごとに更新

        # グラフの表示
        plt.show()

    except serial.SerialException as e:
        print(f"Error: {e}")

    finally:
        if ser.is_open:
            ser.close()
            print("Serial port closed.")

if __name__ == "__main__":
    # 使用するシリアルポートとボーレートを設定
    serial_port = "COM6"  # または "/dev/ttyUSB0" (Linuxの場合)
    baud_rate = 9600

    # シリアルデータの読み取りを開始
    read_serial_data(serial_port, baud_rate)

続いてpythonのコードです。こちらは少し複雑にして受け取ったデータをリアルタイムにグラフ化します。横軸の時間は固定し流れる表示としています。

動作確認

Arduinoと可変抵抗

グラフの表示に成功しました。可変抵抗を手で動かしているデータです。
次回はGUIを書いてみようと思います。


この記事が気に入ったらサポートをしてみませんか?