最近、父のガレージで古いBK Precision 1787電源を見つけ、わずかながらも私が持つ収集癖のため、家に持ち帰って遊ぶ機会を逃すわけにはいきませんでした。放置されたおもちゃのように、この電源は1年以上も私のキャビネットの中でほこりを集めていましたが、遊ぶのを待っていました。最近になって引っ張り出したところ、背面パネルにRS-232ポートがあることがわかりました:
図1:
「RS-232ケーブルを使って実際にこれを制御できるのかな?」と自問自答しました。BK Precisionのウェブサイトで初期の調査を行ったところ、20年以上前のオリジナルのドキュメントには、PCインターフェースを使用するためには特別なキットが必要であると記載されていました:
図2:
その通知を見たときはかなり失望し、ユニット全体を捨てようかと思いましたが、少し実験をしてみることにしました。この記事では、電源を分解して、電圧や電流を電話やインターネットに接続されたデバイスを通じて設定または読み取ることができるIoT制御デバイスに変換した方法について見ていきます。UARTコマンドの確認、シリアル通信の検証のためのバスのスニッフィング、およびこの機器のIoT機能を提供するためにRaspberry Pi Pico W上にREST APIサーバーを構築する方法についても見ていきます。
電源を電子廃棄物として処分する代わりに、少しいじってみることにしました。今日のほとんどの電源はシリアル(例えばUART)、USB(通常はCOMまたはUSBTMCデバイスとして)、および/またはイーサネット(一般的にVISAを介して制御されます)で制御できます。しかし、Wi-Fi機能をサポートする機器を多く見たことがありません。これは設定が少し面倒で、ほとんどの設計者やテストエンジニアは有線接続をそれほど気にしないからだと思います。私の電源にはRS-232ポートが付いていましたが、それ以外には何もありませんでした。インターネットに接続されたデバイスを使用してどこからでも制御できるように、REST APIフロントエンドを備えたWi-Fi機能を提供するのは面白いと思いました。
私が直面した主な問題は、電源と通信する能力がなかったことです。上で見たように、マニュアルにはPCインターフェースを利用するためには専用のキットとソフトウェアが必要であると記載されていました。電源を「ハック」しようとした最初の試みは完全な失敗に終わりました。背面パネルのポートにRS-232 UARTケーブルを接続し、ランダムな文字を入力し始めました。蓋を外してRS-232ポートを介して信号を追跡し、MAX202Cトランシーバチップの両側でTXとRXの信号をスコープで確認しました。しかし、得られたのはゴミのようなものばかりでした:
図3:
BK Precisionの方々は非常に親切で、供給を制御するために必要なコマンドセットを提供してくれました。彼らは使用していたソフトウェアのスクリーンショットやすべてのUART設定も提供してくれたので、私がすべて正しく設定していることを確認できました。彼らの助けを借りて、私のコマンドをテストし、オシロスコープで正しく処理されるのを見ることができました:
図4:
これは余分なステップのように思えますが、これにより、UARTラインに直接Raspberry Pi Pico Wを接続する際に比較基準を確立するのに役立ちました。この時点で、適切な通信を確立することができ、電源をIoT対応デバイスに改造する準備が整いました。
USB RS-232 UARTケーブルを使用した動作するセットアップを持っていたので、Raspberry Pi Pico Wを使用して同じセットアップを再現したいと思いました。Raspberry Pi PicoのプロジェクトのほとんどはMicroPython(マイクロコントローラー向けにターゲットを絞ったPythonの小さく、よりコンパクトなバージョン)で書かれているので、machine.uartライブラリを利用することにしました。これには、UART/RS-232ラインをUART専用のハードウェアピンに接続する必要がありました。この場合、GPIO 16と17を使用しました。MicroPythonコード内でUART経由でシリアルコマンドを送信した後、送受信されるデータがすべてゴミであることがわかりました。コードは、戻ってくるバイトコードがASCII文字でさえないと報告し続けました。明らかに何かがおかしい。この特定の理由から、動作するセットアップのスコープキャプチャを取得することが重要でした。すぐに、信号がRaspberry Pi Picoデバイスに到達するまでに反転していたことがわかりました。UARTライブラリオブジェクトをインスタンス化するときにTXとRXを反転させる設定をした後、戻ってきたシリアルデータはきれいでした。
Raspberry Pi Picoデバイスは3.3Vの電圧レベルにあり、BK Precision 1787(特に使用しているMAX202Cチップ)は5Vにあります。長時間にわたって5Vの信号をRaspberry Pi PicoデバイスのGPIOピンに送ると、チップの入力バッファが損傷する可能性があります。長期使用のためには、デバイス間で3.3Vから5Vへの電圧レベルを適切に変換するためにレベルシフターを使用することを強くお勧めします。
この時点で、シリアル通信を介して電源を完全に制御するドライバーライブラリを作成し、通信を確立していました。次のステップは、基本的なWebサーバーを構成し、Web経由でデバイスを制御できるかどうかを検証することでした。microdotのおかげで、REST APIを簡略化し、Raspberry Pi Pico Hデバイスが私のためにWebサーバーをホストできることを検証するための非常に高速な「Hello World」プロトタイプを作成できました。シンプルな「Hello World」リターンステートメントの他に、POST関数を使用してLEDを切り替えることも確認しました。この時点で、すべてを統合する準備ができました。
最終コードをより読みやすく、スケーラブルにするために、コード内でクラスを使用しました。オブジェクト指向コードはソフトウェアの世界にとって新しいものではありませんが、組み込みシステムではしばしば見過ごされがちです。特に、異なるハードウェアを制御するWebサービスを書く場合、詳細なハードウェアコードをメインアプリケーションの外に配置するようにコードをうまく抽象化することが重要です。私の場合、main.pyでは電源を参照するコードが非常に少なく、特定の関数(例えば、電流/電圧の設定や読み取り)を呼び出す以外に、実際のUARTコマンドをmain.py内で扱うことはありませんでした。これにより、Webアプリケーションレベルで何が起こっているかのクリアなビューが提供され、デバイス通信レベルで何が起こっているかの詳細が抽象化されます。
main.pyでは、電源を制御するために2種類のエンドポイントを作成しました。一つは、サーバーへのバックエンド上のフィールドを更新するためにREST API内で通常使用されるPOSTメソッドです(例:データベースの行を挿入)。編集していたのは単一の値だけだったので、PUTメソッドを簡単に使用することもできましたが、特に良い理由もなくPOSTを選択しました。実際には、この特定のシナリオでどのタイプのメソッドを実装したいかは、あなた次第です。
また、「controller」というルートを作成しました。これは非常にシンプルな送信フォームを出力し、ユーザーが電圧/電流を設定して「送信」を押すと、POSTアクションがトリガーされ、Webサービスが電源の電圧/電流設定を更新するようになっています。これがIoT、スマートフォン対応の側面が出てきます。POSTメソッドを実行することは、スマートフォンや一般的なブラウザからは非常にシンプルではありません。GETメソッドを発行することもできますが、それによって長いURL文字列も得られます。プロジェクトの「スマートフォン性」を実現する非常にシンプルな方法は、どのデバイスからでもアクセスできる基本的なWebフォームをドロップすることです。Webアプリケーション内に基本的なWebフォームをサポートし(そして、ルーターのファイアウォールを通じて入ってくるトラフィックを適切にルーティングすると)、あなたのコードが「IoT対応」であることを、ほぼ、示しています。
図5:
このプロジェクトに追加した他の健康監視/デバッグ機能には、以下のものがあります:
図6:
これらの小さな追加機能があると、問題が発生したときに診断できるようになり、趣味のプロジェクトが少し成熟したものに変わります。
この時点で、すべての部品をうまく組み合わせることができ、最先端技術を搭載した古いスクールの電源を手に入れました。「この超レトロな電源はどんな目的で使うのだろう?」と自問自答しました。まあ、その部分はまだ解決しようとしています。
完全なコードリポジトリを見るには、https://gitlab.com/embedded-designs/rest-api-controlled-power-supply-using-micropythonを訪問してください。