エアサーボの試験機を作りたい その1
試験機を作りたい!
エアシリンダーやサーボバルブを自作している私ですが、製品のように耐久性や性能の試験を行いたいなと思っています。
構想
raspberry piとarduinoをシリアル通信させて動かそうと考えています。
ラズパイにGUIと試験開始、停止の指示とCSVの出力。
arduinoにサーボ動作、バルブを動かしたりセンサー値の取得。
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のコードです。こちらは少し複雑にして受け取ったデータをリアルタイムにグラフ化します。横軸の時間は固定し流れる表示としています。
動作確認
グラフの表示に成功しました。可変抵抗を手で動かしているデータです。
次回はGUIを書いてみようと思います。