Controlando 4 motores com um shield l293d em um mega2560 com um RF433

Amigos preciso esclarecer uma dúvida.

Estou com um projeto de um carro controlado por RF onde utilizo um Mega2560 um Shield l293d e um RF433 + 4 motores com redução.

O que ocorre é que quando envio o sinal "F" (Frente) por exemplo, ou qualquer um outro "T", "D" ou "E", os motores são acionados mas após isso eles param somente desligando a energia.

Observando o monitor no mega que é o receptor  percebo que é recebido somente duas vezes (as vezes 1 apenas) o "F" por exemplo. Isso também ocorre com os outros.

O transmissor é um UNO.

Todos estão carregados com fontes externar independentes.

 

Minha percepção é que o erro esta na forma de recepção de sinal do RF com o Mega. Me parece que quando os motores são acionados a recepção para.

Conto costumeiramente com a ajuda de vocês. Muito obrigado

Segue cód.
Transmissor:


//INICIO TRANSMISSOR______________________________________________________

#include <VirtualWire.h>
char *dado ; //Armazena variavel dos botões
int apaga; Auxiliar para envio de X e parar sem desligar motores


void setup() {

//Configura transmissor
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_set_tx_pin(3);//Configura o pino 3 como tx
//Fin configura transmissor

Serial.begin(9600);

//Configura o estado das portas digitais
pinMode(3, OUTPUT); // Pino para o transmissor
pinMode(4, INPUT); //chave tátil 1
pinMode(5, INPUT); //chave tátil 2
pinMode(6, INPUT); //chave tátil 3
pinMode(7, INPUT); //chave tátil 4

}

void loop() {

// Vewrifica estado P4 tatil e envia caso pressionado
if (digitalRead(4) == 0) {

  apaga=1;
  dado = "F"; //Armazena para envio
  vw_send((uint8_t *)dado, strlen(dado)); //Envia dado
  vw_wait_tx(); //Aguarda o fim da tranmissão
  delay(100); //Aguarda um tempo para leitura
  Serial.println(dado);//Para observar possíveis erro através do serial
}

else if (digitalRead(5) == 0) {
  apaga=1;
  dado = "T";
  vw_send((uint8_t *)dado, strlen(dado));
  vw_wait_tx();
  delay(100);
  Serial.println(dado);
}

else if (digitalRead(6) == 0) {
  apaga=1;
  dado = "D";
  vw_send((uint8_t *)dado, strlen(dado));
  vw_wait_tx();
  delay(100);
  Serial.println(dado);
}

else if (digitalRead(7) == 0) {
  apaga=1;
  dado = "E";
  vw_send((uint8_t *)dado, strlen(dado));
  vw_wait_tx();
  delay(100);
  Serial.println(dado);
}

//Se nada pressionado envia "X" 3X
else {
  if (apaga == 1) {
    for (int i=1; i<4; i++) {
      dado = "X";
      vw_send((uint8_t *)dado, strlen(dado));
      vw_wait_tx();
     delay(100);
     Serial.println(dado);
     }
 }
apaga = 0;
}

}

//FIM TRANSMISSOR_____________________________________________________

COD. Receptor

//INICIO RECEPTOR_________________________________________

#include <AFMotor.h>
#include <VirtualWire.h>

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);


void setup() {
int i;
//Configurareceptor
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_set_rx_pin(50);//Configura o pino 30 como rx
vw_rx_start();// inicia recepcao
pinMode(50, INPUT);// configura pino30 para recepcao

Serial.begin(9600);

 }

void loop() {

char cod;//Cria uma variavel armazenar o dado recebido.
uint8_t buf[VW_MAX_MESSAGE_LEN]; //Recebe os dados e armazena na var buf
uint8_t buflen = VW_MAX_MESSAGE_LEN; //Armazena na tamanho dado recebido

if (vw_get_message(buf, &buflen)) {//observa dado recebido
 cod = buf[0]; //Converte em Char
 Serial.println(cod); /para observar possiveis erros

  if (cod == 'F') { // Compara a informação recebida e executa motores

motor1.setSpeed(75);

motor2.setSpeed(75);
motor3.setSpeed(75);
motor4.setSpeed(75);
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
 }

else if (cod == 'T') {
motor1.setSpeed(75);
motor2.setSpeed(75);
motor3.setSpeed(75);
motor4.setSpeed(75);
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
 }

else if (cod == 'D') {
motor1.setSpeed(75);
motor2.setSpeed(75);
motor3.setSpeed(75);
motor4.setSpeed(75);
motor1.run(FORWARD);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(BACKWARD);
 }


else if (cod == 'E') {


motor1.setSpeed(75);
motor2.setSpeed(75);
motor3.setSpeed(75);
motor4.setSpeed(75);
motor1.run(BACKWARD);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(FORWARD);
 }

else if (cod == 'X') {

 motor1.run(RELEASE);
 motor2.run(RELEASE);
 motor3.run(RELEASE);
 motor4.run(RELEASE);

 }


}
}

 

