Guia CNC Brasil - Tudo sobre CNC, Router, Laser, Torno e 3D Print
ELETRÔNICA / ELÉTRICA => Eletrônica Básica => Programação => Tópico iniciado por: sombravarvas em 28 de Outubro de 2016, 13:09
-
Olá pessoal, sou extremamente iniciante em Arduíno e programação.
Eu estou iniciando um projeto para automatizar uma fresadora.
será apenas 1 motor
já que o processo da fresadora é fazer com que a mesa dela se movimente apenas no sentido de ida e volta.
Os produtos que já possuo são o seguinte.
1 Arduino Uno
1 Motor Nema 23 19kgf cm 4.2A (8Fios)
1 Drive TB6600 (hy-div268n-5A)
2 Crash Sensor (botões de fim de curso)
1 Push button (botão iniciar o processo)
A ligação do motor fiz em séria buscando mais Torque do que velocidade.
As conexões estão feitas, tudo ok.
O que eu estou quebrando a cabeça agora é na programação;
O que eu desejo que aconteça é o seguinte.
Ao pressionar o Botão quero que o Motor gire sentido horário, até tocar o fim de curso.
Ao tocar o crash sensor(fim de curso) ele deve girar no sentido anti-horário, até que o outro crash sensor (Inicio de curso) seja alcançado, e ficar parado até que o Puch Buttom (botão iniciar) seja pressionado.
Segue o código que tenho até o momento.
//Arduino Sketch based on easy driver
int dirpin = 8;
int steppin = 9;
int enable = 7;
int sensorFinal = 3;
int sensorInicial = 5;
void setup()
{
pinMode(dirpin, OUTPUT);
pinMode(steppin, OUTPUT);
digitalWrite(enable, LOW);
pinMode(sensorFinal, INPUT);
pinMode(sensorInicial, INPUT);
}
void loop()
{
int i;
int sensor = digitalRead(sensorFinal);
if (sensor == HIGH) {
digitalWrite(dirpin, HIGH); // Set the direction.
}else{
digitalWrite(dirpin, LOW); // Set the direction.
}
delay(1);
for (i = 0; i<1; i++) // Iterate for 4000 microsteps.
{
digitalWrite(steppin, LOW); // This LOW to HIGH change is what creates the "Rising Edge" so the easydriver knows to when to step.
delayMicroseconds(2);
digitalWrite(steppin, HIGH);
delayMicroseconds(200); // This delay time is close to top speed for this
} // particular motor. Any faster the motor stalls.
}
Desa forma o motor só gira no sentido anti-horário enquanto o fim de curso estiver pressionado.
-
Imagem dos equipamentos
Esqueci de mencionar que o motor esta sendo alimentado por uma fonte de 24v 5A - 120W.
(http://i40.photobucket.com/albums/e203/sombrars/B89592DB-FAB1-40BE-A189-782D0152808D.jpg)
-
O que eu desejo que aconteça é o seguinte.
Ao pressionar o Botão quero que o Motor gire sentido horário, até tocar o fim de curso.
Ao tocar o crash sensor(fim de curso) ele deve girar no sentido anti-horário, até que o outro crash sensor (Inicio de curso) seja alcançado, e ficar parado até que o Puch Buttom (botão iniciar) seja pressionado.
Simples: :)
If (digitalRead(botao) == HIGH) //Se o botão for apertado executara as funções abaixo
{
digitalWrite(pino_direcao,HIGH); // Seleciona direção do motor
While (digitalRead(fim_de_curso1)==LOW) //Enquanto o fim de curso 1 não for acionado
{
digitalWrite(pino_passo,HIGH);
DelayMicroseconds(5);
digitalWrite(pino_passo,LOW); // Move o motor de passo
DelayMicroseconds(300); // Define a velocidade
}
digitalWrite(pino_direcao,LOW); // Inverte a direção
While (digitalRead(fim_de_curso2)==LOW) //Enquanto o fim de curso2 não for acionado
{
digitalWrite(pino_passo,HIGH);
DelayMicroseconds(5);
digitalWrite(pino_passo,LOW); // Move o motor de passo
DelayMicroseconds(300); // Define a velocidade
}
}
-
Cássio, muito obrigado pela resposta.
Pesquisei sobre while, acredito que seja esse o caminho que tenho que seguir.
Mas não consegui fazer funcionar na pratica nem com o seu código e nem colocando somente 1 while
void loop() {
digitalWrite(dirpin, HIGH); // Seleciona a direção do motor
while (digitalRead(sensorFinal)==LOW) //Enquanto o fim de curso 1 nao for acionado
{
digitalWrite(steppin, LOW); // This LOW to HIGH change is what creates the "Rising Edge" so the easydriver knows to when to step.
delayMicroseconds(2);
digitalWrite(steppin, HIGH);
delayMicroseconds(200); // This delay time is close to top speed for this
}
}
-
O motor simplesmente não gira com o while.
e ao tocar o sensor final ele da um passo em diferences posições
se eu substituir pelo código antigo com o FOR
ele gira normalmente.
-
Bem eu pesquisei e encontrei a biblioteca AccelStepper
Achei mais fácil de utilizar até
consegui configurar o botão que ao clicar o motor gira no sentido horário até que o sensor de fim de curso seja acionado.
só não consegui ainda fazer com que ao acionar o sensor de fim de curso, ele inverta o sentido de giro até atingir o sensor de inicio de curso.
#include <AccelStepper.h>
// Define a stepper motor 1 for arduino
// Pino de direçao Digital 8 (CW), Pino de pulso DIgital 9 (CLK)
AccelStepper stepper(1, 9, 8);
void setup()
{
pinMode(sensorInicial, INPUT);
pinMode(sensorFinal, INPUT);
pinMode(botaoIniciar, INPUT);
Serial.begin(9600);
// Change these to suit your stepper if you want
stepper.setMaxSpeed(2000);//1100
stepper.setAcceleration(1100);
//stepper.moveTo(2000); // se vividir esse valor por 200 é a quantidade de 20 voltas.
//stepper.setSpeed(2000);
}
void loop()
{
if (digitalRead(botaoIniciar)==LOW)
{
while (digitalRead(sensorFinal)==HIGH){
stepper.move(200); //nao importa o valor que eu coloque ele vai girar até que o sensor de fim de curso seja acionado.
stepper.run();
}
}
}
-
O motor simplesmente não gira com o while.
e ao tocar o sensor final ele da um passo em diferences posições
se eu substituir pelo código antigo com o FOR
ele gira normalmente.
Claro que gira.
Ele esta realmente entrando no "while" use um "serialprint" só pra garantir que esta entrando em while.
Usa um resistor de pull-down nos botões.