Arduino pendolo

Ciao a tutti, vi pongo il mio problema, purtroppo sono un po’ imbranato nella programmazione e ho un problema che non riesco a risolvere…vorrei costruire un pendolo mosso da un motore, il motore dovrebbe essere comandato da un relè (pilotato da un Arduino nano), vorrei che spingesse solo in un senso, (il ritorno è con la gravità) come encoder di posizione vorrei usare un banalissimo potenziometro. Su Arduino ho montato un Display LCD che mi serve per vedere i valori del potenziometro che inserisco nel programma per dare l’elevazione voluta al pendolo. Il programma che ho scritto fa partire il motore, il pendolo sale e si ferma all’elevazione voluta poi pero’ quando torna indietro per effetto della gravità, il motore mi riparte…

Questo è il codice che ho scritto:

# include <LiquidCrystal.h> //include la libreria per il funzionamento dell'lcd

#define MotPin 13  //Pin per il led/RELE che pilota il motore
//#define aspetta;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //settia le uscite di arduino per lcd
int PotPin6 = A6;     // inizializza il pin 6 analogico NON USATO
int PotPin7 = A7;     // inizializza il pin 7 analogico
int Pot6_valPls;     // il valPlsore che conterrà la lettura del potenziometro in A6 NON USATO
int Pot7_valPls;     // il valPlsore che conterrà la lettura del potenziometro in A7
float Pot6_valPls_A;    // il valPlsore conterrà la lettura potenziometro A6 moltiplicato x 10 NON USATO
float Pot7_valPls_A;    // il valPlsore conterrà la lettura potenziometro A7 moltiplicato x 10
int tempo=0 ;        // il valPlsore conterrà il valPlsore di durata del funzionamento del motore
int valPls = 0 ;         //    uso valPls per conservare lo stato del bottone start
int valSen = 0 ;         //    uso valPls per conservare lo stato del sensore
int sensorPS = 6;       // sensore posizione ampolla mercurio NON USATO
int libero = A0 ;       // a disposizione x altri programmi NON USATO
int STOP = A1  ;        // pulsante di stop (l'ho scritto in maiuscolo altrimenti ha un'altro significato) NON USATO
int start = A2 ;           // pulsante o telecomando start
int softstart = 0   ;             // lo uso per conservare lo stato softstart  
int statoMotore=0 ;
int ultimoStatoPot;
int StatoPot;

void setup() {
lcd.begin(16, 2); // setta del numero delle colonne e delle righe
pinMode(MotPin, OUTPUT);  //Dichiara il MotPin come OUTPUT
pinMode (start, INPUT_PULLUP);   // imposta il pulsante start come ingresso
pinMode (sensorPS, INPUT_PULLUP); //ingresso sensore posizione (ampolla mercurio)
pinMode (STOP, INPUT_PULLUP) ;  //  ingresso pulsante di STOP
ultimoStatoPot  = StatoPot;
}

void loop() {     // parte che visualizza sull'LCD
lcd.clear(); // pulisce lo schermo
valPls = digitalRead (start);   //leggo lo stato del pulsante start
if (valPls == HIGH) {             // se viene premuto il pulsante salta a else
lcd.print("Sistema spento"); // stampa della prima riga sull'lcd
lcd.setCursor(8, 0); // setta il cursore sulla PRIMA riga all'8 carattere
delay(10); // aspetta 50 millisecondi
tempo = 0 ;  // resetto il valPlsore di tempo
/////////////////// lettura encoder da visualizzare a sistema spento ////////////////
lcd.setCursor(0, 1); // setta il cursore sulla SECONDA riga all'8 carattere
lcd.print("Encoder"); // stampa della prima riga sull'lcd
Pot7_valPls = analogRead(PotPin7);  //inserisce il valPlsore della lettura potenzimetro A7
Pot7_valPls_A = Pot7_valPls * 2 ;    //  moltiplico x 10 il valPlsore letto del potenziometro
lcd.setCursor(8, 1); // setta il cursore sulla SECONDA riga all'8 carattere
//  lcd.print(Pot7_valPls_A/1000); // stampa del valPlsore del potenziometro in Secondi
lcd.print(Pot7_valPls_A); // stampa del valPlsore del potenziometro in Secondi
delay(50); // aspetta 1 secondo (1000 millesimi)

}
else
while (tempo<=120 ){
tempo++;

lcd.clear(); // pulisce lo schermo
lcd.print("Ciclo Avviato"); // stampa della prima riga sull'lcd
//  Pot6_valPls = analogRead(PotPin6);  //inserisce il valPlsore della lettura potenziometro A6
//  Pot6_valPls_A = Pot6_valPls * 5 ;    //  moltiplico x 5 il valPlsore letto del potenziometro
//  lcd.setCursor(8, 0); // setta il cursore sulla PRIMA riga all'8 carattere
//  lcd.print(Pot6_valPls_A/1000); // stampa in secondi del valPlsore del potenziometro A6 SPINTA

/////////  lettura encoder collegato in A7 a sistema accceso //////////////////

lcd.setCursor(0, 1); // setta il cursore sulla SECONDA riga all'8 carattere
lcd.print("Ritorno"); // stampa della prima riga sull'lcd
Pot7_valPls = analogRead(PotPin7);  //inserisce il valPlsore della lettura potenzimetro A7
Pot7_valPls_A = Pot7_valPls * 2 ;    //  moltiplico x 5 il valPlsore letto del potenziometro
lcd.setCursor(8, 1); // setta il cursore sulla SECONDA riga all'8 carattere
// lcd.print(Pot7_valPls_A/1000); // stampa del valPlsore del potenziometro in Secondi
lcd.print(Pot7_valPls_A); // stampa del valPlsore del potenziometro in Secondi
delay(150); // aspetta 1 secondo (1000 millesimi)

//  parte che esegue il pilotaggio uscita
//softstart++  ;
//switch (softstart) {   //  faccio vari confronti per fare softstart
// case 1:                // se è appena stato premuto il tasto start
//digitalWrite(MotPin, HIGH);  //Accende il MOTORE
//delay (200); 
//conta=1;


// if (statoMotore == 0){
if ( Pot7_valPls_A >=1100 && Pot7_valPls_A <=1400) {
digitalWrite(MotPin, HIGH);      // Accende il MOTORE
//   if (Pot7_valPls_A >=1400) {
//    digitalWrite(MotPin, LOW);
//    statoMotore=1;
//   }
//   statoMotore=0;
//   }
}


else {
//  if ( Pot7_valPls_A >=1400) {
digitalWrite(MotPin, LOW);      // Spegne il MOTORE 
statoMotore=0;
//}
}
}}
[/ code]

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Sezione errata, c’e’ anche scritto di non scrivere qui ma nelle sottosezioni.

