Desarrollo del Prototipo » History » Version 78
antonella butron, 11/17/2024 10:54 PM
| 1 | 33 | antonella butron | ---- |
|---|---|---|---|
| 2 | 33 | antonella butron | |
| 3 | 34 | antonella butron | h1=. %{color: purple}Desarrollo del Prototipo% |
| 4 | 1 | antonella butron | |
| 5 | 32 | bastian cruz | h1=. %{color: purple}Avance del robot EV3% |
| 6 | 8 | antonella butron | |
| 7 | 72 | antonella butron | h1=. "Robot se mueve solo":https://youtube.com/shorts/gr5waMOEi_Q?si=b0sV5mOU094Sfs_I (video) |
| 8 | 71 | antonella butron | |
| 9 | 72 | antonella butron | h1=. "Movimiento de la Garra":https://youtube.com/shorts/DefEWpvIxXI?si=5R5jll9lt9r1wHsJ (video) |
| 10 | 69 | antonella butron | |
| 11 | 69 | antonella butron | |
| 12 | 1 | antonella butron | |
| 13 | 64 | antonella butron | table{border-collapse: collapse; width: 100%; text-align:center}. |
| 14 | 62 | antonella butron | |{border: 1px solid black; background-color:#D8BFD8; font-size: 15px; text-align:center}. *Versión* |{border: 1px solid black; background-color:#D8BFD8; font-size: 15px; text-align:center}. *Imagen* | |
| 15 | 66 | antonella butron | |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. _Versión Beta_ |{border: 1px solid black; text-align:center; background-color: #F7F2F7;}. !vprueba.jpg! | |
| 16 | 67 | antonella butron | |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. _Versión 1_ |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. !V1.jpg! | |
| 17 | 66 | antonella butron | |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. _Versión 2_ |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. !V2.jpg! | |
| 18 | 66 | antonella butron | |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. _Versión 3_ |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. !V3.jpg! | |
| 19 | 66 | antonella butron | |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. _Versión 4_ |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. !V4.jpg! | |
| 20 | 66 | antonella butron | |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. _Versión 5_ |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. !V5.jpg! | |
| 21 | 66 | antonella butron | |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. _Versión 6_ |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. !V6A.jpg! | |
| 22 | 66 | antonella butron | |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. _Versión 7_ |{border: 1px solid black;text-align:center; background-color: #F7F2F7;}. !V7final.jpg! | |
| 23 | 57 | antonella butron | |
| 24 | 54 | antonella butron | |
| 25 | 54 | antonella butron | |
| 26 | 54 | antonella butron | |
| 27 | 27 | antonella butron | h1=. **Código Utilizado** |
| 28 | 33 | antonella butron | |
| 29 | 73 | antonella butron | Interfaz Gráfica |
| 30 | 73 | antonella butron | |
| 31 | 73 | antonella butron | |
| 32 | 76 | antonella butron | <pre> |
| 33 | 76 | antonella butron | import socket |
| 34 | 76 | antonella butron | import tkinter as tk |
| 35 | 76 | antonella butron | from tkinter import font, messagebox |
| 36 | 76 | antonella butron | import threading |
| 37 | 73 | antonella butron | |
| 38 | 76 | antonella butron | class EV3ControlApp: |
| 39 | 76 | antonella butron | contador_subir = 0 |
| 40 | 76 | antonella butron | contador_bajar = 1 |
| 41 | 76 | antonella butron | contador_abrir = 1 |
| 42 | 76 | antonella butron | contador_cerrar = 0 |
| 43 | 76 | antonella butron | |
| 44 | 76 | antonella butron | def __init__(self, master): |
| 45 | 76 | antonella butron | self.master = master |
| 46 | 76 | antonella butron | self.master.title("EV3 Control Panel") |
| 47 | 76 | antonella butron | self.master.configure(bg='#1a1a1a') |
| 48 | 76 | antonella butron | self.master.geometry('600x400') |
| 49 | 76 | antonella butron | |
| 50 | 76 | antonella butron | self.sock = None |
| 51 | 76 | antonella butron | |
| 52 | 76 | antonella butron | # Configuración de columnas y filas |
| 53 | 76 | antonella butron | self.master.grid_columnconfigure(0, weight=1) |
| 54 | 76 | antonella butron | self.master.grid_columnconfigure(1, weight=1) |
| 55 | 76 | antonella butron | self.master.grid_columnconfigure(2, weight=1) |
| 56 | 76 | antonella butron | self.master.grid_columnconfigure(3, weight=1) |
| 57 | 76 | antonella butron | self.master.grid_rowconfigure(10, weight=1) |
| 58 | 76 | antonella butron | self.master.grid_rowconfigure(11, weight=1) |
| 59 | 76 | antonella butron | self.master.grid_rowconfigure(12, weight=1) |
| 60 | 76 | antonella butron | self.master.grid_rowconfigure(13, weight=1) |
| 61 | 76 | antonella butron | self.master.grid_rowconfigure(14, weight=1) |
| 62 | 76 | antonella butron | self.master.grid_rowconfigure(15, weight=1) |
| 63 | 76 | antonella butron | |
| 64 | 76 | antonella butron | # Configuración de fuentes y estilo |
| 65 | 76 | antonella butron | self.btn_font = font.Font(family='Helvetica', size=14, weight='bold') |
| 66 | 76 | antonella butron | self.bg_color = '#2e2e2e' |
| 67 | 76 | antonella butron | self.fg_color = 'white' |
| 68 | 76 | antonella butron | self.active_bg = '#4d4d4d' |
| 69 | 76 | antonella butron | self.padx = 15 |
| 70 | 76 | antonella butron | self.pady = 15 |
| 71 | 76 | antonella butron | |
| 72 | 76 | antonella butron | # Crear widgets |
| 73 | 76 | antonella butron | self.create_widgets() |
| 74 | 76 | antonella butron | |
| 75 | 76 | antonella butron | def create_widgets(self): |
| 76 | 76 | antonella butron | self.ip_label = tk.Label(self.master, text="IP del EV3:", font=self.btn_font, bg=self.master['bg'], fg=self.fg_color) |
| 77 | 76 | antonella butron | self.ip_label.grid(row=10, column=1, padx=self.padx, pady=self.pady) |
| 78 | 76 | antonella butron | |
| 79 | 76 | antonella butron | self.ip_entry = tk.Entry(self.master, font=self.btn_font, bg=self.bg_color, fg=self.fg_color) |
| 80 | 76 | antonella butron | self.ip_entry.grid(row=10, column=2, padx=self.padx, pady=self.pady) |
| 81 | 76 | antonella butron | |
| 82 | 76 | antonella butron | self.btn_connect = tk.Button(self.master, text="Conectar", font=self.btn_font, bg=self.bg_color, fg=self.fg_color, |
| 83 | 76 | antonella butron | activebackground=self.active_bg, command=self.start_connect_thread) |
| 84 | 76 | antonella butron | self.btn_connect.grid(row=10, column=3, padx=self.padx, pady=self.pady) |
| 85 | 76 | antonella butron | |
| 86 | 76 | antonella butron | # Botones de control de movimiento |
| 87 | 76 | antonella butron | self.btn_up = tk.Button(self.master, text="▲", font=self.btn_font, bg=self.bg_color, fg=self.fg_color, |
| 88 | 76 | antonella butron | activebackground=self.active_bg, command=self.move_up) |
| 89 | 76 | antonella butron | self.btn_up.grid(row=11, column=1, padx=self.padx, pady=self.pady, sticky="nsew") |
| 90 | 76 | antonella butron | |
| 91 | 76 | antonella butron | self.btn_left = tk.Button(self.master, text="", font=self.btn_font, bg=self.bg_color, fg=self.fg_color, |
| 92 | 76 | antonella butron | activebackground=self.active_bg, command=self.move_left) |
| 93 | 76 | antonella butron | self.btn_left.grid(row=12, column=0, padx=self.padx, pady=self.pady, sticky="nsew") |
| 94 | 76 | antonella butron | |
| 95 | 76 | antonella butron | self.btn_stop = tk.Button(self.master, text="■", font=self.btn_font, bg=self.bg_color, fg=self.fg_color, |
| 96 | 76 | antonella butron | activebackground=self.active_bg, command=self.stop) |
| 97 | 76 | antonella butron | self.btn_stop.grid(row=12, column=1, padx=self.padx, pady=self.pady, sticky="nsew") |
| 98 | 76 | antonella butron | |
| 99 | 76 | antonella butron | self.btn_right = tk.Button(self.master, text="", font=self.btn_font, bg=self.bg_color, fg=self.fg_color, |
| 100 | 76 | antonella butron | activebackground=self.active_bg, command=self.move_right) |
| 101 | 76 | antonella butron | self.btn_right.grid(row=12, column=2, padx=self.padx, pady=self.pady, sticky="nsew") |
| 102 | 76 | antonella butron | |
| 103 | 76 | antonella butron | self.btn_down = tk.Button(self.master, text="▼", font=self.btn_font, bg=self.bg_color, fg=self.fg_color, |
| 104 | 76 | antonella butron | activebackground=self.active_bg, command=self.move_down) |
| 105 | 76 | antonella butron | self.btn_down.grid(row=13, column=1, padx=self.padx, pady=self.pady, sticky="nsew") |
| 106 | 76 | antonella butron | |
| 107 | 76 | antonella butron | self.btn_claw_updown = tk.Button(self.master, text="Subir/Bajar garra", font=self.btn_font, bg=self.bg_color, fg=self.fg_color, |
| 108 | 76 | antonella butron | activebackground=self.active_bg, command=self.handle_updown) |
| 109 | 76 | antonella butron | self.btn_claw_updown.grid(row=12, column=3, padx=self.padx, pady=self.pady, sticky="nsew") |
| 110 | 76 | antonella butron | |
| 111 | 76 | antonella butron | self.btn_claw_openclose = tk.Button(self.master, text="Abrir/Cerrar garra", font=self.btn_font, bg=self.bg_color, fg=self.fg_color, |
| 112 | 76 | antonella butron | activebackground=self.active_bg, command=self.handle_openclose) |
| 113 | 76 | antonella butron | self.btn_claw_openclose.grid(row=13, column=3, padx=self.padx, pady=self.pady, sticky="nsew") |
| 114 | 76 | antonella butron | |
| 115 | 76 | antonella butron | self.btn_stop_handle = tk.Button(self.master, text="Parar garra", font=self.btn_font, bg=self.bg_color, fg=self.fg_color, |
| 116 | 76 | antonella butron | activebackground='#ff4c4c', command=self.stop_handle) |
| 117 | 76 | antonella butron | self.btn_stop_handle.grid(row=14, column=3, columnspan=2, padx=self.padx, pady=self.pady, sticky="nsew") |
| 118 | 76 | antonella butron | |
| 119 | 76 | antonella butron | self.btn_quit = tk.Button(self.master, text="Cerrar servidor", font=self.btn_font, bg='#ff5c5c', fg=self.fg_color, |
| 120 | 76 | antonella butron | activebackground='#ff4c4c', command=self.quit_app) |
| 121 | 76 | antonella butron | self.btn_quit.grid(row=15, column=1, columnspan=2, padx=self.padx, pady=self.pady, sticky="nsew") |
| 122 | 76 | antonella butron | |
| 123 | 76 | antonella butron | def start_connect_thread(self): |
| 124 | 76 | antonella butron | ip = self.ip_entry.get() |
| 125 | 76 | antonella butron | if self.is_valid_ip(ip): |
| 126 | 76 | antonella butron | threading.Thread(target=self.connect, args=(ip,), daemon=True).start() |
| 127 | 76 | antonella butron | else: |
| 128 | 76 | antonella butron | messagebox.showerror("Error de entrada", "La dirección IP ingresada no es válida.") |
| 129 | 76 | antonella butron | |
| 130 | 76 | antonella butron | def is_valid_ip(self, ip): |
| 131 | 76 | antonella butron | parts = ip.split('.') |
| 132 | 76 | antonella butron | if len(parts) != 4: |
| 133 | 76 | antonella butron | return False |
| 134 | 76 | antonella butron | for part in parts: |
| 135 | 76 | antonella butron | if not part.isdigit() or not (0 <= int(part) < 256): |
| 136 | 76 | antonella butron | return False |
| 137 | 76 | antonella butron | return True |
| 138 | 76 | antonella butron | |
| 139 | 76 | antonella butron | def connect(self, ip): |
| 140 | 76 | antonella butron | try: |
| 141 | 76 | antonella butron | if self.sock is not None: |
| 142 | 76 | antonella butron | self.sock.close() |
| 143 | 76 | antonella butron | self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| 144 | 76 | antonella butron | self.sock.connect((ip, 8080)) |
| 145 | 76 | antonella butron | messagebox.showinfo("Conexión", "Conectado correctamente al EV3.") |
| 146 | 76 | antonella butron | self.enable_controls(True) |
| 147 | 76 | antonella butron | except Exception as e: |
| 148 | 76 | antonella butron | messagebox.showerror("Error de conexión", f"No se pudo conectar a {ip}. \n{str(e)}") |
| 149 | 76 | antonella butron | self.enable_controls(False) |
| 150 | 76 | antonella butron | |
| 151 | 76 | antonella butron | def enable_controls(self, state): |
| 152 | 76 | antonella butron | self.btn_up.config(state=tk.NORMAL if state else tk.DISABLED) |
| 153 | 76 | antonella butron | self.btn_left.config(state=tk.NORMAL if state else tk.DISABLED) |
| 154 | 76 | antonella butron | self.btn_stop.config(state=tk.NORMAL if state else tk.DISABLED) |
| 155 | 76 | antonella butron | self.btn_right.config(state=tk.NORMAL if state else tk.DISABLED) |
| 156 | 76 | antonella butron | self.btn_down.config(state=tk.NORMAL if state else tk.DISABLED) |
| 157 | 76 | antonella butron | self.btn_claw_updown.config(state=tk.NORMAL if state else tk.DISABLED) |
| 158 | 76 | antonella butron | self.btn_claw_openclose.config(state=tk.NORMAL if state else tk.DISABLED) |
| 159 | 76 | antonella butron | self.btn_stop_handle.config(state=tk.NORMAL if state else tk.DISABLED) |
| 160 | 76 | antonella butron | self.btn_quit.config(state=tk.NORMAL if state else tk.DISABLED) |
| 161 | 76 | antonella butron | |
| 162 | 76 | antonella butron | def send_command(self, command): |
| 163 | 76 | antonella butron | if self.sock: |
| 164 | 76 | antonella butron | self.sock.sendall(command.encode('utf-8')) |
| 165 | 76 | antonella butron | |
| 166 | 76 | antonella butron | def move_up(self): |
| 167 | 76 | antonella butron | self.send_command('w') |
| 168 | 76 | antonella butron | |
| 169 | 76 | antonella butron | def move_down(self): |
| 170 | 76 | antonella butron | self.send_command('s') |
| 171 | 76 | antonella butron | |
| 172 | 76 | antonella butron | def move_left(self): |
| 173 | 76 | antonella butron | self.send_command('a') |
| 174 | 76 | antonella butron | |
| 175 | 76 | antonella butron | def move_right(self): |
| 176 | 76 | antonella butron | self.send_command('d') |
| 177 | 76 | antonella butron | |
| 178 | 76 | antonella butron | def stop(self): |
| 179 | 76 | antonella butron | self.send_command('x') |
| 180 | 76 | antonella butron | |
| 181 | 76 | antonella butron | def handle_updown(self): |
| 182 | 76 | antonella butron | if EV3ControlApp.contador_bajar == 0: |
| 183 | 76 | antonella butron | self.send_command('g') |
| 184 | 76 | antonella butron | EV3ControlApp.contador_bajar += 1 |
| 185 | 76 | antonella butron | EV3ControlApp.contador_subir = 0 |
| 186 | 76 | antonella butron | else: |
| 187 | 76 | antonella butron | self.send_command('t') |
| 188 | 76 | antonella butron | EV3ControlApp.contador_subir += 1 |
| 189 | 76 | antonella butron | EV3ControlApp.contador_bajar = 0 |
| 190 | 76 | antonella butron | |
| 191 | 76 | antonella butron | def handle_openclose(self): |
| 192 | 76 | antonella butron | if EV3ControlApp.contador_cerrar == 0: |
| 193 | 76 | antonella butron | self.send_command('f') |
| 194 | 76 | antonella butron | EV3ControlApp.contador_cerrar += 1 |
| 195 | 76 | antonella butron | EV3ControlApp.contador_abrir = 0 |
| 196 | 76 | antonella butron | else: |
| 197 | 76 | antonella butron | self.send_command('r') |
| 198 | 76 | antonella butron | EV3ControlApp.contador_abrir += 1 |
| 199 | 76 | antonella butron | EV3ControlApp.contador_cerrar = 0 |
| 200 | 76 | antonella butron | |
| 201 | 76 | antonella butron | def stop_handle(self): |
| 202 | 76 | antonella butron | self.send_command('c') |
| 203 | 76 | antonella butron | |
| 204 | 76 | antonella butron | def quit_app(self): |
| 205 | 76 | antonella butron | if EV3ControlApp.contador_abrir == 0: |
| 206 | 76 | antonella butron | self.send_command('r') |
| 207 | 76 | antonella butron | if EV3ControlApp.contador_bajar == 0: |
| 208 | 76 | antonella butron | self.send_command('g') |
| 209 | 76 | antonella butron | self.send_command('c') |
| 210 | 76 | antonella butron | self.send_command('q') |
| 211 | 76 | antonella butron | self.sock.close() |
| 212 | 76 | antonella butron | self.master.quit() |
| 213 | 76 | antonella butron | |
| 214 | 76 | antonella butron | if __name__ == "__main__": |
| 215 | 76 | antonella butron | root = tk.Tk() |
| 216 | 76 | antonella butron | app = EV3ControlApp(root) |
| 217 | 76 | antonella butron | root.mainloop() |
| 218 | 77 | antonella butron | </pre> |
| 219 | 73 | antonella butron | |
| 220 | 78 | antonella butron | EV3 |
| 221 | 73 | antonella butron | |
| 222 | 78 | antonella butron | <pre> |
| 223 | 78 | antonella butron | |
| 224 | 78 | antonella butron | from ev3dev2.motor import MoveTank , OUTPUT_A, OUTPUT_B, LargeMotor , OUTPUT_C, MediumMotor, OUTPUT_D |
| 225 | 78 | antonella butron | import time |
| 226 | 78 | antonella butron | mov_garra = LargeMotor(OUTPUT_C) |
| 227 | 78 | antonella butron | garra = MediumMotor(OUTPUT_D) |
| 228 | 78 | antonella butron | tankmoves = MoveTank(OUTPUT_A, OUTPUT_B) |
| 229 | 78 | antonella butron | |
| 230 | 78 | antonella butron | def move_up(): |
| 231 | 78 | antonella butron | """Mueve el robot hacia adelante.""" |
| 232 | 78 | antonella butron | print("Avanzar") |
| 233 | 78 | antonella butron | tankmoves.on(25, 25) |
| 234 | 78 | antonella butron | |
| 235 | 78 | antonella butron | def move_down(): |
| 236 | 78 | antonella butron | """Mueve el robot hacia atrás.""" |
| 237 | 78 | antonella butron | print("Retroceder") |
| 238 | 78 | antonella butron | tankmoves.on(-25, -25) |
| 239 | 78 | antonella butron | |
| 240 | 78 | antonella butron | def move_right(): |
| 241 | 78 | antonella butron | """Gira el robot a la derecha.""" |
| 242 | 78 | antonella butron | print("Derecha") |
| 243 | 78 | antonella butron | tankmoves.on(5, -5) |
| 244 | 78 | antonella butron | |
| 245 | 78 | antonella butron | def move_left(): |
| 246 | 78 | antonella butron | """Gira el robot a la izquierda.""" |
| 247 | 78 | antonella butron | print("Izquierda") |
| 248 | 78 | antonella butron | tankmoves.on(-5, 5) |
| 249 | 78 | antonella butron | |
| 250 | 78 | antonella butron | def handle_up(): |
| 251 | 78 | antonella butron | """Gira el robot a la izquierda.""" |
| 252 | 78 | antonella butron | print("Subiendo") |
| 253 | 78 | antonella butron | mov_garra.on(-7) |
| 254 | 78 | antonella butron | time.sleep(4) |
| 255 | 78 | antonella butron | mov_garra.off() |
| 256 | 78 | antonella butron | |
| 257 | 78 | antonella butron | def handle_down(): |
| 258 | 78 | antonella butron | """Gira el robot a la izquierda.""" |
| 259 | 78 | antonella butron | print("Bajando") |
| 260 | 78 | antonella butron | mov_garra.on(7) |
| 261 | 78 | antonella butron | time.sleep(4) |
| 262 | 78 | antonella butron | mov_garra.off() |
| 263 | 78 | antonella butron | |
| 264 | 78 | antonella butron | def handle_open(): |
| 265 | 78 | antonella butron | print("Abriendo") |
| 266 | 78 | antonella butron | garra.on(3) |
| 267 | 78 | antonella butron | |
| 268 | 78 | antonella butron | def handle_close(): |
| 269 | 78 | antonella butron | print("Cerrando") |
| 270 | 78 | antonella butron | garra.on(-3) |
| 271 | 78 | antonella butron | |
| 272 | 78 | antonella butron | def stop_handle(): |
| 273 | 78 | antonella butron | print("Deteniendo garra") |
| 274 | 78 | antonella butron | garra.off() |
| 275 | 78 | antonella butron | |
| 276 | 78 | antonella butron | |
| 277 | 78 | antonella butron | def stop(): |
| 278 | 78 | antonella butron | print("Detenido") |
| 279 | 78 | antonella butron | tankmoves.off() |
| 280 | 78 | antonella butron | </pre> |
| 281 | 47 | bastian cruz | --- |