Arduino para interpretar señales de marchas en moto BMW

He renombrado los OUTPUT de la misma manera que estn el void loop. Antes no los nombraba igual.
y este me da solo 3 fallos que ya no comprendo.
Asi me indica en la pantalla de abajo color negro fondo letras en rojo:

Cambio_marchas_2:8:1: error: expected unqualified-id before '{' token

 {

 ^

Cambio_marchas_2:32:1: error: expected unqualified-id before '{' token

 {

 ^

exit status 1
expected unqualified-id before '{' token
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(salida2, OUTPUT);        //marcha 1 es en pin 2
pinMode(salida3, OUTPUT);      //marcha neutral  es en pin 3
pinMode(salida4, OUTPUT);      //marcha 2 es en pin 4
pinMode(salida5, OUTPUT);     //marcha 3 es en pin 5
pinMode(salida6, OUTPUT);     //marcha 4 es en pin 6
pinMode(salida7, OUTPUT);     //marcha 5 es en pin 7
pinMode(salida8, 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);
}

Las llaves no pueden ir así sin nada delante

{
}

Te lo he corregido, te he declarado un pin de salida te falta el resto en las primeras lineas.

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)
const int salida2 = 2;

void setup() {
  Serial.begin(9600);
  pinMode(salida2, OUTPUT);        //marcha 1 es en pin 2
  pinMode(salida3, OUTPUT);      //marcha neutral  es en pin 3
  pinMode(salida4, OUTPUT);      //marcha 2 es en pin 4
  pinMode(salida5, OUTPUT);     //marcha 3 es en pin 5
  pinMode(salida6, OUTPUT);     //marcha 4 es en pin 6
  pinMode(salida7, OUTPUT);     //marcha 5 es en pin 7
  pinMode(salida8, 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);
  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);
}

// 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;
}

Voy a ello....... GRACIAS

krnlpanic PERFECTO! El arduino ya ha aceptado el código.

Cuando pueda, voy a probar en la moto lo antes posible. Sigo con + y + GRACIAS!

Consulta: El digitalWrite solo me deja poner valores LOW y HIGH ?
Si yo quisiera que el voltaje de salida fuese 1v en todas las salidas, sería así? o eso es una tonteria? ::):slight_smile:

  if (value >= 1.80 && value <= 1.97) digitalWrite(salida2, 1v);
  else digitalWrite(salida2, 1v);

Este código es el que si coje perfectamente. (falta probar en la moto)

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)
const int salida2 = 2;
const int salida3 = 3;
const int salida4 = 4;
const int salida5 = 5;
const int salida6 = 6;
const int salida7 = 7;
const int salida8 = 8;

void setup() {
  Serial.begin(9600);
  pinMode(salida2, OUTPUT);        //marcha 1 es en pin 2
  pinMode(salida3, OUTPUT);      //marcha neutral  es en pin 3
  pinMode(salida4, OUTPUT);      //marcha 2 es en pin 4
  pinMode(salida5, OUTPUT);     //marcha 3 es en pin 5
  pinMode(salida6, OUTPUT);     //marcha 4 es en pin 6
  pinMode(salida7, OUTPUT);     //marcha 5 es en pin 7
  pinMode(salida8, 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);
  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);
}

// 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;
}

@javierinoxxx, creo que deberías ir a Documentos => Indice de temas tutoriales => Libros y ahi lee algunos de los libros gratuitos disponibles.
Es importante que te hagas una idea de lo que se puede y lo que no se puede hacer.

Veamos:

Consulta: El digitalWrite solo me deja poner valores LOW y HIGH ?
Si yo quisiera que el voltaje de salida fuese 1v en todas las salidas, sería así? o eso es una tonteria?

No es una tontería pero no se puede hacer. No como tu lo dices por ahora, con hardware si se puede.
Si pones un DAC si es posible, de hecho hay micros que lo hacen como los STM32 que tienen DAC o el Arduino DUE que tiene 2 DAC a 12 bits (4096 pasos entre 0 y 3.3V).

Recuerda que debes bajar la tensión de todo el espectro de cambios para evitar esos 5.26 si mal recuerdo.

Un divisor de tensión simple te servirá.

Con este divisor y haciendo

R1 = 12k y R2 = 220k tienes exactos 4.99V casi 5V pero se te corre todo el espectro de tensiones asi que usa la calculadora de divisor de tensión y arma toda la nueva lista de valores

O afecta cada valor por este factor y obtendrás el nuevo ‭0.948276

ej: 5.26 x 0.948276 = 4.98

Gracias Surbyte.

He probado y si enciende señales de neutro y primera. pero de manera no correcta, despues si voy quitando entradas se ven iluminando el indicador en el cuadro si voy subiendo de marchas la moto pero no indica corectamente. Total muy loco el envio de señal.

He recortado el campo para ajustar la señal osea que de por ejemplo 1,20 a 1,25 pero aun asi tampoco.
He vuelto a medir tension con moto encendida arduino conectado y la tension se queda estable mucho mas que ayer. practicamente estable estable en la entrada que he medido.
Por eso ahra lo quiero probar dandole solo un valor de entrada fijo a cada marcha.

las entradas estaban asi en una pruba que he hecho cambiando valores:

  if (value >= 0 && value <= 0.40) digitalWrite(salida2, HIGH);
  else digitalWrite(salida2, LOW)

