はじめに
RaspberryPi Picoの「アナログ入力ピン」で、ADC(アナログ-デジタル変換)を行う方法を解説します。回路はCdS(明るさセンサ)、言語はMicroPythonを使います。
CdSや感圧センサなどは、センサ値を抵抗値などの「アナログな値」で取得する必要があります。
RaspberryPi Picoでは、そのような「アナログな値」を読み取るための「ADCピン」が3つ用意されており、ノーマルのRaspberryPiのように外部のコンバータを使わずに読み取ることができます。
今回は上記の「ADCピン」を使って、CdSの値を取得する方法を解説します。
環境
この記事は以下の環境で作成しています。
環境 | バージョンなど | 備考 |
OS | Windows11 | Win7、10でもOKです |
Thonny | 3.3.13 |
RaspberryPi Picoとの接続
Pico・CdS・カーボン抵抗を以下のようにつなぎ、「分圧回路」の仕組みを利用して、CdSの状態を「アナログ電圧」として読み取ります。
分圧回路は、カーボン抵抗などを2つ並べた際に「抵抗の間の電圧」が入力電圧から変化する仕組みです。
「1kΩと1kΩ」を並べた場合、抵抗の間の電圧は半分。
「2kΩと1kΩ」を並べた場合、抵抗の間の電圧は3分の1…というように
『2つの抵抗値の割合』応じて『抵抗の間の電圧』が規則的に変化します。
CdSは、周囲の明るさによって『抵抗値』が変わるセンサーです。
CdSとカーボン抵抗を並べて「分圧回路」を作ると、
CdSの抵抗値(明るさ)に応じて、『CdS・カーボン抵抗の間の電圧』も変化します。
ADCピンでは、CdSの『抵抗値』を直接測れないので、この『CdSとカーボン抵抗の間の電圧」をADCピンで測ります。
ピン番号 | 内容 | 備考 |
38 | GND | 回路のグラウンドです |
36 | 3V3(OUT) | 回路の電源です |
34 | GP28(ADC2) |
ADC用のピンです。CdSとカーボン抵抗の間につないで、分圧の電圧を測ります。 |
Picoピンアサイン(Pin-Out)
※ Pico公式サイトより引用
使用する機材や部品
この記事では以下の機器や部品を使用します。
ブレッドボード
国内サンハヤト製のブレッドボードです。少々堅めの指し心地ですが、海外製と違ってピン穴の番号がすべて印刷されており、品質も高いのでおすすめです。
CdS(明るさセンサ)
5mmタイプのものです。大きさや抵抗値の幅でいくつか種類が分かれます。
実行結果
後述するADCのコードを実行し、ADCで電圧を100回取得している結果です。
テスターで計測した値とは10mV程度差がありましたが、おおよそ正しい電圧が取得できていると思います。
volt:0.514
voltRaw:10146
volt:0.511
voltRaw:10066
volt:0.507
voltRaw:10114
volt:0.509
voltRaw:10130
volt:0.510
voltRaw:10130
volt:0.510
voltRaw:10290
volt:0.518
RapberryPi Pico 単体でプログラムを実行する(Thonnyなし)の場合は、ソースコードの名前を「main.py」にしてPicoの内部に保存してください。
他の名称の場合は、Picoに書き込んでも自動実行(起動)されません。
全体コード
全体コードは以下の通りです。ADCからの値を1秒間隔で、100回繰り返し取得・表示しています。詳細な内容は後述する「コードのポイント」で解説します。
import machine
import time
# ADCを行うピンの設定です。
# GP28(ADC2)を使用します
cds = machine.ADC(2)
# 16bitの数値一単位での電圧値を設定します
unit = 0.00005035477
# 電圧値を100回読み込みます
for i in range(100):
# ADCの値を読み込みます(16bitの生の数値)
voltRaw = cds.read_u16()
# 生値を表示します
print("voltRaw:" + str(voltRaw))
# 16bitの値から、電圧値に変換します
volt = voltRaw * unit
# 電圧値を表示します(:.3fは少数点以下3桁を表示する設定です)
print( "volt:" + "{:.3f}".format(volt))
# 1秒待機します
time.sleep(1)
コードのポイント
ADCの設定
ADC関数を使って、ADCとして使用するピンを設定します。ADC2のピンを使用するので括弧の中の引数に「2」を指定しています。
ピンを変更する場合は該当のADCの番号「0~2]を記載してください。
# ADCを行うピンの設定です。
# GP28(ADC2)を使用します
cds = machine.ADC(2)
ADCの値を読み込む
read_u16関数を使って、ADCで読み取った電圧値を取得します。上記関数では、ピンの電圧値(0~3.3V)を、16ビット(0~65535)の値で取得できます。
# ADCの値を読み込みます(16bitの生の数値)
voltRaw = cds.read_u16()
電圧値への変換
read_u16関数から取得した生値を、電圧値に変換します。
read_u16関数は、3.3Vを0~65535の範囲で表します。そのため関数からの1カウントは、3.3V ÷ 65535 = 0.00005035477[V] となります。
# 16bitの数値一単位での電圧値を設定します
unit = 0.00005035477
取得した生値と、上記の1カウントあたりの電圧をかけることで、ADCで読み込んだ電圧値を計算することができます。
# 16bitの値から、電圧値に変換します
volt = voltRaw * unit
電圧値の表示
取得した電圧値を少数点以下3桁(1mv)まで表示する記載です。「3」の部分を変更することで、小数点以下を4,5,6・・・と表示することができます。
計算結果によって少数点以下の表示がバラついて見にくい場合などに使用してください。
# 電圧値を表示します(:.3fは少数点以下3桁を表示する設定です)
print( "volt:" + "{:.3f}".format(volt))
まとめ
RaspberryPi Pico でMicroPythonを使って、ADC(アナログ-デジタル)変換をする方法を解説しました。参考になればうれしいです。
このブログではADC以外にも、RaspberryPi PicoでI2Cを使う方法、開発環境・おすすめツールなどを解説しています。興味のある方はリンクの記事もご覧ください。
Picoで使えるADCのセンサ
明るさセンサ以外にも、ADCが使えるセンサにはおもしろい物がたくさんあります。どんなセンサでも「ADCを使ってセンサ値を読み取る」という基本的な原理は一緒です。今回解説した知識を使って、ぜひ他のセンサにもチャレンジしてみてください。
以下はPicoで使えるセンサの一例です。
水分センサ
土壌の水分を読み取れるセンサーです。3.3V~5.5VなのでPicoでも使いやすく、家庭菜園や観葉植物などによさそうです。二股で水分むき出しのタイプよりこちらのタイプの方が腐食に強いです。
感圧センサ
圧力をかけると値が変化するセンサーです。物や水が減ったことの確認や、押された力の確認など、用途は幅広いです。某RPGの「地下への階段」のマットの下において、踏まれたら「あの音」を鳴らす。などを昔作りました。
お知らせ
MicroPythonのプログラミングガイドブックが遂に発売!
「MicroPython」の本が遂にでました。
この一冊で、MicroPythonの言語仕様から、プログラミングの仕方まで”ガッツリ”学べます!。
内容は、普段別言語で開発している人や、これからマイコンを始める(工学系の)学生を対象としているので「初心者向け」ではありません。しかし、「自前のライブラリの作成」が目標なので、これ一冊で「ガッツリ」とMicroPythonを学ぶことができます。
全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。目次だけでも”ガッツリ”なのが確認できると思います。
Pico/Pico W関連のおすすめ本
RaspberryPi Pico / Pico W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。