martes, 22 de mayo de 2012

[CÓMPUTO INTEGRADO] Proyecto arduino

Para mi proyecto hice un contador de mails nuevos en Gmail, consiste en un código que ejecuta en la computadora en python y en el código de Arduino.

La lista de materiales consiste en :
  • 1 Arduino UNO
  • Decodificador 7447
  • 3 displays ánodo común
  • 3 resistencias 330Ω
  • Cable USB
  • Muchos otros cables
Algunas imagenes de como quedó:



El proyecto tiene 2 códigos, el código en python ejecuta localmente y utiliza las librerias pyserial y feedparser; el primero se encarga de establecer conexión serial via USB con el Arduino, el segundo se encarga de conectarse con el RSS de Gmail para contar el total de correos.

El código es:

import serial, sys, feedparser, os
from time import sleep

#Ajustes de cuenta

USERNAME="**************@gmail.com"
PASSWORD="***********"
PROTO="https://"
SERVER="mail.google.com"
PATH="/gmail/feed/atom"
SERIALPORT = "/dev/tty.usbmodemfa131" # Puerto a utilizar para establecer conexión

def serialgmail():

# Ajustando el puerto

	try:
            ser = serial.Serial(SERIALPORT, 9600)
            sleep(1)
            ser.write(chr(1))
	except serial.SerialException:
		print "No hay dispositivo conectado"
		sys.exit()

	newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"])
   

	for i in range(newmails): 
            sleep(.01)
            ser.write(str(0))
            sleep(.01)
            
#ser.close()

while True:
	serialgmail()
	sleep(15)

El código de Arduino es el siguiente:
// Pines del decodificador
int A = 13;
int B = 12;
int C = 11;
int D = 10;

int mail; // Nuevos mails?
int val; // Valor del puerto serial a mostrar en los displays

int x = 0, y = 0, z = 0; // Cifras del valor serial individuales

void setup()
{
  pinMode(A, OUTPUT); // Pines del decodificador como salidas
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(9, OUTPUT); 
  
  Serial.begin(9600);
  Serial.flush();
  
  // Se inicia con el led apagado
  mail = LOW;
  digitalWrite(9, HIGH);
}

void loop() {
  // Lectura de serial
  val = Serial.read();
  Serial.write(val);
  if (Serial.available()) {
    Serial.println(val);
    while(true){
      multiplex();
    }
  }
}

void display_values() {
  int aux = 0;
  while (aux <= serReadInt()){
    x++;
    if (x == 10){
      x = 0;
      y++;
    }
    if (y == 10){
      y=0;
      z++;
    }
    aux++;
  }
}

void dec_bin(int value){
  if (value == 0){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 1){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 2){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 3){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 4){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 5){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 6){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 7){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 8){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
    else if (value == 9){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
}

void multiplex(){
  display_values();
  dec_bin(x);
  digitalWrite(3, HIGH);
  delay(5);
  dec_bin(y);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  delay(5);
  dec_bin(z);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  delay(5);
  digitalWrite(5, LOW);
}

int serReadInt()
{
 int i, serAva;                           // Contador i, serAva espera a que haya información disponible en serial
 char inputBytes [7];                     // Arreglo de bytes que se reciben
 char * inputBytesPtr = &inputBytes[0];   // puntero al primer elemento
     
  if (Serial.available()>0)            // Hay informacion en serial?
 {
   delay(.0000001);                              //Delay para la transmición
                                              
   serAva = Serial.available();  // Se lee el número de bytes de entrada
   for (i=0; i "mayor que" serAva; i++)       // Se cargan los bytes recibidos al arreglo
     inputBytes[i] = Serial.read();
   inputBytes[i] =  '\0';             // Se pone el caracter nulo al final
   return atoi(inputBytesPtr);    
 }
 else
   return -1;                           // Se regresa -1 si no hay información de entrada
}

2 comentarios:

  1. Hola Victor, muchas gracias por tu post.
    Podrías subir el diseño electronico, porque con las fotos no se alcanza a ver los pines de donde lo conectaste, muchas gracias

    ResponderEliminar
    Respuestas
    1. Desde hace mucho que hice esto, ya no tengo esa información. :/

      Pero es un simple multiplexor; si mal no recuerdo las salidas del arduino 3, 4 y 5 se conectan al vcc de cada display (ánodo comun).

      Las salidas 13, 12, 11 y 10 se conectan a los pines A, B, C y D del decodificador 7447 respectivamente de acuerdo con su datasheet (http://www.davidswinscoe.com/electronics/components/7447/74xx47.gif).

      Las salida 9 la uso para dar corriente al proto, puede ir donde quieras, y utilizo el gnd del mismo arduino para el proto, tambien ponlo donde quieras.

      Para multiplexar, hay muchos tutoriales de como hacerlo, basicamente tienes que puentear los pines de cada segmento de los 3 displays a la misma salida del 7447 (como aquí http://www.electronicsblog.net/wp-content/uploads/7s.png).

      Espero que ésto te ayude.

      Eliminar