Esta página mostra dois exemplos de como ativar um motor de passo unipolar. Esse tipo de motor pode ser encontrado em unidades antigas de disquetes e são fáceis de controlar. O exemplar que utilizamos tem cinco conectores, sendo um a alimentação (VCC) e os demais, usados para acionar o motor mediante o envio de sinais sincronizados.
O primeiro código é um exemplo de como fazer o motor girar em um sentido. É destinado aos praticantes que não têm nenhum conhecimento de como controlar motores de passo. O segundo exemplo é mais complexo, mas permite que o motor gire a velocidades diferentes, nos dois sentidos, e controlável com um potenciômetro.
Precisamos de um potenciômetro de 10 kohms, que conectamos a uma entrada analógica, e um chip ULN2003A. Este último tem muitos transístores embutidos dentro de um único componente e servem para fornecer correntes elétricas muito maiores do que as que o chip Atmega do Arduino pode oferecer.
Fotografia de um protoboard com o potenciômetro e o ULN2003A
/* Motor de passo Copal * -------------------- * * Programa para acionar um motor de passo proveniente de * um drive de disquete de 5'25 * De acordo com a documentação encontrada, este motor: * "[...] motor * made by Copal Electronics, with 1.8 degrees per step and 96 ohms * per winding, with center taps brought out to separate leads [...]" * [https://www.cs.uiowa.edu/~jones/step/example.html] * * Trata-se de um motor de passo unipolar com 5 fios: * * - vermelho: alimentação, 5V pareceu-me bem * - laranja e preto: bobina 1 * - marrom e amarelo: bobina 2 * * (cleft) 2005 DojoDave para o K3 * https://www.0j0.org | http://arduino.berlios.de * * @author: David Cuartielles * @date: 20 Out 2005 */ int motorPin1 = 8; int motorPin2 = 9; int motorPin3 = 10; int motorPin4 = 11; int delayTime = 500; void setup() { pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); } void loop() { digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(delayTime); }
/* Motor de passo unipolar avançado * -------------------------------- * * Programa para acionar um motor de passo proveniente de * um drive de disquete de 5'25 * De acordo com a documentação encontrada, este motor: * "[...] motor * made by Copal Electronics, with 1.8 degrees per step and 96 ohms * per winding, with center taps brought out to separate leads [...]" * [https://www.cs.uiowa.edu/~jones/step/example.html] * * Trata-se de um motor de passo unipolar com 5 fios: * * - vermelho: alimentação, 5V pareceu-me bem * - laranja e preto: bobina 1 * - marrom e amarelo: bobina 2 * * (cleft) 2005 DojoDave for K3 * https://www.0j0.org | http://arduino.berlios.de * * @author: David Cuartielles * @date: 20 Out 2005 */ int motorPins[] = {8, 9, 10, 11}; int count = 0; int count2 = 0; int delayTime = 500; int val = 0; void setup() { for (count = 0; count < 4; count++) { pinMode(motorPins[count], OUTPUT); } } void moveForward() { if ((count2 == 0) || (count2 == 1)) { count2 = 16; } count2>>=1; for (count = 3; count >= 0; count--) { digitalWrite(motorPins[count], count2>>count&0x01); } delay(delayTime); } void moveBackward() { if ((count2 == 0) || (count2 == 1)) { count2 = 16; } count2>>=1; for (count = 3; count >= 0; count--) { digitalWrite(motorPins[3 - count], count2>>count&0x01); } delay(delayTime); } void loop() { val = analogRead(0); if (val > 540) { // quanto maior o valor no potenciômetro, mais rápido delayTime = 2048 - 1024 * val / 512 + 1; moveForward(); } else if (val < 480) { // quanto menor o valor no potenciômetro, mais devagar delayTime = 1024 * val / 512 + 1; moveBackward(); } else { delayTime = 1024; } }