jueves, 7 de junio de 2012

Proyecto Black Box para Slot

Esto es el comienzo de un nuevo proyecto que voy a intentar desarrollar a la vez que el gestor de carreras para Slot.
De momento pongo una foto del esquema de lo que quiero realizar y ya ire explicándolo.

Proyecto de Gestor de carreras de Slot.

Este es el primer Post sobre un proyecto que me he propuesto desarrollar.
Se trata de un completo gestor de carreras para Slot.
Un sistema de Software y Hardware que contenga todo lo necesario para realizar la gestión y control de una carrera de Slot.

A día de hoy hay multiples sistemas de control de carreras de Slot, la mayoría comercializados por los fabricantes de pistas de Slot que fundamentalmente son 4 Scalextric, Superslot, Ninco y Carrera. Sin embargo el sistema mas utilizado a nivel profesional es el comercializado por la empresa DS que lelva en el mercado muchisimos años sin apenas variaciones ni mejoras (a pesar de los defectos que tiene) en parte por culpa precisamente del éxito que tiene en el ambiente de los clubes.

Mientras que en la parcela del software si que hay muchas alternativas al programa de la marca DS, la mayoría de los programas utilizan con hardware de captura de datos los puentes y sistema de crono de la marca DS.

Por otra parte los equipos de conexion y stop and go de la marca son asi mismo los mas utilizados en el mundo del Slot profesional.

Esta situación de cuasi monopolio ha propiciado además que a la falta de mejoras en el sistema se añada el alto coste de los equipos de control y medida. Si bien hay algunas pequeñas marcas que fabrican algunos de los elementos (puentes) este es p`recisamente el elemento mas barato por loq eu no han conseguido que el sistema baje de precio.

Lo que pretendo es diseñar y fabricar un sistema completo (de momento para dos carriles) de gestión y control de pistas de Slot, para todas sus categorías (Rally, RAID, Velocidad) y para todas las modalidades de carreras.

El sistema se pretende que sea completo, es decir que solo con el sistema se pueda realizar todo el proceso implicado en una carrera, salvo las pistas, mandos y coches.

Por otra parte y siendo consciente del parque de elementos ya instalados en muchos clubes, se pretende que el sistema sea compatible en la medida de lo posible con los elementos de la marca DS al objeto de aprovechar todo el material que los clubes tengan en propiedad.

Por otro lado y dado que el sistema (aunque pretendemos que baje el precio de los sistemas actuales) no podrá se rmuy barato, pretendemos que sea modular de manera que pueda ir creciendo desde un sistema básico a uno más completo y complejo en medida a las necesidades y disponibilidad de los usuarios.

Este es el esquema de principio del sistema que pretendemos diseñar.

 



Como se puede ver comprende desde los sensores de pista (varios tipos) el gestor propiamente dicho con comunicación con todo lo que podamos imaginar. y el sistema de control y alimentación de la pista, stop and go, fuentes y regurladores de voltaje.

Esta es una primera propuesta de pupitre central que debería englobar todos los elementos del esquema anterior excepto los sensores.



Como el proyecot es muy ambicioso y esperamos que largo el tiempo de desarrollo, ire poniendo los avances del mismo con mucha información de como lo vamos haciendo, para en su caso ayudar al que quiera construirse el suyo propio o para solicitar ayuda de los expertos en los diversos ámbitos que confluyen en un proyecto de esta embergadura.

Slot Saludos.

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.