注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好者コミュニティ (Facebook) へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く学びましょう。
参加する理由
専門的なサポート: 販売後の問題や技術的な課題をコミュニティとチームで解決。
学びと共有: 技術やチュートリアルを交換し、スキルを向上。
限定プレビュー: 新製品発表や先行情報に早期アクセス。
特別割引: 新製品を特別価格で購入可能。
イベント・プレゼント企画: プレゼントや季節キャンペーンに参加。
👉 一緒に探求し、創造しましょう。今すぐ [ここ] をクリックして参加!
3.1.5 バッテリーインジケーター (MCP3008)
はじめに
このプロジェクトでは、LED バーグラフを使用してバッテリー残量を視覚的に表示するバッテリーインジケーター装置を作成します。
警告
3.3V を超えるバッテリーを使用しないでください。過負荷によりチップや Raspberry Pi が損傷する可能性があります。
必要な部品
このプロジェクトには以下の部品が必要です。
部品をまとめて購入するのが便利です。リンクはこちら:
名前 |
キット内数量 |
リンク |
|---|---|---|
Raphael Kit |
337 |
以下から個別に購入することもできます。
部品紹介 |
購入リンク |
|---|---|
- |
|
- |
回路図
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 |
実験手順
ステップ 1: 回路を組み立てます。
ステップ 2: コードのあるフォルダに移動します。
cd ~/raphael-kit/c/3.1.5-2/
ステップ 3: コードをコンパイルします。
gcc 3.1.5_BatteryIndicator.c -lwiringPi
ステップ 4: 実行ファイルを実行します。
sudo ./a.out
プログラムが実行されたら、MCP3008 の 3 番ピンと GND からそれぞれ導線を取り出し、バッテリーの両極に接続します。 すると LED バーグラフの対応する LED が点灯し、電圧レベル (測定範囲: 0-5V) が表示されます。
注釈
実行しても動作しない、または「wiringPi.h: No such file or directory」というエラーが出た場合は WiringPiのインストールと確認 を参照してください。
コード
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#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;
}
コード解説
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 ビットデジタル値を返します。
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) 配線を想定しています。
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 レベルを表示
このプログラムは視覚的なバッテリー残量インジケーターまたはアナログ電圧計として機能します。