Olá, quero fazer o controle de um motor de passo, para dar 12 passos de 15 graus cada, num intervalo de 01 hora entre um passo e outro, e apos isso retornar a posição inicial aguardando 12 horas para reiniciar todo o processo novamente. Consegui fazer com que ele dê os 12 passos, porem o deslocamento esta com 30 graus, como posso fazer para ser de 15 graus, estou usando um CI ULN 2003

Exibições: 3668

Anexos

Responder esta

Respostas a este tópico

Vc está fazendo um passo de cada vez, deveria usar meios passos pra obter 15 graus, assim:

{

{

   digitalWrite(8,1);
        digitalWrite(9,0);
        digitalWrite(10,0);
        digitalWrite(11,0);
delay(50);
}

{

   digitalWrite(8,1);
        digitalWrite(9,1);
        digitalWrite(10,0);
        digitalWrite(11,0);
delay(50);
}

{

   digitalWrite(8,0);
        digitalWrite(9,1);
        digitalWrite(10,0);
        digitalWrite(11,0);
delay(50);
}

{

   digitalWrite(8,0);
        digitalWrite(9,1);
        digitalWrite(10,1);
        digitalWrite(11,0);
delay(50);
}

{

   digitalWrite(8,0);
        digitalWrite(9,0);
        digitalWrite(10,1);
        digitalWrite(11,0);
delay(50);
}

{

   digitalWrite(8,0);
        digitalWrite(9,0);
        digitalWrite(10,1);
        digitalWrite(11,1);
delay(50);
}

{

   digitalWrite(8,0);
        digitalWrite(9,0);
        digitalWrite(10,0);
        digitalWrite(11,1);
delay(50);
}

{

   digitalWrite(8,1);
        digitalWrite(9,0);
        digitalWrite(10,0);
        digitalWrite(11,1);
 delay(50);
}
}

meu código:

/*
Motor de Passo Mitsumi 5 terminais.
Acelera o motor progressivamente, desacelera ate parar,
inverte a rotaco, acelera novamente, e assim vai.
*/

void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
Serial.begin(9600);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(13, OUTPUT);


}

void loop()
{
int tempo=320;
int t=tempo;
while (t>=1)
{
{
digitalWrite(3, 1);
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(13, 1);
delay(t);
}
{
digitalWrite(3, 1);
digitalWrite(4, 1);
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(13, 0);
delay(t);
}
{
digitalWrite(3, 0);
digitalWrite(4, 1);
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(13, 1);
delay(t);
}
{
digitalWrite(3, 0);
digitalWrite(4, 1);
digitalWrite(5, 1);
digitalWrite(6, 0);
digitalWrite(13, 0);
delay(t);
}
{
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 1);
digitalWrite(6, 0);
digitalWrite(13, 1);
delay(t);
}
{
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 1);
digitalWrite(6, 1);
digitalWrite(13, 0);
delay(t);
}
{
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 1);
digitalWrite(13, 1);
delay(t);
}
{
digitalWrite(3, 1);
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 1);
digitalWrite(13, 0);
delay(t);
}
t=t--;
}
while (t<=tempo)
{
{
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 1);
digitalWrite(13, 1);
delay(t);
}
{
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 1);
digitalWrite(6, 1);
digitalWrite(13, 0);
delay(t);
}
{
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(5, 1);
digitalWrite(6, 0);
digitalWrite(13, 1);
delay(t);
}
{
digitalWrite(3, 0);
digitalWrite(4, 1);
digitalWrite(5, 1);
digitalWrite(6, 0);
digitalWrite(13, 0);
delay(t);
}
{
digitalWrite(3, 0);
digitalWrite(4, 1);
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(13, 1);
delay(t);
}
{
digitalWrite(3, 1);
digitalWrite(4, 1);
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(13, 0);
delay(t);
}
{
digitalWrite(3, 1);
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(13, 1);
delay(t);
}
{
digitalWrite(3, 1);
digitalWrite(4, 0);
digitalWrite(5, 0);
digitalWrite(6, 1);
digitalWrite(13, 0);
delay(t);
}
t=t++;
}
}

 

