ラズベリーパイpicoでAD変換してみました。
簡単に温度や電圧のアナログ入力値を測定することができます。
設定方法からプログラムまで一連の手順を紹介します。
ラズパイでAD変換!picoでアナログ入力してみた
ラズベリーパイにはアナログ入力の機能はありません。
しかしラズベリーパイ「pico」にはアナログ入力ピン(ADC)があり、AD変換が可能です。
更にラズベリーパイ側から簡単に接続・設定が可能です。
アナログ入力を応用すれば、センサを接続して温度などを測定することが可能です。
実際に温度センサの接続をテストしています。
また単純にアナログの電圧を測定することも可能です。
3.3Vまでの電圧を可変させて確認しています。
ラズパイ「Pico」の設定方法からプログラムまで一連の手順を説明します。
下記動画で実際にPicoでAD変換したテストの様子がよく分かります。
是非一緒にご覧ください。
ラズベリーパイPicoのできること
ラズベリーパイPicoは1個500円程度で非常に安く購入できます。
あまりにも安かったので筆者は2個まとめて購入してしまいました。
普通のラズベリーパイと比べてサイズ(スペック)が小さくなっています。
「Pico」はOS(Linux)も搭載できませんので、出来る事は(ある程度)限られてきます。
筆者のイメージとしては下記です。
- ラズベリーパイ…普通のパソコン
- ラズベリーパイ「Pico」…最小限の機能にしたコスト重視のマイコンボード
できることは限られてきますが、安さ以外にも大きなメリットがあります。
Picoは普通のラズパイにはなかったアナログ入力(ADC)ピンが搭載されています。
AD変換することが可能です。(しかも、ADC0,1,2と3ch分あります。)
下記記事のArduinoのようにラズパイでもAD変換することができるようになりました。
ArduinoでAD変換!分解能10bitで電圧測定してみた
PicoのADCの分解能は12bit
AD変換が出来るということは、アナログ(温度・電圧…)のデータを取得可能になります。
使えるセンサ・データの種類が増えることは大きなメリットです。
PicoのADCは分解能は12bitです。趣味で使う分には十分かと思います。
他にもPicoならではの機能は多くありますが、アナログ入力を紹介していきます。
ラズパイPicoの回路図
ラズパイPicoの回路図に関しては、データシートの最後のAppendixに記載されていました。
https://datasheets.raspberrypi.org/pico/pico-datasheet.pdf
普通のラズベリーパイ(4Bなど)に関しても回路図は一部は公開されています。
下記記事で紹介しています。
ラズベリーパイPicoの使い方
ラズベリーパイPicoの使い方は非常に簡単です。一番簡単な手順を紹介します。
紹介している手順はあくまで筆者が対応した内容です。
詳細に関してはラズパイ公式のスタートガイドをご参考下さい。
https://www.raspberrypi.org/documentation/pico/getting-started/
ラズパイ(パソコン)にPicoを接続
最初にラズベリーパイ(もしくはパソコン)にPicoをUSB接続します。
Pico公式スタートガイドのHPに接続
Picoの中に公式のスタートガイドのURLがありますのでクリックします。
MicroPythonのUF2ファイルをPicoにコピーする
今回はMicroPythonのスタートガイドを選択します。
UF2ファイル(マイコン向けのファイル形式)をダウンロードします。
ダウンロードしたUF2ファイルをドラッグ&ドロップでPicoにコピーします。
PicoがリブートするのでThonnyで立ち上げる
UF2ファイルをコピー後は自動的にPicoがリブートされます。
ラズパイにデフォルトでインストールされているPythonの開発環境のThonnyを開きます。
※個人のパソコンの方はThonnyをインストールすれば同様に対応できます。
Thonnyの右下のコンフィグ箇所を「MicroPython(Raspberry Pi Pico)」に設定します。
シェル箇所に下記のようなラズベリーパイPicoの文字が出てくるはずです。
これでラズパイPicoの開発環境が整いました。
Type "help()" for more information.
>>>
※もしThonnyのVerが古く、右下の設定箇所が出てこない場合があります。
その場合はRUN→interpreterの箇所で設定できます。下記設定でプログラムできました。
- MicroPython(generic)
- Board in FS mode…
MicroPythonかC/C++でプログラム可能です
ラズベリーパイPicoの開発環境は「MicroPython」か「C/C++」です。
今回は「MicroPython」でプログラムしています。
今回使用するプログラムも下記のサンプル・SDKを流用しています。
https://github.com/raspberrypi/pico-micropython-examples
https://datasheets.raspberrypi.org/pico/raspberry-pi-pico-python-sdk.pdf
しかしSDKの資料を見ても、2021年2月時点では「C/C++」の方が完成度が高そうです。
まだPicoは出始めたばかりですので、「MicroPython」も今後の更新に期待しています。
ラズパイPicoのピンについて
ラズベリーパイPicoは低価格の分、若干ですが玄人向けです。
ピンヘッダーがデフォルトでは実装されていません。
(ジャンパー線・ブレッドボードへの接続するためには改造が必要です)
もし必要ならば別でピンヘッダーを購入してはんだ付けする必要があります
簡単にテストしたい場合はICクリップ
(筆者も)はんだ付けが面倒だったため、ICクリップ-ワニ口を使用しています。
簡単なテストレベルでは十分に対応できます。
ICクリップは狭い箇所を接続するのに便利です。
ラズパイPicoで温度センサを使用する
最初にラズベリーパイPicoで温度センサを使用して温度を測定します。
センサを熱源(ホットコーヒー)に近づけて、アナログ入力値が変わるかを確認していきます。
温度センサ MCP9700
今回使用した温度センサはMicrochip製のMCP9700です。
DIP形状のためワニ口でも接続できて、3.3V電源で動作する温度センサーです。
今回は温度センサーを使用しましたが、他の3.3Vで動くセンサーでも構いません。
センサーとしては「電圧(V)=0.01(V/℃)×温度(℃) + 0.5(V)」の簡易的な計算式です。
そのため温度を逆算したい場合は「温度=電圧/0.01-50」の計算を行います。
ラズパイPicoのピンとセンサの接続
ラズパイPicoで使用したピンは下記形になっています
- 3V3(36ピン)→センサ_3.3V
- GND[AGND](33ピン)→センサ_GND
- ADC0(31ピン)→センサ_Vout
MicroPythonのプログラム
実際に使ったプログラムは下記です。
サンプルプログラムのADCのchと温度センサの計算式を変更したものとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import machine import utime #sensor_temp = machine.ADC(4) sensor_temp = machine.ADC(0) conversion_factor = 3.3 / (65535) while True: reading = sensor_temp.read_u16() * conversion_factor # The temperature sensor measures the Vbe voltage of a biased bipolar diode, connected to the fifth ADC channel # Typically, Vbe = 0.706V at 27 degrees C, with a slope of -1.721mV (0.001721) per degree. #temperature = 27 - (reading - 0.706)/0.001721 temperature = reading/0.01 - 50 print(temperature) #print(reading) utime.sleep(2) |
ラズパイPicoで温度測定のテスト
冒頭でも紹介しましたが、動画だとテストでの温度のアナログ変化が分かりやすいです。
是非一緒にご覧ください。
プログラムを動作させてセンサを熱源に近づけて温度を確認しました。
室温の20℃付近から30度付近まで変化していることが分かります。
ラズパイPicoで温度センサを正常に動作させることが出来ました。
※下記グラフはPicoで測定したデータをラズパイ側でまとめたものです。
ラズパイPicoで電圧値を測定する
次にラズベリーパイPicoのアナログ入力で電圧値をそのまま測定します。
可変抵抗で0-3.3Vの電圧を調整します。
可変抵抗で3.3Vの電圧調整をする
ラズパイPicoで使用したピンは温度センサの時と同じです。
- 3V3(36ピン)→可変抵抗_1or3ピン
- GND[AGND](33ピン)→可変抵抗_1or3ピン
- ADC0(31ピン)→可変抵抗_2ピン
回路としても非常に簡単です。部品としては可変抵抗しか使用していません。
今回は10kΩを使っていますが1kΩでも問題ありません。
MicroPythonのプログラム
実際に使ったプログラムは下記です。
サンプルプログラムのアナログ入力値をそのまま出力したものとなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import machine import utime #sensor_temp = machine.ADC(4) sensor_temp = machine.ADC(0) conversion_factor = 3.3 / (65535) while True: reading = sensor_temp.read_u16() * conversion_factor # The temperature sensor measures the Vbe voltage of a biased bipolar diode, connected to the fifth ADC channel # Typically, Vbe = 0.706V at 27 degrees C, with a slope of -1.721mV (0.001721) per degree. #temperature = 27 - (reading - 0.706)/0.001721 #temperature = reading/0.01 - 50 #print(temperature) print(reading) utime.sleep(2) |
ラズパイPicoで電圧測定のテスト
動画だとテストでの電圧のアナログ変化が分かりやすいです。
是非一緒にご覧ください。
可変抵抗を調整すると、アナログの電圧値変わっていることが分かります。
最初の3.3Vから0Vに徐々に落ちていきます。
ラズパイPicoで電圧を正常に測定することが出来ました。
※下記グラフはPicoで測定したデータをラズパイ側でまとめたものです。
ラズパイPicoのデータをPythonから読み取る
別の記事となりますが、PicoのデータをUSBシリアル通信でホスト側に渡してみました。
ホスト側のPythonでPicoのデータを取得しています。
下記記事でプログラム含めて紹介しています。(リンク先はこちら)
ラズパイPicoをArduinoの代わりにシリアル通信させてみた
まとめ
今回はラズパイPicoのアナログ入力に関して紹介させていただきました。
記事をまとめますと下記になります。
ラズベリーパイPicoにはICクリップ-ワニ口が便利です。
はんだ付けしなくても簡単にテストが出来るようになります。
皆さまも是非試してみてください。
コメント
[…] https://misoji-engineer.com/archives/raspberrypi-ad-pico.html […]
Raspberry Pi PicoのADコンバーターの分解能は16ビットではなく、12ビットなのに、どうしてconversion_factor = 3.3 / (65535)になるのですか?
12bit ADC の測定結果を ADC.read_u16() が16bitにスケーリングして返すので conversion_factor の右辺の分母は 65535 (=2^{16}-1) となっているらしい。