Esse é um resumo com fotos do Projeto Fedablio 1. Em se tratando de um hobby, o início do planejamento se deu em Fevereiro de 2015 e de lá para cá ocorreram muitas mudanças entre elas: troca de tipos de motores (Bosch por Mabuchi), troca do tipo de tração (engrenagem por correias), programação dos controladores, altura e posição das rodas, posicionamento de outras peças e etc. A princípio queria montar a estrutura em canos de PVC como andei vendo por aí. Porém como devem ter percebido acabei adotando MDF de 9 mm. É resistente, não muito pesado e fácil de trabalhar. Abaixo do texto, tem as linhas de código utilizadas, as imagens do projeto e a lista de peças.
Servo motor
Foram comprados direto da China e não são muito resistentes. Pelo local que ficam os dois, acabei quebrando um deles ao manusear o Fedablio 1. Com programação muito simples e bem fácil de trabalhar, foram colados à carcaça com cola de silicone.
Sensor ultrassônico
Também vieram do outro continente. Peça simples de entender e trabalhar. GND (negativo), VCC (positivo), TRIG (dispara o som) e ECHO (ouve o som). Todo processo de disparar, calcular e decidir o que será feito, gerenciado pelo nosso ATMEGA 328.
Tive ajuda
Cortes retos das madeiras que seguram o rodizio, as últimas rodas (15 cm) e a caixa em compensado tive muita ajuda do amigo Reinaldo Marcheteiro. Vejam seu blog.
Programação do ATMEGA primário
#include <Servo.h> #include <Ultrasonic.h> Servo servo1; Servo servo2; Ultrasonic sensor1(2,3); Ultrasonic sensor2(4,5); long microssegundo1, microssegundo2 = 0; float distancia1, distancia2 = 0; void setup(){ servo1.attach(6); servo2.attach(7); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); } void loop(){ if(analogRead(A0) <= 511){ servo1.write(90); servo2.write(90); if(analogRead(A1) <= 511 || analogRead(A2) <= 511 || analogRead(A3) <= 511){ if(analogRead(A1) <= 511){ frente(); } if(analogRead(A2) <= 511){ direita(); } if(analogRead(A3) <= 511){ esquerda(); } } else{ para(); } }else{ servo1.write(15); servo2.write(165); delay(250); microssegundo1 = sensor1.timing(); microssegundo2 = sensor2.timing(); distancia1 = sensor1.convert(microssegundo1, Ultrasonic :: CM); distancia2 = sensor2.convert(microssegundo2, Ultrasonic :: CM); if(distancia1 <= 70 || distancia2 <= 70){ para(); delay(500); re(); delay(500); para(); delay(500); esquerda(); delay(500); para(); delay(500); frente(); }else{ frente(); } servo1.write(50); servo2.write(125); delay(250); microssegundo1 = sensor1.timing(); microssegundo2 = sensor2.timing(); distancia1 = sensor1.convert(microssegundo1, Ultrasonic :: CM); distancia2 = sensor2.convert(microssegundo2, Ultrasonic :: CM); if(distancia1 <= 70 || distancia2 <= 70){ para(); delay(500); re(); delay(500); para(); delay(500); esquerda(); delay(500); para(); delay(500); frente(); }else{ frente(); } servo1.write(90); servo2.write(90); delay(250); microssegundo1 = sensor1.timing(); microssegundo2 = sensor2.timing(); distancia1 = sensor1.convert(microssegundo1, Ultrasonic :: CM); distancia2 = sensor2.convert(microssegundo2, Ultrasonic :: CM); if(distancia1 <= 70 || distancia2 <= 70){ para(); delay(500); re(); delay(500); para(); delay(500); direita(); delay(500); para(); delay(500); frente(); }else{ frente(); } servo1.write(125); servo2.write(50); delay(250); microssegundo1 = sensor1.timing(); microssegundo2 = sensor2.timing(); distancia1 = sensor1.convert(microssegundo1, Ultrasonic :: CM); distancia2 = sensor2.convert(microssegundo2, Ultrasonic :: CM); if(distancia1 <= 70 || distancia2 <= 70){ para(); delay(500); re(); delay(500); para(); delay(500); direita(); delay(500); para(); delay(500); frente(); }else{ frente(); } servo1.write(165); servo2.write(15); delay(250); microssegundo1 = sensor1.timing(); microssegundo2 = sensor2.timing(); distancia1 = sensor1.convert(microssegundo1, Ultrasonic :: CM); distancia2 = sensor2.convert(microssegundo2, Ultrasonic :: CM); if(distancia1 <= 70 || distancia2 <= 70){ para(); delay(500); re(); delay(500); para(); delay(500); esquerda(); delay(500); para(); delay(500); frente(); }else{ frente(); } servo1.write(125); servo2.write(50); delay(250); microssegundo1 = sensor1.timing(); microssegundo2 = sensor2.timing(); distancia1 = sensor1.convert(microssegundo1, Ultrasonic :: CM); distancia2 = sensor2.convert(microssegundo2, Ultrasonic :: CM); if(distancia1 <= 70 || distancia2 <= 70){ para(); delay(500); re(); delay(500); para(); delay(500); esquerda(); delay(500); para(); delay(500); frente(); }else{ frente(); } servo1.write(90); servo2.write(90); delay(250); microssegundo1 = sensor1.timing(); microssegundo2 = sensor2.timing(); distancia1 = sensor1.convert(microssegundo1, Ultrasonic :: CM); distancia2 = sensor2.convert(microssegundo2, Ultrasonic :: CM); if(distancia1 <= 70 || distancia2 <= 70){ para(); delay(500); re(); delay(500); para(); delay(500); direita(); delay(500); para(); delay(500); frente(); }else{ frente(); } servo1.write(50); servo2.write(125); delay(250); microssegundo1 = sensor1.timing(); microssegundo2 = sensor2.timing(); distancia1 = sensor1.convert(microssegundo1, Ultrasonic :: CM); distancia2 = sensor2.convert(microssegundo2, Ultrasonic :: CM); if(distancia1 <= 70 || distancia2 <= 70){ para(); delay(500); re(); delay(500); para(); delay(500); direita(); delay(500); para(); delay(500); frente(); }else{ frente(); } } } void para(){ digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); } void frente(){ digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, HIGH); } void re(){ digitalWrite(9, HIGH); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, LOW); } void esquerda(){ digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); } void direita(){ digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, LOW); }
Programação do ATMEGA secundário
#include <LiquidCrystal.h> #include <OneWire.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //temperatura 1 OneWire sens(6); byte num; byte atual = 0; byte dado[12]; byte endereco[8]; float celsius; //temperatura 1 void setup(){ lcd.begin(16, 2); } void loop(){ //temperatura 2 if (!sens.search(endereco)) { sens.reset_search(); delay(250); return; } sens.reset(); sens.select(endereco); sens.write(0x44, 1); atual = sens.reset(); sens.select(endereco); sens.write(0xBE); for (num = 0; num < 9; num++) { dado[num] = sens.read(); } int16_t linha = (dado[1] << 8) | dado[0]; byte config = (dado[4] & 0x60); if (config == 0x00) linha = linha & ~7; else if (config == 0x20) linha = linha & ~3; else if (config == 0x40) linha = linha & ~1; celsius = (float) linha / 16.0; //temperatura 2 lcd.clear(); lcd.setCursor(0, 0); lcd.print("fedablio.com.br "); lcd.setCursor(0, 1); lcd.print("Curitiba - PR "); delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Temp. amb. (C): "); lcd.setCursor(0, 1); lcd.print(celsius); delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("fedablio.com.br "); lcd.setCursor(0, 1); lcd.print("Curitiba - PR "); delay(3000); }
Lista de peças
1 CI HT12E - modula os comandos remotos
1 CI HT12D - demodula os comandos remotos
2 CI ATMEGA328 - um para as funções principais e outro para as secundárias
1 CI L298N - a ponte H que comanda os motores
1 CI NEC555 - faz funcionar o giroflex de LED
2 Cristal 16 MHz - ambos para dar o clock necessário e assim funcionar os ATMEGA328
1 Trimpot 20K - brilho do LCD
4 Resistor 10K - diversos
2 Resistor 1M - diversos
2 Resistor 47K - diversos
1 Resistor 4K7 - diversos
4 Resistor 470 - diversos
4 Capacitor ceramico 22pF - trabalham em conjunto com os CIs ATMEGA328
2 Capacitor poliester 100nF - trabalham em conjunto com os CIs ATMEGA328
1 Capacitor Eletrolítico 48uF x 16V - trabalha em conjunto com o NEC555
1 Transmissor TWS-BS-6 RF 433 MHz - transmite o sinal do CI HT12E
1 Receptor RWS-375 RF 433 MHz - recebe o sinal e passa para o CI HT12E
1 Sensor de temperatura 18B20 - faz a leitura de temperatura e joga para o CI ATMEGA328 interpretar
2 LED alto brilho verde - mostra quando o controle remoto foi ligado e giroflex
1 LED alto brilho vermelho - giroflex
2 Sensores HC-SR04 - verifica se tem objetos
2 Servo motor SG90 - movimento dos sensores HC-SR04
1 Display LCD 16x2 - mostra os dados
2 Motor de vidro elétrico Mabuchi - movimenta o projeto
1 Câmera IP wireless - filmagem do percurso do projeto
1 pote de colher urina para exame - usado para fazer giroflex de LED
1 Bateria Moura 12MVA-7 - toda a alimentação do projeto
1 Bateria 9V - controle remoto de 433 MHz
1 Cooler de fonte ATX - resfria os dissipadores de alumínio
1 Caixa plástica patola - armazena a bateria de 9V
2 Dissipadores de alumínio - ajuda a resfriar os reguladores e ponte H
3 Regulador de tensão 7805 - desce a tensão para 5V
1 Regulador de tensãao LM323 - desce a tensão para 5V com corrente máxima de 3A
3 Botão de contato - frente, direita e esquerda do projeto
2 Interruptor alavanca - um liga o controle e outro aciona o piloto manual
1 Interruptor gangorra - liga o projeto
1 Protoboard 170 furos - funcionamento do giroflex
2 Protoboard Hikari 760 furos - onde é montado toda a eletrônica do projeto
Fotos e vídeos













































