Autores

Daniel Augusto Cavalheiro - 0040961523036
Eduardo Teixeira de Souza - 0040971523036
Lucas Akio Kuniyoshi Arimori - 0040961523016
Pedro de Moura Pereira - 0040961523006



Dispositivo (Modelo do arduino):
Nano IO shield
Sensor ultrasônico HC-SR04
Motor de Passo PM35L-048 - HPD4 (96 passos = 1 grau).

Projeto

Carrinho autônomo.

Resumo

Projeto para construir um carrinho autônomo utilizando arduino nano, que desvia de obstáculo.


Software/materiais utilizados

Software:


Metodologia

O carrinho usa dois motores DC em configuração diferencial, desse modo não é preciso uma roda de direção. Há 3(três) sensores ultrassônicos para leitura dos obstáculos ao redor do carrinho. Um sensor para a frente, um para a direita e outro para a esquerda. Após o carrinho receber a confirmação de um obstáculo em uma das posições laterais, ele girará 45º para o lado oposto. Caso o obstáculo esteja a frente, ele virará 45º para a direita.

Desenvolvimento (problemas encontrados, como foram resolvidos, programas desenvolvidos)


Inicialmente, tivemos de estudar as bibliotecas do arduino e tivemos de fazer muitos testes.
Após algumas semanas de estudo, conseguimos fazer o carrinho se mover e desviar de alguns obstáculos.
Depois todo o desenvolvimento foi focado em correção de bugs.

imagens do projeto:

media-20170623 (3).jpg



media-20170623 (2).jpg


media-20170623 (1).jpg


download.png

Resultados:

O carrinho, utilizando um arduino Nano e um sensor ultrasonico HC-SR04, se move para a frente automáticamente e desvia de obstáculos encontrados a sua frente


#include <stepperRobot.h>
#include <actionPlan.h>
 
//motor esquerdo//
//#define lfMotorPin1 3//
//#define lfMotorPin2 2//
//#define lfMotorPin3 5//
//#define lfMotorPin4 4//
 
//motor direito//
//#define rgMotorPin1 7//
//#define rgMotorPin2 6//
//#define rgMotorPin3 8//
//#define rgMotorPin4 9//
 
//Aceleração//
//#define startSpeed 200// quando começa a andar
#define cruizingSpeed 300 //até chegar na velocidade de cruzeiro//
Movimento
#define wheelsDist 18.3
#define steps 631
 
//Sensor
#define trigPin A1
#define echoPin A0
 
int us_echo;
int min_distance = 45;
int max_distance = 200;
 
class Robot: public StepperRobot{
public:
Robot():StepperRobot(){}
 
void init(){
StepperRobot::init(startSpeed, cruizingSpeed, wheelsDist, steps);
initLeftMotor (lfMotorPin1, lfMotorPin2, lfMotorPin3, lfMotorPin4); //pinos para o motor esquerdo//
//initRightMotor(rgMotorPin1, rgMotorPin2, rgMotorPin3, rgMotorPin4);// pinos para o motor direito
turboOff();
halfStepOn();
}
};
 
int ping()
{
int firstEcho;
int secondEcho;
int thirdEcho;
int distance;
int distance_cm;
 
//first echo//
//digitalWrite(trigPin, LOW);// send low pulse for 2µs
delayMicroseconds(2);
digitalWrite(trigPin, HIGH); //send high pulse for 10µs//
//delayMicroseconds(15);//
//digitalWrite(trigPin, LOW);// back to low pulse
 
distance = pulseIn(echoPin, HIGH); //read echo value//
//firstEcho= distance/29/2;// in cm
//Serial.print(firstEcho);//
//delay(50);//
 
second echo
digitalWrite(trigPin, LOW); //send low pulse for 2µs//
//delayMicroseconds(2);//
//digitalWrite(trigPin, HIGH);// send high pulse for 10µs
delayMicroseconds(15);
digitalWrite(trigPin, LOW); //back to low pulse//
//distance = pulseIn(echoPin, HIGH);// read echo value
secondEcho= distance/29/2; //in cm//
///* Serial.print(" ");//
//Serial.print(secondEcho); *///
//delay(50);//
 
//third echo
digitalWrite(trigPin, LOW); //send low pulse for 2µs//
//delayMicroseconds(2);//
//digitalWrite(trigPin, HIGH);// send high pulse for 10µs
delayMicroseconds(15);
digitalWrite(trigPin, LOW); //back to low pulse//
//distance = pulseIn(echoPin, HIGH);// read echo value
thirdEcho= distance/29/2; // in cm
/* Serial.print(" ");
Serial.println(thirdEcho); */
delay(50);
 
//se a distância dos três echos lançados forem menor que min_distance retorna a média entre eles,
// senão retorna max_distance
if ((firstEcho < min_distance) && (secondEcho < min_distance) && (thirdEcho < min_distance))
{ return((firstEcho + secondEcho + thirdEcho) / 3); }
else
{ return(max_distance); }
}
 
 
Robot rob;
ActionPlan actPlan;
long duration;
int distance;
 
void setup(){
rob.init();
actPlan.init();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
 
boolean odd= true;
 
void loop(){
#ifndef _USE_TIMER2_
rob.run();
#endif
us_echo = ping();
 
 
Serial.print("Distance: ");
Serial.println(us_echo);
 
//se us_echo for maior que 5, carrinho se move para a frente, senão gira para a esquerda em 180 graus
if (us_echo > 5){
rob.move(mvAhead, 100);
} else {
rob.move(mvSpinL, 180);
}
 
}



Exemplo: Carritos