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

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

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

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); }