はじめに
Arduinoを使って、連続パルス波を出力したりしたくなる時があると思います。
LEDを点滅させたり、音を出力したり、タイマーとして使ってみたり・・・
何かと使うことが多く、そして簡単なようにも思えますが、調べていくと非常に奥深いことがわかります。
今回は、Arduinoで連続パルス波を出力する方法をいくつか紹介していきます。
Delayを使って時間を変える
最もシンプルかつ、簡単な方法で、delay関数を使って出力のONとOFFを切り替える手法です。
//pinはピン番号
void loop(){
digitalWrite(pin, HIGH);
delay(1000);
digitalWrite(pin, LOW);
delay(1000);
}
上記のプログラムでは、出力がHIGHとLOWとで切り替えています。
delayは単位はmsなので、delay(1000)では1秒間待つというプログラムになります。
つまり、1Hzでついたり消えたりするプログラムになります。
ただ、周波数の指定にdelay()関数を使うことは問題点が多いです。
また、この方法では、60Hzの信号を5秒間出力といったように、出力の時間を変更するのが、for構文を使って指定する必要があり、そういった面で不便さがあります。
ただ、シンプルが故、とりあえずやってみたいという時にはおすすめです。
tone()を使って指定する
tone()関数はブザー音などを作成するときによく使われる関数です。
Arduino公式の解説
この関数では、周波数、継続時間を指定することができます。
なので、delayを使った時とは違い、周波数を計算せずとも直接指定することができます。
//pinはピン番号
void loop() {
tone(pin,60);
}
tone(pin, frequency)や、tone(pin, frequency, duration) といったように指定することができます。
durationはms単位で指定するため、delayと同様の記載方です。
この関数の問題は、指定できる周波数が31Hz以下ではできないという点です。
つまり、1Hzなどの出力を作ることができません。
音などの31Hzより大きい周波数を指定する時には非常に簡単に周波数を指定できますし、delay関数を使う時よりも非常に短く、正く指定することができます。
PWM出力を使って、PWM出力の周波数を変える
PWM出力を使う方法は最も自由度が高く、そして奥深すぎる原因です。
PWMとはpulse width modulationの略であり、日本語ではパルス幅変調です。
詳しくはwikipediaより
この言葉だけ聞いてもなんのことかよくわかりませんが、簡単にいうと、PWMとはデューティー(Duty)比を変更して色々変調する方法です。
Arduino公式の説明はこちらから
LEDの明るさを指定するときに、本来であれば電流値を変えることで明るくしたり、暗くしたりできます。
しかし、電流値が一定だった時に、でもLEDの明るさを変えたいとなった際に、めっちゃ早い周波数で(人が点滅しているのがわからなくなるのが30~60Hzと呼ばれている)点滅させます。
そして、ONとOFFが通常であれば1:1(Duty比が50%)となっていますが、これを4:1(Duty比が80%)とか1:4(Duty比が20%)とかにしてみるとどうでしょうか。
前者では明るく見え、後者では暗く見えるでしょう。
このようにして、パルスの幅を変えることで出力を変調するというのがPWMによる出力です。
そして、Arduinoではこの出力ができるとともに、PWM出力の周波数を変えることもできます。
レジスタ設定と呼ばれる、まあArduinoの元の部分を変えちゃえばPWMの出力周波数を変えることができるっしょっていう考えがこの方法です。
ちなみにデフォルトでは出力周波数は490Hz、一部のピンでは980Hzです。
今後の記事でやり方を詳しく説明します。
「PWM Arduino 周波数 変更」で調べるとたくさん説明が出てきます。
4回ぐらい読むとなんとなくわかるようになると思います。
基本的にはこれらの方法で自分の目的にあったプログラムを探してみてはどうでしょうか。
コメント