Project

General

Profile

Código e Implementación » History » Version 31

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 31 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>