Arduino ponte H

Salve a tutti, sono un neofita. volevo sapere perchè in questo sketch non funziona la parte in cui il motore si ferma e riparte al contrario.

motore.ino (952 Bytes)

Buongiorno, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente [u]evitando[/u] di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, [u]NON[/u] necessariamente inerenti alla tua domanda: - serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - pinout delle varie schede by xxxPighi: Pinout - link [u]generali[/u] utili: Link Utili

… E cosa fa?

vorrei realizzare una casa in scala, e quel codice mi servirebbe per il cancello. Praticamente il pin 2 sarebbe il fine corsa, però è come se quel pezzo di codice non esistesse, facendo scattare il contatto del finecorsa non succede niente.

guarda ci sono alcune cose che non vanno benissimo, ma sono accettabili comunque se usi la formattazione automatica ti accorgi facilmente del problema il test sulla digitalread lo fai nelle graffe del test serial.available quindi NON viene eseguito se NON c'è un carattere dal leggere peccato che se ci fosse un carattere da leggere verrebbe letto subito quindi il test sulla digitalread nno verrebbe eseguito mai fai una bella cosa, metti la formattazione automatica e poi guarda i vari rientri, ti sarà chiaro dove spostare quel pezzo

PS troppi commenti stufani, ma almeno una descrizione di cosa fanno le varie uscite, del tipo pin3 avanti pin4 indietro pinpincopallo accende ventola.... senno' chi ti vuole aiutare cosa fa? indovina?

Ok ok grazie mille!!! per le dritte, son riuscito a farlo andare. :slight_smile:

allego lo sketch sistemato nel caso dovesse servire a qualcuno, è molto grezzo non ho inserito variabili ecc ma comunque non è lungo ed è tutto lì a portata di mano. Presto aggiungerò anche una fotocellula di sicurezza.

void setup()
{

  pinMode(2, INPUT);  //pin 2 = fine corsa (indietro)
  pinMode(5, INPUT);  //pin 5 = fine corsa (avanti)
  pinMode(3, OUTPUT); //pin 3 = 1A (ponte H)
  pinMode(4, OUTPUT); //pin 4 = 2A (ponte H)
  pinMode(9, OUTPUT); //pin 9 = enable (ponte H)

  //inizializzo il motore sempre spento
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(9, HIGH);
  //inizializzo il Serial monitor
  Serial.begin(9600);

}

void loop()
{

  if (digitalRead(2) == HIGH) { //se il cancello tocca il finecorsa (indietro) ferma il motore per 15 secondi e lo fa ripertire nel senso opposto chiudendo il cancello
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(9, HIGH);
    delay(15000);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(9, HIGH);
  }
  if (digitalRead(5) == HIGH) {  //se il cancello tocca il finecorsa (avanti) vuol dire che il cancello è chiuso e quindi il motore si ferma
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(9, HIGH);
  }
  //attendi un comando dalla serial
  if ( Serial.available())
  {
    byte DataRX = Serial.read();

    if (DataRX == 49)  //carattere 1 avvia il motore a SX, il cancello si apre
    {
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      digitalWrite(9, HIGH);
    }


    if (DataRX == 50)  //carattere 2 avvia il motore a DX, il cancello si chiude (ad esempio se aperto a mano)
    {
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      digitalWrite(9, HIGH);
    }


    if (DataRX == 48)  //Carattere 0 ferma il motore in caso di guasti o malfunzionamenti
    {
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
    }
  }
}

>Elmo23191: Il codice si racchiude nei tag CODE e NON nei tag QUOTE !!! Per questa volta ho corretto io, ma ricordatene per il futuro. Grazie.

Guglielmo

questo è il tuo programma scritto togliendo di mezzo i numeri dei pin…

byte fcIndietro = 2; //pin 2 = fine corsa (indietro)
byte fcAvanti = 5; //pin 5 = fine corsa (avanti)
byte hBridge1 = 3; //pin 3 = 1A (ponte H)
byte hBridge2 = 4; //pin 4 = 2A (ponte H)
byte hBridgeEn = 9; //pin 9 = enable (ponte H)

