半固定抵抗を使って電圧を調整してみる

スポンサーリンク

前回の トグル動作によるLEDの点灯制御 に続いて、半固定抵抗を使って電圧を調整してみます。これが出来ると電圧の強弱によりLEDを調整したりと出来る幅が広がります。

はじめる前に

半固定抵抗による電圧調整を実装するに際して以下を用意しました。

タクトスイッチを使ってLEDを点灯してみるでしようしたパーツ一式
MCP3208
半固定抵抗(10~100kΩ)

MCP3208
IMG_3949

半固定抵抗
IMG_3948

Raspberry Piとブレッドボードを接続する

完成図は下記。

ping-pongv1_ブレッドボード

電圧を途中にかました「半固定抵抗」のつまみで調整できるようにします。調整した値は、MCP3208を使ったアナログ値からデジタル値に変換します。

注意すべき点は、半固定抵抗の挿し方MCP3208の配線です。

半固定抵抗は、つまみを実際に回してみて変わり方が変な場合は挿し方を上下逆にするといいです(※おそらくこれで壊れることはないと思います)。

MCP3208の配線は下記の通りです。
6F7AC260-6C8B-4539-B406-AD696FC27D82
(라즈베리파이 GPIO 강좌より)

値を送るCHを選定しそこに配線を通します。今回の場合は、調整した電圧を0CHへ通します。Raspberry Piへの結果出力ですが、MCP3208をそれぞれRaspberry Pi側へ配線します。

VDD → 3V3
VREF → 3V3
AGLD → GND
CLK → SPI SCLK(11)
DOUT → SPI MISO(9)
DIN → SPI MOSI(10)
CS/SHDN → SPI CE0(8)
DGND → GND

正しく接続しても調整した電圧が表示されない場合があります。
その場合は、CHの差込口を変えてみてください。
※おそらくCH0なので一番上か一番下です。でも故障しそうだからおすすめはしません。

Pythonによる電圧値の出力

MCP3208を使って変換したデジタル値をPythonを使って出力します。
下記のようにPythonを記述します。

# coding: utf-8
import RPi.GPIO as GPIO
import time

def read(adcnum, sclk, mosi, miso, ce0):
    
    if adcnum > 7 or adcnum < 0:
        return -1

    GPIO.output(ce0, GPIO.HIGH)
    GPIO.output(sclk, GPIO.LOW)
    GPIO.output(ce0, GPIO.LOW)

    commandout = adcnum
    commandout |= 0x18
    commandout <<= 3

    for i in range(5):
        if commandout & 0x80:
            GPIO.output(mosi, GPIO.HIGH)
        else:
            GPIO.output(mosi, GPIO.LOW)
        commandout << 1

        GPIO.output(sclk, GPIO.HIGH)
        GPIO.output(sclk, GPIO.LOW)
    adcout = 0

    for i in range(13):
        GPIO.output(sclk, GPIO.HIGH)
        GPIO.output(sclk, GPIO.LOW)
        adcout <<= 1
        if i>0 and GPIO.input(miso) == GPIO.HIGH:
            adcout |= 0x1
    GPIO.output(ce0, GPIO.HIGH)
    return adcout
        
GPIO.setmode(GPIO.BCM)
sclk = 11
miso = 9
mosi = 10
ce0 = 8

GPIO.setup(sclk, GPIO.OUT)
GPIO.setup(miso, GPIO.IN)
GPIO.setup(mosi, GPIO.OUT)
GPIO.setup(ce0, GPIO.OUT)

try:

    while True:
        
        data = read(0, sclk, mosi, miso, ce0)
        print(data)
        time.sleep(0.2)
    
except KeyboardInterrupt:
    GPIO.cleanup()

一番メインのプログラムは、5行目〜36行目までです。
ここでMCP3208の仕様に従って情報を送信します。
マスターからの受信は前述した
DIN → SPI MOSI(10)
からです。ここで調整した電圧を受信します。
その後、7ビット目の時点から0とそれに続く12ビットのデータ(計13ビット)をマスターに送信します。
その結果データを出力する感じ?(勉強不足です。。。)
この一連の作業を制御しています。

あとは、このデータを49行目から永久ループで出力します。

電圧値の測定

実際に動かしてみると下記のように電圧値を半固定抵抗によって調整出来ていることが確認できました。
IMG_3951
因みに 0は0Vで、4095は3.3Vのことです。

次回はこの調整した電圧を使ってLEDの光を調整してみたいと思います。

参考文献

・Raspberry Piで学ぶ電子工作(金丸隆志 著)
라즈베리파이 GPIO 강좌
MCP3208仕様書

スポンサーリンク
スポンサーリンク
スポンサーリンク

フォローする

スポンサーリンク
スポンサーリンク