Arduinoの効果音付き光スイッチ

こんにちは

この投稿では、私が行った仕事の原則についてHabrコミュニティと共有したいと思います。

近接スイッチ。 このスイッチは、スマートホームシステムで使用する予定です。



このスイッチの基本は、最近購入したArduinoコントローラーの改良されたクローンで、 Carduino Nano V.7という名前で販売されています。

画像





サーキットブレーカーは次のように機能します。

D5出力のArduinoは、周波数976 Hz、デューティサイクル50%のPWM信号を常に生成します。 出口へ

D5は電流制限抵抗を介して、赤外線範囲の光信号を発するLEDに接続されています。 Arduino D2入力に接続されたフォトトランジスタが検出

手で反射したIR信号。 ArduinoはIR信号を受信し、その精度をチェックし、20連続パルスからの信号が976 Hzの周波数に対応する場合、コントローラーはArduinoのD13出力で青色LED(L)をオンにし、コントローラーのSPK出力を介して効果音の再生を開始します。 LED(L)がオフになると、すべて同じことが起こります。



再生:

サウンドエフェクトを再生する場合、WAV形式のサウンドファイルが圧縮なしで使用され、周波​​数は16000 Hz、深さは8ビットです。

サウンド再生の品質を向上させるために、線形補間が使用されます。 このため、サンプルは96000 Hzの周波数でサンプリングされ、線形補間によって計算された4つの中間サンプルが元のサンプルの間に挿入されます。 したがって、量子化ノイズが削減され、品質が向上し、サウンドを再生するために追加のフィルターは必要ありません。



回路は簡単に構築できます

1-Carduino Nano V.7

古いテレビのリモコンからの2IR LED、側面放射を避けるために、LEDは熱収縮で密封する必要があります

3-フォトトランジスターLTR-3208E

子供のおもちゃの4ダイナミックヘッド

5抵抗10kおよび68ohm



画像



ブレッドボード上で私が組み立てた回路がどのように機能するか、ビデオを見ることができます。





Arduino Nanoのコード:



#include <TimerOne.h> #include <avr/delay.h> #include <avr/pgmspace.h> #include "fife.h" #include "hi.h" //////// //////////////////////////////////// #define speakerPin 11 volatile uint16_t sample=0; volatile uint8_t lastSample, FirstSample; volatile byte new_data,future_data,old_data; volatile byte stat=0; unsigned char *wave; unsigned int length; //////// //////////////////////////////////// uint8_t state = 0; volatile uint16_t timerCount, lengthImpuls; volatile uint16_t Counter=0; //////////// /////////////////////////////// void setup() { pinMode(speakerPin, OUTPUT); //   digitalWrite(speakerPin, LOW); //     pinMode(2, INPUT); // ,   // digitalWrite(2, HIGH); //   pinMode(13, OUTPUT); // pinMode(5, OUTPUT); //     TCCR0B = TCCR0B & 0b11111000 | 3; //  976 analogWrite(5,128 ); //  attachInterrupt(0, Ir_sens, RISING); //    Timer1.initialize(10); //  Timer1.attachInterrupt(callback); //  } ////////////   /////////////////////////////// void callback() { timerCount++; } ////////////  /////////////////////////////// void Ir_sens() { lengthImpuls = timerCount; timerCount=0; Counter++; } ///////////////////////     OCR2/////////////////// ISR(TIMER2_COMPA_vect) { switch (stat) { case 0:{ old_data = pgm_read_byte(&wave[sample]); OCR2A = old_data; stat=1; ++sample; if (sample == length) stat=4; future_data = pgm_read_byte(&wave[sample]); new_data = (old_data+future_data)/2; } break; case 1: {OCR2A=(old_data+new_data)/2; stat=2; } break; case 2: {OCR2A = new_data; stat=3; } break; case 3: {OCR2A=(new_data+future_data)/2; stat=0; } break; case 4: if(lastSample==0) stat=5; else {--lastSample; OCR2A=lastSample;} break; case 5: stopPlayback(); break; } } ////////////  /////////////////////////////// void loop() { if(lengthImpuls>105 || lengthImpuls<99) Counter=0; if(lengthImpuls>99 && lengthImpuls<105 && Counter>20) { state=~state; digitalWrite(13, state); if(state>0) play_wave((unsigned char *)hi, hi_length); if(state==0) play_wave((unsigned char *)fife, fife_length); _delay_ms(200); while(Counter>10) { if(lengthImpuls>105 || lengthImpuls<99) Counter=0; } lengthImpuls=0; } } //////////// /////////////////////////////// void play_wave(unsigned char *wave_data, unsigned int wave_length) { wave=wave_data; length=wave_length; startPlayback(); } void startPlayback() { sample=0; stat=0; ASSR |=(1<<AS2); TCCR2A |= ((1<<COM2B1)|(0<<COM2B0)|(1<<COM2A1)|(0<<COM2A0)|(1<<WGM21)|(0<<WGM20)); TCCR2B = ((0 << CS22) | (0 << CS21) | (1 << CS20) | (0<<WGM22) | (1<<FOC2A) | (1<<FOC2B)); lastSample = pgm_read_byte(&wave[length-1]); TCNT2 = 0; TIMSK2|=(1<<OCIE2A); sei(); for (int i=0; i <50; i++) { new_data=i; stat=2; sample = 0; _delay_us(1); } stat=0; } //////////// /////////////////////////////// void stopPlayback() { TIMSK2&=(0<<OCIE2A); TCCR2B &=(0<<CS10); }
      
      







ソースファイルを1つのファイルにダウンロードする



次の記事:

Arduino NanoはAtmega328コントローラーに置き換えられ、電源を備えた回路全体が別のボードに組み立てられ、コリドースイッチに取り付けられます。



All Articles