void setup() {
   pinMode(fcIndietro, INPUT);
   pinMode(fcAvanti, INPUT);
   pinMode(hBridge1, OUTPUT);
   pinMode(hBridge2, OUTPUT);
   pinMode(hBridgeEn, OUTPUT);

   //inizializzo il motore sempre spento
   digitalWrite(hBridge1, LOW);
   digitalWrite(hBridge2, LOW);
   digitalWrite(hBridgeEn, HIGH);
   //inizializzo il Serial monitor
   Serial.begin(9600);
}

void loop() {
   if (digitalRead(fcIndietro) == HIGH) { // se il cancello tocca il finecorsa (indietro)
      digitalWrite(hBridge1, LOW);        // ferma il motore per 15 secondi  
      digitalWrite(hBridge2, LOW);
      digitalWrite(hBridgeEn, HIGH);
      delay(15000);
      digitalWrite(hBridge1, LOW);        // e lo fa ripertire nel senso opposto chiudendo il cancello
      digitalWrite(hBridge2, HIGH);
      digitalWrite(hBridgeEn, HIGH);
   }
   if (digitalRead(fcAvanti) == HIGH) {   // se il cancello tocca il finecorsa (avanti) 
      digitalWrite(hBridge1, LOW);        // vuol dire che il cancello è chiuso e 
      digitalWrite(hBridge2, LOW);        // quindi il motore si ferma
      digitalWrite(hBridgeEn, HIGH);
   }
   
   //attendi un comando dalla serial
   if ( Serial.available()) {
      byte DataRX = Serial.read();

      if (DataRX == 49) {                 // carattere 1 avvia il motore a SX, il cancello si apre
         digitalWrite(hBridge1, HIGH);
         digitalWrite(hBridge2, LOW);
         digitalWrite(hBridgeEn, HIGH);
      }
      if (DataRX == 50) {                 // carattere 2 avvia il motore a DX, 
         digitalWrite(hBridge1, LOW);     // il cancello si chiude (ad esempio se aperto a mano)
         digitalWrite(hBridge2, HIGH);
         digitalWrite(hBridgeEn, HIGH);
      }
      if (DataRX == 48) {                 // Carattere 0 ferma il motore in caso 
         digitalWrite(hBridge1, LOW);     // di guasti o malfunzionamenti
         digitalWrite(hBridge2, LOW);
      }
   }
}

non ti sembra più leggibile?

e con un piccolo sforzo diventa così

byte fcIndietro = 2; //pin 2 = fine corsa (indietro)
byte fcAvanti = 5; //pin 5 = fine corsa (avanti)
byte hBridge1 = 3; //pin 3 = 1A (ponte H)
byte hBridge2 = 4; //pin 4 = 2A (ponte H)
byte hBridgeEn = 9; //pin 9 = enable (ponte H)

void setup() {
   pinMode(fcIndietro, INPUT);
   pinMode(fcAvanti, INPUT);
   pinMode(hBridge1, OUTPUT);
   pinMode(hBridge2, OUTPUT);
   pinMode(hBridgeEn, OUTPUT);

   //inizializzo il motore sempre spento
   digitalWrite(hBridge1, LOW);
   digitalWrite(hBridge2, LOW);
   digitalWrite(hBridgeEn, HIGH);
   //inizializzo il Serial monitor
   Serial.begin(9600);
}

void loop() {
   if (digitalRead(fcIndietro) == HIGH) { // se il cancello tocca il finecorsa (indietro)
      fermaCancello();                    // fermo motore
      delay(15000);                       // attendo 15 sec.
      chiudiCancello();                   // chiudo camcello
   }
   if (digitalRead(fcAvanti) == HIGH) {   // se il cancello tocca il finecorsa (avanti)
      fermaCancello();                    // ferma motore
   }

   //attendi un comando dalla serial
   if ( Serial.available()) {
      byte DataRX = Serial.read();

      if (DataRX == 49) {                 // carattere 1 avvia il motore a SX, il cancello si apre
         apriCancello();
      }
      if (DataRX == 50) {                 // carattere 2 avvia il motore a DX,
         chiudiCancello();             // il cancello si chiude (ad esempio se aperto a mano)
      }
      if (DataRX == 48) {                 // Carattere 0 ferma il motore in caso
         digitalWrite(hBridgeEn, LOW);    // di guasti o malfunzionamenti
         //                                  meglio togliere abilitazione hponte h
         //                                  si ripristina solo con reset arduino
         /*
         digitalWrite(hBridge1, LOW);
         digitalWrite(hBridge2, LOW);
         */
      }
   }
}

