Hola a todos, este es mi primer post y ya os aviso de que soy bastante novato (sobretodo en la parte de programación).
Dispongo de un Arduino UNO, Fuente de alimentación, Dos módulos RS485 para Arduino, Osciloscopio, Un sensor ultrasonidos URF7 (o USS5) y todo tipo de materiales electrónicos básicos.
Os comento, la idea básica del proyecto consiste en manejar el sensor de aparcamiento de Bosch con Arduino. Este tiene unas características realmente muy buenas:
Antes de nada ya os digo que es muy difícil encontrar información sobre estos sensores, ni datasheet ni nada parecido, lo único interesante que he encontrado es lo siguiente:
En ese Post el tío los consigue hackearlos con una Mbed, en el post se incluye el código que utiliza para calibrarlos.
Mi primer objetivo es que el sensor me responda, ya habrá tiempo para calibrarlo adecuadamente.
Ahora os comento los problemas que me están surgiendo:
-
El primer problema con el que me encuentro es que el sensor tiene 3 pines (8V, GND y Comm), entonces para comunicarme con el necesito hacer un sistema Half-Duplex, para ello estoy empleando un módulo RS485 para Arduino (Realmente no sé si es la mejor opción). Lo tengo conectado de la siguiente manera con la única diferencia de que sólo tengo el pin A conectado al sensor y el B no lo he conectado a ningún lado.
Aquí mi duda es si el circuito es el adecuado para comunicarse con el sensor. -
El segundo problema es que mis conocimientos de programación son muy limitados. Lo que quiero que haga es que mande le mande ciertos pulsos para inicializarlo y que inmediatamente se ponga a escuchar a ver si el sensor nos responde. Para ello he visto que el tío que lo hackea manda este ping
[/left]
En microsegundos (337,356,278). El 3C de la izquierda es un 60 en Hexa (00111100)
Aunque por otro lado encontré en un pdf, (que ahora no logro encontrar en la web pero por suerte descargué) que dice: "para que los sensores envíen los pulsos, han de activarse primero, es decir, el sensor empieza a enviar cuando recibe dos pulsos de 375 μs, uno a nivel bajo y otro a nivel alto" y me cuadra más que el otro.
Voy con mi pobre intento del código (He intentado comunicarme mediante el puerto serie):
const int ledPin = 13; // Esto no sé porque se pone cuando se usa el puerto serie, pero lo he visto en todos los ejemplos
const int PinDos = 2; // HIGH = Tx / LOW = Rx
String Listen = 0; // Almacenae el dato (no sé si debería ser un string)
unsigned long inicio, fin, transcurrido; //Contador, con esto quiero hacer que esté leyendo durante unos dos segundos
void setup()
{
Serial.begin(115200);
Serial.setTimeout(50); //Esto no creo que esté bien
pinMode(ledPin, OUTPUT);
pinMode(PinDos, OUTPUT);
}
void Ping() { //Para que el ping esté en alto o bajo durante 337 (o 375 o los que sean) microsegundos se haría de esta manera? Mando un 15 porque el tío del post en su código manda 0x0F para el alto y 0x00 para el bajo
Serial.write(15);
delayMicroseconds(337);
Serial.write(0);
delayMicroseconds(356);
Serial.write(15);
delayMicroseconds(278);
}
void loop() {
inicio =0; //inicializo contadores
fin=0;
//RS485 como transmisor
digitalWrite(PinDos, HIGH);
digitalWrite(ledPin, HIGH);
Ping(); //mando el ping
//RS485 como receptor
digitalWrite(PinDos, LOW);
digitalWrite(ledPin, LOW);
inicio = millis();
while ( transcurrido < 2000 ){ //contador de tiempo con for para hace 2s
if (Serial.available() > 0) { //Aquí ya si que estoy totalmente perdido, no sé muy bien como tengo que recoger la información que me devuelve el sensor, cuando me la devuelva :D
Listen = Serial.read();
Serial.print("Escucho");
Serial.println(Listen, DEC);
}
// else {
// Serial.println(transcurrido);
//}
fin = millis();
transcurrido =fin-inicio;
}
}
Esto es lo que tengo hecho por ahora, la opción de comunicación en serie es la adecuada?
No sé si me habré dejado algo por comentar, agradezco mucho su ayuda.