매뉴얼 활용

박수소리로 ON/OFF 하자!
작성자 : 자작매니아 등록일 : 2015-07-22 조회수 : 550

Step 1 : 박수 소리로 전자제품을 on/off 해보기~

Step 제가 처음으로 전자회로라는것에 접하게 된 계기는 초등학교 4학년때 인데 같은반 친구가 가져온 감전기 키트를 보게된게 시작였습니다


                                           
​​​​​​​​ 

작은 크기의 회로에서 손으로 잡았을때 깜짝놀랄정도로 전기가 나온다는게 무척이나 신기했습니다..ㅋㅋ

그래서 처음으로 동네에있는 과학사에서 처음으로 사서 만들어본게 감전기 키트네요 (그당시 400원..ㅋㅋ 지금은 5000원이네요)

전자라는거에 흥미를 느끼게 되어 그당시 삼촌한테 졸라서 60W 인두기와 납을 받았던게 아직도 기억에 선하구요..^^

제가 전자회로라는걸 배울수있었던건 그당시에는 책밖에 없었습니다 지금처럼 인터넷이 발달하여 정보를 쉽게 얻을수 있었

던때가 아니였거든요..

                                           

                                          위그림은제가  처음으로 사봤던 책 007 기초 공작집시리즈(1~8권까지 구입했슴)


그때는 전자부품도 구하기가 지금처럼 쉽지도 않았습니다 지금이야 온라인쇼핑몰에 부품보고 신청하면 바로 오는 아주 좋은 세상이지만 그당시에는 

방에 사는 저로써는 서울 세운상가나 가야 원하는 부품을 살수 있을라나요 그것도 발품좀 팔아야 가능한 때이구요..

서점에 가서 주로 책을 사서 공부하곤 했는데 책을 고르는 기준은 "내가 만들고 싶어하는 흥미있는게 있는가"가 기준였습니다

지금은 옛날과는 다르게 인터넷의 발달로 구글과 유투브를 통해 정보검색을 하면  만들고 싶어하는 흥미있는 자료가 굉장히 많은것 같습니다


이번에 소개해드릴 회로는 박수소리로 on/off 할수 있는 회로를 소개해드립니다

두가지 버전을 소개할건데요 하나는 일반 전자회로로 구성한 회로와 아두이노를 이용해서 만든회로를 소개 할까 합니다

옛날에 007 영화 시리즈중에서 상대방의 뺨을 때릴대마다 전구 스탠드가 켜졌다 꺼졌다 반복되던 장면이 있었는데 제가 어릴적이라 굉장히 신기했

었습니다  ( 혹시 이 영화 기억하시는분이 있을까 궁금하네요 )




1 . http://www.elenco.com/ 에서 소개한  SOUND ACTIVATED SWITCH KIT 

2 . 아두이노를 이용한 arduino clap on/off switch   


SOUND ACTIVATED SWITCH KIT 

부품 리스트 

저항 

R17 4.7kΩ 5% 1/4W          -----------------  1ea
R1, R5, R16 10kΩ 5% 1/4W  -----------------  3ea
R3 22kΩ 5% 1/4W  -------------------------  1ea
R4, R10, R12, R14 100kΩ 5% 1/4W  ----------  4ea
R2, R6, R9, R13 220kΩ 5% 1/4W  ------------  4ea
R7 270kΩ 5% 1/4W   -----------------------  1ea
R15 330kΩ 5% 1/4W   ----------------------  1ea
R11 1MΩ 5% 1/4W    ----------------------  1ea
R8 4.7MΩ 5% 1/4W   ----------------------  1ea
P1 100kΩ Trim Pot    ----------------------  1ea

콘덴서 

C5, C6, C8, C9 .001μF (102) 세라믹     ----  4ea
C1, C3 .01μF (103) 세라믹     -------------  2ea
C2, C4 .1μF (104) 세라믹      -------------  2ea
C7 1μF 전해콘덴서        ------------------  1ea
C10 100μF 전해콘덴서​     -----------------  1ea

반도체

Q1 2N3904 Transistor 
Q2 MPS6531 Transistor ( 2N2222 대치사용가능 ) --------  1ea
U2 4001 Integrated Circuit      --------  1ea
U1 4011 Integrated Circuit  --------  1ea
LED LED Red 350002  --------  1ea

기타

