Project

General

Profile

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

Cesar Jimenez, 12/01/2023 08:48 AM

1 1 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 1 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 16 Cesar Jimenez
import tkinter as tk
32 16 Cesar Jimenez
from tkinter import ttk
33 16 Cesar Jimenez
from tkinter import *
34 16 Cesar Jimenez
from tkinter import messagebox
35 20 Cesar Jimenez
from tkinter import PhotoImage
36 1 Cesar Jimenez
import socket
37 20 Cesar Jimenez
conection = False
38 1 Cesar Jimenez
39 20 Cesar Jimenez
def stop(Event):
40 20 Cesar Jimenez
    try:
41 20 Cesar Jimenez
        server.send(bytes([ord(' ')]))
42 20 Cesar Jimenez
    except BrokenPipeError:
43 20 Cesar Jimenez
        messagebox.showwarning("Lo siento","Intentelo Nuevamente")
44 20 Cesar Jimenez
def Shoter():
45 20 Cesar Jimenez
    try:
46 20 Cesar Jimenez
        server.send(bytes([ord('r')]))
47 20 Cesar Jimenez
    except BrokenPipeError:
48 20 Cesar Jimenez
        messagebox.showwarning("Lo siento","Intentelo Nuevamente")
49 20 Cesar Jimenez
    
50 1 Cesar Jimenez
def Up():
51 20 Cesar Jimenez
    try:
52 20 Cesar Jimenez
        server.send(bytes([ord('w')]))
53 20 Cesar Jimenez
    except BrokenPipeError:
54 20 Cesar Jimenez
        messagebox.showwarning("Lo siento","Intentelo Nuevamente")
55 1 Cesar Jimenez
    
56 1 Cesar Jimenez
def Down():
57 20 Cesar Jimenez
    try:
58 20 Cesar Jimenez
        server.send(bytes([ord('s')]))
59 20 Cesar Jimenez
    except BrokenPipeError:
60 20 Cesar Jimenez
        messagebox.showwarning("Lo siento","Intentelo Nuevamente")
61 1 Cesar Jimenez
    
62 1 Cesar Jimenez
def Left():
63 20 Cesar Jimenez
    try:
64 20 Cesar Jimenez
        server.send(bytes([ord('a')]))
65 20 Cesar Jimenez
    except BrokenPipeError:
66 20 Cesar Jimenez
        messagebox.showwarning("Lo siento","Intentelo Nuevamente")
67 1 Cesar Jimenez
def Right():
68 20 Cesar Jimenez
    try:
69 20 Cesar Jimenez
        server.send(bytes([ord('d')]))
70 20 Cesar Jimenez
    except BrokenPipeError:
71 20 Cesar Jimenez
        messagebox.showwarning("Lo siento","Intentelo Nuevamente")
72 16 Cesar Jimenez
73 20 Cesar Jimenez
def Disconnect():
74 20 Cesar Jimenez
    if conection:
75 20 Cesar Jimenez
        server.send(bytes([ord('z')]))
76 20 Cesar Jimenez
        ventana.destroy()
77 20 Cesar Jimenez
    else:
78 20 Cesar Jimenez
        ventana.destroy()
79 1 Cesar Jimenez
    
80 20 Cesar Jimenez
def Power(Pow):
81 20 Cesar Jimenez
    if (Pow == 45):
82 20 Cesar Jimenez
        server.send(bytes([ord('1')]))
83 20 Cesar Jimenez
    elif (Pow == 60):
84 20 Cesar Jimenez
        server.send(bytes([ord('2')]))
85 20 Cesar Jimenez
    elif (Pow == 90):
86 20 Cesar Jimenez
        server.send(bytes([ord('2')]))
87 20 Cesar Jimenez
    else:
88 20 Cesar Jimenez
        server.send(bytes([ord('3')]))
89 20 Cesar Jimenez
    
90 1 Cesar Jimenez
def conectar():
91 1 Cesar Jimenez
    puerto = 4999
92 20 Cesar Jimenez
    direccion = "192.168.137.147"
93 1 Cesar Jimenez
    try: 
94 16 Cesar Jimenez
        server.connect((direccion,puerto))
95 1 Cesar Jimenez
        messagebox.showinfo("Conectado","Se ha establecido la conexion exitosamente")
96 20 Cesar Jimenez
        conection = True
97 20 Cesar Jimenez
    except BrokenPipeError:
98 1 Cesar Jimenez
        messagebox.showwarning("Desconectado","Ingrese la dirección correcta")
99 20 Cesar Jimenez
        conection = False
100 1 Cesar Jimenez
101 20 Cesar Jimenez
# Ventana principal
102 1 Cesar Jimenez
ventana = tk.Tk()
103 20 Cesar Jimenez
ventana.geometry("750x500") 
104 1 Cesar Jimenez
ventana.title("Machine EV3")
105 20 Cesar Jimenez
ventana.configure(bg="light sea green")  
106 1 Cesar Jimenez
ventana.resizable(0,0)
107 1 Cesar Jimenez
108 20 Cesar Jimenez
# Ingresar Imagenes
109 20 Cesar Jimenez
up = PhotoImage(file="up.png")
110 20 Cesar Jimenez
down = PhotoImage(file="down.png")
111 20 Cesar Jimenez
left = PhotoImage(file="left.png")
112 20 Cesar Jimenez
right = PhotoImage(file="right.png")
113 20 Cesar Jimenez
cross = PhotoImage(file="cross.png")
114 20 Cesar Jimenez
115 20 Cesar Jimenez
# Dimensiones de las Imagenes
116 20 Cesar Jimenez
up = up.subsample(6, 6)
117 20 Cesar Jimenez
down = down.subsample(6, 6)
118 20 Cesar Jimenez
left = left.subsample(6, 6)
119 20 Cesar Jimenez
right = right.subsample(6, 6)
120 20 Cesar Jimenez
cross = cross.subsample(6, 6)
121 20 Cesar Jimenez
122 20 Cesar Jimenez
# Iniciar Servidor
123 20 Cesar Jimenez
server = socket.socket()
124 20 Cesar Jimenez
125 1 Cesar Jimenez
# Boton Arriba
126 20 Cesar Jimenez
boton_arriba = Button(None, repeatdelay=50,repeatinterval=50,text="UP", command=Up, background="cadetblue2", image=up)
127 20 Cesar Jimenez
boton_arriba.place(x=500, y=110)
128 1 Cesar Jimenez
129 20 Cesar Jimenez
# Boton Derecha
130 20 Cesar Jimenez
boton_derech = Button(None, repeatdelay=50,repeatinterval=50 ,text="RIGHT", command=Right, background="cadetblue2", image=right)
131 20 Cesar Jimenez
boton_derech.place(x=610, y=220)
132 1 Cesar Jimenez
133 1 Cesar Jimenez
# Boton Izquierda
134 20 Cesar Jimenez
boton_izq = Button(None, repeatdelay=50,repeatinterval=50, text="LEFT", command=Left, background="cadetblue2", image=left)
135 20 Cesar Jimenez
boton_izq.place(x=390, y=220)
136 1 Cesar Jimenez
137 20 Cesar Jimenez
# Boton Abajo
138 20 Cesar Jimenez
boton_abajo = Button(None, repeatdelay=50, repeatinterval=50,text="DOWN", command=Down, background="cadetblue2", image=down)
139 20 Cesar Jimenez
boton_abajo.place(x=500, y=330)
140 1 Cesar Jimenez
141 17 Cesar Jimenez
# Boton Disparar
142 20 Cesar Jimenez
boton_disparar = Button(text="SHOT", command=lambda:[Power(50)], background="cadetblue2", image=cross)
143 20 Cesar Jimenez
boton_disparar.place(x=130, y=270)
144 17 Cesar Jimenez
145 20 Cesar Jimenez
# Boton Power de 30°
146 20 Cesar Jimenez
boton_p30 = Button(text="Angle 45%", command=lambda:[Power(45)], background="cadetblue2",fg = "DodgerBlue4")
147 20 Cesar Jimenez
boton_p30.config(width=9, height=4)
148 20 Cesar Jimenez
boton_p30.place(x=50, y=230)
149 1 Cesar Jimenez
150 20 Cesar Jimenez
# Boton Power de 60°
151 20 Cesar Jimenez
boton_p60 = Button(text="Angle 60%", command=lambda:[Power(60)], background="cadetblue2",fg = "DodgerBlue4")
152 20 Cesar Jimenez
boton_p60.config(width=9, height=4)
153 20 Cesar Jimenez
boton_p60.place(x=140, y=170)
154 1 Cesar Jimenez
155 20 Cesar Jimenez
# Boton potenca de 90°
156 20 Cesar Jimenez
boton_p100 = Button(text="Angle 90%", command=lambda:[Power(90)], background="cadetblue2",fg = "DodgerBlue4")
157 20 Cesar Jimenez
boton_p100.config(width=9, height=4)
158 20 Cesar Jimenez
boton_p100.place(x=230, y=230)
159 1 Cesar Jimenez
160 17 Cesar Jimenez
# Boton ingreso ip
161 20 Cesar Jimenez
boton_conectar = Button(text="Conect",background="cadetblue2",fg = "DodgerBlue4",command=conectar)
162 20 Cesar Jimenez
boton_conectar.config(width=9, height=1)
163 20 Cesar Jimenez
boton_conectar.place(x=30, y=20)
164 1 Cesar Jimenez
165 20 Cesar Jimenez
# Desconectar Brick
166 20 Cesar Jimenez
boton_exit = Button(text="Disconnect",command = Disconnect,background="cadetblue2",fg = "DodgerBlue4")
167 20 Cesar Jimenez
boton_exit.config(width=9, height=1)
168 20 Cesar Jimenez
boton_exit.place(x=130, y=20)
169 1 Cesar Jimenez
170 20 Cesar Jimenez
# Detener Motores
171 20 Cesar Jimenez
boton_arriba.bind('<ButtonRelease-1>',stop)
172 20 Cesar Jimenez
boton_abajo.bind('<ButtonRelease-1>',stop)
173 20 Cesar Jimenez
boton_izq.bind('<ButtonRelease-1>',stop)
174 20 Cesar Jimenez
boton_derech.bind('<ButtonRelease-1>',stop)
175 20 Cesar Jimenez
176 17 Cesar Jimenez
ventana.mainloop()
177 17 Cesar Jimenez
178 17 Cesar Jimenez
</code></pre>
179 17 Cesar Jimenez
180 17 Cesar Jimenez
181 17 Cesar Jimenez
h1. Servidor
182 17 Cesar Jimenez
183 17 Cesar Jimenez
<pre><code class="ruby">
184 17 Cesar Jimenez
185 17 Cesar Jimenez
import socket
186 17 Cesar Jimenez
from Funciones import *
187 17 Cesar Jimenez
188 20 Cesar Jimenez
# Crear un socket del servreceptor
189 17 Cesar Jimenez
server = socket.socket()
190 20 Cesar Jimenez
191 17 Cesar Jimenez
# Vincular el socket a una dirección IP y un puerto
192 20 Cesar Jimenez
server.bind(('',4999))
193 20 Cesar Jimenez
print("CONECTADO")
194 17 Cesar Jimenez
195 17 Cesar Jimenez
# Poner el socket en modo de escucha
196 20 Cesar Jimenez
server.listen(5)  # Permite hasta 5 conexiones pendientes
197 17 Cesar Jimenez
print("Esperando conexiones entrantes...")
198 17 Cesar Jimenez
199 17 Cesar Jimenez
# Aceptar una conexión entrante
200 20 Cesar Jimenez
socket_client, address_client = server.accept()
201 20 Cesar Jimenez
print("Conexion entrante desde 192.168.47.147")
202 17 Cesar Jimenez
203 19 Cesar Jimenez
while True:
204 20 Cesar Jimenez
    recept = socket_client.recv(1).recept.decode("utf-8")
205 20 Cesar Jimenez
    if (recept == 'w'): # arriba
206 20 Cesar Jimenez
        Mov_Up()
207 20 Cesar Jimenez
    if (recept == 's'): # abajo
208 20 Cesar Jimenez
        Mov_Down()
209 20 Cesar Jimenez
    if (recept == 'a'): # izquierda
210 20 Cesar Jimenez
        Mov_Left()
211 20 Cesar Jimenez
    if (recept == 'd'): # derecha
212 20 Cesar Jimenez
        Mov_Right()
213 20 Cesar Jimenez
    if (Id.isdigit()): # disparo por angulo 
214 20 Cesar Jimenez
        if (recept == '1'):
215 20 Cesar Jimenez
            Angle45()
216 20 Cesar Jimenez
        elif (recept == '2'):
217 20 Cesar Jimenez
            Angle60()
218 20 Cesar Jimenez
        elif (recept == '3'):
219 20 Cesar Jimenez
            Angle90()   
220 20 Cesar Jimenez
    if (recept == 'z'): # Cierre Ventana
221 20 Cesar Jimenez
        break
222 20 Cesar Jimenez
    if (recept == ' '): # Detener Movimiento
223 20 Cesar Jimenez
        Stop_Motor()
224 17 Cesar Jimenez
225 17 Cesar Jimenez
</code></pre>
226 17 Cesar Jimenez
227 17 Cesar Jimenez
h1. Funciones Principales del Robot
228 17 Cesar Jimenez
229 17 Cesar Jimenez
<pre><code class="ruby">
230 17 Cesar Jimenez
231 17 Cesar Jimenez
from ev3dev.ev3 import Sound
232 20 Cesar Jimenez
from ev3dev2.motor import LargeMotor,OUTPUT_A, OUTPUT_B, OUTPUT_C, OUTPUT_D, MoveTank
233 17 Cesar Jimenez
from time import sleep
234 20 Cesar Jimenez
import time
235 17 Cesar Jimenez
236 17 Cesar Jimenez
#Agregar Funciones del ROBOT
237 20 Cesar Jimenez
rueda_left = LargeMotor(OUTPUT_C)
238 20 Cesar Jimenez
rueda_right = LargeMotor(OUTPUT_B)
239 20 Cesar Jimenez
motor_A = LargeMotor(OUTPUT_A)
240 17 Cesar Jimenez
241 17 Cesar Jimenez
def Mov_Right():
242 20 Cesar Jimenez
    motor_A.run_forever(speed_sp=80)
243 17 Cesar Jimenez
244 17 Cesar Jimenez
def Mov_Left():
245 20 Cesar Jimenez
    motor_A.run_forever(speed_sp=-80)
246 17 Cesar Jimenez
247 17 Cesar Jimenez
def Mov_Down():
248 20 Cesar Jimenez
    rueda_left.run_forever(speed_sp=500)
249 20 Cesar Jimenez
    rueda_right.run_forever(speed_sp=500)
250 17 Cesar Jimenez
251 1 Cesar Jimenez
def Mov_Up():
252 20 Cesar Jimenez
    rueda_left.run_forever(speed_sp=-500)
253 20 Cesar Jimenez
    rueda_right.run_forever(speed_sp=-500)
254 1 Cesar Jimenez
255 20 Cesar Jimenez
def Stop_Motor():
256 20 Cesar Jimenez
    rueda_left.stop()
257 20 Cesar Jimenez
    rueda_right.stop()
258 20 Cesar Jimenez
    motor_A.stop()
259 1 Cesar Jimenez
260 20 Cesar Jimenez
def Angle45():
261 20 Cesar Jimenez
    motor_D = LargeMotor(OUTPUT_D)
262 20 Cesar Jimenez
    motor_D.on_for_degrees(speed=10, degrees = 45)
263 20 Cesar Jimenez
    motor_D.on_for_degrees(speed=100, degrees = -105)
264 20 Cesar Jimenez
    motor_D.on_for_degrees(speed=10, degrees = 60)
265 20 Cesar Jimenez
    motor_D.off()
266 1 Cesar Jimenez
267 20 Cesar Jimenez
def Angle60():
268 20 Cesar Jimenez
    motor_D = LargeMotor(OUTPUT_D)
269 20 Cesar Jimenez
    motor_D.on_for_degrees(speed=10, degrees = 60)
270 20 Cesar Jimenez
    motor_D.on_for_degrees(speed=100, degrees = -120)
271 20 Cesar Jimenez
    motor_D.on_for_degrees(speed=10, degrees = 60)
272 20 Cesar Jimenez
    motor_D.off()
273 20 Cesar Jimenez
274 20 Cesar Jimenez
def Angle90():
275 20 Cesar Jimenez
    motor_D = LargeMotor(OUTPUT_D)
276 20 Cesar Jimenez
    motor_D.on_for_degrees(speed=10, degrees = 90)
277 20 Cesar Jimenez
    motor_D.on_for_degrees(speed=100, degrees = -150)
278 20 Cesar Jimenez
    motor_D.on_for_degrees(speed=10, degrees = 60)
279 20 Cesar Jimenez
    motor_D.off()
280 20 Cesar Jimenez
281 1 Cesar Jimenez
def Sonido():
282 1 Cesar Jimenez
    sound = Sound()
283 1 Cesar Jimenez
    sound.beep()
284 1 Cesar Jimenez
    sound.speak("Vini o' rey do futebol")
285 1 Cesar Jimenez
286 1 Cesar Jimenez
</code></pre>