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

a marqué ce sujet comme résolu.

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.

+0 -0

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.

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 ?

+0 -0

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.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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