Galera, estou com um problema em um trabalho de controle discreto.

Estou montando um elevador controlado por um arduino ATMega328. Objetivo do trabalho: o elevador deve subir e descer com uma única velocidade constante independente da carga. Ou seja, se ele sobe vazio a 10Km/h, tem que subir com carga a 10Km/h e descer com ou sem carga também. A estrutura ta montada, estou usando um motor CC para subir e descer a plataforma juntamente com um contra peso. A ideia do meu professor foi que para a leitura da velocidade do motor, eu usasse um outro motor ligado ao primeiro (por correia) e daí tirasse a tensão. Porém o que está ocorrendo é que não consigo receber a tensão de subida e de descida ao mesmo tempo, pois no motor 2 (gerador) estou ligando um fio em uma entrada lógica do arduino e o outro tenho que ligar no gnd, pois se ligo os dois em dois pinos lógicos, a leitura não ocorre corretamente. Queria saber como fazer pra switar o gnd entre as duas saídas do motor, já que eles vão direto pra pinos de entrada. se tem como fazer via hardware ou software, da maneira mais prática que vocês souberem.

int enable1 = 2;
int button1 = 6;
int button2 = 7;
int input1 = 9;
int input2 = 10;
int const geradors = 2;
int const geradord = 1;
int tensaos;
int tensaod;

void setup()
{
  Serial.begin(9600);
  pinMode(geradors, INPUT);
  pinMode(geradord, INPUT);
  Serial.println("Lendo dados do motor...");
  pinMode(input1, OUTPUT);
  pinMode(enable1, OUTPUT);
  pinMode(input2, OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
}
 
void subir()
{
    digitalWrite(enable1, HIGH);
    digitalWrite(input2, LOW);
    analogWrite(input1, 255);
    tensaos = analogRead(geradors)/4;
    Serial.print("Tensaos: ");
    Serial.println(tensaos);
  delay(400);
}
 
void decer()
{
    digitalWrite(enable1, HIGH);
    digitalWrite(input1, LOW);
    analogWrite(input2, 255);
    tensaod = analogRead(geradord)/4;
    Serial.print("Tensaod: ");
    Serial.println(tensaod);
  delay(400);
}
 
void parar()
{
  digitalWrite(enable1, LOW);
  digitalWrite(input1, LOW);
  digitalWrite(input2, LOW);
}
 
void loop()
{
  if (digitalRead(button1) == HIGH)
  {
      subir();
  }
 
  if (digitalRead(button2) == HIGH)
  {
      decer();
  }
  parar();
}

Exibições: 606

Responder esta

Respostas a este tópico

Você pode usar um encoder e acoplar no eixo do motor.

Obrigado Flavio pela sua atenção. Eu possuo dois encoders mecânicos e ambos possuem uma resistência ao giro "muito grande". Dentro do sistema final meu motor não é capaz de rodá-los. Procurei por encorders ópticos em Fortaleza e não encontrei. Possuo um Sensor Ultrassônico HC-SR04, porém a resposta do mesmo para cada novo ciclo é muito lenta, quando ele responde já tem se passado muitos mm de uma medição pra outra.

Outras opções para medir rotação através do uso de motores :

- motor de passo. Pode encontrar um mini motor de passo em diskete drivers antigos. 

Ou notores de passo de impressoras. 

- motor BLDC - poderá encontrar em hard disks de PC. 

http://labdegaragem.com/forum/topics/tutorial-arduino-esc-motor-sem...

Mas não conecte diretamente no seu Arduino ! Terá que montar um circuito para adaptar os níveis de tensão.

Caro José Gustavo Abreu Murta, muito obrigado pela sua atenção. Gostei muito do seu sensor, lembra um encoder óptico, porém meu motor só possui ação de giro no eixo e fica complicado de medir com esse sensor dessa forma. Posteriormente estarei analisando ele para novas situações, quando eu estiver com tempo. Infelizmente meu projeto é para amanhã e não tenho material o suficiente para realizar algo desse tipo.

OI KSRA, boa tarde.

Pelo que entendi do seu texto, o seu Prof. solicita que a medida seja feita usando um outro 

motor acoplado no seu motor de movimentar o elevador.  Certo?

Você quer inverter as ligações deste motor usado com sensor . Certo?

Esta inversão está sendo necessária , porque sendo um motor de CC.

ao girar subindo, o motor gera +v entre o port e o Gnd, e ao girar descendo ele gera -V entre o port e o Gnd.

O port analógico do atmega não converte valores negativos.

Você pode compensar esta diferença criando um referencial para o motor.

Qual a voltagem máxima que este motor está gerando?

Digamos que seja 2V.

Ok então você cria um referencial de +2,5V.

Ao gerar +2V  somando ao referencia de +2,5V., voce terá +4,5V,

E ao gerar -2V, somando ao  referencia de +2,5V, voce terá +0,5V,

Rui

 

Mas porque complicar?

Caro Rui Viana, muito obrigado pela dica. O problema q estou tendo é na recepção da tenção do motor. Por exemplo: o motor CC possui dois fio (um preto e um vermelho), se eu coloco os dois nos pinos analógicos pra receber os dados do motor, se o elevador vai subir o vermelho é pra passar 2V e o preto é pra passar 0V, quando o elevador vai descer é o contrário. No entanto o recebimento de dados não ocorre dessa forma, apenas quando coloco o fio preto no gnd e o vermelho na porta analógica ou quando coloco o vermelho no gnd e o preto na porta analógica é que consigo fazer essa leitura corretamente. Porém não consigo ficar chaveando o gnd, na mesma medida q o elevador sobe e desce, para esses pinos. Manualmente eu tiro um e coloco no gnd e faço de maneira análoga para o outro. Mas gostaria que isso ocorresse virtualmente ou com algum componente.

Você já tentou usar uma ponte de diodos?  A entrada da ponte é o motor DC que serve como encoder a saída é o canal analógico do Arduíno!

Não importa a polaridade da entrada a polaridade da saída permanece sempre a mesma! Se voce estiver tendo problemas com a queda de tensão nos diodos pode usar diodos com baixa queda... diodos schottky

Se retificar o sinal, perde-se a noção de direção da rotação do motor.

Como ele que esta comandando o motor.. em teoria ele sabe para que direção o elevador esta indo... mas usando um pino do Arduino e um diodo extra por fora da ponte da para saber...

maior que ~zero esta para uma direção.. ~zero esta para outra 

Galera, obrigado pela atenção de todos. Consegui fazer a leitura da tenção do motor de geração. de maneira bem simples, porém não pensada por mim. Após mais algumas pesquisas sobre as entradas analógicas do arduino, descobri q é possível usá-la como uma "saída digital", e apenas usando os comandos:

pinMode(A0, OUTPUT);
digitalWrite(A0, LOW);

e depois voltando o pino para o modo de entrada analógica, eu consegui fazer a leitura correta do motor de geração.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço