Base Rotativa Controlada por Serial com Motor de Passo Arduino
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Motor de passo 28BYJ48 | 1 |
| Driver de motor de passo X113647 | 1 |
| Cubo de montagem universal Pololu para eixo de 5mm | 1 |
| Arduino UNO | 1 |
| Base de madeira 15cm x 15cm | 1 |
| Pés de borracha | 4 |
Ferramentas e Máquinas Necessárias
- Serra tico-tico
- Furadeira com broca de 6mm para madeira
Sobre o Projeto
História completa aqui: https://www.cesarebrizio.it/Arduino/Turntable.html
Este projeto é sobre uma plataforma rotativa baseada em um motor de passo.
O modelo do motor de passo é 28BYJ48, controlado via driver X113647 (baseado no CI ULN2003A) normalmente comprado junto com o motor.
A plataforma pode girar em ambas as direções e é controlada via monitor serial ou Tera Term.
Os seguintes comandos são implementados:
- R = Girar no sentido horário continuamente (várias voltas)
- r = Girar 360° no sentido horário
- L = Girar no sentido anti-horário continuamente (várias voltas)
- l = Girar 360° no sentido anti-horário
- S = Parar rotação
Do ponto de vista mecânico, a montagem é muito simples: apenas um quadrado de compensado ou material similar, cerca de 15cm x 15cm, é necessário para a mesa base.
O centro da mesa será encontrado no cruzamento das diagonais - um furo de 6mm será perfurado exatamente nesse ponto.
O cubo do motor de passo é descentrado: ao encaixar o cubo no furo de 6mm, o contorno do motor pode ser desenhado com lápis.
Em seguida, um furo redondo o mais justo possível ao redor do contorno do motor será cortado com a serra tico-tico, de modo que os dois furos de fixação do motor fiquem firmemente sobre a madeira da mesa, para que possam ser usados para fixar o motor à mesa.
Almofadas de borracha de 10mm de altura são necessárias para permitir o espaçamento necessário (o motor ficará um pouco abaixo da mesa).
A placa rotativa será fixada ao motor graças ao Cubo de Montagem Universal Pololu para Eixo de 5mm.
Fontes de informação:
- Controle de motor de passo pequeno: https://arduino-info.wikispaces.com/SmallSteppers
Na verdade, usei 4 pinos diferentes, mas a ilustração do circuito abaixo reproduz fielmente as conexões. Olhando para a foto acima (fio vermelho do Arduino substitui "Rosa"):
#define motorPin1 4 // Azul - pino 1 do 28BYJ-48
#define motorPin2 5 // Rosa - pino 2 do 28BYJ-48
#define motorPin3 6 // Amarelo - pino 3 do 28BYJ-48
#define motorPin4 7 // Laranja - pino 4 do 28BYJ-48
// Vermelho - pino 5 do 28BYJ-48 (VCC)
// Azul - pino GND do 28BYJ-48
#define STEPS_PER_TURN 2048 // número de passos em 360°
Código
Sketch Completo no Arduino
Uma descrição completa do software com comentários
/* Base rotativa baseada em motor de passo controlada por diálogo serial
Circuito e comentários: Veja https://www.cesarebrizio.it/Arduino/Turntable.html
Circuito conforme ilustrado aqui: https://www.tdegypt.com/wp-content/uploads/2017/08/stepper-motor-wiring.png
a única exceção sendo que o sketch usa saídas digitais 4 - 5 - 6 - 7 enquanto o diagrama Fritzing
criado 23 Dez 2017
modificado ---- por Cesare Brizio
Este código de exemplo é de domínio público.
Este sketch controla uma plataforma rotativa baseada em motor de passo.
Modelo do motor de passo é 28BYJ48, controlado via Driver de Motor de Passo X113647 (baseado no CI ULN2003A) normalmente comprado com o motor.
A plataforma pode girar em ambas as direções e é controlada via Monitor Serial ou Tera Term.
Os seguintes comandos são implementados:
R = rotação contínua no sentido horário
r = rotação de 360° no sentido horário
L = rotação contínua no sentido anti-horário
l = rotação de 360° no sentido anti-horário
S = parar rotação
Fontes de informação:
Controle de motor de passo pequeno: https://arduino-info.wikispaces.com/SmallSteppers
*/
/*-----( Importar bibliotecas necessárias )-----*/
#include <AccelStepper.h>
/*-----( Declarar Constantes e Números de Pinos )-----*/
/* NUNCA COLOQUE ; APÓS UMA DECLARAÇÃO #define!!!! */
// pinos do motor
#define motorPin1 4 // Azul - pino 1 do 28BYJ-48
#define motorPin2 5 // Rosa - pino 2 do 28BYJ-48
#define motorPin3 6 // Amarelo - pino 3 do 28BYJ-48
#define motorPin4 7 // Laranja - pino 4 do 28BYJ-48
// Vermelho - pino 5 do 28BYJ-48 (VCC)
// Azul - pino GND do 28BYJ-48
#define STEPS_PER_TURN 2048 // número de passos em 360°
int motorSpeed = 500; // Velocidades altas (800 ou mais) podem causar comportamento errático no 28BYJ-48
int motorAccel = 400; // Como acima: melhor evitar acelerações extremas
int myPos = 0; // será usado para definir ponto de partida para rotações de 360°
int LeftTurnUp = 0; // Flags para determinar direção de rotação
int RightTurnDown = 0; // Flags para determinar direção de rotação
int Continuous = 0; // usado abaixo para discriminar comandos de rotação única
int incomingByte = 0; // para dados seriais recebidos
/*-----( Objetos para controle do stepper )-----*/
// Configura o stepper como 4 fios bipolar nos pinos 4,5,6,7
// NOTA: A sequência 1-3-2-4 é necessária para sequenciamento adequado do 28BYJ48
AccelStepper stepper(4,motorPin1,motorPin3,motorPin2,motorPin4);
void setup() {
Serial.begin(9600);
stepper.setMinPulseWidth(20); // Configuração aconselhável para evitar que pulsos do Arduino
// sejam rápidos demais para serem decodificados
stepper.setMaxSpeed(motorSpeed);
stepper.setSpeed(motorSpeed);
stepper.setAcceleration(motorAccel);
// as duas linhas a seguir resetam "passo zero" para a posição atual
stepper.setCurrentPosition(stepper.currentPosition());
stepper.runToPosition();
Serial.println("Comandos disponíveis:");
Serial.println("R = rotação contínua no sentido horário");
Serial.println("r = rotação de 360° no sentido horário");
Serial.println("L = rotação contínua no sentido anti-horário");
Serial.println("l = rotação de 360° no sentido anti-horário");
Serial.println("S = parar rotação");
}
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read();
{
if (incomingByte == 'R') {
Serial.println("recebido «R» - ativando rotação contínua no sentido horário");
// As duas linhas a seguir permitem enviar comandos em qualquer sequência:
// antes da execução, uma parada rápida é realizada
stepper.stop(); // Para o mais rápido possível: define novo alvo
stepper.runToPosition(); // Agora parado após parada rápida
// O seguinte par de flags determina direção de rotação
LeftTurnUp = 1; RightTurnDown = 0;
Continuous = 1; // usado abaixo para discriminar comandos de rotação única
stepper.setCurrentPosition(stepper.currentPosition()); // Define passo 0 "aqui"
stepper.setSpeed(motorSpeed); // Comandos anteriores resetaram a velocidade
}
if (incomingByte == 'L') {
Serial.println("recebido «L» - ativando rotação contínua no sentido anti-horário");
stepper.stop();
stepper.runToPosition();
RightTurnDown = 1; LeftTurnUp = 0;
Continuous = 1;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
}
if (incomingByte == 'r') {
Serial.println("recebido «r» - ativando rotação única no sentido horário");
stepper.stop();
stepper.runToPosition();
LeftTurnUp = 1; RightTurnDown = 0;
Continuous = 0;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
// Como terei que avançar 2047 passos, armazeno minha posição atual
// como ponto de partida da rotação
myPos=stepper.currentPosition();
}
if (incomingByte == 'l') {
Serial.println("recebido «l» - ativando rotação única no sentido anti-horário");
stepper.stop();
stepper.runToPosition();
RightTurnDown = 1; LeftTurnUp = 0;
Continuous = 0;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
myPos=stepper.currentPosition();
}
if (incomingByte == 'S') {
Serial.println("recebido «S» - parando rotação");
// Reseta flags que determinam direção de rotação
LeftTurnUp = 0; RightTurnDown = 0;
stepper.stop();
stepper.runToPosition();
}
}
}
if (Continuous == 1) // rotação contínua
{
if (LeftTurnUp == 1) //virar à esquerda
{
stepper.moveTo(10000); //move muitos passos - mais que o necessário mecanicamente
}
if (RightTurnDown == 1) //virar à direita
{
stepper.moveTo(-10000); //move muitos passos - mais que o necessário mecanicamente
}
stepper.run();
}
if (Continuous == 0) // rotação contínua (na verdade rotação única)
{
if (LeftTurnUp == 1) //virar à esquerda
{
stepper.moveTo(myPos+STEPS_PER_TURN); // 1 volta = 2048 passos
}
if (RightTurnDown == 1) //virar à direita
{
stepper.moveTo(myPos-STEPS_PER_TURN); // 1 volta = 2048 passos
}
}
stepper.run();
}
Esquemáticos
O circuito completo feito no Fritzing
Processo de manufatura
- Motores de Passo: Tipos, Características e Aplicações Práticas
- Drivers Integrados Simplificam Design de Motores Stepper de Alta Potência
- Ventilador Controlado por Temperatura: Sistema DIY com Relé para Resfriamento de Móveis de Mídia
- Raspoulette: Protótipo de Sistema Autônomo de Porta de Galinheiro Alimentado por Energia Solar
- Torretas Sentry Nerf Autônomas DIY – Construa uma Arma Nerf Inteligente com Motores de Passo, Câmera e Arduino
- Biblioteca Completa para Motor de Passo Bipolar com Arduino
- Veículo Remoto Controlado por Android com Raspberry Pi e Motor Shield
- Deslizador Automático para Tinder e Bumble com Arduino UNO e Motor de Passo
- Entendendo Motores Lineares: Da Energia Elétrica ao Movimento Linear Preciso
- Motores Servo Explicados: Como Funcionam e Por Que Importam