--- /dev/null
+FSM
+*******
+
+
+Risorse utili per le Macchine a stati.
+
+
+Tutorials
+===========
+
+* https://www.sparkfun.com/news/1801
+
+
+
+
+
+
+
+Elementi
+============
+
+* http://playground.arduino.cc/Code/Enum
+* https://www.arduino.cc/en/Reference/SwitchCase
--- /dev/null
+/*
+ Blink FSM
+
+ Accensione e spegnimanto di un LED utilizzando
+ una FSM 2 stati statici.
+
+Costrutto switch basato su uno struct.
+
+ */
+
+// Dichiarazione variabili
+int led = 13;
+int pausa = 500; // Variabile richiambile nel corso dell'esecuzione
+
+void setup() {
+ // Inizializziamo il PIN 13 come OUTPUT
+ pinMode(led, OUTPUT);
+}
+
+enum fsm_stati { // Stati della FMS
+ on,
+ off
+};
+
+fsm_stati stato;
+
+void loop() {
+ switch (stato){
+ case on :
+ digitalWrite(led, HIGH); // Mette il PIN del LED in stato acceso
+ delay(pausa); // Aspetta un secondo (mille millisecondi)
+
+ stato = off ; // Setta il prossimo state
+ break;
+
+ case off:
+ digitalWrite(led, LOW); // Mette il PIN del LED in stato spento
+ delay(pausa); // Aspetta mezzo secondo
+
+ stato = on ;
+ break;
+ }
+}
--- /dev/null
+/*
+ Blink FSM
+
+ Accensione e spegnimanto di un LED utilizzando
+ una FSM con 4 stati, statici e di transizione.
+
+Costrutto switch basato su uno struct.
+
+ */
+
+// Dichiarazione variabili
+int led = 11; // PWM
+int pausa = 1000; // Variabile richiambile nel corso dell'esecuzione
+byte lum = 0 ;
+
+void setup() {
+ // Inizializziamo il PIN 13 come OUTPUT
+ pinMode(led, OUTPUT);
+}
+
+enum fsm_stati { // Stati della FMS
+ on, // Statico
+ to_off, // Transizione
+ off,
+ to_on
+};
+
+fsm_stati stato ;
+
+void loop() {
+ switch (stato) {
+ case on :
+ // Operativa: Machine
+ digitalWrite(led, HIGH); // Mette il PIN del LED in stato acceso
+ delay(pausa);
+
+ // Stati
+ stato = to_off ; // Setta il prossimo state
+ lum = 255;
+ break;
+
+ case to_off :
+ while (lum > 0) {
+ lum-- ;
+ analogWrite(led, lum); // Mette il PIN del LED in stato acceso
+ delay(1);
+ }
+
+ stato = off ; // Setta il prossimo state
+ break;
+
+ case off:
+ digitalWrite(led, LOW); // Mette il PIN del LED in stato spento
+ delay(pausa);
+
+ stato = to_on ;
+ lum = 0;
+ break;
+
+ case to_on :
+ while (lum < 255) {
+ lum++ ;
+ analogWrite(led, lum); // Mette il PIN del LED in stato acceso
+ delay(1);
+ }
+
+ stato = on ; // Setta il prossimo state
+ break;
+ }
+}
+
+/* Domande:
+
+ 1.Cosa comporta l'uso della funzione delay?
+ 2.Come si puo' modificare lo sketch per poter eseguire piu' conpiti contemporaneamente?
+
+Esercizi successivi:
+- Creare una FSM con un LED RGB avente due stati Red e Green, una transizione yellow tra i due
+- Creare una FSM per la gestione di un semaforo
+ (esempio disponibile in sketchbook_andrea/advanced_projects/state_machine )
+
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ .
+ Soluzioni:
+
+ 1.Delay rende il codice blocking, null'altro puo' essere eseguito durante i delay
+ 2.Si potrebbe utilizzare millis(), vedi esercizi multitasking
+*/
fsm_stati stato;
void loop() {
- switch (stato){
+ switch (stato) {
case on :
// Machine: operazioni svolte
digitalWrite(led, HIGH); // Mette il PIN del LED in stato acceso
stato = on ;
break;
+
+ default: // Opzionale, quando non si verificano altre condizioni
+ break;
}
}
// Dichiarazione variabili
int led = 11; // PWM
int pausa = 1000; // Variabile richiambile nel corso dell'esecuzione
-byte lum = 0 ;
+byte lum = 255 ;
void setup() {
// Inizializziamo il PIN 13 come OUTPUT
// Stati
stato = to_off ; // Setta il prossimo state
- lum = 255;
+ // lum = 255;
break;
case to_off :
delay(pausa);
stato = to_on ;
- lum = 0;
+ // lum = 0;
break;
case to_on :
stato = on ; // Setta il prossimo state
break;
+
+ default: // Opzionale, quando non si verificano altre condizioni
+ break;
}
}
1.Delay rende il codice blocking, null'altro puo' essere eseguito durante i delay
2.Si potrebbe utilizzare millis(), vedi esercizi multitasking
+ oppure: https://www.sparkfun.com/news/1801
*/
-
+void brilla(int velocita = 1000); // Function prototype con valore di default
+// _Deve_ essere dichiarato in alto, arduino sbaglia a creare i prototipi.
+// Altro modo: metterle in un "tab" functions.h e includere questo
/*
Blink v2
void loop() {
brilla(300);
brilla(300);
- brilla(600);
+ brilla(); // default
}
// Funzioni create dall'utente:
--- /dev/null
+/* Blink without Delay - only led
+
+ Turns on and off a light emitting diode(LED) connected to a digital
+ pin, without using the delay() function. This means that other code
+ can run at the same time without being interrupted by the LED code.
+
+
+Schema: https://lab.piffa.net/schemi/circuito_led_bb.png
+
+
+ http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
+ */
+
+// constants won't change. Used here to
+// set pin numbers:
+const int led = 13; // Primo LED
+
+
+unsigned long previousMillis = 0; // will store last time LED was updated
+unsigned long interval = 1000; // interval at which to blink (milliseconds)
+
+void setup() {
+ // set the digital pin as output:
+ pinMode(led, OUTPUT);
+}
+
+void loop()
+{
+ if (millis() - previousMillis >= interval) {
+ // Timestamp + timestamp = delta temporale
+ previousMillis += interval ;
+
+ digitalWrite(led, !digitalRead(led));
+ }
+}
/*
HC-SR04 Ping distance sensor]
- VCC to arduino 5v GND to arduino GND
- Echo to Arduino pin 13 Trig to Arduino pin 12
+ VCC to arduino 5v - GND to arduino GND
+ Echo to Arduino pin 13 - Trig to Arduino pin 12
Red POS to Arduino pin 11
Green POS to Arduino pin 10
560 ohm resistor to both LED NEG and GRD power rail
More info at: http://goo.gl/kJ8Gl
Original code improvements to the Ping sketch sourced from Trollmaker.com
Some code and wiring inspired by http://en.wikiversity.org/wiki/User:Dstaub/robotcar
+
+Schema: http://www.instructables.com/id/Simple-Arduino-and-HC-SR04-Example/step2/Connect-the-components/
+
*/
-#define trigPin 8
-#define echoPin 7
+#define trigPin 12
+#define echoPin 13
#define RED 11
#define GREEN 10