.. note:: こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好家コミュニティ(Facebook)へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く探求しましょう。 **参加する理由** - **専門的サポート**: 購入後の問題や技術的課題を、コミュニティとチームがサポートします。 - **学びと共有**: ヒントやチュートリアルを交換してスキルを向上できます。 - **限定プレビュー**: 新製品の発表やプレビューに早くアクセスできます。 - **特別割引**: 最新製品を会員限定の割引価格で購入できます。 - **季節イベントと景品企画**: プレゼントや季節ごとのイベントに参加できます。 👉 一緒に探求と創造を始めましょう。[|link_sf_facebook|] をクリックして今すぐ参加! .. _3.1.5_py_pi5_mcp3008: 3.1.5 電池残量表示器(MCP3008) ================================== .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left キットのバージョンによって **ADC0834** または **MCP3008** が含まれています。 該当する方のセクションを進めてください。 はじめに -------- このプロジェクトでは、LEDバーグラフでバッテリー残量を視覚的に表示できる バッテリーインジケーターを作成します。 .. warning:: 3.3V を超えるバッテリー部品は使用しないでください。 過負荷によりチップや Raspberry Pi が損傷する可能性があります。 必要な部品 ---------- このプロジェクトで使用する部品は以下の通りです。 .. image:: ../python_pi5/img/list2_Battery_Indicator.png :align: center 回路図 ------ ============ ======== ======== === 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 ============ ======== ======== === .. image:: ../python_pi5/img/schematic_battery_indicator_mcp3008.png :align: center :width: 800 実験手順 -------- **手順1:** 回路を組み立てます。 .. image:: ../python_pi5/img/july24_3.1.5_battery_indicator_mcp3008.png :width: 800 **手順2:** SPI インターフェースを設定し、``spidev`` ライブラリをインストールします(詳細は :ref:`spi_configuration` を参照)。すでに設定済みであれば省略できます。 **手順3:** コードのフォルダに移動します。 .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **手順4:** 実行ファイルを起動します。 .. code-block:: sudo python3 3.1.5-2_Battery_indicator_zero.py プログラムが実行されたら、MCP3008 の 3 番ピンと GND にリード線を接続し、 それぞれバッテリーのプラス極とマイナス極に接続します。 すると、LEDバーグラフの対応する LED が点灯し、電圧レベル(測定範囲: 0-5V)が表示されます。 .. warning:: ``RuntimeError: Cannot determine SOC peripheral base address`` というエラーが出た場合は :ref:`faq_soc` を参照してください。 コード ------ .. code-block:: python #!/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. **ライブラリのインポート** .. code-block:: python #!/usr/bin/env python3 from gpiozero import LED import spidev import time - ``gpiozero.LED`` : LED の制御を簡単に行うために使用 - ``spidev`` : SPI を介して MCP3008 と通信 - ``time`` : ループ内の遅延処理に使用 2. **LED ピン設定** .. code-block:: python ledPins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26] leds = [LED(pin) for pin in ledPins] - ``ledPins`` に BCM GPIO ピン番号を格納 - 各ピンに対応する LED オブジェクトを生成 3. **SPI 初期化** .. code-block:: python spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000 - SPI バス 0、デバイス CE0 を開き、通信速度を 1 MHz に設定 4. **ADC 読み取り関数** .. code-block:: python 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 バーグラフ表示関数** .. code-block:: python 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. **メインループ** .. code-block:: python try: while True: analogVal = read_adc(0) LedBarGraph(int(analogVal / 102.4)) time.sleep(0.1) - CH0 から値を読み取り、0〜10 の範囲にスケーリングして表示 - 更新間隔は 0.1 秒 7. **終了処理** .. code-block:: python except KeyboardInterrupt: for i in range(10): leds[i].off() spi.close() - Ctrl+C で終了時、LED をすべて消灯し SPI を閉じる