void apriCancello() {
   digitalWrite(hBridge1, HIGH);
   digitalWrite(hBridge2, LOW);
}
void chiudiCancello() {
   digitalWrite(hBridge1, LOW);
   digitalWrite(hBridge2, HIGH);
}
void fermaCancello() {
   digitalWrite(hBridge1, LOW);
   digitalWrite(hBridge2, LOW);
}

Elmo23191: Ok ok grazie mille!!!! per le dritte, son riuscito a farlo andare. :)

allego lo sketch sistemato nel caso dovesse servire a qualcuno, è molto grezzo non ho inserito variabili ecc ma comunque non è lungo ed è tutto lì a portata di mano. Presto aggiungerò anche una fotocellula di sicurezza

grazie a te per la condivisione

Ora provando a inserire la fotocellula mi sono imbattuto in questo dilemma, come faccio a mettere chiudiCancello come variabile? perchè nella funzione if il void chiudiCancello() non viene preso.

byte fcIndietro = 2; //pin 2 = fine corsa (indietro)
byte fcAvanti = 5; //pin 5 = fine corsa (avanti)
byte hBridge1 = 3; //pin 3 = 1A (ponte H)
byte hBridge2 = 4; //pin 4 = 2A (ponte H)
byte hBridgeEn = 9; //pin 9 = enable (ponte H)
byte fotoellula = 6; //pin 6 = fotocellula

void setup() {
  pinMode(fcIndietro, INPUT);
  pinMode(fcAvanti, INPUT);
  pinMode(hBridge1, OUTPUT);
  pinMode(hBridge2, OUTPUT);
  pinMode(hBridgeEn, OUTPUT);
  pinMode(fotocellula, INPUT);
  //inizializzo il motore sempre spento
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, LOW);
  digitalWrite(hBridgeEn, HIGH);
  //inizializzo il Serial monitor
  Serial.begin(9600);
}

void loop() {

  if (digitalRead(fotocellula) == HIGH) && digitalRead( ?? ? chiudiCancello ?? ? ) == HIGH) {  //se leggo che il cancello si sta chiudendo e la fotocellula viene interotta
    fermaCancello();  //fermo il cancello
    delay(6000);       //per 6 secondi 
    apriCancello();    //e lo faccio riaprire facendogli eseguire la funzione del finecorsa
  }


  if (digitalRead(fcIndietro) == HIGH) { // se il cancello tocca il finecorsa (indietro)
    fermaCancello();                    // fermo motore
    delay(15000);                       // attendo 15 sec.
    chiudiCancello();                   // chiudo camcello
  }
  if (digitalRead(fcAvanti) == HIGH) {   // se il cancello tocca il finecorsa (avanti)
    fermaCancello();                    // ferma motore
  }

  //attendi un comando dalla serial
  if ( Serial.available()) {
    byte DataRX = Serial.read();

    if (DataRX == 49) {                 // carattere 1 avvia il motore a SX, il cancello si apre
      apriCancello();
    }
    if (DataRX == 50) {                 // carattere 2 avvia il motore a DX,
      chiudiCancello();             // il cancello si chiude (ad esempio se aperto a mano)
    }
    if (DataRX == 48) {                 // Carattere 0 ferma il motore in caso
      digitalWrite(hBridgeEn, LOW);    // di guasti o malfunzionamenti
      //                                  meglio togliere abilitazione hponte h
      //                                  si ripristina solo con reset arduino
      /*
        digitalWrite(hBridge1, LOW);
        digitalWrite(hBridge2, LOW);
      */
    }
  }
}

void apriCancello() {
  digitalWrite(hBridge1, HIGH);
  digitalWrite(hBridge2, LOW);
}
void chiudiCancello() {
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, HIGH);
}
void fermaCancello() {
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, LOW);
}

leggi direttamente il piedino hBridge2 se è High significa che il cancello si sta chiudendo... digitalRead(hBridge2)

