Problem PWM moteur

Bonjours
Mon projet et de faire un drone téléguider.
J’ai donc fait mon programme pour me déplacer qui marche bien mais les profs mon demander de faire une variation de vitesse mais je n’arrive pas modifier mon programme pour l’intégrer.
Je connais le fonctionnement du PWM mais après plusieur test je ne trouve pas de solution.

const byte PIN_VITESSE_MOTEUR_A = 3;
const byte PIN_SENS_MOTEUR_A = 12;
const byte PIN_FREIN_MOTEUR_A = 9;
const byte PIN_VITESSE_MOTEUR_B = 11;
const byte PIN_SENS_MOTEUR_B = 13;
const byte PIN_FREIN_MOTEUR_B = 8;
int TEST;

const byte PIN_JOYSTICK_X = A2;
const byte PIN_JOYSTICK_Y = A3;
const byte PIN_JOYSTICK_Z = A4; // Bouton, pas potentiomètre /!\

// Variables “axe1Joystick” et “axe2Joystick”: pas besoin d’avoir des variables globales

void setup() {

Serial.begin(115200);

pinMode(PIN_VITESSE_MOTEUR_A, OUTPUT);
digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);

pinMode(PIN_VITESSE_MOTEUR_B, OUTPUT);
digitalWrite(PIN_VITESSE_MOTEUR_B, LOW);

pinMode(PIN_SENS_MOTEUR_A, OUTPUT);
digitalWrite(PIN_SENS_MOTEUR_A, LOW);

pinMode(PIN_SENS_MOTEUR_B, OUTPUT);
digitalWrite(PIN_SENS_MOTEUR_B, LOW);

pinMode(PIN_FREIN_MOTEUR_A, OUTPUT);
digitalWrite(PIN_FREIN_MOTEUR_A, LOW);

pinMode(PIN_FREIN_MOTEUR_B, OUTPUT);
digitalWrite(PIN_FREIN_MOTEUR_B, LOW);

pinMode(PIN_JOYSTICK_Z, INPUT_PULLUP); // L’activation de la résistance de tirage est obligatoire pour le bouton poussoir en Z sinon les valeurs lues seront aléatoires.

}

void loop() {

int joystickX = analogRead(PIN_JOYSTICK_X);
int joystickY = analogRead(PIN_JOYSTICK_Y);

byte joystickZ = digitalRead(PIN_JOYSTICK_Z);

if (joystickZ == LOW) {

// Si le bouton Z est actif les moteurs sont éteints
digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
digitalWrite(PIN_VITESSE_MOTEUR_B, LOW);

}
else { // Sinon, si le bouton Z n’est pas actif

if (joystickX > 700) { //AVANCE

// Si la valeur X est strictement supérieur à 700 le moteur A avance
digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B, HIGH);
digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A, LOW);

TEST = 1;
}
else if (joystickX < 300) { //RECULER

// Sinon si la valeur X est strictement inférieur à 300 le moteur A recule
digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B, LOW);
digitalWrite(PIN_VITESSE_MOTEUR_A,HIGH);
digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
TEST = 1;
}
else {

// Sinon si la valeur X est comprise entre 300 et 700 (bornes inclusent) le moteur A ne bouge pas
digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
digitalWrite(PIN_VITESSE_MOTEUR_B, LOW);
}

if (joystickY > 700) { // fait tourner le drone

// Si la valeur Y est strictement supérieur à 700 le moteur B avance
digitalWrite(PIN_VITESSE_MOTEUR_B,HIGH);
digitalWrite(PIN_SENS_MOTEUR_B, HIGH);
digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
TEST = 0;
}
else if (joystickY < 300) {

// Sinon si la valeur Y est strictement inférieur à 300 le moteur B recule
digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B, LOW);
digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A, LOW);
TEST = 0;
}
else {
if( TEST == 0 ){

// Sinon si la valeur Y est comprise entre 300 et 700 (bornes inclusent) le moteur B ne bouge pas
digitalWrite(PIN_VITESSE_MOTEUR_B,LOW);
}
}
}
}

Merci de vos future réponses

Bonjour,

Pour ne pas faire de la commande tout ou rien, il faut écrire un truc du style:

analogWrite(PIN_VITESSE_MOTEUR_A, entier_compris_entre_0_et_255);

Ce qui implique que PIN_VITESSE_MOTEUR_A soit une sortie PWM

ah d'accord merci

Alors voila j’ai fait des modifications mais la variation ne marche pas et mon moteur A ce stop quand je suis en bout de course du joystick
const byte PIN_VITESSE_MOTEUR_A = 3;
const byte PIN_SENS_MOTEUR_A = 12;
const byte PIN_FREIN_MOTEUR_A = 9;
const byte PIN_VITESSE_MOTEUR_B = 11;
const byte PIN_SENS_MOTEUR_B = 13;
const byte PIN_FREIN_MOTEUR_B = 8;
int TEST;

const byte PIN_JOYSTICK_X = A2;
const byte PIN_JOYSTICK_Y = A3;
const byte PIN_JOYSTICK_Z = A4; // Bouton, pas potentiomètre /!\

