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 件のコメント:
コメントを投稿
コメントをどうぞ