jueves, 31 de mayo de 2012

Problemas intentando leer el puerto Serie.

Ya no se que probar. Estoy desesperado.

Desde que compre el Arduino con un completo Kit de sensores no he hecho mas que probar cosas y desde el primer dia encantado con los resultados.
Los ejemplos de los sensores mas variados me salen pero ahora me he quedado estancado intentando leer un aparato que trasmite datos por Puerto Serie.

He probado de todo todos los ejemplos librerias y codigos que he visto por ahy y nada que no va.

Pongo algunas fotos y el codigo con que lo estoy probando ahora por si alguiien puede echarme una manita (que no sea al cuello)

Aqui el interfaz Rs-232 TTL que estoy usando:





Como se puede ver se encienden los led. aunque no parpadean.

Aqui el codigo que estoy usando y que vario continaumente para ver si consigo que funcione. Os agradeceria que le echarais un vistazo a ver si hay algo mal.

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

SoftwareSerial miSerial =  SoftwareSerial(rxPin, txPin);
byte pinEstado = 0;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
  // define el modo para los pines tx, rx, led:
  Serial.print ("hello, world!");
 
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
 
  // configura el ratio de datos para el puerto SoftwareSerial
  miSerial.begin(4800);
}
void loop() {
 
  lcd.setCursor(0, 1);
 //lcd.print(millis()/1000);

  // escucha la llegada de nuevos datos serie:
  char unChar = miSerial.read();
  // imprime el caracter:
  // miSerial.print(unChar);
  lcd.print(unChar);
  Serial.print (unChar);
 
    // Comunta un LED para que veas que la cosa viva
  // este LED se enciende con cada NUEVO caracter recibido:
  toggle(13);

 // espera 10 milisegundos para leer mas
 
  delay(10);
}
void toggle(int pinNum) {
  // Establece el pin del LED usando la variable pinEstado:
  digitalWrite(pinNum, pinEstado);
  // si el pinEstado = 0, lo establece a 1, y vice versa:
  pinEstado = !pinEstado;
 
    }

Unas fotos del montaje:



Como podeis ver el codigo funciona, lo que ocurre es que no le llega nada por el puero serie.

y este es el aparatito culpable de mis desvelos:



Y por si pensais que el cuentavueltas o el cable puedan estar mal, aqui teneis la prueba de que no esto es lo que me lee un sniffer del puerto serie con el mismo cable, o sea que eso no es.




Saludos y perdonar el toston.
Vaaale ya se que para lo que voy a enseñar el titulo es muy pomposo pero algo tenia que poner.
En realidad es el primer acercamiento a algo de lo que quiero hacer con mi Arduino para el Slot.
Decir lo primero que solo es un experimento y que de antemano ya sabia que no iba a funcionar, porque tiene un gran problema, por otra parte me ha servido para despegar en cuanto a montajes de varios aparatos (sensores) a la vez y para probar un primer programa hecho por mi.

Decir que a pesar de todo me ha sorprendido lo facil que ha sido y sobre todo que ha funcionado todo como tenia previsto desde que lo empeze a pensar. Y que a pesar de que no sirve para lo que finalmente quiero ha servido para mi objetivo.

Bueno pues esto es todo el material que necesitaba:


Un arduino, un sensor detector de distancia por infrarojos una pila un display de 16x2 digitos y un monton de cablecitos.

Esto es el montaje, sencillo a pesar de la maraña de cables




Como se puede ver el sensor se conecta al arduino en los pines 6 y 7 y a la corriente de 5v y masa
el display a los pines 2,3,4,5 y 10 y 11 siguiendo los esquemas de la pagina web http://www.arduino.cc/ y sus ejemplos. y se iontercala un potenciometro de 100k para regular la intensidad de la señal de display.
La pila fundamental para que funcione independiente del ordenador.

Que hace esto?

Pues con esa especie de binoculares el arduino nvia una señal por ultrasonido que con un retardo determiando escucha por la otro areja (explicacion simple pero que por supuesto no funciona exactamente asi). midiendo lo que tarda en volver la señal (vamos como los murcielagos y los delfines, verdaderos inventores del radar y del sonar) y dependiendo de lo que tarde se calibra para que el tiempo corresponda con una señal.
En mi caso despues de probarlo con el ordenador y de ver que es mucho mas exacto de lo que yo pensaba, me decia las distancias con una gran precision y 16 decimales.
Bueno pues ahora viene lo mejor, si el cacharro detecta un objeto a cierta distancia y le decimos que si tenemos un objeto a menos de 10 cm es que va por el carril 1 y si esta entre 10 y 20 va por el carril 2 y asi hasta el carril 6 pues tenemos un contador con un poco de programación.





Y eso es lo que he fabricado, pero con un costo de menos de 30 euros en total (a parte del arduino, pero que en cao de fabricarse en serie no superaria esta cantidad) y sin necesidad de puentes ni nada mas.

Os dejo alguna foto de como va el invento. Por supuesot por programacion ya le he añadido un contador de vueltas y me faltaria el contador de tiempo pero que si veis el codigo ya esta listo para ser implementado.

