プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

ラズパイでアナログ入力を使う

ラズパイはアナログ入力がない

アナログ入力とはGPIOで電圧値を0~1023(10bit)や0~4096(12bit)といった値で受け取る機能です。
これに対してHigh or Lowまたは1 or 0という2値をとるのをデジタル入力といいます。
ArduinoやESP32ではこのどちらも使うことが出来ますが、ラズパイではアナログ入力はありません。

このためアナログ入力を数値に変換してラズパイに渡すパーツを使う必要があります。
このようなパーツをAD(Analog - digital)コンバータといいます。

[asin:B08XJX53M7:detail]
akizukidenshi.com

抜き差ししたりブレッドボード上で使うときはソケットもあったほうがいいです。
ないと、ブレッドボード上でぐらぐらする場合があります。

ちなみに丸ピンと平ピンがありますが、よく抜き差しするなら丸ピンのほうがいいらしいです(秋月電子店員談)。
丸ピンICソケット ( 8P): ケーブル・コネクター 秋月電子通商-電子部品・ネット通販
ICソケット ( 8P): ケーブル・コネクター 秋月電子通商-電子部品・ネット通販


ラズパイで10bitのADコンバータMCP3002-I/Pを使ってみたのでPythonでの使い方を紹介します。

SPIを有効にする

このようなADコンバータはSPIというシリアル通信を使います。シリアル通信は他にI2CやUARTといったものがあります。
シリアル通信は雑に説明すると、HighとLowの信号の組み合わせで決まったパターンを送受信することでバイナリを送るようなイメージです。

ラズパイではraspi-configからInterface Option ¥ SPI を選択し「はい」を設定します。

$ sudo raspi-config

回路

実験用回路として以下のようなものを用意しました。

ちなみに、この可変抵抗をブレッドボードにさせるものはTwitterでアイデアを見つけてマネしました。




裏側はピンを片方しか敢えてつけなかったのですが、するとバランスが悪く安定しないので、紫外線硬化樹脂やスポンジで足を付けました。

結果

抵抗を動かすと↓のように出力が変化することが確認できました。

コード

# coding: utf-8

import spidev
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)

spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000
spi.bits_per_word = 8

dummy = 0xff
start = 0x47
sgl = 0x20
ch0 = 0x00
msbf = 0x08

def measure(ch):
    ad = spi.xfer2([(start + sgl + ch + msbf), dummy])
    val = ((ad[0] & 0x03) << 8) + ad[1]
    return val

while (True):
    AD0 = measure(ch0)
    print(AD0)
    time.sleep(1)

まとめ

ラズパイでADコンバータの出力を取得してみました。
センサーによってはアナログ出力で値が出てくるものがあってラズパイではこのようにADコンバータを使う必要があります。
また、ADコンバータには出力分解能が12bitのものや4系統出力のものなどもあります。
ちなみにADコンバータは内部的には基準電圧を複数保持してこれと比較したり、バイナリサーチ的に変更しながら入力電圧と比較して値を取得しているそうです。
MCP3002はデータシートによると逐次比較型のようです。
www.rohm.co.jp
en.wikipedia.org