Para poner solo una fija tensión de entrada voy a probar asi:

  if (value >= 0.32)  digitalWrite(salida2, LOW)

voy a ver si lo coje arduino y lo pruebo en moto.

:slight_smile: Que feliz soy yo...... eso que he hecho no funciona no lo coje arduino. :slight_smile:

Este si lo coje voy a ver en la moto:

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)
const int salida2 = 2;
const int salida3 = 3;
const int salida4 = 4;
const int salida5 = 5;
const int salida6 = 6;
const int salida7 = 7;
const int salida8 = 8;

void setup() {
  Serial.begin(9600);
  pinMode(salida2, OUTPUT);        //marcha 1 es en pin 2
  pinMode(salida3, OUTPUT);      //marcha neutral  es en pin 3
  pinMode(salida4, OUTPUT);      //marcha 2 es en pin 4
  pinMode(salida5, OUTPUT);     //marcha 3 es en pin 5
  pinMode(salida6, OUTPUT);     //marcha 4 es en pin 6
  pinMode(salida7, OUTPUT);     //marcha 5 es en pin 7
  pinMode(salida8, 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);
 digitalWrite(salida2, LOW);

 digitalWrite(salida3, LOW);

 digitalWrite(salida4, HIGH);

 digitalWrite(salida5, LOW);

 digitalWrite(salida6, LOW);

 digitalWrite(salida7, LOW);
 
 digitalWrite(salida8, LOW);
}

// 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;
}

Nada. no funciona correctamente. Se queda neutro hasta la 4 marcha y a partir de la 4ª ya no indica nada.

Lo que he hecho, es la señal que viene del sensor de marchas y que va la entrada A0 cambiar a A1, A2, A3 etc y el resultado de funcionamiento es el mismo no varía en absoluto. A cualquier otra entrada y va igual de mal.

Pienso entonces que no es problema de salidas de señales, si no que es problema esta en la misma entrada. Porque aunque cambie la entrada va igual de mal? Tendría que no marcar nada de salidas , pienso.

Has comprobado que valores te imprime en la consola serial?

Te refieres a valores tomados en RX?

El icono de la lupa arriba a la derecha del IDE con la entrada A0 conectada, te debe salir en la ventana el valor que lee ya con el map seleccionando abajo a la derecha 9600.

A todo esto. Yo estoy alimentando el arduino a través de usb. Es correcto también? Lo comento por si yo lo doy por hecho y no es así.

Si lo alimentas con un conversor desde la moto no hay problema, si lo alimentas desde el PC tienes que juntar el GND de la placa con el negativo de la moto para poder leer las tensiones correctamente.

Lo estoy alimentando desde un usb de un enchufe de vivienda y no tengo el portatil nip uedo ver informacion.

Tampoco le he puesto la masa a GND.. voy a ello.

Pero yo estoy midiendo señales desde un principio sin conectar nada a masa moto ni a GND del arduino.

Ahora lo he alimentado desde un usb de la propia moto e igual. Marca neutral y de esa señal no pasa, si voy desconectando neutral salta a indicar en el cuadro primera, quito conector de primera y salta a indicar en el cuadro segunda así hasta sexta .

A su vez tengo el voltímetro conectado al cable de entrada y voy testeando las tensiones y si son correctas.

Krnlpanic. Cuando dices:
El icono de la lupa arriba a la derecha del IDE con la entrada A0 conectada, te debe salir en la ventana el valor que lee ya con el map seleccionando abajo a la derecha 9600.

Eso cómo lo ves? algun programa? lo tienes conectado al ordenador mientras pruebas?
Gracias.

He realizado muchos intentos, pero sigo en lo mismo..............

Lo ideal es ver conectado al PC los valores que te esta leyendo, si no tienes portátil quizá puedas poner un cable largo...

He conectado un portátil, pero la lupa no podía accionar me decía no target a null.

Luego he trasteado cambiando tensiones y todo lo que podía. El resultado no era más grave. Por mucho que varias casi siempre marca neutral.

Incluso he subido un código con únicamente salida 3, que es la que acciona el indicador de punto muerto y seguía prácticamente igual. Marcando punto muerto de 1 a 4. La marcha 5 y 6. No marca nada.

Saludos

Existe otra manera de interpretar la entrada? He probado incluso con un solo valor por entrada pero tampoco. Ejemplo entrada que he probado

 digitalWrite(salida3, LOW);

modificar la entrada de manera diferente a este codigo.

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)
const int salida2 = 2;
const int salida3 = 3;
const int salida4 = 4;
const int salida5 = 5;
const int salida6 = 6;
const int salida7 = 7;
const int salida8 = 8;

void setup() {
  Serial.begin(9600);
  pinMode(salida2, OUTPUT);        //marcha 1 es en pin 2
  pinMode(salida3, OUTPUT);      //marcha neutral  es en pin 3
  pinMode(salida4, OUTPUT);      //marcha 2 es en pin 4
  pinMode(salida5, OUTPUT);     //marcha 3 es en pin 5
  pinMode(salida6, OUTPUT);     //marcha 4 es en pin 6
  pinMode(salida7, OUTPUT);     //marcha 5 es en pin 7
  pinMode(salida8, 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);
  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);
}

// 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;
}