Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=signup Les demandes d'inscription sont révisées quotidiennement.

Menu principal

Puce sans reference ou solution alternative

Démarré par cathodic, Février 23, 2025, 11:07:54 AM

« précédent - suivant »

papyblue

Bonjour,
Il y a un bug :
Bouton2 == HIGH  va donner un booléen ( donc 0 ou 1 )
or digitalRead () attend un numéro de broche
il fallait écrire :
if (digitalRead(Bouton2) == HIGH )

philchamp51

Bonjour X.

Je vois une erreur dans le code, j'ai laissé des digitalWrite au lieu de analogWrite.

Mets ceci dans le setup à la place:

Au lieu de:

digitalWrite(Motor1, LOW);
digitalWrite(Motor2, LOW);

écrit:

analogWrite(Motor1, 0);
analogWrite(Motor2, 0);

philchamp51

Voila ce que c'est que de taper trop vite un code et ne pas se relire consciencieusement...

philchamp51

Papyblue a raison, erreur de ma part.

Voici le code modifié:

#include <arduino.h>

// Définition des pins du microcontrôleur (A voir selon la conficguration du PCB)
#define Bouton1 4  // (Bouton poussoir 1 sur PB4 soit Pin 3 de l'ATTiny85)
#define Bouton2 2  // (Bouton poussoir 2 sur PB2 soit Pin 7 de l'ATTiny85)
#define Led1    5  // (Led 1 sur PB5 soit Pin 1 de l'ATTiny85)
#define Led2    3  // (Led 2 sur PB3 soit Pin 2 de l'ATTiny85)
#define Motor1  0   // (Commande moteur 1 sur PB0 soit Pin 5 de l'ATTiny85)
#define Motor2  1   // (Commande moteur 2 sur PB1 soit Pin 6 de l'ATTiny85)

void setup() {
  pinMode(Bouton1, INPUT_PULLUP);
  pinMode(Bouton2, INPUT_PULLUP);
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  digitalWrite(Led1, LOW);
  digitalWrite(Led2, LOW);
  analogWrite(Motor1, 0);
  analogWrite(Motor2, 0);
}

void loop() {
  // Si on appuie sur le bouton 1, le moteur tourne dans un sens
  if (digitalRead(Bouton1) == LOW) {
    analogWrite(Motor1, 255);
    analogWrite(Motor2, 0);
    digitalWrite(Led1, HIGH);
    digitalWrite(Led2, LOW);
    // Si on appuie sur le bouton 2, le moteur tourne dans l'autre sens
  } else if (digitalRead(Bouton2) == LOW) {
    analogWrite(Motor1, 0);
    analogWrite(Motor2, 255);
    digitalWrite(Led1, LOW);
    digitalWrite(Led2, HIGH);
    // Si aucun bouton n'est appuyé ou si on appuie sur les deux en même temps, le moteur ne tourne pas
  } else if ((digitalRead(Bouton1) == HIGH && digitalRead(Bouton2) == HIGH) || (digitalRead(Bouton1) == LOW && digitalRead(Bouton2) == LOW)) {
    analogWrite(Motor1, 0);
    analogWrite(Motor2, 0);
    digitalWrite(Led1, LOW);
    digitalWrite(Led2, LOW);
  }
}

cathodic

Apparemment, j'ai fait une très grossière erreur dans le programme.
Mais même en corrigeant cela n'a pas résolu le problème.

J'ai corrigé comme ci-dessous mais même résultat décevant.

// Définition des pins du microcontrôleur (A voir selon la conficguration du PCB)
#define Bouton1 4  // (Bouton poussoir 1 sur PB4 soit Pin 3 de l'ATTiny85)
#define Bouton2 2  // (Bouton poussoir 2 sur PB2 soit Pin 7 de l'ATTiny85)
#define Led1    5  // (Led 1 sur PB5 soit Pin 1 de l'ATTiny85)
#define Led2    3  // (Led 2 sur PB3 soit Pin 2 de l'ATTiny85)
#define Motor1  0   // (Commande moteur 1 sur PB0 soit Pin 5 de l'ATTiny85)
#define Motor2  1   // (Commande moteur 2 sur PB1 soit Pin 6 de l'ATTiny85)

philchamp51

As-tu corrigé le setup et la loop ? Je t'ai remis le programme complet dans mon dernier message

philchamp51

#111
Sinon, une autre version avec des boolean:

