注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好家コミュニティ(Facebook)へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く探求しましょう。
参加する理由
専門的サポート: 購入後の問題や技術的課題を、コミュニティとチームがサポートします。
学びと共有: ヒントやチュートリアルを交換してスキルを向上できます。
限定プレビュー: 新製品の発表やプレビューに早くアクセスできます。
特別割引: 最新製品を会員限定の割引価格で購入できます。
季節イベントと景品企画: プレゼントや季節ごとのイベントに参加できます。
👉 一緒に探求と創造を始めましょう。[ここ] をクリックして今すぐ参加!
3.1.5 電池残量表示器(MCP3008)
はじめに
このプロジェクトでは、LEDバーグラフでバッテリー残量を視覚的に表示できる バッテリーインジケーターを作成します。
警告
3.3V を超えるバッテリー部品は使用しないでください。 過負荷によりチップや Raspberry Pi が損傷する可能性があります。
必要な部品
このプロジェクトで使用する部品は以下の通りです。
回路図
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 |
実験手順
手順1: 回路を組み立てます。
手順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 でバーグラフ表示します。
ライブラリのインポート
#!/usr/bin/env python3 from gpiozero import LED import spidev import time
gpiozero.LED: LED の制御を簡単に行うために使用spidev: SPI を介して MCP3008 と通信time: ループ内の遅延処理に使用
LED ピン設定
ledPins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26] leds = [LED(pin) for pin in ledPins]
ledPinsに BCM GPIO ピン番号を格納各ピンに対応する LED オブジェクトを生成
SPI 初期化
spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000
SPI バス 0、デバイス CE0 を開き、通信速度を 1 MHz に設定
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
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)
メインループ
try: while True: analogVal = read_adc(0) LedBarGraph(int(analogVal / 102.4)) time.sleep(0.1)
CH0 から値を読み取り、0〜10 の範囲にスケーリングして表示
更新間隔は 0.1 秒
終了処理
except KeyboardInterrupt: for i in range(10): leds[i].off() spi.close()
Ctrl+C で終了時、LED をすべて消灯し SPI を閉じる