Moteur 6 fils, Stepper et motor shield (L298)

Impec! Merci de le signaler.

Tester sur l'Arduino et mon ensemble tourne nickel, sensiblement la même fonction que le programme beaucoup plus long :slight_smile: Merci pour votre travail.

C'est pas A+ et A- qui reste allumé mais B pendant les "Delay"
Il n'y a aucun moyen de ne rien alimenté pendant ces "delay" ?
La mesure de la prise me dit 2w X 24h cela me fait perdre 48w (Certes cela parait ridicule) mais avec un panneau de 150w heure, c'est 1/3 du heure a 100% de rendement qui est perdus.

Peut être qu'une fois le BP enclenché, on pourrais mettre le Motor Shield en pause pour 12h ? puis le programme recommence avec ?

Je fabrique la pièce pour le bouton poussoir demain, avez vous une idée des lignes de code pour remplacer uneRevolution(-4800, 60000); du soir par l'arrêt automatique lors de la mise en appuis du BP puis ensuite décompte le "delay" 60000
Je vais essayé de lire ça, voir si ça peux aider dans mon projet

j'aurais aussi la nouvelle vis sans fin pour continuer mes tests

Merci

A priori, rien ne devrait être allumé une led s'allume si une sortie du circuit L298 est à 12V. Et 2X semble correspondre à un seul enroulement branché. Comme si la sortie D8 n'était pas à HIGH
Que donne la mesure de la tension pendant les delay sur D8, sur B+ et B-?

Pourquoi pas un interrupteur qui coupe complètement le 12V? Un bouton Marche Arrêt.
Si on veut une pause de 12h, il faut compter le temps. Et l'horloge des Uno n'est pas très précise. Il y aura alors un décalage si se cumulera tous les jours.
Avec un bouton marche arrêt manuel pas de problèmes, sinon, il faut une horloge genre DS3132 (je ne suis pas spécialiste de ces bestioles)

Entre B+ et B- = 0v
Entre B+ OU B- et GND =12v

Je veux un truc complètement autonome

Mon moteur patine un à certains pas (Surtout sur le retour, je comprend pas pourquoi) avec les frottement et le poids, on est bien d'accord que j'ai le couple maximum là ? Pas moyen d'avoir plus ? Apart ajouter un engrange au milieu qui augmenterais le couple si j'ai un ratio plus grand

C'est pas normal. sous le circuit du shield, il doit y avoir une pastille moitiée coupée repérée brake-A_disable et une brake-B_disable. Il faut que cette pastille laisse passer le courant. Il est possible qu'elle soit coupée. Eventuellement peux tu poster une photo du dessous de la carte?

Oui. Et oui pour une démultiplication.

Bonjour
J'ai bien un contact sur les 4 pastilles (2/2)


J'avais de mon côté coupé la liaison VIN suite a mon premier Arduino HS, j'ai maintenant une alimentation 5v (arduino) et une 12v (Motor Shiel)

Je vais étudier cela, je voudrais faire un système fiable.

Je vais installer le bouton fin de course dans la journée

Il est dit dans la doc:

If you don't need the Brake and the Current Sensing and you also need more pins for your application you can disable this features by cutting the respective jumpers on the back side of the shield.

image

Si on n'a pas besoin de la fonction brake, en coupant les jumpers cela déconnecte les pins 8 ou 9, et des résistances de pull-down imposent le LOW. Si les deux pistes ne sont pas coupées, les broches 8 et 9 imposent la valeur, LOW pour faire tourner, HIGH pour déconnecter les sorties. Là où c'est crétin, c'est que mettre brake à HIGH ne met pas le frein, mais l'enlève. Il aurait mieux valu l'appeler débrayage!

Tels que je le vois sur la photo, les jumpers n'y sont pas et on ne peut plus déconnecter les moteurs.
On peut le vérifier à 'ohmmètre. Il faut que les jumpers soient en place. Pour les remettre, une grosse goute de soudure à faire. Pour enlever la goute dans un avenir, il suffit de chauffer et en tapant le circuit, la goute tombe.

