ラズパイはアナログ入力がない
アナログ入力とは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でアイデアを見つけてマネしました。
ボタンはそのままでも一応ブレッドボードに刺さるんだけど、安定しないのでユニバーサル基板の切れ端に乗っけてやった。 pic.twitter.com/x0cTls2v4Z
— 散散満/阿部市英夫 (@til_til_mitil) 2021年3月14日
裏側はピンを片方しか敢えてつけなかったのですが、するとバランスが悪く安定しないので、紫外線硬化樹脂やスポンジで足を付けました。
結果
抵抗を動かすと↓のように出力が変化することが確認できました。
コード
# 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