Brincadeira com Arduino

Gosto muito de eletrônica e tecnologias e um de meus passatempos foi a montagem de um “robô” bem babaca. Basicamente é um carrinho de brinquedo, em que um sensor de distancia e 2 sensores de toques foram acoplados para permitir a direção autônoma dele.A minha puta inteligência fez com que eu não o filmasse. Aqui estão duas fotos.:

20130916-150834.jpg

20130916-150859.jpg

Como foi a Montagem

Materiais:
Para montar a maquina usei um carrinho de controle bem vagabundo para o chassi e um Arduino para o processamento. Comprei um Arduino Mega para poder “disperdiçar” no junkcode mas,para um bom programador, qualquer um serve. Junto com o arduino, eu comprei um motor shield, um sensor de distancia IR da Sharp e dois sensores de de toques (interruptores).Para o saber geral, eu comprei o meu aqui.

Arduino Mega e Motor Shield

Arduino Mega e Motor Shield

Chassi

Chassi

Sensor da Sharp

Sensor da Sharp

Sensor da Sharp

Sensor da Sharp

Sensor de toque.

Sensor de toque.

Você pode estar de perguntando por que não comprei um Raspberry Pi, um Beagleboard ou até um Cubieboard e eu responderei:” O arduino possui shields que suprem facilmente as minhas necessidades, um preço mais camarada e eu não preciso de um processador tão poderoso para este projeto.”

Bem, para começar a montar o projeto, pensei o que eu gostaria que o veículo fizesse. Gostaria que ele andasse sozinho e, ao encontrar um obstáculo, parar, dar ré, virar para um lado e seguidamente ir para frente.Depois de elaborar a ideia, procurei como torna-la prática.

Montagem

Quando fui à loja de brinquedos, os carrinhos com motores que lá haviam possuíam dois motores: Um frontal, que controla o lado que o brinquedo vira, e um traseiro, que o impulsiona. Serviria para o meu experimento.

Desmontei o carrinho inteiro deixando somente a base com os motores e roda. Troquei os fios que se ligavam aos motores por uns fios mais resistentes com mais liga na solda, pois os originais pareciam frágeis. Colei com cola resistente uma peça de Lego para servir de base para o Arduino. Me serviu muito bem pois o carrinho bateu bastante na parede e não caiu uma vez sequer.

o Lego na base

o Lego na base

Depois de montar a base só faltava a parte computacional.

Eletronicamente

Robo_bb

Para começar na parte computacional, precisei aprender como fazer funcionar o sensor IR do modelo que eu comprei. Dei um google e achei um blog em que esse tal de Larry já havia feito algo em um modelo parecido. Utilizando os mesmos princípios, achei o datasheet e cheguei em algo assim :

 //Calcula a distancia:
float volts = analogRead(IRpin)*0.003222656; // valor do sensor x (3/1024) - 3 de 3.3 volts e 1024 e o valor max que uma saída digital consegue ler.
float distance = 24*pow(volts, -1.419);
//Serial.println(distance); -// Para analise.

Depois de ter achado isso, pensei que todos os problemas já tinham acabado. Porém devido a minha inabilidade de programador encontrei um problema que não consegui resolver: Como meu carro possui um eixo fixo e um móvel, ele não consegue rotacionar em um único eixo, portanto, ao encontrar com uma parede ele precisa dar ré e virar para o lado, e se um lado for errado ele precisa ir para o outro. Como não deu, deixei que aleatoriamente ele escolhesse um lado e se desse errado, novamente, por randon ele escolhia outro.

Bem, para os curiosos, aqui está o código:


//DECLARANDO CONSTANTES:
const int IRpin = 10;
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;
const int FrontSensor = 15;
const int RearSensor = 14;
float Speed = 80;
unsigned long timerF;
unsigned long timerI;</code>

//Criando Movimentos
void Esquerda(){
digitalWrite(dirA, HIGH);
digitalWrite(brakeA, LOW);
analogWrite(pwmA,200);
}

void Direita(){
digitalWrite(dirA, LOW);
digitalWrite(brakeA, LOW);
analogWrite(pwmA,200);
}

void Tras(){
digitalWrite(dirB, LOW);
digitalWrite(brakeB, LOW);
analogWrite(pwmB, Speed+45);
}

void Frente(){
digitalWrite(dirB, HIGH);
digitalWrite(brakeB, LOW);
analogWrite(pwmB, Speed);
}

void Parar(){
digitalWrite(dirB, LOW);
digitalWrite(brakeB, HIGH);
}

void Reto(){
digitalWrite(dirA, LOW);
digitalWrite(brakeA, HIGH);
}

int TouchF(){
int touch = analogRead(FrontSensor);
if ( touch &lt;= 10){
return 1;
}
else{
return 0;
}
}

int TouchR(){
int touch = analogRead(RearSensor);
if ( touch &lt;= 10){ return 1; } else{ return 0; } } //Começa o Codigo. void setup(){ //Define o pinMode(dirA, OUTPUT); //Inicia o motor no canal A pinMode(brakeA, OUTPUT); //Inicia o brake no canal A //Setup Channel B pinMode(dirB, OUTPUT); pinMode(brakeB, OUTPUT); //Começa o Serila Serial.begin(9600); //Leitor do sensor da frente. pinMode(FrontSensor, INPUT); } void loop(){ //Declara Variaveis e define tempo. int touch = TouchF(); long time = random(1000, 2000); int randon = random(0, 20); //Calcula a distancia: float volts = analogRead(IRpin)*0.003222656; // valor do sensor x (3/1024) - 3 de 3.3 volts e 1024 e o valor max que uma saida digital concegue ler. float distance = 24*pow(volts, -1.419); //Serial.println(distance); -// Para analise. //Começa a movimentaçao do Carro if(touch == 1){ Tras(); delay(500); } else{ if(distance &gt; 13){

unsigned long time = millis();
int timer = millis()-time;
Frente();
Reto();
Serial.println(timer);
if(timer &gt;= 500){
Parar();
}
}
else{
if(randon &gt;= 10){
Esquerda();
Tras();
delay(time);
Parar();
}
else{
Direita();
Tras();
delay(time);
Parar();
}
}
}
}

//Para acabar como uma açao, o comando a ser digitado : digitalWrite(BRAKEX, HIGH);
Advertisements