Hello World fra min Badevægt

Der er mange der med succes har brugt Wii Balance Board (Wii-Fit) som badevægt. Der er da også ganske meget information tilgængelig:

Plus dem vi så på i mit sidste indlæg Badevægt, problemet med de løsninger var permanent parring. så det skal vi lige have styr på først.

Der er sket meget med bluetooth på Linux siden 2008, da den oprindelige kode blev skrevet, dengang klarede applikationerne stortset det hele selv.  Og de løsninger jeg præsenterede sidste gang baserede sig alle på den rå bluetooth adgang.

I dag er abstrakstions niveauet hævet, og mange af de basale operationer klares af Bluez, som bluetooth frame-work hedder under Linux. Dermed kan man parre Wii-Fit direkte fra en GUI Bluetooth manager, eller hvis man er mere til kommando-linien så brug bluetoothctl således:

Der er allerede en driver hid-wiimote installeret under Linux, og når enheden først er parret vil den dukke op når Wii-Fit bliver tændt og fjernet når man disconnecter. Nedenfor er output fra dmesg:

Så prøver vi: batteri, ud, batteri ind igen og Wii-Fit bliver automatisk detekteret igen når vi trykker på knappen, men ikke med den samme device.  Så problemet er allerede løst, der er en hid-driver, så nu kommer vi til det svære LÆS MANUALEN: man xwiimote

Her står bl.a. hvor man kan finde sin wii-fit device i mit tilfælde:

Og der er jo det hele.  HID device med Kalibrerings data, lysdiode, batteri information, osv.

På manualsiden var der også en henvisning til  xwiishow, et C-program med kildetekst, der viser status på alle Wii-enheder dynamisk, med fin character grafik. Alle sensor-værdierne kan ses og lysdioden kan tændes og slukkes, knappen er dog ikke med.

HID enheder kan normalt bruges uden at der skal installeres drivere.

Hello World

I min verden er det første program man laver et der skriver “Hello World”, blot for at få alt det basale på plads og vise at der er hul igennem, så det vil jeg også gøre her. Den eneste output enhed der er på Wii-Fit er den blå lysdiode, så det bliver den.

Jeg vil gerne måle vægten automatisk hver gang der er nogen der bruger den, ikke noget med at man skal starte et program via GUI eller kommando-linie

Under Linux er det udev der holder styr på devices der kommer og går.  Vi kan følge med i hvad der sker via:

Den enkleste måde at få vores program til at starte når Wii-Fit bliver tændt er at lave en en ny regel: /etc/udev/rules.d/99-wiibb.rules

FIXME: Virker ikke under Ubuntu-16.10 efter reboot, da / var monteret read-only da systemd-udevd  blev startet  see discussion here: http://askubuntu.com/questions/883843/udev-rules-scripts-has-only-read-only-access-to-ubuntu16-10

Så tænder vi og slukker et par gange, og kigger på de mange variable vi kan se i /tmp/wiibb-log,  Her lægger vi specielt mærke  til:

  • Der bliver oprettet flere devices, den sidste har ACTION=change SUBSYSTEM=hid, det bruger vi reglen for at kalde vores program
  • HID_NAME=“Nintendo RVL-WBC-01” udelukker andre Wii enheder
  • HID_UNIQ er mac-adressen for Wii-Fit
  • DEVPATH fortæller hvor vi kan få fat i enheden denne gang

Næste trin er at lade udev kalde et program der morser “hello world” og derefter slukker enheden, og det er præcis hvad dette shell-script gør:

Hmm – Det virkede ikke for mig og ganske rigtigt der er en BUG i bluetoothctl der kun kommer til udtryk når man kører det fra et script, interaktivt virker det fint.  Ubuntu-16.10 har bluez-5.41,  Raspian har bluez-5.23.  Problemet er løst i bluez-5.43.  Jeg har beskrevet hvordan man installerer den nyeste version fra Zesty under Ubuntu 16.04 eller 16.10 her http://askubuntu.com/a/884062/655086, Der sker følgende:

Ovenstående virker også under Raspian, alternativt se her

http://stackoverflow.com/questions/41707164/connect-ble-devices-with-raspberry-pi-3-b

Man kunne også blot  installere bluez fra debian stretch, eller vente et par måneder så er det standard

how-to-use-stretch-testing-packages

Når det så virker installeres shell-scriptet i /usr/local/sbin/wiibb.sh, og  en opdateret version af vores udev-rule /etc/udev/rules.d/99-wiibb.rules skal være som nedenfor

Hvis man så er radio-amatør (oz1dmk),  kan man forvisse sig om at hele frame-worket virker, der er endda log-entries i dmesg.

Det var sådan set det hele, resten er blot at skrive et program til at læse vægten.  Vælg et programmerings-sprog og kom igang.

Næste gang laver vi lige et sådant program i C

Print Friendly, PDF & Email
This entry was posted in Bluetooth, Linux. Bookmark the permalink.