LusoRobótica - Robótica em Português
Sobre o LusoRobótica - antigo => Sugestões e Questões => Tópico iniciado por: gvirus em 06 de Abril de 2012, 17:50
-
Tenho este código para o projeto:
~#include <MeetAndroid.h>
//Motor esquerdo
const int E_PWM = 6;
const int E_TRAS = 7;
const int E_FRENTE = 8;
//Motor direito
const int D_PWM = 3;
const int D_TRAS = 5;
const int D_FRENTE = 4;
const int PWM_MIN = 70;
const int PWM_MAX = 255;
//Amarino
MeetAndroid amarino;
const float MIN = 2;
const float MAX = 9;
const int X = 0;
const int Y = 1;
const int Z = 2;
long timestampUltimaLeitura;
float eixos[3];
//---
void setup() {
//Inicialização do motor esquerdo
pinMode(E_PWM, OUTPUT);
pinMode(E_FRENTE, OUTPUT);
pinMode(E_TRAS, OUTPUT);
//Inicialização do motor direito
pinMode(D_PWM, OUTPUT);
pinMode(D_FRENTE, OUTPUT);
pinMode(D_TRAS, OUTPUT);
//Inicialização do Amarino
Serial.begin(57600);
amarino.registerFunction(acelerometro, 'A'); // a string
}
void loop() {
amarino.receive(); // you need to keep this in your loop() to receive events
// distancia = readDistance();
andar();
delay(20);
}
void andar() {
//Verifica se a última leitura foi há mais de 2 segundos. Se sim, pára o carrinho.
if(millis() - timestampUltimaLeitura > 2000) {
parar();
}
//Se a leitura for recente, então comanda o carrinho
else {
int intensidadeY = intensidade(Y);
int intensidadeX = intensidade(X);
//Está indo pra frente?
if(eixos[X] >= MIN) {
//Está indo para um dos lados também?
if (eixos[Y] >= MIN) {
amarino.send("frente-esquerda");
frenteDireita(intensidadeX);
frenteEsquerda(intensidadeXY());
} else if(eixos[Y] < -MIN) {
amarino.send("frente-direita");
frenteDireita(intensidadeXY());
frenteEsquerda(intensidadeX);
} else {
amarino.send("frente");
frenteDireita(intensidadeX);
frenteEsquerda(intensidadeX);
}
} else if(eixos[X] < -MIN) {
amarino.send("tras");
trasDireita(intensidadeX);
trasEsquerda(intensidadeX);
} else if (eixos[Y] < -MIN) {
amarino.send("esquerda");
frenteDireita(0);
frenteEsquerda(intensidadeY);
} else if(eixos[Y] >= MIN) {
amarino.send("direita");
frenteDireita(intensidadeY);
frenteEsquerda(0);
} else {
parar();
}
}
}
int intensidade(int eixo) {
int intensidade = map(abs(eixos[eixo]), MIN, MAX, PWM_MIN, PWM_MAX);
if(intensidade > PWM_MAX) {
intensidade = PWM_MAX;
} else if(intensidade < PWM_MIN) {
intensidade = 0;
}
return intensidade;
}
int intensidadeXY() {
int intensidadeXY = intensidade(X) - intensidade(Y);
if(intensidadeXY < 0) {
intensidadeXY = 0;
}
return intensidadeXY;
}
void frenteEsquerda(int intensidade) {
analogWrite(E_PWM, intensidade);
digitalWrite(E_FRENTE, HIGH);
digitalWrite(E_TRAS, LOW);
}
void frenteDireita(int intensidade) {
analogWrite(D_PWM, intensidade);
digitalWrite(D_FRENTE, HIGH);
digitalWrite(D_TRAS, LOW);
}
void trasEsquerda(int intensidade) {
analogWrite(E_PWM, intensidade);
digitalWrite(E_FRENTE, LOW);
digitalWrite(E_TRAS, HIGH);
}
void trasDireita(int intensidade) {
analogWrite(D_PWM, intensidade);
digitalWrite(D_FRENTE, LOW);
digitalWrite(D_TRAS, HIGH);
}
void parar() {
digitalWrite(E_PWM, LOW);
digitalWrite(D_PWM, LOW);
}
/*
*/
void acelerometro(byte flag, byte numOfValues)
{
timestampUltimaLeitura = millis();
int length = amarino.stringLength();
char data[length];
amarino.getString(data);
String leitura = data;
//Separa a string recebida do Amarino em 3 strings
//Ex: 1.42342;-3.43242;-1.34232
int offset = 0;
int count = 0;
for(int i = 0; i < length; i++) {
//Toda vez que encontrar um ';', le de 'offset' até 'i'
if(data == ';') {
eixos[count] = stringToFloat(leitura.substring(offset, i));
offset = i + 1;
count++;
//Se o último ';' na string tiver o mesmo índice de 'i', então pega
//o restante da string no próximo elemento do array.
if(leitura.lastIndexOf(';') == i) {
eixos[count] = stringToFloat(leitura.substring(offset, length));
}
}
}
// amarino.send("x");
// amarino.send(eixos[X]);
// amarino.send("y");
// amarino.send(eixos[Y]);
// amarino.send("z");
// amarino.send(eixos[Z]);
}
/**
* Converts a String to a float
*/
float stringToFloat(String str) {
char arr[str.length()];
str.toCharArray(arr, sizeof(arr));
return atof(arr);
}
No código, muda-se o primeiro parâmetro da função "register Function" para o ID atribuído ao sensor no Amarino. A minha dúvida é como se faz!
:'(
-
Já começas-te pela parte de ler a documentação?
-
já,posso enviar o que diz?
-
já agora, que documentação me dizes?
-
Do Amarino e da biblioteca que tens no Arduino.
-
O que diz é isto:
Android
Para o Android é utilizado o Amarino que é um aplicativo open-source (código aberto), responsável por realizar a comunicação Bluetooth e enviar os dados dos sensores do smartphone para o Arduíno.
O programa Amarino é feito através do site em download Amarino e é necessário instalar também o pacote de plugins o que permite usar diferentes sensores do smartphone.
Uma vez instalado o Amarino é preciso fazer o procedimento do módulo Bluetooth com o smartphone e os passos são os seguintes:
1. Adicionar o módulo como um dispositivo em "Add BT Device";
2. Pressionar sobre o dispositivo e selecionar "Show Events";
3. Em "Add Event" adicionar o evento "Acelerometer Sensor";
4. No código, muda-se o primeiro parâmetro da função "register Function" para o ID atribuído ao sensor no Amarino.
-
amarino.registerFunction(acelerometro, 'A'); // a string
Provavelmente é o A que é esse identificador, metes no sitio do A o identificador que isso te der.
-
Vou tentar, já te digo