### Projekt 04: Smart Parking
#### 1. Übersicht
Intelligente Parkplätze sind überall. Können wir auch einen intelligenten Parkplatz erstellen? Natürlich. Wir können einen Ultraschallsensor verwenden, um zu erkennen, ob sich Fahrzeuge davor befinden. Wenn ein Fahrzeug (oder Gegenstand) erkannt wird, das sich nähert, steuern wir den Servo, um die Hebestange anzuheben; Wenn erkannt wird, dass es sich entfernt, senkt der Servo die Hebestange.
#### 2. Komponenten
|  |  |  |
| :---------------------: | :---------------------------------: | :-----------------------------------------------: |
| micro:bit board *1 | micro:bit T-Typ Erweiterungsplatine *1 | micro USB Kabel *1 |
|  |  |  |
| Ultraschallsensor *1 | Servo *1 | DuPont Kabel |
|  |  |  |
| Steckbrett *1 | Jumper Kabel |Batteriehalter *1
(selbst mitgebrachte AA Batterien *2)|
|  |  | |
| Batteriekarte *1 | Hebestangenkarte *1 | |
#### 3. Komponentenwissen
**Servo**
Ein Servo ist ein Positionsantrieb. Wir können einen Servo verwenden, um die genaue Position zu steuern oder ein hohes Drehmoment auszugeben. Üblicherweise wird er in Robotern, ferngesteuerten Autos und sogar Flugzeugmodellen eingesetzt. Es gibt viele Spezifikationen, aber alle Servos haben drei Kabel: Signal (orange), Plus (rot) und Minus (braun). Die Farben können je nach Servo-Marke variieren.

**Innere Strukturdiagramm:**

① Signal: empfängt Steuersignale vom Mikrocontroller;
② Potentiometer: Die Position der Ausgangswelle kann gemessen werden, es gehört zum Feedback-Teil des gesamten Servos;
③ Interner Controller: Die eingebettete Platine verarbeitet Signale von der externen Steuerung, steuert den Motor und das Positionsfeedback, dies ist der Kern des gesamten Servos;
④ DC-Motor: Er dient als Aktuator zur Ausgabe von Geschwindigkeit, Drehmoment und Position;
⑤ Getriebe / Servomechanismus: Der Mechanismus vergrößert den vom Motor ausgegebenen Hub auf den endgültigen Ausgangswinkel entsprechend einem bestimmten Übersetzungsverhältnis.
**Servo ansteuern**
Senden Sie PWM-Signale an die Servosignalleitung, um dessen Ausgabe zu steuern. Der Tastgrad des PWM bestimmt direkt die Position der Ausgangswelle. Die Periode beträgt üblicherweise 20 Millisekunden und wird typischerweise so eingestellt, dass Impulse mit einer Frequenz von 50Hz erzeugt werden.
Zum Beispiel (180° Servo):
Wenn wir einen Puls mit einer Breite von 1,5 Millisekunden (ms) an den 180° Servo senden, bewegt sich die Ausgangswelle des Servos in die Mittelstellung (90 Grad);
Ist die Pulsbreite 0,5 ms, bewegt sich die Ausgangswelle auf 0 Grad;
Ist die Pulsbreite 2,5 ms, bewegt sich die Ausgangswelle auf 180 Grad;

**Parameter:**
- Betriebsspannung: DC 3,3V~5V
- Betriebstemperatur: -10°C ~ +50°C
- Abmessungen: 32,25mm x 12,25mm x 30,42mm
- Schnittstelle: 3-Pin Schnittstelle mit einem Abstand von 2,54mm
#### 4. Schaltplan

**Beim Einsatz des Ultraschallsensors und Servos müssen wir eine externe Stromversorgung anschließen und den DIP-Schalter auf ON stellen.**


#### 5. Programmablauf

#### 6. Testcode
Die Code-Datei befindet sich im Ordner Projekt 04:Smart-Parking, Datei Project-04-Smart-Parking\.py.

**Vollständiger Code:** Der Schwellenwert in der Bedingung 10 kann je nach tatsächlichen Bedingungen angepasst werden.
```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. Testergebnis
Klicken Sie auf „Flash“, um den Code auf das micro:bit Board zu laden.

Nach dem Herunterladen des Codes auf das Board **mit dem micro USB Kabel oder externer Stromversorgung einschalten (DIP-Schalter auf ON stellen)** und die Reset-Taste auf dem Board drücken.

Wenn der Ultraschallsensor ein Fahrzeug (oder Gegenstand) erkennt, das sich nähert, steuert der Servo die Hebestange zum Anheben; Wenn der Sensor erkennt, dass es sich entfernt, senkt der Servo die Hebestange.
**ACHTUNG:** Wenn die Verkabelung korrekt ist, Sie aber keine Ergebnisse sehen, drücken Sie die Reset-Taste auf der Rückseite des Boards.
