Lav en Nike FuelBand! Sort af ...: 5 trin

Lav en Nike FuelBand! Sort af ...: 5 trin

Indholdsfortegnelse:

Anonim

Tilbage i oktober 2012 vandt jeg en Nike FuelBand under en fundraiser på mit CrossFit gym *. Jeg er virkelig i dataindsamling, så jeg var spændt på at have en 24-timers aktivitetslogger. Jeg havde ingen anelse om, hvordan FuelBand arbejdede. Jeg så ikke nogen galvanometerprober (svovl), IR-lysdioder (puls) eller nogen form for restriktiv elastik (blodtryk), så klart, at det ikke tog biometriske aflæsninger. Da jeg er temmelig opdateret om fælles sensorteknologi, forlod det kun accelerometre og gyroskoper. Hvis jeg mangler noget, så send venligst en e-mail!

Jeg bemærkede straks det første, de fleste alle bemærker: jo mere du ryster brændstoffet, jo mere stiger metricen af ​​NikeFuel. Det er klart, at dette ikke er en sofistikeret måling, og deres brug af den vilkårlig NikeFuel-metrisk synes at være et tegn på dette. Jeg indser grænserne for bærbar telemetri, så jeg betragter dette produkt ikke som en videnskabelig enhed beregnet til at måle kaloriforbrug eller VO2max til fem decimaler, men snarere en måde at gøre træningsmålbare og tilvejebringe en mekanisme til at udvikle en rutine for folk, der har brug for den ekstra nudge.

Dette fik mig til at tænke: Hvordan kunne jeg fange mere detaljerede målinger om min træning. Jeg kom op med omkring syv forskellige sensorer, jeg kunne bygge, der ville være ikke påtrængende og bygge videre på kun bevægelsesdata alene. Men først måtte jeg faktisk lave min egen bærbare platform med en meget grundlæggende bevægelsesdetektor.

Dette instruerbare bruger et 3D accelerometer monteret til en Arduino Uno, flashhukommelse til dataoptagelse og en temmelig grov brugergrænseflade til at styre kalibrering, logføring og filhåndtering. Alt på en lille håndledsmonteret pakke. (Jeg kan godt lide Uno på grund af sin størrelse, prototype skjoldene giver plads mere plads end de mindre enheder.)

Materiel:

Arduino Uno

www.sparkfun.com/products/11021

SparkFun 3D Acceleromtoer (og nogle pin standoffs til loddetid det)

www.sparkfun.com/products/10955

DFRobot LCD Keypad Shield

http:? //www.dfrobot.com/index.php rute = produkt / pro …

DFRobot Uno Prototype Board

http:? //www.dfrobot.com/index.php rute = produkt / pro …

5x 3,3 V zener dioder

SPST Slide Switch

8mbit W2Q80 WinBond Flash Chip

Fire 1/2 "standoffs & 8 skruer, der passer til et Uno-fodspor

En lille mængde 20ga solid trådtråd

velcro

4xAAA batteriholder

4xAAA batterier

Gaffatape

* Desværre blev min brændstof forbrugt af en vens hund et par uger senere. Desværre overlevede det ikke rejsen gennem hundens mave-tarmkanal, ikke at hvis det havde overlevet, ville jeg stadig bruge det.

forsyninger:

Trin 1: Wire Accelerometer

Vælg et sted på skærmen og loddet en 8-tommers hovedhoved ned. Placer 3D-sensoren på hovedet, og lod det ligeledes ned. Sørg for at du efterlader nok plads til lodning ned i flashchipet i næste trin.

Sensoren har otte ben. To er til kraft og jord. Man sætter enheden i seng. Tre er X, Y og Z analoge udgange, og de sidste to er tilstandskonfiguration.

Modusvælgeren giver mulighed for at indstille enhedens følsomhed til 1,5 g (00), 2 g (01), 4 g (10) eller 6 g (11). Jeg valgte 1,5 g, og kun overstiger denne rating på nogle få bevægelser. Afvigelsen her er finkornet troskab i forhold til dynamisk rækkevidde.

Wire VCC til 5V, jord til jorden, sove til jorden (så enheden er altid tændt), og begge config pins til jorden. Træk X-, Y- og Z-stifterne til skærmens analoge 1, 2 og 3 stifter.

Trin 2: Wire Flash

Der er et par pletter på tavlen, der har steder til DIP layouter, gør brug af dem for at lette forbindelsen.

Til flashchip går WP # (skrivebeskyttelse), HOLD # og VCC direkte til 5V-skinnen. Tilslut dem til skinnen med Zener-dioderne i omvendt forspænding til jorden, så 5V er fastspændt til 3,3V. Chippen er kun 3.3V, så vi skal beskytte alle indgange, der drives til 5V. Du vil også sætte 3.3V Zeners parallelt med jorden på CLK, DI, DO og CS (chip select). Jeg har helt glemt at tilføje små belastningsmotorer i kredsløbet, men alt fungerede fint. Skal jeg gøre det igen, ville jeg gøre det korrekt, sådan: http: //hades.mech.northwestern.edu/images/7/74/Zen …

SPI-biblioteket forventer følgende pinopgaver

SPI MOSI (Master Out / Slave In) går til Flash pin DI (data i); skjoldstiftet 11 går til DIP-pin 5.

SPI MISO (Master In / Slave Out) går til Flash pin DO (data out); skjoldstiften 12 går til DIP pin 2.

SPI SCK (ur) går til Flash pin CLK (ur); skjoldstiften 13 går til DIP-stiften 6.

SPI SS (vælg) går til Flash pin CS # (chip select); skjoldstift 10 går til DIP-pin 1.

* Jeg har faktisk ledet CS # til pin 3, jeg aner ikke hvorfor, men noter #define i koden, hvis du ændrer dette

Trin 3: Endelig forsamling

De næste trin er ret ad hoc.

Først lag et stykke tape op for at lave et håndledbånd (eller find et 3 "bredt bånd, der passer på dit håndled). Fastgør nogle velcro for at holde din spiff armbånd fra at falde af.

Bor fire små huller i bandet, der matcher Arduino Uno afstivningshullerne. Skru standoffs i håndledbåndet og ind i Uno.

Sandwich prototypebordet med flashhukommelsen og accelerometeret oven på Uno.

Sæt LCD-tastaturet på skærmen oven på det.

Lim, tape eller på en eller anden måde sæt batteriet på håndleddet. Jeg brugte nogle Gorilla Lim. Det er fantastisk.

Løsn kontakten i serie med batteriets klips V + -røde udgang, og loddens udgang af denne ledning til VIN-stiften på skærmbilledet. Løs den jord / sorte ledning fra batteriklipset til GND-pin på skærmen.

Indsæt nogle batterier.

Tænd for kontakten for at sikre, at alle lysdioder på hver komponent i stakken lyser.

Trin 4: Upload softwaren

Softwaren har tre hovedfunktioner:

A. Præsenter brugeren med et grundlæggende brugerinterface for at vælge om:

  1. Vis X, Y, Z aflæsninger
  2. Optag X, Y, Z aflæsningerne
  3. Slet flashchip
  4. Vis, hvor mange 256-bytes sider er blevet skrevet til flashchip
B. Læs accelerometeret så hurtigt som muligt

C. Skriv dataene til Flash

Hovedparten af ​​koden er dedikeret til brugergrænsefladen. Det var en sjov proces at lære at bruge LCD-biblioteket, der følger med topskærmen. De seks knapper på skærmen sender en analog spænding til den analoge 0-pin i Uno. Dette er et ret smukt alternativ til at afvise pushbuttons (hvis du ikke ved, hvorfor det er udfordrende, vil du en dag!). Kontrolkode er ikke så svært at få hovedet rundt. Op / Ned cyklus gennem menuindstillinger, højre vælger og nulstil genstarter bare Arduino. Virkelig simpelt.

Visningstilstand

I visningstilstand sendes en streng til LCD'et med X-, Y- og Z-aflæsningerne i milli-gs. Det konvertere() funktion skalaer aflesningerne fra 0-5V til gs. Da 0g er defineret som 1,65V ved fremstillingen, og den samlede Arduino-analogfidelitet fra 0-5V måles i 1024 trin, er ligningen 5V / 1024 * X - 1,65V = g.

Optagelsestilstand

I optagemodus er displayet ikke opdateret. I stedet skrives de rå analoge data til flashhukommelsen ved hjælp af en sidebufferklasse. Hver gang 256 bytes sendes til klassen, brænder den ud af en side, skrives til flashenheden og bytter i en ny buffer. Denne klasse er en forbedring i forhold til min tidligere kode i min anemometer instruerbar.

Slet tilstand

Sletningstilstand sletter blot flashchip.

Visningssider Brugt tilstand

Brugte sider viser, hvor mange sider der er blevet udfyldt i flashenheden. Da den første byte på hver side altid er sat til 0, kan koden fremspoles til en ny frisk side efter nulstilling. Dette gør det muligt at tænde og slukke enheden og fortsætte med at skrive, hvor den er slukket.

* Bemærk: Udover Arduino-kernebiblioteket (for ting som SPI og digitalWrite ()) skal du bruge LCD-tastaturbiblioteket. Den er tilgængelig på DFRobot hjemmeside.

** Note # 2: Jeg har ikke forklaret, hvordan du downloader data fra flashchip. Det kommer i en anden instruerbar. Jeg har et dedikeret kort med en USB-forbindelse, der læser data fra denne chips. Nogle dage vil jeg flytte til SD-kort og gøre mit liv lettere.

Trin 5: Dataindsamling og afsluttende tanker

På dette tidspunkt var jeg virkelig ivrig efter at se de forskellige accelerationsmønstre fra forskellige bevægelser. Jeg var godt klar over, at en enkelt skalarværdi (accelerations 3D-vektorstørrelse) ikke ville være tilstrækkelig til at fastslå nogen nyttige positionsdata, men at komme foran sig selv gør det svært at lære og fremskridt, amiright?

Jeg spændte på min ghetto FuelBand og gik til gymnastiksalen.

Jeg udførte tre grundlæggende bevægelser:

a) 135 # back squat - rack en barbell over skulderbladene under de livmoderhalshvirvler, hold kæden stram og ryggen lige, hug ned til hoftekrigen passerer gennem knæets plan, kør knæene og hofterne frem og stå op; gentage

