post-cover

📦 ソースコード: この記事で紹介しているソースコードは GitHub で公開しています。

記事一覧

お客様からの相談

ある日、お客様から興味深いご相談をいただきました。

「クレーンで吊り上げている荷物の重さを、離れた場所からリアルタイムで確認したいんです」

詳しくお話を伺うと、クレーンには重量センサーが搭載されており、4-20mA の電流信号として重量データが出力されているとのこと。測定範囲は0〜60 トン。この信号を読み取って、分かりやすくディスプレイに表示してほしい——というご要望でした。

4-20mA は産業用機器で広く使われる標準的な電流ループ信号です。4mA が測定レンジの最小値(この場合は 0 トン)、20mA が最大値(60 トン)を表します。電圧ではなく電流を使うことで、長距離配線でもノイズに強いという利点があります。

「まずは試作してみよう」——そう思い立ち、手元にあった Raspberry Pi Pico で開発をスタートしました。

まずはシンプルに:アナログ入力方式

最初のアプローチ

最初に思いついたのは、もっともシンプルな方法でした。

  1. 電流を電圧に変換する
  2. その電圧を Raspberry Pi Pico のアナログ入力で読み取る
  3. 電流値に逆変換して表示する

Amazon で 4-20mA→0-3.3V 変換モジュールを購入。Raspberry Pi Pico には 12bit(0〜4095)の ADC が搭載されているので、0〜3.3V の電圧を読み取ることができます。

ハードウェア構成

実際のクレーン重量センサーではなく、4-20mA 信号発生器を使って実験しました。

raspberry-pi-pico-4-20ma-1-001

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)機能により、部品を保護しながら安全にテストできます

SNSでシェアしよう

この記事が役に立ったら、ぜひシェアしてください