Motor de passo sem chave de fim de curso? RESOLVIDO


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

Exibições: 1669

Responder esta

Respostas a este tópico

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

  • novaposicao = 40 (positivo)

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);
}

Oi Fernando, boa tarde,

segue o flowchart do seu código para facilitar a correção do mesmo.

(Qdo estava fazendo o flowchart não vi que o Pedro deu uma sugesão de correção)

Esta sugestão não está no flowchart.

Rui

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.

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço