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
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.
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.