アナログデータを読み込んで、フルカラーLEDに反映させてみた

下記の記事にて、フルカラーLEDの基本的な使い方を紹介しました。

参考1:フルカラーLEDを使ったみた(ハード制御編)

参考2:フルカラーLEDを使ったみた(ソフト制御編)

今回は少し発展版でアナログデータを読み込んでフルカラーLEDに反映させていきます。

アナログデータは可変抵抗を用います。

やりたいこと

ダイジェスト

手順

1. アナログデータの読み込み

2. アナログデータをデジタルデータへ変換

3. デジタルデータをPWMデータへ変換

4. PWMデータをフルカラーLEDに反映

用意するもの

基本セット

● ラズパイ

● ブレッドボード

● ジャンパー線

● その他接続器具(アダプタ)

フルカラーLED用セット

● フルカラーLED(アノードコモン) ×  1個

● 可変抵抗 × 3個

● 抵抗(200Ω) × 3個

● ADコンバータ(MCP3008) × 1個

回路を設計しよう

配線の仕方は?

こんな感じです。結構複雑です。

プログラムを作成しよう

ダイジェスト

実施する内容の手順を紹介します。

手順

1. ADコンバートのプログラム確認(サンプル実行するだけ)

2. フルカラーLED出力プログラム作成(サンプルを元に修正)

では実際にプログラム作成してみたいと思います!

アナログデータをリアルタイムで確認するプログラムの実行をします。

実行結果はこんな感じになります。

プログラムを実行する前にいろいろインストールが必要です。

私は、以下のサイト通り進めました。

MCP3008 | Raspberry Pi Analog to Digital Converters

さっくりとコマンドのみを抜粋します。

sudo apt-get update

sudo apt-get install build-essential python-dev python-smbus git

cd ~

git clone https://github.com/adafruit/Adafruit_Python_MCP3008.git

cd Adafruit_Python_MCP3008

sudo python setup.py install

cd ~/Adafruit_Python_MCP3008/examples

sudo python simpletest.py
simpletest.pyのサンプルのソースコードは以下になります。(配置先はこちら)

[code lang="bash"]
# Simple example of reading the MCP3008 analog input channels and printing
# them all out.
# Author: Tony DiCola
# License: Public Domain
import time

# Import SPI library (for hardware SPI) and MCP3008 library.
import Adafruit_GPIO.SPI as SPI
import Adafruit_MCP3008

# Software SPI configuration:
CLK  = 18
MISO = 23
MOSI = 24
CS   = 25
mcp = Adafruit_MCP3008.MCP3008(clk=CLK, cs=CS, miso=MISO, mosi=MOSI)

# Hardware SPI configuration:
# SPI_PORT   = 0
# SPI_DEVICE = 0
# mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE))

print('Reading MCP3008 values, press Ctrl-C to quit...')
# Print nice channel column headers.
print('| {0:>4} | {1:>4} | {2:>4} | {3:>4} | {4:>4} | {5:>4} | {6:>4} | {7:>4} |'.format(*range(8)))
print('-' * 57)
# Main program loop.
while True:
    # Read all the ADC channel values in a list.
    values = [0]*8
    for i in range(8):
        # The read_adc function will get the value of the specified channel (0-7).
        values[i] = mcp.read_adc(i)
    # Print the ADC values.
    print('| {0:>4} | {1:>4} | {2:>4} | {3:>4} | {4:>4} | {5:>4} | {6:>4} | {7:>4} |'.format(*values))
    # Pause for half a second.
    time.sleep(0.5)
[/code]

フルカラーLED出力プログラム作成(サンプルを元に修正)

アナログデータをデジタルデータに変換し、PWMとして、フルカラーLEDへ出力します。

実行結果はこんな感じになります。

※PIGPIOを使用するため、デーモンを起動する必要があります。(pigpiod)

参考:フルカラーLEDを使ったみた(ソフト制御編)

analogToLED.pyのソースコードは以下になります。(配置先はこちら)


[code lang="bash"]
# Simple example of reading the MCP3008 analog input channels and printing
# them all out.
# Author: Tony DiCola
# License: Public Domain
import time
import pigpio
# Import SPI library (for hardware SPI) and MCP3008 library.
import Adafruit_GPIO.SPI as SPI
import Adafruit_MCP3008

# Software SPI configuration:
CLK  = 18
MISO = 23
MOSI = 24
CS   = 25
mcp = Adafruit_MCP3008.MCP3008(clk=CLK, cs=CS, miso=MISO, mosi=MOSI)

# Hardware SPI configuration:
# SPI_PORT   = 0
# SPI_DEVICE = 0
# mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE))

# led
GPIO_R = 13
GPIO_G = 26
GPIO_B = 19

# led initalaze
normalize = 255.0 / 1024 # pwm maximum / 10 bits
pi = pigpio.pi()
pi.set_PWM_frequency(GPIO_R,200)
pi.set_PWM_frequency(GPIO_G,200)
pi.set_PWM_frequency(GPIO_B,200)

# Main program loop.
while True:
    # Read all the ADC channel values in a list.
    values = [0]*8
    for i in range(8):
        # The read_adc function will get the value of the specified channel (0-7).
        values[i] = mcp.read_adc(i) * normalize

    #led data send
    pi.set_PWM_dutycycle(GPIO_R,values[0])
    pi.set_PWM_dutycycle(GPIO_G,values[1])
    pi.set_PWM_dutycycle(GPIO_B,values[2])

    # Print the ADC values.
    print('R| {0:>3.1f}   G|{1:>3.1f}   B|{2:>3.1f}'.format(*values))
    time.sleep(0.5)
[/code]

まとめ

● MCP3008(ADコンバーター)はSPIで通信している

● MCP3008用の便利なライブラリが用意されている

次回はアナログデータからモーターを制御します!

0 thoughts on “アナログデータを読み込んで、フルカラーLEDに反映させてみた”

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA