Controle Simples de um Motor CC

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

Controle Simples de um Motor CC

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