27/01/2022
Trådløs kommunikation er blevet en uundværlig del af vores digitale liv, især når det kommer til vores smartphones og tilbehør. Bluetooth er kernen i mange af disse forbindelser, men det er ikke altid ligetil at forstå de forskellige protokoller og deres anvendelser. Denne artikel vil guide dig gennem Bluetooth-protokollerne, der er relevante for musikafspilning, og derefter dykke ned i, hvordan du kan forbinde en iPhone-app med en Arduino ved hjælp af et HM10 Bluetooth 4.0 LE-modul. Uanset om du er en entusiastisk gør-det-selv-bygger eller blot ønsker at forstå bedre, hvordan din telefon interagerer trådløst, er du kommet til det rette sted.

- Bluetooth-protokoller til musik og kontrol
- Tilslutning af HM10 til Arduino: iPhone-app interaktion
- Ofte stillede spørgsmål
- Kan jeg bruge HID Bluetooth til at styre musikafspilning på min iPhone eller Android?
- Hvad er forskellen mellem A2DP og AVRCP?
- Hvorfor vælge HM10 til at forbinde Arduino med en iPhone-app?
- Er alle HM10 Bluetooth-moduler ens, og hvad skal jeg være opmærksom på ved køb?
- Hvordan konfigurerer jeg HM10-modulet?
- Afrunding
Bluetooth-protokoller til musik og kontrol
Bluetooth er en alsidig teknologi, der understøtter et væld af protokoller, hver designet til specifikke formål. Når det kommer til lyd og kontrol, er der et par nøgleprotokoller, du bør kende:
HFE (Hands-Free Profile)
Dette er Bluetooth-protokollen, der typisk bruges til telefonopkald. Den tilbyder en lav forsinkelse og bi-direktionel kommunikation med en smule båndbredde til kontrol. Kvaliteten er ofte monoral og af lavere kvalitet, da fokus er på tale og ikke musik.
HID (Human Interface Device Profile)
HID-protokollen bruges, når du forbinder enheder som tastaturer eller mus. Den er designet til at sende input fra en bruger til en enhed. Selvom det teknisk set ville være muligt at bruge HID til at sende kontrolsignaler til en musikafspiller (f.eks. afspil/pause, næste sang), er det usandsynligt, at de indbyggede musikafspillere på platforme som Android eller iPhone vil lytte til en sådan enhed. For at få dette til at fungere ville du sandsynligvis skulle udvikle din egen specialiserede musikafspiller-app. Dette gør HID uegnet til standard musikstyring.
A2DP (Advanced Audio Distribution Profile)
Dette er den protokol, du bruger, når du vil lytte til musik i høj kvalitet. A2DP understøtter to lydsendende kanaler (stereo) og tilbyder høj kvalitet, men med en vis forsinkelse. Der er ingen returlydkanal, men der er en smule båndbredde til styring af afspilningen. Det er vigtigt at bemærke, at når en A2DP Bluetooth-forbindelse er etableret, vil telefonens indbyggede højttaler sandsynligvis blive slukket, og al lyd vil blive omdirigeret til Bluetooth-forbindelsen. Dette er standardadfærden for at sikre den bedste lydoplevelse via dine trådløse hovedtelefoner eller højttalere.
AVRCP (Audio/Video Remote Control Profile)
Mens A2DP håndterer selve lydoverførslen, bruges AVRCP til at styre medieafspilningen. Denne protokol giver dig mulighed for at fjernbetjene funktioner som afspilning, pause, stop, spring over sange og justere lydstyrken. Der findes flere versioner af AVRCP-protokollen, hvilket betyder, at de tilgængelige funktioner kan variere betydeligt afhængigt af enheden og musikapplikationen. For en fuldendt trådløs musikoplevelse arbejder A2DP og AVRCP ofte hånd i hånd.
Tilslutning af HM10 til Arduino: iPhone-app interaktion
Hvis du nogensinde har drømt om at styre et Arduino-projekt direkte fra din iPhone, så er HM10 Bluetooth UART-modulet en fremragende og overkommelig løsning. Det giver dig mulighed for at etablere en trådløs forbindelse mellem en iOS-app og en Arduino via Bluetooth 4.0 LE (Low Energy).
Der findes andre muligheder for at forbinde en iPhone med en Arduino, men HM10 skiller sig ud som den mest omkostningseffektive og ligetil metode for mange projekter:
- Arduino 101-kortet: Dyrt og fysisk stort.
- WiFi: Mere kompliceret og kræver naturligvis en WiFi-forbindelse.
- BLEduino: Ikke længere tilgængelig.
- Redbearlabs BLE-shields: Ofte for dyre.
- RS232-adapter: Dyr og kræver medlemskab af Apples MFI-program for distribution.
- ESP32: En nyere, overkommelig og programmerbar BLE/WiFi-løsning. Dog forbliver HM10 for mange projekter den billigste og nemmeste måde at tilføje BLE på, da den ikke behøver at blive programmeret.
HM10 er en lille chip produceret af JNHuaMao, der anvender en Texas Instruments CC2540 (eller CC2541) BLE-chip til at fungere som et serielt pass-through-modul. Ligesom Arduino har den en TX- og en RX-pin: data, den modtager via seriel, sendes via Bluetooth til iDevice, og omvendt. HM10 har yderligere funktioner, såsom at kunne fungere som en iBeacon eller som en central enhed, men disse vil vi ikke komme ind på her.
Trin 1: Skaff hardwaren
HM10-moduler er bredt tilgængelige, ofte til en meget lav pris. Det er dog vigtigt at være opmærksom på spændingskravet: HM10 kører på 2.0 – 3.7 Volt, mens de fleste Arduino-kort bruger 5V. Dette kan løses med en simpel spændingsdeler eller ved at købe et modul, der allerede er loddet på en regulator. HM16-modulet er også en mulighed, da det ofte understøtter 5V direkte.
HM11 er i bund og grund HM10, men i en mindre pakke. Nogle af CC2540's pins er ikke eksponeret på HM11, men de er typisk ikke nødvendige for seriel kommunikation. Nyere versioner som HM16 og HM17 understøtter Bluetooth 4.1 og 5-volt tolerance, mens HM18 og HM19 understøtter Bluetooth 4.2. Disse nyere modeller bruger 32-bit chips.
Udover HM10-modulet og en Arduino har du brug for nogle ledninger. Eventuelt kan du tilføje en LED med en 470Ω modstand og en knap med en 1kΩ modstand for visuel feedback og kontrol. Hvis du ikke har en Arduino, der kan fungere som seriel konverter, skal du også bruge en USB til seriel adapter.
En vigtig advarsel: Der findes falske HM10-moduler, især fra Bolutek. Selvom de kan fungere som seriel pass-through, har de færre funktioner og understøtter andre AT-kommandoer. Den primære hardwaremæssige forskel er en manglende 32kHz ekstern oscillator. Det anbefales at anskaffe et ægte HM10-modul, da de nu koster det samme som de falske.
Trin 2: Tilslut hardwaren
Korrekt tilslutning af HM10 til din Arduino er afgørende. Du skal lodde ledninger til følgende pins på HM10-modulet:
- Plus-pin (+): Den næstnederste pin på venstre side.
- Minus-pin (-): Den nederste pin på venstre side (jord).
- TX-pin (Transmit): Den øverste pin på venstre side.
- RX-pin (Receive): Pinnen under TX-pinnen.
Hvis du bruger HM10 med en 5V-enhed (som de fleste Arduino'er), er en spændingsdeler nødvendig for RX-pinnen og eventuelt også for plus-pinnen. Hvis der er en 3.3V strømforsyning tilgængelig på din Arduino (hvilket de fleste har), kan du tilslutte HM10's plus-pin direkte til den. Mange HM10-moduler kan dog håndtere 5V-signaler på RX-pinnen uden en spændingsdeler, men det er bedst at være forsigtig.
System LED (valgfrit)
Det kan være nyttigt at kunne se, om modulet er tændt, og om det er forbundet. Du kan tilslutte en LED og en 470Ω modstand i serie mellem HM10's LED-pin og GND. Denne LED vil blinke en gang i sekundet, når den er tændt, og forblive tændt, hvis den er forbundet til en BLE-enhed.
System KEY (valgfrit)
Du kan eventuelt tilslutte en knap til den næstnederste pin på venstre side af HM10-kortet. Hvis du trykker på denne knap i mere end 1 sekund, vil modulet:
- Vågne øjeblikkeligt, hvis det er i dvaletilstand.
- Afbryde forbindelsen, hvis det er forbundet via Bluetooth.
- Nulstille til fabriksindstillinger og genstarte, hvis det er i standbytilstand (ikke testet).
Trin 3: Konfigurer HM10
Før du kan bruge HM10 til at kommunikere med din iPhone, skal du muligvis konfigurere den. Dette gøres ved at sende AT-kommandoer til den via dens fysiske serielle forbindelse. Tilslut dit Bluetooth-modul til en USB til seriel konverter (plus til plus, minus til minus, TX til RX og RX til TX). Hvis du ikke har en, kan du også bruge et Arduino-kort med et simpelt SoftwareSerial-eksempelskitse indlæst.
Tilslut derefter USB-serielkonverteren til din computer og åbn den serielle monitor i Arduino IDE. Den standard baud rate for HM10 er 9600, så sørg for at vælge dette. Vælg også 'No line ending'.
Type AT (kun store bogstaver, ingen mellemrum) og tryk enter. Hvis alt er korrekt, skal HM10 straks svare med OK. Dette bekræfter, at modulet fungerer og er klar til konfiguration.
Ændring af navn
Du kan ændre navnet på modulet, så det er lettere at identificere. For eksempel, for at ændre navnet til 'Bluetooth Serial', skriv `AT+NAMEBluetooth Serial` og tryk enter. Det skal svare med noget i stil med `OK+Set:Bluetooth Serial`. For at få det aktuelle navn, skriv `AT+NAME?`.
Ændring af Baud Rate
Baud raten bestemmer hastigheden af den serielle kommunikation. Brug `AT+BAUDx` til at ændre den, hvor 'x' er den ønskede mulighed fra nedenstående tabel. Bemærk, at når du ændrer baud raten, vil modulet ikke længere svare, før du også ændrer baud raten i den serielle monitor.

| Option | Baud Rate |
|---|---|
| 0 | 9600 |
| 1 | 19200 |
| 2 | 38400 |
| 3 | 57600 |
| 4 | 115200 |
| 5 | 4800 |
| 6 | 2400 |
| 7 | 1200 |
| 8 | 230400 |
Ændring af adgangskode og parringstype
Som standard vil HM10 ikke bede om en adgangskode ved tilslutning. Dette kan ændres med `AT+TYPE`-kommandoen. Mulighederne er:
- `AT+TYPE0`: Kræver ikke adgangskode, parrer ikke (standard).
- `AT+TYPE1`: Kræver ikke adgangskode, men parrer (udløser en parringsanmodning, men husker ikke parringen).
- `AT+TYPE2`: Kræver adgangskode, parrer ikke.
- `AT+TYPE3`: Kræver adgangskode og parrer.
Bemærk, at `AT+TYPE3` blev tilføjet i firmwareversion V524. Du kan finde din version med `AT+VERR?`. Når forbindelsestypen er indstillet, kan du opdatere adgangskoden ved hjælp af `AT+PASSx`, hvor 'x' er et sekscifret nummer. På ældre firmwareversioner skal du muligvis bruge `AT+PINx` i stedet. For at få den aktuelle adgangskode, brug `AT+PASS?`.
For at glemme en parret enhed, brug `AT+ERASE` efterfulgt af `AT+RESET` for at genstarte modulet. Vigtigt: Efter dette vil iOS-enheden stadig tro, at den er parret med enheden, hvilket kan resultere i mærkelig adfærd. Du skal manuelt "Glemme" denne enhed i iOS-systemindstillingerne også!
Trin 4: Test opkoblingen
Når din HM10 er konfigureret, er det tid til at teste, om alt fungerer som forventet. Hold din HM10 forbundet til din computer. Der findes forskellige test-apps til iOS, der kan hjælpe dig med at verificere forbindelsen. Når appen er åbnet, og du forbinder til HM10, vil status-LED'en holde op med at blinke og forblive tændt.
Tekst, du skriver i appen, skal nu vises i den serielle monitor, og tekst, du skriver i den serielle monitor, skal vises i appen. Dette bekræfter, at den serielle kommunikation over Bluetooth fungerer korrekt.
Trin 5: Skriv Arduino-skitsen
Arduino-skitsen er i princippet som enhver anden skitse, der sender og modtager data serielt. Forbindelserne er simple:
- HM10 + til Arduino 3.3V
- HM10 – til Arduino GND
- HM10 TX til Arduino RX, eller SoftwareSerials RX-pin
- HM10 RX til Arduino TX eller SoftwareSerials TX-pin (med spændingsdeler imellem, hvis nødvendigt)
Du kan finde yderligere information og eksempler i Arduinos dokumentation for `Serial` og `SoftwareSerial`. Selvom en specifik skitsen ikke er inkluderet her, vil din applikation sandsynligvis involve at læse indgående serielle data og sende udgående data baseret på din projekts logik.
Trin 6: Skriv iOS-appen
At skrive iOS-appen involverer brug af Apples Core Bluetooth-framework. HM10 har én service, `0xFFE0`, som har én karakteristik, `0xFFE1`. Disse UUID'er kan forresten ændres med AT-kommandoer. Denne service er den, du skal læse og skrive til/fra. Lange beskeder vil blive opdelt i mindre dele – husk dette, når du designer din kommunikationsprotokol.
Brug af en hjælperklasse
I stedet for at skrive hele Core Bluetooth-implementeringen fra bunden, kan du bruge en hjælperklasse. En sådan klasse vil håndtere de fleste Core Bluetooth-opgaver for dig. Du vil typisk initialisere den med en delegate, bruge den til at scanne efter perifere enheder, og når perifere enheder rapporteres til delegaten, kan brugeren vælge en at forbinde til. Når forbindelsen er etableret, vil delegaten meddele, når modulet er klar til kommunikation.
Du kan derefter kommunikere med den forbundne perifere enhed ved hjælp af forskellige funktioner til at sende og modtage strenge, bytes eller dataobjekter. Det anbefales at have en global instans af denne klasse, hvis delegate altid er indstillet til den aktuelle visning, der bruger den.
Det er vigtigt, at enhver delegate af BluetoothSerial implementerer `serialDidChangeState`-delegate-metoden, i tilfælde af at Bluetooth slås fra. Og når HM10 er forbundet, skal alle delegates også implementere `serialDidDisconnect`, i tilfælde af at HM10 slukkes. Almindelig programmeringsfornuft gælder her.
Skriv din egen implementering
Hvis du foretrækker at skrive din egen Core Bluetooth-implementering, vil processen typisk omfatte følgende trin:
- Initialiser en `CBCentralManager`-instans og indstil dens delegate.
- Scan efter annoncerende perifere enheder ved hjælp af `centralManager.scanForPeripheralsWithServices([CBUUID(string: "FFE0")], options: nil)`.
- Find alle allerede forbundne perifere enheder med `centralManager.retrieveConnectedPeripheralsWithServices([CBUUID(string: "FFE0")])`.
- Forbind til den perifere enhed, som brugeren har valgt.
- Når den er forbundet, indstil den perifere enheds delegate.
- Begynd at lede efter dens `0xFFE0`-service.
- Når servicen er fundet, søg efter servicens `0xFFE1`-karakteristik.
- Når karakteristikken er fundet, opret en reference til den.
- Bestem `WriteType` (enten `.withResponse` eller `.withoutResponse`) baseret på `characteristic.properties`.
- Abonner på den med `peripheral.setNotifyValue(true, forCharacteristic: characteristic)`.
For at skrive data til modulet kalder du `connectedPeripheral!.writeValue(data:, forCharacteristic:, type:)` med de data, du vil sende, den karakteristik, du har refereret til tidligere, og den bestemte `writetype`. Vigtigt: Ægte HM10-moduler kræver skrivning uden respons, mens falske HM10'er kan kræve skrivning med respons. Heldigvis kan du bestemme den korrekte `WriteType` ved at kigge på `characteristic.properties`.
Du kan modtage data ved at implementere `CBPeripheralDelegate`-metoden `peripheral(peripheral:, didUpdateValueForCharacteristic characteristic:, error:)`. Denne metode vil blive kaldt, fordi du tidligere abonnerede på karakteristikken.
Husk, at du sender og modtager `Data`-objekter, så du skal konvertere mellem `String` og `Data` efter behov. Det er også vigtigt at have et grundigt kendskab til `CBCentralManagerDelegate` og `CBPeripheralDelegate`-dokumentationen for at håndtere uventede ændringer korrekt.
Ofte stillede spørgsmål
Kan jeg bruge HID Bluetooth til at styre musikafspilning på min iPhone eller Android?
Nej, det er usandsynligt, at de indbyggede musikafspillere på iPhone eller Android vil lytte til kommandoer via HID (Human Interface Device) Bluetooth-protokollen, som primært er designet til tastaturer og mus. Selvom det teknisk set kan sende kontrolsignaler, skal du sandsynligvis skrive din egen musikafspiller-app for at få det til at fungere. Til musikafspilning og kontrol bruges typisk A2DP (lydoverførsel) og AVRCP (fjernkontrol).
Hvad er forskellen mellem A2DP og AVRCP?
A2DP (Advanced Audio Distribution Profile) er den Bluetooth-protokol, der bruges til at streame lyd i høj kvalitet, f.eks. musik, i stereo fra din telefon til et par hovedtelefoner eller højttalere. AVRCP (Audio/Video Remote Control Profile) er derimod den protokol, der bruges til at fjernbetjene medieafspilningen, hvilket giver dig mulighed for at afspille, pause, springe over sange og justere lydstyrken direkte fra din Bluetooth-enhed.
Hvorfor vælge HM10 til at forbinde Arduino med en iPhone-app?
HM10-modulet er et populært valg, fordi det er en af de nemmeste og mest prisvenlige måder at etablere en trådløs Bluetooth 4.0 LE (Low Energy) forbindelse mellem en iPhone-app og en Arduino. Det fungerer som en seriel pass-through, hvilket gør kommunikationen forholdsvis ligetil, og modulet behøver ikke at blive programmeret i sig selv, hvilket forenkler processen for mange projekter.
Er alle HM10 Bluetooth-moduler ens, og hvad skal jeg være opmærksom på ved køb?
Nej, ikke alle HM10-moduler er ens. Der findes falske versioner, især fra producenter som Bolutek, som kan mangle visse funktioner (f.eks. en ekstern oscillator) og have forskellige AT-kommandoer sammenlignet med de ægte JNHuaMao HM10-moduler. Det anbefales at købe ægte moduler for at sikre fuld funktionalitet og kompatibilitet med standardvejledninger. Vær også opmærksom på spændingskravene (2.0-3.7V for de fleste HM10'er), selvom nyere versioner som HM16/HM17/HM18/HM19 kan understøtte 5V.
Hvordan konfigurerer jeg HM10-modulet?
HM10-modulet konfigureres ved at sende AT-kommandoer til det via en seriel forbindelse. Du kan bruge en USB til seriel konverter eller en Arduino med et SoftwareSerial-skitse til at oprette denne forbindelse. Når den serielle forbindelse er etableret, kan du sende kommandoer som `AT+NAME` for at ændre navnet, `AT+BAUDx` for at ændre baud raten, og `AT+TYPEx` eller `AT+PASSx` for at indstille adgangskode og parringsadfærd. Husk at indstille den serielle monitors baud rate og "No line ending" korrekt.
Afrunding
At forstå Bluetooth-protokollerne for lyd og kontrol, samt at mestre forbindelsen mellem et HM10-modul og en Arduino via en iPhone-app, åbner op for en verden af muligheder for trådløse projekter. Selvom det kan virke komplekst i starten, især med Core Bluetooth på iOS, viser det sig, at kommunikationen, når først HM10 er konfigureret, er ligesom enhver anden seriel kommunikation. Med den rette hardware, omhyggelig tilslutning og en grundlæggende forståelse af AT-kommandoer og Core Bluetooth-koncepter, kan du bringe dine ideer til live og skabe interaktive projekter, der styres direkte fra din smartphone. Trådløs frihed venter på dig.
Hvis du vil læse andre artikler, der ligner Bluetooth forstået: Musik & Arduino med iPhone, kan du besøge kategorien Teknologi.
