Ajuda para programa controle de motor 12v com Disco De Encoder Incremental e Arduino

 

Preciso usar o  Arduíno para controlar um motor dc de 12 V.

Eu quero fazer uma Bobinadeira, tenho vários motores de 12v retirados de impressoras etc, 

Preciso fazer o programa, que eu configure para dar um numero de voltas que eu determinar, nesse caso, são 700 voltas. andei pesquisando varios tutoriais, mas esta dificil de achar a solução. 

Num tutorial, eu fiz essa pergunta, e o autor me disse o seguinte

Brincando com Ideias1 hora atrás

Olá Eduardo! Se eu entendi o seu objetivo, é isso mesmo. Você pode usar uma variável para contar as voltas. A cada volta, você acrescenta o valor 1 .E repete a execução até que a variável tenha o valor de 700.Mas o importante é considerar o tipo do motor que você esta usando para dar as voltas.

Se for um motor DC ou mesmo um motor AC, você precisará de algum tipo de sensor para que o Arduino possa contar as voltas.Vamos supor que o sensor envia um pulso lógico para o Arduino a cada volta do motor. Então você pode usar o laço WHILE, a cada pulso acrescentar 1 à variável e na condição do WHILE executar até que a variável seja igual a 700.

Se for um motor de passo, você consegue controlar as voltas pelo próprio Arduino e não precisa de um sensor. Basta usar um laço FOR, que por sua vez irá usar uma variável para contar as voltas.

Espero ter ajudado, amigo!   Um grande abraço.

Mas eu preciso de um programa exemplo.

Ja tenho todo o radware montado, a ponte H e a  Chave, Encoder, Óptico Arduino Fim De Curso,

: minor-bidi'>http://www.youtube.com/watch?v=R17Cmgx_kJ8

Tenho um motor com disco encoder, igual a esse:

http://produto.mercadolivre.com.br/MLB-700861324-motor-12v-com-disc...

Num outro tutorial, eu teria que saber os pulsos por volta, nesse caso, ele configurou para  20 voltas

32 pulsos por volta, ele configurou para dar 20 voltas e parar.

http://www.youtube.com/watch?v=R17Cmgx_kJ8 

TENHO ESSE PROGRAMA ABAIXO, MAS COMO ADAPTA-LO?

O disco que estamos usando tem 20 aberturas, e esse número deve ser colocado no programa (linha 11), original tinha 20 )  que vai usar essa informação para calcular a rotação do motor.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//Programa: Sensor de velocidade Arduino LM393
//Autor: Arduino e Cia
 
//Pino ligado ao pino D0 do sensor
int pino_D0 = 2;
int rpm;
volatile byte pulsos;
unsigned long timeold;
 
//Altere o numero abaixo de acordo com o seu disco encoder
unsigned int pulsos_por_volta = 63;
 
void contador()
{
  //Incrementa contador
  pulsos++;
}
 
void setup()
{
  Serial.begin(9600);
  //Pino do sensor como entrada
  pinMode(pino_D0, INPUT);
  //Interrupcao 0 - pino digital 2
  //Aciona o contador a cada pulso
  attachInterrupt(0, contador, FALLING);
  pulsos = 0;
  rpm = 0;
  timeold = 0;
}
 
void loop()
{
  //Atualiza contador a cada segundo
  if (millis() - timeold >= 1000)
  {
    //Desabilita interrupcao durante o calculo
    detachInterrupt(0);
    rpm = (60 * 1000 / pulsos_por_volta ) / (millis() - timeold) * pulsos;
    timeold = millis();
    pulsos = 0;
 
    //Mostra o valor de RPM no serial monitor
    Serial.print("RPM = ");
    Serial.println(rpm, DEC);
    //Habilita interrupcao
    attachInterrupt(0, contador, FALLING);
  }
}

OBRIGADO

Exibições: 1746

Responder esta

Respostas a este tópico

Eduardo com um motor de escova, como na sua foto, não terá um controle preciso do numero de voltas.
Como poderá parar o motor quando chegar no objetivo do número de voltas?

O recomendado como alguém já ciou, é o motor de passo.
Sugiro que coloque um disco encoder no motor de passo, pois se houver algum prendimento, o número de voltas poderá ser diferente do numero de pulsos (motor de passo)

OK,  Obrigado, eu tenho vários motores de passo aqui, mas e o programa, pode ajudar?

Oi EC, bom dia.

Pelo que entendi, você pretende usar este motor em uma bobinadeira, e portanto a parada 

do motor não precisa ser em um momento muito exato,  ou seja , se ele não parar bruscamente ou 

exatamente no momento que completar as voltas programadas, não será problema. Certo?

Se for assim, não vejo problema em usar motor de escova.

Um recurso que pode minimizar este problema, é usar o recurso (acho que o JGAM lembra  2319??)

de 3 velocidades, High speed, Intermediate speed e low speed.

Ao chegar perto do valor definido, o motor é reduzido para uma velocidade intermediaria,

ao chegar mas perto ainda , é reduzido para uma velocidade baixa, e por fim corta a alimentação

e põe a bobina do motor em curto com auxilio de um rele, que fará um freio dinâmico nele.

Outras duvidas minha? como você informará ao seu programa qtas voltas quer que o motor gire?

Que tipo de interface usará para entrar estes dados?

