Commande d'un moteur pas à pas avec arduino et L298.

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour chers tous. J'ai un projet de suiveur solaire en cours et je voudrais avoir quelques éclaircissements. J'utilise pour mon tracking un moteur pas à pas avec les caractéristiques suivantes: U=2,8V;I=1,68A; 1,8°/pas et un réducteur de 1:27. le moteur fait tourner un tige filetée de 2,5mm de pas de filetage. pour etre assez précis, je souhaiterai faire une commande au 1/16 ème de tour voir 1/32 ème de tour de ma tige filetée. 1) Comment déterminer le nombre de pas qu'il faut pour cette commande sachant que je souhaite avoir une phase d'accélération et une de décélération. 2) Voici un code qui me permet de commander le moteur pour faire un quart de tour de ma tige je souhaiterai le comprendre.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#Commande pour 1/4 de tours
int ENA=2; //Connecté sur votre Arduino, Pin 2
int IN1=3; //Connecté sur votre Arduino, Pin 3
int IN2=4; //Connecté sur votre Arduino, Pin 4
int ENB=5; //Connecté sur votre Arduino, Pin 5
int IN3=6; //Connecté sur votre Arduino, Pin 6
int IN4=7; //Connecté sur votre Arduino, Pin 7


void setup() {
pinMode(ENA,OUTPUT);
 pinMode(ENB,OUTPUT);
 pinMode(IN1,OUTPUT);
 pinMode(IN2,OUTPUT);
 pinMode(IN3,OUTPUT);
 pinMode(IN4,OUTPUT);
}
void loop(){
   accelere(1);
   continu(1);
   deccelere(1);
   delay (3000);}

 int accelere(byte sens){
   digitalWrite(ENA,HIGH);
   digitalWrite(ENB,HIGH);
   if (sens == 1){
     for (int dlay = 10000; dlay > 2000; dlay-=120){
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(dlay-30);
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(dlay-60);
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(dlay-90);
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(dlay-120);
       }}
   else{
     for (int dlay = 10000; dlay > 2000; dlay-=120){
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(dlay-30);
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(dlay-60);
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(dlay-90);
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(dlay-120);
       }}}

int continu(byte sens){
   digitalWrite(ENA,HIGH);
   digitalWrite(ENB,HIGH);
   if (sens == 1){
     for (int i = 0; i < 203; i++){
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
      delayMicroseconds(2080);
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
      delayMicroseconds(2080);
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(2080);
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(2080);
       }}
   else{
     for (int i = 0; i < 203; i++){
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(2080);
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(2080);
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(2080);
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(2080);
       }}}

int deccelere(byte sens){
   digitalWrite(ENA,HIGH);// Activer moteur A
   digitalWrite(ENB,HIGH);// Activer moteur B
   if (sens == 1){
     for (int dlay = 2000; dlay < 10000; dlay+=120){
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(dlay+30);
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(dlay+60);
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(dlay+90);
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(dlay+120);
       }}
   else{
     for (int dlay = 2000; dlay < 10000; dlay+=120){
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(dlay+30);
       digitalWrite(IN1,HIGH);
       digitalWrite(IN2,LOW);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(dlay+60);
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,LOW);
       digitalWrite(IN4,HIGH);
       delayMicroseconds(dlay+90);
       digitalWrite(IN1,LOW);
       digitalWrite(IN2,HIGH);
       digitalWrite(IN3,HIGH);
       digitalWrite(IN4,LOW);
       delayMicroseconds(dlay+120);
       }}
   digitalWrite(IN1,LOW);
   digitalWrite(IN2,LOW);
   digitalWrite(IN3,LOW);
   digitalWrite(IN4,LOW);
   digitalWrite(ENA,LOW);
   digitalWrite(ENB,LOW);}
#

Merci.

Édité par Arius

+0 -0
Auteur du sujet

Je n'ai pas de schéma sur la main mais je poste dès que possible. En fait j'ai une carte de puissance L298 et je connecte les ports ENA,IN1,IN2,ENB,IN3,IN4 sur les bornes digitales 2,3,4,5,6,7 de mon arduino uno. le moteur est ensuite connecté à la carte L298. J'alimente la carte par une alim stabilisée DC à 7V et la carte arduino en 5V DC. Le programme présenté plus haut permet de faire une commande d'un quart de tour du moteur.

je souhaiterai modifier ce programme pour 1/16 ème de tour voir 1/32 ème de tour.

excuse moi si je ne suis pas précis dans mes propos tes questions sont les bienvenues. merci.

+0 -0
Auteur du sujet

c'est la carte de puissance L298 qui prend les 7V et elle alimente le moteur par la suite. je voudrais vraiment comprendre comment trouver le nombre de pas de mon moteur avec le reducteur. 1,8°/pas ça fait 200 pas avec le réducteur de 1:27 combien de pas j'ai?

+0 -0
Auteur du sujet

Merci Eskimon, Si j'ai bien compris, avec la réduction mon nombre de pas passe de 200pas à 5400pas en sortie du réducteur. comment repartir ce nombre de pas entre une phase d'accélération, une continu et une de décélération.

+0 -0

comment repartir ce nombre de pas entre une phase d'accélération, une continu et une de décélération.

Ca c'est à toi de voir en fonction du mouvement à faire etc.

Cependant, j'aimerais revenir sur ton moteur. Un moteur 3V c'est tout petit. Tu es sur que même avec le réducteur il parviendra à faire bouger ton ensemble ?

ZdS, le best du Zeste ! Tuto Arduino, blog, etc

+0 -0
Auteur du sujet

le soleil (ou la terre pour les puristes) bouge d'environ 1°/4min. J'ai un programme qui permet connaissant la position du soleil (azimut et élévation) de déplacer un chariot ce que fait le moteur avec succès jusqu'ici. cependant le problème est que le moteur tourne au quart de tour et vers le midi solaire les variations sont plus petites que 1/4 de tour du coup il bouge pas et il ya un retard dans le suivi. c'est la raison pour laquelle je souhaite affiner en passant du 1/4 au 1/16 voir 1/32 de tour du moteur. le moteur a un couple de 3,6 kg.cm.

Édité par gomna.aboubakar

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte