Chegou o momento de controlarmos um motor CC (DC motor, ou motor de corrente contínua). Se você planeja construir um robô ou qualquer tipo de dispositivo móvel, as habilidades que está prestes a aprender serão essenciais. Controlar um motor requer correntes mais altas do que as que o Arduino pode produzir com segurança em suas saídas, por isso você terá de utilizar um chip controlador de motor L293D para garantir corrente suficiente para o motor.
A vantagem do uso desse chip é que você pode controlar dois motores ao mesmo tempo, além de poder controlar sua direção. O chip também pode ser utilizado para controlar um motor de passo (Você também pode utilizar um chip compatível pino a pino, o SN754410, que tem uma taxa de corrente mais alta).
Componentes:
- 01 Motor CC
- 01 CI controlador de motor L293D ou SN754410
- 01 Potenciômetro de 10 kΩ
- 01 Pushbutton
- 01 Resistor 10kΩ
- 03 LEDs vermelhos
- 03 LEDs verdes
- 01 LED azul
- 07 resistores de 220Ω
- 01 Fonte de tensão externa de acordo com o motor
- Arduino Uno/Mega
Monte os componentes de acordo com o esquema acima. Assim que você estiver convencido de que seu circuito foi conectado corretamente, carregue o programa:
1
2 /* Este código permite o
controle de um motor cc pelo uso do CI controlador L293D,
3 controle de potência pelo potenciômetro com indicação de nível
pelos LEDS e
4 controle de inversão pelo push button.
*/
5
6 #define
botaoPin 2 // Entrada do push button
7 #define
motorPin1 3 // Entrada 1 do L293D
8 #define
motorPin2 4 // Entrada 2 do L293D
9 #define
velocPin 9 // Pino de Ativação 1 do L293D
10 #define
potPin 0 // Potenciômetro no pino analógico 0
11
12 int valorVeloc = 0; // Uma variável para armazenar o valor de velocidade atual
13
14 boolean leBotao(int porta); // Protótipo função que lê o botão.
15
16 boolean sentido = false; // Define o sentido de rotação do motor.
17
18 byte ledPin[] = {22, 23, 24, 25, 26, 27, 28}; // Cria um array para os
pinos dos LEDs.
19
20 void parada(float valorVeloc); // Protótipo função que controla a parada do motor.
21 void liga1(); // Protótipo função que liga o motor no sentido 1.
22 void liga2(); // Protótipo função que liga o motor no sentido 2.
23
24 void barraSinalVerm(float valorVeloc); // Protótipo função que liga a barra de intensidade vermelha.
25 void barraSinalVerd(float valorVeloc); // Protótipo função que liga a barra de intensidade verde.
26 void barraSinalBranc(); // Protótipo função que liga somente a luz branca
de parada.
27
28
29 void setup()
30 {
31 pinMode(botaoPin, INPUT_PULLUP); // Define o pino da chave como INPUT_PULLUP
32 pinMode(motorPin1, OUTPUT); // Define os pinos remanescentes como saída
33 pinMode(motorPin2, OUTPUT);
34 pinMode(velocPin, OUTPUT);
35
36 for(int i = 0; i < 7; i++) // Define pinos de saída
37 {
38 pinMode(ledPin[i], OUTPUT);
39
40 }
41 }
42
43 void loop()
44 {
45
46 valorVeloc = analogRead(potPin)/4; /* Lê o valor de
velocidade a partir do potenciômetro e converte para o intervalo de 0 a 255:
47 analogRead(potPin)/4 -->
48 Essa operação é necessária, pois o valor analógico irá de 0 (para
0 V) a 1023 (para 5
49 V). O valor que você deve escrever no pino do
transistor pode ir apenas de 0 a 255,
50 por isso você divide o valor do pino analógico 0 (1023, no máximo)
por 4, obtendo
51 um valor máximo de 255, atribuível ao pino digital 9 (utilizando
analogWrite, uma vez
52 que você está¡ usando PWM).
53 */
54
55 analogWrite(velocPin, valorVeloc); // Escreve a velocidade
para o pino de Ativação 1
56
57
58 if (leBotao(botaoPin)) /* Se
botão for apertado retorna true, se não for, retorna false. */
59 {
60 barraSinalBranc();
61 parada(valorVeloc);
62 sentido = !sentido;
63 }
64
65
66 if (sentido)
67 {
68 liga1();
69 barraSinalVerm(valorVeloc);
70 }
71 else
72 {
73 liga2();
74 barraSinalVerd(valorVeloc);
75 }
76
77 delay(20);
78 }
79
80 boolean leBotao(int porta)
81 {
82 static boolean estadoAnterior[14] = {true,true,true,true,true,true,true,true,true,true,true,true,true,true}; /* static --> para manter a variável na memória
83
o número 14 é porque exixte 14 portas
digitais no arduino uno,
84
(no mega 53)com isso pode-se itilisar essa função
para qualquer botão*/
85
86 boolean estadoBotao = digitalRead(porta);
87 boolean ligado = false;
88
89 if (!estadoBotao
&& estadoAnterior[porta]) /* Esse controle permite que, mesmo o botão
permanecendo apertado, vai ser considerado apenas uma vez.*/
90 {
91 ligado = true;
92 }
93
94 estadoAnterior[porta] = estadoBotao;
95
96 return ligado;
97 }
98
99 void parada(float valorVeloc)
100 {
101 int i, v;
102
103 v = int(valorVeloc);
104
105 for(i = v; i >= 0; i--)
106 {
107
analogWrite(velocPin, i); // Escreve a velocidade para o pino de Ativação 1
108
delay(20);
109 }
110 delay(2000);
111 }
112
113 void liga1() // Esta função liga o motor no sentido 1
114 {
115
digitalWrite(motorPin1, HIGH); // Define a Entrada 1 do L293D como baixa.
116
digitalWrite(motorPin2, LOW); // Define a Entrada 2 do L293D como alta.
117 }
118
119 void liga2() // Esta função liga o motor no sentido 2
120 {
121
digitalWrite(motorPin1, LOW); // Define a Entrada 1 do L293D como baixa.
122
digitalWrite(motorPin2, HIGH); // Define a Entrada 2 do L293D como alta.
123 }
124
125
126 void barraSinalVerm(float valorVeloc)
127 {
128 int valor;
129 valor = int(valorVeloc);
130
131 if(valor <= 25)
132 {
133
barraSinalBranc();
134 }
135
136
137 if((valor > 25)&&(valor) < 150)
138 {
139
digitalWrite(ledPin[0], HIGH);
140
digitalWrite(ledPin[1], LOW);
141
digitalWrite(ledPin[2], LOW);
142
digitalWrite(ledPin[3], LOW);
143 }
144
145 if((valor >=150)&&(valor) < 200)
146 {
147
digitalWrite(ledPin[0], HIGH);
148
digitalWrite(ledPin[1], HIGH);
149
digitalWrite(ledPin[2], LOW);
150
digitalWrite(ledPin[3], LOW);
151 }
152
153 if(valor >= 200)
154 {
155
digitalWrite(ledPin[0], HIGH);
156
digitalWrite(ledPin[1], HIGH);
157
digitalWrite(ledPin[2], HIGH);
158
digitalWrite(ledPin[3], LOW);
159 }
160 }
161
162 void barraSinalVerd(float valorVeloc)
163 {
164 int valor;
165 valor = int(valorVeloc);
166
167 if(valor <= 25)
168 {
169
barraSinalBranc();
170 }
171
172 if((valor > 25)&&(valor) < 150)
173 {
174
digitalWrite(ledPin[3], LOW);
175
digitalWrite(ledPin[4], HIGH);
176
digitalWrite(ledPin[5], LOW);
177
digitalWrite(ledPin[6], LOW);
178 }
179
180 if((valor >=150)&&(valor) < 200)
181 {
182
digitalWrite(ledPin[3], LOW);
183
digitalWrite(ledPin[4], HIGH);
184
digitalWrite(ledPin[5], HIGH);
185
digitalWrite(ledPin[6], LOW);
186 }
187
188 if(valor >= 200)
189 {
190
digitalWrite(ledPin[3], LOW);
191
digitalWrite(ledPin[4], HIGH);
192
digitalWrite(ledPin[5], HIGH);
193
digitalWrite(ledPin[6], HIGH);
194 }
195 }
196
197
198 void barraSinalBranc()
199 {
200
digitalWrite(ledPin[0], LOW);
201
digitalWrite(ledPin[1], LOW);
202
digitalWrite(ledPin[2], LOW);
203
digitalWrite(ledPin[3], HIGH);
204
digitalWrite(ledPin[4], LOW);
205
digitalWrite(ledPin[5], LOW);
206
digitalWrite(ledPin[6], LOW);
207 }
Com o programa carregado, pode-se verificar que: a velocidade de rotação é controlada por um potenciômetro e a inversão é controlada por um push button. A inversão quando requerida é controlada com decrescimento de velocidade até parar com a espera de 1.5 s para reiniciar na rotação invertida. O sinal luminoso com LEDs indica a intensidade de potência do motor numa direção de rotação através de uma cor, com outra direção em outra cor e quando parado, com indicação luminosa de outra cor no centro.
Nenhum comentário:
Postar um comentário