Páginas

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.