Controle de um Motor CC pelo Processing


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
Monte o circuito conforme o esquema abaixo: 

Controle de um Motor CC pelo Processing

Após a montagem do circuito carregue o seguinte  código no Arduino:


  // 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.
Abra o Processing e escreva o seguinte código:

  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.