昨日考えていたことの裏取り実験。
(1)疑問その1
arduinoのMsTimer2ライブラリを使って1ms毎の
割り込みを利用しつつ、同時にPWM時の出力ピン
(OC2A、OC2B)から内蔵タイマーで生成した波形を
出力できるのかどうかってお話。
リクツから言えばできないことは無いと思うんだけど、
ライブラリソースの記述内容如何によっては支障が
出る可能性があるかも…と。
(2)疑問その2
ISP端子に圧電ブザーや圧電サウンダを取り付けたときに
ISP機能を阻害しないか。
で、実験の前にまず調査。
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1240867372
こんなのが。あまり細かくは読んで無いんだけど、
delay関数との相性でトラブッているんだかいないんだか。
事実は良くわかんないけど、とりあえず既存機能と
相性悪そうなのはやっぱり「時間管理」関係の機能みたい。
で、昨日描いてた回路図を元に、OC2A端子からタイマー2
の波形を取り出してみることに挑戦。OC2A端子に圧電ブザー
を取り付けて、こんなスケッチを動かしてみる。
(例によって不等号記号は全角に変えてあります)
#include <MsTimer2.h>
// Switch on LED on pin 3 each second
// and buzz intermittently
void flash() {
static boolean output = HIGH;
digitalWrite(3, output);
output = !output;
}
void buzz_on() {
TCCR2A &= ~(1<<COM2A1);
TCCR2A |= (1<<COM2A0); //set ports togling when compare match
}
void buzz_off() {
TCCR2A &= ~(1<<COM2A0);
TCCR2A |= (1<<COM2A1); //set ports no togling when compare match
}
void setup() {
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
MsTimer2::set(500, flash); // 500ms period
buzz_on();
MsTimer2::start();
}
void loop() {
buzz_on();
delay(100);
buzz_off();
delay(300);
}
3番ピンに繋いだLEDを、MsTimer2ライブラリの割り込み
を使って0.5秒毎にトグル(点滅)させておき、LEDとは
シンクロさせずに0.4秒おきにブザーを鳴らすというスケッチ。
とりあえずうまくいきました。arduinoの基本機能や
ライブラリ間で齟齬はなさそう。
ちなみにブザーから音は出ますが、ピンから出力できる
のはデューティー比1:1の矩形波のみ。これはPWM出力を
使っていないため。一定周期おきにピン出力をトグル
させるというのがmegaシリーズの仕様。MsTimer2を使う
際の制約とった感じ。
さて、疑問(1)は無事クリア。次、(2)。
OC2A端子はISPのうちMOSI端子と重畳されているので、
OC2A端子に圧電ブザーを取り付けたままでISPができる
のかどうか…ってこと。
実際にAVR ISP mkII経由で接続してみた。
…通信でエラー出た。
ブザーを外してから接続するとエラー無し。
圧電ブザー自体はホントはほとんど電流を流さない
代物のはず(等価回路はコンデンサーっぽいモノ)。
なのにISPの通信がうまくできないのはなぜか?
直流抵抗は大きくても、コンデンサ成分の
アドミタンスが信号を通してしまっているってこと
なのかな…と。
ISPの信号を邪魔しない方法を考えてみる…。
OC2Aから10kΩの抵抗を介してブザーに繋いでみる。
(元々直流抵抗成分がデカく、電流がほとんど
流れていないので、これでも鳴るはず)
ISP周りを他の機能と重畳させるときには、山根さん本
によるとたしか10kの抵抗を使えとあったので。
…音出た。山根さんの言うとおり。若干だけど音が
小さめ?それほど減衰はしてないので、充分ブザー
として役に立つレベル。
一方ISP通信のほうはというと、こっちも大丈夫。
良かった、良かった。
さて、最後の課題。圧電ブザー(他励式)の代わりに
圧電サウンダ(自励式)を接続してみる…。
10kΩ抵抗経由で繋ぐと音が出ない…だめだ。
結論。
圧電素子は、10kΩでOC2A端子に接続するとISPの機能
を阻害せずに、しかもタイマー機能で自動的に発振
させて音(矩形波)を出すことができる。しかし自励式
の圧電ブザーは駄目。
とりあえずそんなあたりが判ったので、これを元に
回路図の見直しだな。とりあえず前進。
圧電ブザー(他励式)でも圧電サウンダ(自励式)でも
動くようにしたかったんだけど、まぁそこはISPと
プログラムのし易さどちらを取るか…っていう選択だな。



|