Arduinoとリレー等シリアル通信で制御するためFirmataを使ってみる。
ちょっとポンプを制御したくて、ArduinoにAC100Vを制御するためのリレー制御基板をくっつけて動かすのを試してみている。
この間はリレーシールドというのを別件で試したのだけど、100VをArduinoの基板の近くに流すのはちょっと危ない感じなので、離して使う基板を買ってみた。
(Arduinoシールドでうっかり100Vを短絡させてしまうと、ArduinoやUSBケーブルでつなげたPCまで破壊してしまいそうだ。)
SODIAL(R) リレーモジュール(Amazon)
そしてリレーだけでなく、他にもArduinoに何かセンサーをくっつけて連動して動かしたい。
Arduinoのリレーやセンサーの制御のソフトを作っていて、毎回PCの開発環境のArduinoIDEでソフトを書いてソフトを転送して動かすのがちょっと面倒だと思った。どうせシリアル通信でセンサーの値のログを取るなら、PC側のソフトを制御のメインにして、Arduino側は固定したソフトにしてもいいのではないかと。
そういうArduinoをシリアル通信でGPIOとかAD変換といった基本機能を動かすのは既に前例がありそうだ思った。
調べてみたらFirmataというので出来るようだ。
とりあえず、StandardFirmataというのをArduino Unoに書き込んでみた。
しかし、リセット直後の初期状態でリレーがONになって動いてしまった。
ArduinoのFirmataのGPIOの各ポートの初期値ってLowじゃないのかな、なんでいきなりリレーがONになってしまったのだろう?と、調べてみたら、リレー基板の制御入力が負論理なようだ。(ピンはLowになっていた)
中華な安いリレー基板で説明書が無いので接続して動かして初めて気づいたということだった。
Arduino Firmataでピンの初期値がLowなのは普通といえなくもないけど、できればピンは初期状態で入力状態(電気的にはHi-Z状態)にしておきたい。
Firmataを使わずに普通にArduinoを動かすときにはAtmegaマイコンの電源投入時の挙動と同様で各ピンは入力状態になるので、それと同じがよい。
FirmataStandardのソースコードがあるので、それを弄れば変更できるのかなあ。
ということで、StandardFirmataのソースコードを眺めてみて それっぽい場所を1カ所弄ってみたが、うまくいかなかった。結構むずかしいのかもしれない。
—
追記
Firmataの改造がすぐには動かない感じだったので、手っ取り早く回路の方で対策することにした。
正論理のリレーシールドを使って、(リレーシールドの)リレーOFF時に5Vが出てリレーON時には0Vが出るように反転の回路を組んで外部のリレー制御基板を動かすように接続し直した。
リレーでリレーを動かすとか、ちょっと無駄で馬鹿馬鹿しいのだけど、手持ちのありあわせですぐに試すだけなので、わかっていてやるのであれば許容範囲だろう。