Criando Robo com Arduino – Parte III (Inicio do Protótipo)

Para prosseguir com esse tutorial você deverá ter lido a primeira e  a segunda parte.

Muito bem, espero que todos tenham hackeado seus servo motores e estejam prontos para iniciar a montagem do prototipo! Para essa parte apresentarei um esquema de hardware montado no Fritzing e um pequeno código com as principais funções. O código serve apenas como uma introdução do que virá na quarta parte e ele é composto de:

Movimentação dos servos = possui funções para movimentar os servos em todas as direções (frente, ré, esquerda, direita).

Escrita no LCD = função responsável por escrever a distancia calculada pelo sensor ultrasonico.

Calcula distancia = função responsável por calcular a distancia que o robô está de um objeto.

Alerta = função que emite sons ou bipes como alerta.

Todas as funções são chamadas dentro do loop() para testar suas funcionalidades e ver se esta tudo OK. Veja o código abaixo:

/*
# Autor: Fernando Krein Pinheiro
# Data: 24/01/2012
# Linguagem: C
# ========= IMPORTANTE ===========
# O codigo esta livre para usar,
# citar e compartilhar desde que
# mantida sua fonte e seu autor.
# Obrigado.
*/

#include <LiquidCrystal.h>
#include <Ultrasonic.h>
#include <Servo.h>
#define echoPin 10
#define trigPin 12

Servo servoDireita, servoEsquerda;
Ultrasonic ultrasonic(11,10);
LiquidCrystal lcd(9, 11, 5, 4, 3, 2);

int pinoAnalogico = 3;
int valorAnalogico;
int temperatura;
int pinoPotenciometro = 0;
long valorPotenciometro = 0;
int posicao_inicial_servo = 0;
int BUZZER = 8;

/*================== Setup ======================*/
void setup()
{
	  Serial.begin(9600);
  	  lcd.begin(16, 2);
	  pinMode(echoPin, INPUT);
	  pinMode(trigPin, OUTPUT);
	  servoDireita.attach(7);
	  servoEsquerda.attach(6);
	  pinMode(BUZZER, OUTPUT);
}
/*============ Loop =============================*/
void loop()
{
        escrever_LCD();

        movimetacao_Frente();
        delay(3000);
        movimentacao_Re();
        delay(4000);
        movimentacao_Direita();
        delay(1000);
        movimentacao_Esquerda();
        delay(1500);

        Alerta(BUZZER, 2000, 300);
}
/*======== Movimentacao dos Servos ================*/

int movimetacao_Frente()
{
  servoDireita.write(180);
  servoEsquerda.write(0);
}
int movimentacao_Re()
{
  servoDireita.write(0);
  servoEsquerda.write(180);
}
int movimentacao_Direita()
{
  servoDireita.write(75);
  servoEsquerda.write(75);
}
int movimentacao_Esquerda()
{
  servoDireita.write(105);
  servoEsquerda.write(105);
}
int movimentacao_Parado()
{
  servoDireita.write(90);
  servoEsquerda.write(90);
}

/*========= Escrita no LCD =======================*/
void escrever_LCD()
{
        int distancia;
	valorPotenciometro = analogRead(pinoPotenciometro);
        distancia = calcula_Distancia();
	lcd.setCursor(0,0);
	lcd.print("Distancia: ");
        lcd.print(distancia);
	lcd.setCursor(13,1);
}
/*======= Calcula Distancia ======================*/

int calcula_Distancia()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);
  int distancia = (ultrasonic.Ranging(CM));
  Serial.print("Distancia em CM: ");
  Serial.println(distancia);
  return distancia;
}
/*=================  Alerta  ==========================*/

void Alerta (unsigned char BUZZER, int frequencia, long tempoMilisegundos)
{
    int Contador, x=0;
    long pausa = (long)(1000000/frequencia);
    long loopT = (long)((tempoMilisegundos*1000)/(pausa*2));
    while(x<3)
    {
    	for (Contador=0;Contador<loopT;Contador++)
    	{
        	digitalWrite(BUZZER,HIGH);
        	delayMicroseconds(pausa);
        	digitalWrite(BUZZER,LOW);
        	delayMicroseconds(pausa);
    	}
		delay(100);
      		x++;
    }
}
/*======================================================*/

O código é relativamente fácil de entender e não a nada de novo até aqui a não ser pelo fato de os servos estarem com rotação continua. Essa é a única parte que realmente necessita de uma explicação:

No controle de servos normais (não modificados) você controla-os informado o grau através da função servo.write(graus), então o servo movimenta-se para o valor informado.

Já o servo modificado para rotação continua, quando informado o grau ele entende isso como uma velocidade de rotação, ou seja se você informar 180 graus será entendido como velocidade máxima em um sentido, se informado valor 0 graus será entendido como velocidade máxima para o lado contrario. Então se você informar um valor intermediário (90 graus) o mesmo será entendido como velocidade 0 (zero) isto quer dizer que o motor ficará parado! Com isso você tem controle total sobre a velocidade de rotação das rodas!

Mas então vem a pergunta: E se eu quiser que a roda de apenas meia volta? Como posso fazer isso?

Resposta: Muito fácil, através da função delay(). Isso mesmo, você poderá controlar a quantidade de voltas que uma roda pode fazer informado um tempo para essa função!!

Vamos para a parte de montagem na protoboard. Veja o esquema montado:

A primeira vista parece um pouco difícil de entender a montagem, mas se você tiver um pouco de paciência e vontade de aprender será capaz de decifrar o emaranhado de jumpers…rsrsrsrsrsrsrsrs.

Veja agora uma imagem de como ficou a montagem:

Veja os vídeos:

Caso você tenha alguma dúvida, pergunte!

Aguarde a 4° e ultima parte do tutorial Criando Robô com Arduino!

Anúncios

12 comentários em “Criando Robo com Arduino – Parte III (Inicio do Protótipo)

  1. Pingback: Criando Robo com Arduino – Parte II (Modificando servo motores) | Compartilhar é preciso.

  2. Ótimo estou acompanhando os posts Parabéns.
    Tive uma probleminha com os servos mais deu certo no final.

    Só aguardando a parte 4.

  3. Pingback: Criando Robo com Arduino – Parte IV (Montando o Robo) | Compartilhar é preciso.

  4. Ola, o codigo esta dando o seguinte erro:
    sketch_jun23a : 19: error: ‘ultrassonic’ does not name a type
    sketch_jun23a : ino: In function ‘ int calcula_distancia () ‘ :
    sketch_jun23a :107: error: ‘ultrassonic’ was not declared in this
    scope
    sketch_hun23a:107: error: ‘CM’ was not declared in this scope

  5. Olá amigo, parabéns pelo trabalho.
    No meuarduino 1.0.5 dá erro em Ultrasonic::ultrasonic(int,int); teria alguma idéia de como resolver .

  6. Boa Tarde,
    Olha eu ja tentei de tudo e não estou conseguindo…
    Eu ja tinha um programa como este, pensei que estivesse errado, mas com esse programa aqui deu o mesmo.
    Eu não consigo deixar o robo parado, quando executa a função movimentacaoParado, os meus servos simplesmente giram um contrario o outro(o efeito no robo é ele rodando no proprio eixo)
    Não se se ficou confuso, caso não entenda me avise que tento detalhar o problema.

    Obrigado!

  7. Olá estou fazendo um só que em vez dos servo motores estou usando dois motores dc de 3V e corrente de 0.5A sera que funciona ?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s