Gestionar pin analógico de Arduino 0 con varios potenciómetros

Hola y gracias ante todo!

El caso es que estoy haciendo un joystick con un Arduino leonardo, y uno de los ejes quería controlarlo con 2 potenciometros( que uno de ellos me diese parte del recorrido y el otro el resto).hasta aquí todo bien, no he tenido problema en hacerlo.la pega se presenta por qué tengo que añadir un tercer potenciómetro para ajustar el punto( final del primer potenciometro-inicio del segundo).no se si me explico bien, la idea es poder mover con un potenciómetro un eje desde 0 hasta un punto determinado (X),con un 2° potenciómetro mover desde X hasta el final, y con un tercer potenciómetro ajustar el valor de X.

Alguna idea?
 
Hola, se me ocurre la siguiente idea, pero vas a necesitar dos entradas analógicas como mínimo:
Conectando los potenciómetros de la siguiente forma, pero también así vas a tener una restricción en el ajuste de X, dependiendo del valor del potenciómetro, lo he probado con los valores Pot1 = Pot2 = 5 K y AjusteX = 10 K, de esta forma tengo un rango de ajuste de X entre 500 y 1023 (ya sabes que las entradas analógicas de Arduino pueden tomar valores entre 0 y 1023 que coresponden a 0V y 5V). Con un ajuste por ejemplo de X = 600 el potenciómetro 2 al hacerlo variar obtenemos valores entre 0 y 600 y el potenciómetro 1 entre 600 y 1023, que creo que es lo que buscabas.
Untitled Sketch 2_esquemático.png
Te dejo el código que he usado para probarlo:
Código:
int pot1 = A0, pot2 = A1;

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

void loop() {
  Serial.print("Potenciometro1 = ");Serial.print(analogRead(pot1));
  Serial.print(" ---- ");
  Serial.print("Potenciometro2 = ");Serial.println(analogRead(pot2));
  delay(500);
}

A pesar de la restricción de ajuste de X, si pones un potenciómetro más alto, por ejemplo 100K o más, obtendrás un rango de ajuste un poco mayor (aunque siempre vas a tener restricción).

Espero haberte ayudado algo, un saludo.
Mensaje automáticamente combinado:

Hola de nuevo :)

Acabo de comprobar otro ciruito que elimina la restricción de X de la que hablaba en el anterior mensaje:
Untitled Sketch_esquemático.png
Tenía mis dudas por si este circuito provocaba algún corto en la alimentación, pero no es así, se puede usar de forma segura y esta vez puedes seleccionar cualquier valor entre 0 y 1023 con el potenciómetro de selección del punto X.
Una anotación, considera que los potenciómetros suelen consumir mucha corriente, por lo que hay que tener cuidado, intenta seleccionar valores altos, así reducirás el consumo (del orden de los kiloOhmios).
Un saludo.
 
Última edición:
Por el planteamiento de la pregunta parece que lo quiere todo en un solo pin, pero yo ni entiendo la pregunta ni entiendo para que lo quiere.
Creo que debería de clarificar la cuestión.
 
Gracias Josen !
Eso es lo que buscaba,voy a probarlo y te comento!

La idea de mandarlo a un pin venía dada por el desarrollo de las pruebas, pero no es determinante.creo que me vale como me lo has planteado
Mensaje automáticamente combinado:

Por el planteamiento de la pregunta parece que lo quiere todo en un solo pin, pero yo ni entiendo la pregunta ni entiendo para que lo quiere.
Creo que debería de clarificar la cuestión.
La idea es hacer un embrague para un simulador colocado en 2 levas en el volante.la leva izquierda suelta el embrague hasta alcanzar el punto de fricción(debe ser ajustable según el coche que se conduzca,para eso es el 3er potenciómetro, no todos los coches tienen el embrague igual) y la leva derecha termina de soltar el embrague)
Mensaje automáticamente combinado:

He probado el código y efectivamente funciona...el problema es que tiene que controlar 1 eje , por lo que Cómo dice scooter,debe ir a un solo pin.

Gracias por el intento!
 
Última edición:
Con un potenciómetro logarítmico , o anti-logarítmico , o uno lineal con una resistencia en paralelo entre medio y un extremo podés afinar la precisión en un extremo y quizás no necesites tantos potenciómetros.
 
