Amarino – Android com Arduino sem problemas!
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.
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:
- Amarino - Android Application – aplicação que deve ser instalada no smartphone
- MeetAndroid - Arduino Library – biblioteca do Amarino a ser usada nos sktches do Arduino
- Amarino Plug-in Bundle – conjunto de aplicações do Amarino para controlar o Arduino já predefinidas
- Amarino Library – API para enviar e receber dados do Arduino
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
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)
3. Um sketch (programa Arduino)
Montagem no Arduino
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 <MeetAndroid.h>
// 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)
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.
Este artigo tem mais de um ano
Desde já os meus parabéns ao Pedro.
Pelo excelente artigo…
Os parabéns são para o Rui Pina 🙂 Eu apenas lhe publiquei o excelente trabalho
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 🙂
muito fixe!
Parabéns ao Rui Pina e ao Pplware pelo artigo!!! Continuem!!
Muito interessante.
Gostaria de saber qual o fornecedor que aconselham para adquirir esses equipamentos (Arduino + módulo + potenciómetro).
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
qual a aplicação prática disso?
É possível usar em imensas aplicações, por exemplo abrir o portão da garagem usando o Android 😉
Muito bom Rui, parabéns 🙂
kaetano, vamos tratar dessa ideia para deixar aqui aos nossos leitores. Mete aí o Arduino ” a trabalhar” 🙂
umm em vez de um modulo bluethoot vou usar um WIFI, só porque está aqui mais a mão.
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.
Não que tenha alguma coisa contra, até pk sou grande adepto do linux, mas porque é que não pode ser em windows?
Carlos,
Sim, podes fazer isso na boa e até consegues descarregar facilmente o código criado para dentro do dispositivo.
Led sem resistencia? isso funciona sem queimar o led?
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
nem todos os arduinos tem resistencia no pin 13, acho eu.
a porta 13 ja tem resistencia
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..
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.
Não percebi no codigo porque estas linhas sao tantas vezes repetidas!?
pinMode(led, OUTPUT);
digitalWrite(led,HIGH);
delay(2000);
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.
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.
Pessoal,
Gostaria de saber se é possível utilizar o Amarino com o APC220 ao invés do Xbee.
Obrigado!
Muito bom!Apenas gostaria de saber onde posso encontrar esse mesmo modelo de bluetooth em SP ou na internet.
ABs.
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…
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)
Miguel, tenta tirar esse import, verifica se vc colocou o implements e se o nome do seu botao é este.
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);
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
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’);
“o arduino espera a ligação do android”
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?
Pode utilizar o Modulo bluetooth HC 06 ? pra fazer esssa comunicação e esses comandos AT sao padroes ?
Olá. Minha dúvida é se posso utilizar qualquer Shild ou tem que ser obrigatoriamente Bluetooth Chip: eUnistone 31308/2?
Obrigado.