Arduino para interpretar señales de marchas en moto BMW

Hola A todos. Soy Javier de Valencia y me he adentrado en el mundo arduino a través de la mecánica de motos de manera personal, no comercial.

He instalado un cuadro de mandos digital en la moto. Las señales que he podido las he sacado de manera mecánica, añadiendo sensores.

Para enviar al nuevo cuadro de mandos las señales de en que marcha esta la moto y cuando esta en punto muerto, no he podido de ninguna de las maneras, pues lleva un sensor original que a través de scan bus le envía la señal al cuadro de mandos original.

Del propio sensor de marchas que salen 3 hilos he detectado uno que según la marcha que esta engranada emite una señal en voltios diferente Osea, que cada una de las 6 marchas emite voltajes diferentes y el punto muerto también emite voltaje diferente.

A raíz de esas medidas que emite un solo hilo, me he propuesto (siempre que obtenga ayuda) convertir ese hilo de 7 señales diferentes(voltage) en 7 salidas independientes que cada salida emita masa o voltaje menor de 4 voltios que es lo que necesito para activar los 7 hilos que van al nuevo cuadro de mandos digital. Tengo todas las mediciones. Alguien me puede indicar como seria el codigo para conseguir eso?
Gracias de antemano.
Muchas.

Saludos Javier.

foto1

foto2

foto3'

170994-5dfb1f4448306a3e54b031b32d95ac87.jpg

170995-9d2db72bad91677e51f22d6b29172ad0.jpg

170996-8712bb710043a289d39953044adee81a.jpg

170997-93c50cbb7f1735c416545645c6f76f83.jpg

170998-47c47c1e48efd99271633435378f17a2.jpg

170994-5dfb1f4448306a3e54b031b32d95ac87.jpg

170995-9d2db72bad91677e51f22d6b29172ad0.jpg

170996-8712bb710043a289d39953044adee81a.jpg

170997-93c50cbb7f1735c416545645c6f76f83.jpg

170998-47c47c1e48efd99271633435378f17a2.jpg

Las dos imágenes que has posteado deben visualizarse usando la indicación que esta al final de las normas del foro, por favor edita tu post inicial y hazlas visibles.
Cuando sean visibles, mas personas podrán responderte.
Gracias.

Hola No se pueden visualizar porque la dirección web de enlace no termina en jpg. png. etc
Ya lo intente pero no se puede, no lo reconoce el sistema del foro. Lo siento Gracias por el aviso.
Saludos.

Hola.
He instalado el arduino en la moto y sacado las señales que necesito para enviar al cuadro de mandos.

Lo que necesito es realizar el siguiente código

Es posible programar el arduino para que al entrarle cada uno de estos valores de menor a mayor saque valor 0,80 ? ¿Por favor alguien podria hacerme la primera fila y yo ya hago el resto?

Quiero decir:

Entrada tensión por A0 de 1,80v a 1,97v salida por puerto 2 de 0.80v
Entrada tensión por A0 de 2,10v a 2,24v salida por puerto 3 de 0.80v
Entrada tensión por A0 de 2,42v a 2,55v salida por puerto 4 de 0.80v
Entrada tensión por A0 de 3,05v a 3,20v salida por puerto 5 de 0.80v
Entrada tensión por A0 de 3,70v a 3,85v salida por puerto 6 de 0.80v
Entrada tensión por A0 de 4,42v a 4,54v salida por puerto 7 de 0.80v
Entrada tensión por A0 de 4,94v a 5,26v salida por puerto 8 de 0.80v

Para mi, el hacer el código es una montaña.

Gracias.

Lo que quieres hacer es muy sencillo, pero si no sabes programar ni tienes intención de hacerlo es donde se complica ya que aquí no solemos hacer códigos, estamos para ayudarnos.