b) 20 # vægkugle - stående 1-2 'fra en væg, der vender mod den, hold en 20 kold brysthøjde på medicinen kneb ned til hoftekransen passerer under knæene; køre op og øverst på bevægelsen føje til momentets kugle ved at bruge armene til at kaste det på et mål 10 'højt på væggen; Når bolden vender tilbage, udfør den omvendte bevægelse for at modtage bolden. gentage.

c) 95 # olympisk snatch - oh dette er for kompliceret, bare se det op.

Hver bevægelse involverer bevægelse af arme og torso, men vægten er væsentligt anderledes. Jeg formoder, at acceleration alene ikke kunne være en indikator for lasten, men jeg ville se for mig selv.

Jeg indsamlede dataene for flere gentagelser af hver bevægelse. Jeg efterprocesserede dataene for at generere en størrelse svarende til kvadratroden af ​​summen af ​​kvadratet af hver akses acceleration; fx mag = sqrt (x ^ 2 + y ^ 2 + z ^ 2). Jeg udarbejdede resultaterne og udglødede dataene med et løbende gennemsnit. Bemærk også, at selv om en enkelt akse kan overstige 1,5g, overskred jeg aldrig endnu 1g samtidigt på to eller flere sensorer, så størrelserne var altid temmelig lave. Jeg siger dette, fordi jeg først troede, at dataene var forkerte, da størrelsen var mindre end tyngdekraften !!!

Det ser ret cool ud. Den komplekse sammensatte bevægelse af bevægelsen er kun antydet ved den samlede acceleration målt på håndleddet. Jeg kan tydeligvis se de hurtige og langsomme faser af bevægelserne, især eksplosive træk af snatchen. Mine mistanker var korrekte, det er umuligt at bemærke store forskelle i anstrengelse mellem en bevægelse (squat), som flyttede i alt ~ 1000 kg af vægt, mens en anden (wallball) kun flyttede ~ 200 kg. Det er klart, at en enkelt accelerationsværdi ikke er tilstrækkelig til at tilvejebringe en tilstrækkelig metrisk indsats udøvet, men hele processen har fået mig til at udvikle en platform, som jeg kan udvide med nye sensorer. Jeg kan se flere sensorer ved hjælp af en tomgang / hvilestilling, og derefter rekonstruere den samlede bevægelse, men det ville stadig ikke tage fat i vægten. Men jeg har nogle flere ideer …

Bliv afstemt og held og lykke! Jeg håber det inspirerer dig til at forbedre trænings telemetri!