miércoles, 14 de noviembre de 2012

Avance - Pruebas de Proyecto

Valor de Entrada: 12 Puntos

Que tenemos de avance?

  • Material sobre estacionamiento 
  • BD
  • Código QR
  • Interfaces 

Avances

Para esta semana tenemos una muestra del avances a la interfaz, código para mover los motores y una muestra a la estructura del estacionamiento.

Interfaz 

Se desarrolló una pequeña aplicación con una interfaz para, junto con una aplicación de arduino y el hardware correspondiente, se controlen los movimientos de los motores.
El código fue echo en python, se hicieron los botones necesarios, pensando en que se podrán usar para hacer una demostración de los movimiento que realiza la estructura del elevador.

from Tkinter import *
import serial  

s=serial.Serial(2,115200)

def arriba():
 s.write('a')
 r=s.read()
 print r

def abajo():
 s.write('s')
 r=s.read()
 print r

def izquierda():
 s.write('d')
 r=s.read()
 print r

def derecha():
 s.write('z')
 r=s.read()
 print r

def stop():
 s.write('p')
 r=s.read()
 print r
  
ventana=Tk()
ventana.title('ElevatorControl')
ventana.configure(background='white')

img0=PhotoImage(file='0.gif')
img1=PhotoImage(file='1.gif')
img2=PhotoImage(file='2.gif')
img3=PhotoImage(file='3.gif')
img4=PhotoImage(file='4.gif')

botonar=Button(ventana, image=img2, command=arriba).grid(row=0,column=1)
botoab=Button(ventana, image=img4, command=abajo).grid(row=2,column=1)
botoniz=Button(ventana, image=img1, command=izquierda).grid(row=1,column=0)
botonde=Button(ventana, image=img3, command=derecha).grid(row=1,column=2)
botonst=Button(ventana, image=img0, command=stop).grid(row=1,column=1)

ventana.mainloop()


Simulando:

Código para Arduino

El código necesario para hacer girar los motores y que los movimientos se vean reflejados en la estrcutura de aluminio se muestra a continuación, se hicieron varias modificaciones en este aspecto tanto en el código como en el hardware, ya que la librería que habiamos provado antes no se pudo combinar con el hardware que habiamos mencionado (diodos y transistores) debido a que el manejo de los voltajes en los motores se volvió demasiado complicado.

void setup(){
  
Serial.begin(115200);  
 
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
}

void arriba(){
  digitalWrite(13, HIGH);
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
}

void abajo(){
  digitalWrite(13, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
}

void izquierda(){
  digitalWrite(11, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(13, LOW);
  digitalWrite(12, LOW);
}

void derecha(){
  digitalWrite(11, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(13, LOW);
  digitalWrite(12, LOW);
}

void detener(){
  digitalWrite(13, LOW);
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
}

void loop(){
  if (Serial.available() > 0) {
    int comando = Serial.read();
     
    switch (comando) {
     case 'a': 
       arriba();
       Serial.print("arriba");
       break;
     case 's':
       abajo();
       Serial.print("abajo");
       break;
     case 'd':    
       izquierda();
       Serial.print("izquierda");
       break;
     case 'z':    
       derecha();
       Serial.print("derecha");
       break;
     default:
       detener();
       Serial.print("stop");
      
    }
  }
 }


Se optó por dejar de lado la libreria de MotorDC y tambien los transistores, para cambiarlos por un integrado SN754410NE (para crear un puente H) que hace las funciones de inversión de polaridad más fáciles (girar los motores en ambos lados), puede operar con los dos motores, además de que es capaz de operar con voltajes más altos (hasta 36v), todo esto nos facilita el trabajo.
El voltaje se tomara del pin Vin del arduino, que entrega el voltaje total que ingresa al arduino por medio de la toma de corriente.

Aquí dejamos una imágen del esquema hecho con Fritzing.


Estructura

La estructura ya se tiene modificada y que sera utilizada para poder mover el auto de arriba hacia abajo, se utilizo una estructura de aluminio.
Una parte de la estructura se muestra a continuación, esta es la parte que se mueve en las direcciones de izquierda y derecha.
La otra parte aún esta pendiente por unos detalles que se agregaron (unos apoyadores para evitar que la estructura pierda el equilibrio).


Interfaz (usuario)

Esta interfaz sera para el usuario, es bastante simple pero se modificara y se le aplicara algo de usabilidad para el usuario, mejoras, etc.

Simulando:

Cuando el cliente de click a "Solicitar Boleto".

Cuando el cliente de click a  "Recoger Automóvil".

Cuando el cliente de click a "Ayuda".

Codigo:

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title,
                          pos=(150, 150), size=(650, 450))

        menuBar = wx.MenuBar()

        menu = wx.Menu()

        self.Bind(wx.EVT_MENU, self.OnTimeToClose, id=wx.ID_EXIT)

        self.CreateStatusBar()

        self.panel = wx.Panel(self)

        boton1 = wx.Button(self.panel, -1, "Solicitar Boleto")
        boton2 = wx.Button(self.panel, -1, "Recoger Automovil")
        boton3 = wx.Button(self.panel, -1, "Ayuda")

        self.panel.cajatexto = wx.TextCtrl(self.panel, -1, " ",size=(400,80))
        self.panel.cajatexto.SetFocus()

        self.Bind(wx.EVT_BUTTON, self.OnClickBoton1, boton1)
        self.Bind(wx.EVT_BUTTON, self.OnClickBoton2, boton2)
        self.Bind(wx.EVT_BUTTON, self.OnClickBoton3, boton3)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizerh1 = wx.BoxSizer(wx.HORIZONTAL)
        sizerh1.Add(boton1, 0, wx.ALL, 30)

        sizerh2 = wx.BoxSizer(wx.HORIZONTAL)
 sizerh2.Add(boton2, 0, wx.ALL, 30)
        
 sizerh3 = wx.BoxSizer(wx.HORIZONTAL)
 sizerh3.Add(boton3, 0, wx.ALL, 30)

 sizerh4 = wx.BoxSizer(wx.HORIZONTAL)
        sizerh4.Add(self.panel.cajatexto, 0, wx.ALL, 30)        
 
 sizer.Add(sizerh1, 0, wx.ALL, 0)        
 sizer.Add(sizerh2, 0, wx.ALL, 0)
 sizer.Add(sizerh3, 0, wx.ALL, 0)
        sizer.Add(sizerh4, 0, wx.ALL, 0)

        self.panel.SetSizer(sizer)
        self.panel.Layout()

    def OnTimeToClose(self, evt,):
        self.Close()

    def OnClickBoton1(self, evt,):
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.AppendText(" Cliente Pide Boleto. ")
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.SetFocus()

    def OnClickBoton2(self, evt,):
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.AppendText(" Cliente Regresa Boleto y Se le Devuelve Automovil. ")
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.SetFocus()

    def OnClickBoton3(self, evt,):
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.AppendText(" Cliente Pide Ayuda. ")
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.SetFocus()


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, "Estacionamiento")
        self.SetTopWindow(frame)

        print "Simulacion"

        frame.Show(True)
        return True

app = MyApp(redirect=True)
app.MainLoop()


Proxima entrega:

**Se espera tener algun Demo del proyecto y funcionando.

No hay comentarios:

Publicar un comentario