Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

domingo, 15 de junho de 2014

Usando L398 breaks para controlar motores de passo II

Para ler um pouco mais sobre a teoria desse assunto, aqui o datasheet do L298, coração da nossa plaquinha e aqui uma documentação a respeito da própria placa.

Abaixo, um exemplo simples de software para acionar um motor de passo conectado ao break conforme mostrado no esquema do primeiro post:
int IN1=2;
int IN2=3;
int IN3=4;
int IN4=5;
int ENB=6; // Obs: a placa que eu usei usa jumpers como enable, 
int ENA=7; // então nem precisaria de usar esses pinos.
           // Esse fonte abaixo funciona para os dois tipos de placa.

void setup() {
 pinMode(ENA,OUTPUT);
 pinMode(ENB,OUTPUT);
 pinMode(IN1,OUTPUT);
 pinMode(IN2,OUTPUT);
 pinMode(IN3,OUTPUT);
 pinMode(IN4,OUTPUT);
 digitalWrite(ENA,HIGH);
 digitalWrite(ENB,HIGH);
}

void loop(){
 // O sistema vai acionando as bobinas de maneira 
 // a promover o giro do rotor.
 // O intervalo de 30 milissegundos é necessário 
 // para que o rotor gire. Quanto menor,
 // mais rápido o motor gira, até que ele para de 
 // girar e começa a vibrar. Esse é o limite de
 // velocidade para esse tipo de placa controladora, 
 // e depende de cada motor.
 digitalWrite(IN1,LOW);
 digitalWrite(IN2,HIGH);
 digitalWrite(IN3,HIGH);
 digitalWrite(IN4,LOW);
 delay(30);
 digitalWrite(IN1,LOW);
 digitalWrite(IN2,HIGH);
 digitalWrite(IN3,LOW);
 digitalWrite(IN4,HIGH);
 delay(30);
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,LOW);
 digitalWrite(IN3,LOW);
 digitalWrite(IN4,HIGH);
 delay(30);
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,LOW);
 digitalWrite(IN3,HIGH);
 digitalWrite(IN4,LOW);
 delay(30);
}

Existe uma biblioteca pronta para controle desse tipo de motor. Ela é interessante porque permite o controle do motor sem ter que dar delay, como a gente faz acima. O programa acima funciona apenas se a única coisa a fazer é acionar o motor, o que quase nunca é o caso. Ao usar a AccelStepper, vc aciona o motor e ele fica acionado enquanto o sistema está fazendo outras coisas.

Abaixo, um exemplo muito simples do uso do mesmo circuito, agora comandado por essa lib.

// ConstantSpeed.pde
// -*- mode: C++ -*-
//
// Shows how to run AccelStepper in the simplest,
// fixed speed mode with no accelerations
/// \author  Mike McCauley (mikem@open.com.au)
// Copyright (C) 2009 Mike McCauley
// $Id: ConstantSpeed.pde,v 1.1 2011/01/05 01:51:01 mikem Exp mikem $

#include <AccelStepper.h>

AccelStepper stepper; 
// Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5

void setup()
{ 
   stepper.setMaxSpeed(600);
   stepper.setSpeed(400);
}

void loop()
{ 
   stepper.runSpeed();
}

É isso. Abracadabraço!