/* * Rotazione monitor * * Con questo sketch gestisco la rotazione del monitor del cabinato arcade. * * v0.3 - Inserita la gestione della seriale per comandare la rotazione * v0.2 - Inserita la gestione dei due pulsanti del fine corsa * v0.1 - Con due pulsanti effettuo la rotazione temporizzata in senso orario e antiorario * */ // Definisco i vari pin const int buttonRightPin = 2; // I pulsanti per comandare la rotazione const int buttonLeftPin = 3; const int buttonFineCorsa1 = 4; // I pulsanti per gestire il fine corsa const int buttonFineCorsa2 = 5; const int motorPin1 = 8; // I 4 segnali per pilotare il motore const int motorPin2 = 9; const int motorPin3 = 10; const int motorPin4 = 11; const int ledPin = 13; // LED della scheda, utile per i test int delayTime = 5; // Ritardo per rallentare il motore int totCicli = 500; // Numero di cicli di rotazione da effettuare boolean stringComplete = false; // Mi serve come controllo per la lettura da seriale String inputString = ""; // Stringa contenente il comando via seriale void setup() { Serial.begin(9600); // Inizializzo la seriale inputString.reserve(100); // Riservo 100 caratteri per l'input da seriale pinMode(buttonLeftPin, INPUT_PULLUP); // Questa definizione mi permette di non usare la resistenza pinMode(buttonRightPin, INPUT_PULLUP); pinMode(buttonFineCorsa1, INPUT_PULLUP); pinMode(buttonFineCorsa2, INPUT_PULLUP); pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); pinMode(ledPin, OUTPUT); // In produzione come prima operazione occorre portare // il monitor in posizione orizzontale, se già non lo è // RotazioneOraria(); } void loop() { // Legge lo stato del bottone 1 e in caso effettua la rotazione if (digitalRead(buttonRightPin) == LOW) RotazioneOraria(); // Legge lo stato del bottone 2 e in caso effettua la rotazione if (digitalRead(buttonLeftPin) == LOW) RotazioneAntioraria(); /* * Visto che sulla Leonardo la serialEvent() sembra non funzionare * allora invoco una mia funzione in maniera da farla funzionare comunque * anche sulle altre schede. */ LeggiSeriale(); } /* * Tramite questa funzione verifico se sono presenti * richieste arrivate via seriale */ void LeggiSeriale() { while (Serial.available()) { char inChar = (char)Serial.read(); if (inChar == '\n') { // Se trovo il newline allora la riga è completa stringComplete = true; continue; } else { // Altrimenti accodo il carattere inputString += inChar; } } if (stringComplete) { Serial.println(inputString); if (inputString.equalsIgnoreCase("Destra")) RotazioneOraria(); if (inputString.equalsIgnoreCase("Sinistra")) RotazioneAntioraria(); // Ripristino le variabili allo stato di partenza stringComplete = false; inputString = ""; } } /* * Fa realizzare al motore una rotazione oraria finché non viene premuto * lo switch di fine corsa oppure non si raggiunge il limite di cicli */ void RotazioneOraria() { int Ciclo; Serial.println("Rotazione oraria"); digitalWrite(ledPin, HIGH); for (Ciclo = 0; (Ciclo < totCicli) && (digitalRead(buttonFineCorsa1) == HIGH); Ciclo++) { digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(delayTime); } digitalWrite(ledPin, LOW); } /* * Fa realizzare al motore una rotazione antioraria finché non viene premuto * lo switch di fine corsa oppure non si raggiunge il limite di cicli */ void RotazioneAntioraria() { int Ciclo; Serial.println("Rotazione antioraria"); digitalWrite(ledPin, HIGH); for (Ciclo = 0; (Ciclo < totCicli) && (digitalRead(buttonFineCorsa2) == HIGH); Ciclo++) { digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); } digitalWrite(ledPin, LOW); }