/* Programma di controllo per un dolly motorizzato Versione 2.2 28/03/2012 -Tolto tutto quello che riguarda la serial port -Ridotto il numero di variabili utilizzate -Dalla versione 2.0 è stato aggiunto il supporto ad uno schermo LCD Hardware utilizzato: - Arduino 2009 + shield motor adafruit + alcuni tasti e alcuni led - Configurazione degli ingressi e delle uscite: - 0 Non usato perchè utilizzato da arduino per comunicare via USB - 1 Non usato perchè utilizzato da arduino per comunicare via USB - 2 Out per comandare la macchina fotografica (scatto vero e proprio) - 3 Non usato perchè utilizzato dallo shield per comandare il motore passo passo - 4 Non usato perchè utilizzato dallo shield per comandare il motore passo passo - 5 In per incrementare il valore inserito di una unità - 6 In per incrementare il valore inserito di una decina - 7 Non usato perchè utilizzato dallo shield per comandare il motore passo passo - 8 Non usato perchè utilizzato dallo shield per comandare il motore passo passo - 9 In per visualizzare tramite led il valore inserito - 10 In per cancellare il valore inserito (ed eventualmente fermare il ciclo) - 11 Non usato perchè utilizzato dallo shield per comandare il motore passo passo - 12 Non usato perchè utilizzato dallo shield per comandare il motore passo passo - 13 Led di segnalazione funzionamento motore - I pin da 14 a 19 sono i 6 ingressi analogici (0-5) (0=14; 1=15; 2=16; 3=17; 4=18; 5=19) - 14 Non usato (libero) - 15 In per Stop DX - 16 In per Stop SX - 17 Non usato (libero) - 18 Non usato (libero) - 19 In potenziometro per impostare la lunghezza del passo */ #include // necessario per comandare i motori tramite adafruit //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD #include // necessario per comandare LCD //FINE PARTE CHE RIGUARDA LCD //FINE PARTE CHE RIGUARDA LCD //FINE PARTE CHE RIGUARDA LCD //FINE PARTE CHE RIGUARDA LCD //imposto gli ingressi #define LCDPin 18 #define LCDdelay 10 // conservative, 2 actually works #define Scatto 2 // Uscita da collegare tramite optoisolatore allo scatto della macchina fotografica #define BottoneDecine 6 // Il bottone per incrementare le decine è al pin 6 #define BottoneUnita 5 // Il bottone per incrementare le unità è al pin 5 #define BottoneVisualizza 9 // Il bottone per visualizzare il valore è al pin 9 #define BottoneCancella 10 // Il bottone per fare clear è al pin 10 #define LedPin 13 // Il led 13 viene utilizzato per visualizzare il valore e funzionamento motore #define StopSX 16 // il bottone StopSX di sicurezza è al pin 1 analogico = 15 digitale #define StopDX 15 // il bottone StopDX di sicurezza è al pin 2 analogico = 16 digitale //imposto i valori di alcuni parametri fissi #define PassiMotore 48 // Il numero di passi del motore per compiere un giro dello stesso (48) #define VelStdMotore 100 #define lunghezza 2666 // Sono necessari 2666 passi per fare tutto il binario (1 metro) unsigned long NumeroFotoPossibili=20; // limite n° di foto da effettuare unsigned long DistanzaPerPasso=32; // per default 16 passi unsigned long DistanzaPerPassoInmm=16; // per default 16 passi //inizializzazione del motore e di alcune variabili AF_Stepper motor(PassiMotore, 1); // Variabili utilizzate unsigned long ValoreUnita = 1; // per conteggio delle volte che viene premuto il tasto unita unsigned long ValoreDecine = 0; // per conteggio delle volte che viene premuto il tasto decine unsigned long ValoreMemorizzato = 0; // variabile che conterrà il valore inserito unsigned long Potenziometro = 6; // variabile per memorizzare il valore letto dal potenziometro unsigned long RitardoFiltraggio = 50; // Ritardo per filtraggio di falsi contatti. Se è il caso aumentarlo byte FCSX = 0; // Variabile che contiene lo stato del fine corsa SX byte FCDX = 0; // Variabile che contiene lo stato del fine corsa DX byte Motore = 0; // variabile per accendere e spegnere il motore byte SensoRotazioneMotore = 1; // variabile che contiene il senso di rotazione del motore byte VelMotore=20; // variabile per contenere la velocità del motore in modalità semiautomatica unsigned long FotoScatto = 0; // variabile che contiene il numero di passi effettuati byte Impostazione = 0; // 0 = Pausa - 1 = Distanze/Velocità byte PassiPerDisplay = 0; // variabile contatore per accendere brevemente il display durante un ciclo unsigned long TempoInizio=0; // Variabile per memorizzare quando è iniziato il ciclo unsigned long TempoTot=0; unsigned long TempoOre=0; unsigned long TempoMinuti=0; unsigned long TempoSecondi=0; unsigned long Distanza; unsigned long distmmdec; unsigned long distmm; unsigned long distcm; String Stringa; unsigned long Valore; const String Mess1 = "--- RESET ---"; const String Mess2 = "-MODO IMP.:DIST/VEL-"; const String Mess3 = "-MODO IMP.:PAUSA -"; const String Mess4 = "--- PAUSA + UNO ---"; const String Mess5 = "-POTENZIOMETRO + UNO"; const String Mess6 = "--- PAUSA + DIECI---"; const String Mess7 = "--- STOP DX ---"; const String Mess8 = "--- STOP SX ---"; const String Mess9 = "---AVANTI MANUALE---"; const String Mess10 = "--INDIETRO MANUALE--"; const String Mess11 = "--- AVANTI VIDEO ---"; const String Mess12 = "-- INTERRUZIONE --"; const String Mess13 = "--FINE AVANZAMENTO--"; const String Mess14 = "---INDIETRO VIDEO---"; const String Mess15 = "--- NUOVO CICLO ----"; const String Mess16 = "MODO IMP.:VERSO MOV."; const String Mess17 = "CAMBIATO VERSO MOV. "; //variabili usate per evitare eventuali falsi contatti della "tastiera" //in alcuni casi vengono utilizzate variabili long perchè il valore //memorizzato potrebbe superare la capacità degli int //poichè si tratta di millisecondi byte StatoBottoneUnita; // Contiene lo stato del bottone unita byte UltimoStatoBottoneUnita = LOW; // variabile che contiene l'ultima lettura dello stato delle unita unsigned long TempoBottoneUnita = 0; // variabile che contiene ... byte StatoBottoneDecine; // Contiene lo stato del bottone decine byte UltimoStatoBottoneDecine = LOW; // variabile che contiene l'ultima lettura dello stato delle decine unsigned long TempoBottoneDecine = 0; // variabile che contiene il tempo per i falsi contatti byte StatoBottoneCancella; // Contiene lo stato del bottone Cancella byte UltimoStatoBottoneCancella = LOW; // variabile che contiene l'ultima lettura dello stato di Cancella unsigned long TempoBottoneCancella = 0; // variabile che contiene il tempo per i falsi contatti byte StatoBottoneVisualizza; // Contiene lo stato del bottone Visualizza byte UltimoStatoBottoneVisualizza = LOW; // variabile che contiene l'ultima lettura dello stato di Visualizza unsigned long TempoBottoneVisualizza = 0; // variabile che contiene il tempo per i falsi contatti byte StatoStopDX; // Contiene lo stato del StopDX byte UltimoStatoStopDX = LOW; // variabile che contiene l'ultima lettura dello stato di StopDX unsigned long TempoStopDX = 0; // variabile che contiene il tempo per i falsi contatti byte StatoStopSX; // Contiene lo stato del StopSX byte UltimoStatoStopSX = LOW; // variabile che contiene l'ultima lettura dello stato di StopSX unsigned long TempoStopSX = 0; // variabile che contiene il tempo per i falsi contatti //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD SoftwareSerial LCD = SoftwareSerial(0, LCDPin);// since the LCD does not send data back to the Arduino, we should only define the txPin // wbp: goto with row & column void LCD_Position(int row, int col) { LCD.write(0xFE); //command flag // LCD.write((col + row*64 + 128)); //position switch(row) { case 0:{LCD.write((col + 128)); } break; case 1:{LCD.write((col + 128+64)); }break; case 2:{LCD.write((col + 128+20)); }break; case 3:{LCD.write((col + 128+84)); }break; } delay(LCDdelay); } void LCD_Clear(){ LCD.write(0xFE); //command flag LCD.write(0x01); //clear command. delay(LCDdelay); } void LCD_Backlight(int State ) { //turns on/off the backlight LCD.write(0x7C); //command flag for backlight stuff if (State==true) { LCD.write(157); //light level. } else { LCD.write(128); //light level. } delay(LCDdelay); } void LCD_LongToHHMMSS (void) { Stringa=""; TempoOre=TempoTot/3600; TempoMinuti = (TempoTot-TempoOre*3600)/60; TempoSecondi = TempoTot -TempoOre*3600 - TempoMinuti*60; if (TempoOre<10) Stringa = Stringa + "0"; Stringa=Stringa+TempoOre; Stringa = Stringa + ":"; if (TempoMinuti<10) Stringa = Stringa + "0"; Stringa=Stringa+TempoMinuti; Stringa = Stringa + ":"; if (TempoSecondi<10) Stringa = Stringa + "0"; Stringa=Stringa+TempoSecondi; LCD.print(Stringa); } void LCD_LongToDistanza(void) { Stringa=""; distcm=Distanza/1000; distmm=(Distanza-distcm*1000)/100; distmmdec=Distanza-distcm*1000-distmm*100; if (distcm) { Stringa=Stringa+distcm; Stringa=Stringa+","; Stringa=Stringa+distmm; Stringa=Stringa+" cm"; } else { Stringa=Stringa+distmm; Stringa=Stringa+","; Stringa=Stringa+distmmdec; Stringa=Stringa+" mm"; } LCD.print(Stringa); } void LCD_Display_1(int Msg) { LCD_Clear(); LCD_Position(1,0); switch (Msg) { case 1:{LCD.print(Mess1);}break; case 2:{LCD.print(Mess2);}break; case 3:{LCD.print(Mess3);}break; case 4:{LCD.print(Mess4);}break; case 5:{LCD.print(Mess5);}break; case 6:{LCD.print(Mess6);}break; case 7:{LCD.print(Mess7);}break; case 8:{LCD.print(Mess8);}break; case 9:{LCD.print(Mess9);}break; case 10:{LCD.print(Mess10);}break; case 11:{LCD.print(Mess11);}break; case 12:{LCD.print(Mess12);}break; case 13:{LCD.print(Mess13);}break; case 14:{LCD.print(Mess14);}break; case 15:{LCD.print(Mess15);}break; case 16:{LCD.print(Mess16);}break; case 17:{LCD.print(Mess17);}break; } if (Msg) { delay(1000); } LCD_Clear(); if (ValoreMemorizzato>0) { if (ValoreMemorizzato!=11000) { LCD_Position(0,0); if (SensoRotazioneMotore==0) { LCD.print("----->>>>>"); } else { LCD.print("<<<<<-----"); } switch(Impostazione) { case 0:{LCD.print("IMP.PAUSA ");};break; case 1:{LCD.print("IMP.DIST. ");};break; case 2:{LCD.print("IMP.VERSO ");};break; } } else { LCD_Position(0,0); LCD.print("SX e DX "); } switch(Impostazione) { case 0:{LCD.print("IMP.PAUSA ");};break; case 1:{LCD.print("IMP.DIST. ");};break; case 2:{LCD.print("IMP.VERSO ");};break; } } else { LCD_Position(0,0); LCD.print("SX e DX "); switch(Impostazione) { case 0:{LCD.print("IMP.PAUSA ");};break; case 1:{LCD.print("IMP.DIST. ");};break; case 2:{LCD.print("IMP.VERSO ");};break; } } LCD_Position(1,0); if (ValoreMemorizzato==0) { LCD.print("Modo:Manuale Pausa=0"); LCD_Position(2,0); LCD.print("Piccoli movimenti"); LCD_Position(3,0); LCD.print("Dist.:"); if (Potenziometro<10) LCD_Position(3,7); if (Potenziometro>9) LCD_Position(3,6); LCD.print(Potenziometro); Distanza = DistanzaPerPassoInmm; LCD_Position(3,10); LCD_LongToDistanza(); } else { if (ValoreMemorizzato==11000) { LCD.print("Modo: Video.Movimento per tutta la guida"); LCD_Position(3,0); LCD.print("Velocita': "); if (Potenziometro<10) LCD_Position(3,13); if (Potenziometro>9) LCD_Position(3,11); LCD.print(Potenziometro); } else { LCD.print("Modo:Auto. Foto:"); LCD_Position(1,16); LCD.print(NumeroFotoPossibili); LCD_Position(2,0); LCD.print("Pausa:"); if (ValoreMemorizzato<10000) LCD_Position(2,7); if (ValoreMemorizzato>9000) LCD_Position(2,6); Valore = ValoreMemorizzato / (unsigned long) 1000; LCD.print(Valore); LCD_Position(2,8); LCD.print("sec="); TempoTot=Valore*NumeroFotoPossibili; LCD_Position(2,12); LCD_LongToHHMMSS(); LCD_Position(3,0); LCD.print("Poten:"); if (Potenziometro<10) LCD_Position(3,8); if (Potenziometro>9) LCD_Position(3,7); LCD.print(Potenziometro); LCD_Position(3,9); Stringa = "="; LCD.print(Stringa); Distanza = DistanzaPerPassoInmm; LCD_Position(3,10); LCD_LongToDistanza(); } } } void LCD_Display(int Msg) { LCD_Backlight(true); LCD_Display_1(Msg); delay (1000); LCD_Backlight(false); } void LCD_Display_Run(void) { LCD_Clear(); Stringa= "Foto :" ; Stringa=Stringa+FotoScatto; Stringa=Stringa+"/"; Stringa=Stringa+NumeroFotoPossibili; LCD_Position(0,0); LCD.print(Stringa); Stringa= "Fine Fra :" ; LCD_Position(1,0); LCD.print(Stringa); TempoTot=ValoreMemorizzato/(unsigned long) 1000*(NumeroFotoPossibili-FotoScatto); LCD_Position(1,10); LCD_LongToHHMMSS(); Stringa= "Tempo Imp:" ; LCD_Position(2,0); LCD.print(Stringa); TempoTot=millis(); TempoTot=(TempoTot-TempoInizio); TempoTot=TempoTot+ValoreMemorizzato*(NumeroFotoPossibili-FotoScatto); TempoTot=TempoTot/1000; LCD_Position(2,10); LCD_LongToHHMMSS(); Distanza = (NumeroFotoPossibili-FotoScatto+1)*DistanzaPerPassoInmm+(unsigned long) 300; Stringa="Posizione=" ; LCD_Position(3,0); LCD.print(Stringa); LCD_LongToDistanza(); } //FINE PARTE CHE RIGUARDA LCD //FINE PARTE CHE RIGUARDA LCD //FINE PARTE CHE RIGUARDA LCD //FINE PARTE CHE RIGUARDA LCD void ImpostaValori(void) { switch(Potenziometro) { //n° di passi che il motore deve compiere a seconda del valore impostato con il potenziometro case 1:{DistanzaPerPasso=2;DistanzaPerPassoInmm=75;NumeroFotoPossibili=1213;VelMotore=10;};break; case 2:{DistanzaPerPasso=4;DistanzaPerPassoInmm=150;NumeroFotoPossibili=606;VelMotore=20;};break; case 3:{DistanzaPerPasso=6;DistanzaPerPassoInmm=225;NumeroFotoPossibili=404;VelMotore=30;};break; case 4:{DistanzaPerPasso=8;DistanzaPerPassoInmm=300;NumeroFotoPossibili=303;VelMotore=40;};break; case 5:{DistanzaPerPasso=10;DistanzaPerPassoInmm=375;NumeroFotoPossibili=242;VelMotore=50;};break; case 6:{DistanzaPerPasso=12;DistanzaPerPassoInmm=450;NumeroFotoPossibili=202;VelMotore=60;};break; case 7:{DistanzaPerPasso=16;DistanzaPerPassoInmm=600;NumeroFotoPossibili=151;VelMotore=70;};break; case 8:{DistanzaPerPasso=24;DistanzaPerPassoInmm=900;NumeroFotoPossibili=101;VelMotore=80;};break; case 9:{DistanzaPerPasso=32;DistanzaPerPassoInmm=1200;NumeroFotoPossibili=75;VelMotore=90;};break; case 10:{DistanzaPerPasso=64;DistanzaPerPassoInmm=2400;NumeroFotoPossibili=37;VelMotore=100;};break; case 11:{DistanzaPerPasso=128;DistanzaPerPassoInmm=4800;NumeroFotoPossibili=18;VelMotore=110;};break; } //calcolo il valore memorizzato ValoreMemorizzato = ValoreUnita + ValoreDecine*10 ; // moltiplico per 1000 per trasformarlo in secondi ValoreMemorizzato = ValoreMemorizzato *1000; } //Funzione SETUP //Funzione SETUP //Funzione SETUP //Funzione SETUP //Funzione SETUP //Funzione SETUP //Funzione SETUP //Funzione SETUP //Funzione SETUP // Questa funzione è necessaria ad arduino per inizializzare il proprio Hardware. Vengono impostati // gli ingressi e le uscite, la scheda seriale, il motore e la sua velocità void setup() { pinMode(BottoneCancella, INPUT); // imposto gli ingressi per la tastiera pinMode(BottoneVisualizza, INPUT); pinMode(BottoneUnita, INPUT); pinMode(BottoneDecine, INPUT); pinMode(StopDX, INPUT); pinMode(StopSX, INPUT); pinMode(LedPin, OUTPUT); // imposto l'uscita per il led di segnalazione pinMode(Scatto, OUTPUT); // imposto l'uscita per il led di segnalazione motor.setSpeed(VelStdMotore); // 180 rpm motor.release(); //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD //PARTE CHE RIGUARDA LCD pinMode(LCDPin, OUTPUT); LCD.begin(9600); LCD_Clear(); LCD_Backlight(true); LCD_Position(0,0); LCD.print(" Mamo Dolly 2.0"); // LCD.write(0x7C); //these lines... // LCD.write(10); //set the splash to memory (this is the j char or line feed delay (1000); LCD_Position(1,0); LCD.print(" Pronto"); delay (1000); LCD_Backlight(false); ValoreMemorizzato=1000; ImpostaValori(); LCD_Display(0); } //Funzione loop //Funzione loop //Funzione loop //Funzione loop //Funzione loop // Questa funzione viene eseguita in modo continuo da arduino. E' il ciclo del programma da eseguire void loop() { FCSX = 0; // Azzero lo stato del fine corsa SX FCDX = 0; // Azzero lo stato del fine corsa DX int interrotto = 0; // variabile per verificare se è intervenuta una emergenza // inizio la lettura dei vari ingressi (bottoni, fine corsa, potenziometro) //lettura dello stato del bottone Cancella //lettura dello stato del bottone Cancella //lettura dello stato del bottone Cancella //lettura dello stato del bottone Cancella int LetturaBottoneCancella = digitalRead(BottoneCancella); if (LetturaBottoneCancella != UltimoStatoBottoneCancella) //se è cambiato { TempoBottoneCancella = millis(); // Memorizzo quando è stato premuto il bottone per la prima volta } if ((millis() - TempoBottoneCancella) > RitardoFiltraggio) // se il tempo di filtraggio è maggiore del tempo limite allora cambia lo stato { StatoBottoneCancella = LetturaBottoneCancella; if (LetturaBottoneCancella==HIGH) { //ho la conferma che è stato premuto il tasto cancella ValoreUnita=0; //azzero le unità ValoreDecine=0; // azzero le decine Motore=0; // spengo il motore ImpostaValori(); LCD_Display(1); } } UltimoStatoBottoneCancella = LetturaBottoneCancella;//memorizza lo stato per confrontarlo al prossimo ciclo //lettura dello stato del bottone Visualizza //lettura dello stato del bottone Visualizza //lettura dello stato del bottone Visualizza //lettura dello stato del bottone Visualizza int LetturaBottoneVisualizza = digitalRead(BottoneVisualizza); if (LetturaBottoneVisualizza != UltimoStatoBottoneVisualizza) //se è cambiato { TempoBottoneVisualizza = millis(); // Memorizzo quando è stato premuto il bottone per la prima volta } if ((millis() - TempoBottoneVisualizza) > RitardoFiltraggio) // se il tempo di filtraggio è maggiore del tempo limite allora cambia lo stato { StatoBottoneVisualizza = LetturaBottoneVisualizza; if (LetturaBottoneVisualizza==HIGH) { ImpostaValori(); switch(Impostazione) { case 0:{Impostazione =1;LCD_Display(2);}break; case 1:{Impostazione =2;LCD_Display(16);}break; case 2:{Impostazione =0;LCD_Display(3);}break; } } } UltimoStatoBottoneVisualizza = LetturaBottoneVisualizza;//memorizza lo stato per confrontarlo al prossimo ciclo //lettura dello stato del bottone unita //lettura dello stato del bottone unita //lettura dello stato del bottone unita //lettura dello stato del bottone unita //lettura dello stato del bottone unita int LetturaBottoneUnita = digitalRead(BottoneUnita); if (LetturaBottoneUnita != UltimoStatoBottoneUnita) //se è cambiato { TempoBottoneUnita = millis();// Memorizzo quando è stato premuto il bottone per la prima volta } if ((millis() - TempoBottoneUnita) > RitardoFiltraggio) // se il tempo di filtraggio è maggiore del tempo limite allora cambia lo stato { StatoBottoneUnita = LetturaBottoneUnita; if (LetturaBottoneUnita==HIGH) {//ho la conferma che è stato premuto il tasto unità switch(Impostazione) { case 0:{ ValoreUnita++; // incremento il valore if (ValoreUnita>9) // se supero il valore 9 ritorno a zero { ValoreUnita = 0; } ImpostaValori(); LCD_Display(4); } break; case 1:{ Potenziometro++;//incremento il valore if (Potenziometro>11) // se supero il valore 9 ritorno a zero { Potenziometro = 1; } ImpostaValori(); LCD_Display(5); } break; case 2:{ if (SensoRotazioneMotore==0) { SensoRotazioneMotore=1; } else { SensoRotazioneMotore=0; } ImpostaValori(); LCD_Display(17); } break; } } } UltimoStatoBottoneUnita = LetturaBottoneUnita;//memorizza lo stato per confrontarlo al prossimo ciclo //lettura dello stato del bottone decine //lettura dello stato del bottone decine //lettura dello stato del bottone decine //lettura dello stato del bottone decine int LetturaBottoneDecine = digitalRead(BottoneDecine); if (LetturaBottoneDecine != UltimoStatoBottoneDecine) //se è cambiato { TempoBottoneDecine = millis();// Memorizzo quando è stato premuto il bottone per la prima volta } if ((millis() - TempoBottoneDecine) > RitardoFiltraggio) // se il tempo di filtraggio è maggiore del tempo limite allora cambia lo stato { StatoBottoneDecine = LetturaBottoneDecine; if (LetturaBottoneDecine==HIGH) { ValoreDecine++; if (ValoreDecine>9) { ValoreDecine = 0; } ImpostaValori(); LCD_Display(6); } } UltimoStatoBottoneDecine = LetturaBottoneDecine;//memorizza lo stato per confrontarlo al prossimo ciclo //lettura dello stato di StopDX //lettura dello stato di StopDX //lettura dello stato di StopDX //lettura dello stato di StopDX int LetturaStopDX = digitalRead(StopDX); if (LetturaStopDX != UltimoStatoStopDX) //se è cambiato { TempoStopDX = millis();// Memorizzo quando è stato premuto il bottone per la prima volta } if ((millis() - TempoStopDX) > RitardoFiltraggio) // se il tempo di filtraggio è maggiore del tempo limite allora cambia lo stato { StatoStopDX = LetturaStopDX; if (LetturaStopDX==HIGH) { if (Motore>0) // poichè è intervenuto il fine corsa cambio il senso di rotazione { SensoRotazioneMotore = 0; Motore = 0 ; // spengo il motore ImpostaValori(); LCD_Display(7); } FCSX = 1; // cambio lo stato del fine corsa DX } } UltimoStatoStopDX = LetturaStopDX;//memorizza lo stato per confrontarlo al prossimo ciclo //lettura dello stato di StopSX //lettura dello stato di StopSX //lettura dello stato di StopSX //lettura dello stato di StopSX int LetturaStopSX = digitalRead(StopSX); if (LetturaStopSX != UltimoStatoStopSX) //se è cambiato { TempoStopSX = millis();// Memorizzo quando è stato premuto il bottone per la prima volta } if ((millis() - TempoStopSX) > RitardoFiltraggio) // se il tempo di filtraggio è maggiore del tempo limite allora cambia lo stato { StatoStopSX = LetturaStopSX; if (LetturaStopSX==HIGH) { if (Motore>0)// poichè è intervenuto il fine corsa cambio il senso di rotazione { SensoRotazioneMotore = 1; Motore = 0 ; // spengo il motore ImpostaValori(); LCD_Display(8); } FCDX = 1; // cambio lo stato del fine corsa DX } } UltimoStatoStopSX = LetturaStopSX; //memorizza lo stato per confrontarlo al prossimo ciclo //Solo quando il motore è fermo viene letto il valore del potenziometro. //A ciclo avviato non è possibile cambiare il passo if (Motore==0) { // a seconda di quanto impostato sul potenziometro viene impostato un certo numero di passi //che il motore deve compiere ad ogni scatto ImpostaValori(); } // Verificando il valore memorizzato vedo se sono in fase automatica o manuale // se il valore e' uguale a zero sono in fase manuale. // (cioè premendo i bottoni StopDX e StopSX comando direttamente il motore // il motore funziona fino a quando è premuto il bottone) // se il valore è 11 (undici)sono in fase semiautomatica. // (cioè premendo i bottoni StopDX e StopSX comando direttamente il motore // il motore funziona per un passo e poi si ferma) // se il valore è maggiore di zero ma non è 11 (undici) allora sono in fase automatica // (cioè ogni tot secondi il motore si muove, c'è una piccola attesa per evitare vibrazioni // e poi c'è lo scatto, il motore attende un tot e ripete il ciclo) if (ValoreMemorizzato==0) //fase manuale { if (FCSX==0 && FCDX==1) //se viene premuto il finecorsa dx all'ora faccio girare il motore indietro { LCD_Display(9); motor.step(DistanzaPerPasso, BACKWARD, SINGLE); motor.release(); } if (FCSX==1 && FCDX==0) //se viene premuto il finecorsa sx all'ora faccio girare il motore avanti { LCD_Display(10); motor.step(DistanzaPerPasso, FORWARD, SINGLE); motor.release(); } } if (ValoreMemorizzato==11000) //fase semiautomatica { ImpostaValori(); if (FCSX==0 && FCDX==1) //se viene premuto il finecorsa dx all'ora faccio girare il motore indietro { LCD_Display(11); motor.setSpeed(VelMotore); interrotto = motor.step(2350, BACKWARD, SINGLE); motor.setSpeed(VelStdMotore); motor.release(); if (interrotto) { ValoreUnita=0; //azzero le unità ValoreDecine=0; // azzero le decine Motore=0; // spengo il motore LCD_Display(12); } else { LCD_Display(13); } } if (FCSX==1 && FCDX==0) //se viene premuto il finecorsa sx all'ora faccio girare il motore avanti { LCD_Display(14); motor.setSpeed(VelMotore); interrotto = motor.step(2350, FORWARD, SINGLE); motor.setSpeed(VelStdMotore); motor.release(); if (interrotto) { ValoreUnita=0; //azzero le unità ValoreDecine=0; // azzero le decine Motore=0; // spengo il motore LCD_Display(12); } else { LCD_Display(13); } } } if (ValoreMemorizzato>0 && ValoreMemorizzato!=11000)//se ho memorizzato un valore di pausa vuol dire che è un ciclo automatico { if (FCSX==1 && FCDX==1) // se sono stati premuti entrambi i fine corsa, vuol dire che si vuole iniziare un nuovo ciclo { TempoInizio = millis(); LCD_Display(15); LCD.write(0x7C); //command flag for backlight stuff LCD.write(130); //light level. FotoScatto=0; // azzero contatore passi PassiPerDisplay = 0; Motore = 2; // accendo il motore // faccio una segnalazione tramite il led che sto iniziando un nuovo ciclo for (int ciclo=0;ciclo<20;ciclo++) { digitalWrite(LedPin, HIGH); // accendo il led delay(50); // aspetto digitalWrite(LedPin, LOW); // spendo il led delay(100); // aspetto } } if (Motore==2) // se devo eseguire un nuovo passo { LCD_Display_Run(); if (PassiPerDisplay >9)//Ogni 10 passi faccio accendere il display (per la notte) { LCD_Backlight(true); } digitalWrite(LedPin, HIGH); // accendo il led if (SensoRotazioneMotore==0) // a seconda del senso di rotazione faccio girare il motore in un verso o nell'altro { interrotto = motor.step(DistanzaPerPasso, BACKWARD, SINGLE); } else { interrotto = motor.step(DistanzaPerPasso, FORWARD, SINGLE); } digitalWrite(LedPin, LOW); // spengo il led FotoScatto++; // incremento il contatore dei passi motor.release(); // stacco il motore if (ValoreMemorizzato<1010) { delay(500); // aspetto 0,6 sec per "saltare" le vibrazioni dopo il movimento if (PassiPerDisplay >9) { PassiPerDisplay = 0; LCD_Backlight(false); } delay(200); // aspetto 0,6 sec per "saltare" le vibrazioni dopo il movimento digitalWrite(Scatto, HIGH); // premo il pulsante di scatto delay(200); // aspetto digitalWrite(Scatto, LOW); // rilascio il pulsante di scatto } else { delay(1200); // aspetto 0,6 sec per "saltare" le vibrazioni dopo il movimento if (PassiPerDisplay >9) { PassiPerDisplay = 0; LCD_Backlight(false); } delay(200); // aspetto 0,6 sec per "saltare" le vibrazioni dopo il movimento digitalWrite(Scatto, HIGH); // premo il pulsante di scatto delay(200); // aspetto digitalWrite(Scatto, LOW); // rilascio il pulsante di scatto delay(ValoreMemorizzato-1700); // aspetto } PassiPerDisplay ++; } if (interrotto) { if (interrotto==1) { SensoRotazioneMotore = 0; } if (interrotto==2) { SensoRotazioneMotore = 1; } Motore = 0 ; // spengo il motore LCD_Display(12); } } if (FotoScatto>NumeroFotoPossibili-1) { Motore = 0 ; // spengo il motore motor.release(); digitalWrite(LedPin, HIGH); // accendo il led delay(2000); // attendo digitalWrite(LedPin, LOW); // spengo il led if (SensoRotazioneMotore == 0) // cambio il senso di rotazione per il prossimo ciclo { SensoRotazioneMotore = 1; // imposto sinistra LCD_Clear(); LCD_Backlight(true); for (int ciclo=0;ciclo<4;ciclo++) { LCD_Position(ciclo,0); LCD.print("CICLO COMPLETATO"); delay (1000); } delay (1000); LCD_Backlight(false); } else { SensoRotazioneMotore = 0; // imposto sinistra LCD_Clear(); LCD_Backlight(true); for (int ciclo=0;ciclo<4;ciclo++) { LCD_Position(ciclo,0); LCD.print("CICLO COMPLETATO"); delay (1000); } delay (1000); LCD_Backlight(false); } FotoScatto=0; // azzero il numero dei passi effettuati } }