pwm

buenos dias soy nuevo en el foro y el mundo del arduino estoy trabajando en un codigo para mover dos motores dc con un joystick y ya me funciona bien pero resulta que los motores arrancan a su maxima velocidad y me gustaria variarla con pwm pero no se como integrarlo al codigo
alguien me puede ayudar gracias

//selecciono los pines con pwm
int Mizq1 = 11;
int Mizq2 = 10;

int Mder1 = 6;
int Mder2 = 5;
///////////////////////////////////////////////////////////

int led = 2;
int ValorX = 0;
int ValorY = 0;

void setup() {

  Serial.begin(9600);    // velocidad de comunicacion del puerto serial
  pinMode(Mizq1,OUTPUT); // motor izq1 como salida
  pinMode(Mizq2,OUTPUT); // motor izq2 como salida
  pinMode(Mder1,OUTPUT); // motor Mder1 como salida
  pinMode(Mder2,OUTPUT); // motor Mder2 como salida

  pinMode(led,OUTPUT);
  
}

void loop() {

  ValorX = analogRead(A0); //leer el valor del eje X
  ValorY = analogRead(A1); //leer el valor del eje Y
  int Boton  = analogRead(A2); //leer el valor del boton

  delay(250); //pausa de 250 milisegundos

  Serial.print("ValorX");
  Serial.println(ValorX); // imprimo el valor del eje X
  Serial.print("ValorY");
  Serial.println(ValorY); // imprimo el valor del eje Y


  if (( ValorX  > 470) && ( ValorX  < 510) &&( ValorY  > 470) && ( ValorY  < 510) ) { parar();}
  if ( ValorX  > 520){ adelante(); }
  if ( ValorX  < 460){ atras();  } 
  if ( ValorY > 520){ derecha(); }
  if ( ValorY < 460){ izquierda(); }
  
}

void parar(){
    digitalWrite(Mizq1,LOW); 
    digitalWrite(Mizq2,LOW); 
    digitalWrite(Mder1,LOW); 
    digitalWrite(Mder2,LOW);
  
}
void adelante(){

    digitalWrite(Mizq1,HIGH); 
    digitalWrite(Mizq2,LOW); 
    digitalWrite(Mder1,HIGH); 
    digitalWrite(Mder2,LOW);
}

void atras(){

    digitalWrite(Mizq1,LOW); 
    digitalWrite(Mizq2,HIGH); 
    digitalWrite(Mder1,LOW); 
    digitalWrite(Mder2,HIGH);
}

void izquierda(){
    digitalWrite(Mizq1,HIGH); 
    digitalWrite(Mizq2,LOW); 
    digitalWrite(Mder1,LOW); 
    digitalWrite(Mder2,LOW);
}

void derecha(){
  
    digitalWrite(Mizq1,LOW); 
    digitalWrite(Mizq2,LOW); 
    digitalWrite(Mder1,HIGH); 
    digitalWrite(Mder2,LOW); 
}

Primero que nada, te sugiero que calibres la “zona muerta” (posición que queda la palanca cuando ni se toca). Con el uso, eventualmente esta zona podría no estar en el rango 470-510.

Aquí te dejo un programa que calcula la zona muerta de tu joystick, para así determinar el rango más adecuado que diga cuando deternerse por completo (con unas cuantas modificaciones, se podría integrar a tu programa).

#define TIEMPO_CALIBRACION 5 // En segundos
#define EJE_X A0 // Pin del eje X
#define EJE_Y A1 // Pin del eje Y

unsigned int minX;
unsigned int maxX;
unsigned int minY;
unsigned int maxY;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Listo para calibrar.\r\nPor favor, conecta el joystick y no lo muevas hasta que el proceso termine."));
  Serial.println(F("\r\nEnvia cualquier cosa para continuar..."));
  while (!Serial.available()); // En efecto, espera hasta que al menos un byte llegue
  Serial.println(F("Calibrando...\r\n"));
  calibrarX();
  calibrarY();
  // Si mueves la palanca durante el proceso, el resutado arrojaría valores extremos (ej.: 0 - 1023). La zona muerta no debería ser amplia

  Serial.print(F("Zona muerta de X: "));
  Serial.println(String(minX) + " - " + String(maxX));
  Serial.print(F("Zona muerta de Y: "));
  Serial.println(String(minY) + " - " + String(maxY));
}

void loop() {
  // Nada, se ejecuta solo una vez

}

void calibrarX() {
  unsigned long fin = (TIEMPO_CALIBRACION * 1000) + millis();
  minX = maxX = analogRead(EJE_X);

  while (millis() < fin) { // Esto es lo que ocurre durante el tiempo de calibración
    unsigned int muestra = analogRead(EJE_X);
    minX = min(mixX, muestra);
    maxX = max(maxX, muestra);
  }
}

void calibrarY() {
  unsigned long fin = (TIEMPO_CALIBRACION * 1000) + millis();
  minY = maxY = analogRead(EJE_Y);

  while (millis() < fin) { // Esto es lo que ocurre durante el tiempo de calibración
    unsigned int muestra = analogRead(EJE_Y);
    minY = min(mixY, muestra);
    maxY = max(maxY, muestra);
  }
}

Volviendo al tema: hasta el momento esto se me ocurre:

#define ZONA_MUERTA_MIN 470
#define ZONE_MUERTA_MAX 510

