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