O robô Fedablio 1

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