//selecciono los pines con pwm
const byte Mizq1 = 11;
const byte Mizq2 = 10;

const byte Mder1 = 6;
const byte Mder2 = 5;
///////////////////////////////////////////////////////////

unsigned int ValorX = 0;
unsigned int ValorY = 0;

void setup() {

  Serial.begin(9600);    // velocidad de comunicacion del puerto serial
  pinMode(Mizq1, OUTPUT); // motor izq1 como salida
  pinMode(Mizq2, OUTPUT); // motor izq2 como salida
  pinMode(Mder1, OUTPUT); // motor Mder1 como salida
  pinMode(Mder2, OUTPUT); // motor Mder2 como salida

  pinMode(led, OUTPUT);

}

void loop() {

  ValorX = analogRead(A0); //leer el valor del eje X
  ValorY = analogRead(A1); //leer el valor del eje Y

  Serial.print(F("ValorX: "));
  Serial.println(ValorX); // imprimo el valor del eje X
  Serial.print(F("ValorY: "));
  Serial.println(ValorY); // imprimo el valor del eje Y

  boolean xMuerto = ( ValorX  >= ZONA_MUERTA_MIN) && ( ValorX  <= ZONA_MUERTA_MAX);
  boolean yMuerto = ( ValorY  >= ZONA_MUERTA_MIN) && ( ValorY  <= ZONA_MUERTA_MAX);

  if (xMuerto && yMuerto) { // Zona muerta
    parar();
    return;
  }

  if (!xMuerto && yMuerto) { // Cuando la palanca solo se desliza horizontalmente
    girar();
    return;
  }

  if (xMuerto && !yMuerto) { // Cuando la palanca solo se desliza verticalmente
    recto();
    return;
  }

  if (!xMuerto && !yMuerto) { // Cuando la palanca se desliza diagonalmente
    mover();
  }

}

void parar() {
  digitalWrite(Mizq1, LOW);
  digitalWrite(Mizq2, LOW);
  digitalWrite(Mder1, LOW);
  digitalWrite(Mder2, LOW);

}
void recto() {
  byte velocidad;
  if (ValorY > ZONA_MUERTA_MAX) { // Adelante
    velocidad = map(ValorY, ZONA_MUERTA_MAX + 1, 1023, 0, 255);
    digitalWrite(Mizq2, LOW);
    digitalWrite(Mder2, LOW);
    analogWrite(Mizq1, velocidad);
    analogWrite(Mder1, velocidad);
  } else { // Atrás
    velocidad = map(ZONA_MUERTA_MIN - ValorY, 0, ZONA_MUERTA_MIN - 1, 0, 255);
    digitalWrite(Mizq1, LOW);
    digitalWrite(Mder1, LOW);
    analogWrite(Mizq2, velocidad);
    analogWrite(Mder2, velocidad);
  }
}

void girar() { // Lo hace con las dos ruedas, así que podría girar demasiado rápido.
  byte velocidad;
  if (ValorX > ZONA_MUERTA_MAX) { // Derecha
    velocidad = map(ValorX, ZONA_MUERTA_MAX + 1, 1023, 0, 255);
    digitalWrite(Mizq2, LOW);
    digitalWrite(Mder1, LOW);
    analogWrite(Mizq1, velocidad);
    analogWrite(Mder2, velocidad);
  } else { // Izquierda
    velocidad = map(ZONA_MUERTA_MIN - ValorX, 0, ZONA_MUERTA_MIN - 1, 0, 255);
    digitalWrite(Mizq1, LOW);
    digitalWrite(Mder2, LOW);
    analogWrite(Mizq2, velocidad);
    analogWrite(Mder1, velocidad);
  }
}

void mover() {
  // Esta función es la más complicada de implementar; más adelante lo haré. O mejor aún: intenta hacerlo tu.
}

Como se puede apreciar, el código no está completo porque no es tan sencillo calcular la velocidad y dirección de ambos motores cuando se tiene la palanca en una posición diagonal (ambos ejes fuera de la zona muerta).
Con suficiente tiempo, eventualmente lo conseguiría; aunque si me echaras una mano en esta faena, lo solucionaríamos más pronto. No es trabajo solo para mí, tú también deberías colaborar, ¿o me equivoco?

Buenas noches. ..aunque la ayuda no era para mí. ...me has dado una buena idea para sacar un embrollo
Muchas gracias.

hola buenas tardes , gracias por la ayuda ,comentar en el foro y publicar ha sido un poco difícil para mi.
y ahora quiero pedir otra ayuda , tengo un codigo que voy a adjuntar y es para capturar coordenadas en el eje y y x por medio de un mouse y funciona muy bien , y ahora lo que quiero es almacenar las coordenadas que me envia el mouse y posteriormente hacer mover dos motores uno en y y otro en x puede ser motores paso a paso o dc normales , me prodrian guiar como seguir el codigo
gracias

el joystick tiene dos puntos muertos uno x y otro para y solo aplica la confdicion cuando este en un lado de punto muerto por ejemplo punto muerto= 500 min=0 max=1000 estos serian tus limites entonce aplica aqui el

if (val x >= 550)

digitalWrite (M1,HIHGH); direccion motor

pwm M1 = map(val, 550, 1000, 0, 255);

analogWrite(9, val);

esto aplicaria para los cuatro casos