📦 ソースコード: この記事で紹介しているソースコードは GitHub で公開しています。
記事一覧
前回のおさらい
前回の第 1 弾では、Amazon で購入した電圧変換モジュールを使って 4-20mA 信号の測定に挑戦しました。動作はしたものの、精度と安定性に課題が残りました。
- 可変抵抗の調整が難しい(ドライバーでの微調整が困難)
- 精度がいまいち(可変抵抗の調整だけでは十分な精度が出ない)
「可変抵抗を使って電流を電圧に変換する方式では調整が難しい」——そう判断し、別のアプローチを模索することにしました。
INA219 の採用
調べていくうちに見つけたのが、Texas Instruments 社の電流センサ IC「INA219」です。
INA219 の特徴
- I2C デジタル通信:アナログ変換が不要。デジタルで値を取得できる
- 高精度:シャント抵抗での電圧降下を高精度に測定
- 電圧も同時測定:バス電圧も取得可能
- モジュール品が入手しやすい:Arduino や Raspberry Pi 向けのモジュールが市販されている
アナログ変換の精度問題を、デジタル通信で解決できると考え、INA219 を採用することにしました。
システム構成
今回は OLED ディスプレイも追加して、現場で直接確認できるようにします。
ハードウェア
| 機器 | 役割 | I2C アドレス |
|---|---|---|
| Raspberry Pi Pico | 制御用マイコン | - |
| INA219 | 電流センサ | 0x40 |
| OLED SSD1306 (128×64) | 表示器 | 0x3C |

