Es muss nicht immer WLAN sein ...

Schalten mit Arduino über Bluetooth

Bei drahtlosen Verbindungen denkt man bei Arduino an WLAN, realisiert mit dem ESP8266 WLAN Chipsatz und integriert auf Boards wie dem Nodemcu. Dass es auch mit Bluetooth geht, zeigt dieses kleine Projekt. Es ist keine Copy/Paste Anleitung zum exakten Nachbau. Detaillierter ist der Bluetooth Verbindungsaufbau zwischen Linux und dem Modul beschrieben. Dort hatte ich die größten Verständnisprobleme.

Projektskizze:

Idee:

Nutze Bluetooth als serielle Verbindung statt USB Kabel, verwende Firmata als Sketch auf dem Arduino und kontrolliere vom lokalen Python Programm mit der Firmata Library die Arduino Input/Output Pins über Funk. Stelle noch eine REST API voran, welche eine HTTP Steuerung durch Openhab2 ermöglicht. Was benötigt man:

Komponenten

Ein Smartphone mit Openhab2 Client

Android oder IPhone. Beide haben in ihren Stores (Play-, Apple-) Apps für Openhab2. Ein Zugang über Browser zu Openhab2 funktioniert auch.

Eine Openhab2 Serverinstallation

Installationsanleitungen finden sich auf der offiziellen Openhab2 Internetseite . Alternativ kann an dieser Stelle curl verwendet werden, um das HTTP Binding von Openhab2 zu simulieren oder zu testen.

Das Openhab2 http Binding

Installation über die Paper UI von Openhab2 -> Add-ons -> Bindings -> HTTP Binding. Konfiguration über die eine Items Datein in /etc/openhab2/items.

Switch MySwitch { http=">[CHANGED:POST:http://localhost:4999/firmata_SP?action=%2$s&relais=1]" }

Diese Anweisung führt bei jedem Wechsel des Wertes für MySwitch einen HTTP-POST Request an die definierte Adresse aus. Action bekommnt den Wert on/off, geschaltet wird Relais 1.

Eine Linux Box

Diese benötigt man, wenn man nicht den Openhab2 Server selber als Bluetooth verwenden will. Sollte aber in den meisten Fällen identisch sein.

Bluetooth

Bluetooth dient zwischen der Linux Box (Openhab2 Server) und dem Arduino mit Bluetooth Adapter als Funkwegstrecke. Zur Kopplung der Geräte dient das Programm bluetoothctl.

Folgende Schritte sind für die Kommunikation auf Seiten der Linuxbox zu tun. Seitens des Arduino ist keine Anpassung im Sketch erforderlich. Die Bluetooth Kommunikation macht das Modul selber.

[bluetooth]# power on
Changing power on succeeded
[bluetooth]# agent on
Agent registered
[bluetooth]# pairable on
Changing pairable on succeeded
[bluetooth]# scan on
Discovery started
[NEW] Device 00:12:10:17:02:04 100-10-0Firmata
[bluetooth]# pair 00:12:10:17:02:04
Attempting to pair with 00:12:10:17:02:04
[CHG] Device 00:12:10:17:02:04 Connected: yes
Request PIN code
[agent] Enter PIN code: 1234
[CHG] Device 00:12:10:17:02:04 UUIDs:
	00001101-0000-1000-8000-00805f9b34fb
[CHG] Device 00:12:10:17:02:04 Paired: yes
Pairing successful
[CHG] Device 00:12:10:17:02:04 Connected: no
[bluetooth]# trust 00:12:10:17:02:04
[CHG] Device 00:12:10:17:02:04 Trusted: yes
Changing 00:12:10:17:02:04 trust succeeded
[bluetooth]# info 00:12:10:17:02:04
Device 00:12:10:17:02:04
	Name: 100-10-0Firmata
	Alias: 100-10-0Firmata
	Class: 0x001f00
	Paired: yes
	Trusted: yes
	Blocked: no
	Connected: no
	LegacyPairing: yes
	UUID: Serial Port               (00001101-0000-1000-8000-00805f9b34fb)

Die Verbindung ist konfiguriert. Eine serielle Schnittstelle mit neuen Device erstellt man mit:

rfcomm bind hci0 00:12:10:17:02:04

Unter /dev erscheint das Device /dev/rfcomm0, das man mit dem Python Skript öffnet. Hinweis: Erst nach Öffnung springt die Bluetoothverbindung auf connected. Die blinkende LED am Bluetoothmodul leuchtet dauerhaft.

Ein Python Skript
from flask import Flask, jsonify, request
from pyfirmata import Arduino, util
import json

# "Connect" to bluetooth
board = Arduino('/dev/rfcomm0')


app = Flask(__name__)

@app.route('/firmata_SP', methods=['POST'])
def send_onoff():
   myrelais = request.args.get('relais')
   myaction = request.args.get('action')
   myct = request.content_type
   
   print ( "content_type: %s" % myct)
   print ( "relais value: %s" % myrelais)
   print ( "state value: %s" % myaction)
   
   if ( myaction == "ON" ):
      print ( "Schalte Relais %s auf on" % myrelais)
      pin = 13-int(myrelais)
      board.digital[pin].write(0)
   elif ( myaction == "OFF" ):
      pin = 13-int(myrelais)
      print ( "Schalte Relais %s auf off" % myrelais)
      board.digital[pin].write(1)
   print "OK"
   return '', 204

Das ist die Schnittstelle zwischen HTTP Request und arduino, welche auf der einen Seite durch python Flask und auf der anderen Seite der seriellen Verbindung über Bluetooth und der Firmata Software aufsetzt.

HTTP Schnittstelle

Flask erstellt in wenigen Zeilen eine Rest API. Es ist eine Route /firmata_SP für POST definiert. Die Daten werden per openhab2 (s.o.) in der URL übergeben. Gestartet wird diese das Python Flask Programm mit:

#:/opt/flask# export FLASK_APP=rest_to_firmata.py
#:/opt/flask# flask run --port 4999
 * Serving Flask app "rest_to_firmata"
 * Running on http://127.0.0.1:4999/ (Press CTRL+C to quit)
pyfirmata

Nachdem das Board über Bluetooth initialisiert wird, werden über den Befehl board.digital, die Digital PINs des Arduino auf 1 bzw. auf 0 gesetzt.

Ein Arduino

Ich verwende einen ardunio nano.

Ein Bluetooth Client Adapter

Mein Adapter ist ein HC-05 Bluetooth Modul. Hier ein Arduino Tutorial zur Verkabelung und sonstigen Fragen.

Die Firmata Software

[Github Seite] (https://github.com/firmata/arduino) zum Projekt, Installation der library in der arduino Programmieroberfläche Bibliothek hinzufügen, Suche nach firmata. Den Sketch zum Arduino-Upload findet man unter Beispiele -> Firmata. Beim Upload das Bluetoothmodul dekonnektieren, da die Kommunikation über das usb-Kabel laufen soll. Danach wieder mit den Standardpins rx,tx verbinden und die Standard Serielle Verbindung läuft übe das Bluetoothmodul.

Ein Relaisboard

Mein Relaisboard ist ein [4 Kanal Relaisboard] (http://wiki.sunfounder.cc/index.php?title=4_Channel_5V_Relay_Module)

Einen Verbaucher

z.B eine Lampe.