Las entradas soportan 3.3V o 5V depende del modelo que uses.
Con analogRead y condicionales ya puedes deducir que marcha tienes engranada, para la salida solo vas a poder sacar 3.3V o 5V depende del modelo que uses por lo que tendrás que reducir la tensión tanto en la entrada como en la salida.

Te ayudara también la función map para convertir la lectura analógica que va de 0 a 1023 a las tensiones, o puedes ver que valores esta leyendo la entrada imprimiendolo por puerto serie y te ahorras el map.

map(value, fromLow, fromHigh, toLow, toHigh)

Mira el LCD Keypad Shield y verás que hay una rutina para interpretar el teclado aqui tutorial

Esa rutina es similar a lo que necesitas hacer tu, se trata de botones que al presionarlos dan valores entre V1 y V2 como en tu caso.

Asi que solo ajuste ese código a tu necesidad y lo tienes bastante resuelto.

krnlpanic GRACIAS! tengo la opcion de sacar hasta 4.00v de tensión en vez de 0.80v. Pues el cuadro de mandos recibe la señal y se encienda cada indicador de marcha si le llega tensión cero o menor de 4,1v

surbyte GRACIAS! voy a empaparme de información donde me dices y os comento.

Saludos :wink:

Con este código que me indico un amigo en el foro de motos, he conseguido conocer cada lectura a medida que engrano cada marcha.

Entrada desde la moto a A0 y leída información en RX


void setup() {
Serial.begin(9600);
}

void loop() {
sensorValue = analogRead(sensorPin); // realizar la lectura
value = fmap(sensorValue, 0, 1023, 0.0, 5.0); // cambiar escala a 0.0 - 5.0

Serial.println(value); // mostrar el valor por serial
delay(1000);
}

// cambio de escala entre floats
float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Ahora lo que tengo que conseguir es que cada lectura de cada marcha, salga por salidas diferentes del arduino y asi cada una de esas 7 salidas son las que envio al cuadro de mandos. punto muerto + 6 marchas.

Gracias! Saludos.

Por favor edita tu código para que se vea usando etiquetas, tienes instrucciones de como hacerlo en las normas del foro.

Ahora solo te falta añadir el condicional.

if (value >= 1.80 && value <= 1.97) digitalWrite(salida1, HIGH);
else digitalWrite(salida1, LOW);

Recuerda declarar el pin de salida y y indicar que es salida en setup

@javierinoxxx por favor, ya te llamé la atención al comienzo de tu post y ahora de nuevo.

El foro tiene normas y si miras las Secciones me la paso reclamando a todos y cada uno de los que postean códigos como simple texto que usen las etiquetas adecuadas para código, no simple texto como has hecho.
Ahora edita tu post#7, observa como lo hizo @krnlpanic !!

krnlpanic Muchas gracias.

Estoy ahora mirando como demonios se pone un code en el foro. Aprendo como meterlo en un arduino , aprendo como preguntarlo, aprendo como subirlo, aprendo como no enfadar a los moderadores, aprendo a que el mundo me de por todos las dos, aprendo a que nada sea ya valido, aprendo a vivir en una futura ruina, aprendo a seguir viviendo con educación................

Supongo que no pasara nada si suspendo más de una dos o tres veces no?????

void setup() {
Serial.begin(9600);
}

void loop() {
sensorValue = analogRead(sensorPin); // realizar la lectura
value = fmap(sensorValue, 0, 1023, 0.0, 5.0); // cambiar escala a 0.0 - 5.0

Serial.println(value); // mostrar el valor por serial
delay(1000);
}

// cambio de escala entre floats
float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}



if (value >= 1.80 && value <= 1.97) digitalWrite(salida1, HIGH);
else digitalWrite(salida1, LOW);

if (value >= 2.10 && value <= 2.24) digitalWrite(salida2, HIGH);
else digitalWrite(salida2, LOW);

if (value >= 2.42 && value <= 2.55) digitalWrite(salida3, HIGH);
else digitalWrite(salida3, LOW);

