Veremos agora uma maneira
interessante de aplicação do Processing com Arduino no controle de um Motor CC.
Para aqueles que ainda não conhecem o Processing, vide o outro artigo que
apresenta esse programa com mais detalhes.
Partindo para o projeto,
faremos o controle de um Motor CC pelo Processing onde aparecerá na tela barras
horizontais de distintas cores que permitirão o controle de potência
correspondente a 1/3, 2/3 e "Full Power" tanto avante quanto à Ré,
igual ao controle de um barco.
Componentes:
- 01 Arduino
- 01 Ponte H L298N
- 01 Motor CC de 5V
- 01 Fonte de alimentação externa de 5V até 12V
Após a montagem do circuito carregue o seguinte código no Arduino:
1 // Pinagem
no L298N
2 #
define enA 2
3 #
define MotorDireitoAvante 3 // IN1
4 #
define MotorDireitoAtras 4 // IN2
5
6 char direct;
7 int veloc;
8
9 void parada(char direct, int v); // Protótipo função parada
10
11 char anterior = 'A';
12
13 void setup()
14 {
15
16 pinMode(MotorDireitoAvante, OUTPUT);// IN1
17 pinMode(MotorDireitoAtras, OUTPUT); // IN2
18
19 Serial.begin(9600);
20 Serial.println(" Digite 'A' para direcao avante e 'R'
para direcao a Re ");
21 Serial.println(" Digite '1' para 1/3, '2' para 2/3, 3
para 'Full' de velocidade e 'P' para Parar ");
22
23 }
24
25 void loop()
26 {
27 if(Serial.available())
28 {
29 direct = Serial.read();
30 veloc
= Serial.parseInt();
31
32 if(direct == 'P' || direct == 'p')
33 {
34 parada(direct, veloc);
35 Serial.println(" Máquina parada ");
36 }
37
38 if(direct == 'A' || direct == 'a')
39 {
40 digitalWrite(MotorDireitoAvante, HIGH);// IN1
41 digitalWrite(MotorDireitoAtras, LOW); // IN2
42 if(anterior == 'R' || anterior == 'r')
43 {
44 parada(direct, veloc);
45 delay(1000);
46
47 }
48 anterior = 'A';
49 analogWrite(enA, veloc*85);
50 }
51
52 if(direct == 'R' || direct == 'r')
53 {
54 digitalWrite(MotorDireitoAvante, LOW); // IN2
55 digitalWrite(MotorDireitoAtras, HIGH); // IN1
56
57 if(anterior == 'A' || anterior == 'a')
58 {
59 parada(direct, veloc);
60 delay(1000);
61 }
62
63 anterior = 'R';
64 analogWrite(enA, veloc*85);
65 }
66
67 Serial.print(direct);
68 Serial.print(" direcao ");
69 Serial.print(veloc);
70 Serial.print(" de velocidade ");
71 Serial.println(" ");
72 }
73
74 }
75
76 void parada(char direct, int v)
77 {
78 if(direct == 'A' || direct == 'a')
79 {
80 for(int i=0; i<= v ; i++)
81 {
82 analogWrite(enA, v-i);
83 delay(20);
84 }
85
86 }
87 if(direct == 'R' || direct == 'r')
88 {
89 for(int i=0; i<= v ; i++)
90 {
91 analogWrite(enA, v-i);
92 delay(20);
93 }
94 }
95 if(direct == 'P' || direct == 'p')
96 {
97 digitalWrite(MotorDireitoAvante, LOW); // IN1
98 digitalWrite(MotorDireitoAtras, LOW); // IN2
99 delay(20);
100 }
101
102 }
103
Após carregar o programa no Arduino, pelo Monitor Serial, conseguimos controlar o Motor pelos comandos:
- "A1", "A2" e "A3" para 1/3, 2/3 e "Full Power" avante;
- "R1", "R2" e "R3" para 1/3, 2/3 e "Full Power" à Ré e;
- "P" Motor parado.
1
2 // Importa bibliotecas para Serial
3 import processing.serial.*;
4 Serial port; // Inicia instância de
porta serial
5 void setup()
6 {
7 // Define tamanho da janela
8 size(800, 640);
9 // Inicia porta serial na COM4 a 9600 bauds
10 port = new Serial(this, "COM4", 9600);
11 }
12 void draw()
13 {
14 // Enquanto receber algo pela serial
15 if (port.available() > 0)
16 {
17 // Exibe a resposta do Arduino
18 int byteRecebido = port.read();
19 // Converte valor inteiro para char (typecasting)
20 char byteLegivel = (char) byteRecebido;
21 print(byteLegivel);
22 }
23 // Desenha botões na tela
24 desenhaBotao();
25 }
26 // Função que desenha botões na tela
27 void desenhaBotao()
28 {
29 background(255); // Define o fundo branco
30
31 fill(#1d1d4d);
32 rect(200, 30, 400, 60); // Botão 1
33
34 fill(#4444b2);
35 rect(200, 110, 400, 60);
36
37 fill(#9797f9);
38 rect(200, 190, 400, 60);
39
40 fill(#000000);
41 rect(200, 270, 400, 60);
42
43 fill(#fcff00);
44 rect(200, 350, 400, 60);
45
46 fill(#ff9600);
47 rect(200, 430, 400, 60);
48
49 fill(#8a0000);
50 rect(200, 510, 400, 60);
51
52
53 }
54 // Verifica se clicou no botão um
55 boolean botaoUm()
56 {
57 if (mouseX > 200 && mouseX < 200 + 400
58 && mouseY > 30 && mouseY < 30 + 60)
59 {
60 return true;
61 }
62 else
63 {
64 return false;
65 }
66 }
67 // Verifica se clicou no botão dois
68 boolean botaoDois()
69 {
70 if (mouseX > 200 && mouseX < 200 + 400
71 && mouseY > 110 && mouseY < 110 + 60)
72 {
73 return true;
74 }
75 else
76 {
77 return false;
78 }
79 }
80 // Verifica se clicou no botão três
81 boolean botaoTres()
82 {
83 if (mouseX > 200 && mouseX < 200 + 400
84 && mouseY > 190 && mouseY < 190 + 60)
85 {
86 return true;
87 }
88 else
89 {
90 return false;
91 }
92 }
93 // Verifica se clicou no botão quatro
94 boolean botaoQuatro()
95 {
96 if (mouseX > 200 && mouseX < 200 + 400
97 && mouseY > 270 && mouseY < 270 + 60)
98 {
99 return true;
100 }
101 else
102 {
103 return false;
104 }
105 }
106
107 // Verifica se clicou no botão cinco
108 boolean
botaoCinco()
109 {
110 if (mouseX > 200 && mouseX < 200 + 400
111
&& mouseY > 350 && mouseY < 350 + 60)
112 {
113 return true;
114 }
115 else
116 {
117 return false;
118 }
119 }
120 // Verifica se clicou no botão seis
121 boolean
botaoSeis()
122 {
123 if (mouseX > 200 && mouseX < 200 + 400
124
&& mouseY > 430 && mouseY < 430 + 60)
125 {
126 return true;
127 }
128 else
129 {
130 return false;
131 }
132 }
133
134 // Verifica se clicou no botão sete
135 boolean
botaoSete()
136 {
137 if (mouseX > 200 && mouseX < 200 + 400
138
&& mouseY > 510 && mouseY < 510 + 60)
139 {
140 return true;
141 }
142 else
143 {
144 return false;
145 }
146 }
147
148 // Quando o mouse é clicado, o Processig chama esta
função
149 void mousePressed()
150 {
151 println(" ");
152 println("Coordenada
x: " + mouseX + " e y:
" + mouseY);
153 if (botaoUm())
154 {
155
println("Clicou
no botao Adiante Full! ");
156 // Envia código A3 para Arduino
157
port.write('A');
158
port.write('3');
159
println("Enviado
codigo A1");
160 }
161
162 if (botaoDois())
163 {
164
println("Clicou
no botao Adiante 2/3 ");
165 // Envia código A2 para Arduino
166
port.write('A');
167
port.write('2');
168
println("Enviado
codigo A2");
169 }
170 if (botaoTres())
171 {
172
println("Clicou
no botao Adiante 1/3 ");
173
println("Enviado
codigo A1");
174 // Envia código A1 para Arduino
175
port.write('A');
176
port.write('1');
177 }
178
179 if (botaoQuatro())
180 {
181
println("Clicou
no botao de Maquina Parada! ");
182 // Envia código P para Arduino
183
port.write('P');
184
println("Enviado
codigo P");
185 }
186
187 if (botaoCinco())
188 {
189
println("Clicou
no botao Atras 1/3 ");
190 // Envia código R1 para Arduino
191
port.write('R');
192
port.write('1');
193
println("Enviado
codigo R1");
194 }
195 if (botaoSeis())
196 {
197
println("Clicou
no botao Atras 2/3 ");
198 // Envia código R2 para Arduino
199
port.write('R');
200
port.write('2');
201
println("Enviado
codigo R2");
202 }
203
204 if (botaoSete())
205 {
206
println("Clicou
no botao Atras FULL! ");
207 // Envia código R3 para Arduino
208
port.write('R');
209
port.write('3');
210
println("Enviado
codigo R3");
211 }
212
213 }
Depois de executar esse programa, aparece uma tela
com retângulos coloridos, onde a faixa azul corresponde a direção avante; a
outra faixa, com amarelo, laranja e vermelho, a direção à ré e, então, o
retângulo preto corresponde ao motor parado.
Com isso, quando pressionamos em cada retângulo, obtemos as correspondentes direção e potência desejadas de uma maneira simples e rápida somente com um clique sem precisar digitar nada.
Com isso, quando pressionamos em cada retângulo, obtemos as correspondentes direção e potência desejadas de uma maneira simples e rápida somente com um clique sem precisar digitar nada.