Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
I.
INTRODUO
TABELA 1
CARACTERSTICAS DA PLATAFORMA ARDUINO
UNO
Microcontrolador
ATmega328
Tenso de operao
5V
Tenso de entrada
7-12V
(recomendada)
Tenso de entrada (limite)
6-20V
Pinos de entrada e sada
14 (dos quais 6
(E/S)
fornecem sada PWM)
Pinos de entrada analgica
6
Corrente CC por pino e E/S
40 mA
50 mA
Memria Flash
32 KB
SRAM
2 KB
EEPROM
1 KB
Velocidade de clock
16 MHz
Arduino Uno
O Arduino Uno uma plataforma de prototipagem
eletrnica open-source baseada no mircrocontrolador
ATmega328. Suas principais caractersticas so
mostradas na tabela 1 [1].
III. DESENVOLVIMENTO
Nesta seo sero apresentados os passos para a
montagem do prottipo, tais como a montagem da
estrutura do carrinho, o sistema para deteco de objetos,
o circuito seguidor de linha e o procedimento usado para
o desenvolvimento do software.
Estrutura do carrinho
Seguidor de linha
Fig 12(a).
V. DIFICULDADES
Uma das dificuldades encontradas foi em relao aos
motores e a caixa de reduo. Como cada motor
independente, o motor da esquerda estava com uma
rotao maior que o da direita mesmo aplicando um
mesmo potencial nos dois motores, ocasionado assim um
desvio do carrinho para a direita, quando o objetivo era
que ele seguisse em linha reta. Para reduzir os efeitos
desse desvio foi utilizada uma compensao no sinal
PWM enviado pelo microcontrolador a cada motor, ou
seja, o sinal enviado ao motor da direita 10% maior que
o da esquerda, possibilitando assim que eles tenham
rotaes muito prximas e conseqentemente seguindo a
linha com mais exatido.
Outro fator de dificuldade foi o sensor ultrassnico.
Muitas vezes, devido ao mau posicionamento dos
mesmos (se estes ficassem um pouco mais inclinados) por
causa do constante manuseio do prottipo, as distncias
lidas eram muito menos precisas, pois o objeto acaba
ficando fora da faixa do ngulo de eficincia do sensor
(30).
ANEXO
//Carrinho seguidor de linha capaz de realizar ultrapassagens
//Acadmicos: Emanoeli Madalosso, Vanderlei Luiz Azzolini
#include "Ultrasonic.h"
Ultrasonic sensor1(12, 13);
Ultrasonic sensor2(9, 11);
Ultrasonic sensor3(6, 7);
Ultrasonic sensor4(3, 4);
int dist1, dist2, dist3, dist4;
int motorPin1 = 5;//esquerda
int motorPin2 = 10;
int ldr = 5;
int valor, cor = 0, cor1 = 0, cont = 0;
int z= 0, h = 0, y = 0;
int esta = 0, a =0, c = 0, tempo = 0;
int obstaculo = 0, sen23 = 0, achaB0 = 0, achaP0 = 0, segue1 = 0;
int achaB1 = 0, achaP1 = 0, segue2 = 0, VirarEsquerda = 0, global = 0;
int flagVira = 0;
int vira2 = 0, achaB02 = 0;
void SegueLinhaP1(int valor);
void SegueLinhaP2(int valor);
void FuncaoViraEsquerda(void);
void FuncaoViraDireita(void);
void diminui(void);
void para(void);
void setup() {
Serial.begin(9600);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(4, INPUT);
pinMode(3, OUTPUT);
pinMode(7, INPUT);
pinMode(6, OUTPUT);
pinMode(11, INPUT);
pinMode(9, OUTPUT);
pinMode(13, INPUT);
pinMode(12, OUTPUT);
}
void loop() {
valor = analogRead(ldr);
//Serial.println(valor);
if (global == 0){ //Linha 1
if(obstaculo == 0){
dist4 = (sensor4.Ranging(CM));
delay(10);
}
//Serial.println(dist4);
if(dist4 < 20){
obstaculo = 1;
if(esta == 0){
//dist2 = (sensor2.Ranging(CM));
//delayMicroseconds(5000);
dist3 = (sensor3.Ranging(CM));
Serial.println(dist3);
delayMicroseconds(20);
if(dist3 > 2000){
dist3 = 5;
}
if(dist3 < 30){
sen23 = 1;
}
else{
sen23 = 0;
esta = 1;
//Serial.println("--------------Esta no else--------------");
Serial.println(dist3);
}
}
}
if(obstaculo == 0){
SegueLinhaP1(valor);
//Serial.println("--------------Seguindo a linha---------------");
}
if((obstaculo == 1)&& (sen23 == 1) &&(flagVira == 0)){
para();
//Serial.println("--------------Esta no Para---------------");
}
else if((obstaculo == 1)&& (sen23 == 0)&&(flagVira == 0)&&(esta == 1)){
VirarEsquerda = 1;
flagVira = 1;
//Serial.println("--------------Esta virando--------------");
}
if((obstaculo == 1)&& (sen23 == 0) && (VirarEsquerda == 1) &&(flagVira == 1)&& (achaB0 == 0)&& (achaP0 == 0)){
FuncaoViraDireita();
delay(100);
Serial.println(valor);
if(valor < 90){ //Acha o Preto
//Serial.println("-----------------Achou linha preta----------------");
achaB0 = 1;
achaP0 = 1;
}
}
if((obstaculo == 1)&& (sen23 == 0) && (VirarEsquerda == 1) &&(flagVira == 1)&& (achaB0 == 1)&& (segue1 == 0)){
while(z != 150){
z++;
delay(5);
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 200);
Serial.println(z);
}
//Serial.println("-----------------Achou, esta aqui----------------");
obstaculo = 0;
esta = 0;
VirarEsquerda = 0;
flagVira = 0;
achaB0 = 0;
achaP0 = 0;
z = 0;
global = 1;
Serial.println(global);
}
}
if(global == 1){ //Linha 2
if (h == 0){
SegueLinhaP2(valor);
//Serial.println("--------------Seguindo a linha 2---------------");
}
Serial.println(tempo);
if(tempo < 50){
tempo++;
}
if((vira2 == 0)&& (tempo == 50)){
dist1 = (sensor1.Ranging(CM));
Serial.println(dist1);
delayMicroseconds(5000);
if(dist1 < 30){
SegueLinhaP2(valor);
}else{
vira2 = 1;
h = 1;
}
}
if((vira2 == 1)&&(a == 0)){
FuncaoViraEsquerda();
delay(30);
Serial.println(valor);
if(valor < 90){ //Acha o Preto
//Serial.println("-----------------Achou linha preta----------------");
achaB02 = 1;
a = 1;
}
}
if((vira2 == 1)&&(achaB02 == 1)){
while(y != 300){
y++;
delay(3);
analogWrite(motorPin1, 200);
analogWrite(motorPin2, 0);
//Serial.println(y);
}
/*while(c != 300){
SegueLinhaP1(valor);
c++;
}*/
//Serial.println("-----------------Achou, esta aqui 2--------------");
vira2 = 0;
achaB02 = 0;
y = 0;
h = 0;
a = 0;
c = 0;
cor = 0;
tempo = 0;
global = 0;
cont = 0;
}
}
}
void SegueLinhaP1(int valor){
if(valor < 90){
analogWrite(motorPin1, 150);
analogWrite(motorPin2, 75);
cor1 = 1;
//Serial.println("esta no if ");
}
else if((valor > 90) && (valor < 200)){
analogWrite(motorPin1, 130);
analogWrite(motorPin2, 130);
cor1 = 0;
//Serial.println("esta no else if");
}
else{
analogWrite(motorPin1, 75);
analogWrite(motorPin2, 150);
//Serial.println("esta no else");
}
}
void SegueLinhaP2(int valor){
if(valor < 170){
//dir
analogWrite(motorPin1, 75);
analogWrite(motorPin2, 150);
cor = 1;
//Serial.println("esta no if1 ");
}
else if((valor > 170) && (valor < 240)){
analogWrite(motorPin1, 130);
analogWrite(motorPin2, 130);
cor = 0;
//Serial.println("esta no else if1");
}
else{
analogWrite(motorPin1, 150);
analogWrite(motorPin2, 75);
cor = 0;
//Serial.println("esta no else1");
}
}
void para(void){
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 0);
}
void diminui(void){
for(int i = 200; i > 70; i--){
analogWrite(motorPin1, i);
analogWrite(motorPin2, i);
//delay(10);
}
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 0);
}
void FuncaoViraEsquerda(){
analogWrite(motorPin1, 90);
analogWrite(motorPin2, 200);
}
void FuncaoViraDireita(){
analogWrite(motorPin1, 130);
analogWrite(motorPin2, 80);
}