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 carte Arduino 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 Arduino
Une carte Arduino est une carte de développement électronique basée sur un microcontrôleur. Elle est conçue pour être facilement utilisable par les développeurs et les hobbyistes pour créer des projets électroniques.
Les cartes Arduino sont principalement utilisées pour contrôler des appareils électroniques en utilisant du code informatique, mais elles peuvent également être utilisées pour traiter et afficher des données. Elles sont souvent utilisées dans des projets de robotique, de domotique, de domaine de l’Internet des objets (IoT) et dans de nombreux autres domaines de l’électronique de loisir et professionnelle.
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.
Pour faire le montage, on a connecté:
Pour le capteur sonore HC-SR04 :
Pour le servomoteur:
Voici le programme qui permet de :
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 |
#include <Servo.h> Servo servo_1; // servo controller (multiple can exist) int trig = 4; // trig pin for HC-SR04 int echo = 5; // echo pin for HC-SR04 int servo_pin = 3; // PWM pin for servo control int pos = 0; // servo starting position float duration,distance; void setup() { Serial.begin(115200); Serial.println("Radar Start"); servo_1.attach(servo_pin); // start servo control pinMode(trig,OUTPUT); pinMode(echo,INPUT); } void loop() { for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees // in steps of 1 degree servo_1.write(pos); // tell servo to go to position in variable 'pos' delay(60); // delay to allow the servo to reach the desired position dist_calc(pos); } for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees servo_1.write(pos); // tell servo to go to position in variable 'pos' delay(60); dist_calc(pos); } } float dist_calc(int pos){ // trigger 40kHz pulse for ranging digitalWrite(trig,LOW); delayMicroseconds(2); digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig,LOW); // convert from duration for pulse to reach detector (microseconds) to range (in cm) duration = pulseIn(echo,HIGH); // duration for pulse to reach detector (in microseconds) distance = 100.0*(343.0*(duration/2.0))/1000000.0; // 100.0*(speed of sound*duration/2)/microsec conversion Serial.print(pos); // position of servo motor Serial.print(","); // comma separate variables Serial.println(distance); // print distance in cm } |
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 |
# 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 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 = False,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 = (decoded_bytes.replace('\r','')).replace('\n','') #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 |
zoritoler imol 13-04-2222
Respect to website author, some wonderful entropy.