2014年12月7日日曜日

8pinoではtone()関数は使えない。The tone library does not work for the 8pino(Trinket).


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).

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 をダウンロードする