Codice comando montacarichi a 3 piani

Ciao a tutti Sto facendo un progetto ... Sto costruendo un montacarichi a 3 piani (modellino) e vorrei comandarlo utilizzando arduino, io ho lo schema elettrico e so farlo con la logica cablata, però non so come convertirlo in logica programmabile.... Cerco di sipegare qua in poche righe il funzionamento: Abbiamo 3 pulsanti, 1 per paino 3 sensori magnetici che rilevano la presenza al piano Quando arriva al piano il sensore magnetico si attiva e quindi il motore si ferma... Dovrei quindi trovare anche un modo per gestire l'inversione del motore,

Ora veniamo al punto ... Non so come gestire questo problema con il codice, Avevo pensato ad usare gli if , però non so come gestire cosi tante possibilita che possOno accadere.

In attesa di una vostra risposta, Un saluto Edoardo

Ciao, premettendo che un montacarichi dovrebbe essere più semplice di un ascensore, nel senso che potrebbe non avere un sistema di “prenotazione piano” sistemi di sicurezza porta “fotocellule” o tutto il sistema necessario ad un ascensore.

Se lo sai fare a “logica cablata”, sai anche programmare un microcontrollore per risolvere il problema, ma probabilmente in maniera inconscia, e quindi non sei consapevole di avere la soluzione nella tua mente :slight_smile:

Per un sistema basilare “elementare” che alla pressione di un pulsante il montacarichi si sposti al piano voluto, penserei a qualcosa del genere.

Questo è solo un esempio, ci saranno sicuramente errori e bisogna correggerlo e modificarlo, solo per farti vedere la LOGICA che pensavo.

int piano=0;
int posizione=1;

#define Puno 4 //P pulsante
#define Pdue 5
#define Ptre 6
#define Suno 7 // S sensore 
#define Sdue 8
#define Stre 9

void setup(){
    pinMode(Puno,INPUT);
	pinMode(Pdue,INPUT);
	pinMode(Ptre,INPUT);
    pinMode(Suno,INPUT);
	pinMode(Sdue,INPUT);
	pinMode(Stre,INPUT);



}

void loop(){
  
  if(digitalRead(Puno)==HIGH){
       piano=1;
	   delay(200);
  }
  else if(digitalRead(Pdue)==HIGH){
       piano=2;
	   delay(200);
  }
  else if(digitalRead(Ptre)==HIGH){
       piano=3;
	   delay(200);
  }

  else 
       piano=0;
	   
  if(piano!=0){
  

       Move(piano);

  }
  
}//End loop

void Move(int piano){

    int sensore=0;
	switch(piano){
	
	    case 1:
		    sensore=Suno;
			break;
	    case 2:
		    sensore=Sdue;
			break;
	    case 3:
		    sensore=Stre;
	}
	
	while(digitalRead(sensore)!=HIGH){
	
	
	    if(piano<posizione){
		    
			Scendi();
		
		}
		else if(piano>posizione){
		
		    Sali();
		
		}
	
	}
   
    Stop();
    posizione=piano;
}

/*Pensavo che le funzioni Sali() Scendi() agissero su un rel� che aziona il motore*/

void Sali(){

     digitalWrite(1,HIGH);//da modificare 

}

void Scendi(){

     digitalWrite(1,HIGH); //da modificare


}


void Stop(){

}

@Gambedus: Nonostante i tuoi 15 post non Ti sei ancora presentato quindi Ti invitiamo a presentarti QUI (dicci quali conoscenze hai di elettronica e di programmazione) e a leggere il regolamento QUI se non lo hai già fatto.

La presentazione è una questione di cortesia nei confronti degli altri frequentatori del forum e serve a chi ti vuole aiutare a capire con chi stà interagendo.

Comunque benvenuto sul forum.

Attilio

@Gambedus: Non solo, ma, nelle sezioni di lingua Inglese si può scrivere SOLO in Inglese, mentre ho visto vari tuoi post in Italiano. Questo non è permesso.

Guglielmo

