← All stories
9 min read Updated Sep 22, 2026

太陽光パネルの発電を計測する電子工作

家庭用の市販の太陽光パネルは違いがよく分かりません。 よく晴れた日には1日でスマートフォンを満充電にできるなど、それなりに実用性がありそうな話は耳にしますが、発電量が気象条件に依存するだけに実際のところはよく分かりません。 よく分からないものは、自分で調べてみるしかありません。 発電量を調べるのは割と簡単でして Hall effect sensor というものを用意すれば、個人でも測定できます。

30Aレンジ電流センサモジュール ACS712モジュール

このセンサモジュールを制御するための Microcontroller (MCU) と接続用のケーブル、そしてプログラミング用のパソコンさえあれば測定を始められます。 センサモジュールはセンサの計測範囲によって3種類に分類されますので、お使いの太陽光パネルに応じて適切な計測範囲のものをお求めください。
略称 計測範囲 センサ型番
5A ±5A ACS712ELCTR-05B-T
20A ±20A ACS712ELCTR-20A-T
30A ±30A ACS712ELCTR-30A-T
ここでは 5A (ACS712ELCTR-05B-T) を用いるものとして話を進めます。 ※ 電子工作では電圧や電流の向きなどを間違えるとコンデンサなどが爆発したり、回路が発火したりすることもありますので、部品を揃える段階から細心の注意を払ってください。

Arduino Uno を使用します。 センサモジュールと MCU の準備ができましたら、やることはたったの3つだけです。 (1)センサモジュール制御用のプログラムを書いて MCU にアップロードします。 つぎに(2)MCU とセンサモジュールをジャンパワイヤを用いて接続します。 最後に(3)データ受信用のプログラムを書いてパソコンを待機させます。 ここまでできましたら、あとは太陽光パネルとセンサモジュール、MCU とパソコンをそれぞれ接続させて実際に計測を行えます。

公式ページ から、お使いの環境に適した最新の Arduino Software (IDE) をダウンロードしてインストールしておいてください。 センサモジュールの制御と USB の出力には、最低限、これだけあれば動きます。SD カードへの出力など、必要に応じて適宜改編してください。

const int analogInput = A0;

const double vcc = 5; // 5V
const double quiescentVoltage = 0.5 * vcc;
const double sensitivity = 0.185; // 185mV

void setup() {
  Serial.begin(9600); //baud rate 9600bps
}

void loop() {
  double rawVoltageInput = (double) analogRead(analogInput) / 1023 * 5.0;
  double volts = rawVoltageInput - quiescentVoltage;
  double amps = volts / sensitivity;

  Serial.println(String(volts, 3) + "\	" + String(amps, 3));
  delay(500);
}
これを保存して MCU にアップロードするとセンサモジュールの出力を受け取って、USB経由でパソコンにデータを書き出せるようになります。 何をしているのかを一言でまとめると、センサがアナログの入力を読み取って 10bit の(0 から 1023 までの)数値に変換するので、その数値を理解できる単位に変えて画面に出力するという処理を書いています。 なんだか得体の知れない数値 sensitivity = 0.185 は製造元のデータシートから得られます。 https://www.allegromicro.com/~/media/files/datasheets/acs712-datasheet.ashx [PDF] ついでにデータシートからは ±5 A で気温 25°C のとき、センサの固有誤差は ±1.5% で精度階級は 1.5 ということが分かります。 なお Arduino の操作や用語については、日本語の参考書もありますので分かりにくかったら参考にしてください。

みんなのArduino入門

(2)MCU とセンサモジュールを接続する ソフトウェアの準備ができましたら、次はハードウェアの準備です。 センサモジュールには VCC OUT GND という端子があります。それぞれ、電源端子、出力端子、グランド端子という意味があります。 検索すると大学の講義資料などで詳しく解説されていますので、興味がありましたら調べてみて下さい。 計測するために必要なことは、それぞれの端子を識別して、正しく接続することです。 具体的には以下のようになります。 プログラムの方で analogInput に A0 を指定して読み込んでいるので A0 に繋いでます。 接続に使っているのはジャンパワイヤという部品です。電子工作の基本部品の一つで、よく使われるので通常はまとめ買いされます。

ELEGOO 多色デュポンワイヤ 120pcs

(3)データ受信用のプログラムを書く ソフトウェアとハードウェアの準備ができましたら、あとは実際に計測をおこなうだけです。 ただし、現状のままでは MCU はセンサモジュールの出力を無限に垂れ流すだけなので、どこかに(SDカードなどに)出力を書き出すか、USB から出力を受け取らないとデータを利用することができません。 SDカードソケットモジュールなどを利用すると外部メディアも利用できますが、そのモジュールを私が持っていないので USB で接続したパソコンに出力することにします。 出力されたデータを受け取るプログラムは Python でも Ruby でも、お好きな言語で実装していただいて問題ありません。 今回は JavaScript (node.js) を使って手抜きします。 この場合は適当なプロジェクト(以下の例では currentMeasurer)を作成して、serialport をインポートする準備をお願いします。
$ mkdir currentMeasurer && cd currentMeasurer
$ npm init
$ npm i serialport
$ touch measurer.js
$ vim measurer.js # ファイル編集
編集するファイルの中身は以下のようになります。標準出力 (stdout) している部分は直接ファイルに書き出してしまう形式に書き換えてしまっても構いません。
const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
const port = new SerialPort('/dev/ttyACM0', {baudRate: 9600,});
const parser = port.pipe(new Readline());

parser.on('data', line => console.log(`${line}`));
また、上の3行目で /dev/ttyACM0 と決め打ちしているところがありますが、これはシリアルポートなので、お使いの環境ではこのまま実行できない可能性があります。 以下の方法で MCU が使用しているシリアルポートを特定して、該当部分を必要に応じて書き換えてください。 Linux
$ ls /dev/tty*
ターミナルから上のコマンドを打つと ttyUSB もしくは ttyACM で始まるシリアルポートが見つかります Mac
$ ls /dev/tty*
ターミナルから上のコマンドを打つと tty.usbmodem もしくは tty.usbserial で始まるシリアルポートが見つかります Windows デバイスマネージャーを立ち上げて ポート(COMとLPT という項目をクリックすると表示されます 準備ができましたら、USB ポートに MCU を接続した状態でプログラムを実行してください。
$ node measurer.js > log.txt 
計測 この状態のまま、センサモジュールと太陽光パネルを接続すると計測が始まります。 私が購入した太陽光パネルの出力は 2.1mm DC プラグになっていましたので、それに合うアリゲータクリップスを用意しました。 このアリゲータクリップスを介してセンサモジュールと太陽光パネルを接続します。

uxcell DCパワージャックアダプター 2.1mm x 5.5 mm

そしてセンサモジュールから得られた出力を MCU 内でボルトとアンペアに変換して USB ケーブルを通して PC に出力します。 出力された数値を PC で受け取ってテキストファイルに記録していきます。 うまく行けば log.txt というファイルの中にボルトとアンペアの数値が並んでいくはずです。 プログラム上は止めないと無限にループするようになっているので、計測を終えるときに停止させてください。 これで実際に出力された数値が出せればよかったのですが、いつまで経っても晴天にならないうちに某国に出張して、また自宅に帰れない生活が始まってしまったので、一度、ここで区切ります。
Share this story
X Email RSS

Comments

No comments yet. Leave the first one.

Leave a comment

Image verification to prevent automated comments

Comments are moderated before they appear.

Sponsored