From 92687f500a1e7aed1fe35540e4f4aee5f8bcf6a1 Mon Sep 17 00:00:00 2001 From: Andrea Manni Date: Mon, 6 Mar 2017 16:24:17 +0100 Subject: [PATCH] Rover prima lezione --- advanced_projects/state_machine/README | 23 ++++ .../state_machine/blink/blink_1/blink_1.ino | 43 +++++++ .../blink/blink_2_trans/blink_2_trans.ino | 106 ++++++++++++++++++ .../state_machine/blink_1/blink_1.ino | 5 +- .../blink_2_trans/blink_2_trans.ino | 10 +- .../blink_2_2_funzioni_argomenti.ino | 6 +- basic/blinks/millis/millis.ino | 35 ++++++ .../ultrasonic_distance_simple.ino | 11 +- 8 files changed, 229 insertions(+), 10 deletions(-) create mode 100644 advanced_projects/state_machine/README create mode 100644 advanced_projects/state_machine/blink/blink_1/blink_1.ino create mode 100644 advanced_projects/state_machine/blink/blink_2_trans/blink_2_trans.ino create mode 100644 basic/blinks/millis/millis.ino diff --git a/advanced_projects/state_machine/README b/advanced_projects/state_machine/README new file mode 100644 index 0000000..15f5175 --- /dev/null +++ b/advanced_projects/state_machine/README @@ -0,0 +1,23 @@ +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 diff --git a/advanced_projects/state_machine/blink/blink_1/blink_1.ino b/advanced_projects/state_machine/blink/blink_1/blink_1.ino new file mode 100644 index 0000000..c119794 --- /dev/null +++ b/advanced_projects/state_machine/blink/blink_1/blink_1.ino @@ -0,0 +1,43 @@ +/* + 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; + } +} diff --git a/advanced_projects/state_machine/blink/blink_2_trans/blink_2_trans.ino b/advanced_projects/state_machine/blink/blink_2_trans/blink_2_trans.ino new file mode 100644 index 0000000..1841f87 --- /dev/null +++ b/advanced_projects/state_machine/blink/blink_2_trans/blink_2_trans.ino @@ -0,0 +1,106 @@ +/* + 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 +*/ diff --git a/advanced_projects/state_machine/blink_1/blink_1.ino b/advanced_projects/state_machine/blink_1/blink_1.ino index 8f1f3be..e5b1395 100644 --- a/advanced_projects/state_machine/blink_1/blink_1.ino +++ b/advanced_projects/state_machine/blink_1/blink_1.ino @@ -25,7 +25,7 @@ enum fsm_stati { // Stati della FMS 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 @@ -41,5 +41,8 @@ void loop() { stato = on ; break; + + default: // Opzionale, quando non si verificano altre condizioni + break; } } diff --git a/advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino b/advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino index 9a4fa75..4abe599 100644 --- a/advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino +++ b/advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino @@ -11,7 +11,7 @@ Costrutto switch basato su uno struct. // 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 @@ -36,7 +36,7 @@ void loop() { // Stati stato = to_off ; // Setta il prossimo state - lum = 255; + // lum = 255; break; case to_off : @@ -54,7 +54,7 @@ void loop() { delay(pausa); stato = to_on ; - lum = 0; + // lum = 0; break; case to_on : @@ -66,6 +66,9 @@ void loop() { stato = on ; // Setta il prossimo state break; + + default: // Opzionale, quando non si verificano altre condizioni + break; } } @@ -103,4 +106,5 @@ Esercizi successivi: 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 */ diff --git a/basic/blinks/blink_2_2_funzioni_argomenti/blink_2_2_funzioni_argomenti.ino b/basic/blinks/blink_2_2_funzioni_argomenti/blink_2_2_funzioni_argomenti.ino index 78f992e..27f5ed3 100644 --- a/basic/blinks/blink_2_2_funzioni_argomenti/blink_2_2_funzioni_argomenti.ino +++ b/basic/blinks/blink_2_2_funzioni_argomenti/blink_2_2_funzioni_argomenti.ino @@ -1,4 +1,6 @@ - +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 @@ -26,7 +28,7 @@ void setup() { void loop() { brilla(300); brilla(300); - brilla(600); + brilla(); // default } // Funzioni create dall'utente: diff --git a/basic/blinks/millis/millis.ino b/basic/blinks/millis/millis.ino new file mode 100644 index 0000000..d2d473d --- /dev/null +++ b/basic/blinks/millis/millis.ino @@ -0,0 +1,35 @@ +/* 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)); + } +} diff --git a/hardware/ultrasonic/ultrasonic_distance_simple/ultrasonic_distance_simple.ino b/hardware/ultrasonic/ultrasonic_distance_simple/ultrasonic_distance_simple.ino index 85b5ad6..4bb971a 100644 --- a/hardware/ultrasonic/ultrasonic_distance_simple/ultrasonic_distance_simple.ino +++ b/hardware/ultrasonic/ultrasonic_distance_simple/ultrasonic_distance_simple.ino @@ -1,17 +1,20 @@ /* 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 -- 2.39.2