Déplacement d'un chariot entre 2 fins de course

Bonjour
je voudrais qu'un chariot de déplace soit dans un sens soit dans l'autre en fonction du fin de course appuyé.


Voici le code que j'ai écris et qui ne marche pas bien sur sinon je ne serais pas la!!

int fdC1 = 7;
int fdC2 = 8;

int IN1 = 4;
int IN2 = 5;

void setup()
{
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(fdC1, INPUT_PULLUP);
  pinMode(fdC2, INPUT_PULLUP);
    
}
void loop()
  {
 // sens Horaire
  {
       if (!fdC1 == HIGH) 	// si FdC1 n'est pas à 1
  {  
     analogWrite(IN1, 100);  //voir pour modif vitesse 0 à 255
    digitalWrite(IN2, 0);
     
  }
     else  //si FdC1 est égal à 1
  {
     digitalWrite(IN1, 0);
    digitalWrite(IN2, 0);
  }
  }
  
// Sens Antihoraire
  {   
      if (!fdC2 == HIGH) 	// si FdC2 n'est ps à 1
  {
      digitalWrite(IN1, 0);
      analogWrite(IN2, 100);  //voir pour modif vitesse 0 à 255

  }
    else// si FdC2 est égal à 1
  {
     digitalWrite(IN1, 0);
     digitalWrite(IN2, 0);
  }
  delay(200);
  }
  }

Merci d'avance pour vos conseils

Je ne comprends pas bien pourquoi tu utilises des fois analogWrite lorsque tu veux la valeur 100 et digitalWrite lorsque tu veux la valeur 0 ?

Si tu agis sur les mêmes variables dans tes deux IF, la valeur de tes variables, ne dépendra que du deuxième.
Dans ton schéma les IF (FdC1 et FdC2) sont pourtant bien en parallel.

L'organigramme m'a l'air curieux, je me trompe sûrement mais n'est-ce pas plutôt ça ?

Suggestion - je suis pas sûr

Pour le code je peux regarder demain, là je n'ai pas le temps malheureusement :woozy_face:

Cordialement,
Pandaroux007

Bonjour trezala

En fait, tu veux un système de va et vient continuel de ton chariot, juste?

A+
Cordialement
jpbbricole

Je n'avais pas vu les choses comme ça mais c'est logique en effet... À confirmer de la part de @trezala, moi je pensais qu'il fallait laisser les fins de cours appuyés :woozy_face:

Donc ma version de l'organigramme est fausse, n'en tenez pas compte!


Ça voudrait dire que le chariot roule en continu jusqu'à toucher l'un des fins de cours ce qui change de sens le moteur ?


@terwal a raison, il y a un problème ici; tu définis et configures des pins digitales puis tu utilises dessus la fonction analogWrite.

https://docs.arduino.cc/language-reference/en/functions/digital-io/digitalwrite/
https://docs.arduino.cc/language-reference/en/functions/analog-io/analogWrite/

Cordialement,
Pandaroux007

De mémoire je crois que cela ne pose pas de problème, mais c'est assez inattendu et surtout confusant.

Ce qui me gêne le plus sont les deux IF consécutifs.

Je crois que @J-M-L pourrait sortir son tampon :slight_smile:

Ou est le problème ? C’est exactement ce qu’il faut faire, non ? On met la pin en sortie et on règle son PWM ? Et c’est plus efficace de mettre a LOW que de demander un PWM avec un duty cycle de 0 (idem vaut mieux mettre à HIGH que demander un PWM de 255)

Comme je l'indique c'est assez confusant et n'importe aucune plus value, sur ce genre de programme.
Donc le "problème", si on peut appeler ça un problème est que l'on ne sait pas bien s'il maitrise ce qu'il fait ou copie un peu sans compendre du code.

OK, mais qu'est-ce qui ne marche pas?
Que fait-il que tu ne désires pas?

Moi je trouve ça bien et cohérent et efficace.

Vous avez digitalWrite() pour faire du tout ou rien et analogWrite() pour faire du PWM.
Je trouve même que faire analogWrite(0) moins lisible dans l’intention que de mettre la pin à LOW.

Après je ne sais pas si l’OP en est conscient… mais rien de choquant pour moi.

Je pense que ton problème vient du fait que ton organigramme ne représente pas tout à fait ce que tu veux obtenir
Ne serait-ce pas plutôt ça que tu veux faire (en admettant que le chariot fasse des aller et retour sans arrêt)?


Cette écriture est assez ambiguë. Il est préférable soit de faire
if (fdC1 == LOW)
soit

#define ACTIF LOW
#define INACTIF HIGH

if (fdC1 == ACTIF)

La seconde étant largement plus claire.

EDIT: ajout d'une branche manquante dans l'organigramme.

Bonsoir!

Je plussoie.

Là il y a un problème:

// sens Horaire
if (!fdC1 == HIGH)  // si FdC1 n'est pas à 1

ceci est mieux:
if (digitalRead(fdC1) == LOW) // si FdC1 est appuyé

également pour:
// Sens Antihoraire

Autre problème, si c'est un UNO ou un Nano, les pin du commande du moteur:

int IN1 = 4;
int IN2 = 5;

Seul la 5 est PWM

Il faudrait choisir:

int IN1 = 5;
int IN2 = 6;

Cordialement
jpbbricole

Oui, c'est à cela que je pensais lorsque j'ai dit

Pour le digitalWrite(IN1, LOW);, oui (même si la fonction analogWrite s'en charge pour nous). Mais comme l'a dit @jpbbricole l'une des pins n'est pas pwm donc on s'y perd un peu je trouve - si on utilise analogWrite sur une pin non-PWM je ne sais pas s'il se passe quelque chose - d'après le code de la fonction je crois que si c'est en dessous de 128 c'est LOW sinon HIGH ?

De toute façon ici on a pas besoin de réguler la vitesse du moteur si le chariot ne fait que des va-et-vient, non ?

Cordialement,
Pandaroux007

je n'avais pas regardé cela. En effet, faire un analogWrite sur une pin non PWM c'est pas terrible :slight_smile:

oui sinon ça fait HIGH ou LOW par rapport à la valeur 128

Oui, je ne parles bien évidement pas pour toi, voir même pour quelqu'un de moins calé, mais pour quelqu'un que je suppose encore débutant.
Je n'irais pas jusqu'à dire que c'est choquant :slight_smile:
Après le plus "choquant", reste la dénomination de analogwrite, qui est très confusant, à mon avis.
Comme on l'a déjà évoqué, je ne suis pas partisans(viva la révolution) des optimisations pour des codes destinés à des débutant, car ce qui est clair et limpide pour l'un ne l'est pas pour l'autre, enfin c'est mon avis :slight_smile: .

Comme je l'ai indiqué, ce qui me "choque" le plus dans le code de @trezala est surtout la sérialisation de ses deux IF.
Pour donner un exemple que passe t-il si fdC1 est activé(!= HIGH) et fdC2 ne l'est pas(== HIGH), puisque logiquement fdC1 est différent de fdC2
Ou dit autrement quel est la configuration où le moteur est actif.

Bonjour,

  1. chez STM32duino , par exemple , la fonction analogWrite(,) donne , si c'est une broche :
  • pwm : le duty en %
  • DAC : la tension analogique vraie correspondante
  • digitale : LOW ou HIGH , selon qu'on soit < ou > 50%
    dans tous les cas , définir préalablement la broche comme sortie digitale , est - pour le moins - inutile
  1. dans le diagramme (on a la chance d'en avoir un !) , il manque le cas ou les deux FdC sont ouverts à la mise sous tension (ce qui ne manquera pas de se présenter dans la vraie vie) , donc au concepteur de dire ce qu'il a prévu

La fonction le fait, mais ça a le mérite de mettre "tôt" la broche dans son état attendu étant donné que par défaut elles sont souvent en INPUT (en haute impédance, elle ne tire pratiquement aucun courant mais peut être sensible aux parasites si elle n'est pas connectée à un état défini).

Bonjour et merci pour toutes ces réponses. Je vais répondre a certaines.
Oui je débute en Arduino et j'ai copié certaines partie de codes pour faire celui que j'ai essayé
C'est Arduino UNO que j'utilise

En fait, tu veux un système de va et vient continuel de ton chariot, juste?

NON je veux que si le chariot est sur un FdC il parte vers l'autre FdC ET s'arrête puis la boucle recommence et donc le chariot va repartir dans l'autre sens Et s'arrêter et la boucle recommence et on se retrouve dans le premier cas et le cycle recommence. Le chariot ne fait pas des aller-retours éternellement il s'arrête a chaque fois qu'il touche un FdC.

@terwal a raison, il y a un problème ici; tu définis et configures des pins digitales puis tu utilises dessus la fonction analogWrite.

Je suis parti de ce code que j'ai essayé et qui marche
https://mataucarre.fr/piloter-deux-moteurs-avec-un-driver-l298-arduino/
Programme 2 : Faire tourner les moteurs à différentes vitesses.

Vous avez digitalWrite() pour faire du tout ou rien et analogWrite() pour faire du PWM.

C'est ce que je pensais aussi.

Ne serait-ce pas plutôt ça que tu veux faire (en admettant que le chariot fasse des aller et retour sans arrêt)?

Non je veux qu'il s'arrête a la fin d'un déplacement horaire ou anti horaire

De toute façon ici on a pas besoin de réguler la vitesse du moteur si le chariot ne fait que des va-et-vient, non ?

Je ne veux pas que mon chariot soit un bolide. J'envisage même de mettre une rampe accélératrice et décélératrice mais ca c'est une autre histoire !

il manque le cas ou les deux FdC sont ouverts à la mise sous tension

C'est pas grave je mettrais le chariot manuellement sur un FdC

J'ai modifié le code :
mis IN1 et IN2 sur PWM
mis LOW a la place de HIGH sur les FdC

Voila ce qui se passe
Si chariot entre FdC1 et FdC2 le chariot ne bouge pas (normal!)
Si chariot sur FdC1 le chariot se déplace vers FdC2 et s'arrête lorsque contact
Si chariot sur FdC2 le chariot ne bouge pas

Mets le code modifié, sinon on ne sait plus de quoi on parle.

Désolé mais là il fait bien des aller et retour en permanence loop() étant une boucle infinie, et évidemment pour passer d'un sens à l'autre il faut faire une pause mais on ne peut pas vraiment parler d'arrêt dans ce cas. S'il y a réellement un arrêt, alors il faut définir soit un temps d'arrêt, soit une condition pour relancer le cycle.