IO: 5v/3v/open-drainを切り替える

obnizではいろいろな電子部品と接続できるように出力方法を3つから選べるようになっています。

タイプ 電圧 最大電流 最大周波数 詳細
push-pull 5v <=1A <=250khz(推奨) 標準。過電流/ドライバ高温保護付き
push-pull 3v <=1mA(推奨) <=80Mhz io.output()使用時の過電流自動停止と警告
open-drain <=5v <=1mA(推奨) <=80Mhz  

それぞれについて紹介します。

push-pull5v

何も設定していない場合はこのモードが使われています。
これはモータードライバを使った5vで最大1Aまで流せる出力方法です。これ以外の方法では1mA程度までしか流せません。
5vが必要な相手と通信するのにも使えますし、モーターなども繋げられます。
過電流検知がいつも動作しているので、ショートなどにも強いです。

push-pull3v

つなげる相手が3.3v系だった場合に利用します。一部のセンサーなどです。
また、push-pull5vのときよりも高速に通信することができますので、高速通信したい場合はこちらのほうが有利です。
過電流検知はio.output()を使って決まった電圧を出力するときにだけ機能します。pwmやuartなどでは過電流検知は発生しません。
このモードでの過電流は危険なため、過電流検知が起きた場合自動的にio.end()が呼ばれてoutputが停止してしまいます。

open-drain

つなげる相手が5vでも3.3vでもない場合に利用します。一部のセンサーなどです。また、1本のみで双方向通信するときなどに使われます。I2Cなどがそうです。

ところでオープンドレインって?

プッシュプル(push-pull)とオープンドレイン(open-drain)というのが出てきました。
プッシュプルの方がイメージしやすいと思います。trueなら5vや3v。falseなら0vになる出力方法です。
オープンドレインはfalseは0vの出力なのですが、trueは"フロート"になる出力方法です。

タイプ 出力 ioの電圧
プッシュプル true 5vか3v
プッシュプル false 0v
オープンドレイン true フロート
オープンドレイン false 0v

オープンドレインの利点は2つです。
1つは好きな電圧で通信できるということです。
例えば使いたいセンサーが1.9vまでで、それ以上だと壊れるとします。3.3vで通信しても壊れるわけです。
そういうときに使えます。

出力をオープンドレインにして、1.9vに対して抵抗でプルアップするのです。
すると、trueのときは"フロート"しますが、1.9vにプルアップしているので1.9vになります。
falseのときは0vに強制的になりますから、プルアップしていても関係なく0vとなります。
これで true=1.9v, false=0v ということで1.9vの相手とも安心して通信できます。
こんな感じで、好きな電圧で通信できます。
ただし、抵抗を使っているのであまり高速な通信はできません。

もう1つの利点は双方向通信できる点です。
プッシュプルで出力するものをお互いに電線で繋いだ場合、両方ともtrueならいいですが、片方がtrueで片方がfalseだと一気に電気が流れて大変なことになってしまいます。

オープンドレインだとどうでしょうか。さっきの例で1.9vでプルアップしている電線に2つのオープンドレインがつながっているとしましょう。
お互いにtrueやお互いにfalseのときはOKです。では、片方がtrueで片方がfalseのときは?
するとtureの場合は"フロート"なので、つながっていないのとほぼ同じ状態になります。もう片方はfalseですから0vになります。つまり電線全体が0vになります。抵抗でプルアプしているので抵抗を通して電気が流れますが、抵抗が十分大きければ、全く問題ありません。

そして、お互いにその電線の電圧を見ていれば、「あれ〜、自分はtrueにしているのに電圧が低いぞ。相手がfalseにしているんだ!」と、気づくことができます。
この仕組を使ってオープンドレインでは双方向通信ができます。

切り替える

では、obnizの出力をを切り替えてみましょう。
その前に、adのレッスンでやった出力してそれを自分自身で計測するプログラムをもう一度見てみます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  obniz.io0.output(true);
  var voltage = await obniz.ad0.getWait();
  console.log(voltage);
}

これでしたね。これをつかってみます。
では、プッシュプルの3vに切り替えてみましょう。切り替えるにはioX.drive()を使います。

obniz.io0.drive("3v");

このようにすることでプッシュプルの3vに切り替わります。
trueにしたときに3.3vの電圧が出力されるので、adの結果も3.3vぐらいになると思います。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  obniz.io0.drive("3v");
  obniz.io0.output(true);
  var voltage = await obniz.ad0.getWait();
  console.log(voltage);
}

どうでしょうか。

一度切り替えれば、何度output()でtrueにしてもfalseにしてもその出力方法が使われます。
途中で切り替える場合は一度end()で終了してから切り替えて下さい。
「1秒だけ3v出力したら、5vにもどす」場合はこのようにします。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  obniz.io0.drive("3v");
  obniz.io0.output(true);
  obniz.wait(1000);
  obniz.io0.end();
  obniz.io0.drive("5v");
  obniz.io0.output(true);
}

次にオープンドレインにしてみましょう。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  obniz.io0.drive("open-drain");
  obniz.io0.output(true);
  var voltage = await obniz.ad0.getWait();
  console.log(voltage);
}

どうでしょうか。これが何vになるかはそのときどきです。なにしろtrueでio0をフロートさせていますから。
falseの場合は間違いなく0vにすることができます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
  obniz.io0.drive("open-drain");
  obniz.io0.output(false);
  var voltage = await obniz.ad0.getWait();
  console.log(voltage);
}


Next : IO: Overcurrent detection

You will Get in Few Days

Circuit for Starter “obniz Board” is available on Amazon and other online stores.
You can get it at below

Our products and resellers

Forum

Visit our developer’s forum to discuss and discover technologies.

Forum

Contact

Feel free to contact out support and technical team.

Contact us