nel mio plastico gestisco tutto con un Arduino mega, gli scambi sono azionati tramite bottoni (ad impulsi, normalmente aperti).
Nella giornata di domenica, ho aggiunto anche un relè per staccare l'alimentazione dopo il movimento dei servi. Ho fatto questo, perchè i servi economici che ho usato, dopo un pò di tempo, dopo la regolazione, cominciano a ronzare. Leggevo che è a causa della polvere, che sporca i potenziomentri che hanno dentro e che servono al servo per controllare la propria posizione. Interrompendo l'alimentazione non ronzano ed ho risolto in modo definitivo il problema.
Vi posto lo sketch nell'ultima versione.
Codice: Seleziona tutto
/* Firmware Pannello
by Nick85
*/
#include <Servo.h>
// definizione led
#define LED1 24 //1
#define LED2 26 //2
#define LED3 28 //3
#define LED4 30 //4
#define LED5 32 //5
#define LED6 34 //6
#define LED7 36 //7
#define LED8 38 //8
#define LED9 40 //9
#define LED1b 31 //1b
#define LED2b 33 //2b
#define LED3b 35 //3b
#define LED4b 37 //4b
#define LED5b 39 //5b
#define LED6b 41 //6b
#define LED7b 43 //7b
#define LED8b 45 //8b
#define LED9b 47 //8b
#define RELAIS1 21 //280320 Definizione relais per interruzione alimentazione servi
//definizione bottoni
#define BUTTON1 14 //1
#define BUTTON3 15//3
#define BUTTON4 17//4
#define BUTTON5 18 //5
#define BUTTON6 19 //6
#define BUTTON7 20 //7
#define BUTTON8 16 //8
#define BUTTON9 22 //9
//dichiaro i servi
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;
Servo servo9;
//http://arduinotutorial.altervista.org/category/digital-io/debounce/
#define debounce 700
long time = 0; //Ultimo tempo in cui il pin di OUTPUT è stato attivato
int val[10] = {0,0,0,0,0,0,0,0,0,0};// si userà val per conservare lo stato del pin di input
int vecchio_val[10] = {0,0,0,0,0,0,0,0,0,0};// si userà vecchio_val per conservare lo stato del pin di input al passo precedente
int stato [10] = {0,0,0,0,0,0,0,0,0,0};// ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso
int pos = 0;
int maxpos = 165;
int minpos = 15;
int initmaxpos = 2300; //2300
int initminpos = 700; //700
boolean StatusChanged[10] ={1,1,1,1,1,1,1,1,1,1};
boolean AStatusIsChanged = false;
int passo =1;
int sleepingTime = 10;
int LedBlinkTime = 15;
void setup() {
Serial.begin(9600);
servo1.attach(2,initminpos,initmaxpos);//1
servo2.attach(3,initminpos,initmaxpos);//2
servo3.attach(4,initminpos,initmaxpos);//3
servo4.attach(5,initminpos,initmaxpos);//4
servo5.attach(6,initminpos,initmaxpos);//5
servo6.attach(7,initminpos,initmaxpos);//6
servo7.attach(8,initminpos,initmaxpos);//7
servo8.attach(9,initminpos,initmaxpos);//8
servo9.attach(10,initminpos,initmaxpos);//9
//140616 start - dichiaro i pin dei led come output
pinMode(LED1,OUTPUT); //1
pinMode(LED2,OUTPUT); //2
pinMode(LED3,OUTPUT); //3
pinMode(LED4,OUTPUT); //4
pinMode(LED5,OUTPUT); //5
pinMode(LED6,OUTPUT); //6
pinMode(LED7,OUTPUT); //7
pinMode(LED8,OUTPUT); //8
pinMode(LED9,OUTPUT); //9
pinMode(LED1b,OUTPUT); //1b
pinMode(LED2b,OUTPUT); //2b
pinMode(LED3b,OUTPUT); //3b
pinMode(LED4b,OUTPUT); //4b
pinMode(LED5b,OUTPUT); //5b
pinMode(LED6b,OUTPUT); //6b
pinMode(LED7b,OUTPUT); //7b
pinMode(LED8b,OUTPUT); //8b
pinMode(LED9b,OUTPUT); //9b
//140616 end
pinMode(RELAIS1,OUTPUT);
}
void loop() {
ReadButtons();
ManageStati();
ManageRelais();//280320
ManageServos();
ManageRelais();//280320
BlinkLed();
}
int getToPos(int LocStato){
if (LocStato == 0){
return maxpos;
}
else if (LocStato == 1) {
return minpos;
}
}
void ReadButtons(){
//leggo tutti i bottoni
val[1] = digitalRead(BUTTON1);
// 280320 bottone non più in uso val[2] = digitalRead(BUTTON2);
val[3] = digitalRead(BUTTON3);
val[4] = digitalRead(BUTTON4);
val[5] = digitalRead(BUTTON5);
val[6] = digitalRead(BUTTON6);
val[7] = digitalRead(BUTTON7);
val[8] = digitalRead(BUTTON8);
val[9] = digitalRead(BUTTON9);
}
void ManageStati(){
// controlla se è un tasto ha cambiato stato
if ((val[1] == HIGH) && (vecchio_val[1] == LOW)&& (millis() - time > debounce)){stato[1] = 1 - stato[1]; StatusChanged[1]=true;time = millis();}
vecchio_val[1]=val[1];
//if ((val[2] == HIGH) && (vecchio_val[2] == LOW)&& (millis() - time > debounce)){stato[2] = 1 - stato[2]; StatusChanged[2]=true;time = millis();}
//vecchio_val[2]=val[2];
stato[2] = stato[1];
StatusChanged[2] = StatusChanged[1];
if ((val[3] == HIGH) && (vecchio_val[3] == LOW)&& (millis() - time > debounce)){stato[3] = 1 - stato[3]; StatusChanged[3]=true;time = millis();}
vecchio_val[3]=val[3];
if ((val[4] == HIGH) && (vecchio_val[4] == LOW)&& (millis() - time > debounce)){stato[4] = 1 - stato[4]; StatusChanged[4]=true;time = millis();}
vecchio_val[4]=val[4];
if ((val[5] == HIGH) && (vecchio_val[5] == LOW)&& (millis() - time > debounce)){stato[5] = 1 - stato[5]; StatusChanged[5]=true;time = millis();}
vecchio_val[5]=val[5];
if ((val[6] == HIGH) && (vecchio_val[6] == LOW)&& (millis() - time > debounce)){stato[6] = 1 - stato[6]; StatusChanged[6]=true;time = millis();}
vecchio_val[6]=val[6];
//if ((val[7] == HIGH) && (vecchio_val[7] == LOW)&& (millis() - time > debounce)){stato[7] = 1 - stato[7]; StatusChanged[7]=true;time = millis();}
//vecchio_val[7]=val[7];
stato[7] = stato[6];
StatusChanged[7] = StatusChanged[6];
if ((val[8] == HIGH) && (vecchio_val[8] == LOW)&& (millis() - time > debounce)){stato[8] = 1 - stato[8]; StatusChanged[8]=true;time = millis();}
vecchio_val[8]=val[8];
if ((val[9] == HIGH) && (vecchio_val[9] == LOW)&& (millis() - time > debounce)){stato[9] = 1 - stato[9]; StatusChanged[9]=true;time = millis();}
vecchio_val[9]=val[9];
}
void ManageServos(){
if ((getToPos(stato[1]) == maxpos) && (StatusChanged[1] ==true)) { for (pos = minpos; pos <= maxpos; pos += passo) {servo1.write(pos);delay(sleepingTime);} StatusChanged[1] =false;}
if ((getToPos(stato[1]) == minpos) && (StatusChanged[1] ==true)) { for (pos = maxpos; pos >= minpos; pos -= passo) {servo1.write(pos);delay(sleepingTime);} StatusChanged[1] =false;}
if ((getToPos(stato[2]) == maxpos) && (StatusChanged[2] ==true)) { for (pos = minpos; pos <= maxpos; pos += passo) {servo2.write(pos);delay(sleepingTime);} StatusChanged[2] =false;}
if ((getToPos(stato[2]) == minpos) && (StatusChanged[2] ==true)) { for (pos = maxpos; pos >= minpos; pos -= passo) {servo2.write(pos);delay(sleepingTime);} StatusChanged[2] =false;}
if ((getToPos(stato[3]) == maxpos) && (StatusChanged[3] ==true)) { for (pos = minpos; pos <= maxpos; pos += passo) {servo3.write(pos);delay(sleepingTime);} StatusChanged[3] =false;}
if ((getToPos(stato[3]) == minpos) && (StatusChanged[3] ==true)) { for (pos = maxpos; pos >= minpos; pos -= passo) {servo3.write(pos);delay(sleepingTime);} StatusChanged[3] =false;}
if ((getToPos(stato[4]) == maxpos) && (StatusChanged[4] ==true)) { for (pos = minpos; pos <= maxpos; pos += passo) {servo4.write(pos);delay(sleepingTime);} StatusChanged[4] =false;}
if ((getToPos(stato[4]) == minpos) && (StatusChanged[4] ==true)) { for (pos = maxpos; pos >= minpos; pos -= passo) {servo4.write(pos);delay(sleepingTime);} StatusChanged[4] =false;}
if ((getToPos(stato[5]) == maxpos) && (StatusChanged[5] ==true)) { for (pos = minpos; pos <= maxpos; pos += passo) {servo5.write(pos);delay(sleepingTime);} StatusChanged[5] =false;}
if ((getToPos(stato[5]) == minpos) && (StatusChanged[5] ==true)) { for (pos = maxpos; pos >= minpos; pos -= passo) {servo5.write(pos);delay(sleepingTime);} StatusChanged[5] =false;}
if ((getToPos(stato[6]) == maxpos) && (StatusChanged[6] ==true)) { for (pos = minpos; pos <= maxpos; pos += passo) {servo6.write(pos);delay(sleepingTime);} StatusChanged[6] =false;}
if ((getToPos(stato[6]) == minpos) && (StatusChanged[6] ==true)) { for (pos = maxpos; pos >= minpos; pos -= passo) {servo6.write(pos);delay(sleepingTime);} StatusChanged[6] =false;}
if ((getToPos(stato[7]) == maxpos) && (StatusChanged[7] ==true)) { for (pos = minpos; pos <= maxpos; pos += passo) {servo7.write(pos);delay(sleepingTime);} StatusChanged[7] =false;}
if ((getToPos(stato[7]) == minpos) && (StatusChanged[7] ==true)) { for (pos = maxpos; pos >= minpos; pos -= passo) {servo7.write(pos);delay(sleepingTime);} StatusChanged[7] =false;}
if ((getToPos(stato[8]) == maxpos) && (StatusChanged[8] ==true)) { for (pos = minpos; pos <= maxpos; pos += passo) {servo8.write(pos);delay(sleepingTime);} StatusChanged[8] =false;}
if ((getToPos(stato[8]) == minpos) && (StatusChanged[8] ==true)) { for (pos = maxpos; pos >= minpos; pos -= passo) {servo8.write(pos);delay(sleepingTime);} StatusChanged[8] =false;}
if ((getToPos(stato[9]) == maxpos) && (StatusChanged[9] ==true)) { for (pos = minpos; pos <= maxpos; pos += passo) {servo9.write(pos);delay(sleepingTime);} StatusChanged[9] =false;}
if ((getToPos(stato[9]) == minpos) && (StatusChanged[9] ==true)) { for (pos = maxpos; pos >= minpos; pos -= passo) {servo9.write(pos);delay(sleepingTime);} StatusChanged[9] =false;}
}
void BlinkLed(){
//Accendo i led http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
if (stato[1] == 0) {digitalWrite(LED1, HIGH); digitalWrite(LED1b, LOW);}
if (stato[2] == 0) {digitalWrite(LED2, HIGH); digitalWrite(LED2b, LOW);}
if (stato[3] == 0) {digitalWrite(LED3, HIGH); digitalWrite(LED3b, LOW);}
if (stato[4] == 0) {digitalWrite(LED4, HIGH); digitalWrite(LED4b, LOW);}
if (stato[5] == 0) {digitalWrite(LED5, HIGH); digitalWrite(LED5b, LOW);}
if (stato[6] == 0) {digitalWrite(LED6, HIGH); digitalWrite(LED6b, LOW);}
if (stato[7] == 0) {digitalWrite(LED7, HIGH); digitalWrite(LED7b, LOW);}
if (stato[8] == 0) {digitalWrite(LED8, HIGH); digitalWrite(LED8b, LOW);}
if (stato[9] == 0) {digitalWrite(LED9, HIGH); digitalWrite(LED9b, LOW);}
if (stato[1] == 1) {digitalWrite(LED1b, HIGH); digitalWrite(LED1, LOW);}
if (stato[2] == 1) {digitalWrite(LED2b, HIGH); digitalWrite(LED2, LOW);}
if (stato[3] == 1) {digitalWrite(LED3b, HIGH); digitalWrite(LED3, LOW);}
if (stato[4] == 1) {digitalWrite(LED4b, HIGH); digitalWrite(LED4, LOW);}
if (stato[5] == 1) {digitalWrite(LED5b, HIGH); digitalWrite(LED5, LOW);}
if (stato[6] == 1) {digitalWrite(LED6b, HIGH); digitalWrite(LED6, LOW);}
if (stato[7] == 1) {digitalWrite(LED7b, HIGH); digitalWrite(LED7, LOW);}
if (stato[8] == 1) {digitalWrite(LED8b, HIGH); digitalWrite(LED8, LOW);}
if (stato[9] == 1) {digitalWrite(LED9b, HIGH); digitalWrite(LED9, LOW);}
delay(LedBlinkTime*8);
PrintStati();
}
void ManageRelais(){
//280320 creata funzione per gestione relais
AStatusIsChanged=false;
digitalWrite(RELAIS1, LOW);
Serial.print("Attivazione relais - ");
Serial.println(AStatusIsChanged);
for (int i = 1; i <= 9; i++) {if (StatusChanged[i] == true) {AStatusIsChanged=true;}}
if (AStatusIsChanged == true) {digitalWrite(RELAIS1, HIGH);}
Serial.print("Disattivazione relais - ");
Serial.println(AStatusIsChanged);
}
void PrintStati(){
Serial.print("Versione firmware 280320 - ");
Serial.print(stato[1]);
Serial.print(stato[2]);
Serial.print(stato[3]);
Serial.print(stato[4]);
Serial.print(stato[5]);
Serial.print(stato[6]);
Serial.print(stato[7]);
Serial.print(stato[8]);
Serial.println(stato[9]);
}