.. note::
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好者コミュニティ (Facebook) へようこそ!
Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く学びましょう。
**参加する理由**
- **専門的なサポート**: 販売後の問題や技術的な課題をコミュニティとチームで解決。
- **学びと共有**: 技術やチュートリアルを交換し、スキルを向上。
- **限定プレビュー**: 新製品発表や先行情報に早期アクセス。
- **特別割引**: 新製品を特別価格で購入可能。
- **イベント・プレゼント企画**: プレゼントや季節キャンペーンに参加。
👉 一緒に探求し、創造しましょう。今すぐ [|link_sf_facebook|] をクリックして参加!
.. _3.1.5_c_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:: ../img/list2_Battery_Indicator.png
:align: center
部品をまとめて購入するのが便利です。リンクはこちら:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - 名前
- キット内数量
- リンク
* - Raphael Kit
- 337
- |link_Raphael_kit|
以下から個別に購入することもできます。
.. list-table::
:widths: 30 20
:header-rows: 1
* - 部品紹介
- 購入リンク
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_bar_graph`
- \-
* - :ref:`cpn_mcp3008`
- \-
回路図
-------------------
============ ======== ======== ===
T-Board 名 physical 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:: ../img/schematic_battery_indicator_mcp3008.png
:align: center
実験手順
-------------------------
**ステップ 1:** 回路を組み立てます。
.. image:: ../img/july24_3.1.5_battery_indicator_mcp3008.png
**ステップ 2:** コードのあるフォルダに移動します。
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/3.1.5-2/
**ステップ 3:** コードをコンパイルします。
.. raw:: html
.. code-block::
gcc 3.1.5_BatteryIndicator.c -lwiringPi
**ステップ 4:** 実行ファイルを実行します。
.. raw:: html
.. code-block::
sudo ./a.out
プログラムが実行されたら、MCP3008 の 3 番ピンと GND からそれぞれ導線を取り出し、バッテリーの両極に接続します。
すると LED バーグラフの対応する LED が点灯し、電圧レベル (測定範囲: 0-5V) が表示されます。
.. note::
実行しても動作しない、または「wiringPi.h: No such file or directory」というエラーが出た場合は :ref:`install_wiringpi` を参照してください。
コード
--------
.. code-block:: c
#include
#include
#include
#define SPI_CHANNEL 0
#define SPI_SPEED 1000000 // 1MHz
#define VREF 3.3
int pins[10] = {6, 26, 27, 28, 29, 21, 22, 23, 24, 25};
int read_ADC(int channel)
{
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // 開始ビット
buffer[1] = (8 + channel) << 4; // シングルエンドモード
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int value = ((buffer[1] & 3) << 8) | buffer[2];
return value;
}
void LedBarGraph(int value) {
for (int i = 0; i < 10; i++) {
if (i < value)
digitalWrite(pins[i], HIGH);
else
digitalWrite(pins[i], LOW);
}
}
int main(void)
{
if (wiringPiSetup() == -1) {
printf("setup wiringPi failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\n");
return 1;
}
for (int i = 0; i < 10; i++) {
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], HIGH);
}
while (1) {
int analogVal = read_ADC(0); // MCP3008 CH0
if (analogVal < 0) continue;
float voltage = analogVal * VREF / 1023.0;
int level = analogVal * 10 / 1024;
if (level > 10) level = 10;
LedBarGraph(level);
printf("ADC Value: %d\tVoltage: %.2f V\tLevel: %d\n", analogVal, voltage, level);
delay(200);
}
return 0;
}
コード解説
----------------------
.. code-block:: c
int read_ADC(int channel)
{
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // 開始ビット
buffer[1] = (8 + channel) << 4; // シングルエンドモード, CH0~CH7
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int value = ((buffer[1] & 3) << 8) | buffer[2]; // 10ビット結果を結合
return value;
}
この関数は MCP3008 ADC チップから SPI を使用してアナログ値を読み取ります。
`channel` パラメータで 8 個のアナログ入力 (CH0–CH7) のどれを使用するかを選択します。
MCP3008 はアナログ電圧を表す 0〜1023 の 10 ビットデジタル値を返します。
.. code-block:: c
void LedBarGraph(int value) {
for (int i = 0; i < 10; i++) {
if (i < value)
digitalWrite(pins[i], HIGH); // LED を ON (アクティブ HIGH 配線を想定)
else
digitalWrite(pins[i], LOW); // LED を OFF
}
}
この関数は 10 個の LED バーグラフを制御します。
各 LED は電圧範囲の 1/10 を表し、指定レベルまで順に点灯します。
注意: このバージョンは LED のアノードが GPIO に接続され、カソードが GND である (アクティブ HIGH) 配線を想定しています。
.. code-block:: c
int main(void)
{
if (wiringPiSetup() == -1) {
printf("setup wiringPi failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\n");
return 1;
}
for (int i = 0; i < 10; i++) {
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], HIGH); // 全ての LED を初期 ON
}
while (1) {
int analogVal = read_ADC(0); // CH0 の電圧を読み取り
if (analogVal < 0) continue;
float voltage = analogVal * VREF / 1023.0;
int level = analogVal * 10 / 1024; // 0〜10 レベルに変換
if (level > 10) level = 10;
LedBarGraph(level); // LED にレベルを表示
printf("ADC Value: %d\tVoltage: %.2f V\tLevel: %d\n", analogVal, voltage, level);
delay(200); // 更新速度: 5Hz
}
return 0;
}
メインプログラムの処理:
- wiringPi と SPI 通信を初期化
- LED バーを制御するため GPIO ピンを出力設定
- MCP3008 (CH0) からアナログ電圧を継続的に読み取り
- 読み取り値を `VREF = 3.3V` を基準に電圧へ変換
- 電圧を 0〜10 段階にスケーリングし LED に表示
- シリアルコンソールに ADC 値・電圧(ボルト)・LED レベルを表示
このプログラムは視覚的なバッテリー残量インジケーターまたはアナログ電圧計として機能します。