Je sais pas si on c'est bien compris

Actuellement les contacts sont reliés, j'ai la même fonction que si je met un point de soudure dessus. (Visuellement pas relié par de la soudure mais physiquement relié)

J'ai essayé de mettre un coup de cutter comme sur le VIN pour les déconnecter réellement les Brake B ?
Impossible, ça sonne toujours contact

Dans ton programme

void uneRevolution(word step, uint32_t temps) {
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(step);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(temps);
}

On est déjà à HIGH pour le Brake, bizar

Il faut que les contacts soient reliés!

Attention des fois les ohmmètres sonnent si la résistance est de 1kΩ
Mais d'après le schéma, si le shield n'est pas en place (si il l'était, on aurait du mal à mesurer), il n'y a rien branché sur D8 ou D9.

On va essayer ceci:

#define pwmA 3
#define pwmB 11
#define dirA 12
#define dirB 13
#define brakeA 9 
#define brakeB 8

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);
  pinMode(dirA, OUTPUT);
  pinMode(dirB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, HIGH);
  digitalWrite(brakeB, HIGH);
  digitalWrite(dirA, LOW);
  digitalWrite(dirB, LOW);
}

void loop() {}

Normalement le moteur doit être libre
Si on remplace
digitalWrite(brakeA, HIGH);
par
digitalWrite(brakeA, LOW);
Le moteur doit être bloqué. Pareil si on rement HIGH pour brakeA mais qu'on passe brakeB à LOW

Alors en attendant, j'ai tester cela, ça ressemble à ce que tu dis sur le "BRAKE" passé en HIGH

// Rotation sur une journée 15°/H sur 12h puis retour en arriére 

// Include the Stepper library:
#include <Stepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define dirA 12
#define dirB 13
#define brakeA 9 
#define brakeB 8

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, HIGH); // <= Modifié ici 
 digitalWrite(brakeB, HIGH); // <= Modifié ici 
  
  // Set the motor speed (RPMs):
  myStepper.setSpeed(10);
}
void uneRevolution(word step, uint32_t temps) {
  digitalWrite(brakeA, LOW); // Remise en puissance du moteur
  digitalWrite(brakeB, LOW);
  myStepper.step(step);
  digitalWrite(brakeA, HIGH); // Coupure du courant dans le moteur
  digitalWrite(brakeB, HIGH);
  delay(temps);
}
void loop() {
  // Début 8h 
  // Delai en Ms 1s = 1000ms 1m = 6000ms 1h = 3600000ms 12h = 4320000ms
  delay(6000);

  // Révolutions
  for (byte revolution=1; revolution <=12; revolution++) uneRevolution(400, 6000);


  delay(6000); // Avec les 6000 précédents cela fait 12000
  //Retour 
  uneRevolution(-4800, 60000);
}

J'ai eu beaucoup moins de raté en HIGH sur mes rotations même avec 18kg de poids que en étant LOW et j'ai une conso dans le "Delay" de entre 0.8w et 1w et une conso moteur actif de 4.30w à 4.40w

je vais faire la soudure cette AM en même temps que les fils du BP

C'est pas ça. Il faut inverser pwm et break
On laisse brake à LOW en permanence et c'est pwm que l'on passe à HIGH pour faire tourner le moteur et à LOW pour le déconnecter. Du coup, on laisse en l'air brake. Cela donne:

// Rotation sur une journée 15°/H sur 12h puis retour en arriére 

// Include the Stepper library:
#include <Stepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define dirA 12
#define dirB 13

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);

  digitalWrite(pwmA, LOW);
  digitalWrite(pwmB, LOW);
  
  // Set the motor speed (RPMs):
  myStepper.setSpeed(10);
}
void uneRevolution(word step, uint32_t temps) {
  digitalWrite(pwmA, HIGH); // Remise en puissance du moteur
  digitalWrite(pwmB, HIGH);
  myStepper.step(step);
  digitalWrite(pwmA, LOW); // Coupure du courant dans le moteur
  digitalWrite(pwmB, LOW);
  delay(temps);
}
void loop() {
  // Début 8h 
  // Delai en Ms 1s = 1000ms 1m = 6000ms 1h = 3600000ms 12h = 4320000ms
  delay(6000);

  // Révolutions
  for (byte revolution=1; revolution <=12; revolution++) uneRevolution(400, 6000);


  delay(6000); // Avec les 6000 précédents cela fait 12000
  //Retour 
  uneRevolution(-4800, 60000);
}

C'est parfait :+1: :+1: !! Aucune LED allumée
0.01w consommé, parfait

J'ai soudé aussi B+B- sur les contacts

Ainsi que soudé les PIN du BP pour ce relié sur motor-shiel, il faut que je regarde comment intégrer ça dans la dernière ligne.
Au lieu d'un déplacent lié à une valeur => un déplacement jusqu'à l'appuie.

Ouf!

Pour aller en position avec stepper, on fait en général:

while (digitalRead(finDeCourse) == HIGH) myStepper.step(1);  

Et on utilise un fin de course entre une entrée en INPUT_PULLUP et GND.
En français, cela donne on fait un pas tant que l'on n'a pas atteint le bouton. Si le déplacement est trop rapide:

while (digitalRead(finDeCourse) == HIGH) {
  myStepper.step(1);  
  delay(XXX); // ou delayMicroseconds si t<16000µs
}

Branchement d'un fil sur PIN 2 (coté digital) et L'autre sur GND (coté digital)

Voici mon code :

// Rotation sur une journée 15°/H sur 12h puis retour en arriére 

// Include the Stepper library:
#include <Stepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define dirA 12
#define dirB 13
#define BP 2

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(BP, INPUT_PULLUP);
  digitalWrite(pwmA, LOW);
  digitalWrite(pwmB, LOW);
  
  // Set the motor speed (RPMs):
  myStepper.setSpeed(5);
}

void uneRevolution(word step, uint32_t temps) {
  digitalWrite(pwmA, HIGH); // Remise en puissance du moteur
  digitalWrite(pwmB, HIGH);
  myStepper.step(step);
  digitalWrite(pwmA, LOW); // Coupure du courant dans le moteur
  digitalWrite(pwmB, LOW);
  delay(temps);
}
void loop() {
  // Début 8h 
  // Delai en Ms 1s = 1000ms 1m = 6000ms 1h = 3600000ms 12h = 4320000ms
  delay(6000);

  // Révolutions
  for (byte revolution=1; revolution <=2; revolution++) uneRevolution(380, 6000);


  //Retour 
  while (digitalRead(BP) == HIGH) myStepper.step(1);
  delay(60000);
}

J'ai vérifié et compilé
J'ai raccourcis les tours pour les tests

  1. Le programme tourne, on arrive au point de retour
    Le moteur ne tournais pas ! Aucune LED allumé

  2. Appui sur le bouton, ça s'arrête et passe en Delay , je suppose puisque après le temps, il recommence le programme

  3. Il faudrais "-1" après "myStepper.step" car il faut que la rotation soit inversé ?


La réception du panneau devrais se faire semaine prochaine, installation dans la foulée sur son support

Merci pour le code

Désolé pour toutes les modifications du message 75

pas compris

C'est bien ce qui est demandé. Il faut que tu dises ce que tu veux faire.

Bien sûr.

Le programme fais les 12 rotation demandés
Il arrive donc à la partie "Retour"
Mais il se passe rien, il ne revient jamais en arrière

Après j'ai mis "delay", car il doit attendre 12h puis ça recommence, ça ça fonctionne bien

OK, on a désavtivé l'alimentaion du moteur apès le dernier mouvement. Il faut remettre le jus pour le retour et le couper ensuite:

  digitalWrite(pwmA, HIGH); // Remise en puissance du moteur
  digitalWrite(pwmB, HIGH);
  while (digitalRead(BP) == HIGH) myStepper.step(-1);
  digitalWrite(pwmA, LOW); // Coupure du courant dans le moteur
  digitalWrite(pwmB, LOW);

Merci, je test ça dimanche soir

Merci pour toute votre aide :blush: