Código e Implementación » History » Version 38
Cesar Jimenez, 12/12/2023 10:03 PM
1 | 35 | 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 | 34 | 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 | 38 | 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 | 38 | 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> |