Código e Implementación » History » Version 27
Cesar Jimenez, 12/12/2023 04:42 PM
| 1 | 24 | Cesar Jimenez | h1. ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀Wikipedia |
|---|---|---|---|
| 2 | 1 | Cesar Jimenez | |
| 3 | 1 | Cesar Jimenez | |
| 4 | 1 | Cesar Jimenez | !logoPRO.png! |
| 5 | 1 | Cesar Jimenez | |
| 6 | 1 | Cesar Jimenez | |
| 7 | 1 | Cesar Jimenez | ---- |
| 8 | 1 | Cesar Jimenez | |
| 9 | 1 | Cesar Jimenez | +*Grupo A:*+ |
| 10 | 1 | Cesar Jimenez | > Integrantes: Cristian Sánchez, Jean Pier Duran, Sergio Rabanal, Valentina Álvarez, César Jiménez |
| 11 | 1 | Cesar Jimenez | > Nombre del Producto: Machine EV3 G |
| 12 | 1 | Cesar Jimenez | > Modulo: Proyecto I |
| 13 | 1 | Cesar Jimenez | > Docente: Humberto Urrutia |
| 14 | 1 | Cesar Jimenez | > Fecha de Inicio: 2023-08-14 |
| 15 | 1 | Cesar Jimenez | > Fecha de Termino: 2023-11-30 |
| 16 | 1 | Cesar Jimenez | |
| 17 | 1 | Cesar Jimenez | ---- |
| 18 | 1 | Cesar Jimenez | |
| 19 | 25 | Cesar Jimenez | *ㅤㅤㅤㅤㅤㅤㅤ⠀⠀⠀⠀⠀⠀⠀⠀Índice:* |
| 20 | 1 | Cesar Jimenez | * [[Introducción]] |
| 21 | 1 | Cesar Jimenez | * [[Descripción y Objetivos]] |
| 22 | 1 | Cesar Jimenez | * [[Organización y Planificación]] |
| 23 | 1 | Cesar Jimenez | * [[Análisis y Diseño]] |
| 24 | 1 | Cesar Jimenez | * [[Código e Implementación]] |
| 25 | 2 | Cesar Jimenez | * [[Bibliografía]] |
| 26 | 3 | Cesar Jimenez | |
| 27 | 27 | Cesar Jimenez | h1. ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀Intefaz Gráfica |
| 28 | 3 | Cesar Jimenez | |
| 29 | 1 | Cesar Jimenez | <pre><code class="ruby"> |
| 30 | 15 | Cesar Jimenez | |
| 31 | 23 | Cesar Jimenez | |
| 32 | 16 | Cesar Jimenez | import tkinter as tk |
| 33 | 16 | Cesar Jimenez | from tkinter import ttk |
| 34 | 16 | Cesar Jimenez | from tkinter import * |
| 35 | 16 | Cesar Jimenez | from tkinter import messagebox |
| 36 | 20 | Cesar Jimenez | from tkinter import PhotoImage |
| 37 | 1 | Cesar Jimenez | import socket |
| 38 | 20 | Cesar Jimenez | conection = False |
| 39 | 1 | Cesar Jimenez | |
| 40 | 20 | Cesar Jimenez | def stop(Event): |
| 41 | 20 | Cesar Jimenez | try: |
| 42 | 20 | Cesar Jimenez | server.send(bytes([ord(' ')])) |
| 43 | 20 | Cesar Jimenez | except BrokenPipeError: |
| 44 | 1 | Cesar Jimenez | messagebox.showwarning("Lo siento","Intentelo Nuevamente") |
| 45 | 23 | Cesar Jimenez | |
| 46 | 1 | Cesar Jimenez | def Up(): |
| 47 | 20 | Cesar Jimenez | try: |
| 48 | 20 | Cesar Jimenez | server.send(bytes([ord('w')])) |
| 49 | 20 | Cesar Jimenez | except BrokenPipeError: |
| 50 | 20 | Cesar Jimenez | messagebox.showwarning("Lo siento","Intentelo Nuevamente") |
| 51 | 1 | Cesar Jimenez | |
| 52 | 1 | Cesar Jimenez | def Down(): |
| 53 | 20 | Cesar Jimenez | try: |
| 54 | 20 | Cesar Jimenez | server.send(bytes([ord('s')])) |
| 55 | 20 | Cesar Jimenez | except BrokenPipeError: |
| 56 | 20 | Cesar Jimenez | messagebox.showwarning("Lo siento","Intentelo Nuevamente") |
| 57 | 1 | Cesar Jimenez | |
| 58 | 1 | Cesar Jimenez | def Left(): |
| 59 | 20 | Cesar Jimenez | try: |
| 60 | 20 | Cesar Jimenez | server.send(bytes([ord('a')])) |
| 61 | 20 | Cesar Jimenez | except BrokenPipeError: |
| 62 | 20 | Cesar Jimenez | messagebox.showwarning("Lo siento","Intentelo Nuevamente") |
| 63 | 1 | Cesar Jimenez | def Right(): |
| 64 | 20 | Cesar Jimenez | try: |
| 65 | 20 | Cesar Jimenez | server.send(bytes([ord('d')])) |
| 66 | 20 | Cesar Jimenez | except BrokenPipeError: |
| 67 | 20 | Cesar Jimenez | messagebox.showwarning("Lo siento","Intentelo Nuevamente") |
| 68 | 16 | Cesar Jimenez | |
| 69 | 20 | Cesar Jimenez | def Disconnect(): |
| 70 | 20 | Cesar Jimenez | if conection: |
| 71 | 20 | Cesar Jimenez | server.send(bytes([ord('z')])) |
| 72 | 20 | Cesar Jimenez | ventana.destroy() |
| 73 | 20 | Cesar Jimenez | else: |
| 74 | 20 | Cesar Jimenez | ventana.destroy() |
| 75 | 1 | Cesar Jimenez | |
| 76 | 20 | Cesar Jimenez | def Power(Pow): |
| 77 | 20 | Cesar Jimenez | if (Pow == 45): |
| 78 | 20 | Cesar Jimenez | server.send(bytes([ord('1')])) |
| 79 | 20 | Cesar Jimenez | elif (Pow == 60): |
| 80 | 1 | Cesar Jimenez | server.send(bytes([ord('2')])) |
| 81 | 20 | Cesar Jimenez | else: |
| 82 | 20 | Cesar Jimenez | server.send(bytes([ord('3')])) |
| 83 | 23 | Cesar Jimenez | |
| 84 | 20 | Cesar Jimenez | |
| 85 | 21 | Cesar Jimenez | def Validar(): |
| 86 | 21 | Cesar Jimenez | pts = 0 |
| 87 | 1 | Cesar Jimenez | numero = True |
| 88 | 21 | Cesar Jimenez | for k in ip.get(): |
| 89 | 23 | Cesar Jimenez | if not k.isdigit(): |
| 90 | 21 | Cesar Jimenez | numero = False |
| 91 | 23 | Cesar Jimenez | elif k == '.': |
| 92 | 23 | Cesar Jimenez | pts += 1 |
| 93 | 23 | Cesar Jimenez | if pts == 3 and numero: |
| 94 | 21 | Cesar Jimenez | conectar() |
| 95 | 21 | Cesar Jimenez | else: |
| 96 | 23 | Cesar Jimenez | messagebox.showwarning("Error", "Ingrese una dirección válida") |
| 97 | 21 | Cesar Jimenez | ip.set("") |
| 98 | 21 | Cesar Jimenez | |
| 99 | 23 | Cesar Jimenez | |
| 100 | 1 | Cesar Jimenez | def conectar(): |
| 101 | 1 | Cesar Jimenez | puerto = 4999 |
| 102 | 21 | Cesar Jimenez | direccion = ip.get() |
| 103 | 1 | Cesar Jimenez | try: |
| 104 | 16 | Cesar Jimenez | server.connect((direccion,puerto)) |
| 105 | 1 | Cesar Jimenez | messagebox.showinfo("Conectado","Se ha establecido la conexion exitosamente") |
| 106 | 20 | Cesar Jimenez | conection = True |
| 107 | 20 | Cesar Jimenez | except BrokenPipeError: |
| 108 | 1 | Cesar Jimenez | messagebox.showwarning("Desconectado","Ingrese la dirección correcta") |
| 109 | 1 | Cesar Jimenez | conection = False |
| 110 | 21 | Cesar Jimenez | ip.set("") |
| 111 | 1 | Cesar Jimenez | |
| 112 | 20 | Cesar Jimenez | # Ventana principal |
| 113 | 1 | Cesar Jimenez | ventana = tk.Tk() |
| 114 | 20 | Cesar Jimenez | ventana.geometry("750x500") |
| 115 | 1 | Cesar Jimenez | ventana.title("Machine EV3") |
| 116 | 20 | Cesar Jimenez | ventana.configure(bg="light sea green") |
| 117 | 1 | Cesar Jimenez | ventana.resizable(0,0) |
| 118 | 1 | Cesar Jimenez | |
| 119 | 21 | Cesar Jimenez | ip = StringVar() |
| 120 | 21 | Cesar Jimenez | |
| 121 | 20 | Cesar Jimenez | # Ingresar Imagenes |
| 122 | 20 | Cesar Jimenez | up = PhotoImage(file="up.png") |
| 123 | 20 | Cesar Jimenez | down = PhotoImage(file="down.png") |
| 124 | 20 | Cesar Jimenez | left = PhotoImage(file="left.png") |
| 125 | 20 | Cesar Jimenez | right = PhotoImage(file="right.png") |
| 126 | 20 | Cesar Jimenez | cross = PhotoImage(file="cross.png") |
| 127 | 20 | Cesar Jimenez | |
| 128 | 20 | Cesar Jimenez | # Dimensiones de las Imagenes |
| 129 | 1 | Cesar Jimenez | up = up.subsample(6, 6) |
| 130 | 20 | Cesar Jimenez | down = down.subsample(6, 6) |
| 131 | 20 | Cesar Jimenez | left = left.subsample(6, 6) |
| 132 | 20 | Cesar Jimenez | right = right.subsample(6, 6) |
| 133 | 20 | Cesar Jimenez | cross = cross.subsample(6, 6) |
| 134 | 20 | Cesar Jimenez | |
| 135 | 20 | Cesar Jimenez | # Iniciar Servidor |
| 136 | 1 | Cesar Jimenez | server = socket.socket() |
| 137 | 1 | Cesar Jimenez | |
| 138 | 1 | Cesar Jimenez | # Boton Arriba |
| 139 | 21 | Cesar Jimenez | boton_arriba = Button(None, repeatdelay=20,repeatinterval=20,text="UP", command=Up, background="cadetblue2", image=up) |
| 140 | 21 | Cesar Jimenez | boton_arriba.place(x=150, y=105) |
| 141 | 1 | Cesar Jimenez | |
| 142 | 1 | Cesar Jimenez | # Boton Derecha |
| 143 | 21 | Cesar Jimenez | boton_derech = Button(None, repeatdelay=20,repeatinterval=20 ,text="RIGHT", command=Right, background="cadetblue2", image=right) |
| 144 | 21 | Cesar Jimenez | boton_derech.place(x=260, y=215) |
| 145 | 1 | Cesar Jimenez | |
| 146 | 1 | Cesar Jimenez | # Boton Izquierda |
| 147 | 21 | Cesar Jimenez | boton_izq = Button(None, repeatdelay=20,repeatinterval=20, text="LEFT", command=Left, background="cadetblue2", image=left) |
| 148 | 21 | Cesar Jimenez | boton_izq.place(x=40, y=215) |
| 149 | 1 | Cesar Jimenez | |
| 150 | 20 | Cesar Jimenez | # Boton Abajo |
| 151 | 21 | Cesar Jimenez | boton_abajo = Button(None, repeatdelay=20, repeatinterval=20,text="DOWN", command=Down, background="cadetblue2", image=down) |
| 152 | 21 | Cesar Jimenez | boton_abajo.place(x=150, y=325) |
| 153 | 20 | Cesar Jimenez | |
| 154 | 1 | Cesar Jimenez | # Boton Disparar |
| 155 | 23 | Cesar Jimenez | boton_disparar = Button(text="SHOT", command=lambda:[Power(90)], background="cadetblue2", image=cross) |
| 156 | 21 | Cesar Jimenez | boton_disparar.place(x=515, y=270) |
| 157 | 1 | Cesar Jimenez | |
| 158 | 1 | Cesar Jimenez | # Boton Power de 30° |
| 159 | 1 | Cesar Jimenez | boton_p30 = Button(text="Angle 45%", command=lambda:[Power(45)], background="cadetblue2",fg = "DodgerBlue4") |
| 160 | 21 | Cesar Jimenez | boton_p30.config(width=7, height=4) |
| 161 | 21 | Cesar Jimenez | boton_p30.place(x=410, y=220) |
| 162 | 1 | Cesar Jimenez | |
| 163 | 1 | Cesar Jimenez | # Boton Power de 60° |
| 164 | 1 | Cesar Jimenez | boton_p60 = Button(text="Angle 60%", command=lambda:[Power(60)], background="cadetblue2",fg = "DodgerBlue4") |
| 165 | 21 | Cesar Jimenez | boton_p60.config(width=7, height=4) |
| 166 | 21 | Cesar Jimenez | boton_p60.place(x=520, y=160) |
| 167 | 20 | Cesar Jimenez | |
| 168 | 20 | Cesar Jimenez | # Boton potenca de 90° |
| 169 | 20 | Cesar Jimenez | boton_p100 = Button(text="Angle 90%", command=lambda:[Power(90)], background="cadetblue2",fg = "DodgerBlue4") |
| 170 | 21 | Cesar Jimenez | boton_p100.config(width=7, height=4) |
| 171 | 21 | Cesar Jimenez | boton_p100.place(x=630, y=220) |
| 172 | 20 | Cesar Jimenez | |
| 173 | 1 | Cesar Jimenez | # Desconectar Brick |
| 174 | 20 | Cesar Jimenez | boton_exit = Button(text="Disconnect",command = Disconnect,background="cadetblue2",fg = "DodgerBlue4") |
| 175 | 20 | Cesar Jimenez | boton_exit.config(width=9, height=1) |
| 176 | 21 | Cesar Jimenez | boton_exit.place(x=620, y=20) |
| 177 | 1 | Cesar Jimenez | |
| 178 | 21 | Cesar Jimenez | #Ingreso ip |
| 179 | 21 | Cesar Jimenez | entrada_IP = Entry(ventana,textvariable = ip, width = 18) |
| 180 | 21 | Cesar Jimenez | entrada_IP.focus_set() |
| 181 | 21 | Cesar Jimenez | entrada_IP.place(x = 320, y=25) |
| 182 | 21 | Cesar Jimenez | |
| 183 | 21 | Cesar Jimenez | # Conexión |
| 184 | 21 | Cesar Jimenez | boton_conectar = Button(text="Conect",background="cadetblue2",fg = "DodgerBlue4",command = Validar) |
| 185 | 21 | Cesar Jimenez | boton_conectar.config(width=9, height=1) |
| 186 | 21 | Cesar Jimenez | boton_conectar.place(x=490, y=20) |
| 187 | 21 | Cesar Jimenez | |
| 188 | 20 | Cesar Jimenez | # Detener Motores |
| 189 | 20 | Cesar Jimenez | boton_arriba.bind('<ButtonRelease-1>',stop) |
| 190 | 20 | Cesar Jimenez | boton_abajo.bind('<ButtonRelease-1>',stop) |
| 191 | 20 | Cesar Jimenez | boton_izq.bind('<ButtonRelease-1>',stop) |
| 192 | 20 | Cesar Jimenez | boton_derech.bind('<ButtonRelease-1>',stop) |
| 193 | 20 | Cesar Jimenez | |
| 194 | 17 | Cesar Jimenez | ventana.mainloop() |
| 195 | 21 | Cesar Jimenez | |
| 196 | 1 | Cesar Jimenez | |
| 197 | 17 | Cesar Jimenez | </code></pre> |
| 198 | 17 | Cesar Jimenez | |
| 199 | 17 | Cesar Jimenez | |
| 200 | 17 | Cesar Jimenez | h1. Servidor |
| 201 | 17 | Cesar Jimenez | |
| 202 | 17 | Cesar Jimenez | <pre><code class="ruby"> |
| 203 | 17 | Cesar Jimenez | |
| 204 | 17 | Cesar Jimenez | import socket |
| 205 | 17 | Cesar Jimenez | from Funciones import * |
| 206 | 20 | Cesar Jimenez | |
| 207 | 23 | Cesar Jimenez | # Crear un socket del server |
| 208 | 1 | Cesar Jimenez | server = socket.socket() |
| 209 | 17 | Cesar Jimenez | |
| 210 | 1 | Cesar Jimenez | # Vincular el socket a una dirección IP y un puerto |
| 211 | 20 | Cesar Jimenez | server.bind(('',4999)) |
| 212 | 17 | Cesar Jimenez | print("CONECTADO") |
| 213 | 17 | Cesar Jimenez | |
| 214 | 20 | Cesar Jimenez | # Poner el socket en modo de escucha |
| 215 | 17 | Cesar Jimenez | server.listen(5) # Permite hasta 5 conexiones pendientes |
| 216 | 17 | Cesar Jimenez | print("Esperando conexiones entrantes...") |
| 217 | 17 | Cesar Jimenez | |
| 218 | 1 | Cesar Jimenez | # Aceptar una conexión entrante |
| 219 | 20 | Cesar Jimenez | socket_client, address_client = server.accept() |
| 220 | 23 | Cesar Jimenez | print("Conexion entrante desde ",address_client) |
| 221 | 19 | Cesar Jimenez | |
| 222 | 20 | Cesar Jimenez | while True: |
| 223 | 23 | Cesar Jimenez | recept = socket_client.recv(1).decode("utf-8") |
| 224 | 20 | Cesar Jimenez | if (recept == 'w'): # arriba |
| 225 | 20 | Cesar Jimenez | Mov_Up() |
| 226 | 20 | Cesar Jimenez | if (recept == 's'): # abajo |
| 227 | 20 | Cesar Jimenez | Mov_Down() |
| 228 | 20 | Cesar Jimenez | if (recept == 'a'): # izquierda |
| 229 | 1 | Cesar Jimenez | Mov_Left() |
| 230 | 20 | Cesar Jimenez | if (recept == 'd'): # derecha |
| 231 | 20 | Cesar Jimenez | Mov_Right() |
| 232 | 23 | Cesar Jimenez | if (recept.isdigit()): # disparo por angulo |
| 233 | 20 | Cesar Jimenez | if (recept == '1'): |
| 234 | 20 | Cesar Jimenez | Angle45() |
| 235 | 20 | Cesar Jimenez | elif (recept == '2'): |
| 236 | 20 | Cesar Jimenez | Angle60() |
| 237 | 20 | Cesar Jimenez | elif (recept == '3'): |
| 238 | 1 | Cesar Jimenez | Angle90() |
| 239 | 20 | Cesar Jimenez | if (recept == 'z'): # Cierre Ventana |
| 240 | 20 | Cesar Jimenez | break |
| 241 | 1 | Cesar Jimenez | if (recept == ' '): # Detener Movimiento |
| 242 | 17 | Cesar Jimenez | Stop_Motor() |
| 243 | 1 | Cesar Jimenez | |
| 244 | 23 | Cesar Jimenez | |
| 245 | 17 | Cesar Jimenez | </code></pre> |
| 246 | 17 | Cesar Jimenez | |
| 247 | 17 | Cesar Jimenez | h1. Funciones Principales del Robot |
| 248 | 17 | Cesar Jimenez | |
| 249 | 20 | Cesar Jimenez | <pre><code class="ruby"> |
| 250 | 17 | Cesar Jimenez | |
| 251 | 23 | Cesar Jimenez | from ev3dev2.motor import LargeMotor,OUTPUT_A, OUTPUT_B, OUTPUT_C, OUTPUT_D |
| 252 | 17 | Cesar Jimenez | |
| 253 | 17 | Cesar Jimenez | #Agregar Funciones del ROBOT |
| 254 | 20 | Cesar Jimenez | rueda_left = LargeMotor(OUTPUT_C) |
| 255 | 20 | Cesar Jimenez | rueda_right = LargeMotor(OUTPUT_B) |
| 256 | 20 | Cesar Jimenez | motor_A = LargeMotor(OUTPUT_A) |
| 257 | 23 | Cesar Jimenez | motor_D = LargeMotor(OUTPUT_D) |
| 258 | 17 | Cesar Jimenez | |
| 259 | 20 | Cesar Jimenez | def Mov_Right(): |
| 260 | 23 | Cesar Jimenez | motor_A.run_forever(speed_sp=-80) |
| 261 | 20 | Cesar Jimenez | |
| 262 | 17 | Cesar Jimenez | def Mov_Left(): |
| 263 | 23 | Cesar Jimenez | motor_A.run_forever(speed_sp=80) |
| 264 | 20 | Cesar Jimenez | |
| 265 | 20 | Cesar Jimenez | def Mov_Down(): |
| 266 | 1 | Cesar Jimenez | rueda_left.run_forever(speed_sp=500) |
| 267 | 20 | Cesar Jimenez | rueda_right.run_forever(speed_sp=500) |
| 268 | 20 | Cesar Jimenez | |
| 269 | 1 | Cesar Jimenez | def Mov_Up(): |
| 270 | 20 | Cesar Jimenez | rueda_left.run_forever(speed_sp=-500) |
| 271 | 20 | Cesar Jimenez | rueda_right.run_forever(speed_sp=-500) |
| 272 | 20 | Cesar Jimenez | |
| 273 | 1 | Cesar Jimenez | def Stop_Motor(): |
| 274 | 20 | Cesar Jimenez | rueda_left.stop() |
| 275 | 20 | Cesar Jimenez | rueda_right.stop() |
| 276 | 20 | Cesar Jimenez | motor_A.stop() |
| 277 | 20 | Cesar Jimenez | |
| 278 | 20 | Cesar Jimenez | def Angle45(): |
| 279 | 20 | Cesar Jimenez | motor_D.on_for_degrees(speed=10, degrees = 45) |
| 280 | 20 | Cesar Jimenez | motor_D.on_for_degrees(speed=100, degrees = -105) |
| 281 | 20 | Cesar Jimenez | motor_D.on_for_degrees(speed=10, degrees = 60) |
| 282 | 20 | Cesar Jimenez | motor_D.off() |
| 283 | 20 | Cesar Jimenez | |
| 284 | 20 | Cesar Jimenez | def Angle60(): |
| 285 | 20 | Cesar Jimenez | motor_D.on_for_degrees(speed=10, degrees = 60) |
| 286 | 20 | Cesar Jimenez | motor_D.on_for_degrees(speed=100, degrees = -120) |
| 287 | 20 | Cesar Jimenez | motor_D.on_for_degrees(speed=10, degrees = 60) |
| 288 | 20 | Cesar Jimenez | motor_D.off() |
| 289 | 20 | Cesar Jimenez | |
| 290 | 1 | Cesar Jimenez | def Angle90(): |
| 291 | 1 | Cesar Jimenez | motor_D.on_for_degrees(speed=10, degrees = 90) |
| 292 | 1 | Cesar Jimenez | motor_D.on_for_degrees(speed=100, degrees = -150) |
| 293 | 1 | Cesar Jimenez | motor_D.on_for_degrees(speed=10, degrees = 60) |
| 294 | 1 | Cesar Jimenez | motor_D.off() |
| 295 | 1 | Cesar Jimenez | |
| 296 | 1 | Cesar Jimenez | </code></pre> |