8pino(Trinket)では、toneライブラリが使えません。
スケッチでtone()を使ってもコンパイルエラーは出ませんが、動作しません。
下記に、代替えのbeep()関数がありましたので、早速実験してみました。
The tone library does not work for the 8pino(Trinket).
If you compile the scketch in used tone library, it won't be an error.
A way of substitution existed in the following site.
このbeep()はdelayMicroseconds()を使って、かなり正確なbeepを実現していますが、deleyMicroseconds()の最大値が16383usなので、30Hz以下の周波数を出す事が出来ません。
そこで、60Hz以下の時はdelay()関数(ms単位)のタイマーを使う様に改造してみました。
This beep() used delayMicroseconds().This is correct timing.
But it's possible to use delayMicroseconds() only up to 16383us.
I edited a program to output less than 30 Hz of signal.
1Hzから1023Hzまで割と正確に出す事が出来ます。
It can output a correct signal from 1Hz to 1023Hz.
1Hz
1023Hz
// TONE TEST
// ボリュームに応じてTONE信号(1〜1023Hz)を出力 Make tone signal(1 to 1023Hz) with analog volume.
// 8pinoでは、TONE()が使えません。The tone library does not work for the 8pino(Trinket).
// Thanks Dr. Leah Buechley at http://web.media.mit.edu/~leah/LilyPad/07_sound_code.html
int led = 1; // On board LED (pin 1)
int vol = 1; // Analog input 1(pin 2)
int vol_num; // Analog value
void setup() {
pinMode(led, OUTPUT);
//pinMode(vol, INPUT); //Default pin mode is analog input.
}
void loop() {
vol_num = analogRead(vol); //Read analog data (0 to 1024)
if (vol_num == 0) { // if f=0Hz then
vol_num = 1; // f=1Hz
};
if(vol_num > 60){ // if f>60Hz then
beep(led,vol_num,1000); // use delayMicroseconds()
}else{ // else
beep_ms(led,vol_num,1000); // use delay()
}
}
void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
int x;
long delayAmount = (long)(500000/frequencyInHertz); // Original is 1000000
long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));
for (x=0;x<loopTime;x++)
{
digitalWrite(speakerPin,HIGH);
delayMicroseconds(delayAmount);
digitalWrite(speakerPin,LOW);
delayMicroseconds(delayAmount);
}
}
void beep_ms (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
int x;
long delayAmount = (long)(500/frequencyInHertz); // Original is 1000000
long loopTime = (long)((timeInMilliseconds)/(delayAmount*2));
for (x=0;x<loopTime;x++)
{
digitalWrite(speakerPin,HIGH);
delay(delayAmount);
digitalWrite(speakerPin,LOW);
delay(delayAmount);
}
}
Evernote はあなたがすべてを記憶し、手間をかけずに整理できるようにお手伝いします。Evernote をダウンロードする |
0 件のコメント:
コメントを投稿
コメントをどうぞ