Go Down

Topic: Controlar sensor aparcamiento Bosch (Read 675 times) previous topic - next topic

Danimp94

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:

(https://www.bosch-mobility-solutions.com/en/products-and-services/passenger-cars-and-light-commercial-vehicles/driver-assistance-systems/construction-zone-assist/ultrasonic-sensor/)

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:

http://www.instructables.com/id/Hacking-Automotive-Ultrasonic-Sensors/

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:

1. 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.

2. 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

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):

Code: [Select]
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.

surbyte

Para empezar creo que la interfaz está equivocada.
El instructable sugiere esto




Y eso no tiene nada que ver con una interfaz 485.

Asi que te sugiero la armes y luego te pongas a probar.

Danimp94

Así es, lo primero que hice fué copiar ese circuito, pero después de darle bastantes vueltas y muchas pruebas solo conseguí que al sensor le llegase una señal muy pobre de poco menos de 1V medido con el osciloscopio.

La única diferencia que había entre el circuito que yo hice y ese era el voltaje de Mbed (a 3.3V) y el de Arduino (5V), así que también he probado a modificar esa señal con un regulador de voltaje Lm371t para que la señal saliese a 3.3V, pero sin resultado.

También probé a poner un amplificador operacional seguidor a la salida del arduino para que el voltaje no cayese, pero sin resultado igualmente. Y las dos opciones juntas tampoco me han funcionado.

Por eso lo he intentado con el módulo RS485 aunque no sé si puede funcionar realmente, existe alguna opción sencilla para hacer el sistema half-dúplex?

surbyte

Porque no copias el programa MBED porque esta en un formato propietario y realmente no pude ver nada.
Yo creo que debes prestar atención a los tiempos de cada acción RX y TX de ese programa.
Como en todo dispositivo, los tiempos de acceso, establecen momentos de respuesta o inactividad.

Sigo asegurándote que el MAX485 no puede hacer nada ahi. No hay similud alguna con la situación diferencial usada en una comunicacion RS485.

La verdad que el primer link que pones nos situa en una presentación del sensor pero sin información técnica no se como ayudarte.

Go Up