Lesson 6 Active Buzzer
アクティブブザーは、ブザー内に発振回路(オシレータ)が入ってて電圧をかけるだけでなるブザー。
スピーカーを繋いだ12番のピンモードを出力にして
int buzzer = 12;//the pin of the active buzzer pinMode(buzzer,OUTPUT);//initialize the buzzer pin as an output
digitalWriteでブザーをつないだポートをHIGHにすると鳴ります。
digitalWrite(buzzer,HIGH);
音階調整はできないのですが、鳴らしたり止めたりを繰り返すことで音質をちょっと変えることはできます。
コードが多いですけど、切り離してないだけで、繋いでるのは2本だけです…。
Lesson 7 Passive Buzzer
パッシブブザー(圧電スピーカー)は、本体には発振回路は入ってなくて、プログラム側でON/OFFを繰り返すことでなるブザー。プログラムで音の高さを変えることができます。
本体に「+」の刻印ありますが、繋ぐ向き違ってても動作は問題ないみたい。
Ardinoのtone関数を使って、ピン/周波数/長さ指定で音が鳴らせます。
内部動作的な制限で「tone() を使用すると,3番と11番ピンのPWM出力が出来なくなる」とのこと。「Mega以外」とあるので、僕の使ってるやつは対象外っぽい。このへん、ソースからだけじゃわからない情報ですね。
このあたりは、こちらに詳細がありました。アクティブブザーで行ってたピンモードOUTPUTの設定は、tone() の内部で行ってますね。
Arduinoで遊ぶページ:tone()の内部構造
https://garretlab.web.fc2.com/arduino/inside/hardware/arduino/avr/cores/arduino/Tone.cpp/tone.html
音階は、サンプル付属の pitches.h でドレミ音階の周波数を定義してありました。
#define NOTE_A4 440
こんな感じで定義してあります。
int melody[] = { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6}; int duration = 500; // 500 miliseconds
メロディを配列に持っておいて、
for (int thisNote = 0; thisNote < 8; thisNote++) { // pin8 output the voice, every scale is 0.5 sencond tone(8, melody[thisNote], duration); // Output the voice after several minutes delay(1000); }
スピーカーを繋いでいるピン番号8番を指定して、tone命令を実行。鳴ったー!
またもや、コードが多いですけど、切り離してないだけで、繋いでるのは2本だけです…。
Lesson 8 Tilt Ball Switch
チルトスイッチです。部品の中に、導電帯のボールが入ってて、部品を傾けて動かすことで、物理的に端子に接触して通電されます。仕組みが単純なので、小さく作れるし、安価です。上下向き検出で加速度計を使うまでもないような時にピッタリ。
パッと見だと、コンデンサみたいですね。振るとボールが動いてカラカラ音がします。
昔は、ボールの代わりに水銀を使っていたそうです。(水銀スイッチ/マーキュリースイッチと呼ばれていた)
プログラムはこんな感じ。
const int ledPin = 13;//the led attach to void setup() { pinMode(ledPin,OUTPUT);//initialize the ledPin as an output pinMode(2,INPUT); digitalWrite(2, HIGH); }
setupでLEDをOUTPUTに、チルトスイッチをつないだピンをINPUTに指定。
ここでチルトスイッチにHIGHを書いておくのはなんでだろう?と思って調べてみると、指定したピンがINPUTに設定されている場合は、HIGHを出力すると20KΩの内部プルアップ抵抗が有効になるとのこと。
Arduino 日本語リファレンス : digitalWrite(pin, value)
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2051
pinMode 指定の時に、
pinMode(2,INPUT_PULLUP);
と書くだけでもいいみたいです。
void loop() { int digitalVal = digitalRead(2); if(HIGH == digitalVal) { digitalWrite(ledPin,LOW);//turn the led off } else { digitalWrite(ledPin,HIGH);//turn the led on } }
ピンの値を見て、HIGH(通電状態)であればLEDを光らせます。
コードに繋がっているチルトスイッチ部品の向きを変えると、LEDが点いたり消えたり。
さすがに邪魔になってきたので、コードを切り離しました。切り離したら離したで、今度は収納の時にかさばって困る…。
Lesson 9 Servo
いよいよ、おまちかね(?)のサーボ制御!これまでのLEDやブザーだと、コントロールと電源供給は、同じピンで行っていましたが、サーボの場合、電源は別途5Vピンから取得します。なので、接続は 5V / GND / 制御 の3本。
プログラムは、Arduinoから提供されているサーボ制御ライブラリを使います。
標準的なArduinoなら12個、Megaなら48個までのサーボが制御可能とのこと!(多く使う場合は、使うピンの制限があるので注意)
myservo.attach(9); // attaches the servo on pin 9 to the servo object
これでサーボ制御するピンを指定。ここでは9番ピン。
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position }
これで 0度~180度回転する。
…と思うんだけど、0度~170度ぐらいしか回転しない。端っこで「これ以上回りません!」みたいに「ミシミシッ!」とか鳴ってる。
今回使ったサーボは安い部品なので、正確性はこのぐらいのものなんでしょうね。個体ごとにプログラムで微調整が必要なのかもしれないです。まあ、それっぽく動いたのでOK!
Lチカだけでも楽しいですが、やはり、物理的に何かが動くようになると、一段階進んだ気がします!
M5Stackに繋いで、MicroPythonからも制御してみました。
M5Cloud からの PWM 制御方法はこちら。
m5stack/M5Cloud: PWM
https://github.com/m5stack/M5Cloud#pwm
接続は5V/GNDと、21番ピン(SDA)を使用。
「火星の人(日本映画名:オデッセイ)」でマークワトニーがやってた、ASCIIコードを用いた通信です。文字列のASCIIコードを 0~F で順次指し示します。これで地球と通信できるぞ!
M5Stackとサーボモーターでワトニー&パスファインダー的なASCIIコード通信。
サーボモーターが180度しか回らないタイプなのでちょっと狭いですが…。#火星の人#オデッセイ#M5Stack pic.twitter.com/eDA1KtOTpa— Nochi (@shikarunochi) 2018年8月3日
実際には170度ぐらいしかきれいに制御できなかったので、ちょっと微妙になってしまった。
H…O…W…A…L…I…V…E pic.twitter.com/YsoTbrQxNY— Nochi (@shikarunochi) 2018年8月3日