Pico の隠れた実力:2 系統の I2C バス
INA219 と OLED はどちらも I2C デバイスです。I2C アドレスが異なるため(INA219: 0x40、OLED: 0x3C)、1 系統の I2C バスに接続することも可能です。ただし、その場合はアドレスの確認工程が必要になります。
Raspberry Pi Pico は 2 系統の I2C バスをサポートしています。
- Wire(I2C0):GP0/GP1
- Wire1(I2C1):GP2/GP3
実験段階だったため、2 系統あるなら活用しようと考え、INA219 と OLED を別々のバスに接続しました。
INA219:
SDA → GP0 (Wire)
SCL → GP1 (Wire)
OLED:
SDA → GP2 (Wire1)
SCL → GP3 (Wire1)
配線がスッキリするだけでなく、それぞれのデバイスに最適なクロック速度を設定することも可能です。
実装のポイント
ポイント ①:2 点補正で精度アップ
INA219 は高精度とはいえ、シャント抵抗の個体差などで若干の誤差が生じます。そこで「2 点補正」を実装しました。
校正用の電流発生器を使って、4mA と 20mA を入力したときの実測値を記録します。
| 入力電流 | 実測値(raw) |
|---|---|
| 4.00 mA | 3.80 mA |
| 20.00 mA | 19.40 mA |
この 2 点を基準に線形補正を行います。
// 2点補正の実装
static float calibrate_4_20(float raw_mA) {
const float RAW_AT_4_mA = 3.80f;
const float RAW_AT_20_mA = 19.40f;
const float span = RAW_AT_20_mA - RAW_AT_4_mA;
return 4.0f + (raw_mA - RAW_AT_4_mA) * (16.0f / span);
}
これで、4mA 入力時にぴったり 4.00mA、20mA 入力時にぴったり 20.00mA が表示されるようになります。
ポイント ②:サンプリング平均は引き続き有効
デジタル通信でも、センサ自体のノイズは避けられません。10 回のサンプリング平均を取ることで、安定した値を得られます。
float sum = 0.0f;
for (int i = 0; i < 10; i++) {
sum += ina219.getCurrent_mA();
delayMicroseconds(300);
}
float raw_mA = sum / 10.0f;
ポイント ③:表示更新の工夫
OLED の表示がチカチカすると見づらいので、 0.05mA 以上変化したときだけ 表示を更新します。
float stepCurrent = quantize(current_mA, 0.05f);
if (fabs(stepCurrent - lastPrintedStep) >= 0.05f) {
// 表示を更新
oledShow(stepCurrent, percent, raw_mA);
lastPrintedStep = stepCurrent;
}
OLED 表示のデザイン
128×64 ピクセルの小さな画面に、必要な情報をコンパクトに詰め込みます。
┌────────────────────────┐
│INA219 4-20mA │
│I=12.35 mA │
│Value=52.2 % │
│raw=12.10 mA │
│[████████████ ]│
└────────────────────────┘
- タイトル:何を測っているか一目で分かるように
- 補正後電流:メインの測定値
- パーセンテージ:0〜100%で直感的に把握
- raw 値:デバッグ用(補正前の生値)
- バーグラフ:視覚的に現在の負荷を確認
動作確認
電源を入れると、まず I2C デバイスの検出が行われます。
Start: INA219 on Wire(GP0/1), OLED on Wire1(GP2/3)
INA219 OK / OLED OK
I=12.35 mA Value=52.2% (raw=12.10 mA)
OLED には測定値がリアルタイムで表示されます。バーグラフが動くことで、視覚的に状態を確認できます。
前回からの改善点
✅ 精度が劇的に向上
アナログ変換モジュールでは ±0.3mA 程度ふらついていた値が、INA219 では ±0.05mA 以内に収まるようになりました。2 点補正により、4mA〜20mA の範囲で高い精度を実現。
✅ 温度特性が改善
デジタル通信なので、アナログ変換回路の温度ドリフトの影響を受けません。一日を通して安定した測定が可能に。
✅ 現場で確認可能
OLED ディスプレイにより、PC を接続しなくても測定値を確認できます。128×64 ピクセルの小さな画面ですが、必要な情報は十分に表示できます。
残る課題
現場での動作確認も順調。「これで完成でいいのでは?」と思いましたが、お客様から追加のご要望が。
「離れた場所からも確認できるようにしてほしい」
OLED は目の前にいないと見えません。遠隔監視を実現するには、別のアプローチが必要です。
次回予告
第 3 弾では、Raspberry Pi 5 に移行し、測定値をRTSP 映像としてネットワーク配信する仕組みを構築します。
- 重量(トン)への変換
- 1280×720 の見やすい映像生成
- VLC や NVR で視聴可能な RTSP 配信
遠隔監視の実現に向けて、いよいよ本格的なシステムに発展させていきます。
今回のポイント
- INA219は I2C デジタル通信で高精度な電流測定が可能
- Raspberry Pi Pico は2 系統の I2C バスをサポート
- 2 点補正で測定精度をさらに向上
- サンプリング平均と表示更新の閾値設定で安定した表示を実現
使用機材
| 機材 | 用途 | 購入リンク |
|---|---|---|
| Raspberry Pi Pico | 制御用マイコン | 秋月電子通商 |
| INA219 | I2C 電流センサ | Amazon |
| OLED SSD1306 (128×64) | 表示器 | Amazon |
| 4-20mA 信号発生器 | テスト・校正用 | Amazon |
| 直流安定化電源 | 電源供給 | Amazon |
| ジャンパーワイヤー | 配線用 | Amazon |
| ブレッドボード | 回路実験板 | Amazon |
| Arduino IDE | 開発環境 | - |
| Adafruit_INA219 ライブラリ | INA219 制御 | - |
| Adafruit_SSD1306 ライブラリ | OLED 制御 | - |
部品の選び方(初心者向け)
INA219
- Texas Instruments 社の電流センサ IC を搭載したモジュールです
- I2C 通信でデジタル値として電流を取得できるため、高精度な測定が可能です
- 2 個セットで購入すると、予備も確保できて安心です
- 動作電圧は 3-5.5V で、Raspberry Pi Pico の 3.3V で動作します
OLED ディスプレイ
- 0.96 インチ、128×64 ピクセルの小型ディスプレイです
- SSD1306 ドライバーを搭載しており、Arduino や Raspberry Pi で簡単に使えます
- I2C 接続なので、配線がシンプルです(SDA、SCL、VCC、GND の 4 本)
- 2 個セットで購入すると、予備も確保できます
- 注意:I2C アドレスが固定(0x3C または 0x3D)のため、複数同時使用する場合は別の I2C バスに接続する必要があります
ジャンパーワイヤー
- 電子部品同士を接続するためのケーブルです
- オス-メス、オス-オス、メス-メスの組み合わせがあるので、用途に応じて選びましょう
- 120 本セットがあれば、様々なプロジェクトで使えます
ブレッドボード
- はんだ付けなしで回路を組める実験用の基板です
- 830 タイーポイント(穴)のサイズが一般的で、Arduino や Raspberry Pi のプロジェクトに最適です
4-20mA 信号発生器
- 2 点補正の校正時に使用しました
- 4.00mA と 20.00mA を正確に出力できるため、実測値の記録に最適です
- 0〜10V の電圧出力も可能で、様々なテストに使用できます
直流安定化電源
- Raspberry Pi Pico や各種センサーに安定した電源を供給するために使用しました
- 0-32V、0-10A の範囲で電圧・電流を可変でき、様々な電子部品の動作確認に使用できます
- 過電流保護(OCP)機能により、部品を保護しながら安全にテストできます