p3r3.com » Arduino e Programação

Arduino e Programação

Código de Robô completo pra exemplo.
// Sweep
// BARRAGAN <http://barraganstudio.com>
// Esse código de exemplo é de domínio publico

#include <Servo.h>
#define SERVO_R 9
#define SERVO_L 10
#define SENSOR_D_TRIGG 5
#define SENSOR_D_ECHO  4
#define SENSOR_R A4
#define SENSOR_L A3
#define SENSOR_D_MIN 10
#define SENSOR_D_MAX 100
#define SENSOR_D_STEP 5
#define MOVE_F 7
#define MOVE_S 0
#define MOVE_B 3
#define MOVE_LF 6
#define MOVE_RF 5
#define MOVE_LB 2
#define MOVE_RB 1
#define MOVE_SPINL 8
#define MOVE_SPINR 9
#define STATE_SCAPE 0
#define STATE_SEARCH 1
#define STATE_ATTACK 2
#define SEARCH_INTERVAL 10
#define SCAPE_INTERVAL 8
#define ATTACK_INTERVAL 10
#define SENSORD_LIMIAR 50
#define SENSORD_DIFF 5
Servo servoR;
Servo servoL;
int movement;    // variable to store robo direction

unsigned long sensorD;
unsigned long sensorDOld;
int sensorDOFF;
int sensorDON;
int sensorL;
int sensorR;
int sensorLBase;
int sensorRBase;
int state;
int currentTime;
// Functions:
void MotorSetup();
void SensorSetup();
void Sense();
void Think();
void Move();
// Setup for all:
void setup() {
Serial.begin(9600);
randomSeed(analogRead(A0));
MotorSetup();
delay(5000);
SensorSetup();
state = STATE_SEARCH;
movement = int(random(5,8)); // Escolha um movimento aleatorio
currentTime = SEARCH_INTERVAL;
Move();
}
void loop() {
Sense();
Think();
Move();
delay(100);
if(currentTime>0)
currentTime–;
}
// Implementation:
void MotorSetup() {
servoR.attach(SERVO_R);
servoL.attach(SERVO_L);
servoR.write(90);
servoL.write(90);
movement = MOVE_S;
}
void SensorSetup() {
pinMode(SENSOR_D_TRIGG,OUTPUT);
pinMode(SENSOR_D_ECHO,INPUT);
digitalWrite(SENSOR_D_TRIGG,LOW);
delay(1);
sensorD = 0;
Sense();
sensorLBase = sensorL+sensorL/2; // tolerancias de +50% do preto inicial
sensorRBase = sensorR+sensorR/2;
sensorDOld = 400;
}
void Sense() {
// Read SR04 and stores the distance[cm] in sensorD:
digitalWrite(SENSOR_D_TRIGG,HIGH);
delayMicroseconds(15);
digitalWrite(SENSOR_D_TRIGG,LOW);
sensorDOld=sensorD;
sensorD = pulseIn(SENSOR_D_ECHO,HIGH);
sensorD /= 58;
// Read line sensors:
sensorL = analogRead(SENSOR_L);
sensorR = analogRead(SENSOR_R);
}
void Think() {
// Testa se o robo atinge a faixa branca:
if(sensorL>sensorLBase || sensorR>sensorRBase) {
currentTime = SCAPE_INTERVAL;
if(state!=STATE_SCAPE) {
state = STATE_SCAPE;
Serial.println(“SET STATE_SCAPE”);
if(sensorL>sensorLBase) {
movement = MOVE_LF;
Serial.println(“MOVE_LF”);
} else{
movement = MOVE_RF;
Serial.println(“MOVE_RF”);
} } else {
if(movement==MOVE_LF && sensorR>sensorRBase) {
movement=MOVE_LB;
}
if(movement==MOVE_RF && sensorL>sensorLBase) {
movement=MOVE_RB;
} }
return;
}
// Verifica se o tempo de estado expirou. Em caso positivo assume o estado search:
if(currentTime>0) {
return;
}
// Assume o estado de ataque se a distancia lida for inferior da distancia base:
if(sensorD<SENSORD_LIMIAR || sensorD>(sensorDOld+SENSORD_DIFF)) {
Serial.println(“SET STATE_ATTACK”);
state = STATE_ATTACK;
currentTime = ATTACK_INTERVAL;
movement = MOVE_F;
return;
}
currentTime = SEARCH_INTERVAL;
if(state==STATE_SCAPE) {
movement = MOVE_F;
} else{
movement = int(random(5,8)); // Escolha de movimento aleatorio para frente, esquerda ou direita
}
state = STATE_SEARCH;
Serial.println(“SET STATE_SEARCH”);
}
void Move() {
switch(movement) {
case MOVE_RB: servoR.write(0); servoL.write(90); break;
case MOVE_LB: servoR.write(90); servoL.write(180); break;
case MOVE_B: servoR.write(0); servoL.write(180); break;
case MOVE_RF: servoR.write(180); servoL.write(90); break;
case MOVE_LF: servoR.write(90); servoL.write(0); break;
case MOVE_F: servoR.write(180); servoL.write(0); break;
case MOVE_SPINL: servoR.write(0); servoL.write(0); break;
case MOVE_SPINR: servoR.write(180); servoL.write(180); break;
default:
servoR.write(90); servoL.write(90); break;
}}

Nesse código, tem um exemplo de um robô autônomo sumô, a ideia básica consiste em criar uma função void sense(), uma função void think() e uma função void move() e chamá-las na função void loop(). A função void sense() é responsável pelos sensores, a função void think() determina um movimento a partir dos dados dos sensores e por último a função void move() movimenta o robô.

Bibliografia

http://www.bbc.com/portuguese/videos_e_fotos/2012/05/120511_computador_grecia_fn.shtml
http://www.tecmundo.com.br/tecnologia-da-informacao/1697-a-historia-dos-computadores-e-da-computacao.htm
http://www.arduino.cc/
http://labdegaragem.com/
Livro Arduino Básico. Autor: Michael McRoberts.
Livro Experimentos com o Arduino. Autor: João Alexandre da Silveira.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *