Construa seu próprio robô esteira - Handler V1.0

Primeiramente a parte mecânica:

Download 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

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 
  • 34 - Porcas para o parafuso citado acima;
  • 44 - Arruelas para o parafuso citado 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, compra uma com diâmetro interno menor e fura para aumentar).
Lista de ferramentas para montar o Handler V1.0
  • Máquina de solda;
  • Esmiilhadeira;
  • Furradeira;
  • Alicates em geral;
  • Chaves em geral.
Assista o vídeo: 

Agora vem 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:
1
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
/*************************** Marlon Nardi ******************************
  Projeto: Programação do Controle 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 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:
1
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 
144 
145 
146  
/*************************** 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.
}


Assista o vídeo: