Stwórz Nike FuelBand! Rodzaj ...: 5 kroków

Stwórz Nike FuelBand! Rodzaj ...: 5 kroków

Spisu treści:

Anonim

W październiku 2012 roku wygrałem Nike FuelBand podczas zbiórki pieniędzy w mojej siłowni CrossFit *. Naprawdę interesuje mnie zbieranie danych, więc byłem podekscytowany, że będę miał 24-godzinny rejestrator aktywności. Nie miałem pojęcia, jak działa FuelBand. Nie widziałem żadnych sond galwanometrycznych (potliwość), diod LED IR (tętno) ani żadnego rodzaju ograniczającej elastyczności (ciśnienie krwi), więc wyraźnie nie brałem odczytów biometrycznych. Ponieważ jestem na bieżąco z powszechną technologią czujników, pozostawiły tylko akcelerometry i żyroskopy. Jeśli czegoś brakuje, napisz do mnie!

Od razu zauważyłem pierwszą rzecz, którą wszyscy zauważają: im bardziej wstrząsasz paskiem paliwa, tym bardziej wzrasta metryka NikeFuel. Oczywiście nie jest to zaawansowany pomiar, a ich użycie w dowolnej metodzie NikeFuel wydaje się wskazywać na to. Zdaję sobie sprawę z ograniczeń telemetrii nadającej się do noszenia, więc widzę ten produkt nie jako urządzenie naukowe przeznaczone do pomiaru wydatków kalorycznych lub VO2max do pięciu miejsc po przecinku, ale raczej sposób na wymierne ćwiczenia i zapewnienie mechanizmu opracowywania rutyny dla osób potrzebujących ten dodatkowy szturchnięcie.

To doprowadziło mnie do myślenia: jak mogę uchwycić bardziej szczegółowe dane dotyczące mojego treningu. Wymyśliłem około siedmiu różnych czujników, które mogłem zbudować, które nie byłyby nachalne i opierały się wyłącznie na danych dotyczących ruchu. Ale najpierw musiałem stworzyć własną platformę do noszenia z bardzo prostym detektorem ruchu.

To instruktażowe wykorzystanie akcelerometru 3D zamontowanego na Arduino Uno, pamięci flash do zapisu danych i dość szorstkiego interfejsu użytkownika do kontroli kalibracji, rejestrowania i zarządzania plikami. Wszystko na małym opakowaniu na nadgarstku. (Podoba mi się Uno ze względu na jego rozmiar, prototypowe tarcze dają więcej miejsca niż mniejsze urządzenia.)

Zestawienie materiałów:

Arduino Uno

www.sparkfun.com/products/11021

SparkFun 3D Acceleromtoer (i kilka pinezek do lutowania)

www.sparkfun.com/products/10955

DFRobot LCD Keypad Shield

http: //www.dfrobot.com/index.php? route = product / pro …

DFRobot Uno Prototype Board

http: //www.dfrobot.com/index.php? route = product / pro …

5x 3.3V diody Zenera

Przełącznik suwakowy SPST

8mbit W2Q80 WinBond Flash Chip

Cztery wypusty 1/2 ”i 8 śrub pasujących do śladu Uno

Mała ilość drutu ciągłego 20ga

Rzep

4x Uchwyt na baterię AAA

4xAAA Baterie

Taśma klejąca

* Niestety, mój zespół paliwowy został zużyty przez psa przyjaciela kilka tygodni później. Niestety, nie przetrwał on podróży przez przewód pokarmowy psa, nie dlatego, że gdyby przeżył, nadal chciałbym go użyć.

Kieszonkowe dzieci:

Krok 1: Podłączyć akcelerometr

Wybierz miejsce na tarczy i wlutuj 8-pinową główkę w dół. Umieść czujnik 3D na głowicy i przylutuj go również. Upewnij się, że pozostawisz wystarczająco dużo miejsca, aby wlutować układ flash w następnym kroku.

Czujnik ma osiem pinów. Dwa są dla mocy i ziemi. Jeden kładzie urządzenie w stan uśpienia. Trzy są wyjściami analogowymi X, Y i Z, a dwie ostatnie to konfiguracja trybu.

Przełącznik trybu pozwala na dostrojenie czułości urządzenia do 1,5 g (00), 2 g (01), 4 g (10) lub 6 g (11). Zdecydowałem się na 1.5g i przekroczyłem tę ocenę tylko przy kilku ruchach. Kompromis polega na wierności drobnoziarnistej w stosunku do zakresu dynamicznego.

Podłącz VCC do 5 V, uziemienie do ziemi, uśpienie do ziemi (więc urządzenie jest zawsze włączone), a oba złącza konfiguracyjne do masy. Połącz odpowiednio styki X, Y i Z z pinami analogowymi 1, 2 i 3.

Krok 2: Podłącz Flash

Na tablicy znajduje się kilka miejsc, w których można umieszczać układy DIP, wykorzystując te, które ułatwiają łączność.

