Amarino – Android com Arduino sem problemas!

35 Comentários

Por Rui Pina  para o Pplware

Tutorial realizado no âmbito do Mestrado em Computação Móvel do Instituto Politécnico da Guarda na Unidade Curricular de Seminário

O Amarino toolkit possibilita a comunicação via Bluetooth entre um smartphone com o Sistema Operativo Android e um microcontroladorArduino, permitindo controlar dispositivos ligados a este.O Amarino software toolkit assenta basicamente em dois componentes:Numa aplicação Android que é executada no smartphone e em um “sketch” (programa no Arduino), escrito com as bibliotecas Amarino

Este tutorial mostra como ligar um smartphone Android a um microcontrolador Arduino via Bluetooth, e para exemplificar este funcionamento, foi criada uma aplicação para o smartphone que liga e desliga um LED, ligado ao Arduino.

Amarino_00

Material necessário:
  • Smartphone Android
  • Microcontrolador Arduino
  • Modulo Bluetooth para o Arduino
  • Amarino Software Toolkit
  • LED
  • Cabo USB
  • Potenciómetro

O Amarino Software Toolkit pode ser descarregado aqui

O SDK contém:

O modulo Bluetooth usado foi o seguinte:

  • Bluetooth Chip: eUnistone 31308/2
  • Version: Bluetooth 2.0 + EDR (Configurable BT 1.2)
  • TX Power: 2.5dBm
  • RX Sensitivity: -86dBm
  • Antenna: 2dBiOutdoor Range: 60 m LOS (Line of sight)

Indoor Range: 40 m NLOS (Non line of sight)

(Range measured between the Bluetooth module for Arduino and the BT Linksys dongle)

Opções especiais

  • Minimum and Maximum RSSI thresholds control
  • Adaptive Frequency Hopping
  • Security: Authentication, Pairing and Encryption
  • Store 5 different trusted devices in its internal memory
  • Master or Slave operation supported

Para modulo Bluetooth, inicialmente foi configurado diretamente, ou seja sem o ATMEL ligado ao Arduino, e colocando os jumpers em posição USB no Shied XBee onde é colocado o modulo Bluetooth.

O que é preciso fazer?

1. Descobrir e emparelhar o modulo Bluetooth ao smartphone

Para isso usei com seguintes comandos AT (Manual)

Configuração do Putty para a ligação à Serial Port

amarino_01

Comandos AT para configurar o Bluetooth

TODOS OS COMANDOS SÃO SEGUIDOS DE CTRL+M() CTRL+J()

  • 0-AT+JRES RESet SW reset of the system
  • 1-AT+JDDS=0 Device Discovery Start
  • 2-AT+JDIS=3 Discoverable Inquiry & Page Scan enabled
  • 3-AT+JRLS=1101,11,Serial Port,01,000000 Register local sevice command
  • 4-AT+JAAC=1 Auto accept connection requests command
  • 5-AT+JPCR=04,0000 PIN code reply
  • 6-AT+JSCR Stream connection request
  • 7-AT+JRBD MAC address

ENVIAR PEDIDO DE EMPARELHAMENTO DO DISPOSITIVO

Se conseguimos emparelhar o dispositivo (smartphone), com estes comandos AT, estes comandos vão ser usados no sketch do Arduino, já com o ATMEL e os jumpers colocados na posição XBee.

2. Criar um ou mais que um evento no Amarino a ser enviado para o Arduino

Poderíamos usar a aplicação Amarino, que já tem alguns eventos predefinidos, mas vamos criar um app, que controla um LED no Arduino.

É preciso importar a Amarino Library Build Path->Configure Build Path->Libraries->Add JARs…no Eclipse.

package rp.toggleled.com;
import rp.ruipina.com.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ToggleButton;
import at.abraxas.amarino.Amarino;
public class ToggleLEDActivity extends Activity implements  View.OnClickListener{

	/* TODO: change the address to the address of your Bluetooth module
	 * and ensure your device is added to Amarino
	 */
	private static final String DEVICE_ADDRESS = "00:03:19:0D:1D:B5";

