Bluetooth

Bluetooth is een geweldig systeem voor communicatie tussen allerlei apparaten. Je kunt tussen diverse Arduino's communiceren via de PC, tablet of mobiel. Ook kun je tussen twee Arduino's communiceren. Het Bluetooth protocol zorgt voor stabiele verbindingen, die moeilijk te onderscheppen zijn. Het bereik van Bluetooth is ongeveer 10 meter. In tegenstelling tot 433 MHz zenders heb je geen specifieke bibliotheek nodig, al is het wel handig om de standaard bibliotheek SoftwareSerial te gebruiken. We gebruiken van de vele mogelijkheden van Bluetooth er maar een: seriële communicatie.

Bluetooth Low Energy (BLE)

Bluetooth Low Energy wordt steeds belangrijker. Gelukkig is het niet al te moeilijk om je Arduino geschikt te maken voor BLE. Je kunt dan allerlei apparaten via je smartphone te besturen. BLE werkt wel heel anders dan klassiek Bluetooth en je kunt daarom de onderstaande programma's die gebruik maken van COM poorten hiervoor niet gebruiken. Verderop beschrijf ik hoe het gemakkelijk kan met de HM-10 module.

De ESP32 en Bluetooth

De ESP32 processor heeft naast WiFi zowel klassiek Bluetooth v4.2 als Bluetooth Low Energy aan boord. Met klassiek Bluetooth kun je vrij gemakkelijk een seriële verbinding leggen met een Windows of Linux computer. Met Bluetooth Low Energy is het een stuk ingewikkelder.

Je kunt je afvragen of je in plaats van een HC-06 module voor de Arduino niet veel beter een ESP32 module kunt kopen. Ik denk van wel. Ik gebruik graag de zeer goedkope WeMos D1 mini ESP32. Deze geeft nooit problemen. In alle voorbeelden zie je dat er gegevens worden geprint op de seriële monitor van de Arduino. Dat is vooral bedoeld om alles te controleren. Als alles werkt kun je de ESP32 loskoppelen van je computer en op een powerbank of batterij laten werken. Inmiddels zijn er diverse Arduino versies die ook Bluetooth aan boord hebben, maar die heb ik nog niet getest.