// Variables “axe1Joystick” et “axe2Joystick”: pas besoin d’avoir des variables globales

void setup() {

Serial.begin(115200);

pinMode(PIN_VITESSE_MOTEUR_A, OUTPUT);
analogWrite(PIN_VITESSE_MOTEUR_A, 512);

pinMode(PIN_VITESSE_MOTEUR_B, OUTPUT);
analogWrite(PIN_VITESSE_MOTEUR_B, 512);

pinMode(PIN_SENS_MOTEUR_A, OUTPUT);
digitalWrite(PIN_SENS_MOTEUR_A, LOW);

pinMode(PIN_SENS_MOTEUR_B, OUTPUT);
digitalWrite(PIN_SENS_MOTEUR_B, LOW);

pinMode(PIN_FREIN_MOTEUR_A, OUTPUT);
digitalWrite(PIN_FREIN_MOTEUR_A, LOW);

pinMode(PIN_FREIN_MOTEUR_B, OUTPUT);
digitalWrite(PIN_FREIN_MOTEUR_B, LOW);

pinMode(PIN_JOYSTICK_Z, INPUT_PULLUP); // L’activation de la résistance de tirage est obligatoire pour le bouton poussoir en Z sinon les valeurs lues seront aléatoires.

}

void loop() {

int joystickX = analogRead(PIN_JOYSTICK_X);
int joystickY = analogRead(PIN_JOYSTICK_Y);

int VitesseA = joystickX / 3;
int VitesseB = joystickY / 3;

byte joystickZ = digitalRead(PIN_JOYSTICK_Z);

if (joystickZ == LOW) {

// Si le bouton Z est actif les moteurs sont éteints
digitalWrite(PIN_VITESSE_MOTEUR_A, 512);
digitalWrite(PIN_VITESSE_MOTEUR_B, 512);

}
else { // Sinon, si le bouton Z n’est pas actif

if (joystickX > 700) { //AVANCE

// Si la valeur X est strictement supérieur à 700 le moteur A avance
analogWrite(PIN_VITESSE_MOTEUR_B, VitesseB);
digitalWrite(PIN_SENS_MOTEUR_B, HIGH);
analogWrite(PIN_VITESSE_MOTEUR_A, VitesseA);
digitalWrite(PIN_SENS_MOTEUR_A, LOW);

TEST = 1;
}
else if (joystickX < 300) { //RECULER

// Sinon si la valeur X est strictement inférieur à 300 le moteur A recule
analogWrite(PIN_VITESSE_MOTEUR_B, VitesseB);
digitalWrite(PIN_SENS_MOTEUR_B, LOW);
analogWrite(PIN_VITESSE_MOTEUR_A, VitesseA);
digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
TEST = 1;
}
else {

// Sinon si la valeur X est comprise entre 300 et 700 (bornes inclusent) le moteur A ne bouge pas
digitalWrite(PIN_VITESSE_MOTEUR_A, 512);
digitalWrite(PIN_VITESSE_MOTEUR_B, 512);
}

if (joystickY > 700) { // fait tourner le drone

// Si la valeur Y est strictement supérieur à 700 le moteur B avance
analogWrite(PIN_VITESSE_MOTEUR_B, VitesseB);
digitalWrite(PIN_SENS_MOTEUR_B, HIGH);
analogWrite(PIN_VITESSE_MOTEUR_A, VitesseA);
digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
TEST = 0;
}
else if (joystickY < 300) {

// Sinon si la valeur Y est strictement inférieur à 300 le moteur B recule
analogWrite(PIN_VITESSE_MOTEUR_B, VitesseB);
digitalWrite(PIN_SENS_MOTEUR_B, LOW);
analogWrite(PIN_VITESSE_MOTEUR_A, VitesseA);
digitalWrite(PIN_SENS_MOTEUR_A, LOW);
TEST = 0;
}
else {
if( TEST == 0 ){

// Sinon si la valeur Y est comprise entre 300 et 700 (bornes inclusent) le moteur B ne bouge pas
digitalWrite(PIN_VITESSE_MOTEUR_B,512);
}
}
}
}

Je vois que tu as écris des choses du style

analogWrite(PIN_VITESSE_MOTEUR_A, 512);

Il y a un truc pas clair dans ce que j'ai écrit ?

analogWrite(PIN_VITESSE_MOTEUR_A, entier_compris_entre_0_et_255);

Je me trompe peut-être, mais j'ai pas l'impression que depuis hier on soit passé dans une hypothétique 5ème dimension où, par exemple, 512 serait compris entre 0 et 255 ;)

Oh merci que je peux etre con.

Désoler de ne pas avoir répondu plus tôt je n'avais pas accès au materiel, j'ai donc modifier mon programme mais cela de marche pas je commence a perdre fois apres 3semaines de recherche je demande donc votre aide pour faire une variation de vitesse grasse a un joystick

Quel est ton nouveau programme ? (par pitié, utilise les balises "code")

Je suis vraiment désolé j’ai eu des problèmes internet
Alors voici mon code:

const byte PIN_VITESSE_MOTEUR_A = 3;
const byte PIN_SENS_MOTEUR_A    = 12;
const byte PIN_FREIN_MOTEUR_A   = 9;
const byte PIN_VITESSE_MOTEUR_B = 11;
const byte PIN_SENS_MOTEUR_B    = 13;
const byte PIN_FREIN_MOTEUR_B   = 8;
int TEST;

const byte PIN_JOYSTICK_X = A2;
const byte PIN_JOYSTICK_Y = A3;
const byte PIN_JOYSTICK_Z = A4; // Bouton, pas potentiomètre /!\

// Variables "axe1Joystick" et "axe2Joystick": pas besoin d'avoir des variables globales


void setup() {

  Serial.begin(115200);

  pinMode(PIN_VITESSE_MOTEUR_A, OUTPUT);
  analogWrite(PIN_VITESSE_MOTEUR_A, 512);

  pinMode(PIN_VITESSE_MOTEUR_B, OUTPUT);
  analogWrite(PIN_VITESSE_MOTEUR_B, 512);

  pinMode(PIN_SENS_MOTEUR_A, OUTPUT);
  digitalWrite(PIN_SENS_MOTEUR_A, LOW);

  pinMode(PIN_SENS_MOTEUR_B, OUTPUT);
  digitalWrite(PIN_SENS_MOTEUR_B, LOW);

  pinMode(PIN_FREIN_MOTEUR_A, OUTPUT);
  digitalWrite(PIN_FREIN_MOTEUR_A, LOW);
 
  pinMode(PIN_FREIN_MOTEUR_B, OUTPUT);
    digitalWrite(PIN_FREIN_MOTEUR_B, LOW);

  pinMode(PIN_JOYSTICK_Z, INPUT_PULLUP); // L'activation de la résistance de tirage est obligatoire pour le bouton poussoir en Z sinon les valeurs lues seront aléatoires.

}

void loop() {


  int joystickX = analogRead(PIN_JOYSTICK_X);
  int joystickY = analogRead(PIN_JOYSTICK_Y);

  int VitesseX; //= joystickX / 4;
  int VitesseY; //= joystickY / 4;
  VitesseX = map(joystickX, 0, 1023, 0, 255);
  VitesseY = map(joystickY, 0, 1023, 0, 255);

  byte joystickZ = digitalRead(PIN_JOYSTICK_Z);

  if (joystickZ == LOW) {   

    // Si le bouton Z est actif les moteurs sont éteints
    digitalWrite(PIN_VITESSE_MOTEUR_A, 512);
    digitalWrite(PIN_VITESSE_MOTEUR_B, 512);

  }
  else { // Sinon, si le bouton Z n'est pas actif

    if (joystickX > 580) {  //AVANCE

      // Si la valeur X est strictement supérieur à 700 le moteur A avance
      analogWrite(PIN_VITESSE_MOTEUR_B, VitesseY);
      digitalWrite(PIN_SENS_MOTEUR_B, HIGH);
      analogWrite(PIN_VITESSE_MOTEUR_A, VitesseY);
      digitalWrite(PIN_SENS_MOTEUR_A, LOW);
     
      TEST = 1;
    }
    else if (joystickX < 450) {  //RECULER

      // Sinon si la valeur X est strictement inférieur à 300 le moteur A recule
      analogWrite(PIN_VITESSE_MOTEUR_B, VitesseY);
      digitalWrite(PIN_SENS_MOTEUR_B, LOW);
      analogWrite(PIN_VITESSE_MOTEUR_A, VitesseY);
      digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
      TEST = 1;
    }
    else {

      // Sinon si la valeur X est comprise entre 300 et 700 (bornes inclusent) le moteur A ne bouge pas
      digitalWrite(PIN_VITESSE_MOTEUR_A, 512);
      digitalWrite(PIN_VITESSE_MOTEUR_B, 512);
    }

      if (joystickY > 580) {  // fait tourner le drone

      // Si la valeur Y est strictement supérieur à 700 le moteur B avance
      analogWrite(PIN_VITESSE_MOTEUR_B, VitesseX);
      digitalWrite(PIN_SENS_MOTEUR_B, HIGH);
      analogWrite(PIN_VITESSE_MOTEUR_A, VitesseX);
      digitalWrite(PIN_SENS_MOTEUR_A, HIGH);         
      TEST = 0;
    }
      else if (joystickY < 450) {   

      // Sinon si la valeur Y est strictement inférieur à 300 le moteur B recule
      analogWrite(PIN_VITESSE_MOTEUR_B, VitesseX);
      digitalWrite(PIN_SENS_MOTEUR_B, LOW);
      analogWrite(PIN_VITESSE_MOTEUR_A, VitesseX);
      digitalWrite(PIN_SENS_MOTEUR_A, LOW);
      TEST = 0;
    }
      else {
      if( TEST == 0 ){

      // Sinon si la valeur Y est comprise entre 300 et 700 (bornes inclusent) le moteur B ne bouge pas
      digitalWrite(PIN_VITESSE_MOTEUR_B,512);
      }
    }
  }
  Serial.println(VitesseX);
}

Merci de tes réponses

Tu penses vraiment que digitalWrite(PIN_VITESSE_MOTEUR_A, 512) éteint les moteurs ?