ADコンバータ MCP3208 で可変抵抗の値を読み取ってみる
やったこと
可変抵抗を操作したときの抵抗の値をリアルタイムに読み取る。
使ったもの
- Raspberry Pi 4
- OS: Raspbian GNU/Linux 10
- デバイスはこちら
回路
作りはこんな感じ
コード
# -*- cofing: utf-8 -*- import RPi.GPIO as GPIO from time import sleep def readadc(adcnum, clockpin, mosipin, misopin, cspin): # MCP3208 から SPI 通信で 12 ビットのデジタル値を取得する。 # 0-7 の 8 チャンネルが利用可能。 if adcnum > 7 or adcnum < 0: return -1 # 各ピンに初期電圧状態設定 GPIO.output(cspin, GPIO.HIGH) GPIO.output(clockpin, GPIO.LOW) GPIO.output(cspin, GPIO.LOW) # 読み取り準備 commandout = adcnum # 今回 0 なので 0b 0000 0000 0000 開始 commandout |= 0x18 # スタートビット + シングルエンドビット (0b 0000 0001 1000) commandout <<= 3 # LSB から 8 ビット目を送信するよう指定 (0b 0000 1100 0000) # クロックピンの電圧上げ下げをキーに、 # 0b 0000 1100 0000 から 1100 部分を順に送信 for i in range(5): if commandout & 0x80: GPIO.output(mosipin, GPIO.HIGH) else: GPIO.output(mosipin, GPIO.LOW) commandout <<= 1 GPIO.output(clockpin, GPIO.HIGH) GPIO.output(clockpin, GPIO.LOW) # clock ピンを区切りに使用して、13 ビット読み取り (nullbit + 12bit data) # misopin の状態を利用して読み取り adcount = 0 for i in range(13): GPIO.output(clockpin, GPIO.HIGH) GPIO.output(clockpin, GPIO.LOW) adcount <<= 1 if i > 0 and GPIO.input(misopin) == GPIO.HIGH: adcount |= 0x1 GPIO.output(cspin, GPIO.HIGH) # 読み取った結果を応答 return adcount # ここからメインの流れ GPIO.setmode(GPIO.BCM) # 使うピンの定義 SPISCLK=11 # 数字は GPIO 番号レイアウトはここ参照 [https://white-azalea.hatenablog.jp/entry/2021/01/06/212250:title] SPIMOSI = 10 SPIMISO = 9 SPICS = 8 # ピンをセットアップ GPIO.setup(SPISCLK, GPIO.OUT) GPIO.setup(SPIMOSI, GPIO.OUT) GPIO.setup(SPIMISO, GPIO.IN) GPIO.setup(SPICS, GPIO.OUT) try: while True: inputVal0 = readadc(0, SPISCLK, SPIMOSI, SPIMISO, SPICS) print(inputVal0) sleep(0.2) except KeyboardInterrupt: pass GPIO.cleanup()
実行結果
抵抗スイッチを左に回すと
右に回すと
ほっほーい