Código e Implementación » History » Version 30
Javier Huanca, 12/18/2023 12:17 AM
1 | 13 | Javier Huanca | *Índice*: |
---|---|---|---|
2 | 13 | Javier Huanca | |
3 | 13 | Javier Huanca | * [[Panorama General| Panorama General]] |
4 | 13 | Javier Huanca | * [[Organización y Planificación | Organización y Planificación]] |
5 | 13 | Javier Huanca | * [[Análisis y Diseño | Análisis y Diseño ]] |
6 | 13 | Javier Huanca | * [[Código e Implementación | Código e Implementación]] |
7 | 22 | Javier Huanca | * [[Resultados | Resultados]] |
8 | 23 | Javier Huanca | * [[Evolución del robot | Evolución del robot]] |
9 | 13 | Javier Huanca | |
10 | 24 | Javier Huanca | h1. Código e Implementación |
11 | 1 | Javier Huanca | |
12 | 29 | Javier Huanca | <pre><code class="python"> |
13 | 28 | Javier Huanca | from ev3dev2.motor import LargeMotor, MediumMotor, OUTPUT_A, OUTPUT_B, OUTPUT_C, OUTPUT_D, SpeedRPM, MoveTank |
14 | 28 | Javier Huanca | from ev3dev2.sound import Sound |
15 | 28 | Javier Huanca | import math |
16 | 28 | Javier Huanca | import os |
17 | 28 | Javier Huanca | import sys |
18 | 28 | Javier Huanca | from time import sleep |
19 | 30 | Javier Huanca | #movimiento simultáneo de las ruedas(rueda izquierda, rueda derecha) |
20 | 30 | Javier Huanca | movimiento_ruedas = MoveTank(OUTPUT_A, OUTPUT_B) |
21 | 30 | Javier Huanca | #movimiento del palo del robot |
22 | 30 | Javier Huanca | mPalo = LargeMotor(OUTPUT_C) |
23 | 30 | Javier Huanca | #movimiento de rotación de las ruedas delanteras |
24 | 30 | Javier Huanca | mRotar = MediumMotor(OUTPUT_D) |
25 | 30 | Javier Huanca | |
26 | 30 | Javier Huanca | |
27 | 30 | Javier Huanca | #función para lanzar un objeto con el palo |
28 | 30 | Javier Huanca | def lanzar(distancia): |
29 | 30 | Javier Huanca | pi = math.pi |
30 | 30 | Javier Huanca | vel_necesaria = math.sqrt((4.9*distancia)/math.cos(pi/4)*math.sin(pi/4)) |
31 | 30 | Javier Huanca | vel_rpm = (60*vel_necesaria)/(2*pi*0.189) |
32 | 30 | Javier Huanca | # Rotar el motor en -180 grados al 6% de velocidad |
33 | 30 | Javier Huanca | mPalo.on_for_degrees(6,-180) |
34 | 30 | Javier Huanca | # Rotar el motor en 225 grados al porcentaje de velocidad de vel_rpm |
35 | 30 | Javier Huanca | mPalo.on_for_degrees(SpeedRPM(round(vel_rpm)),225) |
36 | 30 | Javier Huanca | # Rotar el motor en -45 grados al 6% de la velocidad |
37 | 30 | Javier Huanca | mPalo.on_for_degrees(6,-45) |
38 | 30 | Javier Huanca | |
39 | 30 | Javier Huanca | #función para mover el robot hacia adelante |
40 | 30 | Javier Huanca | def mover_adelante(): |
41 | 30 | Javier Huanca | movimiento_ruedas.on(-100, -100) |
42 | 30 | Javier Huanca | |
43 | 30 | Javier Huanca | #función para mover el robot hacia atras |
44 | 30 | Javier Huanca | def mover_atras(): |
45 | 30 | Javier Huanca | movimiento_ruedas.on(100, 100) |
46 | 30 | Javier Huanca | |
47 | 30 | Javier Huanca | #función para mover el robot hacia la izquierda |
48 | 30 | Javier Huanca | def mover_izquierda(): |
49 | 30 | Javier Huanca | mRotar.on(50) |
50 | 30 | Javier Huanca | |
51 | 30 | Javier Huanca | #función para mover el robot hacia la derecha |
52 | 30 | Javier Huanca | def mover_derecha(): |
53 | 30 | Javier Huanca | mRotar.on(-50) |
54 | 30 | Javier Huanca | |
55 | 30 | Javier Huanca | #función para detener el robot |
56 | 30 | Javier Huanca | def detener(): |
57 | 30 | Javier Huanca | movimiento_ruedas.stop() |
58 | 28 | Javier Huanca | </code></pre> |
59 | 28 | Javier Huanca | |
60 | 1 | Javier Huanca | h2. +Funciones+ |
61 | 24 | Javier Huanca | |
62 | 1 | Javier Huanca | <pre> |
63 | 15 | Javier Huanca | from ev3dev2.motor import LargeMotor, MediumMotor, OUTPUT_A, OUTPUT_B, OUTPUT_C, OUTPUT_D, SpeedRPM, MoveTank |
64 | 2 | Javier Huanca | from ev3dev2.sound import Sound |
65 | 20 | Javier Huanca | import math |
66 | 20 | Javier Huanca | import os |
67 | 21 | Javier Huanca | import sys |
68 | 2 | Javier Huanca | from time import sleep |
69 | 8 | Javier Huanca | #movimiento simultáneo de las ruedas(rueda izquierda, rueda derecha) |
70 | 8 | Javier Huanca | movimiento_ruedas = MoveTank(OUTPUT_A, OUTPUT_B) |
71 | 8 | Javier Huanca | #movimiento del palo del robot |
72 | 8 | Javier Huanca | mPalo = LargeMotor(OUTPUT_C) |
73 | 8 | Javier Huanca | #movimiento de rotación de las ruedas delanteras |
74 | 8 | Javier Huanca | mRotar = MediumMotor(OUTPUT_D) |
75 | 8 | Javier Huanca | |
76 | 8 | Javier Huanca | |
77 | 8 | Javier Huanca | #función para lanzar un objeto con el palo |
78 | 8 | Javier Huanca | def lanzar(distancia): |
79 | 8 | Javier Huanca | pi = math.pi |
80 | 8 | Javier Huanca | vel_necesaria = math.sqrt((4.9*distancia)/math.cos(pi/4)*math.sin(pi/4)) |
81 | 8 | Javier Huanca | vel_rpm = (60*vel_necesaria)/(2*pi*0.189) |
82 | 8 | Javier Huanca | # Rotar el motor en -180 grados al 6% de velocidad |
83 | 8 | Javier Huanca | mPalo.on_for_degrees(6,-180) |
84 | 8 | Javier Huanca | # Rotar el motor en 225 grados al porcentaje de velocidad de vel_rpm |
85 | 8 | Javier Huanca | mPalo.on_for_degrees(SpeedRPM(round(vel_rpm)),225) |
86 | 8 | Javier Huanca | # Rotar el motor en -45 grados al 6% de la velocidad |
87 | 8 | Javier Huanca | mPalo.on_for_degrees(6,-45) |
88 | 8 | Javier Huanca | |
89 | 8 | Javier Huanca | #función para mover el robot hacia adelante |
90 | 8 | Javier Huanca | def mover_adelante(): |
91 | 8 | Javier Huanca | movimiento_ruedas.on(-100, -100) |
92 | 8 | Javier Huanca | |
93 | 8 | Javier Huanca | #función para mover el robot hacia atras |
94 | 8 | Javier Huanca | def mover_atras(): |
95 | 8 | Javier Huanca | movimiento_ruedas.on(100, 100) |
96 | 8 | Javier Huanca | |
97 | 8 | Javier Huanca | #función para mover el robot hacia la izquierda |
98 | 8 | Javier Huanca | def mover_izquierda(): |
99 | 8 | Javier Huanca | mRotar.on(50) |
100 | 8 | Javier Huanca | |
101 | 8 | Javier Huanca | #función para mover el robot hacia la derecha |
102 | 8 | Javier Huanca | def mover_derecha(): |
103 | 8 | Javier Huanca | mRotar.on(-50) |
104 | 8 | Javier Huanca | |
105 | 8 | Javier Huanca | #función para detener el robot |
106 | 8 | Javier Huanca | def detener(): |
107 | 8 | Javier Huanca | movimiento_ruedas.stop() |
108 | 5 | Javier Huanca | </pre> |
109 | 9 | Javier Huanca | |
110 | 11 | Javier Huanca | h2. +Servidor+ |
111 | 11 | Javier Huanca | |
112 | 10 | Javier Huanca | <pre> |
113 | 9 | Javier Huanca | import socket |
114 | 9 | Javier Huanca | from funciones import * |
115 | 9 | Javier Huanca | |
116 | 9 | Javier Huanca | #se crea un socket |
117 | 9 | Javier Huanca | s = socket.socket() |
118 | 9 | Javier Huanca | s.settimeout(5) |
119 | 9 | Javier Huanca | print("Socket creado") |
120 | 9 | Javier Huanca | port = 2222 |
121 | 9 | Javier Huanca | #se asocia una dirección IP y un número de puerto al socket |
122 | 9 | Javier Huanca | s.bind(("", port)) |
123 | 9 | Javier Huanca | print("El socket se creo con puerto:{}".format(port)) |
124 | 9 | Javier Huanca | #se comienza a escuchar conexiones entrantes (máximo 5 conexiones pendientes) |
125 | 9 | Javier Huanca | s.listen(5) |
126 | 9 | Javier Huanca | print("The socket is listening....") |
127 | 9 | Javier Huanca | #se acepta la conexión, creando un nuevo socket a partir de la conexion entrante y la dirección del cliente |
128 | 9 | Javier Huanca | connect, addr = s.accept() |
129 | 9 | Javier Huanca | print("Se conecto a {}".format(addr)) |
130 | 9 | Javier Huanca | while True: |
131 | 9 | Javier Huanca | #se define el carácter que el socket del cliente recibe como dato |
132 | 9 | Javier Huanca | rawByte = connect.recv(1) |
133 | 9 | Javier Huanca | #se traduce el carácter recibido |
134 | 9 | Javier Huanca | char = rawByte.decode('utf-8') |
135 | 9 | Javier Huanca | if (char == 'w'): |
136 | 9 | Javier Huanca | mover_adelante() |
137 | 9 | Javier Huanca | if (char == 's'): |
138 | 9 | Javier Huanca | mover_atras() |
139 | 9 | Javier Huanca | if (char == 'a'): |
140 | 9 | Javier Huanca | mover_izquierda() |
141 | 9 | Javier Huanca | if (char == 'd'): |
142 | 9 | Javier Huanca | mover_derecha() |
143 | 9 | Javier Huanca | if (char == ' '): |
144 | 9 | Javier Huanca | detener() |
145 | 9 | Javier Huanca | if (char == 'l'): |
146 | 9 | Javier Huanca | lanzar(2) |
147 | 9 | Javier Huanca | </pre> |
148 | 12 | Javier Huanca | |
149 | 12 | Javier Huanca | h2. +Interfaz+ |
150 | 12 | Javier Huanca | |
151 | 12 | Javier Huanca | <pre> |
152 | 12 | Javier Huanca | import tkinter as tk |
153 | 12 | Javier Huanca | from tkinter import ttk |
154 | 12 | Javier Huanca | from tkinter import messagebox |
155 | 12 | Javier Huanca | from tkinter import * |
156 | 12 | Javier Huanca | import socket |
157 | 12 | Javier Huanca | import sys |
158 | 12 | Javier Huanca | |
159 | 12 | Javier Huanca | ev3_ip = "192.168.70.147" |
160 | 12 | Javier Huanca | |
161 | 12 | Javier Huanca | #Ventana |
162 | 12 | Javier Huanca | root = tk.Tk() |
163 | 12 | Javier Huanca | root.config(width=1000, height=500) |
164 | 12 | Javier Huanca | root.config(bg="darkred") |
165 | 12 | Javier Huanca | root.title("ANT-0T0") |
166 | 12 | Javier Huanca | |
167 | 12 | Javier Huanca | #Acciones del robot |
168 | 12 | Javier Huanca | def irAdelante(): |
169 | 12 | Javier Huanca | clientSocket.send(bytes([ord('w')])) |
170 | 12 | Javier Huanca | |
171 | 12 | Javier Huanca | def irAtras(): |
172 | 12 | Javier Huanca | clientSocket.send(bytes([ord('s')])) |
173 | 12 | Javier Huanca | |
174 | 12 | Javier Huanca | def irIzquierda(): |
175 | 12 | Javier Huanca | clientSocket.send(bytes([ord('a')])) |
176 | 12 | Javier Huanca | |
177 | 12 | Javier Huanca | def irDerecha(): |
178 | 12 | Javier Huanca | clientSocket.send(bytes([ord('d')])) |
179 | 12 | Javier Huanca | |
180 | 12 | Javier Huanca | def inicioLanzar(): |
181 | 12 | Javier Huanca | clientSocket.send(bytes([ord('l')])) |
182 | 12 | Javier Huanca | |
183 | 12 | Javier Huanca | def soltar(event): |
184 | 12 | Javier Huanca | clientSocket.send(bytes([ord(' ')])) |
185 | 12 | Javier Huanca | |
186 | 12 | Javier Huanca | def conectar(address): |
187 | 12 | Javier Huanca | try: |
188 | 12 | Javier Huanca | clientSocket.connect((address,port)) |
189 | 12 | Javier Huanca | messagebox.showinfo("Mensaje Servido","Cliente conectado al robot: {0} : {1}".format(address,port)) |
190 | 12 | Javier Huanca | except socket.error: |
191 | 12 | Javier Huanca | messagebox.showwarning("Conexión erronea","No se ha logrado al conexíon, verifique la ip {0}".format(address)) |
192 | 12 | Javier Huanca | clientSocket.close() |
193 | 12 | Javier Huanca | |
194 | 12 | Javier Huanca | #Imagenes |
195 | 12 | Javier Huanca | imgLogo = tk.PhotoImage(file="logo_ant0t0.png") |
196 | 12 | Javier Huanca | imgFlechaIzq = tk.PhotoImage(file="flecha_izquierda.png") |
197 | 12 | Javier Huanca | imgFlechaSup = tk.PhotoImage(file="flecha_superior.png") |
198 | 12 | Javier Huanca | imgFlechaDer = tk.PhotoImage(file="flecha_derecha.png") |
199 | 12 | Javier Huanca | imgFlechaInf = tk.PhotoImage(file="flecha_inferior.png") |
200 | 12 | Javier Huanca | imgApagar = tk.PhotoImage(file="Boton_Apagar.png") |
201 | 12 | Javier Huanca | imgLanzar = tk.PhotoImage(file="imgLanzar.png") |
202 | 12 | Javier Huanca | |
203 | 12 | Javier Huanca | etiqueta_logo = tk.Label(root, image=imgLogo, bg = "darkred").place(x=350,y=150) |
204 | 12 | Javier Huanca | #Boton Flecha Izquierda |
205 | 12 | Javier Huanca | Bt_FlechaIzq = Button(root, image=imgFlechaIzq, command=irIzquierda) |
206 | 12 | Javier Huanca | Bt_FlechaIzq.place(x=50,y=190) |
207 | 12 | Javier Huanca | #Boton Flecha Superior |
208 | 12 | Javier Huanca | Bt_FlechaSup = Button(root, repeatdelay=50, repeatinterval=50, image=imgFlechaSup, command=irAdelante) |
209 | 12 | Javier Huanca | Bt_FlechaSup.place(x=150,y=100) |
210 | 12 | Javier Huanca | Bt_FlechaSup.bind('<ButtonRelease-1>', soltar) |
211 | 12 | Javier Huanca | #Boton Flecha Derecha |
212 | 12 | Javier Huanca | Bt_FlechaDer = Button(root, image=imgFlechaDer, command=irDerecha) |
213 | 12 | Javier Huanca | Bt_FlechaDer.place(x=250,y=190) |
214 | 12 | Javier Huanca | #Boton Flecha Inferior |
215 | 12 | Javier Huanca | Bt_FlechaInf = Button(root, repeatdelay=50, repeatinterval=50, image=imgFlechaInf, command=irAtras) |
216 | 12 | Javier Huanca | Bt_FlechaInf.place(x=150,y=280) |
217 | 12 | Javier Huanca | Bt_FlechaInf.bind('<ButtonRelease-1>', soltar) |
218 | 12 | Javier Huanca | |
219 | 12 | Javier Huanca | #Boton Apagado |
220 | 12 | Javier Huanca | Bt_Apagar = Button(root, image=imgApagar, command=root.destroy).place(x=440,y=370) |
221 | 12 | Javier Huanca | |
222 | 12 | Javier Huanca | #Boton Lanzar |
223 | 12 | Javier Huanca | Bt_Lanzar = Button(root, image=imgLanzar, bg = "darkred", command=inicioLanzar) |
224 | 12 | Javier Huanca | Bt_Lanzar.place(x=670, y=160) |
225 | 12 | Javier Huanca | |
226 | 12 | Javier Huanca | #Boton Conectar |
227 | 12 | Javier Huanca | button_connect = tk.Button(root, text="Conectar", command= lambda: {conectar(ev3_ip)}, font=("Arial",12)).place(x=440,y=90) |
228 | 12 | Javier Huanca | |
229 | 12 | Javier Huanca | if len(sys.argv) > 2: |
230 | 12 | Javier Huanca | print("usage:client-laptop,py [IP-addr-of-robot]") |
231 | 12 | Javier Huanca | sys.exit(1) |
232 | 12 | Javier Huanca | |
233 | 12 | Javier Huanca | elif len(sys.argv) == 2: |
234 | 12 | Javier Huanca | ipAddress = sys.argv[1] |
235 | 12 | Javier Huanca | print("using specified IP address: {}".format(ipAddress)) |
236 | 12 | Javier Huanca | |
237 | 12 | Javier Huanca | else: |
238 | 12 | Javier Huanca | print("using default IP address: {}".format(ev3_ip)) |
239 | 12 | Javier Huanca | |
240 | 12 | Javier Huanca | clientSocket = socket.socket() |
241 | 12 | Javier Huanca | port = 2222 |
242 | 12 | Javier Huanca | |
243 | 12 | Javier Huanca | root.mainloop() |
244 | 12 | Javier Huanca | </pre> |