i found this code and it works perfectly, mouth moves to audio nice and smooth
#include "SoftRcPulseOut.h"
#define TEST_PIN 5
int audio_value = 0;
long lastMsg = 0;
long sleepWindow = 300000;
SoftRcPulseOut servo;
volatile boolean servosEnabled = false;
volatile boolean ledsOn = true;
volatile unsigned long currentTime = 0;
volatile unsigned long lastLEDtime = 0;
unsigned long resetWait = 120000;
void setup()
{
pinMode(TEST_PIN,INPUT);
digitalWrite(TEST_PIN,HIGH);
}
void loop()
{
servo_test();
audio_updates();
if(servosEnabled)
{
action();
SoftRcPulseOut::refresh();
if((millis() - lastMsg) > sleepWindow)
detach_servos();
}
}
void attach_servos()
{
servo.attach(8);
servosEnabled = true;
}
void detach_servos()
{
servo.detach();
servosEnabled = false;
}
void servo_test()
{
if(digitalRead(TEST_PIN) == HIGH) return;
attach_servos();
SoftRcPulseOut::refresh();
for(int i = 0; i < 360;i++)
{
if(i < 180)
audio_value = i;
else
audio_value = 359 - i;
action();
for(int i = 0; i < 10; i++)
{
delay(1);
SoftRcPulseOut::refresh();
}
}
detach_servos();
}
void audio_updates()
{
audio_value = 0;
if(analogRead(A0) < 341) audio_value += 60;
if(analogRead(A1) < 341) audio_value += 60;
if(analogRead(A2) < 341) audio_value += 60;
if(audio_value > 0)
{
lastMsg = millis();
if(!servosEnabled)attach_servos();
}
}
void action() {
if (!servosEnabled) attach_servos();
servo.write(audio_value);
SoftRcPulseOut::refresh();
}
void set_minmax()
{
servo.setMinimumPulse(map(62,0,150,512,2400));
servo.setMaximumPulse(map(82,0,150,512,2400));
}
im using this one also and it works perfectly, great random head movement is the result
#include <Servo.h>
Servo NODservo;
Servo TILTservo;
Servo TURNservo;
int NOD = 9;
int TILT = 10;
int TURN = 11;
int BLINK = 6;
int NOD_UP = 50;
int NOD_Mid = 90;
int NOD_DOWN = 100;
int Tilt_Left = 90;
int Tilt_Mid = 67;
int Tilt_Right = 3;
int Turn_Left = 100;
int Turn_Mid = 90;
int Turn_Right = 3;
boolean lockLow = true;
boolean takeLowTime;
long randomNOD;
long randomTILT;
long randomTURN;
void randomHeadMotion();
void centerSkull();
void CalibratedMove();
void slowMoveCenter();
void setup()
{
pinMode(BLINK, OUTPUT);
digitalWrite(BLINK, LOW);
NODservo.attach(NOD);
TILTservo.attach(TILT);
TURNservo.attach(TURN);
centerSkull();
}
void loop()
{
slowMoveCenter();
}
void randomHeadMotion()
{
digitalWrite(BLINK, LOW);
int NODlow = 75;
int NODhigh = 93;
int TILTlow = 48;
int TILThigh = 85;
int TURNlow = 25;
int TURNhigh = 159;
randomSeed(analogRead(0));
randomNOD = random(NODlow, NODhigh);
randomTILT = random(TILTlow, TILThigh);
randomTURN = random(TURNlow, TURNhigh);
int currentNOD = NODservo.read();
int currentTILT = TILTservo.read();
int currentTURN = TURNservo.read();
int pos = 0;
int NODpos = randomNOD;
int TILTpos = randomTILT;
int TURNpos = randomTURN;
for(pos = 0; pos < 100; pos += 5)
{
if(currentNOD <= randomNOD)
{
NODpos = map(pos, 100, 0, randomNOD, currentNOD);
}
else
{
NODpos = map(pos, 0, 100, currentNOD, randomNOD);
}
if(currentTILT <= randomTILT)
{
TILTpos = map(pos, 100, 0, randomTILT, currentTILT);
}
else
{
TILTpos = map(pos, 0, 100, currentTILT, randomTILT);
}
if(currentTURN <= randomTURN)
{
TURNpos = map(pos, 100, 0, randomTURN, currentTURN);
}
else
{
TURNpos = map(pos, 0, 100, currentTURN, randomTURN);
}
NODservo.write(NODpos);
TILTservo.write(TILTpos);
TURNservo.write(TURNpos);
delay(10);
}
randomSeed(analogRead(0));
int randomTIME = random(200, 400);
delay(randomTIME);
randomSeed(analogRead(1));
randomNOD = random(NODlow, NODhigh);
randomTILT = random(TILTlow, TILThigh);
randomTURN = random(TURNlow, TURNhigh);
currentNOD = NODservo.read();
currentTILT = TILTservo.read();
currentTURN = TURNservo.read();
randomSeed(analogRead(2));
randomTIME = random(200, 600);
delay(randomTIME);
digitalWrite(BLINK, HIGH);
}
void centerSkull()
{
digitalWrite(BLINK, LOW);
NODservo.write(NOD_Mid);
TILTservo.write(Tilt_Mid);
TURNservo.write(Turn_Mid);
delay(500);
digitalWrite(BLINK, HIGH);
}
void CalibratedMove()
{
digitalWrite(BLINK, LOW);
NODservo.write(NOD_Mid);
TILTservo.write(Tilt_Mid);
TURNservo.write(Turn_Mid);
delay(800);
NODservo.write(NOD_UP);
delay(800);
NODservo.write(NOD_DOWN);
delay(800);
NODservo.write(NOD_Mid);
delay(800);
TILTservo.write(Tilt_Left);
delay(800);
TILTservo.write(Tilt_Right);
delay(800);
TILTservo.write(Tilt_Mid);
delay(800);
TURNservo.write(Turn_Right);
delay(800);
TURNservo.write(Turn_Left);
delay(800);
TURNservo.write(Turn_Mid);
delay(800);
digitalWrite(BLINK, HIGH);
}
void slowMoveCenter()
{
digitalWrite(BLINK, LOW);
randomNOD = NOD_Mid;
randomTILT = Tilt_Mid;
randomTURN = Turn_Mid;
int currentNOD = NODservo.read();
int currentTILT = TILTservo.read();
int currentTURN = TURNservo.read();
int pos = 0;
int NODpos = randomNOD;
int TILTpos = randomTILT;
int TURNpos = randomTURN;
for(pos = 0; pos < 100; pos += 5)
{
if(currentNOD <= randomNOD)
{
NODpos = map(pos, 100, 0, randomNOD, currentNOD);
}
else
{
NODpos = map(pos, 0, 100, currentNOD, randomNOD);
}
if(currentTILT <= randomTILT)
{
TILTpos = map(pos, 100, 0, randomTILT, currentTILT);
}
else
{
TILTpos = map(pos, 0, 100, currentTILT, randomTILT);
}
if(currentTURN <= randomTURN)
{
TURNpos = map(pos, 100, 0, randomTURN, currentTURN);
}
else
{
TURNpos = map(pos, 0, 100, currentTURN, randomTURN);
}
NODservo.write(NODpos);
TILTservo.write(TILTpos);
TURNservo.write(TURNpos);
delay(10);
}
digitalWrite(BLINK, HIGH);
}