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