Badevægt – wiibb.c – dobbelt-v dobbelt-i dobbelt-b

Vi så sidste gang at når først vores Wii Balance Board var parret, dukkede det automatisk op i device-træet som en HID input enhed som kunne findes via DEVPATH environment variablen sat af udev.  Nedenfor er en anden måde at se hvilke input devices der er

enheden  er tilgængelig både som input1 og js0 der er den gamle devicetype for joysticks. Al ny kode bør bruge input.

Flowet i en vejning er:

  • udev kalder via /etc/udev/rules.d/90-wiibb.rules wiibb.sh
  • wiibb.sh er et shell-script der klarer det overordnede program-flow, start af programmer,  debug logs,  sende resultatet videre,  lukke bluetooth ned…
  • /usr/local/bin/wiibb skrevet i C wiibb.c laver selve vejningen.

funktionalitet skal være:

  • Ingen parrings funktionalitet i wiibb.sh eller wiibb.c
  • tryk på knappen på Wii-Fit for at tænde den
  • blink LED et par gange – sker automatisk
  • forbind program med enheden – udev kalder wiibb.sh
  • tænd LED – indikerer at vi måler  – wiibb.sh
  • aflæs sensorer og middel den indtil den er stabil – wiibb.c
  • sluk LED – sker automatisk ved bluetooth disconnect
  • luk enheden ned – disconnect wii-fit wiibb.sh
  • gem/udskriv målingen og tidspunktet –wiibb.sh

Det første man skal gøre er at  læse manual-siden, desværre er der ingen for input.  Det næste er at  læse include filer, og da det er en driver, er det også værd at kigge i kildeteksten til linux-kernen, og så er der google.   Her er hvad jeg skimmede igennem:

kildeteksten til selve driveren behøver man sikkert ikke at konsultere, men det godt at vide at der er fuld dokumentation.

Vores Wii Balance Board er tilgængelig via  /dev/input/event1, Events får man fat i via read() ind i en structur der indeholder time-stamp, type, code, value, for at se på hvad det er vi har med at gøre, har jeg skrevet dette lille C-program

Output af read_events dev/input/event1 ser således ud:

Fra /usr/include/linux/input.h finder vi disse definitioner

Dermed kan vi vi skrive en første version af vores program wiibb.c

Nu ser output fra programmet således ud

Det ser ud som om der er støj på dataene, så lad os kigge nærmere på dem via gnuplot, vi tager en 5 sekunders måling og plotter resultat.  For at komme fri af nul-punktet vejer vi 4 styk 500gram Blå cirkel kaffe som jeg har bragt hjem fra Danmark til dette formål, scriptet ser således ud:

og plottet bliver:

Da jeg prøvede nogle af de eksisterende programmer i mit første indlæg, var der meget flicker på de sidste cifre, og som man ser er der periodisk støj af forskellig størrelse på de forskellige sensorer,  første indskydelse er at det hidrører fra netstøj og er på en eller anden måde relateret til 60 Hz.

Et simpel lavpas filtrering kan filtrere støjen væk der er  50-60 samples pr sekund. Inden vi laver vores endelige C-program laver vi lige et par test offline i AWK.

Lavpas filteret bidrager med 1% af forskellen til resultatet hver gang, da der er 50-60 samples pr sekund vil det tage et nogle sekunder før resultatet vil stabilisere sig, derfor bruger vi en meget større faktor 20% når forskellen er mere end 5 kg, idet vi antager at støjen er markant mindre end det.

Når resultatet ikke ændrer sig mere end +- 0.1 kg inden for 1 sekund, betragter vi resultatet som stabilt og målingen afsluttes.

Parametrene kan justeres ved at sætte env-variablerne FACTOR=0.01 og MARGIN=10 (0.1kg),

Plottet af min vejning ser således ud

Det endelige C-program

Så er der bare tilbage at kopiere funktionaliteten fra AWK-script over i C-programmet, det mest funktionen handle_sample() der skal rettes til, resultatet er:

 

 

Det endelige wrapper script wiibb.sh

I begyndelse køres scriptet med debug print på så der bliver lidt statistik at kigge på senere, og måske optimere MARGIN og DIVISOR eller hvad der nu måtte vise sig. Filerne ligger under /var/log/wiibb

/etc/udev/rules.d/90-wiibb.rules

 

Nødvendige programmer der skal installeres

Listen her bliver sikkert mere udførlig engang jeg skal installere det på en ny maskine, men der skal ihverfald installeres disse pakker

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