Pico

【お手軽】RaspberryPi Pico MicroPythonでADCを使う方法 【CDS】

はじめに

RaspberryPi PicoでMicroPythonを使って、ADC(アナログ-デジタル変換)を行う方法について解説します。

CDS(明るさセンサ)など外部機器は、機器から「アナログの電圧」しか送られてこないことがあります。少し高価な機器であればI2Cなどでデジタル値を送ってくれますが、値段が高くなりますし、配線が増えて面倒です。

RaspberryPi Picoでは、ADC用にピンが3つ準備されているため、機器を接続するだけでアナログの電圧を読み込むことができます。今回はCDS(明るさセンサ)の電圧を、PicoのADCを使って読み込む方法を解説します。

環境

この記事は以下の環境で作成しています。

環境バージョンなど備考
OS          Windows7 32bit
Tonny3.3.11

使用する機材や部品

この記事では以下の機器や部品を使用します。リンクには同等品や人気・評判がよく、高価(ぼったくり価格)でないものを選んで掲載しています。

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

実行結果

回路

今回のプログラムに使用した回路です。CDS(明るさセンサ)を、Picoの34番目のピン(GP28/ADC2)に接続し、CDSの電圧値を読み取ります。

Picoピンアサイン

Picoのピン配置の図
公式サイトより引用

プログラムの実行結果

後述するADCのコードを実行し、CDSの電圧を100回取得している結果です。

ADCピンとGND間をテスターで計測し、ほぼ同じ電圧(ちがいは数mV程度)で取得できることが確認できました。

voltRaw:52380
volt:2.638
voltRaw:52844
volt:2.661
voltRaw:52892
volt:2.663
voltRaw:53084
volt:2.673
voltRaw:52972
volt:2.667
voltRaw:52780
volt:2.658
voltRaw:52780

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))

Raspberry Pi Pico を使ってみよう

ゼロからPicoを始める人は「Pico」「USBケーブル」「ピンヘッダ」のセットが便利。Pico内蔵のLEDなら、USBにつなぐだけですぐ使えます(参考)。ケーブルを間違う心配もありません。

はんだ済み完成品はこちら

今ならPrime会員 最大2.5%ポイントGETの「現金チャージ」の裏技も使えます。

Raspberry Pi Picoの書籍

さらっと読めるムック本がおすすめです。

¥1,330 (2022/02/12 23:37時点 | Amazon調べ)

おすすめ工具

Picoに必要なおすすめ工具をこちらの記事でまとめています。

やっぱりWifiも使いたい

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

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

まとめ

RaspberryPi Pico でMicroPythonを使って、ADC(アナログ-デジタル)変換をする方法を解説しました。ADCを使うとコード・配線ともにシンプルになり、部品の費用も抑えられるので、是非使ってみてください。

このブログではRaspberryPi PicoでI2Cを使う方法や、開発環境おすすめツールについても解説しています。興味のある方は以下の記事もご覧ください。

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

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

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

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

COMMENT

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