技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

ADコンバータ MCP3208 で可変抵抗の値を読み取ってみる

やったこと

可変抵抗を操作したときの抵抗の値をリアルタイムに読み取る。

使ったもの

回路

f:id:white-azalea:20210126204747p:plain

作りはこんな感じ

f:id:white-azalea:20210126210741p:plain

コード

# -*- 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()

実行結果

抵抗スイッチを左に回すと f:id:white-azalea:20210126212336p:plain

右に回すと f:id:white-azalea:20210126212419p:plain

ほっほーい