BlueTooth Serial Link

Uit RobotMC.be
Versie door BlueHaze (overleg | bijdragen) op 29 dec 2017 om 22:20
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Ga naar: navigatie, zoeken


Inleiding

Bluetooth (BT) serial modules zijn goedkoop en kunnen worden gebruikt om een transparante verbinding te maken tussen een PC en een robot. Dit is handig voor besturing en debugging van een robot. De standaard configuratie is dat de robot wordt voorzien van een BT-slave module. Vanaf de PC wordt met Bluetooth software een verbinding opgezet met de robot. Zodra deze verbinding is gemaakt, wordt het 'eindpunt' van de verbinding op de PC zichtbaar als (virtuele) COM poort. Deze poort kan net als een normale COM poort worden benaderd, bijvoorbeeld met een terminal programma zoals putty.

Een nadeel van deze opzet is dat de de virtuele COM port verdwijnt zodra de verbinding wordt verbroken. Dit is meestal als de robot wordt uitgeschakeld. Als de robot opnieuw wordt ingeschakeld kan vanaf de PC opnieuw een verbinding worden opgezet, waarna de COM-poort weer beschikbaar is. Het terminal programma moet opnieuw gestart wordt omdat de COM-poort is 'weggeweest'.

Alternatief

Het blijkt dat ik mijn robot vaak uit en aan zet, waardoor ik ook vaak via de Bluetooth software de verbinding opnieuw tot stand moet brengen en het terminal programma opnieuw moet starten. Het zou veel handiger zijn als de verbinding automatisch tot stand komt. En het zou helemaal mooi zijn als de (virtuele) COM poort blijft bestaan als de Bluetooth verbinding wegvalt, zodat het terminalprogramma zonder extra handelingen de draad weer oppakt als de verbinding opnieuw wordt opgebouwd.

En dit blijkt goed mogelijk te zijn met een klein beetje hardware: een tweede Bluetooth serial module en een USB/serial convertor aan de PC zijn voldoende, zoals weergegeven in onderstaand blokschema.

Bluetooth serial link.jpg

Zoals we zien is bestaat het pad van de PC naar de robot uit 4 stappen.

USB

Zodra de USB/Serial convertor via USB wordt aangesloten op de PC, wordt een virtule COM poort aangemaakt. Deze COM poort blijft bestaan zolang deze module aangesloten is. De snelheid van deze verbinding is 1.5Mbps (standaard USB), meer dan genoeg voor onze toepassingen.

Serial link 1

De rx en tx pinnen van de USB/Serial convertor worden aangesloten op de eerste Bluetooth module die we als slave configureren. Ook de voeding van de Bluetooth module halen we van de USB/Serial convertor, die op haar beurt via de USB bus wordt gevoed door de PC. Het is van belang dat de snelheid (baudrate) van de USB/Serial convertor gelijk is aan die van deze eerste Bluetooth module. Vaak is deze snelheid standaard ingesteld op 9600 baud, maar 38400 komt ook voor. De snelheid van de USB/Serial convertor is de ingestelde snelheid van de virtual com port en kies je in je terminal programma. Hoe je de snelheid van de Bluetooth module instelt, is afhankelijk van het type module wat je gebruikt (zie verder). Een goede snelheid is 115200 baud (115.2 kbps), waarmee zo'n 11 karakters per miliseconde overgedragen kunnen worden.

Bluethooth link

Het Bluetooth protocol beschrijft hoe een master verbinding kan opbouwen met een slave en data overdraagt. Een slave module wacht na opstarten geduldig af tot een master contact zoekt om verbinding op te bouwen. Deze verbinding blijft in stand totdat deze expliciet wordt beeindigd (wat in ons geval niet zal gebeuren), of totdat de slave langere tijd (timeout) niets meer van de master hoort. Na het verbreken of de timeout is de slave weer beschibkaar om verbinding mee te maken. De master zoekt direct na inschakelen contact met z'n slave. Als dat na een paar pogingen niet lukt, wacht de master even en probeert het opnieuw. De snelste manier van verbinding maken is dus dat de slave klaar staat als de master wordt opgestart. Omdat de PC meestal al aan staat als de robot wordt ingeschakeld, is de Bluetooth module aan de PC de slave en die op de robot master.

De snelheid van de Bluetooth verbinding is 3Mbsp. En ook al gaat daar nog wel wat van af voor allerlei zaken, er blijft ruim voldoende over om 115.2 kbps over te dragen.

Serial link 2

De tweede Bluetooth module, die we als master configureren, wordt aangesloten op de rx en tx pinnen van de robot. Ook hier is het van belang dat de snelheid (baudrate) van deze tweede Bluetooth module gelijk is aan de snelheid van de serial port van de microcontroller van je robot. De snelheid hiervan stel je in in het programma, op het moment dat je de serial port initialiseert. De voeding van de processor gebruiken we ook voor de Bluetooth module.

Variabelen

