Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

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

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:

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:

Base Rotativa Controlada por Serial com Motor de Passo Arduino
Base Rotativa Controlada por Serial com Motor de Passo Arduino

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°
Base Rotativa Controlada por Serial com Motor de Passo Arduino

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

Base Rotativa Controlada por Serial com Motor de Passo Arduino

Processo de manufatura

  1. Motores de Passo: Tipos, Características e Aplicações Práticas
  2. Drivers Integrados Simplificam Design de Motores Stepper de Alta Potência
  3. Ventilador Controlado por Temperatura: Sistema DIY com Relé para Resfriamento de Móveis de Mídia
  4. Raspoulette: Protótipo de Sistema Autônomo de Porta de Galinheiro Alimentado por Energia Solar
  5. Torretas Sentry Nerf Autônomas DIY – Construa uma Arma Nerf Inteligente com Motores de Passo, Câmera e Arduino
  6. Biblioteca Completa para Motor de Passo Bipolar com Arduino
  7. Veículo Remoto Controlado por Android com Raspberry Pi e Motor Shield
  8. Deslizador Automático para Tinder e Bumble com Arduino UNO e Motor de Passo
  9. Entendendo Motores Lineares: Da Energia Elétrica ao Movimento Linear Preciso
  10. Motores Servo Explicados: Como Funcionam e Por Que Importam