Un radar est un système qui utilise des ondes radio pour détecter la présence, la distance et la vitesse d’objets à proximité. Les radars sont largement utilisés dans de nombreuses applications, notamment la navigation aérienne, la surveillance de la circulation routière et la détection des intrusions.
Le fonctionnement d’un radar est basé sur le principe de l’écho. Lorsqu’un signal radio est émis par un radar, il est réfléchi par les objets proches et revient au radar sous forme d’un écho. En mesurant le temps qu’il a fallu au signal pour aller et venir, le radar peut calculer la distance de l’objet. En analysant la fréquence du signal de retour, le radar peut également déterminer la vitesse de l’objet.
Il existe de nombreuses variantes de radars, qui diffèrent par la fréquence des ondes utilisées, la manière de générer et de détecter les ondes, et la façon de traiter les données de retour. Certains radars utilisent des ondes radio à haute fréquence, tandis que d’autres utilisent des ondes microwaves. Les radars peuvent être actifs (qui émettent leur propre signal) ou passifs (qui ne font que détecter les signaux existants).
En résumé, un radar est un outil de détection à distance qui utilise des ondes radio pour repérer et mesurer la distance et la vitesse des objets. Il est utilisé dans de nombreuses applications pour surveiller l’environnement et prendre des décisions en conséquence.
Dans ce projet, nous allons concevoir un projet utilisant la care ESP32 et un capteur à ultrasons pour la détection.
Ce projet vise à réaliser un prototype de système radar qui détecte les objets fixes et mobiles.
carte ESP32
ESP32 est une carte de développement électronique basée sur le microcontrôleur ESP32 de la société Espressif. Il s’agit d’un microcontrôleur à double cœur avec un processeur principal Xtensa LX6 et un processeur secondaire dedié au traitement du signal. La carte ESP32 est conçue pour être utilisée dans les applications IoT (Internet des objets) et comprend une variété de fonctionnalités pour faciliter la communication avec d’autres dispositifs et l’accès à Internet.
Voici quelques-unes des principales caractéristiques de la carte ESP32 :
Capteur HC-SR04
Le capteur HC-SR04 est un capteur de distance à ultrasons qui peut être utilisé pour mesurer la distance entre l’objet et le capteur en envoyant une impulsion ultrasonore et en mesurant le temps qu’il faut pour qu’elle soit renvoyée. Le capteur HC-SR04 comprend deux éléments transducteurs ultrasonores, un émetteur et un récepteur. L’émetteur envoie une impulsion ultrasonore qui est renvoyée par l’objet lorsqu’elle heurte sa surface. Le récepteur reçoit l’impulsion renvoyée et le temps qui s’écoule entre l’envoi de l’impulsion et sa réception est mesuré. La distance de l’objet peut alors être déterminée en utilisant la vitesse de l’onde ultrasonore et le temps mesuré.
servomoteurs
Un servomoteur est un moteur électrique qui peut être utilisé pour commander la position, la vitesse ou la force d’un système mécanique. Les servomoteurs sont souvent utilisés dans les applications de contrôle de mouvement précis, telles que les robots, les systèmes de positionnement et les machines-outils.
Un servomoteur comprend un moteur électrique, un réducteur et un dispositif de commande. Le moteur électrique est utilisé pour fournir la force de déplacement. Le réducteur est utilisé pour réduire la vitesse et augmenter la force du moteur. Le dispositif de commande est utilisé pour contrôler la position, la vitesse ou la force du servomoteur.
Il existe plusieurs types de servomoteurs, qui diffèrent principalement par leur méthode de commande et par leur capacité de déplacement. Les servomoteurs peuvent être commandés par impulsion, par tension ou par courant. Ils peuvent également être classés selon leur capacité de déplacement en servomoteurs linéaires et en servomoteurs rotatifs.
module d’alimentation de 5V/3.3V
Un module d’alimentation de 5V/3.3V est un appareil qui permet de fournir une tension de 5 volts ou de 3,3 volts à un circuit électronique. Il est généralement utilisé pour alimenter des cartes de développement comme les cartes Arduino, qui nécessitent une tension de 5 volts pour fonctionner correctement.
Le module d’alimentation de 5V/3.3V est généralement composé d’un convertisseur de tension qui permet de régler la tension de sortie en fonction des besoins du circuit. Il est également équipé d’un connecteur d’alimentation qui permet de brancher le module sur une source de courant (par exemple, une prise de courant ou un port USB).
Pour utiliser un module d’alimentation de 5V/3.3V, il suffit de le brancher sur une source de courant et de connecter le circuit à alimenter au connecteur de sortie. Vous pouvez régler la tension de sortie en utilisant les commandes du module (si elles sont disponibles).
Il est important de noter que le module d’alimentation de 5V/3.3V ne doit être utilisé que pour alimenter des circuits électroniques qui nécessitent une tension de 5 volts ou de 3,3 volts. Utiliser une tension supérieure peut endommager le circuit et être dangereux. Assurez-vous de vérifier la tension requise par le circuit avant de l’alimenter avec un module d’alimentation.
Pour faire le montage, on a connecté:
Pour le capteur sonore HC-SR04 :
Pour le servomoteur:
Voici le programme qui permet de :
Remarque: il faut utiliser ces deux bibliothèques : hcsr04 et servo
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 |
import machine from hcsr04 import HCSR04 from machine import UART,Pin from servo import Servo import utime # Initialize a UART objects uart = UART(2, baudrate=115200) sensor = HCSR04(trigger_pin=22,echo_pin=21,echo_timeout_us=1000000) servo_pin = machine.Pin(23) my_servo = Servo(servo_pin) delay = 0.01 min = 15 max = 165 count = 1 while True: for i in range(min,max): my_servo.write_angle(i) distance = sensor.distance_cm() if distance > 1000 : distance=0 print(i,',',distance) utime.sleep_ms(60) for i in range(max, min, -1): my_servo.write_angle(i) utime.sleep_ms(60) distance = sensor.distance_cm() if distance > 1000 : distance=0 print(i,',',distance) |
Ce programme permet de recevoir des données de la carte ESP32 et de les afficher sur l’écran
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
# Python + Arduino-based Radar Plotter # # ** Works with any motor that outputs angular rotation # ** and with any distance sensor (HC-SR04, VL53L0x,LIDAR) # import numpy as np import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt from matplotlib.widgets import Button import serial,sys,glob import serial.tools.list_ports as COMs # # ############################################ # Find Arudino ports, select one, then start communication with it ############################################ # def port_search(): if sys.platform.startswith('win'): # Windows ports = ['COM{0:1.0f}'.format(ii) for ii in range(1,256)] elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'): ports = glob.glob('/dev/tty[A-Za-z]*') elif sys.platform.startswith('darwin'): # MAC ports = glob.glob('/dev/tty.*') else: raise EnvironmentError('Machine Not pyserial Compatible') arduinos = [] for port in ports: # loop through to determine if accessible if len(port.split('Bluetooth'))>1: continue try: ser = serial.Serial(port) ser.close() arduinos.append(port) # if we can open it, consider it an arduino except (OSError, serial.SerialException): pass return arduinos arduino_ports = port_search() #ser = serial.Serial(arduino_ports[0],baudrate=115200) # match baud on Arduino port1="COM4" ser = serial.Serial(port1,baudrate=115200) ser.flush() # clear the port # ############################################ # Start the interactive plotting tool and # plot 180 degrees with dummy data to start ############################################ # fig = plt.figure(facecolor='k') win = fig.canvas.manager.window # figure window screen_res = win.wm_maxsize() # used for window formatting later dpi = 150.0 # figure resolution fig.set_dpi(dpi) # set figure resolution # polar plot attributes and initial conditions ax = fig.add_subplot(111,polar=True,facecolor='#006d70') ax.set_position([-0.05,-0.05,1.1,1.05]) r_max = 100.0 # can change this based on range of sensor ax.set_ylim([0.0,r_max]) # range of distances to show ax.set_xlim([0.0,np.pi]) # limited by the servo span (0-180 deg) ax.tick_params(axis='both',colors='w') ax.grid(color='w',alpha=0.5) # grid color ax.set_rticks(np.linspace(0.0,r_max,5)) # show 5 different distances ax.set_thetagrids(np.linspace(0.0,180.0,10)) # show 10 angles angles = np.arange(0,181,1) # 0 - 180 degrees theta = angles*(np.pi/180.0) # to radians dists = np.ones((len(angles),)) # dummy distances until real data comes in pols, = ax.plot([],linestyle='',marker='o',markerfacecolor = 'w', markeredgecolor='#EFEFEF',markeredgewidth=1.0, markersize=10.0,alpha=0.9) # dots for radar points line1, = ax.plot([],color='w', linewidth=4.0) # sweeping arm plot # figure presentation adjustments fig.set_size_inches(0.96*(screen_res[0]/dpi),0.96*(screen_res[1]/dpi)) plot_res = fig.get_window_extent().bounds # window extent for centering win.wm_geometry('+{0:1.0f}+{1:1.0f}'.\ format((screen_res[0]/2.0)-(plot_res[2]/2.0), (screen_res[1]/2.0)-(plot_res[3]/2.0))) # centering plot fig.canvas.toolbar.pack_forget() # remove toolbar for clean presentation fig.canvas.set_window_title('Arduino Radar') fig.canvas.draw() # draw before loop axbackground = fig.canvas.copy_from_bbox(ax.bbox) # background to keep during loop ############################################ # button event to stop program ############################################ def stop_event(event): global stop_bool stop_bool = 1 prog_stop_ax = fig.add_axes([0.85,0.025,0.125,0.05]) pstop = Button(prog_stop_ax,'Stop Program',color='#FCFCFC',hovercolor='w') pstop.on_clicked(stop_event) # button to close window def close_event(event): global stop_bool,close_bool if stop_bool: plt.close('all') stop_bool = 1 close_bool = 1 close_ax = fig.add_axes([0.025,0.025,0.125,0.05]) close_but = Button(close_ax,'Close Plot',color='#FCFCFC',hovercolor='w') close_but.on_clicked(close_event) fig.show() ############################################ # inifinite loop, constantly updating the # 180deg radar with incoming Arduino data ############################################ # start_word,stop_bool,close_bool = True,False,False while True: try: if stop_bool: # stops program fig.canvas.toolbar.pack_configure() # show toolbar if close_bool: # closes radar window plt.close('all') break ser_bytes = ser.readline() # read Arduino serial data decoded_bytes = ser_bytes.decode('utf-8') # decode data to utf-8 #data =ser_bytes.decode('utf-8') print(decoded_bytes) data = (decoded_bytes.replace('\r','')).replace('\n','').replace(' ','') #print(data.split(',')) if start_word: vals = [float(ii) for ii in data.split(',')] print(vals) if len(vals)<2: continue angle,dist = vals # separate into angle and distance if dist>r_max: dist = 0.0 # measuring more than r_max, it's likely inaccurate dists[int(angle)] = dist if angle % 5 ==0: # update every 5 degrees pols.set_data(theta,dists) fig.canvas.restore_region(axbackground) ax.draw_artist(pols) line1.set_data(np.repeat((angle*(np.pi/180.0)),2), np.linspace(0.0,r_max,2)) ax.draw_artist(line1) fig.canvas.blit(ax.bbox) # replot only data fig.canvas.flush_events() # flush for next plot else: if data=='Radar Start': # stard word on Arduno start_word = True # wait for Arduino to output start word print('Radar Starting...') else: continue except KeyboardInterrupt: plt.close('all') print('Keyboard Interrupt') break |