Mobile · Android · Mobile

Amarino – Arduino + Android sem problemas!! (Parte II)

13 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

Amarino toolkit possibilita a comunicação via Bluetooth entre um smartphone com o Sistema Operativo Android e um microcontrolador Arduino, 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

No post anterior a comunicação era feita Android –> Arduino, neste post vamos mostar o contrário Arduino –> Android.amarino_00

Os procedimentos de configuração são iguais aos apresentados no post anterior (ver aqui), a única diferença reside nas funções que utilizamos para enviar do Arduino e receber a informação no smartphone da Android.

Vamos colocar no Android os valores de um potenciómetro ligado ao Arduino. O Shield XBee é colocado por cima, junto com o módulo Bluetooth.

amarino_02

Material necessário:
  • Smartphone Android
  • Microcontrolador Arduino
  • Modulo Bluetooth para o Arduino
  • Amarino Software Toolkit
  • LED
  • Cabo USB
  • Potenciómetro
No Android
package rp.sensordata.com;
import rp.ruipina.com.R;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.TextView;
import at.abraxas.amarino.Amarino;
import at.abraxas.amarino.AmarinoIntent;
public class SensorDataActivity extends Activity {
	// change this to your Bluetooth device address
	private static final String DEVICE_ADDRESS = "00:03:19:0D:1D:B5"; 
	TextView tvTextoArduino;
	private ArduinoReceiver arduinoReceiver = new ArduinoReceiver();
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		tvTextoArduino = (TextView) findViewById(R.id.tvTextoArduino);
	}
	@Override
	protected void onStart() {
		super.onStart();
		// in order to receive broadcasted intents we need to register our
		// receiver
		registerReceiver(arduinoReceiver, new IntentFilter(AmarinoIntent.ACTION_RECEIVED));
		// this is how you tell Amarino to connect to a specific BT device from
		// within your own code
		Amarino.connect(this, DEVICE_ADDRESS);
	}
	@Override
	protected void onStop() {
		super.onStop();
		// if you connect in onStart() you must not forget to disconnect when
		// your app is closed
		Amarino.disconnect(this, DEVICE_ADDRESS);
		// do never forget to unregister a registered receiver
		unregisterReceiver(arduinoReceiver);
	}
	/**
	 * ArduinoReceiver is responsible for catching broadcasted Amarino events.
	 * 
	 * It extracts data from the intent and updates the graph accordingly.
	 */
	public class ArduinoReceiver extends BroadcastReceiver {
		@Override
		public void onReceive(Context context, Intent intent) {
			String data = null;

			// the device address from which the data was sent, we don't need it here but to demonstrate how you retrieve it
			final String address = intent.getStringExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS);

			// the type of data which is added to the intent
			final int dataType = intent.getIntExtra(AmarinoIntent.EXTRA_DATA_TYPE, -1);

			// we only expect String data though, but it is better to check if really string was sent
			// later Amarino will support differnt data types, so far data comes always as string and
			// you have to parse the data to the type you have sent from Arduino, like it is shown below
			if (dataType == AmarinoIntent.STRING_EXTRA){
				data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA);

				if (data != null){
					try {
						tvTextoArduino.setText(data);
					} 
					catch (NumberFormatException e) { /* oh data was not an integer */ }
				}
			}
		}
	}
}
No Arduino
/*
  Sends sensor data to Arduino
 (needs SensorGraph and Amarino app installed and running on Android)
 */
#include 
MeetAndroid meetAndroid;
int led = 13;
int sensorValue = A0;
void setup()
{
	// use the baud rate your bluetooth module is configured to
	initProgram();
}
void loop()
{
  	meetAndroid.receive(); // you need to keep this in your loop() to receive events
  	// read input pin and send result to Android
	meetAndroid.send(analogRead(sensorValue));
	// add a little delay otherwise the phone is pretty busy
	delay(100);
}
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);
  
	for (int i = 0; i < 100; i++) { 
		// turn the pin on:
		digitalWrite(led, HIGH);   
		delay(1000);                  
		// turn the pin off:
		digitalWrite(led, LOW);   
		delay(1000); 
	}
 //wait for connection
	Serial.print("AT+JSCR\r\n");
 
	pinMode(led, OUTPUT);
	digitalWrite(led,LOW);
}

Se tudo correu bem…no Android vamos ver os valores do potenciómetro.

amarino_01

Esperamos que tenham gostado deste tema e estamos abertos a sugestões para próximos artigos.

Autor: Pedro Pinto
Partilhar:
Tags:
Também pode gostar

Comentários

13

Deixe um comentário

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

  1. Avatar de Filipe Caetano

    Excelente!!! 😉

    Mas eu prefiro o 802.11 ao Bluetooth, parece-me mais fiável..

  2. Avatar de Miguel Ribeiro

    Gostava de ver isto a desenvolver-se… no que poderia dar 🙂

    Offtopic: Aqui mesmo por cima, aparece-me “0 Comários”, onde deveria ser “0 comentários”, aliás “1 comentário” porque já cá estava o do Filipe Caetano.

    Cumps

  3. Avatar de Nuno Gonçalves
    Nuno Gonçalves

    Esse arduino tem que se lhe diga 😉

  4. Avatar de Daniel
    Daniel

    A mim aparecem 3 comentários quando existem 2 xD
    Em relação ao artigo acho bastante util, mas no meu ponto de vista o arduino está-se a tornar obseleto no que oferece pelo seu preço, isto em relação à concorrencia.

    1. Avatar de Ricardo P
      Ricardo P

      Qual concorrencia?

    2. Avatar de Luís Miguel
      Luís Miguel

      Podia dar algum exemplo ??? … É que me deixaste de pulga atrás da orelha 🙂

      1. Avatar de Miguel Ferreira

        queres vários usando a mesma base: miguelferreira.net ou google: bare bone arduino (ou algo assim)
        a base do arduino é muito boa, os preços é ke não… pq por exemplo, compras um raspbery pi plo mesmo preço ke pagarias por um arduino e placa de rede (ou melhor pagavas bem menos)

        1. Avatar de Ricardo P
          Ricardo P

          mas o raspberry pi pra funcionar da mesma forma tens que comprar uma Gertboard(http://goo.gl/CE2xM) que fica bem mais caro.

        2. Avatar de Luís Miguel
          Luís Miguel

          Para além do consumo…

  5. Avatar de Miguel Ferreira

    mas por acaso ficava bem aqui uma secção para microcontroladores, visto o pessoal nos ultimos dias tar a curtir isto….

  6. Avatar de Josefino Marilio
    Josefino Marilio

    gostei muito deste tutorial

  7. Avatar de Doniseti do Carmo

    Boa tarde.
    Eu tenho que colocar algo no android manifest ?

  8. Avatar de Jorge Rabello
    Jorge Rabello

    Cara perfeito teu post.. tudo funcionou perfeitamente.

    Tem alguma forma de ler valores de dois potenciômetros ao mesmo tempo ? Um em A0 e outro em A1 ???