Você só tem este code que postou, ou tem algum outro?

Rui

Obrigado por responder.

Um recurso que pode minimizar este problema, é usar o recurso (acho que o JGAM lembra 2319??)

LEGAL, boa ideia.

Outras duvidas minha? como você informará ao seu programa qtas voltas quer que o motor gire?
Que tipo de interface usará para entrar estes dados?
Você só tem este code que postou, ou tem algum outro?

SIM, pois os outros tutoriais que tenho apenas fazem aquela coisa de gira no sentido horario e depois para e gira no anti horário.

TENHO esse aqui, mas é para motor de passo, no caso, 200 passos daria uma volta, mas ai eu preciso ver, se os meus motores que tenho aqui, são de 200 passos.

/* Pinos de Configuração do Deslocamento (no Easy Driver):
//////////////////////////////////////////////
// MS1 MS2 //
// //
// LOW LOW = Passo completo //
// HIGH LOW = Meio passo //
// LOW HIGH = Quarto de Passo //
// HIGH HIGH = Oitavo de Passo //
// //
//////////////////////////////////////////////
*/
#define step_pin 3 // Define o pino 3 como pino dos passos
#define dir_pin 2 // Define o pino 2 como pino de direção
#define MS1 5 // Define o pino 5 como "MS1"
#define MS2 4 // Define o pino 4 como "MS2"
int direcao; // Para determinar o sentido do motor
int passos = 200; // Número de passos que você deseja executar (para passos completos, 200 = 1 volta)
void setup() {
pinMode(MS1, OUTPUT); // Configura "MS1" como saída
pinMode(MS2, OUTPUT); // Configura "MS2" como saída
pinMode(dir_pin, OUTPUT); // Configura "dir_pin" como saída
pinMode(step_pin, OUTPUT); // Configura "step_pin" como saída
digitalWrite(MS1, LOW); // Configura divisão de passos do motor (ver acima)
digitalWrite(MS2, LOW); // Configura divisão de passos do motor (ver acima)
digitalWrite(dir_pin, LOW); // Sentido (HIGH = anti-horário / LOW = horário) - Também pode ser alterado
}
void loop() {
while(passos>=0) { // Enquanto o valor de passos for maior ou igual a zero
digitalWrite(step_pin, HIGH); // Envia nível lógico alto para o pino de passos do motor
delay(5); // Aguarda 5ms para o próximo passo
digitalWrite(step_pin, LOW); // Envia nível lógico baixo para o pino de passos do motor
delay(5); // Aguarda 5ms para o próximo passo
passos--; // Decrementa a variável "passos"

}
}

PERAI AI QUE VOU VER MAIS AQUI E LHE FALO DAQUI A POUCO

Rui esta falando de IBM 2319 ? Voei nessa ! 

Ei JGAM,

É verdade. Esqueci que você não é tão velho qto eu kkkkkkk.

As cabeças do disco 231x eram movidas por um atuador hidráulico.

Ele tinha 3 velocidades.

Quando fazia seek, se a distancia entre os cilindros era grande, ele partia em alta velocidade,

ao se aproximar ele diminuía para velocidade intermediaria, e por fim bem próximo 

ele baixava pra velocidade lenta, e ao chegar no cilindro definido, um detent trava o 

carro hidráulico.

Havia um sensor magnético ao lado de uma roda dentada (Não era sensor hall)

identificando qtos cilindros moveu o carro.

E o pior. funcionava kkkkkk

Imagina hoje um HD com um carro hidráulico movendo as cabeças. kkkkkk

Rui

Rui, trabalhei pouco com 2319. Mas troquei muita cabeça aterrizada !

E enxuguei com estopa, os vazaments de óleo. 

Mexi mais com 3330, 3350, 3375,3380, etc

Opa.

Se o usar o encoder pode perfeitamente controlar o motor com PWM e criar uma rampa de partida e parada afim de ter uma melhor precisão nesses pontos. Montei um enrolador com motor de passo, mas ele peca pois se correr qualquer imprevisto rompe o fio ou perde passos. O melhor caminho mesmo é usar  um motor DC com encoder, que é seu caso.   

 

PINO PWM -> DRIVE -> MOTOR

PULSO ENCODER -> PINO INTERRUPÇÃO EXTERNA 

Ai é só fazer a logica. :) 

Boa sorte.

Cara, desculpa, mas não sei fazer a logica, se puder, poste o programa completo.

Tenho sim o encoder

Obrigado

Oi EC,

segue anexo um code para control,e de motor DC.

Usei PWM e um rele para parada dinâmica.

Não testei porque não tenho como montar aqui onde estou.

Não ligue o motor direto no pino 6 do arduino.

Use um driver.

Escrevi para uno  (PWM no pino 6)  e o rele no pino 7.

Rui

Anexos

Obrigado, vi aqui um poste que guardei, para bobinadora, se puder veja

http://www.thingiverse.com/thing:1431330

Estou relendo, para ver se consigo faze-lo, mas graças a Deus, a turma aqui ja esta ajudando

Eduardo, achei que precisaria  de precisão ao enrolar os fios. 

Se a precisão não é tão importante, use o motor CC como o Rui  e o Jucelei postaram. 

Achei isso:

http://labdegaragem.com/forum/topics/contador-de-voltas-para-enrola...

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2019   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço