PWM: 使う

obnizにはPWMという機能があります。
決められたリズム(周波数)で電気的な波を作ることができます。つまりあるリズムでioをON/OFFすることができます。

さらに、PWMにはもう1つ重要な機能があり、ON-OFF-ONと繰り返される時の、ONとOFFの割合を変えられます。
例えば、ONをOFFよりずっと短くするとこのようになります。

このようにすると、例えば、LEDを繋いだ時のLEDの明るさをこの割合を変えることで変えてみたり、
またはモーターを動かす時のモーターのパワーをこの割合を変えることで変えてみたり、といったことに利用できます。

この割合はduty比(デューティー比)と呼ばれています。50%で、半々です。10%ならonが10%で、他の90%の時間はoffということになります。

使ってみる

では、obnizのPWMを使ってみましょう。
obnizのioのどこででも使えるのですが、obnizにはpwmは6つまでしかありません。
ioとpwmは別のもので、6個あるうちのpwmの出力を、12あるioのうちどれかから出して利用する。という感じになります。

試しにpwmを1つ用意して、io0からそのpwmで作られる波を出すようにするならばこのようになります。

var pwm = obniz.getFreePwm();
pwm.start({io:0});

obniz.getFreePwm()とは6つあるpwmのうち、使われていないpwmを下さい。という意味です。
もし確実に使っていないpwmがわかっている場合は、このようにすることもできます。

obniz.pwm0.start({io:0});

これは、obnizのpwm0~pwm5のうちpwm0を使っていなくて、これを使いたいという場合の書き方です。基本的にはこのようにせずにgetFreePwm()を使って下さい。

さて、start()でio0を指定していますが、これによりio0からさっそく出力が出ています。
といっても周波数もduty比も決めていないので、ずっとfalseが出ている状態になっています。
これに対して周波数とduty比を変えてみましょう。

モーターをつなぐ

ここからは実際にモーターを繋いで確認してみましょう。
io0と11につなぎます。

duty比 50%で 1000hz(つまり1秒に100回 ON-OFFする)にしてみます。
モーターの片方は常に0Vにしておき、もう片方をPWMで動かします。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function(){
  obniz.io11.output(false)
  var pwm = obniz.getFreePwm();
  pwm.start({io:0});
  pwm.freq(1000);
  pwm.duty(50)
}

どうでしょうか。モーターは動くと思います。
今度はduty比を10%にしてみます。

とても弱く回転するか、ほとんど回らないと思います。
周波数は同じでもONになっている割合が10%しか無いので、とても弱くなっています。

周波数を変えてみる。

次に周波数を変えてみましょう。仮に10倍の10khzにしてみます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function(){
  obniz.io11.output(false)
  var pwm = obniz.getFreePwm();
  pwm.start({io:0});
  pwm.freq(10000);
  pwm.duty(50)
}

恐らく何も変わらないと思います。
モーターのパワーはほぼduty比できまり、どのぐらい早くon-offするかとはほとんど関係がないからです。
しかし、あまり早すぎるとコイルのインピーダンスにより出力が下がり、逆におそすぎるとガタガタしてしまいます。一度変えてみて下さい。

もし、ピエゾスピーカーを持っていればこのようにつなぐことで好きな周波数の音を出すことができます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function(){
  obniz.io11.output(false)
  var pwm = obniz.getFreePwm();
  pwm.start({io:0});
  pwm.duty(50)

  pwm.freq(261);
  await obniz.wait(1000)

  pwm.freq(293);
  await obniz.wait(1000)

  pwm.freq(329);
  await obniz.wait(1000)

  pwm.end();
}

ドレミの階調が聞こえたかと思います。
このようにduty比を変えた後にfreqで周波数を変えてもduty比は変わりません。

また、最後にちゃっかり使った

pwm.end();

でpwmを終了することができます。こうすることでioからの出力も終わり、ioはfloatingの状態となります。

パルス幅指定

duty比ではなくONになる時間の長さを指定したいこともあります。サーボモーターの信号などです。
その場合はpulse()関数を使います。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function(){
  obniz.io11.output(false)
  var pwm = obniz.getFreePwm();
  pwm.start({io:0});
  pwm.freq(1000);
  pwm.pulse(0.5);
}

このようにするとduty比50%と同じ意味になります。
1khzのduty比50%といえば、0.5msecなので、このようになります。

ioのドライブ方法の変更

pwmを含めioを使用するすべてのペリフェラルでioでできるような出力方法やプルアップダウンの切り替えができます。

標準ではioの標準と同じくプルアップ・ダウンなしの、5Vプッシュプルです。
例えば、オープンドレインで5vのプルアップ付きで動かす場合はこのようにあります。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function(){
  obniz.io11.output(false)
  var pwm = obniz.getFreePwm();
  pwm.start({io:0, drive:"open-drain", pull:"5v"});
  pwm.freq(10000);
  pwm.duty(50)
}

このようにstart()のときにioの条件を渡します。
driveで指定できるものはio.drive()で指定できるものと同じで、pullで指定できるものはio.pull()で指定できるものと同じなので、それぞれioのドキュメントをご覧ください。



Next : PWM: modulation

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