te explico:
este es el código con el que funciona, es un volante con pedalera para simracing. la intención es poder controlar el embrague con 2 potenciometros colocados en el volante , en lugar de usar 1 colocado en un pedal.
por lo que puedo ver con mis escasos conocimientos, asigna el embrague a un pin analogico (#define CLUTCH_PIN A2) y la lectura de ese pin la asigna a el eje del joystick a controlar.
Adjunto el codigo:


#include "Joystick.h"

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
32, 0,
false, false, false, true, true, true,
false, false, false, true, false);

// Pro Micro pin definitions

#define DATA_IN_PIN 2
#define CLOCK_PIN 3
#define MODE_PIN 4
#define LED_PIN 5
#define X_AXIS_PIN A8
#define Y_AXIS_PIN A9
#define THROTTLE_PIN A0
#define BRAKE_PIN A1
#define CLUTCH_PIN A2

// H-shifter mode analog axis thresholds
#define HS_XAXIS_12 410 //Gears 1,2 Modificar valor si en alguna ocasion marca que esta engranda 3 o 4 marcha al estar engradada 1 o 2 Valor eje X
#define HS_XAXIS_56 650 //Gears 5,6,R Modificar valor si en alguna ocasion marca que esta engranda 3 o 4 marcha al estar engranada 5 o 6 Valor eje X
#define HS_YAXIS_135 800 //Gears 1,3,5
#define HS_YAXIS_246 300 //Gears 2,4,6,R




// Digital inputs definitions
#define DI_REVERSE 1
/*
#define DI_RED_CENTERRIGHT 4
#define DI_RED_CENTERLEFT 5
#define DI_RED_RIGHT 6
#define DI_RED_LEFT 7
#define DI_BLACK_TOP 8
#define DI_BLACK_RIGHT 9
#define DI_BLACK_LEFT 10
#define DI_BLACK_BOTTOM 11
#define DI_DPAD_RIGHT 12
#define DI_DPAD_LEFT 13
#define DI_DPAD_BOTTOM 14
#define DI_DPAD_TOP 15

*/
int b[16];
int x;
//int y; // Y axis
int throttle; // Throttle pedal
int brake; // Brake pedal
int clutch; // Clutch pedal
int gear=0;
bool DebugShifter = false;
bool DebugPedals = false;
// Called at startup
// Must initialize hardware and software modules
void setup()
{


// shifter analog inputs configuration
pinMode(X_AXIS_PIN, INPUT_PULLUP); // X axis
pinMode(Y_AXIS_PIN, INPUT_PULLUP); // Y axis
pinMode(THROTTLE_PIN, INPUT); // Throttle pedal
pinMode(BRAKE_PIN, INPUT); // Brake pedal
pinMode(CLUTCH_PIN, INPUT); // Clutch pedal

// shift register interface configuration
pinMode(DATA_IN_PIN, INPUT); // Data in
pinMode(MODE_PIN, OUTPUT); // Parallel/serial mode
pinMode(CLOCK_PIN, OUTPUT); // Clock
pinMode(LED_PIN, OUTPUT); // Led Palanca de cambios


// Virtual joystick configuration


Joystick.setRzAxisRange(0, 1023);
Joystick.setRxAxisRange(0, 1023);
Joystick.setRyAxisRange(0, 1023);


// Virtual serial interface configuration
Serial.begin(250000);

if(analogRead(CLUTCH_PIN)<900) DebugShifter = true;
if(analogRead(THROTTLE_PIN)<900) DebugPedals = true;

Joystick.setRzAxis(0);
Joystick.setRxAxis(0);
Joystick.setRyAxis(0);


// Digital outputs initialization

digitalWrite(MODE_PIN, HIGH);
digitalWrite(CLOCK_PIN, HIGH);
digitalWrite(LED_PIN, LOW); //Enciendo el led de la palanca de cambios
}