grazie mille, era una cosa scontatissima ma ero focalizzato sul void... comunque grazie mille :)

Salve a tutti ragazzi, ennesimo quesito. Perchè con questo codice il led lampeggia sempre e comunque? tra l'altro con una luce quasi nulla (il led non è rotto l'ho testato e funziona perfettamente).

byte fcIndietro = 2; //pin 2 = fine corsa (indietro)
byte fcAvanti = 5; //pin 5 = fine corsa (avanti)
byte hBridge1 = 3; //pin 3 = 1A (ponte H)
byte hBridge2 = 10; //pin 4 = 2A (ponte H)
byte hBridgeEn = 9; //pin 9 = enable (ponte H)
byte fotocellula = 6; //pin 6 = fotocellula
byte ledSegnalazione = 4; //pin 4 = led di stato funzionamento cancello
unsigned long previousMillis = 0;
const long interval = 1000;
int ledState = LOW;

void setup() {
  pinMode(fcIndietro, INPUT);
  pinMode(fcAvanti, INPUT);
  pinMode(hBridge1, OUTPUT);
  pinMode(hBridge2, OUTPUT);
  pinMode(hBridgeEn, OUTPUT);
  pinMode(fotocellula, INPUT);
  //inizializzo il motore sempre spento
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, LOW);
  digitalWrite(hBridgeEn, HIGH);
  //inizializzo il Serial monitor
  Serial.begin(9600);
}

void loop() {
  if ((digitalRead(hBridge1) == HIGH && (digitalRead(hBridge2)) == LOW )); { //mentre il cancello si apre
    ledFunzionamento();                                                     //faccio lampeggiare il led
  }
  if ((digitalRead(hBridge1) == LOW && (digitalRead(hBridge2)) == HIGH )); { //mentre il cancello si chiude
    ledFunzionamento();                                                     //faccio lampeggiare il led
  }
  if ((digitalRead(fotocellula) == HIGH) && (digitalRead(hBridge2) == HIGH)) {  //se leggo che il cancello si sta chiudendo e la fotocellula viene interotta
    fermaCancello();  //fermo il cancello
    delay(6000);       //per 6 secondi
    apriCancello();    //e lo faccio riaprire facendogli eseguire la funzione del finecorsa
  }


  if (digitalRead(fcIndietro) == HIGH) { // se il cancello tocca il finecorsa (indietro)
    fermaCancello();                    // fermo motore
    delay(15000);                       // attendo 15 sec.
    chiudiCancello();                   // chiudo camcello
  }
  if (digitalRead(fcAvanti) == HIGH) {   // se il cancello tocca il finecorsa (avanti)
    fermaCancello();                    // ferma motore
  }

  //attendi un comando dalla serial
  if ( Serial.available()) {
    byte DataRX = Serial.read();

    if (DataRX == 49) {                 // carattere 1 avvia il motore a SX, il cancello si apre
      apriCancello();
    }
    if (DataRX == 50) {                 // carattere 2 avvia il motore a DX,
      chiudiCancello();             // il cancello si chiude (ad esempio se aperto a mano)
    }
    if (DataRX == 48) {

      digitalWrite(hBridge1, LOW);  // Carattere 0 ferma il motore in caso
      digitalWrite(hBridge2, LOW);  // di guasti o malfunzionamenti

    }
  }
}

void apriCancello() {
  digitalWrite(hBridge1, HIGH);
  digitalWrite(hBridge2, LOW);
}
void chiudiCancello() {
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, HIGH);
}
void fermaCancello() {
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, LOW);
}
void ledFunzionamento() {

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledSegnalazione, ledState);
  }
}

per prima cosa devi fare la pinmode del pin che usi per il led poi vediamo se lampeggia ancora

ah già è vero, aggiustato questo accorgimento il funzionamento del cancello è corretto ma il led rimane perennamente acceso dall'accensione dell'arduino.

EDIT: il led si accende appena parte il motore ma rimane acceso senza lampeggiare.

byte fcIndietro = 2; //pin 2 = fine corsa (indietro)
byte fcAvanti = 5; //pin 5 = fine corsa (avanti)
byte hBridge1 = 3; //pin 3 = 1A (ponte H)
byte hBridge2 = 10; //pin 4 = 2A (ponte H)
byte hBridgeEn = 9; //pin 9 = enable (ponte H)
byte fotocellula = 6; //pin 6 = fotocellula
byte ledSegnalazione = 4; //pin 4 = led di stato funzionamento cancello
unsigned long previousMillis = 0;
const long interval = 1000;
int ledState = LOW;

void setup() {
  pinMode(fcIndietro, INPUT);
  pinMode(fcAvanti, INPUT);
  pinMode(hBridge1, OUTPUT);
  pinMode(hBridge2, OUTPUT);
  pinMode(hBridgeEn, OUTPUT);
  pinMode(fotocellula, INPUT);
  pinMode(ledSegnalazione, OUTPUT);
  //inizializzo il motore sempre spento
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, LOW);
  digitalWrite(hBridgeEn, HIGH);
  //inizializzo il Serial monitor
  Serial.begin(9600);
}

void loop() {

  if ((digitalRead(fotocellula) == HIGH) && (digitalRead(hBridge2) == HIGH)) { //se leggo che il cancello si sta chiudendo e la fotocellula viene interotta
    fermaCancello();                                                           //fermo il cancello
    delay(6000);                                                               //per 6 secondi
    apriCancello();                                                            //e lo faccio riaprire facendogli eseguire la funzione del finecorsa
  }


  if (digitalRead(fcIndietro) == HIGH) {                                       // se il cancello tocca il finecorsa (indietro)
    fermaCancello();                                                           // fermo il motore
    delay(15000);                                                              // attendo 15 sec.
    chiudiCancello();                                                          // chiudo camcello
  }
  if (digitalRead(fcAvanti) == HIGH) {                                         // se il cancello tocca il finecorsa (avanti)
    fermaCancello();                                                           // ferma motore
  }

  //attendi un comando dalla serial
  if ( Serial.available()) {
    byte DataRX = Serial.read();

    if (DataRX == 49) {                                                        // carattere 1 avvia il motore a SX, il cancello si apre
      apriCancello();
    }
    if (DataRX == 50) {                                                        // carattere 2 avvia il motore a DX,
      chiudiCancello();                                                        // il cancello si chiude (ad esempio se aperto a mano)
    }
    if (DataRX == 48) {

      digitalWrite(hBridge1, LOW);                                            // Carattere 0 ferma il motore in caso
      digitalWrite(hBridge2, LOW);                                            // di guasti o malfunzionamenti

    }
    if ((digitalRead(hBridge1) == HIGH)); {                                   //mentre il cancello si apre
      ledFunzionamento();                                                     //faccio lampeggiare il led
    }
    if ((digitalRead(hBridge2) == HIGH)); {                                   //mentre il cancello si chiude
      ledFunzionamento();                                                     //faccio lampeggiare il led
    }
  }
}

void apriCancello() {
  digitalWrite(hBridge1, HIGH);
  digitalWrite(hBridge2, LOW);
}
void chiudiCancello() {
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, HIGH);
}
void fermaCancello() {
  digitalWrite(hBridge1, LOW);
  digitalWrite(hBridge2, LOW);
}
void ledFunzionamento() {

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledSegnalazione, ledState);
  }
}

Beh, mi sembra strano, ma comunque se ci pensi bene c’è un’altro problema:
se il cancello si ferma e il motore si spegne col led acceso, chi lo spegne?

già, non esiste una funzione per il quale il led lampeggia durante il funzionamento del motore? ad esempio if ((hBridge1) == HIGH) { void ledFunzionamento ();}

metti la ledfunzionamento() senza alcuna condizione nella loop() in questa maniera lampeggia sempre (provare per avre conferma) dopo che hai provato (e "non provi" è un caso che NON esiste) modifichi la ledfunzionamento in maniera che il test sia li, non fuori

okk, mettendo ledFunzionamento() nelm loop() funziona, cioè il led lampeggia sempre, ora però devo adattarlo al motore Edit: ha un comportamento strano perchè appena il finecorsaindietro viene innescato il led si ferma sullo stato in cui è, e questo succede anche con l'interruzione da fotocellula.