Exibições: 909

Anexos

Responder esta

Respostas a este tópico

Recomendo que estude isso :

https://learn.adafruit.com/adafruit-motor-shield/overview

https://learn.adafruit.com/downloads/pdf/afmotor-library-reference.pdf

Faça um teste : para confirmar que os comandos estão sendo recebidos, acenda o LED do Arduino !

Após cada rotina F, T, D e E acrescente um led piscando ou acendendo por um tempo. 

Assim confirmará que o Receptor esta reconhecendo os comandos. 

Isole a bateria  do Arduino da bateria do motor. Use duas baterias ( para efeito de teste) .

Não se esqueça de conectar os terras.

José boa tarde., este material foi utilizado para a construção do que já tenho hoje. Estudei detalhadamente este material. Boa indicação.

Quanto ao led de teste, já realizei no principio este esquema (com o led 13 e outros demais). Estranho que tudo funciona bem com eles, inclusive as observações no monitor. A recepção é realizada para todos os comandos.

Outra questão é que quando o shield l293d não é alimentado, vejo  pelo monitor que a recepção dos dados ocorre normalmente  Tudo ok, mas quando o shield é alimentado a recepção dura pouquíssimos milissegundos ( duas vezes F ou qualquer outro no monitor, motores acionados mas a recepção é descontinuada).

Posso estar enganado mas o shield é quem esta barrando a continuidade da recepção, pois em outro esquema com os mesmos parâmetros de hardware e cod. porem com leds  tudo corre sem entraves.

O quer acha? 

Grande abraço

Olá Fábio!

Se tudo funciona sem o motor, então pode ser interferência sobre o sinal de RF.

Este post fala exatamente sobre o seu problema. Veja se ajuda:

http://electronics.stackexchange.com/questions/82384/how-to-reduce-...

Maravilha, vou dar uma sapiada.. Logo dou uma posição!!! Vlw

Meu caro amigo José Augusto... Você tinha razão!!! Interferência do ruido dos motores.Fiz testes com um multímetro e também com led. Quando acionado sem motor a recepção flui com motor... rodou recepção parou... Mas agora tenho outra dúvida...

Como faço para minimizar este ruido?

Fábio, essa parte de eletrônica eu não conheço muito,mas parece que você deve fazer o seguinte:

1) Verifique se o receptor está o mais longe possível dos motores.

2) Faça um teste e tente colocar uma chapa de metal entre o motor e o receptor. O objetivo é isolar o motor.

Caso não funcione, sugiro aguardar ajuda de outros garagistas que já passaram por essa experiência.

Talvez colocando um novo post no fórum somente sobre isso: Como eliminar a interferência na recepção RF

Instale um capacitor 100uF entre a alimentação dos motores (no shield) e um capacitor de 10uF na alimnetação do Arduino. Se não resolver terá que usar outras alternativas.

Excelente José. Estive pesquisando e com certeza é ruído, além disso fiz testes com leds eu funcionou lindo. Como é meu primeiro projeto estou apanhando um pouco. Mas vamos em frente... Obrigado pelo apoio!

Amigos, segui as orientações da instalação de capacitores entre os motores e a alimentação, porém o problema persiste. A sintoma é o mesmo. Existe a recepção do sinal de RF porém quando os motores são acionados a recepção sofre interferência. Fiz exatamente como mostra a foto abaixo.

Existe algo que eu possa fazer além da instalação dos capacitores?

Conto com a colaboração de vcs.

Muito obrigado.

É o que tinha informado - se os capacitores não resolverem, existem outras alternativas. 

Por exemplo um indutor em série (choque) com a alimentação do circuito do motor. 

Só não saberia te informar qual o valor, pois depende de cálculos. 

Pode fazer testes com alguns indutores, mas o fio deverá suportar a corrente do circuito.

http://carlosdelfino.eti.br/basicaodaeletronica/nivel%202/Indutores...

Certo. Mesmo que eu faça o cálculo não faço ideia de como instalar este componente. Tenho que encontrar alguma documentação.

Por exemplo um indutor ligado em série (choque) com a alimentação do circuito do motor. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço