Dans ce projet on va réaliser une voiture équipée d’une carte ESP32 à distance (par Wifi).
L’utilisateur commande la voiture par un simple navigateur web qui affiche les boutons de direction (avant, droite, gauche, arrière et gauche).
Pour commander la voiture par wifi, on ouvre un navigateur web et on saisit l’adresse IP de la carte Esp32 pour obtenir une interface de commandement comme dans l’image ci-dessous.
Copiez le code suivant dans le fichier ESP32 boot.py.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# Complete project details at https://RandomNerdTutorials.com from dcmotor import DCMotor from machine import Pin, PWM from time import sleep try: import usocket as socket except: import socket from machine import Pin import network import esp esp.osdebug(None) import gc gc.collect() ssid = '***********' # login du WIFI password = '***********' # mot de passe du WIFI station = network.WLAN(network.STA_IF) station.active(True) station.connect(ssid, password) while station.isconnected() == False: pass print('Connection successful') print(station.ifconfig()) #led = Pin(2, Pin.OUT) frequency = 15000 pin1 = Pin(5, Pin.OUT) pin2 = Pin(4, Pin.OUT) pin3 = Pin(23, Pin.OUT) pin4 = Pin(22, Pin.OUT) enable = PWM(Pin(18), frequency) enable1 = PWM(Pin(21), frequency) dc_motor = DCMotor(pin1, pin2, enable) dc_motor = DCMotor(pin1, pin2, enable, 350, 1023) dc_motor1 = DCMotor(pin3, pin4, enable1) dc_motor1 = DCMotor(pin3, pin4, enable1, 350, 1023) |
Copiez le code suivant dans le fichier ESP32 main.py.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# Complete project details at https://RandomNerdTutorials.com def web_page(): html = """<html><head> <title>ESP Web Server</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;} h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none; border-radius: 4px; color: white; padding: 16px 30px; text-decoration: none; font-size: 10px; margin: 2px; cursor: pointer;} .button2{background-color: #4286f4;}.button3{background-color: red;}</style></head><body> <h1>ESP Web Server</h1> <strong>Commander une voiture</strong></p> <table> <tr><td></td><td><p><a href="/?direction=avant"><button class="button button2">AVANT</button></a></p></td><td></td></tr> <tr><td><p><a href="/?direction=gauche"><button class="button button2">GAUCHE</button></a></p></td><td><p><a href="/?direction=off"><button class="button button3">STOP</button></a></p></td> <td><p><a href="/?direction=droite"><button class="button button2">DROITE</button></a></p></td></tr> <tr><td></td><td><p><a href="/?direction=arriere"><button class="button button2">ARRIERE</button></a></p></td><td></td></tr> </body></html> </table> """ return html s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', 80)) s.listen(5) while True: conn, addr = s.accept() print('Got a connection from %s' % str(addr)) request = conn.recv(1024) request = str(request) print('Content = %s' % request) direction_avant = request.find('/?direction=avant') direction_stop = request.find('/?direction=off') direction_droite = request.find('/?direction=droite') direction_gauche = request.find('/?direction=gauche') direction_arriere = request.find('/?direction=arriere') if direction_avant == 6: #si on clique sur le bouton Avant dc_motor.forward(80) # la voiture avance dc_motor1.forward(80) if direction_stop == 6: #si on clique sur le bouton Stop dc_motor.stop() # la voiture s'arrête dc_motor1.stop() if direction_droite == 6: #si on clique sur le bouton droite dc_motor.forward(10) # la voiture tourne à droite dc_motor1.forward(80) if direction_gauche == 6: #si on clique sur le bouton gauche dc_motor.forward(80) # la voiture tourne à gauche dc_motor1.forward(10) if direction_arriere == 6: #si on clique sur le bouton arriere dc_motor.backwards(80) # la voiture recule dc_motor1.backwards(80) response = web_page() conn.send('HTTP/1.1 200 OK\n') conn.send('Content-Type: text/html\n') conn.send('Connection: close\n\n') conn.sendall(response) conn.close() |
Copiez le code suivant dans un fichier ESP32 nommé dcmotor.py.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class DCMotor: def __init__(self, pin1, pin2, enable_pin, min_duty=750, max_duty=1023): self.pin1=pin1 self.pin2=pin2 self.enable_pin=enable_pin self.min_duty = min_duty self.max_duty = max_duty def forward(self,speed): self.speed = speed self.enable_pin.duty(self.duty_cycle(self.speed)) self.pin1.value(1) self.pin2.value(0) def backwards(self, speed): self.speed = speed self.enable_pin.duty(self.duty_cycle(self.speed)) self.pin1.value(0) self.pin2.value(1) def stop(self): self.enable_pin.duty(0) self.pin1.value(0) self.pin2.value(0) def duty_cycle(self, speed): if self.speed <= 0 or self.speed > 100: duty_cycle = 0 else: duty_cycle = int(self.min_duty + (self.max_duty - self.min_duty)*((self.speed-1)/(100-1))) return duty_cycle |