環境情報
- Raspberry Pi2 Model B
- Raspbian JESSIE
- Python 2.7.9
- A/Dコンバータ MCP3008
- 半固定抵抗(〜100Ω)×3個
- RGB LED (共通端子アノード)
- 抵抗330Ω ×3個
目的
半固定抵抗を利用して、抵抗値に応じて点灯するLEDの色を変化させる。その際、PWMを用いてLEDへ送る電圧を擬似的にコントロールしLEDのR(赤)、G(緑)、B(青)のそれぞれのINPUTを調整させる。
用語説明
PWM
PWMとは、Pulse Width Modulation パルス調変換のことで、信号の変調方式のこと。電圧を上げ下げする間隔を細かく調整することで擬似的に電圧を調整する方法。
事前情報
RGBフルカラーLEDは、一番長い端子がアノード(+につなぐ)になっているものと、カソード(-につなぐ)になっているものがあるとのこと。ショップで購入した時に型番を控えなかったので、挿してみて確認したところ、アノードタイプだった。
プログラムのコードは、アノードで動作するようになってる。カソードの場合は、デューティ比のところを100から引いた値にすれば良い。
回路
例のごとく回路図を電子的に描く術を知らないので写真で、、
MCP3008
MCP3008 チャンネル8つを持つ10bitのA/Dコンバータ
プログラム
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from time import sleep
import spidev
import subprocess
def readacd(ch):
resp = spi.xfer2([0x1,(8+ch)<<4, 0x00])
value = ((resp[1]&3)<<8) + resp[2]
return value
GPIO.setmode(GPIO.BCM)
LEDIN=25
LEDIN2=24
LEDIN3=23
GPIO.setup(LEDIN, GPIO.OUT)
GPIO.setup(LEDIN2, GPIO.OUT)
GPIO.setup(LEDIN3, GPIO.OUT)
p0=GPIO.PWM(LEDIN, 50)
p1=GPIO.PWM(LEDIN2, 50)
p2=GPIO.PWM(LEDIN3, 50)
p0.start(0)
p1.start(0)
p2.start(0)
# opne SPI device 0.0
spi = spidev.SpiDev()
spi.open(0 , 0)
try:
while True:
input0 = readacd(0)
input1 = readacd(1)
input2 = readacd(2)
duty0 = 100 - (input0*100/1023)
duty1 = 100 - (input1*100/1023)
duty2 = 100 - (input2*100/1023)
p0.ChangeDutyCycle(duty0)
p1.ChangeDutyCycle(duty1)
p2.ChangeDutyCycle(duty2)
print("duty0:{:8}".format(duty0)+","+"duty1:{:8}".format(duty1)+","+"duty2:{:8}".format(duty2))
sleep(1)
except KeyboardInterrupt:
pass
p0.stop()
p1.stop()
p2.stop()
spi.close()
GPIO.cleanup()
readrcdでは、チャンネルを引数に渡している。チャンネル毎の値を取得するために引数の値を変更しながら、データを取得している。
結果は、ムービーで。
Ctrl+Cで終了すると、TypeError が出てしまいますが、解決策がわかっていません。誰か教えて、、