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);
}
}
}
Tags:
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.
É 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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por