if (value >= 3.03 && value <= 3.20) digitalWrite(salida4, HIGH);
else digitalWrite(salida4, LOW);

if (value >= 3.70 && value <= 3.85) digitalWrite(salida5, HIGH);
else digitalWrite(salida5, LOW);

if (value >= 4.42 && value <= 4.54) digitalWrite(salida6, HIGH);
else digitalWrite(salida6, LOW);

if (value >= 4.94 && value <= 5.26) digitalWrite(salida7, HIGH);
else digitalWrite(salida7, LOW);

Este orden seria correcto? supongo que es el que me indicas. A no se que tenga que repetir el inicio tantas veces indique salidas.

krnlpanic me dices : Recuerda declarar el pin de salida e indicar que es salida en setup.


Expresar lo que me supone vuestra ayuda información, clase, con solo la palabra gracias es insuficiente al aporte que me dais.
Se que no es mi mundo el electrónico y el hacer un pequeña inmersión para fines mecánicos particulares no es suficiente para aprender nada del fantástico mundo del arduino. Ojala mi cabeza fuese mas amplia y mi cerebro tambien.
Lamentablemente mi edad de 55 años ya es cabeza vieja y con conocimientos escasos en electrónica actual.

Volviendo al tema.... GRACIAS es insuficiente para que mi verdadero agradecimiento sea entendible.

Lo escribiré como un fuerte apretón de manos y reverencia. :slight_smile:

Los condicionales van dentro del loop, falta declarar las salidas en el setup que era deberes que te dejaba para buscar en google, es muy fácil, buscalo y nos cuentas.

Creo que vas a tener problemas en detectar esos valores
Mira por qué lo digo:
Dif punto medio
0.17 1.885
0.14 2.170
0.13 2.485
0.15 3.125
0.15 3.775
0.12 4.480
0.32 5.100

La diferencia de tensión entre dos valores esta muy cercana a pesar que la resolución de arduino es de 4.88 mV

Veamos el peor caso que es 6ta marcha (si cuento bien pq me esta faltando punto muerto) donde solo tienes 0.12V de diferencia o 120 mV.

120 mV / 4.88 mV/paso = 24 pasos

Ahora si tenemos una Motocicleta con ruido del sistema de ignición, balizas, buzzer, electrónica, etc.
Si me dices que pones un multímetro/tester y esa tensión es estable será porque hablamos de una BMW.
Solo presta atención a este punto si es que te da problemas y si estoy equivocado lo pasas y ya.

Otro punto que no me gusta es el último.

4.94 5.26

5.26 mejor no se lo apliques al arduino. Usa un zener de 5.1V que corta antes, o bien coloca un divisor resistivo que baje todo a niveles por debajo de 5V. Algo sutil pero que asegure no llegar a 5.26.

Yo te aconsejaría armar una placa con un Schmith Trigger. Fijando los puntos con preset si quieres. Eso te daría perfección en la detección de cada nivel prescindiendo de Arduino si quieres o ingresando sus salidas a entradas del mismo.

Ok. Estoy en ello.

Por aquí estudiando cómo se hace y tengo que hacer el declarar las salidas.

  • que + GRACIAS.

La tensión no es estable. He medido muchas veces y si que variaba mínimamente. También yo he aumentado la franja entre tensiones para tener más seguridad en que marcaría bien. Pero siempre puedo disminuirla.
Lo de tensión no estable no se porque motivo será. Al llevar centralita con scanbus correspondiente, no es una moto que emite mucho ruido del sistema en general.

Otro sistema de sacar todas las señales era a través de un Can-bus shield MCP2515 conectado al arduino y conectar con el scanbus de la moto y asi sacar además de esta información de las marchas, mucha más información.

Que sería el santo grial para mi, perooooo Si esto que es básico ya me resulta una montaña, lo otro me resulta la luna y media.

Un colega del mundo moto en japón sí sacó toda la información a través del bus scan con un arduino a un apantalla lectora, pero yo no necesito la señal en la pantalla, si no señales para llevarlas al cuadro de mandos.

El video es este:

Bueno pregunto primero.. Puedo Poner el enlace del video youtube? He leído antes otra vez las condiciones del foro pero ante la duda consulto.... Espero me indiquéis.

Saludos Gracias!

Amigo, no tienes que preguntar cada cosa, porque las normas te dicen con claridad como poner cada una.
Coloca el vídeo usando enlaces con su debida etiqueta.

Usar can-bus no es para esta etapa tuya, mi recomendación es que no te metas ahí porque te vas a perder en una programación de otro nivel.
Supongamos consigues un código adecuado para CAN-BUS.
Si surge la mas mínima diferencia con tu modelo y los códigos CAN cambian, dime qué harías? Y lo peor es que en tu grupo de motos solo pueden guiarte pero el que finalmente lo tiene que hacer eres tú.

En fin, solo es un consejo. Ve por pasos. Este es tu modelo 1 o tu modelo T como digo yo.
Luego cuando funcione como hobby te pones con el tema CAN-BUS pero no sin antes leer mucho al respecto. Algo que seguro haces porque he leído tu hilo en el foro.

Sí, sí, lo del scan bus lo escribía simplemente por comentario.

Reapunto que si aun no me entero en descifrar que significa el declarar las salidas en el setup, que me apuntaba el colega krnlpanic, imaginate el tema scan bus....... :slight_smile:

La única señal que quiero sacar a través del arduino es la señal de en qué marcha está la moto.
Yo sigo intentando declarar las salidas en el setup.......................... :wink:
Saludos.

Las salidas las declaras asi

pinMode(pin, OUTPUT);

Siigo fallando. No lo coje arduino.......

const int sensorPin = A0; // seleccionar la entrada para el sensor
int sensorValue; // variable que almacena el valor raw (0 a 1023)
float value; // variable que almacena el voltaje (0.0 a 5.0)

void setup() {
Serial.begin(9600);
}
{
pinMode(2, OUTPUT);        //marcha 1 es en pin 2
pinMode(3, OUTPUT);      //marcha neutral  es en pin 3
pinMode(4, OUTPUT);      //marcha 2 es en pin 4
pinMode(5, OUTPUT);     //marcha 3 es en pin 5
pinMode(6, OUTPUT);     //marcha 4 es en pin 6
pinMode(7, OUTPUT);     //marcha 5 es en pin 7
pinMode(8, OUTPUT);     //marcha 6 es en pin 8
}
void loop() {
sensorValue = analogRead(sensorPin); // realizar la lectura
value = fmap(sensorValue, 0, 1023, 0.0, 5.0); // cambiar escala a 0.0 - 5.0

Serial.println(value); // mostrar el valor por serial
delay(1000);
}

// cambio de escala entre floats
float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

{if (value >= 1.80 && value <= 1.97) digitalWrite(salida2, HIGH);
else digitalWrite(salida2, LOW);

if (value >= 2.10 && value <= 2.24) digitalWrite(salida3, HIGH);
else digitalWrite(salida3, LOW);

if (value >= 2.42 && value <= 2.55) digitalWrite(salida4, HIGH);
else digitalWrite(salida4, LOW);

if (value >= 3.03 && value <= 3.20) digitalWrite(salida5, HIGH);
else digitalWrite(salida5, LOW);

if (value >= 3.70 && value <= 3.85) digitalWrite(salida6, HIGH);
else digitalWrite(salida6, LOW);

if (value >= 4.42 && value <= 4.54) digitalWrite(salida7, HIGH);
else digitalWrite(salida7, LOW);

if (value >= 4.94 && value <= 4,98) digitalWrite(salida8, HIGH);
else digitalWrite(salida8, LOW);
}

Surbyte GRACIAS.