Dla chipa flash WP # (ochrona przed zapisem), HOLD # i VCC trafiają bezpośrednio na szynę 5V. Podłącz je do szyny z diodami Zenera w polaryzacji odwrotnej do masy, tak aby napięcie 5V było zaciśnięte na 3,3V. Układ ma tylko 3,3 V, więc musimy chronić wszystkie wejścia doprowadzone do 5V. Będziesz także umieścić 3.3V Zenery równolegle do ziemi na CLK, DI, DO i CS (wybór chipu). Całkowicie zapomniałem dodać małe rezystory obciążenia w obwodzie, ale wszystko działało dobrze. Gdybym zrobił to ponownie, zrobiłbym to poprawnie, tak jak na przykład: http: //hades.mech.northwestern.edu/images/7/74/Zen …

Biblioteka SPI oczekuje następujących przypisań pinów

SPI MOSI (Master Out / Slave In) przechodzi do Flash pin DI (data in); styk ochronny 11 przechodzi do styku DIP 5.

SPI MISO (Master In / Slave Out) przechodzi do Flash pin DO (out danych); styk ochronny 12 przechodzi do styku 2 DIP.

SPI SCK (zegar) przechodzi do Flash pin CLK (zegar); styk ochronny 13 przechodzi do styku 6 DIP.

SPI SS (select) przechodzi do Flash pin CS # (wybierz chip); styk ochronny 10 przechodzi do styku DIP 1.

* Właściwie podłączyłem CS # do pinu 3, nie mam pojęcia dlaczego, ale zwróć uwagę na #define w kodzie, jeśli zmienisz to

Krok 3: Końcowy montaż

Kolejne kilka kroków jest raczej doraźnych.

Najpierw rozłóż taśmę klejącą, aby utworzyć opaskę na nadgarstek (lub znajdź pasmo o szerokości 3 cali, które pasuje na nadgarstek). Zamocuj rzep, aby zapobiec spadaniu opaski.

Wywierć cztery małe otwory w opasce pasujące do otworów dystansowych Arduino Uno. Wkręć wystające elementy do opaski na nadgarstek i do Uno.

Umieść prototypową płytę z pamięcią flash i akcelerometrem na górze Uno.

Do tego przymocuj osłonę manipulatora LCD.

Przyklej, przyklej taśmą lub w jakiś sposób przymocuj akumulator do opaski na nadgarstek. Użyłem kleju Gorilla. To jest fantastyczne.

Przylutuj przełącznik szeregowo za pomocą wyjścia V + czerwonego przewodu zacisku akumulatora i przylutuj wyjście tego przewodu do styku VIN na tarczy wyświetlacza. Przylutuj uziemienie / czarny przewód od zacisku akumulatora do styku GND na tarczy wyświetlacza.

Włóż kilka baterii.

Włącz przełącznik, aby upewnić się, że świecą się wszystkie diody LED na każdym elemencie stosu.

Krok 4: Prześlij oprogramowanie

Oprogramowanie ma trzy główne funkcje:

A. Przedstaw użytkownikowi podstawowy interfejs użytkownika, aby wybrać, czy:

  1. Wyświetl odczyty X, Y, Z
  2. Zapisz odczyty X, Y, Z
  3. Wymaż chip pamięci flash
  4. Pokaż, ile stron 256-bajtowych zostało zapisanych w pamięci flash
B. Odczytaj przyspieszeniomierz tak szybko, jak to możliwe

C. Wpisz dane do Flasha

Większość kodu jest przeznaczona dla interfejsu użytkownika. To był zabawny proces nauki korzystania z biblioteki LCD dołączonej do górnej osłony. Sześć przycisków na tarczy wysyła napięcie analogowe do analogowego styku 0 Uno. Jest to całkiem sprytna alternatywa dla przycisków debiutujących (jeśli nie wiesz, dlaczego jest to trudne, pewnego dnia!). Kod kontrolny nie jest taki trudny, aby się rozejrzeć. Cykl Up / Down poprzez opcje menu, Wybór prawy i Reset po prostu uruchamia ponownie Arduino. Naprawdę proste.

Tryb wyświetlania

W trybie wyświetlania ciąg jest wysyłany na wyświetlacz LCD z odczytami X, Y i Z w miligramach. The konwertować() funkcja skaluje odczyty od 0-5V do gs. Ponieważ 0g jest zdefiniowane jako 1,65V przez produkcję, a całkowita dokładność analogu Arduino od 0-5V jest mierzona w 1024 przyrostach, równanie wynosi 5V / 1024 * X - 1,65V = g.

Tryb nagrywania

W trybie nagrywania wyświetlacz nie jest aktualizowany. Zamiast tego surowe dane analogowe są zapisywane w pamięci flash przy użyciu klasy pagebuffer. Za każdym razem, gdy 256 klas jest wysyłanych do klasy, uruchamia ona zapis strony na urządzeniu flash i zamienia nowy bufor. Ta klasa jest ulepszeniem mojego poprzedniego kodu w moim anemometrze.

Tryb kasowania

Tryb kasowania po prostu kasuje układ flash.

Tryb wyświetlania stron używanych

Użyte strony pokazują, ile stron zostało zapełnionych w urządzeniu flash. Ponieważ pierwszy bajt każdej strony jest zawsze ustawiony na 0, kod może przeskoczyć do nowej nowej strony po zresetowaniu. Pozwala to na włączanie i wyłączanie urządzenia i kontynuowanie pisania w miejscu, w którym zostało przerwane.

* Uwaga: Oprócz biblioteki rdzeniowej Arduino (dla rzeczy takich jak SPI i digitalWrite ()), będziesz potrzebować biblioteki manipulatorów LCD. Jest dostępny na stronie DFRobot.

** Uwaga # 2: Nie wyjaśniłem, jak pobrać dane z pamięci flash. To nadchodzi w innym pouczającym. Mam dedykowaną płytkę z połączeniem USB, która odczytuje dane z tych układów. Pewnego dnia przeniosę się na karty SD i ułatwi mi życie.

Krok 5: Zbieranie danych i zamykanie myśli

W tym momencie bardzo chciałem zobaczyć różne wzorce przyspieszenia z różnych ruchów. Dobrze zdawałem sobie sprawę, że pojedyncza wartość skalarna (wielkość wektora przyspieszenia 3D) nie byłaby wystarczająca do ustalenia żadnych użytecznych danych pozycyjnych, ale wyprzedzanie siebie sprawia, że ​​trudno się uczyć i postępować, amiright?

Przywiązałem się do getta FuelBand i poszedłem na siłownię.

Wykonałem trzy podstawowe ruchy:

a) 135 # przysiad - przysuń sztangę nad łopatki poniżej kręgów szyjnych, trzymaj rdzeń mocno, a plecy proste, przysiadaj, aż zagięcie bioder przejdzie przez płaszczyznę kolan, podciągnij kolana i biodra naprzód i wstań; powtarzać

b) kulka ścienna 20 # - stojąca 1-2 'od ściany, zwrócona w jego stronę, przytrzymaj wysokość klatki piersiowej z lekarstwami o długości 20 #; przykucnąć, aż zagięcie bioder znajdzie się poniżej kolan; podjedź i na szczycie ruchu dodaj pęd piłki, używając ramion, aby rzucić ją w cel 10 'wysoko na ścianie; w momencie powrotu piłki wykonaj ruch do tyłu, aby otrzymać piłkę; powtarzać.

c) 95 # olimpijski chwyt - och, to jest zbyt skomplikowane, po prostu spójrzcie.

Każdy ruch wiąże się z ruchem ramion i tułowia, ale ciężary są znacząco różne. Podejrzewałem, że samo przyspieszenie nie może być wskaźnikiem podniesionego ładunku, ale chciałem sam się przekonać.

Zebrałem dane dla kilku powtórzeń każdego ruchu. Przetwarzam dane w celu wygenerowania wielkości równej pierwiastkowi kwadratowemu z sumy przyspieszenia kwadratu każdej osi; np. mag = sqrt (x ^ 2 + y ^ 2 + z ^ 2). Wykreśliłem wyniki i wygładziłem dane z bieżącą średnią. Zauważ również, że nawet jeśli jedna oś może przekraczać 1,5 g, nigdy nie przekroczyłem nawet 1 g jednocześnie na dwóch lub więcej czujnikach, więc wielkości były zawsze dość niskie. Mówię to, ponieważ na początku myślałem, że dane były błędne, gdy wielkości były mniejsze niż grawitacja !!!

Wygląda całkiem fajnie. Złożony ruch złożony ruchu jest wskazywany jedynie przez ogólne przyspieszenie mierzone na nadgarstku. Wyraźnie widzę szybkie i powolne fazy ruchów, szczególnie gwałtowny pociągnięcie wyrwania. Moje podejrzenia były poprawne, nie można zauważyć dużych różnic w wysiłku pomiędzy jednym ruchem (przysiad), który poruszył w sumie ~ 1000 kg masy, podczas gdy inny (kulka ścienna) poruszył się tylko o ~ 200 kg. Oczywiście pojedyncza wartość przyspieszenia nie wystarcza do zapewnienia wystarczającej ilości wysiłku, ale cały ten proces doprowadził mnie do opracowania platformy, którą mogę rozszerzyć o nowe czujniki. Widzę wiele czujników wykorzystujących pozycję spoczynkową / spoczynkową, a następnie rekonstruujących ogólny ruch, ale to nadal nie uchwyciłoby wagi. Ale mam jeszcze kilka pomysłów …

Bądź na bieżąco i powodzenia! Mam nadzieję, że zainspiruje cię to do poprawy telemetrii ćwiczeń!