#include <arduino.h>

// Définition des pins
#define Bouton1 4  // PB4 (Pin 3 ATTiny85)
#define Bouton2 2  // PB2 (Pin 7 ATTiny85)
#define Led1 5    // PB5 (Pin 1 ATTiny85)
#define Led2 3    // PB3 (Pin 2 ATTiny85)
#define Motor1 0  // PB0 (Pin 5 ATTiny85)
#define Motor2 1  // PB1 (Pin 6 ATTiny85)

void setup() {
  pinMode(Bouton1, INPUT_PULLUP);
  pinMode(Bouton2, INPUT_PULLUP);
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);

  // Initialisation des sorties à l'état bas
  digitalWrite(Led1, LOW);
  digitalWrite(Led2, LOW);
  analogWrite(Motor1, 0);
  analogWrite(Motor2, 0);
}

void loop() {
  bool bouton1State = digitalRead(Bouton1) == LOW; // Inversion de logique
  bool bouton2State = digitalRead(Bouton2) == LOW;

  if (bouton1State && !bouton2State) {
    // Bouton 1 seul pressé → moteur tourne dans un sens
    analogWrite(Motor1, 255);
    analogWrite(Motor2, 0);
    digitalWrite(Led1, HIGH);
    digitalWrite(Led2, LOW);
  } else if (bouton2State && !bouton1State) {
    // Bouton 2 seul pressé → moteur tourne dans l'autre sens
    analogWrite(Motor1, 0);
    analogWrite(Motor2, 255);
    digitalWrite(Led1, LOW);
    digitalWrite(Led2, HIGH);
  } else {
    // Aucun bouton ou les deux pressés → arrêt moteur
    analogWrite(Motor1, 0);
    analogWrite(Motor2, 0);
    digitalWrite(Led1, LOW);
    digitalWrite(Led2, LOW);
  }
}

papyblue

Bonjour,
cela aurait été un plus d'ajouter une temporisation entre le relâché d'un bouton et l'action de l'autre de manière à éviter de commander le moteur dans un sens alors qu'il tourne encore dans l'autre.

philchamp51

#113
C'est sûr mais cela fera partie de la prochaine étape. Je voulais savoir si cela fonctionnait déjà comme cela avant d'aller plus loin.
Mais merci de la remarque Papyblue.

Ceci dit Cathodic, si cela fonctionne, c'est vrai qu'il est mieux d'attendre l'arrêt moteur avant de repartir dans un autre sens.

cathodic

Citation de: papyblue le Mars 24, 2025, 12:57:37 PMBonjour,
cela aurait été un plus d'ajouter une temporisation entre le relâché d'un bouton et l'action de l'autre de manière à éviter de commander le moteur dans un sens alors qu'il tourne encore dans l'autre.
Rebonjour, en fait je n'ai jamais codé en C++.
Mais je pense une chose, lorsque je branche la batterie une diode s'allume.
Celle qui est reliée à PB5 (Pin 1 de l'ATtiny85).
Je me demande s'il ne devrait pas y avoir un sens de rotation prédéfini dans le programme.
Quant à la temporisation, en effet pourrait être un plus.
Étant, nul en programmation en C++. Je doute fort que j'arriverai à pondre un quelconque programme.

Encore merci.

philchamp51

Essaye le programme avec les boolean que je t'ai envoyé

philchamp51

Je suis en train de m'inspirer de codes que j'ai déjà écrit pour d'autres montages où j'ai utilisé des pauses, des détections de switchs, des inversions de polarité, etc, sans arrêter le micro-contrôleur avec des delay().

Mais il faut savoir déjà si cela fonctionne sans tout ça.

J'espère que ton L9110 n'est pas mort...

cathodic

Citation de: papyblue le Mars 24, 2025, 12:57:37 PMBonjour,
cela aurait été un plus d'ajouter une temporisation entre le relâché d'un bouton et l'action de l'autre de manière à éviter de commander le moteur dans un sens alors qu'il tourne encore dans l'autre.
Bonjour, vu le conception de l'appareil il est mal aisé d'actionner les boutons de changement du sens de rotation sans lâcher le levier qui met en service le moteur.

philchamp51

#118
C'est déjà ça et cela a même été fait exprès je pense.
En attendant, voici un schéma au propre.

philchamp51

Je vais finir par commander un L9110S et un ATTiny85 pour tester ça dans mon labo  :laugh: