ラズベリーパイPicoはUSBシリアルのデバイスとして認識できます。
応用すればUSB1本で簡単にデータ通信することが可能です。
PicoをArduinoの代わりにAD変換デバイスとして使う方法を紹介します。
ラズパイPicoをArduinoの代わりにシリアル通信させてみた
ラズベリーパイPicoはUSBシリアル接続のデバイスとして使用することが可能です。
またPicoはArduinoと同様にアナログ入力ピンを持ち、AD変換の機能があります。
ラズパイPicoをAD変換のUSBデバイスとして使用することが出来ました。
ホスト側のPythonを利用して、リアルタイムでPicoのAD変換のデータをプロットしています。
設定方法からプログラムまで一から手順を説明します。
下記動画でも紹介しています。是非一緒にご覧ください。
USBシリアル経由でPicoのデータをリアルタイムで取得できていることが分かります。
PicoとArduinoはアナログ入力できます
PicoとArduinoはアナログ入力ピンが有り、AD変換が可能です。
アナログの電圧値をデジタルに変換することができます。
温度・湿度などのアナログのセンサーを接続することが可能です。
PicoをUSBシリアルと認識しています
Arduino同様にPicoもUSBシリアルでデータを送受信することが可能です。
下記記事のようにホスト側(ラズパイ)のPythonで受け取ることができます。
ラズベリーパイとArduinoを連携!アナログ入力を応用してみた
Picoと接続しているホスト(ラズベリーパイ)側からもUSBデバイスと認識できています。
dmesgで確認すると、よくあるUSBシリアルデバイス(ttyACM0)として認識していました。
1 2 3 4 5 6 7 |
[ 2.033280] usb 1-1.3: new full-speed USB device number 3 using xhci_hcd [ 2.168130] usb 1-1.3: New USB device found, idVendor=2e8a, idProduct=0003, bcdDevice= 1.00 [ 2.168150] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 2.168166] usb 1-1.3: Product: RP2 Boot [ 2.168182] usb 1-1.3: Manufacturer: Raspberry Pi [ 2.168197] usb 1-1.3: SerialNumber: E0C912D24340 [ 2.172937] usb-storage 1-1.3:1.0: USB Mass Storage device detected |
1 |
[ 4.804474] cdc_acm 1-1.3:1.0: ttyACM0: USB ACM device |
ラズベリーパイPicoとArduinoの比較
ラズベリーパイPicoとArduinoはCPUから違い、大きな差があります。
どちらにも多くメリットがあるので、代表的なAD変換箇所をメインに紹介します。
ラズベリーパイPicoのメリット
ラズベリーパイPicoのAD変換の使い方・メリットに関しては下記記事でも紹介しています。
Picoは価格が安い
ラズベリーパイPicoは1台500円程度で非常に安いです。正規のArduinoと比べると格安です。
またサードパーティーの互換品のArduinoと比べてもほぼ同じ価格です。
- Pico…500円程度
- Arduino…数百円~3000円程度 ※互換品~正規品で価格差があり
PicoのADCの分解能は12bit
ArduinoのADCの分解能が10bitに対して、Picoは12bitです。
さらに電圧が3.3Vのため、より精度の高いAD変換が可能となります。
下記計算のように精度だけで見ると、PicoはArduinoの5倍以上の数値となります。
- Pico…3.3V/4096(2^12)≒0.8mV刻みのAD変換
- Arduino…5V/1024(2^10)≒5mV刻みのAD変換
実際にPicoでAD変換のプログラムを実行したところ、約0.8mV刻みでAD変換できていました。
※プログラム上では16bit(read_u16())でreadしているため、65535(2^16)で分解しています。
Arduinoのメリット
ArduinoのAD変換については下記記事でも紹介しています。
ArduinoでAD変換!分解能10bitで電圧測定してみた
Arduinoは5Vのアナログ入力
Arduinoは5Vまでのアナログ入力が可能です。またArduino Unoは6chあります。
(PicoのIO電圧は3.3Vのため、5Vの入力はできません)
- Pico…アナログ入力_3.3V・3ch
- Arduino…アナログ入力_5V・6ch
Arduinoはジャンパー線の接続が楽
Arduinoはデフォルトでピンソケットが実装されています。
購入してすぐにジャンパー線を接続することが可能です。
Picoはピンヘッダーがデフォルトでは実装されていません。
- Pico…ジャンパー線の接続には「改造要」
- Arduino…ジャンパー線の接続には「改造不要」
Picoでは別にピンヘッダーを購入してはんだ付けする必要があります。
(筆者も)はんだ付けが面倒だったため、ICクリップ-ワニ口を使用しています。
Picoの簡単なテストレベルでは十分に対応できます。
ICクリップは狭い箇所を接続するのに便利です。
ラズベリーパイPicoでUSBシリアル出力する
ラズベリーパイPicoでテスト的にUSBシリアル出力する方法は簡単です。
ラズパイPico公式のスタートガイドのファイルを使用するだけです。
下記記事の手順でファイルをPicoに書き込めば、自動的にUSBシリアル出力します。
Pico側で出力するとUSB接続されているホスト側にもデータが届きます。
結果、ホスト側のPythonやシリアルコンソールでデータ取得することが可能です。
筆者はPythonにて下記設定でUSBシリアルのデータを取得しました。
- デバイス名…ttyACM0
- ボーレート…115200bps
PythonでPicoのデータを取得する
Picoのアナログ入力のデータをホスト側(ラズパイ)のPythonで取得します。
そして、リアルタイムでプロットするテストを行います。
Picoで取得するデータは可変抵抗で調整した0-3.3Vの電圧値です。
可変抵抗で3.3Vの電圧調整をする
ラズパイPicoで使用したピンは下記の通りです。
- 3V3(36ピン)→可変抵抗_1or3ピン
- GND[AGND](33ピン)→可変抵抗_1or3ピン
- ADC0(31ピン)→可変抵抗_2ピン
回路としても非常に簡単です。部品としては可変抵抗しか使用していません。
今回は10kΩを使っていますが1kΩでも問題ありません。
PicoのMicroPythonのプログラム
Pico側で実際に使ったMicropythonのプログラムは下記です。
下記記事の電圧値をAD変換するプログラムにLチカを合わせたものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import machine import utime from machine import Pin, Timer #sensor_temp = machine.ADC(4) sensor_temp = machine.ADC(0) conversion_factor = 3.3 / (65535) led = Pin(25, Pin.OUT) tim = Timer() def tick(timer): global led led.toggle() tim.init(freq=2.5, mode=Timer.PERIODIC, callback=tick) while True: reading = sensor_temp.read_u16() * conversion_factor print(reading) utime.sleep(0.5) |
ホスト側のPythonのプログラム
ホスト(ラズパイ)側で実際に使ったPythonのプログラムは下記です。
下記記事のプログラムをPico用に修正したものです。
ラズベリーパイとArduinoを連携!アナログ入力を応用してみた
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 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import itertools import math import numpy as np import serial ser = serial.Serial('/dev/ttyACM0', 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) # Picoの電圧を取得する a="" a=ser.readline() while ser.in_waiting: a= a + ser.readline() a2= a.split(b'\r') y.append(float(a2[0])) # 折れ線グラフを再描画する plt.plot(x, y) # グラフのタイトルに電圧を表示する plt.title("CH* = "+ str(y[-1]) +" V") # グラフの縦軸_電圧の範囲を指定する plt.ylim(0,3.5) def main(): # 描画領域 fig = plt.figure(figsize=(10, 6)) # 描画するデータ x = [] y = [] params = { 'fig': fig, 'func': _update, # グラフを更新する関数 'fargs': (x, y), # 関数の引数 (フレーム番号を除く) 'interval': 1000, # 更新間隔 (ミリ秒) 'frames': itertools.count(0, 1), # フレーム番号を無限に生成するイテレータ } anime = animation.FuncAnimation(**params) # グラフを表示する plt.show() if __name__ == '__main__': main() |
PicoのAD変換をリアルタイムでプロットする
冒頭でも紹介しましたが、動画だと実際のテストの様子が分かりやすいです。
USBシリアル経由でPicoのデータをリアルタイムで取得できています。
是非一緒にご覧ください。
PicoのMicroPythonのプログラムを起動
最初にPico側のAD変換+Lチカの(Micropython)プログラムを起動しておきます。
ホスト側のPythonのプログラムを起動
次にホスト側のPython側の開発環境を立ち上げます。
(筆者は両方ともThonnyで実施したので、設定を切り替えているだけです)
ホスト側のプログラムを起動すると、自動的に電圧値のプロットが始まります。
リアルタイムで電圧値のプロットを確認
可変抵抗を調整すると、Pythonのグラフもリアルタイムで変わりました。
Picoからホスト(ラズパイ)側にデータがしっかり送られていることが分かります。
まとめ
今回はラズパイPicoのUSBシリアル通信の応用例に関して紹介させていただきました。
記事をまとめますと下記になります。
ラズベリーパイPicoにはICクリップ-ワニ口が便利です。
はんだ付けしなくても簡単にテストが出来るようになります。
皆さまも是非試してみてください。
コメント