Ik heb de communicatie getest met een Python 3 programma. Python is gratis, en er kan veel mee. Zeker voor Linux systemen (waaronder de Raspberry) is Python een goede keuze. Ik gebruik als IDE vaak Thonny of PyCharm. Met beide programma's kun je gemakkelijk een pakket als pyserial installeren. Thonny is vooral geschikt voor beginners.
Hieronder staan een paar programma's die enkele aspecten van een Bluetooth communicatie laten zien. Ik heb ze opzettelijk zo kort mogelijk gehouden, maar je kunt ze zelf uiteraard uitbreiden. Bij twee programma's gebruik ik de standaard Python bibliotheek tkinter om een grafische user interface te maken. Het zal je verbazen hoe eenvoudig dit alles is en hoe goed het werkt. De Python programma's werken ongetwijfeld ook met de HC-06 Bluetooth module, maar de Arduino programma's moeten daarvoor worden aangepast.
Upload eerst de Arduino sketch naar de ESP32 module.
De aanwezige poorten
Laat Windows vervolgens contact maken via Bluetooth. Bij een Windows 10 systeem kun je Bluetooth laten zoeken naar nieuwe apparaten. Op zeker moment moet je de ESP32 zien staan. Je ziet dan de naam die je hebt opgegeven in je Arduino sketch. Na sluiten van het zoekvenster moet de ESP32 daaronder in het lijstje staan en er bij het woord Gekoppeld, anders is er iets mis. Dit hoef je maar eenmaal te doen. Klik vervolgens op Meer Bluetooth-instellingen. Hier kun je zien welke poorten gebruikt worden. Je gebruikt de uitgaande poort. Ik heb twee verschillende ESP modules gekoppeld. Windows gaf ze poort 13 en poort 16.
Het eerste programma laat het ledje van de nodeMCU aan en uit gaan.
Houd er rekening mee dat de led op verschillende poorten kan zitten (en LED_BUILTIN werkt niet altijd goed). Er zijn zelfs ESP32 modules die geen programmeerbare led hebben.
Het eerste programma is een knipperlicht, vooral bedoeld om te kijken tot hoever het Bluetooth signaal reikt. Sluit je ESP module aan op een Powerbank of batterij en loop nadat alles werkt met de ESP in je hand weg van je computer. Mijn verbinding werkt - zonder antenne - tot ruim 25 meter.
Klik hier om de broncode van de Arduino sketch en het Python programma te zien.
Het tweede programma laat zien hoe je een Grafische User Interface kunt maken, waarmee je een led kunt aan- en uitzetten.
Klik hier om de broncode van de Arduino sketch en het Python programma te zien.
Omdat het soms lastig is om tekst te versturen (moet met Arduino C++, weer heel anders dan met Python), geef ik ook hier een voorbeeld van.
Klik hier om de broncode van de Arduino sketch en het Python programma te zien.
Afkoeling in de diepvrieskast
Tenslotte een kort programma waarmee je meetgegevens kunt doorgeven en plotten in Python. De grafiek wordt punt voor punt geplot tot twee minuten voorbij zijn, daarna wordt het eerste meetpunt steeds verwijderd, zodat de grafiek gaat schuiven. In het voorbeeld gebruik ik als thermometer een Dallas transistor. Deze kun je gemakkelijk aansluiten op de WeMos D1 mini ESP32. Sluit VCC (=5V) aan op de rechtse poot van de transistor en GND op de linkse poot. Je kunt de derde poot dan aansluiten op de pin naast GND, dat is IO16. Tussen deze pin en VCC moet je een weerstand aansluiten van ca. 4,7 kΩ. De twee benodigde bibliotheken (onewire.h en DallasTemperature) kun je makkelijk vanuit de Arduino library manager installeren. Ik heb het programma ook met een TC74 en een thermokoppel met de MAX6675 getest. Met enkele kleine wijzigingen in de Arduino sketch werkte dat ook uitstekend.
Klik hier om de broncode van de Arduino sketch en het Python programma te zien.

IOS

Apple gebruikers: wat op deze pagina staat over de klassiek Bluetooth, werkt niet met een iPad of iPhone, omdat IOS dit niet ondersteunt. Bluetooth Low Energy wordt wel ondersteund. Je kunt met een iPhone of iPad dan ook probleemloos communiceren met de HM-10 en de ESP modules.

Bluetooth communicatie met de HM-10

De HM-10 is makkelijker te gebruiken dan HC's. Als je de HM-10 paart met bijvoorbeeld een smartphone, krijg je geen COM poort, maar toch kun je gegevens versturen en ontvangen.
De HM-10 heeft 6 pinnen. Je hoeft er maar vier aan te sluiten: GND en VCC en RX en TX. Sluit RX en TX niet aan op pin 0 en 1 want dan moet je deze steeds loskoppelen als je een programma wil uploaden naar de Arduino én het wordt lastig de seriële monitor te gebruiken. Gebruik in plaats hiervan de bibliotheek SoftwareSerial.h, zodat je willekeurige andere pinnen kunt gebruiken. De nieuwste HM-10's mogen op 5V worden aangesloten. Zodra je VCC en GND hebt aangesloten gaat het lampje op de module knipperen. Zodra de module gepaard is gaat dit lampje continu branden. Erg handig!
Er zijn bibliotheken voor de HM-10 en voor "bijbehorende" programma's voor op je smartphone of tablet. Voor eenvoudige toepassingen, zoals het sturen van een robotkar en dergelijke is dat echt niet nodig. Ik testte het programma Dabble voor de iPad, maar dat gaf alleen maar problemen: het lijkt erop dat dit programma altijd een aantal extra bytes verstuurt voor de eigenlijke data. Waarschijnlijk werkt het wel goed als je de bijbehorende software bibliotheek gebruikt, maar die software is ook al een drama 😞. Als je het aan de praat krijgt dan heeft het programma wel erg mooie functies.
Er zijn gebruiksvriendelijke programma's die probleemloos op je iPad, Android tablet of smartphone werken, bijvoorbeeld Bluetooth terminal (iPad en iPhone), BLE tools (iPhone) en Serial Bluetooth Terminal (Android tablet)

Serial Bluetooth
Terminal (Android)

Bluetooth LE
Terminal (iPhone)
Het programma Serial Bluetooth Terminal werkt het best, omdat je daarbij zelf een tot 10 knoppen kunt gebruiken die direct een vooraf door jou ingestelde tekst verzendt. Als je commando's als bijvoorbeeld "aan" en "uit" wilt gebruiken dan is dat erg handig. Ik gebruik zelf één-letter commando's, omdat je dan vrijwel nooit problemen met de communicatie hebt. Een eenvoudig voorbeeldprogramma vind je hieronder.
Klik hier om de broncode van de Arduino sketch te zien.

Meer instellingen van de HM-10

Je kunt zelf heel veel instellingen van de HM-10 veranderen, zoals de baudrate en de naam. Als je de baudrate verandert dan moet je goed onthouden wat de nieuwe baudrate is. Ik beperk me tot het veranderen van de naam van de module. Omdat ik er drie gebruik om met drie robots te kunnen communiceren wil ik graag de namen Robot1, Robot2 en Robot3 kunnen gebruiken. Instellen gaat bij de HM-10 met zogenaamde AT commando's. Als je onderstaande sketch gebruikt, dan kun je de commando's in de Seriële monitor intypen en je krijgt het antwoord van de HM-10 ook terug in de Seriële monitor. Begin altijd met AT (in hoofdletters!). Je moet dan als antwoord OK terugkrijgen. Zo niet dan is er iets mis. Controleer dan als eerste of TX en RX goed zijn aangesloten. Vervolgens kun je de naam veranderen met AT+NAMERobot1 (AT en NAME moeten met hoofdletters, maar de naam mag kleine letters bevatten). De module geeft als antwoord OK+Set:Robot1. Je kunt de naam controleren met AT+NAME? De module geeft als antwoord OK+NAME:Robot1. Als je niet terugkrijgt dan heb je vermoedelijk een typefout gemaakt.
#include <SoftwareSerial.h>

SoftwareSerial SerialBT(8, 9); // Eerste is TX op de module (RX op de Arduino)
void setup()
{
  SerialBT.begin(9600);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) SerialBT.write(Serial.read());
  if (SerialBT.available() > 0) Serial.write(SerialBT.read());
}

Bluetooth communicatie met de HC‑06

De HC-06 module is zeer geschikt om verbindingen te leggen tussen een PC, tablet of mobieltje en een Arduino. Zo kun je bijvoorbeeld een afstandsbediening maken, of je kunt gegevens op een grote computer opslaan. ook kun je via een andere computer of tablet twee of meer Arduino's met elkaar laten communiceren. Klik hier voor verdere uitleg en een voorbeeld. Als je rechtstreeks wilt communiceren tussen twee Arduino's dan heb je een device nodig dat als master of slave kan worden ingesteld, bijvoorbeeld de HC-05.
opstellingMijn testopstelling

Arduino's rechtstreeks met elkaar laten communiceren met de HC-05

Je kunt met Bluetooth een zeer betrouwbare draadloze verbinding opzetten tussen twee Arduino's. Deze is veel betrouwbaarder dan met 433 MHz modules: minder storingsgevoelig en nauwelijks te onderscheppen. Hiervoor moet je de Bluetooth modules eerst op de juiste wijze configuren. Heb je dat eenmaal voor elkaar, dan is de rest erg eenvoudig. Ik heb dit getest met twee HC-05 modules. Deze kun je het best per twee stuks kopen, dan weet je zeker dat ze hetzelfde zijn.

Kijk hier als je wilt zien hoe je dit doet (hier vind je ook een sketch voor AT commando's)

Een Arduino's bedienen met een computer, tablet of smartphone

Aansluiten van de HC-06 (of HC-05) en verbinding maken met het andere device!

Zoek op internet welk programma geschikt is om seriële commando's te geven (voor Windows bijvoorbeeld RealTerm; voor Android bijvoorbeeld BlueTerm). Ook kun je de seriëel monitor van de Arduino IDE gebruiken, maar die heeft vrij beperkte mogelijkheden. Als je de module aansluit op de Arduino, dan kun je de standaard pinnen 0 en 1 (RX en TX) gebruiken, waarbij je RX van de HC-06 aansluit op de TX van de Arduino en de TX van de HC-06 op RX van de Arduino). Als je meer mogelijkheden wilt hebben dan kun je de bibliotheek SoftwareSerial gebruiken, je mag dan twee willekeurige digitale pinnen gebruiken. Omdat de pinnen 0 en 1 ook voor andere doelen gebruikt worden raad ik aan deze bibliotheek te gebruiken. VCC sluit je aan op de 5V uitgang van de Arduino. Zorg dat de computer verbinding maakt met de HC-06. Hoe dat moet is verschillend per computersysteem, maar meestal wijst het zich wel. De standaard "pin"code van de HC-06 is 1234. Als de koppeling er is dan zie je een lampje constant branden op de HC06, zo niet dan knippert het. Windows gebruikt ook de term "verbonden" maar in een andere betekenis, de module moet bij gebruik van Windows niet alleen verbonden, maar ook "gekoppeld" zijn.
Hieronder zie je een voorbeeldprogramma. Stuur vanuit een ander apparaat waarmee de HC-06 is gekoppeld een code op.

Klik hier om het programma te zien!

Het volgende zie je op een PC scherm na reset van de Arduino en invoeren van achtereenvolgens ? A spatie en $
.
Het symbool achter elke regel betekent carrige return, linefeed. Je kunt RealTerm zo instellen dat dit niet zichtbaar is.

In dit eenvoudige voorbeeld wordt de PC als afstandsbediening gebruikt. Als je een programma gebruikt zoals, Octave of Delphi, zoals in de voorbeelden hieronder, dan krijg je plotseling oneindig veel mogelijkheden: bijna de hele opslagcapaciteit van de PC kun je benutten, je kunt ingewikkelde berekeningen uitvoeren en het resultaat terugsturen naar de Arduino, de grafische mogelijkheden van de PC gebruiken enzovoorts.

Communicatie tussen twee Arduino's via een ander apparaat

Dit geeft onbeperkte mogelijkheden! Standaardprogramma's voor bluetooth communicatie volstaan niet. Je moet je eigen programma kunnen schrijven. Van de vele mogelijkheden die bluetooth kam geven, gebruikt de HC-06 er maar een: seriële communicatie. Een programma hoeft dus alleen dat maar te ondersteunen! Hogere programmeertalen ondersteunen bluetooth vaak, maar niet altijd even makkelijk. Er zijn diverse andere gratis programma's die dat ook doen. Ik testte met een drietal wiskunde programma's en met de hogere programmeertaal Delphi (Pascal).
Ik testte de gratis wiskundeprogramma's Octave, FreeMat en Scilab, alle onder Windows. Je hoeft niet veel wiskundekennis te hebben als je deze programma's alleen voor de communicatie gebruikt. Deze drie programma's hebben elk een andere manier waarop de verbindingen tot stand moeten worden gebracht. Het lukte me niet met Scilab een verbinding tot stand te brengen ondanks vele pogingen. Met FreeMat lukt het wel, maar dit programma crashte om de haverklap. Het best bruikbare programma was Octave. Ik beschrijf daarom alleen hoe het in Octave gaat.
Zoek op "GNU Octave" en download en installeer het.
Zoek en download de softwarebibliotheek "instrument-control-0.5.0.tar.gz", maar pak dit bestand niet uit. Inmiddels is er een versie met een hoger versienummer.
Start Octave en typ in: pkg install c:\Octave\ instrument-control-0.5.0.tar.gz met in plaats van c:\Octave het juiste pad naar dit bestand op jouw computer en - als je een nieuwere versie hebt - de actuele naam. Dit hoeft maar één keer te gebeuren. Wacht enige tijd tot er een mededeling komt of dat de opdrachtprompt van Octave terug komt.
Elke keer nadat je Octave start moet je deze bibliotheek laden: pkg load instrument-control .
Hieronder staan de twee regels die je in Octave kunt intoetsen (liever niet in het script, want je wilt dit maar één keer per sessie uitvoeren).
A1 = serial("\\\\.\\COM8")
A2 = serial("\\\\.\\COM15")

Met de nieuwste versie lijkt het dat je de \\\\.\\ niet meer nodig hebt. Bij mij bleek het niet nodig de baudrate aan te passen, maar dat kan wel vrij gemakkelijk in Octave. Hieronder staat een script (m-file) om de led lampjes op de twee Arduino afwisselend te laten knipperen. Werkt perfect. Met een rode en een blauwe led ziet het er ook nog leuk uit.

A1 is Arduino 1 en A2 is Arduino 2. Je kunt de poorten als volgt weer sluiten:
fclose(A1);
fclose(A2);
Op beide Arduino draait onderstaande sketch. [Moet nog komen...]
Tip: als je twee Arduino's tegelijk wil testen of twee seriële monitors tegelijk wil gebruiken start de Arduino IDE dan twee keer op. Als je dat niet doet en vanuit de Arduino twee programma's laadt dan krijg je allerlei problemen.

Via een Pascal programma (gemaakt met Delphi)

Het lukt om met een eenvoudig Delphi-programma twee Arduino's via Bluetooth tegelijk te koppelen en naar beide Arduino's data te sturen en te lezen. Dit geeft eigenlijk voldoende informatie om te weten dat je alles kun bouwen wat je wilt.

TIP: probeer niet via Delphi een algemene Bluetooth verbinding op te zetten, want dat is erg ingewikkeld en geeft bovendien veel overhead omdat de HC-06 alleen seriële communicatie ondersteunt.
Delphi testprogramma
Delphi testprogramma
Bluetooth instellingen
Ik moet dus poorten 15 en 8 gebruiken
Respons%20van%20Arduino%202.png
Respons van Arduino 2

Bluetooth en AT-commando's

De instellingen van Bluetooth modules, zoals de HC-05, de HC-06 of de HM-10, maar ook die van vele andere apparaten, kun je instellen met zogenaamde AT commando's. Hiermee kun je bijvoorbeeld de HC-05 instellen als master. Men noemt dit AT-commando's omdat ze altijd met AT beginnen, meestal gevolgd door het teken + en een korte aanduiding van de instelling die je kiest. Je moet uitsluitend hoofdletters gebruiken. Neem als eerst commando dat je opstuurt altijd AT. Als je een antwoord krijgt, al is het maar OK dan zit je goed. Een voorbeeld van een commando is AT+ROLE=M. Hiermee stel je de bluetooth zender in als master... tenminste als die dat ondersteunt. Een andere baudrate stel je in door AT+BAUD= met daar meteen achter een cijfer. Op internet kun je vinden welke baudrate bij welk cijfer hoort (maar dat kan van het fabrikaat afhangen).
Maak er een gewoonte van goed te kijken welke baudrate in werkelijkheid wordt ingesteld. Als het mis gaat kan het veel moeite kosten om de module weer aan de praat te krijgen. Ik heb meegemaakt dat de baudrate verkeerd werd ingesteld, maar ik zag nog net 2400 staan. Geen enkel programma herkende de module nog. Ik moest in een zo'n programma eerst de lagere baudrate mogelijk maken voor ik hem weer kon terugzetten op de fabrieksinstellingen. Als ik de baudrate niet had geweten dan had ik alle mogelijkheden moeten aflopen...
Modules kunnen enorm verschillen in de instelmogelijkheden: zelfs als je verschillende merken HC-06 modules hebt dan zie je bij de ene veel meer instelmogelijkheden dan bij de andere. Als een bepaald AT-commando er niet is, dan krijg je meestal gewoon geen antwoord en kun je een volgend commando proberen. Vaak kun de naam van de module veranderen. Dat is erg handig als je meerdere dezelfde modules gebruikt: AT+NAMEARDUINO1. Er zijn erg geavanceerde Arduino-programma's om AT commando's te versturen, maar je kunt het ook zelf maken. In het hoofdstuk over twee HC-05's hierboven vind je een sketch hiervoor.