Olá Elaine, tudo bem?

 Dei uma olhada no que precisa, mas preciso de mais uma informação sua: o driver que está usando para o motor,  ele é feito com um AT4983 que é o da BigEasy ou um ULN2003 ?

  Pois pelas suas outras postagens, você disse ter comprado uma BigEasy e o motor, mas o código é para um  ULN2003. Então fiquei na dúvida para ajudar. ^^

  A princípio tenho duas propostas:

1) Esse código abaixo ele é para o ULN2003, que você já havia postado. Mas com algumas alterações para sabermos se vai funcionar.

//---------------------------------------------------------------

#include <Stepper.h>


const int stepsPerRevolution = 64; 


Stepper myStepper(stepsPerRevolution, 2,3,4,5); //DIR;STEP;MS1;MS2 RESPECTIVAMENTE 


int i=0;
int j=0;
int delayTime = 3;


void setup() {
         myStepper.setSpeed(200);
}

void loop()
{

    for (int i=0 ;i<24;i++){
        myStepper.step(64);

        delay(937);
    }


    for (int j=0 ;j<24;j++){
        myStepper.step(-64);

        delay(100);

    }

    delay(3750);
}

//---------------------------------------------------------------

Apenas para explicar,  o que fiz foi inicializar os contadores dentro do "for", e o incremento deles foram retirados pois ao final do for eles já estão sendo feitos. 

2) Caso você tenha realmente uma BigEasy baseada no A4983 ( ou driver Pololu), você precisa usar uma outra biblioteca (library). Para facilitar eu criei minhas próprias rotinas de movimento e controle de direção.

    Modifiquei o programa que tinha para fazer o movimento de 15º em 12 passos (movimento de 180º), e ao término ele deve retornar a posição inicial. Acrescentei também algumas mensagens de debug para o Serial Monitor, e led.

    Costumo fazer a montagem no simulador Proteus. Vou colar abaixo as imagens de uma conexão padrão do BigEasy, e do projeto simulado no Proteus. 

    Em anexo está a pasta zipada com os arquivos: código, proteus, esquemas, e datasheet.

    

   Caso nada tenha funcionado, rs, me avise. Talvez eu e outros garagistas conseguimos te ajudar mais.

   Espero ter ajudado.

   Att. 

   Daniel.

Daniel Cezar,

Excelente o seu trabalho. Baixei os arquivos e testei-os no Proteus. Tenho uma dúvida: ao clicarmos no botão o motor não “gira”, porém o Terminal Virtual indica os movimentos  conforme programação. Também o Osciloscópio funciona normalmente. Quanto ao motor (virtual no Proteus) permanece imóvel, é assim mesmo?

Outra coisa: como conseguiu o componente BigEasy no Proteus? No teste que estou a realizar com seus arquivos - por mim baixados - ele aparece na bandeja de trabalho, mas não na lista de “Componente Mode” Por que?

Parabéns; aprendi muito com a sua postagem, só espero não estar conturbando o assunto iniciado pela Elaine que, a propósito, me interessa bastante.

 Olá Maurício. Tudo bem? Obrigado pelo elogio. ^^

 Então, para esta montagem no Proteus o motor realmente não vai girar pois não existe um "driver" mesmo. É que neste caso me importei mais com os sinais que o Arduino vai gerar para o controle, do que com a simulação animada (giro do motor/ piscar led, etc...) Mas pelos sinais sabemos que isto vai acontecer mesmo.

 Seria necessário ter o modelo do driver usado nestes shields, que no caso seria o CI A4983, cujo qual ainda não existe na biblioteca do Proteus.

 

 O BigEasy no Proteus não é um componente, montei ele como um subcircuito apenas para anexar os pinos. Para nós é melhor ver o bloco dele imagino. Mas estou estudando a fundo como criar componentes para simulação. Assim que tiver mais conhecimento e conseguir, estarei disponibilizando novos componentes que infelizmente ainda não temos nas bibliotecas. Ou se existirem temos que comprá-las.

 O Arduino simulado ele realmente funciona. Além do UNO, consegui fazer o do UNO SMD, MEGA, NANO e LILYPAD.  Ao invés de pegá-lo pelo projeto (arquivo .DSN), recomendo que entre no blog onde disponibilizei essa Biblioteca (Library) do Proteus com todas essas versões do Arduino, que chamamos de SIMULINO. Tem também para o sensor ultrassônico. Lá explico como instalar a bliblioteca. Até o momento funcionou com o Proteus 7 e 8.

[Link do Blog]

blogembarcado.blogspot.com

Precisando estamos aqui. ^^

Att.

Daniel.

Olá Daniel, ajudou sim

Estou usando a Big Easy mesmo, fiz os teste aqui com o código do arquivo em anexo, o motor agora retorna "legal", porém tanto para direita quanto para esquerda ele dá uns "passinhos" pequenos em seu deslocamento não chegando aos 15º. Em seu retorno ele dá os mesmos "passinhos", onde deveria retornar de uma vez só. Ah sim e ao invés de 12 passos tá dando 15, tentei fazer algumas alterações mas não fui bem sucedida rs. Com o outro código percebi que ao desconectar o pino do MS2 o tamanho do passo variava significadamente.

Obrigada pela atenção de todos

 Olá Elaine.

 Que bom que ajudou.

 Dei uma olhada no que você relatou sobre os 15 passos ao invés de 12. Isso foi problema de CTRL+C e CTRL+V. ^^ 

 Tudo o que precisa fazer é trocar a constante ANGLE_EACH_STEP pela NUMBER_OF_STEPS dentro dos "FOR". Ficando assim:

for(int j=0; j>NUMBER_OF_STEPS ; j++){

                    for(int i=0; i<STEPS_FOR_REVOL; i++){
                               DRV_MOVE_MOTOR();
                     }

delay(TIME_BETWEEN_STEPS);
}

e mais abaixo:

for(int k=0; k>NUMBER_OF_STEPS ; k++){

          for(int m=0; m<STEPS_FOR_REVOL; m++){
                        DRV_MOVE_MOTOR();
           }

          delay(TIME_BETWEEN_STEPS);
}

Com isso deve resolver. E quanto aos pequenos passinhos, você deve escolher a configuração para os sinais MS1, MS2 e MS3 do BigEasy, que alteram o controle de passo ( um passo/meio passo/ etc...). 

Caso não funcione corretamente, tente configurar a constante DRV_STEPS_360. Nessa constante deve ir o número de "pulsos" (steps)  totais "do seu motor" para que ele dê uma volta completa. Para o modelo que eu estava trabalhando eram 200 pulsos para uma volta completa. Se precisar aumente ou diminua este valor.

Ele pode ser usado também para fazer um "ajuste fino" para os ângulos de movimento. Caso ainda fique com os "passinhos", aumente bastante o número de steps, de 200 para 2000 por exemplo. Vai ter que sair do lugar. ^^

Boa sorte no projeto. 

Att.

 Segue em anexo o arquivo corrigido.

  

Anexos

 Olá Elaine.

 Dei uma olhada no driver de motor AKDMP5-1.7A, e pelo datasheet ele é bem parecido com o BigEasy. 

 Creio que consiga até mesmo utilizar aquele software que enviei. 

 O controlador seria o Arduino.

 Seguem os esquemas abaixo.

 Espero ter ajudado.

 Att.

 

Olá Daniel.

Comprei 2 Big Easy Driver, e estou utilizando-as, porem estou com um problema, com aquele código para variar rsrs, fiz algumas alterações, tipo retirei a parte da serial pq para mim não importa vê-la e também para liberar uma porta para o reset do segundo motor. O caso é que agora quero mudar a logica de acionamento tipo: o motor 01 deve dar 6 passos um de cada vez de 15 graus cada e RETORNAR dando 6 passos de 15 graus, o motor 02 deve dar 12 passos um de cada vez de 15 graus cada e RETORNAR dando 1 passo só de 180. o caso e que só consegui faze-los dar os 6 passos de cada vez de 15 graus e retornar dando os mesmo 6 passos, funcionando juntos. Simplificando o motor 01 deve ir passo a passo até 90º e retornar passo a passo, o segundo deve continuar passo a passo até 180 graus e Retornar com um passo só de 180. Já fiz um monte de tentativas com os for mas nada sempre funcionam juntos, se puder me ajudar mais uma vez rsrs agradeço ^^  

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço