Project

General

Profile

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

Cesar Jimenez, 12/12/2023 03:06 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 18 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>