une question de PWM par un débutant

bonjour à tous,

Je me permet de poster une question de méthodologie car je ne suis pas très sûr de faire les choses de la manière la plus efficace...
Au niveau du contexte, je travaille avec une Arduino duemilanove, un popolu MC33887 Motor Driver Carrier, 2 boutons et un contacteur

L'idée du prog si dessous (qui fonctionne) c'est que quand le bouton 1 est enfoncé, le moteur actionne un mécanisme qui viens rappuyer dessus (vérifier par le bouton2) avant de retourner dans sa position initiale (vérifier par le contacteur).

const int buttonPin = 2;
const int contactPin = 3; 
const int buttonPin2 = 4; 
const int motorPin1 =  13;   
const int motorPin2 =  12;  
const int motorPwm= 11;

// variables will change:
int buttonState = 0;
int contactState = 0;
int buttonState2 = 0;


void setup() {
 
  pinMode(motorPin1, OUTPUT); 
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPwm, OUTPUT);   
  pinMode(contactPin, INPUT);   
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT); 
  Serial.begin(9600); 

}

void loop(){
  // read the state of  pushbuttons values:
  buttonState = digitalRead(buttonPin);
  contactState = digitalRead(contactPin);
  buttonState2 = digitalRead(buttonPin2);
  
  if (buttonState == HIGH && contactState == HIGH) {     
    delay (300); 
    analogWrite(motorPwm, 255); // puissance moteur
    Serial.println("action");
    digitalWrite(motorPin2, LOW); 
    digitalWrite(motorPin1, HIGH);
    delay (4000); 
  }
 /* if (buttonState2 == HIGH && contactState == LOW ) { 
     
     Serial.println("CONTACT");
    
     analogWrite(motorPwm, 200);
     
     digitalWrite(motorPin2, HIGH); 
      delay (3500);
   }  */
  
  if (contactState == HIGH) {  
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin1, LOW);
  }
     else {
    analogWrite(motorPwm, 255);
    digitalWrite(motorPin2, HIGH); 
    digitalWrite(motorPin1, LOW);
    Serial.println("back");
    
   
  }

  }

Déjà à ce niveau je ne suis pas sur d'être très efficace dans ma manière de coder l'ensemble...
mais surtout ce qui me pose problème c'est le retour moteur...en effet je souhaiterais utilisé la fonction PWM pour "calmer" le moteur avant qu'il touche le contacteur soit peu de temps après que le B1 et le B2 aient été enfoncés en même temps; c'est la partie fausse désactiver dans mon code.
Une suggestion?

Merci d'avance! :stuck_out_tongue:

Déjà à ce niveau je ne suis pas sur d'être très efficace dans ma manière de coder l'ensemble...

Effectivement ta fonction loop() n'est pas plus claire que tes explications et pour un même état de contact_state tu peux tomber dans 2 cas différents.
Je pense que tu devrais reformuler ton besoin plus clairement en prenant bien en compte les cas qui s'exclus mutuellement et ton codage en sera simplifié.

Les délais dans les commandes de moteurs ce n'est pas une très bonne chose. Si un peu de poussière tombe dans le mécanisme et ralentie le moteur ou si au contraire tu le lubrifies un peu et que celui-ci accélère, tes temporisations deviennent complètement fausses.

En fait, je dois avouer que je ne comprends pas très bien ton problème. Pourquoi as-tu été obligé de désactiver une partie de ton code?

Salut fdufnews,
J'ai un peu progressé depuis...
Ça marche comme je le souhaite désormais :slight_smile:
Merci quand même pour ta réponse

#define UP_TIME             6800  // Time after which speed should decreases
#define DELTA_SPEED       0.95   // The delta decreasing speed.
// Motor state:
#define STOP                  0      // 0: motor stopped
#define GO_DOWN                  1      // 1: motor goes down.
#define GO_UP                  2      // 2: motor goes up.

const int buttonPin = 2;
const int contactPin = 3;
const int buttonPin2 = 4;
const int motorPin1 =  13;   
const int motorPin2 =  12;  
const int motorPwm= 11;

// variables will change:
int buttonState = 0;
int contactState = 0;
int buttonState2 = 0;
long startTime;            // Start time for a movement.
float deltaSpeed;      // Decreasing float.
int inMove;                                                            
int motorPower;      

void setup() {

  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPwm, OUTPUT);   
  pinMode(contactPin, INPUT);   
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
  Serial.begin(9600);

  inMove=STOP;                 // Not in movement at init.
  deltaSpeed=DELTA_SPEED;  // Set the delta decreasing speed.

  digitalWrite(motorPin1, LOW);      // No movement.
  digitalWrite(motorPin2, LOW);      // No movement.
}

void loop() {
// read the state of  pushbuttons values:
    buttonState = digitalRead(buttonPin);
    contactState = digitalRead(contactPin);
    buttonState2 = digitalRead(buttonPin2);

  if (!inMove) {  // Check if arm is in movement.

    if (buttonState == HIGH) { // Is the main button pressed ?
       Serial.print(65, BYTE);      
       delay(300);
       startTime=millis();                                                         // Set motor Power.                                                                        // Wait for 300 ms...                                            // Go down.
       analogWrite(motorPwm, 255);
       digitalWrite(motorPin1, HIGH);// Set motor Power. 
       inMove=GO_DOWN;                                                                                                                    
    }
  }
  else {
    switch (inMove) {
      
      case GO_DOWN:

      if (buttonState == HIGH && buttonState2 == HIGH) {                                                // System stops itself.
        Serial.print(66, BYTE);
        delay(10);
        analogWrite(motorPwm, 0);                                          
        digitalWrite(motorPin1, LOW);                                                                              // Full speed for next time.
        motorPower=255;        // Set new power (full power to UP).
        delay(250);                                             // Set state to GO-UP.
        analogWrite(motorPwm, motorPower); 
        digitalWrite(motorPin2, HIGH);      // Go up.                               
        inMove=GO_UP; 
      }
      break;

        case GO_UP:
        if (millis()-startTime>=UP_TIME) {                    // If near contactor...
           motorPower=(long) ((float) motorPower*deltaSpeed);  // .. decrease motor speed.      
           analogWrite(motorPwm, motorPower+160);   // Set new power. 
           digitalWrite(motorPin2, HIGH);      
      }
        if (contactState == HIGH) {  // No movement.
          Serial.print(67,BYTE);            // System is returned to original state.
          analogWrite(motorPwm, 0);      // Set power to 0 (stop engine ;o) ).
          digitalWrite(motorPin2, LOW);
          inMove=STOP;
      }
      break;
    }
  }
}