Pages: [1]   Go Down
Author Topic: [Resolvido] Arduino + Android + Amarino  (Read 1577 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá

Estou tentando conectar o android no arduino por BT, comprei o BT, que é um JY-MCU.

Estou tentando fazer algo bem básico, usar um togglebutton para ligar ou desligar o led.
Já conectei tudo na Protoboard, criei e compilei os códigos, já coloquei o código no arduino e um apk que fiz no meu celular, um Razr I em que o android é 4.0.

Basicamente liguei o BT do celular, pareei com o BT que está no arduino e iniciei a aplicação.

Mas não acontece nada =[

Abaixo segue os códigos:
Arduino:
Code:
#include <MeetAndroid.h>


int ledPin1 = 2;
int ledPin2 = 4; //seta o pino 13 do arduino para ligar o led

MeetAndroid meetAndroid;


void setup(){
  Serial.begin(9600);
  
  meetAndroid.registerFunction(led1,'x');  
  meetAndroid.registerFunction(led2,'y');    

  
  pinMode(ledPin1, OUTPUT); //inicializa o pino digital 13 como saida
  pinMode(ledPin2, OUTPUT); //inicializa o pino digital 13 como saida
  
 }


void loop(){  
  meetAndroid.receive();
}

void led1(byte flag , byte numOfValues){  
  Serial.print(meetAndroid.getInt());
  analogWrite(ledPin1,  meetAndroid.getInt());
}

void led2(byte flag , byte numOfValues){  
  analogWrite(ledPin2,  meetAndroid.getInt());
  Serial.print(meetAndroid.getInt());
}

Android:
Code:
import android.os.Bundle;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ToggleButton;
import at.abraxas.amarino.Amarino;
import android.view.Menu;

public class MainActivity extends Activity implements View.OnClickListener{

private static final String DEVICE_ADDRESS = "00:12:09:11:13:39";

private ToggleButton tbOnOffEsq;
private ToggleButton tbOnOffDir;
public int EsqOnOff, DirOnOff;


/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Amarino.connect(this, DEVICE_ADDRESS);

EsqOnOff = EsqOnOff = 0;
tbOnOffEsq = (ToggleButton) findViewById(R.id.ledEsq);
tbOnOffDir = (ToggleButton) findViewById(R.id.ledDir);

//Evento ao clicar no ToogleButton
tbOnOffEsq.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       if (tbOnOffEsq.isChecked()) {
        EsqOnOff = 1;
       } else {
        EsqOnOff = 0;
       }
   }
});

tbOnOffDir.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       if (tbOnOffDir.isChecked()) {
        DirOnOff = 1;
       } else {
        DirOnOff = 0;
       }
   }
});

Amarino.sendDataToArduino(this, DEVICE_ADDRESS, 'x', EsqOnOff);
Amarino.sendDataToArduino(this, DEVICE_ADDRESS, 'y', DirOnOff);
}

@Override
protected void onStart() {
super.onStart();
}

@Override
protected void onStop() {
super.onStop();
// stop Amarino's background service, we don't need it any more
Amarino.disconnect(this, DEVICE_ADDRESS);
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

}

Já testei tudo separadamente, testei os leds e o BT, eu consegui acender o led usando meu pc com os módulo BT que está no arduino.
Mas pelo smartphone eu não consigo .-.

Alguém pode me ajudar? =]
« Last Edit: February 15, 2013, 07:12:43 am by lorena_danielle » Logged

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
int ledPin1 = 2;
int ledPin2 = 4; //seta o pino 13 do arduino para ligar o led

a variavel ledPin2 recebe o valor de 4 mas no comentario dizes que é o pino 13 do arduino!! errado
Quote
  pinMode(ledPin1, OUTPUT); //inicializa o pino digital 13 como saida
  pinMode(ledPin2, OUTPUT); //inicializa o pino digital 13 como saida
Aqui novamente configuras o pino errado como saida.Nao sei se apenas tens o comentario errado ou estas mesmo trocando o pino.
Fica dificil entender...
Quote
void loop(){ 
  meetAndroid.receive();
}

void led1(byte flag , byte numOfValues){ 
  Serial.print(meetAndroid.getInt());
  analogWrite(ledPin1,  meetAndroid.getInt());
}

void led2(byte flag , byte numOfValues){ 
  analogWrite(ledPin2,  meetAndroid.getInt());
  Serial.print(meetAndroid.getInt());
}

Na loop tens o metodo do objecto  meetAndroid.receive() e mais abaixo criaste duas funçoes que nunca sao chamadas em lado nenhum na tua loop, ou seja os leds nunca irao fazer nada.


Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obga pela resposta =]

Os comentários estão escritos errados, eu só copio e colo a linha e altero o pino mas me esqueço de mudar no comentário.

