sábado, 26 de dezembro de 2015

Tutorial 5: Controlando um Cooler via comunicação Arduino Wireless, utilizando potenciômetro e os Módulos RF 433Mhz


Fala Makers, esse é um tutorial bastante pedido e foi feito de uma forma bem simples e objetiva. Vamos controlar um Cooler ( você pode retirar de uma fonte de computador comum), você também pode controlar a velocidade de qualquer motor DC devendo variar o transistor chaveador de acordo com a potência do motor. Nesse projeto foi utilizado o Kit RF Eletrônica Protoboard e um potenciômetro ,esse Kit foi projetado especialmente para Arduino, mas nada impede de ser utilizado com qualquer outro microcontrolador.

Figura 1- Kit RF Eletrônica Protoboard Analógico Arduino


Seu funcionamento é bem simples você gira o potenciômetro para aumentar e diminuir a rotação e o melhor é que tudo isso sera feito  a distância. Você pode utilizar esse código para acionar carrinhos de controle remoto, a velocidade varia de 0-255 e você ainda terá outras saídas digitais para controlar LED's e outros dispositivos.

A imagem abaixo representa o montagem do transmissor, veja como é extremamente simples, se você não sabe como funciona a protoboard ou é seu primeiro projeto acesse nossos outros tutoriais aqui.

Figura 2 - Montagem do Transmissor


Notem que não adicionamos outras funções, porém de acordo com o que você aprendeu nos outros tutoriais você pode implementa-los nesse projeto tornando seu produto final mais completo. Abaixo temos a montagem do receptor, repare que utilizamos o transistor BC327. Esse transistor pode dissipar uma corrente de até 800 mA, como nosso cooler consome apenas 150 mA será mais que suficiente. Se por acaso você quiser utilizar um motor mais parrudo você precisará de um transistor mais potente e terá que isolar seu Arduino.

Figura 3 - Montagem do Receptor


 Sketch do Transmissor

/* MSmaker RF Example
 developed by MSmaker
 date: december 22, 2015
 universomakers@gmail.com
 */
#include <stdlib.h>
#include<string.h>
#include <VirtualWire.h> //Inclui a biblioteca VirtualWire.h
const int potPin = A0;
long val = 0;
int i;
int pwm;
int compara;
char pwmEnvia[10];
char *dado ; //Cria a variável que ira armazenar a informação pré definida enviadas pelos botões

void setup()
{
  //Configura o Arduino para trabalhar como transmissor
  vw_set_ptt_inverted(true);
  vw_setup(2000);
  vw_set_tx_pin(2);//Configura o pino 2 como tx
  //===================================================
  Serial.begin(9600);
  //Configura o estado das portas digitais
  pinMode(2, OUTPUT);
  pinMode(A0, INPUT);
}

void loop()
{
  val = analogRead(potPin); // Leitura do potênciomentro
  pwm = val / 4;// Recebe o valor de 0-1023 e converte para 0-255
  
  if (pwm > (compara + 2) || pwm < (compara - 2)) {// Solução para não enviar informação enquanto o potenciômetro não for utlilizado
    itoa(pwm, pwmEnvia, 10);// Coverte inteiro em String
    Serial.println(pwmEnvia); // Essa linha pode ser removida, serve apenas para verificar seu funcionamento 
    dado = pwmEnvia; //Armazena o dado pré determinado
    vw_send((uint8_t *)dado, strlen(dado)); //Envia a variável dado
    vw_wait_tx(); //Aguarda o fim de transmissão
    delay(200); //Aguarda um tempo para a próxima leitura
    compara = pwm;// Compara se o mesmo valor ja foi enviado
  }

}

 Sketch do Receptor


/* MSmaker RF Example
 developed by MSmaker
 date: July 7, 2015
 universomakers@gmail.com
 */
#include <VirtualWire.h> //Inclui a biblioteca VirtualWire.h
int i;
int flag = 0;
int pwm;
char valor[4];
const int inPWM = 3;

void setup()
{
  //Configura o Arduino para trabalhar como receptor
  vw_set_ptt_inverted(true);
  vw_setup(2000);
  vw_set_rx_pin(2);//Configura o pino 2 como rx
  vw_rx_start();
  //=================================================

  pinMode(2, INPUT);
  pinMode(3, OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  char cod;//Cria uma variavel para armazenar o dado recebido.
  uint8_t buf[VW_MAX_MESSAGE_LEN]; //Recebe os dados e armazena na variável buf
  uint8_t buflen = VW_MAX_MESSAGE_LEN; //Armazena na variável buflen o tamanho do dado recebido
  if (vw_get_message(buf, &buflen)) //Pega a mensagem que foi recebida
  {
    flag = 1;// Flag de recebimento
  }
  // Copia os dados recebidos para um array do tipo Char
  if (flag == 1) {
    for (i = 0; i < buflen; i++) {
      valor[i] = buf[i];
    }
    pwm = atoi(valor);
    analogWrite(inPWM, pwm);
    Serial.println(pwm);
  }
  flag = 0;// Zera a flag de recebimento
  //Limpa as posições do Vetor
  for (i = 0; i <= 4; i++) {
    valor[i] = 0;
  }
}


5 comentários:

  1. Muito bom este tutorial estou estudando como utilizar este modulo para controlar a posição de um servo motor com potenciometro, pode me ajudar a fazer isso? já analisei varios codigos mais ainda sao confusos para mim.

    ResponderExcluir
    Respostas
    1. Tudo bem Argel Galante? O que você precisa? Porque a leitura potenciômetro fornece um valor até 1023, dependendo do servo você terá 180°, no caso teremos que dividir 1023/180. Pra cada 5 na leitura do pot você terá 1°. Mas em todo caso vamos prepara um tutorial desse porque é interessante.

      Excluir
    2. Opa desculpa a demora para responder achei que seria notificado via email. O que eu quero fazer é isso mesmo mas estou pensando em usar um servo 360 graus e um potenciometro daqueles de giro contínuo e o modulo Nrf24l01 Rf que tem um alcance maior.
      Um abraço

      Excluir
  2. Opa, estou doido atras de um jeito de fazer meu esc e motor brushless junto com um servo, funcionarem pela placa de RF... o seu codigo foi o q eu consegui chegar mais proximo, mas so conseguindo comandar um! ou o servo, ou o motor.

    ResponderExcluir
  3. Dá pra usar para controlar uma caixa de som passiva? Aumentar e baixar o volume com o potenciometro?

    ResponderExcluir