2009-04-03
En anordning som gungar på barnets säng om det skriker, det borde väl gå att bygga?
En arduino med en mikrofon via en enkel förstärkare:

En potentiometer för slaglängdsjustering av ett servo som via en fjäder drar i den fjädrade spjälsängen, det hade nog varit bättre med en potentiometer för att välja hastighet och en för slaglängd.
Video
Arduinokod:
#include <ServoTimeTimer1.h>
#define servoPin1 10
ServoTimeTimer1 servo1;
int micPin = 0; //mic. amp to pin 0.
int ledPin = 7; // LED connected to digital pin 7
int potpin = 2; // 10K pot on pin 2
int swpin = 3; // mode switch
int potv = 0; // value from pot
int stime = 800; // servo timer in rest. 500 to 2500.
int rcount = 0; // rock count in loop
int volu = 0; // detected sound
int soundcount = 0; //number of detected sounds
int numberofrocks = 0; // rumber of rocks to be
boolean trigg=false;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(potpin, INPUT);
pinMode(micPin, INPUT);
pinMode(swpin, INPUT);
servo1.attach(servoPin1);
Serial.begin(9600);
servo1.write((stime));
digitalWrite(ledPin, LOW);
}
////////////////////////////////////////
void loop()
{
if(analogRead(swpin)>500) crock(); // check if the input is HIGH, go to sub crock)
if (listen()==true)soundcount=soundcount+2;
//if the counter is above 0, reduse.
if (soundcount>0) soundcount=soundcount-1;
if (soundcount>=5) { //check counter, if high, rock the cradle!
rockcradle(20);
soundcount=4; // leave counter at high value for quick restart
}
//Serial.println(soundcount); //debug
}
////////////////////////////////////////
void rockcradle(int numberofrocks)
{
for (rcount=0; rcount<numberofrocks; rcount++){
potv=analogRead(potpin);
servo1.write((stime+potv));
delay(300);
servo1.write((stime));
delay (300);
}
}
//////////////////////////////////////////
bool listen()
{
for (int i=0; i <= 250; i++){ // count to 250 is about 5 sec...
volu=analogRead(micPin);
Serial.println(volu); // serial print value for debugging...
if (volu<600){
digitalWrite(ledPin, HIGH);
delay (2);
digitalWrite(ledPin, LOW);
delay (40);
return true;}
delay(20);
}
//tillbaka till main loop
delay(20);
return false;
}
///////////////////////////////////////
void crock()
{ while (analogRead(swpin) > 500){
digitalWrite(ledPin, HIGH);
delay (1);
digitalWrite(ledPin, LOW);
delay (0);
potv=analogRead(potpin); // to control speed...
servo1.write((stime+potv));
Serial.println(stime+potv);
delay(500);
servo1.write((stime));
delay (500);
}
///////////////////////////////////////