// Called in a loop after initialization
void loop()
{
// Reading of button states from G25 shift register


digitalWrite(MODE_PIN, LOW); // Parallel mode: inputs are read into shift register
digitalWrite(MODE_PIN, HIGH); // Serial mode: data bits are output on clock falling edge

for(int i=0; i<16; i++) // Iteration over both 8 bit registers
{
digitalWrite(CLOCK_PIN, LOW); // Generate clock falling edge
b=digitalRead(DATA_IN_PIN); // Read data bit and store it into bit array
digitalWrite(CLOCK_PIN, HIGH); // Generate clock rising edge
}

// Reading of shifter position
x=analogRead(X_AXIS_PIN); // X axis
y=analogRead(Y_AXIS_PIN); // Y axis
throttle = 1023 - analogRead(THROTTLE_PIN); // Throttle pedal
brake = 1023 - analogRead(BRAKE_PIN); // Brake pedal
clutch = 1023 - analogRead(CLUTCH_PIN); // Clutch pedal

// Pedals
Joystick.setRzAxis(throttle);
Joystick.setRyAxis(brake);
Joystick.setRxAxis(clutch);



// Current gear calculation
gear=0; // Default value is neutral


if(x<HS_XAXIS_12) // Shifter on the left?
{
if(y>HS_YAXIS_135) gear=1; // 1st gear
if(y<HS_YAXIS_246) gear=2; // 2nd gear
}
else if(x>HS_XAXIS_56) // Shifter on the right?
{
if(y>HS_YAXIS_135) gear=5; // 5th gear
if(y<HS_YAXIS_246) gear=6; // 6th gear
}
else // Shifter is in the middle
{
if(y>HS_YAXIS_135) gear=3; // 3rd gear
if(y<HS_YAXIS_246) gear=4; // 4th gear
}
if(y&&x>1010) gear=0; // No esta conectado el cambio por lo que la marcha es neutro



if(gear!=6) b[DI_REVERSE]=0; // Reverse gear is allowed only on 6th gear position
if(b[DI_REVERSE]==1) gear=0; // 6th gear is deactivated if reverse gear is engaged

// Release virtual buttons for all gears
Joystick.setButton(0, LOW);
Joystick.setButton(1, LOW);
Joystick.setButton(2, LOW);
Joystick.setButton(3, LOW);
Joystick.setButton(4, LOW);
Joystick.setButton(5, LOW);
Joystick.setButton(6, b[DI_REVERSE]);

// Depress virtual button for current gear
if(gear>0) Joystick.setButton(gear-1, HIGH);

// Set state of virtual buttons for all the physical buttons (including reverse)
for(int i=0; i<12; i++) Joystick.setButton(7+i, b[i+4]);

// Write new virtual joystick state
Joystick.sendState();

if (DebugShifter == true)MostrarValoresShifter();
if (DebugPedals == true)MostrarValoresPedales();

}

void MostrarValoresShifter()
{
Serial.print(" X axis: ");
Serial.print(x);
Serial.print(" Y axis: ");
Serial.print(y);
Serial.print(" Gear: ");
Serial.println(gear);
}

void MostrarValoresPedales()
{
Serial.print(" Acelerador: ");
Serial.print(throttle);
Serial.print(" Freno: ");
Serial.print(brake);
Serial.print(" Embrague: ");
Serial.println(clutch);

}

Mensaje automáticamente combinado:

la idea de los 3 potenciometros es por que quiero simulkar el embrague de un F1.

este funciona "por partes"...cuando se aprietan las 2 levas (los 2 potenciometros) el embrague queda pisado a tope.

