La création d'un robot téléguidé, est cool! Mais, pourquoi dépenser du temps et de l'argent sur une télécommande. Comment, peut-on observer le fonctionnement du robot? La solution est dans votre poche! Lors de l'atelier, on va entamer la partie de la communication sans fil Android/Ardiuno via Bluetooth. La création de votre télécommande, et le suivi de l'état de votre robot via votre appareil n'a jamais été aussi facile.
2. Introduction
La création d'un robot téléguidé, est cool! Mais, pourquoi dépenser encore du
temps et de l'argent sur une télécommande ? La solution et ici ! Saisissez juste
votre smartphone de votre poche et allons-y !
3. Android et Bluetooth...
La plate-forme Android inclut le support du réseau Bluetooth, qui permet à un
dispositif sans fil d'échanger des données avec d'autres dispositifs Bluetooth.
Votre smartphone Android doit avoir le Bluetooth bien évidement et doit tourner
sur Android 2.0 minimum: les fonctions pour l'utilisation Bluetooth ne sont
présentes dans le SDK qu'à partir de l'API 5.
4. Android et Bluetooth...
Voici les étapes nécessaires pour pouvoir utiliser le Bluetooth dans Android
1 - Demander la permission d'utiliser le Bluetooth :
<uses-permission android:name="android.permission.BLUETOOTH" />
2 – Vérifier la présence du Bluetooth sur le terminal :
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
// Le device ne possède pas la technologie Bluetooth
} else {
// Le device possède le Bluetooth
}
5. Android et Bluetooth...
3 - Activer le Bluetooth : Il existe deux méthodes pour pouvoir le faire.
3.1 - Être gentil et demander la permission :
if (!bluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_CODE_ENABLE_BLUETOOTH);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode != REQUEST_CODE_ENABLE_BLUETOOTH)
return;
if (resultCode == RESULT_OK) {
// L'utilisateur a activé le bluetooth
} else {
// L'utilisateur n'a pas activé le bluetooth
}
}
6. Android et Bluetooth...
3.2 - Activer le Bluetooth tout seul comme un grand :
if (!bluetoothAdapter.isEnabled()) {
bluetoothAdapter.enable();
}
N.B : Il faut ajouter la permission suivante :
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
4 - Obtenir la liste des devices déjà connus
Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
for (BluetoothDevice blueDevice : devices) {
Toast.makeText(Activity.this, "Device " + blueDevice.getName(), 1000).show();
}
7. Projet :
Le scénario de notre projet est le suivant :
Un visiteur arrive et sonne la porte à l'aide du bouton poussoir. Une notification de
joignabilité est envoyée à l'application Android pour que l'utilisateur décide s'il
veut ouvrir la porte ou non. La réponse de l'utilisateur activera une de deux diodes
LED (rouge/verte).
La liaison Bluetooth se fait par le profil Bluetooth SPP (Serial Port Profile), qui
permet d'émuler une connexion série.
Cette méthode est donc compatible avec n'importe quel microcontrôleur ayant une
interface série (Arduino pour notre cas).
9. Côté Arduino: Code
const int redLed = 4;
const int greenLed = 3;
const int btnPin = 2;
int buttonState;
int reading;
int lastButtonState = LOW;
int incomingByte;
long lastDebounceTime = 0;
long debounceDelay = 50;
void setup() {
Serial.begin(9600);
pinMode(greenLed, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(btnPin, INPUT);
}
10. Côté Arduino: Code
void loop() {
reading = digitalRead(btnPin);
if (reading != lastButtonState) {
lastDebounceTime = millis(); // reset the debouncing timer
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == HIGH) { Serial.write('K'); }
}
}
lastButtonState = buttonState;
if (Serial.available() > 0){
incomingByte = Serial.read();
if (incomingByte == 'Y'){
digitalWrite(greenLed, HIGH);
} else if (incomingByte == 'N'){
digitalWrite(redLed, HIGH);
}
}
}
20. Côté Android: Code
public void sendData(String message) {
try {
outStream.write(message.getBytes());
outStream.flush();
} catch (NullPointerException e) {
Log.e("sendData: NullPointer",e.toString());
} catch (IOException e) {
Log.e("sendData: IO",e.toString());
}
Log.i("SendData",message);
}
public void closeBT() {
if (btAdapter.isEnabled())
btAdapter.disable();
Log.i("closeBt","Bluetooth disabled");
}
21. Côté Android: Code
private class ReceiverThread extends Thread {
Handler handler;
public ReceiverThread(Handler h) {
handler = h;
}
@Override
public void run() { ... }
}
22. Côté Android: Code
@Override
public void run() {
while (true) {
try {
if (inStream.available() > 0) {
byte[] buffer = new byte[10];
int k = inStream.read(buffer, 0, 10);
if (k > 0) {
byte rawdata[] = new byte[k];
for (int i = 0; i < k; i++)
rawdata[i] = buffer[i];
String data = new String(rawdata);
Message msg = handler.obtainMessage();
Bundle b = new Bundle();
b.putString("receivedData", data);
msg.setData(b);
handler.sendMessage(msg);
}}} catch (IOException e) {
Log.e("recieveData: IO",e.toString());
}
}}}