Aerduino レシプロカル式周波数カウンタ(7セグメント表示)
2017.1.16 JH7UBC
以前、JH7UBCブログに掲載したArduinoレシプロカル式周波数カウンタを7セグメント表示にしてみました。
上図のように、5Vで、電流制限抵抗が680Ωの時、電流は4.5mA流れ、十分な輝度が得られました。
7つのセグメントが全て点灯しても31.5mAですから、Arduinoのデジタルポートでドライブできます。
LEDは、ダイナミック点灯とします。
周期の測定には、外部割り込みattachInterrupt(interrupt,function,mode)を利用し、
割り込み番号は0(ピン2)、トリガは立ち上がり(RISING)とします。
信号は、2SC1815GRの簡単なアンプで増幅し、ピン2に加えます。
回路図です。
ブレッドボードです。(500Hzを測定しています。)
スケッチです。
/*
*レシプロカル式周波数カウンタ *7セグメントLEDダイナミック点灯 * 2016.12.29 * JH7UBC Keiji Hata * * D2 INPUT * D3 7segLED A * D4 7segLED B * D5 7segLED C * D6 7segLED D * D7 7segLED E * D8 7segLED F * D9 7segLED G * D10 7segLED #1 * D11 7segLED #2 * D12 7segLED #3 * D13 7segLED #4 */ volatile unsigned long duration=0; volatile unsigned long prevMicros=0; unsigned int frequency; int ZeroFlag; //ゼロフラッグ int N[4]; //表示する数字(4桁) int Nx; //LED レイアウト定義 A,B,C,D,E,F,Gセグメントの順
boolean Num_Array[11][7]={ {1,1,1,1,1,1,0}, //0 {0,1,1,0,0,0,0}, //1 {1,1,0,1,1,0,1}, //2 {1,1,1,1,0,0,1}, //3 {0,1,1,0,0,1,1}, //4 {1,0,1,1,0,1,1}, //5 {1,0,1,1,1,1,1}, //6 {1,1,1,0,0,1,0}, //7 {1,1,1,1,1,1,1}, //8 {1,1,1,1,0,1,1}, //9 {0,0,0,0,0,0,0} //space }; //LED配列
boolean Led_Array[4][4]={ {0,1,1,1}, //LED1 {1,0,1,1}, //LED2 {1,1,0,1}, //LED3 {1,1,1,0} //LED4 }; void setup() { attachInterrupt(0, periodIrq, RISING); for (int i=3;i<=13;i++) //pin3〜13を出力に設定 { pinMode(i,OUTPUT); } } void loop()
{ frequency = 1000000 / duration; //f=1/T Num_set(frequency); //周波数の値をN[0]〜N[3]にセット int var = 0; while(var < 20){ //20の値は、要調節 for(int i=0;i<4;i++){ LedActive(i); NumPrint(N[i]); delay(6); NumPrint(10); //一旦表示を消す } var++; } } void periodIrq() // interrupt handler
{ unsigned long currentMicros = micros(); duration = currentMicros - prevMicros; prevMicros = currentMicros; } //数字表示
void NumPrint(int Number){ for (int w=0; w<=6; w++){ digitalWrite(w+3,Num_Array[Number][w]); } } //LED点灯
void LedActive(int Number){ for (int w=0; w<=3; w++){ digitalWrite(w+10,Led_Array[Number][w]); } } //数字の分解(1000の位、100の位、10の位、1の位)とセット
void Num_set(int X){ ZeroFlag=1; N[0] = X / 1000; if (N[0] == 0){ N[0]=10; //10=space }else{ ZeroFlag=0; } Nx = X % 1000;
N[1] = Nx / 100; if (N[1] == 0 & ZeroFlag == 1){ N[1]=10; }else{ ZeroFlag = 0; } Nx = X % 100; N[2] = Nx / 10; if (N[2] == 0 & ZeroFlag ==1){ N[2]=10; } N[3] = X % 10;
} |
上の試作機をAeduino NANOを使って、基板に組んでみました。
電源は、006P(9V)を78L05で5Vにしています。電流は約40mAです。
エレクトレットコンデンサマイクで音をひろい、オペアンプLM358で100倍増幅しています。
回路図です。
基板の様子です。
スケッチは、試作機とほぼ同じです。
自作のファンクションジェネレータの約1000Hzの音ををスピーカから出し
マイクでひろってカウントさせてみました。
±1Hzで表示されます。
2917.5.18 ケースに入れました。ケースは、秋月電子のプラスチックケースSK-16です。