Mi scuso con @gpb01 ... Non lo sapevo, e anche con @ultimo_53 ... Fatto.

Ringrazio @torn24 ... come farlo funzionare lo sapevo fare .. però non sapevo come programmare, in quanto sono uno studente di meccanica e meccatronica ... su questo mi hai aiutato te, e te ne sono grato.

Quando ho due minuti di tempo provo e ti faccio sapere. Grazie 1000 Buona giornata Edo

torn24: Ciao, premettendo che un montacarichi dovrebbe essere più semplice di un ascensore, nel senso che potrebbe non avere un sistema di "prenotazione piano" sistemi di sicurezza porta "fotocellule" o tutto il sistema necessario ad un ascensore.

Se lo sai fare a "logica cablata", sai anche programmare un microcontrollore per risolvere il problema, ma probabilmente in maniera inconscia, e quindi non sei consapevole di avere la soluzione nella tua mente :)

Per un sistema basilare "elementare" che alla pressione di un pulsante il montacarichi si sposti al piano voluto, penserei a qualcosa del genere.

Questo è solo un esempio, ci saranno sicuramente errori e bisogna correggerlo e modificarlo, solo per farti vedere la LOGICA che pensavo.

Ciao ti ringrazio per avermi dedicato del tempo, ho provato a guardare il codice e anche a me sembra giusto, ora lo ho personalizzato con i miei ingressi e uscite e le varie denominazioni.

Ti faro sapere se funziona in pratica, per comandare un motore dc pensavo di utilizzare un modulo rele, secondo te è una bella idea, funziona?

per comandare un motore dc pensavo di utilizzare un modulo rele, secondo te è una bella idea, funziona?

Per funzionare, funziona. Solo che di relè , se vuoi fare anche l'inversione di marcia. ne servono almeno due. Oppure un Relè e un transistor ( o Mosfet )

Ciao a tutti, usando il codice che mi avevate postato prima non ottenevo il risultato desiderato, brutalmente io ho provato a fare questo

#define Puno 3 //P pulsante
#define Pdue 5

#define Suno 7 // S sensore 
#define Sdue 9
#define led 13
#define led2 12
void setup() {
  pinMode(Puno, INPUT);
  pinMode(Pdue, INPUT);

  pinMode(Suno, INPUT);
  pinMode(Sdue, INPUT);

  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);



}

void loop() {

  if (digitalRead(Puno) == HIGH) {
    digitalWrite(12, HIGH);
    digitalWrite(13, LOW);
    delay(200);
  }
  else if (digitalRead(Pdue) == HIGH) {
    digitalWrite(13, HIGH);
    digitalWrite(12, LOW);
    delay(200);
  }
  else if (digitalRead(Sdue) == HIGH) {
    digitalWrite(13, LOW);
    delay(200);
  }
  {

    if (digitalRead(Suno) == HIGH) {
      digitalWrite(12, LOW);
      delay(200);
    }
  }
  if (digitalRead(Suno) == HIGH) {
    digitalWrite(12, LOW);

    delay(200);
  }
}

E per funzionare funziona, mi rimane solo un problema da risolvere, innanzitutto questo è per gestire 2 piani, ora devo capire come implemetare il 3°. L'altro problema riguarda il fatto che se premo il pulsante di chiamata di un piano mentre va cambia il moto, mi spiego se sta salendo e io premo il pulsante a piano terra questo inverte il motore e scende, io invece vorrei che continuasse a salire e "ignora" il comando. COme posso fare? Grazie in anticipo Ciao Edoardo

#define Puno 3 //P pulsante
#define Pdue 5
#define Ptre 6
#define Suno 7 // S sensore 
#define Sdue 9
#define Stre 1
#define led 13
#define led2 12

void setup() {
  pinMode(Puno, INPUT);
  pinMode(Pdue, INPUT);

  pinMode(Suno, INPUT);
  pinMode(Sdue, INPUT);

  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  Serial.begin(9600);


}

void loop() {

  if (digitalRead(Puno) == HIGH) {
    digitalWrite(12, HIGH);    //discesa
    digitalWrite(13, LOW);     //salita
    delay(200);
    Serial.println("P1");
  }
  if (digitalRead(Pdue) == HIGH) (digitalRead(Suno) == HIGH) {
    digitalWrite(12, HIGH); //salita 
    digitalWrite(13, LOW);
    delay(200);
    Serial.println("P2 salita");
  }
  if (digitalRead(Pdue) == HIGH)(digitalRead(Stre) == HIGH) {
    digitalWrite(13, HIGH); //discesa
    digitalWrite(12, LOW);
    delay(200);
    Serial.println("P2 dicesa");
  }
  if (digitalRead(Ptre) == HIGH) {
    digitalWrite(13, HIGH); //discesa
    digitalWrite(12, LOW);
    delay(200);
    Serial.println("P3");
  }
  else if (digitalRead(Suno) == HIGH) {
    digitalWrite(12, LOW);
    delay(200);
    Serial.println("S1");
  }
else if (digitalRead(Sdue) == HIGH) {
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
    delay(200);
    Serial.println("S2");
  }
  else if (digitalRead(Stre) == HIGH) {
    digitalWrite(13, LOW);
    delay(200);
    Serial.println("S3");
  }
}

Ho implementato la parte relativa al 3 piano, pero da quanto ho capito io mi da un errore che manca un punto e virgola che non riesco a trovare dove ... metto qua l'errore, so che mi saprete aiutare .. non so piu dove sbattere la testa ... grazie che ci siete voi.!! :)

Arduino:1.6.5 (Windows 7), Scheda:"Arduino/Genuino Uno"

sketch_mar02a.ino: In function 'void loop()':
sketch_mar02a:33: error: expected ';' before '{' token
sketch_mar02a:39: error: expected ';' before '{' token
expected ';' before '{' token

  Questo report potrebbe essere più ricco
di informazioni con
  "Mostra un output dettagliato durante la compilazione"
  abilitato in "File > Impostazioni"

Cosa sono istruzioni tipo questa ? ? ? :o

if (digitalRead(Pdue) == HIGH) (digitalRead(Suno) == HIGH) {

... che operatore logico vuoi tra le due condizioni ? Ce lo devi mettere !

Guglielmo

Ciao Guglielmo, Grazie per le risposta ... Sinceramente non saprei cosa metterci, provo a spiegartia cosa io pensavo servisse:

Io voglio che si attivi il movimento di salita quando premo il pulsante due e quando il sensore uno è attivo, in questo caso si attiverà il PIN 12. Che operatore va messo?

Grazie Buona serata Edo

Lo hai detto tu :) ... ... vuoi CONDIZIONE_1 E CONDIZIONE_2 ... E in inglese diventa AND quindi ... devi mettere un AND logico che in 'C' si scrive &&

if ( (condizione_1) && (condizione_2) ) {.......}

Se invece volevi CONDIZIONE_1 O CONDIZIONE_2 ... O in inglese diventa OR quindi ... devi mette un OR logico che in 'C' si scrive ||

if ( (condizione_1) || (condizione_2) ) {........}

Guarda il Reference ... "Boolean Operators"

Guglielmo

Ciao Guglielmo ... Sei un grande mi risolvi sempre i miei problemi ... Grazie 1000

Figurati ... l'importante è che hai imparato qualche cosa di nuovo ;)

Guglielmo

Be il codice che ti ho postato in teoria doveva funzionare, cera un accorgimento, visto che la variabile "posizione" era inizializzata a 1, il montacarichi doveva partire in posizione uno 1, altrimenti, i controlli salita e discesa, non svolgevano il loro compito salita=piano>posizione. Si sarebbe potuto inizializzare la variabile, controllando quale sensore è attivo, di conseguenza, la variabile "posizione" avrebbe assunto il valore iniziale del sensore attivo.

Giusto per chiarezza, poi se hai risolto meglio, ma potevi provarci fin da subito :)