만능기판 
콘덴서 마이크 -------1ea
9V 배터리 스냅 -------1ea
IC Socket 14-pin  -------2ea



 

 

 

 

 

 

 

 

 

 

 

 

                               



             원본 PDF 파일에는 없는 이미지 인데 제작의 편의를 위해 부품의 위치를 표기해둔거라 이걸로 보고 따라 만드시면 될것 같습니다

           
 
          
                                                                                     만능기판으로 완성된 모습



  아두이노를 이용한 arduino clap on/off switch
   
                                   




 마이크와 연결방법은  아래와 같이 연결해서 아날로그 핀 0번에 신호선을 연결하시면 됩니다

                    5v

                    |
                    |----------|
                  _|   C       O mike
                 |_)--B------ㅣ 
                    |  E
                    |
 analog 0-----*------ww------|i   ground
                             10k


소스 :

 

int def;
int on = false;
int switch1 = false;
int switch2 = false;

void setup()  {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  delay(250);
  int num1 = analogRead(0);
  delay(250);
  int num2 = analogRead(0);
  delay(250);
  int num3 = analogRead(0);
  def = (num1 + num2 + num3) / 3;
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
}

void loop()  {
  if(abs(def - analogRead(0)) > 3)  {
    delay(200);
    if(abs(def - analogRead(0)) > 3)  {
 switch1 = false;
    }
    else {
 switch1 = true;
    }
    long time = millis();
    while((abs(def - analogRead(0)) < 3) && millis() <= time + 1000)  {
    }
    if(abs(def - analogRead(0)) > 3)  {
 switch2 = true;
    }
    else  {
 switch2 = false;
    }
    if(switch1 && switch2)  {
 if(on == false)  {
   digitalWrite(13, HIGH);
   on = true;
 }
 else  {
   digitalWrite(13, LOW);
   on = false;
 }
    }
  }
}



버전 2 : 개선된버전으로 실제 생활에 사용할수 있게끔 만들었네요 터치스위치도 포함입니다

 

 

                         

  

                            다른동영상도 있었는데 제작자가 삭제한것 같네요 이것만 남아있네요

 

 

 

 

사용된 마이크회로는

 

                                                            

 

 

Sound Sensor Module for Arduino Sensor Shield + Cable



요거구요  위 모듈에대한 정보는 아직 찾아보진 못했네요..

 

// Arduino Clapper - by WilliamK @ Wusik.com & Beat707.com - September 06 2011 - V 1.2.0 //
// On V1.2.0, when powering up, it will flash the output them detect for 10 seconds any ambient noise and save into the EEPROM and flash the output once its finished //

#include <EEPROM.h>

#define inPin A1                // Pin input for the audio sensor
#define outPin 0               // Output pin to active external device (use relay for 110/220V)
#define touchPin PINB4         // Must be in PINB# format (digital pin 8 ~ 13 = PINB0 ~ PINB5)
#define clapTime 250           // How long to wait between claps
#define clapIdle 1000          // How long to wait after 2 claps before turning on external device
#define debounceTime 100        // Debounce time, to remove double inputs due to echoing
#define waitBeforeRetry 3000   // How long to wait before trying again after a failed set of claps or loud background noise/sounds
#define delayAfterSwitch 500   // How long to wait after a switch has happened
#define defaultSensitivity 50  // 50 should be ok for most uses
#define outputToSerial 0       // Outputs Stage information to the Serial Device
#define force_new_background 0 // If set to 1 it will force a new Noise Background check

// ------------------------------------------------------------------------------------------------------------------------ //
int def2, num1, num2, num3, def = 0;
uint8_t isOn = false;
uint8_t prevIsOn = false;
unsigned long lastMillis = millis();
uint8_t stage = 0;
#if outputToSerial
  uint8_t prevStage = 9;
#endif
int sensitivity = defaultSensitivity;
int lastValue = 0;
uint8_t prevButton = 0;
uint8_t curButton = 0;
uint8_t wasButtonLow = 1;

// ------------------------------------------------------------------------------------------------------------------------ //
void EEPROMWriteInt(int p_address, int p_value)
{
  byte lowByte = ((p_value >> 0) & 0xFF);
  byte highByte = ((p_value >> 8) & 0xFF);
  EEPROM.write(p_address, lowByte);
  EEPROM.write(p_address + 1, highByte);
}

// ------------------------------------------------------------------------------------------------------------------------ //
unsigned int EEPROMReadInt(int p_address)
{
  byte lowByte = EEPROM.read(p_address);
  byte highByte = EEPROM.read(p_address + 1);
  return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}

