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













































