MENU
Pico

【ADC】RaspberryPi Pico MicroPythonでアナログ入力を使う方法 【CdS】

はじめに

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の抵抗値(明るさ)に応じて、『CdS・カーボン抵抗の間の電圧』も変化します。

ADCピンでは、CdSの『抵抗値』を直接測れないので、この『CdSとカーボン抵抗の間の電圧」をADCピンで測ります。

PicoとCdSの接続方法
ピン番号 内容 備考
38 GND 回路のグラウンドです
36 3V3(OUT) 回路の電源です
34 GP28(ADC2)

ADC用のピンです。CdSとカーボン抵抗の間につないで、分圧の電圧を測ります。

Picoピンアサイン(Pin-Out)

RaspberryPi Picoのピンアサイン(pinout)の画像

Pico公式サイトより引用

使用する機材や部品

この記事では以下の機器や部品を使用します

RaspberryPi Pico

ブレッドボード

指定はないですが、半ざしなどのトラブルが少ない、サンハヤト製をおすすめします。以下の長いタイプなら、スペースが広くて配線・デバッグが楽になります

¥1,210 (2022/02/22 09:28時点 | Amazon調べ)

CdS(明るさセンサ)

5mmタイプのものです。大きさや抵抗値の幅でいくつか種類が分かれます。

¥700 (2022/02/15 16:01時点 | Amazon調べ)

実行結果

後述する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の「地下への階段」のマットの下において、踏まれたら「あの音」を鳴らす。などを昔作りました。

¥356 (2022/06/12 01:32時点 | Amazon調べ)

小型四角型もあります。

接触位置センサ

上の感圧センサに似ていますが、こちらは「どの位置が押されたか?」がわかるセンサです。

¥1,243 (2022/06/12 01:30時点 | Amazon調べ)

UdemyにRaspberryPiの講座があります

実はUdemyで『RaspberryPi』『Pico』『Arduino』の基礎/実践講座が見れます。無料もあるので「動画で学びたい」「本は読み尽くした」という方は以下のリンクをご覧ください。

⇒ RaspberryPiの講座一覧はこちら

以下の記事で、RaspberryPi・RaspberryPi Picoのおすすめ講座3選も解説しています。

M5StackならWiFi・画面・バッテリー付きです

「やっぱりWifiやディスプレイも欲しい…」「基盤むき出しはちょっと怖い」という方には「M5Stack Core2」があります。Wifi・タッチ画面・バッテリー搭載で、より高度なIoT機器が追加部品なしで作れます。GPIOなどももちろんありますよ。

※ セットアップ方法もこちらで解説しています。

応援・要望お待ちしてます

ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。

ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

メールアドレスが公開されることはありません。