	private ToggleButton tbOnOff;
	private int on,off;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
		Amarino.connect(this, DEVICE_ADDRESS);

		tbOnOff = (ToggleButton) findViewById(R.id.tbOnOff);
        tbOnOff.setOnClickListener(this);
    }

	@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);
	}

	public void onClick(View arg0) {
		// TODO Auto-generated method stub	

		if(tbOnOff.isChecked()){
			Amarino.sendDataToArduino(this, DEVICE_ADDRESS, 'O', 1);
		}else {
			Amarino.sendDataToArduino(this, DEVICE_ADDRESS, 'F', 0);
		}
	}
}

IMPORTANTE: Criar uma pasta com o nome “libs” no projeto e colocar dentro o AmarinoLibrary_v0_55.jar para a aplicação não crashar!!!

IMPORTANTE2: No AndroidManifest.xml colocar a aplicação como debuggable (true)

amarino_02

3. Um sketch (programa Arduino)

Montagem no Arduino

amarino_03

Temos de colocar as bibliotecas do Amarino na pasta do nosso Arduino IDE C:\arduino-1.0.1\libraries.

4. Carregar o sketch para o Arduino


#include 
// declare MeetAndroid so that you can call functions with it
MeetAndroid meetAndroid;
int val = 0;
int led = 13;
void setup()
{
  initProgram();
  // register callback functions, which will be called when an associated event occurs.
  meetAndroid.registerFunction(SwitchOn, 'O');
  meetAndroid.registerFunction(SwitchOff, 'F');
}
void loop()
{
  meetAndroid.receive(); // you need to keep this in your loop() to receive events
}
/*
 * Whenever the LED app changes
 * this functions will be called
 */
void SwitchOn(byte flag, byte numOfValues)
{
  digitalWrite(led, meetAndroid.getInt());
  digitalWrite(led, HIGH);
}
void SwitchOff(byte flag, byte numOfValues)
{
  digitalWrite(led, meetAndroid.getInt());
  digitalWrite(led, LOW);
}
void initProgram()
{
  Serial.begin(115200);
  delay(2000);
  Serial.print("AT+JRES\n\r");                                    // Reset command
  delay(2000);
  Serial.print("AT+JSEC=1,1,1,04,1111\n\r");                      // Enable security command
  delay(2000);
  Serial.print("AT+JDIS=3\n\r");                                  // Discorable command
  delay(2000);
  Serial.print("AT+JRLS=1101,11,Serial Port,01,000000\n\r");     // Register local sevice command
  delay(2000);
  Serial.print("AT+JAAC=1\n\r");                                 // Auto accept connection requests command
  delay(2000);
  Serial.print("AT+JPCR=04,0000\r\n");                		// PIN code reply   
  delay(2000);
  //connect the phone
  pinMode(led, OUTPUT);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(2000);
  digitalWrite(led,HIGH);
  delay(2000);
  digitalWrite(led,LOW);
  delay(3000);
  
  Serial.print("AT+JSCR\r\n");
  delay(3000);
  pinMode(led, OUTPUT);
  digitalWrite(led,LOW);
}

Depois de compilado e executado o sketch o Arduino está pronto a receber comandos do smartphone.

5. Executar a aplicação do Android (Amarino)

amarino_04

Esperamos que tenham gostado deste tema e estamos abertos a sugestões. Num próximo artigo iremos apresentar como realizar a comunicação  Arduino –> Android.

Partilhar:
Tags:

Comentários

35

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de João Rodrigues
    João Rodrigues

    Desde já os meus parabéns ao Pedro.
    Pelo excelente artigo…

    1. Avatar de Pedro Pinto

      Os parabéns são para o Rui Pina 🙂 Eu apenas lhe publiquei o excelente trabalho

      1. Avatar de DanielC
        DanielC

        Muito bem 🙂 também estou a começar a desenvolver um projecto com um arduino e xbee e irei publicar online um tutorial sobre fazer um robo e controlar sem fios com iOS e android 🙂

  2. Avatar de joao
    joao

    muito fixe!

  3. Avatar de ze
    ze

    Parabéns ao Rui Pina e ao Pplware pelo artigo!!! Continuem!!

  4. Avatar de Paulo Costa
    Paulo Costa

    Muito interessante.
    Gostaria de saber qual o fornecedor que aconselham para adquirir esses equipamentos (Arduino + módulo + potenciómetro).

  5. Avatar de carlos
    carlos

    nunca experimentei utilizar a Amarino Library num programa meu mas já utilizei a app Amarino e funciona as mil maravilhas, apesar de ao inicio ter sido um pouco complicado programar o arduino para comunicar com o amarino

  6. Avatar de Cristiano Silva
    Cristiano Silva

    qual a aplicação prática disso?

    1. Avatar de filipe caetano

      É possível usar em imensas aplicações, por exemplo abrir o portão da garagem usando o Android 😉
      Muito bom Rui, parabéns 🙂

      1. Avatar de Pedro Pinto

        kaetano, vamos tratar dessa ideia para deixar aqui aos nossos leitores. Mete aí o Arduino ” a trabalhar” 🙂

        1. Avatar de filipe caetano

          umm em vez de um modulo bluethoot vou usar um WIFI, só porque está aqui mais a mão.

  7. Avatar de carlos
    carlos

    gostaria saber se seria possivel alguem criar um disco para o virtualbox com sistema operativo ubuntu com o android sdk e o eclipse já instalados e prontos a programar, é que sempre que tento instalar o plugin android no eclipse ele fecha.

    1. Avatar de Carlos Silva

      Não que tenha alguma coisa contra, até pk sou grande adepto do linux, mas porque é que não pode ser em windows?

    2. Avatar de Pedro Pinto

      Carlos,

      Sim, podes fazer isso na boa e até consegues descarregar facilmente o código criado para dentro do dispositivo.

  8. Avatar de Letz
    Letz

    Led sem resistencia? isso funciona sem queimar o led?

    1. Avatar de Rui Pina
      Rui Pina

      Obrigado a todos.

      O PIN 13 já tem uma resistência de 1k por isso pode ser ligado diretamente, se usarem outros é OBRIGATÓRIO o uso de uma resistência.

      http://www.arduino.cc/en/Tutorial/BlinkingLED

      1. Avatar de Joao Canela
        Joao Canela

        nem todos os arduinos tem resistencia no pin 13, acho eu.

    2. Avatar de jorge
      jorge

      a porta 13 ja tem resistencia

  9. Avatar de Telmo Branco
    Telmo Branco

    Muito bem. Obrigado pela partilha 🙂
    Estou a fazer um projecto com arduino para monitorizar sinal GSM(com módulo), com antenas de diferentes características.
    A ideia de fazer uma app para android nem era mal pensada, do género wifi-analyzer, mas neste momento a informação vai para uma página web.
    Ainda tenho que “batalhar” um pouco até criar a minha primeira aplicação para android, já tentei começar várias vezes só que o tempo não ajuda, ou melhor a falta dele..

  10. Avatar de Rui Pina
    Rui Pina

    Obrigado a todos.

    Letz, como o Jorge disse o PIN 13 ja tem uma resistência de 1k, caso usem outro têm de usar uma resistência.

  11. Avatar de SamC
    SamC

    Não percebi no codigo porque estas linhas sao tantas vezes repetidas!?

    pinMode(led, OUTPUT);
    digitalWrite(led,HIGH);
    delay(2000);

    1. Avatar de Rui Pina
      Rui Pina

      Bem, eu sei que devia estar num ciclo, era com devia ser…mas o objetivo das linhas (ou do ciclo), é sinalizar o periodo de ligação entre o app Android e o Arduino. Por vezes se a ligação não é efetuada neste instante é preciso desligar/ligar o Arduino e voltar a tentar ligação.

      1. Avatar de SamC
        SamC

        Pois é que fiquei na dúvida porque não existia um ciclo ou uma chamada a uma função para fazer o piscar. Como programador, sei que é mais fácil e rápido copiar o código e colá-lo várias vezes do que fazer um ciclo.
        Mas pronto, assim como eu reparei, num trabalho académico, se é para ser avaliado, os profs não vão “pegar” logo com isso…
        No entanto, isso são pequenos pormenores que não são nada representativos do trabalho em si, o qual está muito bom e que desejo desde já os meus parabéns.

  12. Avatar de Anonimo
    Anonimo

    Pessoal,
    Gostaria de saber se é possível utilizar o Amarino com o APC220 ao invés do Xbee.

    Obrigado!

  13. Avatar de dhiego

    Muito bom!Apenas gostaria de saber onde posso encontrar esse mesmo modelo de bluetooth em SP ou na internet.

    ABs.

  14. Avatar de Willian
    Willian

    Estou querendo controlar uma lampada com um app para Android, tenho o layout do app pronto, mais não sei quase nada sobre Arduino, alguém poderia me dizer como eu faço isso ?
    Por favo, preciso muito de vocês kkkk’
    Aguardo resposta…

  15. Avatar de Miguel
    Miguel

    A aplicação em eclipse dá-me vários erros,

    import rp.ruipina.com.R;
    tbOnOff = (ToggleButton) findViewById(R.id.tbOnOff);

    Alguêm sabe como resolver?
    Já coloquei a amarino library e continuam lá!
    Será da versão do eclipse que uso? (eclypse Juno)

  16. Avatar de Lol
    Lol

    Miguel, tenta tirar esse import, verifica se vc colocou o implements e se o nome do seu botao é este.

  17. Avatar de Miguel
    Miguel

    Obrigado Lol,

    O nome do botão é esse, o que quer dizer com colocar o implements?Retirei também esse import mas continua a dar erro só tbOnOff = (ToggleButton) findViewById(R.id.tbOnOff);

  18. Avatar de Santos
    Santos

    Não entendi algumas coisas, isso é necessário?
    Para que colocar essas linhas:
    ..
    digitalWrite(led,LOW);
    delay(2000);
    digitalWrite(led,HIGH);
    delay(2000);
    digitalWrite(led,LOW);
    ..
    se quem vai ligar e desligar o led é o botão no android?

    Por exemplo, enquanto o botão no smartphone tiver on, ele vai mandar o número 1 né?
    Daí sempre vai entrar no evento e ligar o led..
    O.o

    1. Avatar de Rui Pina
      Rui Pina

      Funciona sem isso, é apenas uma ajuda visual para o tempo que se estabelece a ligação entre ambos (o arduino espera a ligação do arduino), depois da ligação estabelecida, apenas estes metodos são utilizados.
      meetAndroid.registerFunction(SwitchOn, ‘O’);
      meetAndroid.registerFunction(SwitchOff, ‘F’);

      1. Avatar de Rui Pina
        Rui Pina

        “o arduino espera a ligação do android”

  19. Avatar de =]
    =]

    Estou com um problema que não consigo resolver há um tempo, Criei um app simples no eclipse com 2 toggle buttons para controlar 2 led’s na protoboard, estou utilizando a biblioteca amarino para conectar no BT do arduino.
    Igual ao do tutorial, mas não consigo conectar no BT pelo meu app. Não sei o porquê, segui vários exemplos na internet e nenhum funcionou, mas quando utilizo um app pronto, feito o Bluetooth RSSI, funciona.

    Basicamente estou fazendo o seguinte, ligo o BT do smartphone, pareo ele com o BT que está no arduino, mas parece que assim ele não funciona porque o led do BT continua piscando.
    Abro minha app e aperto os botões e não acontece nada.
    Caso tenha interesse, segue o código da app:
    http://pastebin.com/Y8NNZ40L

    Há alguma sequencia que devo fazer? Parear com o celular antes, um app especifico ou deveria funcionar de uma vez?

  20. Avatar de ANDREY
    ANDREY

    Pode utilizar o Modulo bluetooth HC 06 ? pra fazer esssa comunicação e esses comandos AT sao padroes ?

  21. Avatar de Alexei Bueno
    Alexei Bueno

    Olá. Minha dúvida é se posso utilizar qualquer Shild ou tem que ser obrigatoriamente Bluetooth Chip: eUnistone 31308/2?
    Obrigado.