Automatizar cambio moto

Hola, buenas noches a todos.
Me llamo Jose Maria y llevo un tiempo buscando la solución a un pequeño problema que tengo, y espero que vosotros con la experiencia y conocimiento que tenéis me podais ayudar.
Os explicaré brevemente, soy motero y debido a un problema médico grave en la pierna izquierda tengo limitaciones importantes para actuar en el cambio de la moto.
Tengo intención de buscarme la vida y fabricarme un cambio automático con arduino, he estado investigando las posibilidades y es la solución a mi problema, pero desconozco el funcionamiento y programación de la placa por lo que llevo algún tiempo empapandome de todo lo que encuentro, pero necesito centrarme en lo que necesito por que son infinitas las posibilidades de programación, por lo que necesito recomendaciones y o manuales y materiales para controlar servomotores de 180º y poder clarificar el proyecto.
cualquier tipo de ayuda será bien venida.
Muchas gracias.

¿Caja secuencial con embrague en la palanca de cambio? ¿Como el de Mechatron? ¿O embrague manual?

quick shifter
cambio automatico sin necesidad de embrague, ya lo trae la moto, solo necesito el desplazamiento de la palanca

Descarto que la tarea mecánica sabes hacerla, asi que nos concentraremos en el manejo del servo.
Si miras este tutorial Controlar un servo con Arduino no creo que te queden muchas dudas.
Solo se busca asi en Google: Arduino Servo
Luis Llamas es un punto de referencia, otro es Prometec.
Recuerda que los servos consumen corriente, y que Arduino solo puede manejar los mas pequeños, no uses la alimentación de Arduino para tu proyecto porque no es viable.
Ya lo conversaremos pero una fuente DC DC (alimentada por la batería de tu moto) es lo adecuado para darle potencia al servo.

¿Entonces todo se reduce a bajar y subir marchas? ¿Si estas en la mas baja y se acciona para bajar hay algún problema? Lo mismo para subir y esta en la la mas alta. De otro modo también hay que saber en que marcha esta.

Buenas noches
La parte mecánica y de instalación la tengo mas o menos clara, siempre sujeta a los ajustes de última hora.
La programación es lo que probablemente me de mas lata
Tanto ese tutorial como otros varios ya los tengo mirados y guardados para hacerme mi propio tutorial con diferentes fuentes, lo de la alimentación lo tengo claro tambien puesto que el servo que voy a utilizar funciona a 7V. por lo que si o si tiene que tener alimentación a través de un regulador directo a 12V
De Luis Llamas he visto algunas cosas y tutoriales, asi como de prometec y solectro pero no me importa seguir viendo cosas, estoy en modo esponja
y Piter, si, tan solo se reduce a subir y bajar marchas (lo bueno si breve dos veces bueno), no hay problema en que la palanca baje o suba en los extremos por que si no hay mas marchas no se pueden engranar, y para iniciar el sistema supongo que lo primero que tengo que programar en "void setup" es el movimiento de bajada un par de veces o tres y una sola subida para conseguir el punto muerto y programar el"void loop", no es habitual parar la moto en tercera o cuarta marcha, a partir de ahí un pulsador para subir y otro para bajar, en que marcha me encuentro ya me lo dice la moto pero si aplico esto a otra moto sería una ampliación de este proyecto, soy ambicioso y tengo muchas ideas en la cabeza pero necesito dar los primeros pasos para poder andar y luego correr
He encontrado un video y un programa que ha hecho un italiano pero como me falta rodaje no entiendo alguna parte, cuando aprenda a ponerlo en el foro os lo explico por que solo sería modificar pocas cosas.
Ya di bastante el tostón, sigo estudiando :wink:

#include <Servo.h>;
Servo SERVO;

int GRADSERVO =90;
int MINSERVO=70;
int MAXSERVO=110;
int SERVOPIN=3;
int PREV=10;
int NEXT=11;
void setup()

{

SERVO.attach(SERVOPIN);
SERVO.write(GRADSERVO);
pinMode(4,OUTPUT);

}
void loop()
{
PREV=digitalRead(11);
NEXT=digitalRead(10);
   if (PREV==HIGH){
  SERVO.write(MAXSERVO);
  digitalWrite(STAC,HIGH);
}
else if ((PREV==LOW) and (NEXT==LOW)) {
  SERVO.write(GRADSERVO);
  digitalWrite(STAC,LOW);
}
else if (NEXT==HIGH){
  SERVO.write(MINISERVO);  
  digitalWrite(STAC,HIGH);
}

este es el programa y el video es el siguiente

https://www.youtube.com/watch?v=2veyLfT4YOA

Si no lo he hecho bien lo lamento mucho intentaré corregirlo.
El autor tanto del video como del programa es Marco Formentini.
en el codigo y bajo mi escaso entendimiento creo que "STAC" es una variable, pero no encuentro donde está definida, ya me direis donde está el fallo.
Mañana por fin recibo todos los materiales para empezar a probar cosas.
ya si lo dejo de verdad por hoy, lo prometo :wink:

Bien, @gmpluk, vas bien.
Por donde empezar? En Documentación hay un primer hilo que se llama Indice de temas tutoriales.
Dentro hay varios apartados, y uno de ellos son libros. Seguramente lo has leído. te invito a que veas la parte introductoria de como se arma un programa en arduino.

Primero las librerías
Luego las variables y constantes globales.
sigue el setup
continua el loop
y sea antes del setup o despues del loop los procedimientos o funciones.
Se que ahora todo parece raro pero ya tendrá sentido. Por eso un libro ayuda a despejar dudas y acelarar la curva de aprendizaje.

Un primer consejo. No uses por mas que lo hayas copiado variables con letras mayúsculas. Se usa por convención minúsculas para variables y mayúsculas para constantes. A nosotros nos parece raro leer al revés y lo primero que haremos será cambiarlo.

#include <servo.h>;
Servo servo;

const byte servoPin  =  3;
const byte boton1Pin = 10;
const byte boton2Pin = 11;
const byte stac      =  4;
int grandServo       = 90;
int maxServo         =110;
int minServo         = 70;
int prev             = 10;
int next             = 11;


void setup() {
  servo.attach(servoPin);
  servo.write(grandServo);
  pinMode(4,OUTPUT);
}

void loop() {
  prev = digitalRead(boton2Pin);
  next = digitalRead(boton1Pin);
  if (prev == HIGH){
      servo.write(maxServo);
      digitalWrite(stac,HIGH);
  }
  else if ((prev == LOW) and (next == LOW)) {
          servo.write(grandServo);
          digitalWrite(stac,LOW);
  } else if (next==HIGH){
            servo.write(minServo);  
            digitalWrite(stac,HIGH);
  }
}

Mismo programa pero con algunas correcciones de mayúsculas, minúsculas y te faltaba stac que esta en el pin 4.
Es bueno tambien que los pines que se usen tengan una etiqueta y no usarlos con el número que le corresponde. Es mas facil para luego leer el programa.
No estaban tampoco configurados como entradas los pines correspondientes a los botones next y prev que yo llamé boton1Pin y boton2Pin no necesariamente con este orden.

Muchas gracias @Surbyte.
Por el momento estoy leyendo todo lo que cae en mis manos para tratar de dilucidar lo mas básico y sencillo e ir seleccionando material básico, claro e inteligible por que parto de cero y ya peino canas, quieras o no me cuesta un poco ya que encuentro diferentes tutoriales que a priori son básicos pero ya dan por sentados o conocidos algunos aspectos tan simples pero a la vez tan importantes como el tema de las mayúsculas o minúsculas por lo que te agradezco la corrección y con ello en mente seguiré absorviendo datos.
Muchas gracias.
Ya me llegó el kit básico así que empezaré a poner en práctica lo que vaya aprendiendo.
:sweat_smile: :sweat_smile: :sweat_smile:
y claro, os mantendré informados :wink:

Intenta poner en marcha ese sketch con tu hardware a ver que tan bien o mal se comporta.

Buenas tardes a todos.
despues de muchas horas de lectura y visionado de tutoriales para principiantes he llegado a la conclusión de que no todos los tutoriales son lo que dicen, algunos dan por sentado que la persona que lo está leyendo ya tiene algunos conocimientos del tema, o asumen que ciertos pasos son conocidos y por tanto se omiten, otros con ejemplos que te dan un esquema de conexión con algun pin cambiado y te vuelves loco con el programa cuando el problema está en otro sitio, los hay que te dan el programa ya escrito y es solo probar que funciona y aprendes a enchufar leds..., tras esta situación traté de centrarme en un solo tutorial y centrarme o adaptarme solo a este, pero resulta que cuando termino este y empiezo otro, la forma de definir las variables no es la recomendada (#define) que se recomienda (int) :joy:
Total que espero no haberme liado mucho, lo que si tengo claro es que tengo que ir despacio, por lo que de momento el programa va a ser muy básico y que funcione y poco a poco ir mejorando algunas cosas, me olvido del programa que envié al principio y me dedico a lo mas básico

escribe o pega el 
#include <Servo.h>
int EJEY = A0; // conexion pin analogico para servo
int MOVIMIENTO;
Servo servo1;  
void setup()
{
  servo1.attach(7);   
}
void loop() { 
  MOVIMIENTO = analogRead(EJEY);          
  MOVIMIENTO = map(MOVIMIENTO, 0, 1023, 0, 120); //lIMITA MOVIMIENTO A 120º      
  servo1.write(MOVIMIENTO);                   
  delay(10);                           
}código aquí

Un joystick, un servo y una placa para funcionar
esto es lo que tengo de momento y funciona.
Ahora quiero aumentar el campo muerto del centro del eje del joystic por que al utilizar servos incluso sin tocarlo puede inducir al movimiento y no te digo nada con las vibraciones que tendrá.
Para ello he estado viendo la lección 17 de arduino desde cero

https://www.youtube.com/watch?v=okvUaG2BRBo
donde expllica como hacer esto, intentaré incorporarlo pero de momento no me ha funcionado, que estoy pasando por alto?


#include <Servo.h>
int EJEY = A0; // conexion pin analogico para servo
int MOVIMIENTO = 7;
Servo servo1;  
void setup()
{
  servo1.attach(7);   
}
void loop() { 

  MOVIMIENTO = analogRead(A0);  
   if (EJEY >= 0 && EJEY < 50){         // si Y esta en la zona de abajo
    analogWrite(MOVIMIENTO, map(EJEY, 0, 480, 255, 0));
  } 
  else 
  {
    analogWrite(MOVIMIENTO, 0);          // Y en zona de reposo
  }
   if (EJEY > 980 && EJEY <= 1023)// si Y esta en la zona de arriba
  {          
     analogWrite(MOVIMIENTO, map(EJEY, 520, 1023, 0, 255));
  }
  else
  {
     analogWrite(MOVIMIENTO, 0);          // Y en zona de reposo   
  }        
  /*MOVIMIENTO = map(MOVIMIENTO, 0, 1023, 0, 120); //lIMITA MOVIMIENTO A 120º      
  servo1.write(MOVIMIENTO);                   
  delay(10);    */
                         
}

voy a descansar un rato
:sweat_smile:

Para comenzar un joystick tiene dos movimientos (lo dice el tutorial) en X e Y
Pusiste uno solo al elegir A0. Te falta el otro. Ahora lo necesitas? No lo se.

Eso es lo que quieres hacer y que en el punto muerto no haga nada

Tu error es que MOVIMIENTO es el Pin y debe ser algo que lee el valor analogico del joystick
llamemoslo valor

   ejeY= analogRead(A0);  
   if (ejeY>= 0 && ejeY< 50){         // si Y esta en la zona de abajo
    analogWrite(MOVIMIENTO, map(ejeY, 0, 480, 255, 0));
  } 
  else 
  {
    analogWrite(MOVIMIENTO, 0);          // Y en zona de reposo
  }

Asi es correcto el primer caso.
Corrige el 2do.

Muchas gracias @Surbyte
Empeñado en leer lo que no podía.
De momento quiero ajustar el servo con un recorrido concreto en el eje Y, cuando lo tenga listo empezaré con el eje X pero con un recorrido distinto, que supongo que sería practicamente copiar y pegar pero modificando los valores y añadiendo algunos pines.
Ya lo he corregido pero no entiendo lo que quieres decir con el segundo por que la lectura del A0 solo es necesario hacerlo una vez si no me equivoco.
:confused: :confused: :confused:

Si, claro, hablaba del movimiento en el otro eje.

:+1:

Buenos días de nuevo.
después de varias pruebas ayer, el servo dejó de funcionar :woozy_face: :woozy_face: :woozy_face: vamos que me lo he cargado y como hasta el lunes no me llega otro pallet de ellos, me he puesto a sacar el esquema o la protoboard o como se llame en Fritzing, he sacado el dibujo y he añadido el programa y me encuentro con un detalle en el que no había caido
Captura esquema joystic

#include <Servo.h>
int ejeY = A0; // conexion pin analogico para servo
int MOVIMIENTO = 6;
Servo servo1;  
void setup()
{
  
	servo1.attach(7); 
 
}


Resulta que tengo declarado el pin 6 y no lo estoy utilizando, tengo conectado el servo en el pin 7 y deberia haber declarado "int MOVIMIENTO = 7;" en lugar de 6
(a lo mejor es por eso por lo que no funciona el servo, tendré que volver a montarlo :roll_eyes: )
supongo que esa era una de las correcciones que debí haber solucionado antes

:sweat_smile: :sweat_smile: :sweat_smile:

He revisado y corregido tu código para que evites estos problemas.
Lo corregí y luego comprendo que estas usando mal el servo.
No se usa analogWrite(MOVIMIENTO) para moverlo.
hay comandos como

  servo1.write(0); // Desplazamos a la posición 0º

Asi que ese debe ser la herramienta para que muevas el servo no analogWrite()
Modifica tu código

Y ademas no tienes que moverlo de 0 a 255 porque hablamos de grados.
Segun el servo sera de 0 a 180

Mira esto

Por obvias razones no puse el código pero lo que estabas usando debia lucir asi aunque esta mal por lo que ya expliqué.

#include <Servo.h>
const byte EJEY       = A0; // conexion pin analogico para servo
const byte MOVIMIENTO = 7;
Servo servo1;  
unsigned int valor;

void setup(){
  servo1.attach(MOVIMIENTO);   
}

void loop() { 

  valor = analogRead(EJEY);  
  if (valor>= 0 && valor< 50) {            // si Y esta en la zona de abajo
      //analogWrite(MOVIMIENTO, map(ejeY, 0, 480, 255, 0)); // <== esto no se usa para mover el 
      servor1.write(180);                                   // corrige el angulo
servo
  } 
  else  {
      //analogWrite(MOVIMIENTO, 0);          // <== esto no se usa para mover el servo
       servor1.write(0);                                   // esto si
  }

  if (valor > 980 && valor <= 1023) {     // si Y esta en la zona de arriba
      // analogWrite(MOVIMIENTO, map(EJEY, 520, 1023, 0, 255));
      servor1.write(180); 
  }
  else  {
      // analogWrite(MOVIMIENTO, 0);          // Y en zona de reposo   
      servor1.write(0); 
  }   
                           
}     
  /*MOVIMIENTO = map(MOVIMIENTO, 0, 1023, 0, 120); //lIMITA MOVIMIENTO A 120º      
  servo1.write(120);                   
  delay(10);    */

Buenas tardes de nuevo.
Después de repasar ,revisar, cambiar y ampliar el código, ha quedado de la siguiente forma

#include <Servo.h>

const byte EJEY = A0;       
const byte EJEX = A1;       
Servo servo1;
unsigned int valory;
unsigned int valorx;
void setup()
{
  servo1.attach(7);
}
void loop()
{
  valory= analogRead(EJEY);
  valorx= analogRead(EJEX);
 
}
if (EJEY >= 0 && EJEY < 10); //si posicion de joystic menor de 20
{
  servo1.write(-30);//mueve el servo a -30º
}
else     {
  servo1.write(0);
}
if (EJEY > 1000 && EJEY < 1023); //si posición de joystic mayor de 1000
{
  servo1.write(30);//mueve el servo a 30º
}
else     {
  servo1.write(0);
}
if (EJEX >= 0 && EJEX < 20); //si posicion de joystic menos de 20
{
  servo1.write(-20); //nueve el servo a -20º
}
else     {
  servo1.write(0);
}
if (EJEX > 950 && EJEX < 1023); //si posición de joystic mayor de 950
{
  servo1.write(20);//mueve el servo a 20º
}
else     {
  servo1.write(0);

}

pero a la hora de verificar el programa me salta un error "expected unqualified-id before 'if' " en el último " if " pero no se donde puede estar el error, con este código pretendo mover el servo diferentes grados con los diferentes ejes del joystic pero mientras no encuentre el error no puedo avanzar, me podeis decir donde está el fallo?
Muchas gracias

Está mal, sobra, no va (o como prefieras decirlo) la llave justo arriba del primer if() del loop() porque justamente hace que se cierre ahí y las comparaciones quedan "huérfanas".
Esa llave va después del último else, abajo de todo, digamos.
En resumen, elimina la que te indiqué y agrega una igual debajo de todo.

Saludos