Per il cubo sto usando un motore per saracinesca ridotto comandato da due relè con comune neutro e uno per avanti ed uno per indietro.
i rele' sono sempre gli stessi di un Modulo rele' ?
Perche' si attivano con LOW e quindi qui e' errato, vanno invertiti i LOW ed HIGH
Specialmente il motore_cubo_stop, visto che invece di spegnerli li attivi tutti e due
void motore_cubo_avanti() {
digitalWrite(MCA, HIGH);
digitalWrite(MCI, LOW);
}
void motore_cubo_indietro() {
digitalWrite(MCA, LOW);
digitalWrite(MCI, HIGH);
}
void motore_cubo_stop() {
digitalWrite(MCA, LOW);
digitalWrite(MCI, LOW);
}
in questa parte
// attivare cubo
Serial.println("Inizia primo step Cubo");
motore_cubo_indietro();
while (digitalRead(FC1) == HIGH ){
if (digitalRead(FC2) == 0)
{
stato_errore = true;
break;
}
}
Và sempre in errore , perchè sei posizionato su un finecorsa, quello di partenza ( e poi hai invertito FC1 con FC2) e quindi anche se avvii il motore, il sensore e' ancora attivato.
Se ci fai caso, ad esempio al primo step pedana
while (digitalRead(FP2) == HIGH ) {
if (digitalRead(FP3) == 0 || digitalRead(FP4) == 0 || digitalRead(FPR) == 0 )
{
il motore è posizionato su FP1, quindi con il while controllo se e' arrivato a FP2 e nell'if nota che non c'è il controllo sul finecorsa in cui sei ( FP1).
La parte di controllo nell'if, in teoria potresti anche toglierla, ma serve se ad esempio un finecorsa non scatta ( potrebbe anche essersi sganciato ), in quel caso si blocca il tutto.
Una cosa non ho capito, quando è che deve partire il motore del cubo ?
comunque ecco lo sketch rivisto
# define FP1 2 //Finecorsa1 pedana
# define FP2 3 //Finecorsa2 pedana
# define FP3 4 //Finecorsa3 pedana
# define FP4 5 //Finecorsa4 pedana
# define FPR 6 //Finecorsa pedana RITORNO
# define MPA 9 //Relè Motore avanti pedana
# define MPI 10 //Relè Motore indietro pedana
# define FC1 8 //Finecorsa1 cubo
# define FC2 7 //Finecorsa2 cubo
# define MCA 11 //Relè Motore avanti cubo
# define MCI 12 //Relè Motore indietro cubo
boolean stato_errore = false ;
unsigned int ritardo = 5000 ; // tempo in cui pedana stà ferma
void setup()
{
Serial.begin (9600);
pinMode(FP1, INPUT_PULLUP); // sensore posizione iniziale
pinMode(FP2, INPUT_PULLUP);
pinMode(FP3, INPUT_PULLUP);
pinMode(FP4, INPUT_PULLUP);
pinMode(FPR, INPUT_PULLUP);
pinMode(MPA, OUTPUT);
pinMode(MPI, OUTPUT);
pinMode(FC1, INPUT_PULLUP);
pinMode(FC2, INPUT_PULLUP);
pinMode(MCA, OUTPUT);
pinMode(MCI, OUTPUT);
motore_pedana_stop();
Serial.println("inizia fino alla posizione di Start");
reset_pedana(); // il motore va' fino a posizione di Start
motore_cubo_stop();
Serial.println("Inizia cubo fino alla posizione di Start");
reset_cubo(); //Il motore sposta il cubo fino alla posizione di Start
}
void loop() {
// 1° Step *************************************
Serial.println("Inizia Primo Step");
motore_pedana_avanti() ;
while (digitalRead(FP2) == HIGH ) {
if (digitalRead(FP3) == 0 || digitalRead(FP4) == 0 || digitalRead(FPR) == 0 )
{
stato_errore = true ;
break ;
}
}
motore_pedana_stop();
if (stato_errore)
{
errore_sensori();
}
Serial.println("finito Primo Step");
// attivare cubo
Serial.println("Inizia primo step Cubo");
while (digitalRead(FC2) == HIGH ) {
motore_cubo_indietro();
}
motore_cubo_stop();
Serial.println("finito Primo Step Cubo");
delay(ritardo);
// attivare led
// 2° Step *************************************
Serial.println("Inizia Secondo Step");
motore_pedana_avanti() ;
while (digitalRead(FP3) == HIGH ) {
if (digitalRead(FP4) == 0 || digitalRead(FPR) == 0 || digitalRead(FP1) == 0 )
{
stato_errore = true ;
break ;
}
}
motore_pedana_stop();
if (stato_errore)
{
errore_sensori();
}
Serial.println("finito Secondo Step");
delay(ritardo);
// attivare cubo
Serial.println("Inizia Secondo Step Cubo");
motore_cubo_avanti() ;
while (digitalRead(FC1) == HIGH ) {
motore_cubo_avanti() ;
}
motore_cubo_stop();
Serial.println("finito Secondo Step Cubo");
delay(ritardo);
// attivare led
// 3° Step *************************************
Serial.println("Inizia Terzo Step");
motore_pedana_avanti() ;
while (digitalRead(FP4) == HIGH ) {
if (digitalRead(FPR) == 0 || digitalRead(FP1) == 0 || digitalRead(FP2) == 0 )
{
stato_errore = true ;
break ;
}
}
motore_pedana_stop();
if (stato_errore)
{
errore_sensori();;
}
Serial.println("finito Terzo Step");
// attivare cubo
Serial.println("Inizia Terzo Step Cubo");
while (digitalRead(FC2) == HIGH ) {
motore_cubo_indietro() ;
}
motore_cubo_stop();
Serial.println("finito Terzo Step Cubo");
delay(ritardo);
// attivare led
// 4° Step *************************************
Serial.println("Inizia Quarto Step");
motore_pedana_avanti() ;
while (digitalRead(FPR) == HIGH ) {
if (digitalRead(FP1) == 0 || digitalRead(FP2) == 0 || digitalRead(FP3) == 0 )
{
stato_errore = true ;
break ;
}
}
motore_pedana_stop();
if (stato_errore)
{
errore_sensori();
}
Serial.println("finito Quarto Step");
// attivare cubo
Serial.println("Inizia Quarto Step Cubo");
while (digitalRead(FC1) == HIGH ) {
motore_cubo_avanti() ;
}
motore_cubo_stop();
Serial.println("finito Quarto Step Cubo");
delay(ritardo);
// attivare led
// fine del ciclo. Torna a posizione di Start
Serial.println();
Serial.println("Torna a Start e rincomincia");
reset_pedana();
// fine del ciclo. Torna a posizione di Start
Serial.println();
Serial.println("Rimani in posizione per ricominciare da start");
reset_cubo();
} // Fine LOOP ***************************
void errore_sensori() { // Se un sensore non richiesto si attiva
Serial.println();
Serial.println("Errore sui sensori");
// tone (pin_buzzer,frequenza); // Attiva un buzzer
while (1); // blocca tutto e aspetta un reset Hardware ( volendo si puo' inserire un Reset software)
}
void reset_pedana() {
while (digitalRead(FP1) == HIGH) { // legge sensore di posizione iniziale
motore_pedana_indietro(); // avvia motore indietro fino al sensore di posizione iniziale
}
Serial.println("finito reset. Posizionato su Start"); // esce dal while quando si attiva il sensore di posizione iniziale
motore_pedana_stop();
}
void reset_cubo() {
while (digitalRead(FC1) == HIGH) { // legge sensore di posizione iniziale
motore_cubo_indietro(); // avvia motore indietro fino al sensore di posizione iniziale
}
Serial.println("finito reset. Posizionato cubo su Start"); // esce dal while quando si attiva il sensore di posizione iniziale
motore_cubo_stop();
}
void motore_pedana_avanti() {
digitalWrite(MPA, LOW);
digitalWrite(MPI, HIGH);
}
void motore_pedana_indietro() {
digitalWrite(MPA, HIGH);
digitalWrite(MPI, LOW);
}
void motore_pedana_stop() {
digitalWrite(MPA, HIGH);
digitalWrite(MPI, HIGH);
}
void motore_cubo_avanti() {
digitalWrite(MCA, LOW);
digitalWrite(MCI, HIGH);
}
void motore_cubo_indietro() {
digitalWrite(MCA, HIGH);
digitalWrite(MCI, LOW);
}
void motore_cubo_stop() {
digitalWrite(MCA, HIGH);
digitalWrite(MCI, HIGH);
}