Cual es el problema por el que os decia al principio que no va a servir para nada? pues que si pasan dos coches solo ve al que esta mas cerca.  pluffff, se jodio el invento, y con el otros sistemas como pueden ser el laser y demas. a no ser que pongamos varios sensores en linea y detecten y disciernan entre ellos que coches acaban de pasar, pero ya lo complicamos demasiado.

Codigo arduino:

/* se utiliza el sensor de distancia por ultrasonidos
se conecta el pin izquierdo a grd (visto desde atras)
se conecta el pin de la derecha a 5v
el segundo de la izquierda al digital 6
y el tercer de la izquierda al digital 7
he utilizado el pin 13 para indicar cuando se manda señal al rebote pero no hace ffalta
porque al estar conectado al monnitor de serie tambien se enciende el otro led verde
faltaria ahora ponerle el display para leerlo en el display
venia con un display serie y me daba error
lo suyo es ponerle un boton para qeu solo mida cuando pulsemos el boton
mejoras
un boton para empezar
un pitido cada vez que pasa alguien
contar el tiempo
*/


#include
#include
//#include


#define echoPin 6 // the SRF05's echo pin
#define initPin 7 // the SRF05's init pin
//unsigned long pulseTime = 0; // variable for reading the pulse
float pulseTime = 0; // variable for reading the pulse
int V1=0;
int V2=0;
int V3=0;
int V4=0;
int V5=0;
int V6=0;
double T1=0;
double T1min=1000;
double T2=0;
double T2min=1000;
double T3=0;
double T3min=1000;
double T4=0;
double T4min=1000;
double T5=0;
double T5min=1000;
double T6=0;
double T6min=1000;

// initialize the library with the numbers of the interface pins
// LiquidCrystal_I2C lcd(0x27, 16, 2);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {

Serial.begin(9600);
// make the init pin an output:
pinMode(initPin, OUTPUT);
// make the echo pin an input:
pinMode(echoPin, INPUT);
}

void loop() {
digitalWrite(initPin, LOW);

//digitalWrite(13, HIGH);
delayMicroseconds(10);
digitalWrite(initPin, HIGH);
// digitalWrite(13, LOW);
delayMicroseconds(10);
digitalWrite(initPin, LOW);
pulseTime = pulseIn(echoPin, HIGH);


// lcd.setCursor(0,0);
/ lcd.print(pulseTime / 58, DEC);



// set up the LCD's number of columns and rows:

lcd.begin(16, 2);

// Print a message to the LCD.
if (pulseTime/58<10)

{
Serial.println("CARRIL 1");
V1=V1+1;
if (T1
{
T1min=T1;
}
lcd.print("CARRIL 1 ");
lcd.print(V1);
lcd.print(" vueltas");
lcd.setCursor(0, 1);
lcd.print("T: ");
lcd.print(T1);
lcd.print(" Tm: ");
lcd.print(T1min);
}
else if (pulseTime/58<20)
{
Serial.println("CARRIL 2");
V2=V2+1;
if (T2
{
T2min=T2;
}
lcd.print("CARRIL 2 ");
lcd.print(V2);
lcd.print(" vueltas");
lcd.setCursor(0, 1);
lcd.print("T: ");
lcd.print(T2);
lcd.print(" Tm: ");
lcd.print(T2min);
}
else if (pulseTime/58<30)
{
Serial.println("CARRIL 3");
V3=V3+1;
if (T3
{
T3min=T3;
}
lcd.print("CARRIL 3 ");


lcd.print(V3);


lcd.print(" vueltas");


lcd.setCursor(0, 1);


lcd.print("T: ");


lcd.print(T3);


lcd.print(" Tm: ");


lcd.print(T3min);


}


else if (pulseTime/58<40)






{


Serial.println("CARRIL 4 ");


V4=V4+1;


if (T4


{


T4min=T4;


}






lcd.print("CARRIL 4");


lcd.print(V4);


lcd.print(" vueltas");


lcd.setCursor(0, 1);


lcd.print("T: ");


lcd.print(T4);


lcd.print(" Tm: ");


lcd.print(T4min);


}






else if (pulseTime/58<50)






{


Serial.println("CARRIL 5 ");


V5=V5+1;


if (T5


{


T5min=T5;


}






lcd.print("CARRIL 5");


lcd.print(V5);


lcd.print(" vueltas");


lcd.setCursor(0, 1);


lcd.print("T: ");


lcd.print(T5);


lcd.print(" Tm: ");


lcd.print(T5min);


}


else if (pulseTime/58<60)






{


Serial.println("CARRIL 6 ");


V6=V6+1;


if (T6


{


T6min=T6;
}
lcd.print("CARRIL 6");
lcd.print(V6);
lcd.print(" vueltas");
lcd.setCursor(0, 1);
lcd.print("T: ");
lcd.print(T6);
lcd.print(" Tm: ");
lcd.print(T6min);

else
{
Serial.println("NO PASA NADIE");
lcd.print("NO PASA NADIE");
}

delay(500);
// lcd.clear();
}


La semana que viene me llegan varios sensores mas que espero que vayan mejor para esto, y de manera que podamos prescindir de los famosos puentes de led que tanto problemas dan con la luz directa y con la harina, que es lo que yo voy buscando.

saludos.