Er zijn veel verschillende USB/serial convertors, Bluetooth modules en microcontrollers, waardoor er een oneindig aantal combinaties mogelijk is. Maar over het algemeen is iedere combinatie werkend te maken, onder voorwaarde dat beide Bluetooth module geschikt zijn voor de overdracht van serial data (in tegenstelling tot bijvoorbeeld audio) en dat de tweede Bluetooth module als master geconfigureerd kan worden. Bij het combineren van modules moet je op de volgende zaken letten.

Voedingsspanning voor de Bluetooth modules

Bluetooth modules werken op 3.3V. Microcontrollers werken over het algemeen op 3.3V of op 5V. In dat laatste geval is soms (bijvoorbeeld bij de meeste Arduino's) ook 3.3V voeding beschikbaar. USB/serial converters hebben over het algemeen geen 3.3V beschikbaar, maar alleen 5V.

Opties om de Bluetooth module te voeden:

  • gebruik de 3.3V voedingsspanning van de microcontroller.
  • gebruik een backplane (zoals JY-MCU of ZS-040) met ingebouwd low-drop regulator.
  • gebruik een 3.3V low-drop regulator (bijvoorbeeld LM1117-3V3) om 5V om te zetten in 3.3V.

Let op: sommige USB/Serial modules zijn van het type '3.3V' of hebben een jumper om de spanning in te stellen. Dit betreft over het logisch niveau van de pinnen (zie verder, 3.3V vs 5V) maar de voedingsspanning blijft meestal (altijd?) 5V.

RX en TX - Input vs Output

Rx staat voor Receive, ontvangst, en Tx staat voor Transmit, zenden. Dus dat is duidelijk, zou je verwachten, een pin de TX of TXD heet, verbind je met RX / RXD en vice versa. Helaas hebben sommige ontwerpers je 'geholpen' door de op een module met TX aan te geven dat je hier de TX pin van de andere kant op moet aansluiten.

Het algemene principe is dat de uitgang van de ene module wordt aangesloten op de ingang van de andere module. En... meestal is het geen probleem als je het verkeerd doet, dus als het niet werkt kun je de aansluitingen omwisselen en proberen of het wel werkt. En je kunt het ook eenvoudig bepalen met een multimeter: sluit de voedingsspanning aan en meet de spanning op de RX en TX pin. De uitgang zal 3.3V of 5V zijn, terwijl de ingang (nagenoeg) 0V is.

RX en TX - 3.3V vs 5V

Zoals gezegd kunnen we te maken hebben met 3.3V logica en 5V logica. Een Arduino Uno werkt bijvoorbeeld op 5V. Een 3.3V uitgang van een Bluetooth module kan probleemloos op een 5V ingang aangesloten worden. De 3.3V wordt ook door de 5V Arduino ingang als 'hoog' gezien. Andersom vraag wel aandacht: de 5V uitgangsspanning is teveel voor de ingang van de 3.3V Bluetooth module. Zet twee weerstanden (bijvoorbeeld van resp. 2.7K en 4.7K) in serie van de 5V uitgang naar massa. Het signaal op het knooppunt is ongeveer 3.3V (controleer maar met je multimeter) en kan probleemloos op de Bluetooth module worden aangesloten.

Let op: ook de RXD pin van een Bluetooth backplane is 3.3V logica, dus ook hier zijn twee weerstandjes nodig!

Uiteraard kan een 3.3V Bluetooth module direct op een 3.3V microcontroller als een ARM worden aangesloten. Het logisch niveau van de USB/Serial convertor is afhankelijk van het type 5V, 3.3V of instelbaar.

USB/Serial convertors

FTDI

Ik heb prima ervaringen met USB/Serial convertors van FTDI. De drivers zijn stabiel en werken goed, ongeacht de versie van Windows die gebruikt wordt.

Maar... in oktober 2014 heeft FTDI haar drivers voor Windows 8 aangepast zodat ze niet meer werken met nagemaakte chips en het is niet uit te sluiten dat ze dit ook voor oudere Windows versies doet. Dit betekent dat je het risico loopt dat je USB/Serial convertor (op termijn) niet meer werken, tenzij je zeker weet dat je convertor een originele chip bevat.

Arduino USBSerial

Oude Arduino ontwerpen maken gebruik van de FTDI chip, maar op de Arduino Uno en Due is deze vervangen door een tweede, kleine Atmel processor (Atmega8u2 of Atmega16u2), voorzien van software voor de conversie van USB naar Serial. Geeetech levert deze omzetter als losse module, de Pro USB/Serial Adapter.

Deze module kan als volgt aangesloten worden op een ZS-040 backplane:

Bt serial schema1.jpg


De RX uitgang van de Geeetech module is open collector. Dit houdt in dat uitgang een signaal omlaag kan trekken, maar niet omhoog duwt naar de 5V voeding. De twee weerstanden houdt de RX lijn in rust op 3.2V en de Geetech module zal deze naar 0V trekken om data te versturen.

Bluetooth modules

BC04

BC04-circuit.png

Configuratie van een BC04 gaat met de volgende stappen:

  • Stel het terminal programma in op 9600,8,1,n
  • Het commando 'AT' geeft response OK. Controleer hiermee of de verbinding werkt.
  • Optioneel: 'AT+help' geef info over module en commando's
  • Stel de gewenste baudrate in, bijvoorbeeld 115k2 met 'AT+baud8'
  • Het vorige commando heeft direct effect. Stel het terminal programma in op 115k2 en controleer met 'AT' of de verbinding werkt.
  • Stel de naam van de module in met 'AT+nametest1'. Let op: geen spatie tussen het AT-commando en de naam. De naam is alleen voor herkenbaarheid en het is handig om deze uniek te kiezen.
  • Stel de pincode in met 'AT+pin 8765'. Het is handig een eigen eigen pincode te kiezen en deze gelijk te houden voor alle modules.

Twee BC04 modules kunnen verbinding met elkaar maken, door een van de twee als master te configureren. Dit kan door pin 28 te verbinden met 3V3. Als deze pin met GND is verbonden of lost hangt, werkt de module als slave. De eerste keer kan het opbouwen van de verbinding wat meer tijd kosten. Gewoon even aan laten staan. En als het na een paar minuten nog niet is gelukt, alles uitschakelen en opnieuw inschakelen.

Als de verbinding is opgebouwd, slaat de master het adres (MAC) van de slave op en vanaf nu zal de master alleen met dit adres verbinding proberen te maken. Met het commando 'AT+CLEAR' wordt dit adres gewist, zodat met een nieuwe slave verbinding kan worden gemaakt.

HC-05

Deze modules zijn goedkoop en te vinden op Ebay, zowel met als zonder support. Met deze support kan je ze makkelijk op een breadbord pluggen om te testen. Kost iets meer, maar laat je toe een voedingsspanning te gebruiken tussen 3.3 en 6Volt. De datalijnen zitten wel op 3.3V. Zonder de support kan je ze mits wat solderen vrij eenvoudig en vooral klein inbouwen in je projectjes, maar moet de voedingsspanning echt wel 3.3V zijn. Een of twee ledjes en een connectortje en je bent vertrokken.

HC-05-back.jpg HC-05-pinout.jpg

Het voordeel van de HC-05 is dat je hem zowel als master als slave kan configureren. Standaard wordt hij geleverd op 9600 baud, dus deze moet je wel even verzetten als je hogere snelheden wil met het juiste AT commando

Algemeen

(getest met een HC05, versie 2.0-20100601 op een ZS-040 backplane)

  • Volgens de documentatie is de standaard baudrate van deze modules 38400. Het lijkt erop dat dit de vaste snelheid is van de command mode.
  • De default baudrate bij verbinding lijkt 9600 baud.

Status led

Snel knipperen (4.5x per seconde): wacht op connectie.

Langzaam knipperen (0,85 seconde aan, 0.85 seconde uit): command mode (beperkt of volledig)

Twee korte flisen (2 x 0,1 seconde, iedere 2.3 seconde): verbinding opgebouwd

Command mode

Inschakelen command mode:

Druk het knopje in, schakel de module in en hou het knopje nog 0.5-1 seconde ingedrukt. De led knippert nu langzaam en de module is in (beperkte) command mode.

In deze beperkte command mode werken de meeste AT commando's maar niet allemaal (bijvoorbeeld AT+NAME? werkt niet). De volledige command mode werkt als het knopje is ingedrukt op het moment dat het commando wordt gegeven.

Configuratie

  • Stel de terminal in op 38400 baud, cr+lf (38400 = command snelheid, data snelheid is instelbaar)
  • Stel de naam in met 'at+name=test01'
  • Stel de datasnelheid in met 'at+uart=115200,1,0' (1 stopbit, geen parity)
  • Stel de pincode in met 'at+pswd=8765'


  • Stel master mode in met 'at+role=1'

of

  • Stel slave mode in met 'at+role=0'

Je kan steeds de instellingen terug opvragen met het commando + vraagteken

  • Welke baudrate : at+uart? module antwooord dan '+UART:115200,1,0'

HC06

De HC06 (Linvor) BT-module zijn goedkope (goedkoopste?) modules. Ze ondersteunen geen Bluetooth master mode en zijn daarom niet bruikbaar voor onze link.

DFBluetooth V1 module

Dit (verouderde) product van DFRobot is een is een Bluetooth module op een backplane. In tegenstelling tot de documentatie lijkt het niet mogelijk om deze module te configureren.

In tegenstelling tot andere backplane modules, zijn ook de RX en TX pinnen geschikt voor 5V logica. Omdat de voeding en rx/tx pinnen van de meeste Bluetooth modules op dezelfde plaats zit, kun je het backplane hergebruiken door de module te door een type wat wel configureerbaar is, zoals be BC04 of HC05. Alleen voor de LED is mogelijk een extra verbinding nodig.