注釈

こんにちは、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_Indicator.png

部品をまとめて購入するのが便利です。リンクはこちら:

名前

キット内数量

リンク

Raphael Kit

337

Raphael Kit

以下から個別に購入することもできます。

部品紹介

購入リンク

GPIO拡張ボード

購入

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

LEDバーグラフ

-

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

../_images/schematic_battery_indicator_mcp3008.png

実験手順

ステップ 1: 回路を組み立てます。

../_images/july24_3.1.5_battery_indicator_mcp3008.png

ステップ 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 レベルを表示

このプログラムは視覚的なバッテリー残量インジケーターまたはアナログ電圧計として機能します。