Robô Handler Marlon Nardi
Robótica

Construa seu próprio robô esteira com Arduino! – Handler V1.0

Desde criança robôs esteiras me fascinam, e é por isso que hoje vamos aprender a construir um barra pesada! Neste tutorial você irá encontrar o passo a passo completo de como construir desde a parte mecânica até a programação.

Este tutorial já está completo, e todas as informações que você precisa para montá-lo, como substituições, tipo das peças, medidas, valor aproximado, está tudo aqui. Não vendemos robôs ou componentes eletrônicos, e também não fazemos projetos externos.

Todos os arquivos que você precisará baixar para construir seu robô estão aqui embaixo:

 

 

  • Desenho 3D do Handler ( Versão Sketchup 2017) Arquivo compactado .zip – Clique aqui
  • Download do Sketchup para visualizar e editar o desenho em 3D do Handler – Clique aqui
OBS: se não quiser baixar o Sketchup, você pode usar a versão online para abrir os arquivos, acessando o link abaixo:
https://www.sketchup.com/pt-BR/plans-and-pricing/sketchup-free

 

Lista de peças mecânicas do robô esteira Handler V1.0

  • 2 Motores de vidro elétrico;
  • 4 Coroas simples de bicicleta;
  • 4 Cubos dianteiros simples de bicicleta;
  • 2 Correntes de moto usadas ou novas;
  • 4 Metros de Metalon 20 x 20 cm;
  • 12 Parafusos a sua escolha;
  • 34 Porcas para o parafuso escolhido acima;
  • 44 Arruelas para o parafuso escolhido acima;
  • 2 Pinhões de CG TITAN 15 dentes;
  • 4 Ruelas de diâmetro externo: 33 mm e diâmetro interno de 9,5 mm (Se não achar, pode comprar uma com diâmetro interno menor e aí você fura para aumentar).

Outras ferramentas utilizadas:

  • Máquina de solda;
  • Esmerilhadeira;
  • Furadeira;
  • Alicates em geral;
  • Chaves em geral.
Passo a passo em vídeo da parte mecânica:

Agora vamos para a parte eletrônica e de programação!

Lista de componentes, shields e módulos:

  • 1 Arduino MEGA;
  • 2 Transceptores NRF24L01 + PA +LNA;
  • 1 Monster Motor Shield;
  • 18 Células Li-Ion 4.2V x 2000mAh para a bateria do robô;
  • 2 Células Li-Ion 4.2V x 2000mAh para o receptor e o controle;
  • 1 Controle XBOX.

Para baixar o diagrama esquemático do circuito eletrônico do Handler V1.0 – Clique aqui.

Para poder compilar as programações abaixo você precisa baixar e instalar na IDE do Arduino essa biblioteca – Clique aqui.

Programação do transmissor:

/*************************** Marlon Nardi ******************************
  Projeto: Programação do Controle Handler V1.0
  Vídeo ensinando a montar: https://www.marlonnardi.com/p/construa-seu-proprio-robo-esteira_23.html
  Loja: https://www.lojamarlonnardi.com/
  Site: https://www.marlonnardi.com/
  Youtube: https://www.youtube.com/marlonnardiw
  Facebook: https://www.facebook.com/professormarlonnardi
************************************************************************/

/******************* Programação do Controle Handler V1.0 ***************/

//======================= Incluindo bilbiotecas ==============================//
#include <SPI.h>
#include <RF24.h>

//========================= Criando objetos =================================//
RF24 Radio(48, 49); // CE, CSN // Instancia/cria o objeto Radio para que possamos trabalhar com ele. Também temos que informar os pinos do Arduino conectados ao CE e ao CSN do NRF24L01.


//==================== Nomeando as constantes ==============================//
#define LEDIndicadorRadicaoGama 22
#define AnalogicoEsquerdoY A0// 0 à 950
#define AnalogicoDireitoX A1
#define BotaoL1 A2 // 0 ou 1023
#define AnalogicoL2 A3// 0 à 1023
#define AnalogicoEsquerdoX A4// 80 à 1023 Meio 511
#define AnalogicoR2 A5 // 13 à 1023


//=================== Criando uma estrutura/pacote de dados para a transmissão e recepção de informação através de dois Pipes =======================//
struct EstruturaDadosTXRX
{

  boolean SensorRadiacaoGama = false;
  int ValorConvertidoAnalogicoR2 = 0;
  int DirecaoRobo = 0;
};

typedef struct EstruturaDadosTXRX TipoDosDadosTXRX;
TipoDosDadosTXRX DadosTransmitidos;
TipoDosDadosTXRX DadosRecebidos;

//=================== Declaração de variáveis globáis =======================//
int ValorAnalogicoR2;
int ValorAnalogicoEsquerdoY;
int ValorAnalogicoEsquerdoX;
boolean EstadoBotao = 0;


//=================== Declaração da variável global somente de leitura para armazenas os endereço de leitura e escrita =======================//
                    //Endereço: 0         1
const byte Enderecos[][6] = {"00001", "00002"}; //Criamos um vetor constante do tipo Byte que terá duas posições, pois precisamos de um endereço para escrever e outro para ler. Apesar do
//endereço ter somete 5 números, declaramos 6 para que o comppilador adicione o caracter null \0 automaticamente.

void setup() {
  //==================== Declaração de entradas e saídas ========================//
  pinMode(LEDIndicadorRadicaoGama, OUTPUT);// Declara o pino do LEDIndicadorRadicaoGama como saída.

  //================== Configurações iniciais do NRF24L01 ======================//
  Radio.begin();// Inicia o transceptor NRF24L01
  Radio.openWritingPipe(Enderecos[1]); // Informamos para o transceptor qual é o endereço de escrita Enderecos[1] ou 00002 e abrimos o Pipe/Tubo.
  Radio.openReadingPipe(1, Enderecos[0]); // Informamos para o transceptor qual é o endereço de leitura Enderecos[0] ou 00001 e abrimos o Pipe/Tubo. Esse primeiro parâmentro, o número 1,
  //define o número do Pipe. Podemos utilizar 6 Pipes, de 0 à 5.
  Radio.setPALevel(RF24_PA_MAX);// Muda o PA para potência máxima de transmissão. Para potência minima: RF24_PA_MIN Para potência média: RF24_PA_HIGH Para potência máxima (recomendado para o módulo com etapa amplificadora e antena): RF24_PA_MAX
  Radio.setDataRate(RF24_250KBPS); // Mudamos a taxa de trasnferência de dados para 250 Kbps, isso melhora a distância na transmissão.
}


void loop() {
  delay(5);// Tempo para não haver perca de dados
  //========================= Trasmitindo os dados ===========================//

  ValorAnalogicoEsquerdoX = analogRead(AnalogicoEsquerdoX);// Lê o valor analógico do AnalogicoEsquerdoX e manda para a variável ValorAnalogicoEsquerdoX.
  ValorAnalogicoEsquerdoY = analogRead(AnalogicoEsquerdoY);// Lê o valor analógico do AnalogicoEsquerdoY e manda para a variável ValorAnalogicoEsquerdoY.

  //Robô para Trás
  if (ValorAnalogicoEsquerdoX < 471) {
    DadosTransmitidos.DirecaoRobo = 2;
  }
  //Robô para Frente
  if (ValorAnalogicoEsquerdoX >= 490) {
    DadosTransmitidos.DirecaoRobo = 3;
  }

  //Vira o robô para a direita
  if (ValorAnalogicoEsquerdoY <= 482) {
    DadosTransmitidos.DirecaoRobo = 0;
  }
  //Vira o robô para a esquerda
  if (ValorAnalogicoEsquerdoY >= 562) {
    DadosTransmitidos.DirecaoRobo = 1;
  }

  ValorAnalogicoR2 = analogRead(AnalogicoR2);
  DadosTransmitidos.ValorConvertidoAnalogicoR2 = map(ValorAnalogicoR2, 13, 1023, 0, 255);

  Radio.stopListening(); // Comando para o rádio parar de ouvir, dessa forma ele fala ou transmite.
  Radio.write(&DadosTransmitidos, sizeof(TipoDosDadosTXRX));// Transmite/escreve os dados para o outro rádio. DadosTransmitidos = Informação que queremos enviar. TipoDosDadosTXRX: Tamanho dessa variável.


  //========================= Recebendo os dados ===========================//
  delay(5);// Tempo para não haver perca de dados.

  Radio.startListening(); // Comando para o rádio começar ouvir, dessa forma ele escuta ou recebe.
    
  while (!Radio.available()); //Fica em looping até receber a informação. 
  Radio.read(&DadosRecebidos, sizeof(TipoDosDadosTXRX)); // Lê a informação transmitida pelo Robô.

  if (DadosRecebidos.SensorRadiacaoGama == HIGH) {// Se DadosRecebidos.SensorRadiacaoGama que foi transmitido pelo robô for igual a HIGH.
    digitalWrite(LEDIndicadorRadicaoGama, HIGH);// Liga o LEDIndicadorRadicaoGama
  }
  else {// Se não
    digitalWrite(LEDIndicadorRadicaoGama, LOW);// Desliga o LEDIndicadorRadicaoGama
  }
}



Programação do receptor:

/*************************** Marlon Nardi ******************************
  Projeto: Programação do Robô Handler V1.0
  Vídeo ensinando a motar: https://www.marlonnardi.com/p/construa-seu-proprio-robo-esteira_23.html
  Loja: https://www.lojamarlonnardi.com/
  Site: https://www.marlonnardi.com/
  Youtube: https://www.youtube.com/marlonnardiw
  Facebook: https://www.facebook.com/professormarlonnardi
************************************************************************/

/******************* Programação do Robô Handler V1.0 ****************/

//======================= Incluindo bilbiotecas ==============================//
#include <SPI.h>
#include <RF24.h>

//========================= Criando objetos =================================//
RF24 radio(48, 49); // CE, CSN // Instancia/cria o objeto Radio para que possamos trabalhar com ele. Também temos que informar os pinos do Arduino conectados ao CE e ao CSN do NRF24L01.


//==================== Nomeando as constantes ==============================//
#define PinoSensorRadiacaoGama 22


//=================== Criando uma estrutura/pacote de dados para a transmissão e recepção de informação através de dois Pipes =======================//
struct EstruturaDadosTXRX
{
  boolean SensorRadiacaoGama = false;
  int ValorConvertidoAnalogicoR2 = 0;
  int DirecaoRobo = 0;
};
typedef struct EstruturaDadosTXRX TipoDosDadosTXRX;
TipoDosDadosTXRX DadosTransmitidos;
TipoDosDadosTXRX DadosRecebidos;

//=================== Declaração de variáveis globáis =======================//
boolean buttonState = 0;

//=================== Declaração da variável global somente de leitura para armazenas os endereço de leitura e escrita =======================//
                    //Endereço: 0         1
const byte Enderecos[][6] = {"00001", "00002"};//Criamos um vetor constante do tipo Byte que terá duas posições, pois precisamos de um endereço para escrever e outro para ler. Apesar do
//endereço ter somete 5 números, declaramos 6 para que o comppilador adicione o caracter null \0 automaticamente.

void setup() {
//==================== Declaração de entradas e saídas ========================//
  pinMode(PinoSensorRadiacaoGama, INPUT_PULLUP);// Declara o pino do PinoSensorRadiacaoGama como entrada PULLUP.

// Pinos para o controle dos  motores através da Monster Shield
  pinMode(4, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

//================== Configurações iniciais do NRF24L01 ======================//
  radio.begin();// Inicia o transceptor NRF24L01
  radio.openWritingPipe(Enderecos[0]); // Informamos para o transceptor qual é o endereço de escrita Enderecos[0] ou 00001 e abrimos o Pipe/Tubo.
  radio.openReadingPipe(1, Enderecos[1]); // Informamos para o transceptor qual é o endereço de leitura Enderecos[1] ou 00002 e abrimos o Pipe/Tubo. Esse primeiro parâmentro, o número 1,
  //define o número do Pipe. Podemos utilizar 6 Pipes, de 0 à 5.
  radio.setPALevel(RF24_PA_MAX); // Muda o PA para potência máxima de transmissão. Para potência minima: RF24_PA_MIN Para potência média: RF24_PA_HIGH Para potência máxima (recomendado para o módulo com etapa amplificadora e antena): RF24_PA_MAX
  radio.setDataRate(RF24_250KBPS); // Mudamos a taxa de trasnferência de dados para 250 Kbps, isso melhora a distância na transmissão.

}



void loop() {
   //========================= Recebendo os dados ===========================//
  delay(5); // Tempo para não haver perca de dados.

  radio.startListening(); // Comando para o rádio começar ouvir, dessa forma ele escuta ou recebe.

  if ( radio.available()) {// Se o NRF24L01 receber dados.
    while (radio.available()) {// Enquanto o NRF24L01 receber dados.
      radio.read(&DadosTransmitidos, sizeof(TipoDosDadosTXRX)); // Lê a informação transmitida pelo Robô.
     }


 //========================= Controle dos Motores ===========================//
     //Controle da velocidade dos motores
      analogWrite(5, DadosTransmitidos.ValorConvertidoAnalogicoR2); // Escreve o valor PMW de 0 à 255 responsável pela velocidade do robô no pino 5.
      analogWrite(6, DadosTransmitidos.ValorConvertidoAnalogicoR2);// Escreve o valor PMW de 0 à 255 responsável pela velocidade do robô no pino 6.

      //Controle da direção do robô
    if (DadosTransmitidos.ValorConvertidoAnalogicoR2 < 50) {
      //---------------- Robô Desligar Motores -----------//
      //Motor lado esquerdo olhando de trás do robô
      digitalWrite(4, LOW);
      digitalWrite(9, LOW);
      //Motor lado direito olhando de trás do robô
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
    }

    if (DadosTransmitidos.DirecaoRobo == 3) {
      //---------------- Robô para frente -----------//
      //Motor lado esquerdo olhando de trás do robô
      digitalWrite(4, LOW);
      digitalWrite(9, HIGH);
      //Motor lado direito olhando de trás do robô
      digitalWrite(7, LOW);
      digitalWrite(8, HIGH);
    }

    if (DadosTransmitidos.DirecaoRobo == 2) {
      //---------------- Robô para trás -----------//
      //Motor lado esquerdo olhando de trás do robô
      digitalWrite(4, HIGH);
      digitalWrite(9, LOW);
      //Motor lado direito olhando de trás do robô
      digitalWrite(7, HIGH);
      digitalWrite(8, LOW);
    }

    if (DadosTransmitidos.DirecaoRobo == 0) {
      //---------------- Robô para o lado esquerdo -----------//
      //Motor lado esquerdo olhando de trás do robô
      digitalWrite(4, HIGH);
      digitalWrite(9, LOW);
      //Motor lado direito olhando de trás do robô
      digitalWrite(7, LOW);
      digitalWrite(8, HIGH);
    }

    if (DadosTransmitidos.DirecaoRobo == 1) {
      //---------------- Robô para o lado direito -----------//
      //Motor lado esquerdo olhando de trás do robô
      digitalWrite(4, LOW);
      digitalWrite(9, HIGH);
      //Motor lado direito olhando de trás do robô
      digitalWrite(7, HIGH);
      digitalWrite(8, LOW);
    }


  }
  
//========================= Trasmitindo os dados ===========================//
  delay(5); // Tempo para não haver perca de dados.
  
  radio.stopListening(); // Comando para o rádio parar de ouvir, dessa forma ele fala ou transmite.

  DadosRecebidos.SensorRadiacaoGama = digitalRead(PinoSensorRadiacaoGama);// Faz a leitura digital do PinoSensorRadiacaoGama e armazena na variável DadosRecebidos.SensorRadiacaoGama.
  
  radio.write(&DadosRecebidos, sizeof(TipoDosDadosTXRX));// Transmite/escreve os dados para o outro rádio. DadosTransmitidos = Informação que queremos enviar. TipoDosDadosTXRX: Tamanho dessa variável.
}



Explicação em vídeo da parte eletrônica do Robô:

Passo a passo em vídeo da programação:

Espero que se divirta muito construindo seu robô!

 

Um grande abraço,

Marlon Nardi.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *