Project

General

Profile

Índice:

Código e Implementación

Funciones

from ev3dev2.motor import LargeMotor, MediumMotor, OUTPUT_A, OUTPUT_B, OUTPUT_C, OUTPUT_D, SpeedRPM, MoveTank
from ev3dev2.sound import Sound
import math
import os
import sys

os.system('setfont Lat15-TerminusBold14')

#movimiento simultaneo de las ruedas(rueda izquierda, rueda derecha)
movimiento_ruedas = MoveTank(OUTPUT_A, OUTPUT_D)
#movimiento del palo del robot
mPalo = LargeMotor(OUTPUT_B)
#movimiento de rotacion de las ruedas delanteras
mRotar = MediumMotor(OUTPUT_C)

#funcion para lanzar un objeto con el palo
def lanzar(distancia):
    pi = math.pi
    vel_necesaria = math.sqrt((4.9*distancia)/math.cos(pi/4)*math.sin(pi/4))
    vel_rpm = (60*vel_necesaria)/(2*pi*0.189)
    if vel_rpm < 175 and vel_rpm > 0:
        # Rotar el motor en -180 grados al 6% de velocidad
        mPalo.on_for_degrees(6,-180)
        # Rotar el motor en 225 grados al porcentaje de velocidad de vel_rpm
        mPalo.on_for_degrees(SpeedRPM(round(vel_rpm)),225)
        # Rotar el motor en -45 grados al 6% de la velocidad
        mPalo.on_for_degrees(6,-45)

#funcion para mover el robot hacia adelante
def mover_adelante():
    movimiento_ruedas.on(-100, -100)

#funcion para mover el robot hacia atras
def mover_atras():
    movimiento_ruedas.on(100, 100)

#funcion para mover el robot hacia la izquierda
def mover_izquierda():
    mRotar.on_for_degrees(30, 25)
    movimiento_ruedas.on(100, -100)

#funcion para mover el robot hacia la derecha
def mover_derecha():
    mRotar.on_for_degrees(-30, 25)
    movimiento_ruedas.on(-100, 100)

#funcion para detener el robot
def detener():
    movimiento_ruedas.stop()

Servidor

import socket
from funciones import *

#se crea un socket
s = socket.socket()
s.settimeout(20)
print("Socket creado")
port = 2222
#se asocia una direccion IP y un numero de puerto al socket
s.bind(("", port))
print("El socket se creo con puerto:{}".format(port))
#se comienza a escuchar conexiones entrantes (maximo 5 conexiones pendientes)
s.listen(5)
print("The socket is listening....")
#se acepta la conexion, creando un nuevo socket a partir de la conexion entrante y la direccion del cliente
connect, addr = s.accept()
print("Se conecto a {}".format(addr))
while True:
    #se define el caracter que el socket del cliente recibe como dato
    rawByte = connect.recv(1)
    #se traduce el caracter recibido
    char = rawByte.decode('utf-8')
    if (char == 'w'):
        mover_adelante()
    if (char == 's'):
        mover_atras()
    if (char == 'a'):
        mover_izquierda()
    if (char == 'd'):
        mover_derecha()
    if (char == ' '):
        detener()
    if (char == 'l'):
        rawByte = connect.recv(1)
        distancia = rawByte.decode('utf-8')

        lanzar(int(distancia))

Interfaz

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
from tkinter import *
import socket
import sys

clientSocket = socket.socket()
ev3_ip = "192.168.71.233" 

#Ventana
root = tk.Tk()
root.config(width=1000, height=500)
root.config(bg="darkred")
root.title("ANT-0T0")
root.resizable(False, False)

#Acciones del robot
def irAdelante():
    clientSocket.send(bytes([ord('w')]))

def irAtras():
    clientSocket.send(bytes([ord('s')]))

def irIzquierda():
    clientSocket.send(bytes([ord('a')]))

def irDerecha():
    clientSocket.send(bytes([ord('d')]))

def inicioLanzar(distancia):
    clientSocket.send(bytes([ord('l')]))
    clientSocket.send(bytes(distancia, encoding='utf-8'))

def soltar(event):
    clientSocket.send(bytes([ord(' ')]))

def conectar(address):
    try:
        clientSocket.connect((address,port))
        messagebox.showinfo("Mensaje Servido","Cliente conectado al robot: {0} : {1}".format(address,port))
    except socket.error:
        messagebox.showwarning("Conexión erronea","No se ha logrado al conexíon, verifique la ip {0}".format(address))
        clientSocket.close()

def tomar(valor):
    try:
        inicioLanzar(valor)
        int(valor)
    except ValueError:
        messagebox.showerror("Error", "Debe ingresar un valor númerico para la distancia")

#Imagenes
imgLogo = tk.PhotoImage(file="logo_ant0t0.png")
imgFlechaIzq = tk.PhotoImage(file="flecha_izquierda.png")
imgFlechaSup = tk.PhotoImage(file="flecha_superior.png")
imgFlechaDer = tk.PhotoImage(file="flecha_derecha.png")
imgFlechaInf = tk.PhotoImage(file="flecha_inferior.png")
imgApagar = tk.PhotoImage(file="Boton_Apagar.png")
imgLanzar = tk.PhotoImage(file="imgLanzar.png")

distancia = StringVar()
caja_distancia = tk.Entry(root, textvariable=distancia).place(x=680, y=370)

etiqueta_logo = tk.Label(root, image=imgLogo, bg = "darkred").place(x=350,y=150)
#Boton Flecha Izquierda
Bt_FlechaIzq = Button(root, repeatdelay=50, repeatinterval=50, image=imgFlechaIzq, command=irIzquierda)
Bt_FlechaIzq.place(x=50,y=190)
Bt_FlechaIzq.bind('<ButtonRelease-1>', soltar)
#Boton Flecha Superior
Bt_FlechaSup = Button(root, repeatdelay=50, repeatinterval=50, image=imgFlechaSup, command=irAdelante)
Bt_FlechaSup.place(x=150,y=100)
Bt_FlechaSup.bind('<ButtonRelease-1>', soltar)
#Boton Flecha Derecha
Bt_FlechaDer = Button(root, image=imgFlechaDer, command=irDerecha)
Bt_FlechaDer.place(x=250,y=190)
#Boton Flecha Inferior
Bt_FlechaInf = Button(root, repeatdelay=50, repeatinterval=50, image=imgFlechaInf, command=irAtras)
Bt_FlechaInf.place(x=150,y=280)
Bt_FlechaInf.bind('<ButtonRelease-1>', soltar)

#Boton Apagado
Bt_Apagar = Button(root, image=imgApagar, command=root.destroy).place(x=440,y=370)

#Boton Lanzar
Bt_Lanzar = Button(root, image=imgLanzar, bg="darkred", command= lambda: {tomar(distancia.get())})
Bt_Lanzar.place(x=680, y=160)

#Boton Conectar
button_connect = tk.Button(root, text="Conectar", command= lambda: {conectar(ev3_ip)}, font=("Arial",12)).place(x=440,y=90)

if len(sys.argv) > 2:
    print("usage:client-laptop,py [IP-addr-of-robot]")
    sys.exit(1)

elif len(sys.argv) == 2:
    ipAddress = sys.argv[1]
    print("using specified IP address: {}".format(ipAddress))

else:
    print("using default IP address: {}".format(ev3_ip))

port = 2222

root.mainloop()