Pico PR

【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公式サイトより引用

使用する機材や部品

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

ブレッドボード

サンハヤト性のブレッドボードです。少々堅めの指し心地ですが、などの品質も高く、おすすめの一品です。

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

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

小型四角型もあります。

お知らせ

今月号のInterfaceは『RaspberryPi 5』特集

3月25日発売のInterfaceは「RaspberryPi 5」特集!

実験などを通じた性能測定や特徴・変更点の解説。新規に追加されたI/Oボード「RP1」の特徴と謎。Pi5のはじめかたやLinuxコマンド入門などが特集されています。

Pico/Pico W関連のおすすめ本

RaspberryPi Pico / Pico W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。

見た目のいい工具をお探しの方へ

よく使うツールは『見た目』が重要。モチベもあがりますし、仲間との話のネタにもなります。以下のサイトは、デザイン性の高い工具が集めたサイトなので、興味がある方はぜひご覧ください。

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

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

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です