[Resolvido] Arduino + Android + Amarino

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:

#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:

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? =]

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

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...

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.

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 =[

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.

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.

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...

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.

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 :disappointed_relieved:
Desculpa pelo mau conselho

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.

=]

HugoPT:

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 :disappointed_relieved:
Desculpa pelo mau conselho

Sem problemas, hehe

=]

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.

=]