Повторитель стуков

Публикация 19.05.2017

Очень веселая штука, что бы занять на вечер вашего двухлетнего ребенка. Вешаем на дверь и включаем. Устройство будет в точности повторять все стуки. Сможет передразнить любого самого настойчивого озорника.


Повторитель стуков

Компоненты необходимые для сборки нашего трудяги: arduino, серводвигатель EK2-0508, электронный микрофон или пьеза-пищалка из детской игрушки.

Компоненты для сборки повторителя звуков

Подключение согласно схеме: сигнальный провд с серво двигателя на контакт 9, а сигнальный с микрофона на аналоговый 0.

Схема повторителя стуков на Arduino

Arduino прослушивает звуки с микрофона. Если появляются звуковые всплески выше порогового уровня - записывает их и при завершении записи начинает воспроизведение. Воспроизведение осуществляется движением сервомашинки на валу которой закреплен через пружинку молоточек.

Крепление молоточка к серводвигателю повторителя стуков

Для крепления к двери можно использовать двухсторонний скотч.

Повторитель стуков

Если вы используете микрофонный модуль, то обратите внимание. что он питаеся от 3.2 вольта, которые обычно есть на плате Arduino. Для повышения стабильности работы микрофонного модуля рекомендую повесить конденсатор на его питание.
Сервомашинка нормально работает от 5 вольт и подключаем ее напрямую к батарее.

// GhostKnokder
// by Ron Tajima

#include <Servo.h> 

int debug = 0;

// Status enum
enum {
  // Reply status to move the servo motor
  STATUS_REPLY,
  // Pause status to wait next knock input
  STATUS_PAUSE,
  // Knock status to count knock input
  STATUS_KNOCK,
};

// Servo object
Servo servo;
// Analog pin for Mic input
int pin_mic = 0;
// Output pin for Servo
int pin_svo = 9;
// Threshold for silent level
int silent_thre = 95;
// Counter threshold to be pause status
int pause_tick = 40;
// Counter threshold to be reply status
int reply_tick = 800;
// Counter of silent duration
int silent_tick;
// Counter of knock
int knock_numb = 0;
// Array of the durations of pause 
int pause_time[10];
// Current status
int status = STATUS_REPLY;

// Initialization
void setup() 
{ 
  servo.attach(pin_svo);
  servo.write(0);
  Serial.begin(9600);	
} 

// 1ms loop to A/D convertion
void loop() 
{ 
  int val;
  int i;

  // Read Analog Value
  val = analogRead(pin_mic);

  // Make it to power
  val = abs(val - 512);
 
  // Make its range from 0 to 100
  val = map(val, 0, 512, 0, 100);

  //Serial.print (val);
  //Serial.print ("\n");
  
  // Knock ?
  if (val > silent_thre) {
    // Following to Pause or Reply?
    if (status != STATUS_KNOCK) {
      pause_time[knock_numb] = silent_tick;
      knock_numb ++;
      status = STATUS_KNOCK;
    }
    silent_tick = 0;
  } else {
    silent_tick ++;
  }
  // Pause ?
  if (silent_tick > pause_tick) {
    status = STATUS_PAUSE;
  }
  // Reply ?
  if (silent_tick > reply_tick) {
    status = STATUS_REPLY;
  }
  // Reply ?
  if (status == STATUS_REPLY) {
    if (knock_numb > 0) {
      pause_time[knock_numb] = 500;
      if (debug) {
        Serial.print ("Reply: ");
        Serial.print (knock_numb);
        Serial.print ('\n');
      }
    }
    for (i=0; i<knock_numb; i++) {
      servo.write(45);
      delay (100);
      servo.write(0);
      delay (pause_time[i+1]);
      if (debug) {
        Serial.print (pause_time[i+1]);
        Serial.print ('\n');
      }
    }
    knock_numb = 0;
  }
  if (debug) {
     // Pause ?
      if (status == STATUS_PAUSE) {
        Serial.print ("Pause: ");
        Serial.print (knock_numb);
        Serial.print ('\n');
      }
  }
  delay (1);
} 
* комментарии публикуются после модерации
24.05.2017 23:20
Нет же, посмотри внимательно. Там в скетче четко указано, что микрофон пин A0 - это аналоговый, значит сигнал аналоговый. Так что можно пьезу подключать без переделки кода, но может потребоваться предусилитель.
24.05.2017 22:38
Если использовать пьезо динамик, то нужно и код править? Я смотрю там заточено под цифровой микрофон.