.. 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 レベルを表示 このプログラムは視覚的なバッテリー残量インジケーターまたはアナログ電圧計として機能します。