はじめに
obnizを使ってとある工作↓をしているときに少し詰まったことがあったので、備忘録としてまとめました。
詰まったこと
上記の様な感じでobnizのGPIOとセンサを繋いでいたのですが、センサに電源がうまく供給されず、センサを扱うことができませんでした。
当初書いていたobnizでのコードは下記の様な感じです。
const gnd = obn.getIO(0);
const vcc = obn.getIO(1);
const signal = obn.getIO(2);
gnd.output(false);
vcc.output(true);
signal.input(async (value) => {
// signal検知
});
とりあえず電源(vcc)のoutputをtrue
にしてgndをfalse
にすればセンサへの電源が取れるのではないだろうか?と、安直に考えてました。
しかし、実行すると以下のようなエラー表示が出てきました。
heavy output. output voltage is too low when driving high
どうやら電源vccのところの電源が足りていないとのこと
内部プルアップを有効化した
結論から書くと、以下のようにコードを修正するとうまくいきました。
const gnd = obn.getIO(sensor.gnd);
const vcc = obn.getIO(sensor.vcc);
const signal = obn.getIO(sensor.signal);
gnd.pull("5v"); // <--
gnd.drive("open-drain"); // <--
gnd.output(false);
vcc.output(true);
signal.input(async (value) => {
// signal検知
});
追加したのは以下の2行です。
gnd.pull("5v");
gnd.drive("open-drain");
gnd.pull("5v")
で、プルアップが有効化されます。gnd.drive("open-drain")
はオープンドレインで駆動させるという意味ですが、試行錯誤で記述したものなので必要なものかよくわかってません。
さいごに
結論として、obnizのGPIOでGNDをとるときは内部プルアップを有効化しないとうまく電源が動作しないということがわかりました。
しかし、この解決方法はドキュメントを参考にしたわけでもなく、試行錯誤しながら結果として動作できるようになっただけのものなので、正しいかどうかわかりません。指摘あれば編集リクエストお願いします(特にobnizの方)。