collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Help me please  (Lida 2992 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline gvirus

  • Mini Robot
  • *
  • Mensagens: 36
Help me please
« 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!
 :'(

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Help me please
« Responder #1 em: 06 de Abril de 2012, 17:58 »
Já começas-te pela parte de ler a documentação?
Avr fanboy

Offline gvirus

  • Mini Robot
  • *
  • Mensagens: 36
Re: Help me please
« Responder #2 em: 06 de Abril de 2012, 18:00 »
já,posso enviar o que diz?

Offline gvirus

  • Mini Robot
  • *
  • Mensagens: 36
Re: Help me please
« Responder #3 em: 06 de Abril de 2012, 18:07 »
já agora, que documentação me dizes?

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Help me please
« Responder #4 em: 06 de Abril de 2012, 18:13 »
Do Amarino e da biblioteca que tens no Arduino.
Avr fanboy

Offline gvirus

  • Mini Robot
  • *
  • Mensagens: 36
Re: Help me please
« Responder #5 em: 06 de Abril de 2012, 18:15 »
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.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Help me please
« Responder #6 em: 06 de Abril de 2012, 18:16 »
amarino.registerFunction(acelerometro, 'A'); // a string
Provavelmente é o A que é esse identificador, metes no sitio do A o identificador que isso te der.
Avr fanboy

Offline gvirus

  • Mini Robot
  • *
  • Mensagens: 36
Re: Help me please
« Responder #7 em: 06 de Abril de 2012, 18:36 »
Vou tentar, já te digo