📦 ソースコード: この記事で紹介しているソースコードは GitHub で公開しています。
記事一覧
お客様からの相談
ある日、お客様から興味深いご相談をいただきました。
「クレーンで吊り上げている荷物の重さを、離れた場所からリアルタイムで確認したいんです」
詳しくお話を伺うと、クレーンには重量センサーが搭載されており、4-20mA の電流信号として重量データが出力されているとのこと。測定範囲は0〜60 トン。この信号を読み取って、分かりやすくディスプレイに表示してほしい——というご要望でした。
4-20mA は産業用機器で広く使われる標準的な電流ループ信号です。4mA が測定レンジの最小値(この場合は 0 トン)、20mA が最大値(60 トン)を表します。電圧ではなく電流を使うことで、長距離配線でもノイズに強いという利点があります。
「まずは試作してみよう」——そう思い立ち、手元にあった Raspberry Pi Pico で開発をスタートしました。
まずはシンプルに:アナログ入力方式
最初のアプローチ
最初に思いついたのは、もっともシンプルな方法でした。
- 電流を電圧に変換する
- その電圧を Raspberry Pi Pico のアナログ入力で読み取る
- 電流値に逆変換して表示する
Amazon で 4-20mA→0-3.3V 変換モジュールを購入。Raspberry Pi Pico には 12bit(0〜4095)の ADC が搭載されているので、0〜3.3V の電圧を読み取ることができます。
ハードウェア構成
実際のクレーン重量センサーではなく、4-20mA 信号発生器を使って実験しました。

4-20mA 信号発生器(実験用)
↓
4-20mA信号
↓
電圧変換モジュール(4-20mA → 0-3.3V)
↓
Raspberry Pi Pico(GP26/ADC0)
↓
シリアルモニタ
コードのポイント
Arduino IDE でサクッと実装。ポイントは以下の 3 つです。
① 電圧 → 電流の変換
// 0V → 4mA, 3.3V → 20mA の線形変換
float ratio = (voltage - V_MIN) / (V_MAX - V_MIN);
float current_mA = I_MIN_mA + ratio * (I_MAX_mA - I_MIN_mA);
② ノイズ対策としてのサンプリング平均
アナログ信号はノイズの影響を受けやすいので、10 回測定して平均を取ります。
float sumVoltage = 0.0f;
for (int i = 0; i < 10; i++) {
int adcValue = analogRead(ADC_PIN);
float voltage = (float)adcValue / 4095.0f * 3.3f;
sumVoltage += voltage;
delayMicroseconds(100);
}
float avgVoltage = sumVoltage / 10.0f;
③ 表示の安定化
値がふらつくたびに表示が更新されると見づらいので、0.1mA 以上変化したときだけ表示を更新します。
動かしてみた
電源を入れると、シリアルモニタに測定値が流れ始めました。
=== 4-20mA Current Monitor (Stage 1) ===
Analog Input: GP26 (ADC0)
Voltage Range: 0-3.3V
Current Range: 4-20mA
----------------------------------------
V=1.650 V I=12.00 mA Value=50.0% (ADC=2048)
V=2.475 V I=16.00 mA Value=75.0% (ADC=3072)
「おお、動いた!」——最初は順調に見えました。
しかし、問題発生
テストを続けていくうちに、いくつかの問題が見えてきました。
問題 ①:可変抵抗の調整が難しい
使用した変換モジュールは、可変抵抗をドライバーで調整するタイプでした。微調整が難しく、正確な校正を行うのが困難です。ドライバーで少し回すだけで値が大きく変わるため、狙った値に合わせるのに苦労しました。
問題 ②:精度がいまいち
校正用の電流発生器で 4.00mA と 20.00mA を入力してみると、表示値がずれています。可変抵抗の調整だけでは、十分な精度を出すことができませんでした。
教訓:可変抵抗方式の限界
実験を通じて分かったのは、可変抵抗を使って電流を電圧に変換する方式では、調整が難しいということです。
アナログ信号をそのまま扱う方式には、根本的な課題があります。
- 可変抵抗の調整が煩雑で、ドライバーでの微調整が難しい
- アナログ変換回路の精度に依存する
- ノイズの影響を完全には排除できない
実験なので産業用途レベルの精度は期待していませんでしたが、それでも安定した測定値を得るのは容易ではありませんでした。
「電流測定専用の IC を使う方法じゃないと現実的ではない」——そう結論に至りました。
次回予告
第 2 弾では、I2C 対応の高精度電流センサ「INA219」を使った方式に挑戦します。デジタル通信に切り替えることで、今回の課題を根本から解決できるはず。さらに、OLED ディスプレイを追加して、現場で見やすい表示も実現します。
お楽しみに!
今回のポイント
- 4-20mA は産業用機器で広く使われる電流ループ信号
- Raspberry Pi Pico の ADC で電圧変換後の信号を読み取れる
- サンプリング平均でノイズを低減できるが、限界がある
- 安価なアナログ変換モジュールは精度に課題あり
使用機材
| 機材 | 用途 | 購入リンク |
|---|---|---|
| Raspberry Pi Pico | 制御用マイコン | 秋月電子通商 |
| 4-20mA→0-3.3V 変換モジュール | 電流 → 電圧変換 | Amazon |
| 4-20mA 信号発生器 | テスト・校正用 | Amazon |
| 直流安定化電源 | 電源供給 | Amazon |
| ジャンパーワイヤー | 配線用 | Amazon |
| ブレッドボード | 回路実験板 | Amazon |
| Arduino IDE | 開発環境 | - |
部品の選び方(初心者向け)
電流-電圧コンバータモジュール
- 4-20mA の電流信号を 0-5V や 0-10V の電圧に変換するモジュールです
- 今回は Raspberry Pi Pico の ADC 入力(0-3.3V)に合わせて、0-3.3V 出力のものを使用しました
- 注意:安価なモジュールは精度に課題があるため、産業用途では高精度なものを選ぶことをおすすめします
ジャンパーワイヤー
- 電子部品同士を接続するためのケーブルです
- オス-メス、オス-オス、メス-メスの組み合わせがあるので、用途に応じて選びましょう
- 120 本セットがあれば、様々なプロジェクトで使えます
ブレッドボード
- はんだ付けなしで回路を組める実験用の基板です
- 830 タイーポイント(穴)のサイズが一般的で、Arduino や Raspberry Pi のプロジェクトに最適です
4-20mA 信号発生器
- 開発・テスト時に 4-20mA の電流信号を生成するためのツールです
- 0〜10V の電圧出力や 4〜20mA の電流出力が可能で、校正にも使用できます
- 実際のクレーン重量センサーがなくても、システムの動作確認が可能です
直流安定化電源
- 電子工作や開発時に安定した電源を供給するための電源装置です
- 0-32V、0-10A の範囲で電圧・電流を可変でき、様々な電子部品の動作確認に使用できます
- 過電流保護(OCP)機能により、部品を保護しながら安全にテストできます