Arduino, Bluetooth
y Android
O cómo encender una luz desde el sofá.
Francisco M Sirvent Sala
Android Developer en Redbooth
@narfss
github.com/narfss
fmSirvent.com
Arduino
Arduino es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica.
Traducción:
Un chip programable en una placa que facilita mucho la conexión de dispositivos, su alimentación y su programación.
Junto a esta placa también está disponible un IDE oficial, librerías y ejemplos básicos. El lenguaje con el que se programa normalmente es C siendo claro y accesible para todos.
Alrededor de Arduino se han creado componentes, librerías y ejemplos más complejos gracias a la comunidad.
Conexiones
Digitales:
Sobre estas conexiones puede emitir un 1 o 0, en cuanto a corriente se traduce por 5v o 0v. De igual manera puede también recibir el 1 o 0 por el mismo.
PWM:
La salida de corriente en este caso puede variar de 5v a 0v, pudiendo tener voltajes intermedios.
Analogic:
A la inversa que las salidas PWM estas serán las entradas por donde se podrá medir un voltaje.
GND:
Toma tierra.
VCC (5v, 3v):
Salida de voltaje.
IDE
Disponible en arduino.org
Archivo → Ejemplos:
Lista de ejemplos básicos explicados y organizados.
Herramientas → Placa:
Lista de placas Arduino, seleccionar la vuestra.
Herramientas → Puerto:
Seleccionar el puerto usb al que esté conectado el
Arduino.
✓ Verificar:
Comprueba que el código sea correcto.
→ Subir:
Envía el programa al Arduino.
Código ejemplo
void setup() {
� //Código ejecutado al arrancar el Arduino
�}��void loop() {
� //Código ejecutado en bucle constantemente� �}
Código ejemplo
int LED_PIN = 13;��void setup() {� pinMode(LED_PIN, OUTPUT);�}��void loop() {� digitalWrite(LED_PIN, HIGH); � delay(1000); � digitalWrite(LED_PIN, LOW); � delay(1000); �}
Bluetooth
Bluetooth es una especificación industrial para Redes Inalámbricas de Área Personal que posibilita la transmisión datos entre diferentes dispositivos mediante un enlace por radiofrecuencia en la banda ISM de los 2,4 GHz.
Traducción:
Dispositivo que conectado a un arduino nos permitirá recibir información de otros dispositivos con bluetooth, como en nuestro caso un móvil Android.
El bluetooth suele venir con un nombre y un password por defecto y podemos cambiarlo.
AT
OK
AT+NAME=NEWNAME
AT+PSWD=1234
Es necesario conectarnos por serial al módulo para utilizar estos comandos.
AT Commands
Inigo Montoya
#include <SoftwareSerial.h>��int RX = 10;�int TX = 11;�int KEY = 9;�SoftwareSerial Bluetooth(RX, TX);��void setup() {� pinMode(KEY, OUTPUT);� digitalWrite(KEY, HIGH);� Serial.begin(9600);� Serial.println("Enter AT commands:");� Bluetooth.begin(38400);�}��void loop() {� if (Bluetooth.available())� Serial.write(Bluetooth.read());� if (Serial.available())� Bluetooth.write(Serial.read());�}
Conexiones
AT por serial
En el IDE de Arduino:
Seleccionar puerto:
Herramientas → Puerto
Abrir monitor de serie:
Herramientas → Monitor série
#include <SoftwareSerial.h>��int RX = 10;�int TX = 11;�SoftwareSerial bluetooth(RX, TX);�int LED_PIN = 13;�String inputString = "";��void setup() {� bluetooth.begin(9600);� pinMode(LED_PIN, OUTPUT);�}�
Conexiones Arduino y bluetooh
Conexiones Arduino y bluetooh
void loop() {� if(bluetooth.available()) {� while(bluetooth.available()) {� inputString += (char) bluetooth.read();� }� if (inputString == "ON") {� digitalWrite(LED_PIN, HIGH); � } else if (inputString == "OFF") {� digitalWrite(LED_PIN, LOW);� }� inputString = "";� }�}
HotFix
char serialData[3];�char ON[] = "ON"; �char OF[] = "OF";��void loop() {� int bufferSize = bluetooh.available();� if (bufferSize == 2) {� bluetooh.readBytes(serialData, bufferSize);� if (strcmp(serialData, ON) == 0) {� digitalWrite(LED_PIN, HIGH); � } else if (strcmp(serialData, OF) == 0) {� digitalWrite(LED_PIN, LOW);� }� }� delay(20);�}
Android
Android es un sistema operativo basado en el núcleo Linux. Fue diseñado principalmente para dispositivos móviles.
Traducción:
El sistema operativo de un móvil Android.
La programación de aplicaciones por defecto es en Java.
Es completamente libre y gratuito.
Android Studio
Descargar e instalar Android Studio de
https://developer.android.com/sdk
Podéis descargar el IDE y el SDK necesario
junto.
Necesitareis también java.
First project
Pulsar a ”Start new Android Studio project”.
Completar el nombre y la compañía.
First project
En nuestro ejemplo la plataforma y el target serán Phone y tablet, con API mínima 15.
First project
Para que el proyecto cree automáticamente una vista básica sobre la que trabajemos elegir ”Blank Activity”
First project
Aquí podéis configurar el nombre y título que tendrán esta activity.
First project
Bienvenidos a vuestro primer proyecto:
Main layout
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"� xmlns:tools="http://schemas.android.com/tools"� android:layout_width="match_parent"� android:layout_height="match_parent"� tools:context=".MainActivity">�� <Switch� android:layout_width="wrap_content"� android:layout_height="wrap_content"� android:text="Light"� android:id="@+id/switch1"� android:layout_gravity="center" />��</FrameLayout>
Activity main
@Override� protected void onCreate(Bundle savedInstanceState) {� super.onCreate(savedInstanceState);� setContentView(R.layout.activity_main);� Switch lightSwitch = (Switch) findViewById(R.id.switch1);� lightSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {� @Override� public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {� if (outputStream != null) {� String outputData;� if (isChecked) {� outputData = "ON";� } else {� outputData= "OF";� }� try {
outputStream.write(outputData.getBytes());� } catch (IOException e) {� e.printStackTrace();� }� }� }� });� }
Activity main
private static final int SELECT_BT = 2;
...
@Override� protected void onCreate(Bundle savedInstanceState) {� super.onCreate(savedInstanceState);� setContentView(R.layout.activity_main);
Intent intent = new Intent(this, SelectBluetoothDeviceActivity.class);� startActivityForResult(intent, SELECT_BT);� configureSwitch();� }�� private void configureSwitch() {� Switch lightSwitch = (Switch) findViewById(R.id.switch1);� lightSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {� @Override� public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {� if (outputStream != null) {� String outputData;� if (isChecked) {� outputData = "ON";� } else {� outputData= "OF";� }� try {
outputStream.write(outputData.getBytes());� } catch (IOException e) {� e.printStackTrace();� }� }� }� });� }
Activity bluetooth devices
File → New → Activity → Blank activity
Darle el nombre: SelectBluetoothDeviceActivity
Activity bluetooth devices
Tenemos un nuevo activity, con su código java y su layout.
Layout bluetooth devices
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"� android:layout_width="match_parent"� android:layout_height="match_parent">�� <ListView� android:id="@+id/bt_list"� android:layout_width="match_parent"� android:layout_height="match_parent"/>��</FrameLayout>
Activity bluetooth devices
public static final String SELECTED_BLUETOOTH = "selected_blue";�private ArrayList<BluetoothDevice> bluetoothDevices;��@Override�protected void onCreate(Bundle savedInstanceState) {� super.onCreate(savedInstanceState);� setContentView(R.layout.activity_select_bluetooth_device);� prepareDevices();� configureList();�}��private void prepareDevices() {� BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();� Object[] objects = adapter.getBondedDevices().toArray();� bluetoothDevices = new ArrayList<>();� for (Object object : objects) {� bluetoothDevices.add((BluetoothDevice) object);� }�}�
Activity bluetooth devices
private void configureList() {� ListView btlist = (ListView) findViewById(R.id.bt_list);� btlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {� @Override� public void onItemClick(AdapterView<?> parent, View view, int position, long id) {� BluetoothDevice bluetoothDevice = bluetoothDevices.get(position);� Bundle conData = new Bundle();� conData.putParcelable(SELECTED_BLUETOOTH, bluetoothDevice);� Intent intent = new Intent();� intent.putExtras(conData);� setResult(RESULT_OK, intent);� finish();� }� });
btlist.setAdapter(new BluetoothListAdapter(bluetoothDevices));�}
Activity bluetooth devices
public class BluetoothListAdapter extends BaseAdapter {� private ArrayList<BluetoothDevice> devices;�� public BluetoothListAdapter(ArrayList<BluetoothDevice> bondedDevices) {� devices = bondedDevices;� }�� @Override� public int getCount() {� return devices.size();� }�� @Override� public View getView(int position, View convertView, ViewGroup parent) {� LayoutInflater inflater = (LayoutInflater) parent.getContext()� .getSystemService(Context.LAYOUT_INFLATER_SERVICE);� View rowView = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);� TextView textView1 = (TextView) rowView.findViewById(android.R.id.text1);� textView1.setText(devices.get(position).getName());� return rowView;� }�� @Override� public Object getItem(int position) {� return devices.get(position);� }�� @Override� public long getItemId(int position) {� return position;� }�}
Activity main on result
private BluetoothDevice bluetoothDevice = null;�private OutputStream outputStream;
…
protected void onActivityResult(int requestCode, int resultCode, Intent data) {� super.onActivityResult(requestCode, resultCode, data);� if (requestCode== SELECT_BT� && data != null� && data.getExtras() != null) {� bluetoothDevice =
data.getExtras().getParcelable(SelectBluetoothDeviceActivity.SELECTED_BLUETOOTH);� openBluetooth();� } else {� finish();� }�}
Activity main open bluetooth
private static final String SPP_UUID = "00001101-0000-1000-8000-00805f9b34fb";
void openBluetooth() {� UUID uuid = UUID.fromString(SPP_UUID);� BluetoothSocket socket = null;� try {� socket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid);� socket.connect();� outputStream = socket.getOutputStream();� } catch (IOException e) {� e.printStackTrace();� }� if (socket != null) {� Toast.makeText(this, "BT << " + bluetoothDevice.getName() + " >> is now open ",
Toast.LENGTH_LONG).show();� } else {� Toast.makeText(this, "BT << " + bluetoothDevice.getName() + " >> fail to open ",
Toast.LENGTH_LONG).show();� }�}
<?xml version="1.0" encoding="utf-8"?>� <manifest xmlns:android="http://schemas.android.com/apk/res/android"� package="com.fmsirvent.androidbluetoothyarduino" > � � <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>� <uses-permission android:name="android.permission.BLUETOOTH"/>� � <application� android:allowBackup="true"� android:icon="@mipmap/ic_launcher"� android:label="@string/app_name"� android:theme="@style/AppTheme" >� <activity� android:name=".MainActivity"� android:label="@string/app_name" >� <intent-filter>� <action android:name="android.intent.action.MAIN" />� <category android:name="android.intent.category.LAUNCHER" />� </intent-filter>� </activity>� <activity� android:name=".SelectBluetoothDeviceActivity"� android:label="@string/title_activity_select_bluetooth_device" >� </activity>� </application>�� </manifest>
Manifest permisos
GO!
Run → Run App...
Código fuente y documentación
https://github.com/Narfss/Arduino-Bluetooth-y-Android
O cómo encender una luz desde el sofá.
Francisco M Sirvent Sala
Android Developer en Redbooth
@narfss
github.com/narfss
fmSirvent.com
Arduino, Bluetooth y Android
Q&A