### Progetto 04: Parcheggio Intelligente
#### 1. Panoramica
I parcheggi intelligenti sono ovunque. Possiamo anche creare un parcheggio intelligente? Certo. Possiamo usare un sensore a ultrasuoni per rilevare se ci sono veicoli davanti. Quando un veicolo (o un oggetto) viene rilevato in avvicinamento, controlliamo il servo per sollevare l'asta di sollevamento; se viene rilevato che si allontana, il servo abbasserà l'asta di sollevamento.
#### 2. Componenti
|  |  |  |
| :---------------------: | :---------------------------------: | :-----------------------------------------------: |
| micro:bit board *1 | micro:bit T-type expansion board *1 | micro USB cable *1 |
|  |  |  |
| ultrasonic sensor *1 | servo *1 | DuPont wires |
|  |  |  |
| breadboard *1 | jump wires |battery holder *1
(batterie AA auto-fornite *2)|
|  |  | |
| bat card *1 | lift rod card *1 | |
#### 3. Conoscenza dei Componenti
**Servo**
Il servo è un attuatore di posizione. Possiamo usare il servo per controllare la posizione esatta o fornire alta coppia. Di solito viene usato in robot, automobili radiocomandate e persino modelli di aeroplani. Esistono molte specifiche, ma tutti i servi hanno tre fili: segnale (arancione), positivo (rosso) e negativo (marrone). Il colore può variare a seconda della marca del servo.

**Diagramma della struttura interna:**

① Segnale: riceve i segnali di controllo dal microcontrollore;
② potenziometro: può misurare la posizione dell'albero di uscita, fa parte del feedback dell'intero servo;
③ Controllore interno: la scheda embedded elabora i segnali di controllo esterni, aziona il motore e i segnali di feedback della posizione, è il cuore dell'intero servo;
④ Motore DC: funge da attuatore per fornire velocità, coppia e posizione;
⑤ Trasmissione / meccanismo del servo: il meccanismo amplifica la corsa fornita dal motore all'angolo finale di uscita secondo un certo rapporto di trasmissione.
**Azionare il servo**
Inviare segnali PWM alla linea del segnale del servo per controllarne l'uscita. Il duty cycle del PWM determina direttamente la posizione dell'albero di uscita. Il periodo è solitamente di 20 millisecondi e tipicamente impostato per generare impulsi a una frequenza di 50Hz.
Ad esempio (servo 180°):
Quando inviamo un impulso di larghezza 1,5 millisecondi (ms) al servo 180°, l'albero di uscita del servo si sposterà nella posizione centrale (90 gradi);
Se la larghezza dell'impulso è 0,5ms, l'albero di uscita si sposterà a 0 gradi;
Se la larghezza dell'impulso è 2,5ms, l'albero di uscita si sposterà a 180 gradi;

**Parametri:**
- Tensione di funzionamento: DC 3.3V~5V
- Temperatura di funzionamento: -10°C ~ +50°C
- Dimensioni: 32.25mm x 12.25mm x 30.42mm
- Interfaccia: interfaccia a 3 pin con passo di 2.54mm
#### 4. Schema di Collegamento

**Quando si utilizzano il sensore a ultrasuoni e il servo, dobbiamo collegare un'alimentazione esterna e impostare l'interruttore DIP su ON.**


#### 5. Flusso del Codice

#### 6. Codice di Test
Il file del codice è fornito nella cartella Progetto 04:Smart-Parking, file Project-04-Smart-Parking\.py.

**Codice completo:** La soglia nella condizione 10 può essere modificata in base alle condizioni reali.
```python
'''
Function: smart parking
Compiling IDE: MU 1.2.0
Author: https://docs.keyestudio.com
'''
# import related libraries
from microbit import *
import ustruct
import machine
from time import sleep_us
distance = 0 # set variable distance initial value to 0
lastEchoDuration = 0 # set variable lastEchoDuration initial value to 0
val = Image("09990:""09090:""09990:""09000:""09000") # set iamge
display.show(val) # LED matrix shows image
pin0.write_analog(25.6) # set P0 pin analog to 25.6, servo angle to 0°
sleep(200)
while True:
pin0.set_analog_period(20) # set servo frequency
# Ultrasonic sensor sends and receives signals
pin1.write_digital(0)
sleep_us(2)
pin1.write_digital(1)
sleep_us(15)
pin1.write_digital(0)
# measure the time interval between "when rising edge detected from the pin2" and "until the pin becomes low again"
# unit is μs. Assign the interval to variable t.
t = machine.time_pulse_us(pin2, 1, 35000)
# a conditional statement, used to check whether the values of two variables t and lastechoduration satisfy specific conditions.
# If both conditions are met, the block of code under the condition statement is executed.
if (t <= 0 and lastEchoDuration >= 0):
t = lastEchoDuration # variable t = variable lastechoduration
else:
lastEchoDuration = t
distance = int(t * 0.017) # calculate distance
if distance < 10: # if distance < 10cm
pin0.write_analog(77) # servo rotate to 90°
sleep(2000)
else: # or
sleep(2000)
pin0.write_analog(25.6)
sleep(2000)
```
#### 7. Risultato del Test
Clicca “Flash” per caricare il codice sulla scheda micro:bit.

Dopo aver scaricato il codice sulla scheda, **accendi tramite cavo micro USB o alimentazione esterna (imposta l'interruttore DIP su ON)**, e premi il pulsante di reset sulla scheda.

Quando il sensore a ultrasuoni rileva un veicolo (o oggetto) in avvicinamento, il servo controlla l'asta di sollevamento per alzarla; se il sensore rileva che si allontana, il servo abbasserà l'asta di sollevamento.
**ATTENZIONE:** Se il cablaggio è corretto ma non vedi i risultati, premi il pulsante di reset sul retro della scheda.
