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.

jueves, 8 de noviembre de 2012

Avance - funcionamiento

¿Cómo funciona el sistema? && Union de la creación del qr con la base de datos

Valor de entrada: 10 

Para comenzar con esta entrada primero que nada daremos entrada a la definición del funcionamiento del proyecto realizado.

Aquí tenemos un diagrama de la secuencia del sistema que se ira explicando parte por parte:



Base de Datos


Python+qr

Lo que hace el siguiente código es primero que nada:

  • Realiza la conexión a mysql
  • Localiza el lugar donde se estacionara el carro
  • Ya localizado creara un numero de verificación para la seguridad
  • Crea el qr
  • Actualiza los datos en la bd

Código

En que se trabaja en:

* Material  ya listo
* Pruebas del material y armado

jueves, 1 de noviembre de 2012

Actividad

La primera parte de esta entrada consiste en exponer dos diseños de lo que vendria a ser la base giratoria de nuestro proyecto que es la que se encargará de dar la capacidad de girar a toda la estructura junto con los autos.

En esta base ira montada la estructra que levantara los coches y se manipulara por medio de otro motor, pero en este caso el motor sera de los conocidos como servomotores, que ya habiamos comentado anteriormente que usariamos. Estos motores se manipulan sus giros mediante ordenes con la cantidad de grados a girar, con lo que nos facilitaria un poco la manipulación de esta parte del estacionamiento.

Tomamos como referencia el mecanismo/diseño de rotación de los platos de algunos microondas para la construcción de esta pieza.

Los diseños a los que llegamos finalmente son dos (todavía esta en discución cual será el final), que difieren en la posición del motor que hara girar la pieza: 

El primero donde el motor se sitúa en el centro de la pieza:

vista desde la parte baja

vista lateral
 Las ruedas en ambos casos ayudan a mejorar el desplazamiento al reducir la fricción y a distribuir mejor la carga, por lo que se buscaría usar algunas ruedas contruidas con un material llamado "goma", que son conocidas por usarse en patines incluso en patinetas.

El segundo diseño:
El motor se situaría a un costado de la base, apoyandose de un engrane situado en la circunferencia de la base para transmitir los movimiento.

vista desde la parte baja

vista lateral


El material previsto para la creación de esta pieza es un tipo de triplay (madera), buscando un equilibrio entre lo ligero y lo resistente; mientras que el material para los brazos podría ser triplay un poco mas grueso o incluso una especie de plastico duro. Esto para buscar que el peso de la estructura completa sea lo mas ligero posible.

Otro aspecto que queremos exponer en esta entrada, son las pruebas que estamos realizando con las diferentes opciones que hay para manipular los motores, en este caso los de dc, que seran los encargados de realizar los movimientos del "ascensor".

En este caso realizamos pruebas con una librería "nueva" llamada MotorDC, "nueva" en el sentido que esta librería es una modificación de otra conocida como Stepper que se usa también para la manipulación de motores.
El motivo por el cual optamos por realizar pruebas con esta librería es porque nos facilita la inversión de la polaridad de los motores sin necesidad de uso de integrados externos, solo con el uso del arduino y que tambien nos permite realizar movimientos del motor por medio de pasos o vueltas.

Aquí dejamos un código de ejemplo del uso básico de esta librería:

#include MotorDC.h

#define motorSteps 96
#define motorPin1 8
#define motorPin2 9
#define ledPin 13

// initialize of the MotorDC library:
MotorDC myMotorDC1(motorSteps, motorPin1,motorPin2);
MotorDC myMotorDC2(motorSteps, motorPin2,motorPin1);
//crear dos inicializaciones, con los pines al reves para darle polaridad

void setup() {

myMotorDC1.setSpeed(5); //velocidad de operacion
myMotorDC2.setSpeed(5);

// Initialize the Serial port:
Serial.begin(9600);
}

void loop() {
// Step forward 100 steps:
Serial.println("Forward");

myMotorDC1.step(10);
//el motor va a girar de cuerdo a la cantidad de pasos

digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
//aqui detiene el motor
delay(1000);

Serial.println("Backward");

myMotorDC2.step(-10);
//el motor va a girar de cuerdo a la cantidad de pasos

digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
delay(1000);
//aqui detiene el motor
}



Y aquí una imagen ilustrativa de su conexión:




Otra opción muy viable para la manipulación de los motores con el arduino y que estamos considerando muy seriamente en implementarla, es una que nos puede ayudar con la manipulación de los voltajes, esto mediante un transistor 2n4401. Esto nos ayuda en el sentido de que el arduino en los voltajes de salida que ofrece son muy bajos y no es posible que con estos voltajes operen los motores con los que estamos trabajando (al parecer operan con 12v) y este transistor lo que ofrece es la posibilidad de usar un voltaje externo al del arduino para que los motores operen correctamente.

La función de este transistor es la de recibir las bajos voltajes del arduino y cada que esto sucede, el transistor manda las señales al motor pero con el voltaje externo.

Aquí una imagen de como se utiliza:







Otro punto a tratar (opcional) es el de la creación de la estructura del elevador, que se ha estado retrasando debido a que los materiales que se eligieron después de varias discuciones (entre integrantes del equipo y peronas con conocimientos de esto), fueron aluminio y acero inoxidable, debido a su resistencia, ligerés, manipulación, (y tal vez algo de estética), pero estos materiales no son tan fáciles de conseguir, en nuestra localidad son contados los proveedores de estos materiales, además de que la mayoría no expende en pequeñas cantidades, entre otras situaciones y es lo que nos ha estado retrasando para su creacion.

______________________________________________________________________________________
Útiles:
transistor 2n4401 datasheet