cuando el coche esta en la salida , el piloto mete 1a y suelta la leva izquierda, y el embrague se suelta hasta el punto de friccion(el coche aun no se mueve , pero ya esta friccionando el embrague.

cuando el semaforo se pone verde, el piloto suelta la segunda leva , acabando de soltar el embrague , pero a partir de ese punto de friccion, optimizando la salida.

Como esto es para un simulador, y cada coche tiene un embrague que encuentra el punto de friccion a una altura u otra, necesito un tercer potenciometro para ajustar ese punto medio entre las 2 levas.

si , ya se que es una frikada , pero es un reto personal
;p
 
Última edición:
Una pregunta, ¿el punto de fricción está a fijado a 900 o no hay punto de fricción determinado en este código?
if(analogRead(CLUTCH_PIN)<900) DebugShifter = true;
Mensaje automáticamente combinado:

Aquí el cambio de marcha lo hace directamente cuando se mueve la palanca, y no añade la condición de que esté pisado el embrague o no:
if(x<HS_XAXIS_12) // Shifter on the left?
{
if(y>HS_YAXIS_135) gear=1; // 1st gear
if(y<HS_YAXIS_246) gear=2; // 2nd gear
}
else if(x>HS_XAXIS_56) // Shifter on the right?
{
if(y>HS_YAXIS_135) gear=5; // 5th gear
if(y<HS_YAXIS_246) gear=6; // 6th gear
}
else // Shifter is in the middle
{
if(y>HS_YAXIS_135) gear=3; // 3rd gear
if(y<HS_YAXIS_246) gear=4; // 4th gear
}
if(y&&x>1010) gear=0; // No esta conectado el cambio por lo que la marcha es neutro
 
Última edición:
Hola Josen!

El punto de fricción no está definido en el código, puesto que es específico del coche que vayas a conducir.
Así mismo, La condición de embrague pisado para meter marcha viene dada por el simulador, no por el arduino.
 
Hola, según yo veo en el código es que cuando el embrague está por debajo de 900 (en el rango 0-1023) la variable DebugShifter se hace verdadera, y esto provoca que se envíe por el puerto serie los valores de la palanca de cambios, por esto interpreto yo que el punto de fricción viene determinado en 900, y que va de 1023 a 0, o sea en el rango de 1023 a 900 no está embragado, y en el rango de 900 a 0 ya ha superado el punto de fricción.

Se me ocurre una forma de modificar el código para que sirva, sólo necesito que me confirmes esto que he dicho, y ¿El simulador se comunica con arduino mediante el puerto serie?.

if (DebugShifter == true)MostrarValoresShifter();
if (DebugPedals == true)MostrarValoresPedales();

}

void MostrarValoresShifter()
{
Serial.print(" X axis: ");
Serial.print(x);
Serial.print(" Y axis: ");
Serial.print(y);
Serial.print(" Gear: ");
Serial.println(gear);
}
 
Hola Josen!
Antes de nada , agradecerte el interés que estás poniendo en el tema.
te explico :
Basandome en esta info (gamelaster/ArduinoGamepad ) y buscando en foros relacionados con el simracing encontre el codigo con el que estoy trabajando,que opte por usar por la cantidad de ejes/botones que tiene asignados, pero realmente no es determinante, puesto que aqui no voy a utilizar tantos ejes.quiero decir que el codigo referido en el enlace que posteo aqui, seria igual de valido.por lo poco que entiendo, aprovechando el chipa32u4 esta libreria "convierte" el arduino en un dispositivo de interfaz Humana (HID) , o sea , un gamepad USB.y el simulador es un juego en un PC, en el cual se asignan y calibran los controles.

a partir de aqui, entiendo que en este codigo hace como dices tu, aunque me desconcierta, puesto que no todos los coches / juegos utilizan embrague.veo que utiliza esta variable para activar el cambio de marchas desde ese punto (900) por algun motivo que desconozco, pero dado que la parte de las marchas no la voy a utilizar-solo me interesan el embrague(o cualquier eje analogico) y los botones-podria servir creo yo.
 
hola otra vez...
sigo dandole vueltas, lo mas que me acerco es el esquema de Josen , me da la lectura de los 2 potenciometros , pero por 2 pines distintos.lo ideal seria guardar en una variable X el valor de Pot1 o pot2 en funcion de si este valor se encuentra por encima o por debajo del umbral establecido por pot3, pero esto ya se me escapa...no tengo ni idea de como definir ese "umbral"...a partir de ahi es sencillo , en vez de asignar al eje del joystick la lectura del pin A0 o A1 , leeria la variable X


seguire investigando...
 
Hola, no he podido dedicarle mucho tiempo a mirar el programa estos días, pero he observado que el punto de fricción se determina en la funcion "setup" que sólo se ejecuta una vez, por tanto queda definido siempre igual al inicio del programa, habría que sacarlo en el bucle "void loop" para poder cambiarlo en cualquier momento, esto es algo que me tiene confundido acerca de cómo funciona el código.
Y por eso no sé muy bien de qué forma modificarlo, de todas formas seguiré investigando a ver que se puede hacer.
Un saludo
 
Atrás
Arriba