どうも、エピックです。
この記事ではArduinoからCdsセルでデータを取得しPythonで可視化する方法について紹介します。
目次
大まかな手順を確認する
今回の次の手順で実施しました。
- 部品を調達する
- 組み立てる
- Arduinoのコードを書く
- Pythonのコードを書く
- 実行する
順番に説明していきます。
部品を調達する
今回は次の部品を調達しました。
- Arduino Uno R3
- ブレッドボード
- Cdsセル 1個
- LED 1個
- 1kΩ抵抗(茶黒赤金) 1本
- 330Ω抵抗(橙橙茶金) 1本
- ジャンパワイヤ(オス-オス)5本
少し割高ではありますが、こちらのスターターセットで全て揃います。
組み立てる
部品を組み立てていきます。
回路はこんな感じにしました。回路図のルールは身についていないので悪しからず。
組み上げた状態はこんな感じ。
Arduinoのコードを書く
Arduino IDE を使ってプログラムしていきます。
まだインストールしていないという方はこちらからソフトウェアダウンロードできます。
Arduinoに読み込ませるプログラムは次のようにしました。
void setup() {
pinMode(3, OUTPUT);
Serial.begin(9600);
}
void loop() {
// analogRead()では0-1023の値を返す
int val = analogRead(0);
int led = val/4;
// LEDの明るさは0-255
Serial.println(led);
analogWrite(3,led);
delay(100);
}
これで Arduino上の A0 ピンから取得したデータを 0.1 秒ごとに PC で受信できるようになります。
右上の虫眼鏡マークを押す事でIDE上でその様子を確認することができます。
Pythonのコードを書く
続いてPython コードを書いていきます。
Arduinoが接続されているシリアルポートを指定します。
ser.port の値は、環境に応じ変更してください。
import serial
import numpy as np
from matplotlib import pyplot as plt
import datetime
ser = serial.Serial()
ser.baudrate = 9600
ser.port = "/dev/cu.usbmodem141301"
ser.open()
timezone = datetime.timezone(datetime.timedelta(hours=9))
# 0で初期化した配列を生成
t = np.zeros(100)
y = np.zeros(100)
plt.ion()
plt.figure()
li, = plt.plot(t, y)
plt.ylim(0, 255)
plt.xlabel("time")
plt.ylabel("brightness")
plt.title("brightness time plot")
time = 0
while True:
try:
time += 0.1
ser.write("*".encode())
now = datetime.datetime.now(timezone).strftime('%Y%m%d%H%M%S')
data = ser.readline().strip().rsplit()
print(now, data)
t = np.append(t, time)
t = np.delete(t, 0)
y = np.append(y, float(data[0]))
y = np.delete(y, 0)
li.set_xdata(t)
li.set_ydata(y)
plt.xlim(min(t), max(t))
plt.draw()
plt.pause(0.015)
# [Control]+[C]で終了
except KeyboardInterrupt:
ser.close()
break
注意点ですが、pipでインストールライブラリは serial ではなく pyserial になります。
pip install pyserial
また、IDE環境上のモニターを開いておくと占有してしまうためこちらは閉じておきましょう。
実行するとこんな感じで可視化ができると思います。
最後に
今回はArduinoからCdsセルでデータを取得しPythonで可視化する方法んいついて書いてみました。もしわからないこと等あればコメントにていただけれればと思います。
今回も最後までお読みいただきありがとうございました。
では。