:confused: scusate non volevo disturbare, ho provato a leggere un po' sul forum ma c'è da perderci una giornata intera..... si ho letto di non scrivere qui ma nelle sottoscrizione, pero' non ci sono riuscito... scusate ancora

@maramarco: come ti è già stato indicato, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO, inoltre, in conformità al suddetto regolamento, punto 7, edita (in basso a destra del post, bottone More → Modify) il tuo post e racchiudi il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

OK fatto!

… emmm … veramente NON vedo il codice racchiuso nei tag CODE :o

Guglielmo

va bene? :confused:

No. Devi editare il tuo post dove c’e’ il codice. Lo evidenzi tutto e poi premi il pulsante </>
Oppure metti ad inizio [ code] e alla fine [/ code] senza spazi, qui io li ho messi per farti vedere cosa scrivere
Inoltre nell’IDE usa CTRL+T che ti indenta il codice rendendolo più leggibile.

Inoltre sarebbe meglio tu postassi SOLO il codice che usi, e togliere i 6Kg di parti del codice commentate.

Poi, più info. Non siamo li con te a vedere la cosa. Dal codice mi pare il pulsante sia a logica inversa, quando lo premi è LOW ? Queste sono info che DEVI dare. Magari una foto del tutto. Ma quanti potenziometri hai ? Uno per sapere di quanto alzarlo e l'altro come encoder ?

Ma nel programma è nel else che avvia il motore ? E sta dentro a un while che conta tempo da 0 a 120 ? Con dentro al tutto un delay(150) 150*120=> 18000 => 18 secondi !! A che cosa serve ? Se hai un encoder, quando il motore è arrivato alla posizione voluta... lo spegni. E' un while ma non fisso da 0 a 120 ma in base alla posizione del pendolo/encoder

si, quando premo il pulsante va LOW, da li dovrebbe iniziare il ciclo, quello che vorrei fare è questo: il motore dovrebbe partire "dolcemente" per muovere il pendolo, alzandolo di pochi gradi e gradualmente aumentare l'alzata fino ai gradi impostati nel programma. Il while l'ho messo per dare un "tempo" di funzionamento del pendolo....

mi sono dimenticato di dire che uso solo un potenziometro, che uso come encoder

sto provando con questo codice, mi sembrava la soluzione al mio problema pero’ si è dimostrato un fallimento, il rele interviene alle varie soglie pero’ continua aeccistari e diseccitarsi… help

      //  parte che esegue il pilotaggio uscita

      if (softstart <= 7) softstart = softstart + 1;
      else softstart = 0;

      switch (softstart) {   //  faccio vari confronti

        case 1:                // se è appena stato premuto il tasto start
          if (Pot7_valPls_A >= 1100) {       // se il potenziometro legge un valore superiore a quello impostato
            digitalWrite(MotPin, HIGH);   // Accende il MOTORE
          }
          break;

        case 2: {
            if (Pot7_valPls_A >= 1400) {
              digitalWrite(MotPin, LOW);      // Spegne il MOTORE

            }
            break;

          case 3:                //  ritorno del pendolo
            if (Pot7_valPls_A <= 2000) {       // se il potenziometro legge un valore superiore a quello impostato
              digitalWrite(MotPin, LOW);   // Spegne il MOTORE
            }
            break;

          case 4: {
              if (Pot7_valPls_A >= 1100) {         // riprende il ciclo
                digitalWrite(MotPin, HIGH);      // Accende il MOTORE
              }
              break;





            case 5: {
                if (Pot7_valPls_A >= 1400) {
                  digitalWrite(MotPin, LOW);      // Spegne il MOTORE

                }
                break;

              case 6:                //  ritorno del pendolo
                if (Pot7_valPls_A <= 2000) {       // se il potenziometro legge un valore superiore a quello impostato
                  digitalWrite(MotPin, LOW);   // Spegne il MOTORE
                }
                break;

              case 7: {
                  if (Pot7_valPls_A >= 1100) {         // riprende il ciclo
                    digitalWrite(MotPin, HIGH);      // Accende il MOTORE
                  }
                  break;





                }
              }
            }
          }
      }
    }
}

Ho risolto, grazie per la collaborazione...