Baseei meu código em outros na internet e pelo que eu entendi, depois de registrarmos as funções no setup e colocamos a linha de código abaixo dentro do loop
  meetAndroid.receive();

A cada iteração, dependendo do char recebido, uma função correspondente aquele char seria chamada.

Eu não consigo colocar a chamada das funções no código pq eu não tenho os argumentos, esse valor eu recebo do celular =[
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Eu não consigo colocar a chamada das funções no código pq eu não tenho os argumentos, esse valor eu recebo do celular =[
A funçao como ela esta nunca vai funcionar, o teu programa esta mal concebido, tens de o repensar porque nao estas no caminho certo.
Eu nao conheço essa lib mas a ser verdade que o meetAndroid.receive() te devolve um char entao tens de o receber em alguma variavel ou entao passa-lo como argumento para outra.
char temp = meetAndroid.receive(); // algo assim
O programa nao vai fazer magia e saltar para as funçoes que escreves-te so porque la estao.
Ja agora o que faz o metodo receive precisamente?

O modulo bluethooth que tens deve ligar na porta Serie, ja tentaste por o chip do arduino em reset para ele se manter calado e veres se os valores te aparecem na porta Serie?
Assim podes olhar para o que se passa na Serie abrindo a porta que o arduino usa.
Desta forma podes testar o programa vindo do android para teres certeza que ele te esta a mandar, o que estas a espera.
« Last Edit: February 10, 2013, 06:42:54 pm by HugoPT » Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3112
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu vejo duas coisas...

Segundo isto:

http://www.mathias-wilhelm.de/arduino/projects/bluetooth-amarino/?PHPSESSID=iuu4b974luemd815eh21dmbma2

o método receive é feito para processar eventos. Aliás, o método receive apenas retorna um bool, logo não é daí que ela vai ler os valores.
No entanto, seria interessante, ver o que é que esse método retorna.

Depois vejo algo que pode não estar correcto ou pelo menos não condiz com o teu código.

Tu no Android, mandas o valor 0 ou 1.

Code:
if (tbOnOffEsq.isChecked()) {
        EsqOnOff = 1;
        } else {
        EsqOnOff = 0;
        }

Mas depois fazes um analogWrite... um analogWrite de 0 ou 1 é a mesma coisa.
Experimenta fazer digitalWrite...

Code:
void led2(){  //Não precisas de parametros aqui. Aliás, isto deveria dar um warning... 
  int rec = meetAndroid.getInt();
  digitalWrite(ledPin2,  rec);
  Serial.println("led2 enter");
  Serial.println((int) rec);
}

Chegas a ver algo impresso no Serial Port? A julgar pelo teu código deverias ver 0 e 1 a chegar... Experimenta a função como eu a coloquei em cima. Com a função escrita assim deverás ver se o evento foi processado e ver "led2 enter"impresso no Serial Port.

A julgar pelo exemplo do link que coloquei em cima, isto é realmente a única coisa que está a faltar. :\

Experimenta e diz o que vês.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
  meetAndroid.registerFunction(led1,'x'); 
  meetAndroid.registerFunction(led2,'y');   
Ãgora vejo onde as funçoes sao carregadas, defacto nao li correctamente o teu codigo ao ver que passas aqui as funçoes  smiley-sad-blue
Desculpa pelo mau conselho
Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Novamente obgda pelas respostas =]

Alterei o código do arduino com as alterações sugeridas, compilei e coloquei no arduino, testei novamente mas continua a mesma coisa.

Resolvi fazer uns testes para ver onde está o problema, baixei um app para o android chamado: Bluetooth RSSI, que é um app para enviar dados via BT, conectei no no BT do arduino e enviei os números 0 e 1 e funcionou \o/

Obviamente tive que mudar um pouco o código para um código mais simples, mas foi só para teste e deu certo, realmente, qdo envio um dado devo usar o digitalWrite ao invés do analogWrite, isso estava errado.

Então acredito que agora o erro esteja somente no aplicativo, estou pesquisando um pouco mais e vendo alguns códigos fontes na internet.
Qdo eu conseguir algo mais já posto.

=]
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
  meetAndroid.registerFunction(led1,'x'); 
  meetAndroid.registerFunction(led2,'y');   
Ãgora vejo onde as funçoes sao carregadas, defacto nao li correctamente o teu codigo ao ver que passas aqui as funçoes  smiley-sad-blue
Desculpa pelo mau conselho

Sem problemas, hehe

=]
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Consegui, havia mais dois erros, o primeiro era que eu não estava usando o apk Amarino para conectar no BT.
O segundo é um erro no código, estava colocando os eventos dos toggle buttons dentro do método OnCreate, enquanto eles deveriam estar no onClick.

=]
Logged

Pages: [1]   Go Up
Jump to: