Go Down

Topic: Progetto ascensore (Read 255 times) previous topic - next topic

Roger23

Devo realizzare un progetto per scuola con arduino, la mia scelta è caduta sul comandare un ascensore, con piano terra, primo piano e secondo piano con relativi pulsanti di chiamata e finecorsa per ogni piano.  L'ascensore è mosso da un motore DC a 12 V controllato da un LN298N. Detto questo il problema sorge quando dopo aver scritto il codice in arduino e montato i componenti ed avviato il tutto non succede NULLA. Ho chiesto aiuto ai professori ma è stato tutto vano e purtroppo dopo molti tentativi mi trovo sempre con nulla che funzioni. Vi voglio allegare il codice e spero in una vostra risposta che possa sistemare il tutto! Un grazie in anticipo a chiunque voglia aiutare un maturando in difficoltà.


Code: [Select]
//VARIABILI//
byte aa ;
byte Piano = 0; //Piano attuale
byte Piano_chiamato = 0; // Piano chiamato

//TASTI//
const byte TPT = 2; // Tasto piano terra
const byte TP1 = 3; // Tasto piano 1
const byte TP2 = 4; // Tasto piano 2

// FINECORSA//
#define Finec_PT  5    // Finecorsa piano terra
#define Finec_P1  9   // Finecorsa piano 1
#define Finec_P2  6    // Finecorsa piano 2

// MOTORE

const int controlPin1 = 12;                    //costanti di riferimento 
const int controlPin2 = 13;                    //ai pin   
static int pinPotenza = 11;                    //pin digitale tramite il quale inviare un segnale di tipo PWM tramite la funzione analgWrite()

void setup() {
  Serial.begin(9600);
  pinMode(TPT, INPUT);
  pinMode(TP1, INPUT);
  pinMode(TP2, INPUT);
  pinMode(Finec_PT, INPUT);
  pinMode(Finec_P1, INPUT);
  pinMode(Finec_P2, INPUT);
  pinMode(pinAcceleratore, INPUT);            //input in quanto legge il valore analogico del pin A0
  pinMode(pinPotenza, OUTPUT);                //output perche' definisce il valore PWM del pin EN1 del modulo L298N
  digitalWrite(accendiMotore, LOW);           //inizialmente il motore sarà spento
 
                                              // le prossime due righe servono per il posizionamento iniziale

  controllo_piano();
  Piano_chiamato = Piano ;
}


void loop( )
{
  controllo_piano();
  pulsanti();                                           // controlal chi ha chiamato

  switch (Piano_chiamato) {
    case 0 :                                            // chiamata dal primo piano
      aa = Finec_PT ;
      break;
    case 1:                                             // chiamata dal secondo piano
      aa = Finec_P1 ;
      break;
    case 2:                                             // chiamata dal secondo piano
      aa = Finec_P2 ;
      break;
  }
 
  if (Piano_chiamato > Piano)                           // La cabina è sotto la destinazione
  {
    while ( digitalRead(aa) != HIGH ) {

      digitalWrite(controlPin1, HIGH); 
      digitalWrite(controlPin2, LOW); 
     
      // motore gira in senso orario

    }
  }
  else if (Piano_chiamato < Piano) // La cabina è sopra la destinazione
  {
    while ( digitalRead(aa) != HIGH ) {

      digitalWrite(controlPin1, LOW); 
      digitalWrite(controlPin2, HIGH); 
       

      // motore gira in senso Anti-orario

    }
  }
}

void pulsanti() {
  if (digitalRead(TPT) == HIGH) // Controlla se il piano da cui è stato chiamato l'ascensore è il Piano 0
  {
    Piano_chiamato = 0; // Si è stato chiamato dal Piano 0
  }
  else if (digitalRead(TP1) == HIGH) // Controlla se il piano da cui è stato chiamato l'ascensore è il Piano 1
  {
    Piano_chiamato = 1; // Si è stato chiamato dal Piano 1
  }
  else if (digitalRead(TP2) == HIGH) // Controlla se il piano da cui è stato chiamato l'ascensore è il Piano 2
  {
    Piano_chiamato = 2; // Si è stato chiamato dal Piano 2
  }
}

void controllo_piano() {
  //CONTROLLO PIANO ATTUALE//
  if (digitalRead(Finec_PT) == HIGH) // Controllo del finecorsa del Piano 0
  {
    Piano = 0 ; // Si è il piano terra
  }
  else if (digitalRead(Finec_P1) == HIGH) // Controllo del finecorsa del Piano 1
  {
    Piano = 1 ; // Si è il primo piano
  }
  else if (digitalRead(Finec_P2) == HIGH) // Controllo del finecorsa del Piano 2
  {
    Piano = 2 ; // Si è il secondo piano
  }
}

gpb01

Buongiorno e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando 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, NON 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 generali utili: Link Utili
Search is Your friend ... or I am Your enemy !

Etemenanki

Non sono un programmatore, quindo vado a naso ...

Definisci const int due variabili, controlPin1 e controlPin2, ma poi nel setup non mi sembra di vedere definiti i rispettivi pin come output ... inoltre quel digitalWrite(accendiMotore, LOW), cosa attiva, visto che non mi sembra di vedere definito neppure un pin corrispondente ad "accendiMotore" ? ...

... per ora mi fermo qui ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

-zef-

visto che non funziona nulla al tuo posto proverei almeno un minimo di programma per far girare il motore nei due sensi, poi usando il serialmonitor a vedere se premendo a mano pulsanti e finecorsa dei vari piani ottengo quello che mi aspetto e infine inizierei a far funzionare il tutto insieme.

Altra cosa... i pin usati come input devono avere una resistenza di pullup o pulldown oppure abilitarla direttamente da arduino con pinMode(TPT, INPUT_PULLUP);

Go Up