Olá a todos.
É possível criar limites para um motor de passo sem chave de fim de curso, só com programação e Lib AccelStepper?
Fernando
Tags:
Desde q vc garanta, que sempre q for usar ele esteja na posição inicial, você não precisa de final de curso, o final de curso, é para haver uma "inicialização" para a posição inicial
O que tem de errado neste código?
#include <AccelStepper.h>
#define HALFSTEP 4
// Motor pin definitions
#define motorPin1 4 // IN1 on the ULN2003 driver 1
#define motorPin2 5 // IN2 on the ULN2003 driver 1
#define motorPin3 6 // IN3 on the ULN2003 driver 1
#define motorPin4 7 // IN4 on the ULN2003 driver 1
// Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48
AccelStepper stepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
// Define a stepper and the pins it will use
long PosicaoMax = 700;
long PosicaoMin = 0;
long NovaPosicao =0;
long PosicaoAtual = stepper.currentPosition();
long steps = 0;
void setup()
{
stepper.setMaxSpeed(2000);
stepper.setAcceleration(1000); // 200, 500, 1000, 1500
stepper.setSpeed(200);
Serial.begin(9600);
Serial.println(PosicaoAtual);
}
void loop(){
digitalWrite(4, LOW); // zera saidas
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
NovaPosicao = 0;
if (Serial.available() > 0) {
steps = Serial.parseInt();
if (steps < PosicaoMin) { // Se steps é negativo
if ((steps + PosicaoAtual) < PosicaoMin) { // Se
NovaPosicao = (PosicaoMin - (steps) - PosicaoAtual);
} else {
NovaPosicao = steps + PosicaoAtual;
}
}else if ((steps + PosicaoAtual) > PosicaoMax) { // Se steps + PosicaoAtual utrapassa o fim
NovaPosicao = (steps = steps = ((PosicaoMax - steps) - PosicaoAtual));
}else {
NovaPosicao = (steps + PosicaoAtual);
}
stepper.runToNewPosition(NovaPosicao);
Serial.println(" PosicaoAtual : ");
PosicaoAtual = stepper.currentPosition();
Serial.print(PosicaoAtual);
Serial.println();
}
}
Oi FCaldeira, boa tarde,
Parece-me que o erro é ocasionada pela linha n. 10.
Lá voce chama uma função da biblioteca AccelStepper, fora de uma função do sketch.
(AccelStepper stepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);)
Não sou muito conhecedor do Arduino, mas acho que é está em local indevido.
Parece-me que voce tem que coloca-la dentro de uma funcão.
Rui
Oi FCaldeira,
Disconsidere o meu post anterior.
Eu não estava conseguindo compilar o seu sketch pois ao instalar a biblioteca AccelStepper, ela criou uma pasta AccelStepper dentro de outra pasta AccelStepper.
Voce pergunta "o que tem de errado neste código", porque? Dá erro ao compilar ou não gira corretamente o steppmotor.
Se for na compilação, verifica se não tem 2 pastas no diretótio libraries.
Rui
Oi Rui
Obrigado pela atenção.
O problema está na tentativa de criar limites para o motor de passo.
Como esta ai:
long PosicaoMax = 700;
long PosicaoMin = 0;
long NovaPosicao =0;
long PosicaoAtual = stepper.currentPosition();
Na rotina de criar limites.
Pela serial pode ser digitado (steps) valores positivos e negativos (sentido horário ou anti-horário).
steps = Serial.parseInt();
O motor de passo não pode ultrapassar nem o "0" nem o "700".
A rotina e aonde está o problema.
Agradeço mais uma fez quem poder ajudar.
Fernando.
Se o que dissestes...
posiçãoatual = 100
digitado= -60
Se a nova posição e o valor onde vai ficar, este codigo deve funcionar...
if (Serial.available() > 0) {
steps = Serial.parseInt();
if (steps < PosicaoMin) { // Se steps é negativo
if ((steps + PosicaoAtual) <= PosicaoMin) { // Se
NovaPosicao = PosicaoMin;
} else {
NovaPosicao = steps + PosicaoAtual;
}
}else if ((steps + PosicaoAtual) > PosicaoMax) { // Se steps + PosicaoAtual utrapassa o fim
NovaPosicao = PosicaoMax;
}else {
NovaPosicao = (steps + PosicaoAtual);
}
Boa tarde.
Agradeço a vcs (Pedro e Rui), vou testar.
Depois informo sobre meu avanço.
Quem quiser informações sobre protocolos Pelco D e arduino, tenho algumas informações
Grato,
Fernando
Oi Fernando,
Eu trabalhei mais com Hw do que com Sw, e qdo envolvi com microcontroladores usei mais a turma do PIC.
Devido à necessidade de um amigo eu estou aprendendo Arduino, e tenho algumas dúvidas, principalmente das sintaxes.
No seu código, na linha 55 voce escreveu : NovaPosicao = (steps = steps = ((PosicaoMax - steps) - PosicaoAtual));
Fiquei curioso e gostaria de aprender sobre o uso de uma "igualada" 2 vezes : "(steps = steps = ".
Outra pergunta, qdo o seu step chega na posicão 700, e voce manda andar um pouco, digamos +5, aí voce quer que ele volte 5 posiçoes ou fique parado no 700, o mesmo vale para a posição 0, qdo voce diz -5, ele deve ficar em 0 ou avançar 5 posiçoes?
Desde já obrigado.
Rui
Bom dia amigos.
Tudo ok testado, deu certo, realmente tinha uma parte da logica que NÂO tinha logica, rsrs
Estou partindo agora para gravar na EEPROM a ultima posição do motor de passo.
Já tenho um rotina testada de gravação e leitura na memoria. Vou incluir no controle do motor.
Ao amigo Rui, ali era o parte do erro da logica.
Alguém usa aqueles motores de passo da china, estou com dificuldade em achar um adaptador para o eixo dele.
Estou adaptando um "braço" de servo grande, não sei se dará certo.
Oi Fernando, bom dia.
Que legal que deu certo.
"Desde o tempo que eu era criança pequena lá em Barbacena", (kkkk)
que me recomendaram:
Ao programar, construir um flowchart, sempre ajuda.
Qual tipo de adaptador você necessita,e qual o diametro do eixo do motor?
Haverá muita força sobre o eixo do motor?
Rui
Oi Rui
Segue algumas imagens.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por