アナログ入力ができないラズパイで、ADコンバータを使ってアナログデータを取り込めるようにしました。
使ったもの
- RaspberryPi2 Model B
- 可変抵抗
- ADコンバータ MCP3208
ADコンバータ『MCP3208』は、秋月電子で300円。(2020.5.17現在)
今回も先人たちの知恵をお借りしています。
参考にさせて頂いた記事はこちら。
そう忘備録さん :RaspberryPi 3 Model B+と赤外線距離センサー(GP2Y0A02YK)で距離を測定する
https://www.souichi.club/raspberrypi/raspi-gp2y0a02yk/
まずは配線をしていきます。
今回は、ADコンバータには可変抵抗のアナログ値を入力しようと思います。
ラズパイとADコンバータ、ADコンバータと可変抵抗の配線は下記のようにしました。
わかりづらいかもしれませんが、写真でも残しておきます。
ラズパイ側
ADコンバータと可変抵抗
全体
可変抵抗は、とりあえず真ん中くらいに合わせています。
ツマミをぐりぐりと回すと、出力電圧が変わる予定。
これでハード側の準備は完了。
次はプログラムを書いていきます。
現在勉強中のPythonで書きます。
プログラムを書く前に、2点ほど準備が必要。
1.SPIの有効化
2.spidevのインストール
SPIの有効化は、「設定」 → 「Raspberry Pi の設定」 から変更できます。
SPIのところを有効にしました。
ついでにI2Cも有効化しておきました。
たぶんそのうち使うはずなので。
spidevは、既にインストールされてたっぽい。
コマンドは下記。
sudo apt-get install python-spidev
これで準備完了。
そして、参考にした記事のサンプルプログラムをコピペ&若干の修正を加えました。
追記した箇所を赤色の文字にしています。
# -*- coding: utf-8 -*-
import time
import spidev
import numpy as np
import csv
CHN = 0
VOLTS = 5
class ADConverterClass:
def __init__(self, ref_volts, ch):
self.ref_volts = ref_volts
self.spi = spidev.SpiDev()
self.spi.open(0,0)
self.spi.max_speed_hz = 1000000
self.ch = ch
def get_voltage(self, ch):
raw = self.spi.xfer2([((0b1000+ch)>>2)+0b100,((0b1000+ch)&0b0011)<<6,0])
raw2 = ((raw[1]&0b1111) << 8) + raw[2]
volts = (raw2 * self.ref_volts ) / float(4095)
volts = round(volts,4)
return volts
def Cleanup(self):
self.spi.close()
if __name__ == '__main__': # main
ad_conv = ADConverterClass(ref_volts=VOLTS, ch=CHN)
with open('ADC.csv','w') as f:
writer = csv.writer(f, lineterminator='\n')
try:
while True:
__volts = ad_conv.get_voltage(ch=CHN)
print("volts: {:8.2f}".format(__volts))
volf = float(__volts)
writer.writerow([volf])
time.sleep(1)
except KeyboardInterrupt:
print("\nCtl+C")
except Exception as e:
print(str(e))
finally:
ad_conv.Cleanup()
print("\nexit program")
通信の設定やデータ取得のプログラムはそのままにして、csvファイルへ保存するところを追記しました。
動作確認の結果。
しっかりとデータが取得できました!!
色々と勉強した成果もあり、今回は割と短時間で出来ました。
少しずつですが、プログラムが読めるようになってきた気がします。
これでまた使える引き出しが1つ増えました。
まだまだコピペメインですが、作りたいものが作れるようになるまで頑張ります!