// ------------------------------------------------------------------------------------------------------------------------ //
void setup()  
{
  pinMode(outPin, OUTPUT);
  pinMode(inPin, INPUT);
   
  if (EEPROM.read(0) != 24 || force_new_background) // Check for the Background Noise //
  { 
    delay(2000);

    digitalWrite(outPin, HIGH);
    delay(150);
    digitalWrite(outPin, LOW);
    
    for (char x=0; x<4; x++)
    { 
      delay(1000);
      num1 = analogRead(inPin);
      delay(250);
      num2 = analogRead(inPin);
      delay(250);
      num3 = analogRead(inPin);
      def2 = ((num1 + num2 + num3) / 3) + sensitivity;
      if (def2 > def) def = def2;
    }
    
    for (char x=0; x<6; x++)
    { 
      delay(1000);
      num1 = analogRead(inPin);
      delay(250);
      num2 = analogRead(inPin);
      delay(250);
      num3 = analogRead(inPin);
      def2 = ((num1 + num2 + num3) / 3) + sensitivity;
      if (def2 < def) def = def2;
    }
    
    // Write Default Background Noise //
    EEPROMWriteInt(1, def);
    EEPROM.write(0, 24);
    
    digitalWrite(outPin, HIGH);
    delay(150);
    digitalWrite(outPin, LOW);
  }
  
  #if outputToSerial
    Serial.begin(38400);
  #endif
  
  prevButton = getcap(1<<PINB0);
  def = EEPROMReadInt(1);
}

// ------------------------------------------------------------------------------------------------------------------------ //
void loop()  
{
  lastValue = analogRead(inPin);
  
  if (isOn)
  {
    switch (stage)
    {
      case 0: if (lastValue > (def+10)) { lastMillis = millis() + clapTime; stage = 1; delaySomeTime(debounceTime); } break;   
      case 1: if (lastValue > (def+10)) { stage = 5; lastMillis = millis() + waitBeforeRetry; } else if (millis() > lastMillis) { stage = 2; lastMillis = millis() + clapTime; } break;
      case 2: if (lastValue > (def+10)) { lastMillis = millis() + clapIdle; stage = 3; delaySomeTime(debounceTime); } else if (millis() > lastMillis) { stage = 5; lastMillis = millis() + waitBeforeRetry; } break;
      case 3: if (lastValue > (def+10)) { stage = 5; lastMillis = millis() + waitBeforeRetry; } else if (millis() > lastMillis) stage = 4; break;
      case 4: if (lastValue < def) { isOn = !isOn; } stage = 0; break;
      
      case 5: // This is the Wait Before Retrying stage //
        if (lastValue > (def+10)) lastMillis = millis() + waitBeforeRetry; else if (millis() > lastMillis) stage = 0;
        break;
    }
  }
  
  #if outputToSerial
    if (stage != prevStage)
    {
      Serial.println(stage, DEC);
      prevStage = stage;
    }
  #endif
  
  checkButton();
}

// ------------------------------------------------------------------------------------------------------------------------ //
void checkNewOn()
{
  if (isOn != prevIsOn)
  {
    digitalWrite(outPin, isOn);
    prevIsOn = isOn;
    delay(delayAfterSwitch);
  }
}

// ------------------------------------------------------------------------------------------------------------------------ //
void delaySomeTime(unsigned long ms)
{
  uint16_t start = (uint16_t)micros();

  while (ms > 0) 
  {
    if (((uint16_t)micros() - start) >= 1000) 
    {
      ms--;
      start += 1000;
    }
    checkButton();
  }
}

// ------------------------------------------------------------------------------------------------------------------------ //
void checkButton()
{
  curButton = getcap(1<<touchPin);
  
  if (curButton != prevButton)
  {
    prevButton = curButton;
    if (wasButtonLow == 1 && curButton > 1)
    {
      isOn = !isOn;
      wasButtonLow = 0;
      stage = 0;
      checkNewOn();
      delay(500);
    }
    if (curButton <= 1) wasButtonLow = 1;
  }
  
  checkNewOn();
}

// ------------------------------------------------------------------------------------------------------------------------ //
char getcap(char pin)
{
  char i = 0;
  DDRB &= ~pin;          // input
  PORTB |= pin;          // pullup on
  for(i = 0; i < 2; i++) 
  {
    if( (PINB & pin) ) break;
  }
  PORTB &= ~pin;         // low level
  DDRB |= pin;           // discharge 

  return i;