注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好家コミュニティ(Facebook)へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く探求しましょう。

参加する理由

  • 専門的サポート: 購入後の問題や技術的課題を、コミュニティとチームがサポートします。

  • 学びと共有: ヒントやチュートリアルを交換してスキルを向上できます。

  • 限定プレビュー: 新製品の発表やプレビューに早くアクセスできます。

  • 特別割引: 最新製品を会員限定の割引価格で購入できます。

  • 季節イベントと景品企画: プレゼントや季節ごとのイベントに参加できます。

👉 一緒に探求と創造を始めましょう。[ここ] をクリックして今すぐ参加!

3.1.5 電池残量表示器(MCP3008)

注釈

../_images/mcp3008_and_adc0834.jpg

キットのバージョンによって ADC0834 または MCP3008 が含まれています。 該当する方のセクションを進めてください。

はじめに

このプロジェクトでは、LEDバーグラフでバッテリー残量を視覚的に表示できる バッテリーインジケーターを作成します。

警告

3.3V を超えるバッテリー部品は使用しないでください。 過負荷によりチップや Raspberry Pi が損傷する可能性があります。

必要な部品

このプロジェクトで使用する部品は以下の通りです。

../_images/list2_Battery_Indicator1.png

回路図

T-Board 名

物理ピン

wiringPi

BCM

SPICE0

Pin 24

10

8

SPIMOSI

Pin 19

12

10

SPIMISO

Pin 21

13

9

SPISCLK

Pin 23

14

11

GPIO25

Pin 22

6

25

GPIO12

Pin 32

26

12

GPIO16

Pin 36

27

16

GPIO20

Pin 38

28

20

GPIO21

Pin 40

29

21

GPIO5

Pin 29

21

5

GPIO6

Pin 31

22

6

GPIO13

Pin 33

23

13

GPIO19

Pin 35

24

19

GPIO26

Pin 37

25

26

../_images/schematic_battery_indicator_mcp30081.png

実験手順

手順1: 回路を組み立てます。

../_images/july24_3.1.5_battery_indicator_mcp30081.png

手順2: SPI インターフェースを設定し、spidev ライブラリをインストールします(詳細は SPI 設定 を参照)。すでに設定済みであれば省略できます。

手順3: コードのフォルダに移動します。

cd ~/davinci-kit-for-raspberry-pi/python-pi5

手順4: 実行ファイルを起動します。

sudo python3 3.1.5-2_Battery_indicator_zero.py

プログラムが実行されたら、MCP3008 の 3 番ピンと GND にリード線を接続し、 それぞれバッテリーのプラス極とマイナス極に接続します。 すると、LEDバーグラフの対応する LED が点灯し、電圧レベル(測定範囲: 0-5V)が表示されます。

警告

RuntimeError: Cannot determine SOC peripheral base address というエラーが出た場合は 「gpiozero」が動作しない場合。 を参照してください。

コード

#!/usr/bin/env python3
from gpiozero import LED
import spidev
import time

# LED が接続されている GPIO ピンのリスト
ledPins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26]
# 各ピンに対応する LED オブジェクトを作成
leds = [LED(pin) for pin in ledPins]

# MCP3008 用 SPI 設定
spi = spidev.SpiDev()
spi.open(0, 0)              # SPI バス 0、デバイス (CE0) を開く
spi.max_speed_hz = 1000000  # SPI 通信速度を 1 MHz に設定

def read_adc(channel=0):
    """
    MCP3008 の指定チャネル(デフォルト CH0)からアナログ値を読み取る。
    10ビットの値を返す。
    """
    if channel < 0 or channel > 7:
        return -1
    r = spi.xfer2([1, (8 + channel) << 4, 0])
    value = ((r[1] & 0x03) << 8) | r[2]
    return value

def LedBarGraph(value):
    # すべての LED を消灯
    for i in range(10):
        leds[i].off()
    # 指定された値まで LED を点灯
    for i in range(min(value, 10)):
        leds[i].on()

try:
    # メインループ:LEDバーグラフを連続更新
    while True:
        analogVal = read_adc(0)  # CH0 から読み取り
        LedBarGraph(int(analogVal / 102.4))
        time.sleep(0.1)
except KeyboardInterrupt:
    # プログラム終了時に全 LED を消灯
    for i in range(10):
        leds[i].off()
    spi.close()

コード解説

この Python プログラムは Raspberry Pi 上で動作し、MCP3008 アナログ-デジタルコンバーターを用いてアナログ入力値を読み取り、その結果を GPIO ピンに接続された 10 個の LED でバーグラフ表示します。

  1. ライブラリのインポート

    #!/usr/bin/env python3
    from gpiozero import LED
    import spidev
    import time
    
    • gpiozero.LED : LED の制御を簡単に行うために使用

    • spidev : SPI を介して MCP3008 と通信

    • time : ループ内の遅延処理に使用

  2. LED ピン設定

    ledPins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26]
    leds = [LED(pin) for pin in ledPins]
    
    • ledPins に BCM GPIO ピン番号を格納

    • 各ピンに対応する LED オブジェクトを生成

  3. SPI 初期化

    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 1000000
    
    • SPI バス 0、デバイス CE0 を開き、通信速度を 1 MHz に設定

  4. ADC 読み取り関数

    def read_adc(channel=0):
        if channel < 0 or channel > 7:
            return -1
        r = spi.xfer2([1, (8 + channel) << 4, 0])
        value = ((r[1] & 0x03) << 8) | r[2]
        return value
    
    • MCP3008 の指定チャネルから 0〜1023 の範囲の 10 ビット値を取得

    • デフォルトは CH0

  5. LED バーグラフ表示関数

    def LedBarGraph(value):
        for i in range(10):
            leds[i].off()
        for i in range(min(value, 10)):
            leds[i].on()
    
    • まず全 LED を消灯

    • value の数だけ LED を点灯(最大 10)

  6. メインループ

    try:
        while True:
            analogVal = read_adc(0)
            LedBarGraph(int(analogVal / 102.4))
            time.sleep(0.1)
    
    • CH0 から値を読み取り、0〜10 の範囲にスケーリングして表示

    • 更新間隔は 0.1 秒

  7. 終了処理

    except KeyboardInterrupt:
        for i in range(10):
            leds[i].off()
        spi.close()
    
    • Ctrl+C で終了時、LED をすべて消灯し SPI を閉じる