Wstęp
W tym artykule omówimy, jak stworzyć projekt rejestracji danych, który instruuje Robota VEX, aby zbierał dane za pomocą VEX Brain i zapisywał je w pliku CSV na karcie SD w celu analizy danych.
Rejestrowanie danych to potężne narzędzie, które możemy wykorzystać do wspomagania badań naukowych, przeprowadzania własnych eksperymentów i rozwiązywania konkretnych problemów. Istnieje wiele zabawnych i ekscytujących zadań, które możemy wykonać za pomocą robota VEX za pomocą rejestrowania danych. Oto kilka przykładów:
- Zbieranie danych za pomocą czujnika odległości w celu obliczenia prędkości robota
- Prowadzenie robota po klasie i zbieranie danych za pomocą czujnika optycznego w celu obserwacji zmian oświetlenia w różnych miejscach.
- Zabierz robota na przygodę i zapisz współrzędne GPS, aby stworzyć mapę.
Umiejętności kodowania potrzebne do opracowania projektu rejestrowania danych
- Użyj różnych poleceń, aby zebrać dane za pomocą VEX Brain/Sensors i dodać je do struktury danych.
- Zapisz dane w pliku wartości rozdzielanych przecinkami (CSV) na karcie SD.
Sprzęt wymagany do rejestrowania danych:
- Mózg VEX (IQ, V5, EXP)
- Karta SD
- Czujnik lub wiele czujników (opcjonalnie, w zależności od wymaganych danych)
Pobieranie danych z czujnika
Możemy zaprogramować Robota VEX (IQ, V5, EXP) tak, aby zbierał dane z następujących czujników:
- Czujnik inercyjny
- Czujnik odległości
- Czujnik optyczny
- Czujnik wizyjny
- Czujnik obrotu (V5, EXP)
- Czujnik GPS (V5)
Uwaga: Brain VEX IQ (2. generacji) i VEX EXP Brain mają wbudowany czujnik bezwładnościowy. Za pomocą tych Brianów VEX możemy zbierać dane z czujnika inercyjnego.
W tym artykule opracujemy projekt rejestrowania danych, który zbiera dane dotyczące przyspieszenia za pomocą VEX IQ Brain (2.) i zapisuje je na karcie SD.
Najpierw musimy napisać krótki program, który pobierze odczyty z timera i czujnika inercyjnego wbudowanego w mózg VEX IQ (2. miejsce).
- Na początku tego programu będziemy musieli zaimportować moduły Pythona do sterowania VEX IQ Brain (2. miejsce) i pobrać z niego dane. Zatem zacznij od dodania tych instrukcji do projektu.
-
# Biblioteka importuje
z vex import *
# Brain powinien być zdefiniowany domyślnie
brain = Brain()
brain_inertial = Inertial() - Następnie dodaj kod deklarujący zmienną
numOfDataEntriesdo przechowywania liczby wpisów danych do rejestracji, zadeklaruj zmiennąpolling_delay_msecdo przechowywania wartości przedziału czasu do odczytu danych i utwórz pustą zmienną łańcuchowądata_bufferdo przechowywania dane odczytane z czujnika. -
numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = "" - Ponieważ do dodania znacznika czasu do danych użyjemy bieżącej wartości licznika czasu, musimy zresetować wartość licznika czasu do 0 sekund przed rozpoczęciem zbierania danych.
-
# Dodaj kod inicjalizacji timera
brain.timer.clear() - Zanim skorzystamy z instrukcji pobierającej dane z VEX IQ Brain (2. miejsce) i zapisującej dane w buforze, musimy ją najpierw zrozumieć.
Poniższa instrukcja dołącza aktualną wartość licznika do zmiennejdata_bufferw określonym formacie.Rozłóżmy ciąg formatujący
„%1.3f”:- „%”: wprowadza specyfikator konwersji.
- „1”: Wskazuje minimalną liczbę cyfr w ciągu znaków
- „.3”: Określa liczbę miejsc dziesiętnych, które należy uwzględnić w sformatowanej liczbie.
- „f”: wskazuje, że wartość do sformatowania jest liczbą zmiennoprzecinkową.
W ten sposób możemy użyć ciągu formatującego „%1.3f” do sformatowania liczby zmiennoprzecinkowej o minimalnej szerokości 1 cyfry i dokładności do 3 miejsc po przecinku.
- Teraz możemy odczytać licznik czasu i wartość przyspieszenia czujnika bezwładnościowego wbudowanego w mózg VEX IQ (2. miejsce), a następnie dołączyć dane do zmiennej
data_bufferw określonym formacie. -
# Polecenia zapisu danych do bufora
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n" - Uwaga: „\n” to znak nowej linii. Oznacza to, że linia kończy się w tym miejscu i oznacza początek nowej linii.
- Następnie, aby zapisać pewną liczbę wpisów danych w zmiennej
data_buffer, możemy użyć pętlifor, aby wielokrotnie wykonać instrukcje, które pobierają dane i dołączają dane do zmiennejdata_bufferprzez pewną liczbę iteracji. Naszą strategią jest użycie wartości zmiennejnumOfDataEntriesdo określenia liczby iteracji. -
# Generowanie danych
dla i w zakresie (0, numOfDataEntries):
# Polecenia zapisu danych do bufora
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n" - Póki co nasz program rejestruje dane najszybciej jak to możliwe. Chcemy jednak rejestrować dane w określonych odstępach czasu. Dlatego możemy użyć funkcji
wait()w pętlifor, aby wstrzymać program w celu dodania określonego odstępu czasu między dwoma odczytami. Do określenia wartości przedziału czasowego wykorzystujemy wartość zmiennejpolling_delay_msec. -
# Generowanie danych
dla i w zakresie (0, numOfDataEntries):
# Polecenia zapisu danych do bufora
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
Gratulacje! Zakończyliśmy program uzyskiwania odczytów (danych dotyczących przyspieszenia) z czujnika bezwładnościowego wbudowanego w mózg VEX. Następnie przyjrzymy się, jak zapisać dane w pliku CSV na karcie SD.
# Biblioteka importuje
z vex import *
# Brain powinien być zdefiniowany domyślnie
brain = Brain()
brain_inertial = Inertial()
numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""
# Dodaj kod inicjalizacji timera
brain.timer.clear()
# Generowanie danych
for i in range(0, numOfDataEntries):
# Polecenia zapisu danych do bufora
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
Podłączanie karty SD do VEX Brain
Przed zapisaniem danych do pliku na karcie SD, włóż najpierw kartę SD do gniazda kart SD w VEX Brain.
Uwaga: Aby móc zapisywać dane, sformatuj kartę SD w systemie FAT32. Zalecamy używanie kart SD o pojemności 32 GB lub mniejszej.
Aby mieć pewność, że zapis danych do pliku na karcie SD będzie możliwy w odpowiednich warunkach, będziemy musieli dodać kod sprawdzający, czy karta SD jest prawidłowo włożona do VEX IQ Brain (2. miejsce).
- Użyj funkcji
brain.sdcard.is_inserted(), aby sprawdzić, czy karta SD jest włożona. Jeśli karta SD nie jest włożona, wyświetl odpowiedni komunikat na ekranie VEX IQ Brain Screen i przytrzymaj program. -
# Wstrzymaj program, jeśli karta SD nie jest włożona
if not brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("Brak karty SD")
while(True):
wait(5, MSEC) -
Uwaga: funkcja brain.sdcard.is_inserted()
zwraca wartość True, jeśli do Brain włożono kartę SD.
Zapisywanie danych do pliku CSV na karcie SD
Jak dotąd nasz program może zbierać dane za pomocą VEX IQ Brain (2. miejsce). Aby ukończyć projekt rejestrowania danych, musimy zapisać dane w pliku wartości rozdzielanych przecinkami (CSV) na karcie SD w celu przyszłego sprawdzenia i analizy.
- Zapisując różne typy danych w pliku CSV, chcemy wiedzieć, jaki typ danych zawiera każda kolumna. Aby to zrobić, możemy dołączyć tekst nagłówka CSV do zmiennej
data_bufferprzed zarejestrowaniem danych.
Zatem dodaj kod deklarujący zmiennącsvHeaderTextprzechowujący tekst nagłówka CSV określający nazwy kolumn dla pliku CSV i deklarujący zmiennąnazwa_plikuprzechowujący nazwę pliku CSV do zapisania na Karta SD. -
csvHeaderText = "czas, x, y, z"
sd_file_name = "myDataPY.csv"
Uwaga: Upewnij się, że nagłówki są w tej samej kolejności, co dane zapisane w zmiennej data_buffer.
- Następnie dołącz tekst nagłówka CSV do ciągu
data_bufferprzed pętląforw celu gromadzenia danych. -
# Utwórz nagłówek CSV
data_buffer = csvHeaderText + "\n"
# Generowanie danych CSV
for i in range(0, numOfDataEntries):
# Polecenia zapisu danych do bufora
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC) - Zanim zapiszemy dane do pliku na karcie SD, przyjrzyjmy się najpierw, jak używać funkcji
brain.sdcard.savefile().
Ta instrukcja zapisuje dane zapisane w zmiennejdata_bufferdo nazwanego pliku CSV na karcie SD.
Rozłóżmy to na czynniki pierwsze:-
brain.sdcard.savefile(): Funkcja zapisuje bajtarray do nazwanego pliku na karcie SD. Funkcja zwraca liczbę bajtów zapisanych do pliku.
-
nazwa_pliku sd: Pierwszy parametr funkcji. Wskazuje nazwę pliku do zapisania. W tym projekcie nazwa pliku jest przechowywana w zmiennej
sd_file_name. -
bytearray(datat_buffer,'utf-8'): Drugi parametr funkcji. Reprezentuje tablicę bajtową, która ma zostać zapisana w pliku.
-
- bytearray(): Metoda tworzy zmienną bajtarray. W tej instrukcji używamy go do konwersji ciągu znaków na tablicę bajtową poprzez określenie kodowania.
- data_buffer: Pierwszy parametr metody. Wskazuje źródło, które ma zostać przekonwertowane na tablicę bajtową. W tym projekcie źródłem są dane zapisane w zmiennej
data_buffer. - „utf-8”: Drugi parametr metody. Wskazuje określone kodowanie użyte do kodowania ciągu. W tej instrukcji kodowanie to „utf-8”.
-
-
- Po pętli
fordo zbierania danych użyj funkcjibrain.sdcard.savefile()w celu zapisania danych przechowywanych w zmiennejdata_bufferdo pliku CSV na karcie SD. Dodatkowo dodaj kod sprawdzający wartość zwracaną przez funkcjębrain.sdcard.savefile()w celu weryfikacji, czy dane zostały pomyślnie zapisane do pliku, i wyświetl odpowiedni komunikat na ekranie mózgu VEX IQ, aby uzyskać informacje zwrotne w czasie rzeczywistym. Instrukcja if na końcu dodaje komunikat pokazujący stan pliku, wyświetlając alboSD Write ErroralboData Written. -
# Generowanie danych CSV
for i in range(0, numOfDataEntries):
# Polecenia zapisu danych do bufora
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
# Zapis danych na kartę SD
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("Błąd zapisu na SD")
else:
brain.screen.print("Zapisane dane") -
Uwaga: Funkcja ()
zwraca liczbę bajtów zapisanych w plikuW tym projekcie wykorzystujemy go do zapisania zebranych danych do pliku CSV, więc liczba bajtów zapisywanych do pliku musi być większa od zera. Innymi słowy, jeśli funkcja brain.sdcard.savefile()zwróci 0, możemy wnioskowaćże dane nie zostały pomyślnie zapisane do pliku. W przeciwnym wypadku dane zostaną zapisane w pliku.
Gratulacje! Opracowaliśmy projekt rejestrowania danych, który zbiera dane dotyczące przyspieszenia za pomocą VEX IQ Brain (2.) i zapisuje je w pliku CSV na karcie SD. Następnie dowiemy się, jak otworzyć plik CSV w celu analizy danych.
# Biblioteka importuje
z vex import *
# Brain powinien być zdefiniowany domyślnie
brain = Brain()
brain_inertial = Inertial()
csvHeaderText = "time, x, y, z"
sd_file_name = "myDataPY.csv"
polling_delay_msec = 50
numOfDataEntries = 100
data_buffer = ""
# Wstrzymaj program, jeśli karta SD nie jest włożona
jeśli nie brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("Brak karty SD")
while(True):
wait(5, MSEC)
# Dodaj tutaj dowolny czujnik & kod inicjalizacji timera
brain.timer.clear()
# Utwórz nagłówek CSV
data_buffer = csvHeaderText + "\n"
# Generowanie danych CSV
for i in range(0, numOfDataEntries):
# Polecenia zapisu danych do bufora
data_buffer += "%1.3f" % brain.timer.value() + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
# Zapisz dane do Karta SD
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("Błąd zapisu na SD")
else:
brain.screen.print("Zapisane dane")
Otwieranie pliku CSV do analizy danych
Po zapisaniu danych do pliku CSV na karcie SD możemy za pomocą aplikacji arkusza kalkulacyjnego otworzyć plik w celu odczytu i analizy danych.
Uwaga: Dwie najpopularniejsze aplikacje arkuszy kalkulacyjnych to Arkusze Google i Microsoft Excel. W tym artykule użyjemy Arkuszy Google (internetowych) do otwarcia pliku CSV na karcie SD. Proces korzystania z innych aplikacji jest podobny.
- Wyjmij kartę SD z gniazda karty SD VEX IQ Brain. Jeżeli komputer posiada wbudowany slot na kartę Micro SD, możemy włożyć kartę SD bezpośrednio do tego slotu. W przeciwnym razie włóż kartę SD do adaptera karty SD, a następnie podłącz adapter do komputera.
- Zaloguj się na nasze konto Google i otwórz Arkusze Google. Utwórz nowy arkusz kalkulacyjny.
- W arkuszu kalkulacyjnym otwórz menu „Plik” , wybierz przycisk „Importuj” -> „Prześlij” -> „Przeglądaj” , a następnie wybierz plik CSV na komputerze. Po przesłaniu pliku CSV kliknij przycisk „Importuj dane”. Po zaimportowaniu danych kliknij „Otwórz teraz” , aby zobaczyć zebrane dane w pliku CSV.
- (Opcjonalnie) Jednym z łatwych sposobów analizowania danych jest narysowanie wykresu, a następnie wyszukanie trendów w danych. W arkuszu kalkulacyjnym otwórz menu „Wstaw” i wybierz „Wykres” , aby narysować wykres na podstawie danych z pliku CSV. Poniższy wykres przedstawia wynik danych o przyspieszeniu zebranych za pomocą VEX IQ Brain (2. edycja).
Uwaga: Możemy użyć edytora wykresów , aby wybrać inny typ wykresu lub edytować wykres według naszych potrzeb.
Do tego momentu zakończyliśmy projekt rejestrowania danych, który zbiera dane za pomocą VEX IQ Brain (2. miejsce) i zapisuje je w pliku CSV na karcie SD. Dowiedzieliśmy się także, jak odczytać plik CSV na karcie SD za pomocą Arkuszy Google, a nawet stworzyć wykres do dalszej analizy. Co następne? Spróbujmy zaplanować bardziej ekscytujące eksperymenty z wykorzystaniem Robota VEX do rejestracji danych, aby obserwować, jak zmieniające się czynniki środowiskowe wpływają na różne typy danych i uzyskać głębsze zrozumienie otaczającego nas świata.