Duomenų registravimas naudojant VEX Brain / jutiklius (Python versija)

Įvadas

Šiame straipsnyje aptarsime, kaip sukurti duomenų registravimo projektą, kuris nurodytų VEX robotui rinkti duomenis su VEX Brain ir išsaugoti juos CSV faile SD kortelėje duomenų analizei.

Duomenų registravimas yra galingas įrankis, kurį galime naudoti norėdami padėti moksliniams tyrimams, atlikti savo eksperimentus ir spręsti konkrečias problemas. Yra įvairių įdomių ir įdomių užduočių, kurias galime vairuoti VEX robotu ir atlikti registruodami duomenis. Toliau pateikiami keli pavyzdžiai:

  • Duomenų rinkimas su atstumo jutikliu roboto greičiui apskaičiuoti
  • Vairuoti robotą po klasę ir rinkti duomenis su optiniu jutikliu, kad būtų galima stebėti šviesos pokyčius įvairiose vietose.
  • Roboto išleidimas į nuotykius ir GPS koordinačių duomenų įrašymas, kad būtų sukurtas žemėlapis.

Kodavimo įgūdžiai, reikalingi kuriant duomenų registravimo projektą

  • Naudokite įvairias komandas, kad rinktumėte duomenis naudodami VEX Brain/Sensors ir įtraukite juos į duomenų struktūrą.
  • Įrašykite duomenis į kableliais atskirtų reikšmių (CSV) failą SD kortelėje.

Duomenų registravimui reikalinga aparatinė įranga:

  • A VEX Brain (IQ, V5, EXP)
  • SD kortelę
  • Jutiklis arba keli jutikliai (neprivaloma, atsižvelgiant į reikiamus duomenis)

Duomenų gavimas iš jutiklio

Galime užprogramuoti VEX robotą (IQ, V5, EXP), kad gautų duomenis iš šių jutiklių:

  • Inercinis jutiklis
  • Atstumo jutiklis
  • Optinis jutiklis
  • Regėjimo jutiklis
  • Sukimosi jutiklis (V5, EXP)
  • GPS jutiklis (V5)

Pastaba: VEX IQ (2-osios kartos) smegenyse ir VEX EXP smegenyse yra įmontuotas inercinis jutiklis. Su šiais VEX Brianais galime rinkti inercinio jutiklio duomenis.

Šiame straipsnyje mes sukursime duomenų registravimo projektą, kuris renka pagreičio duomenis su VEX IQ Brain (2-as) ir išsaugo juos SD kortelėje. 

Pirmiausia turime parašyti trumpą programą, kad gautume rodmenis iš laikmačio ir inercinio jutiklio, įmontuoto VEX IQ smegenyse (2-oji).

  • Šios programos pradžioje turėsime importuoti Python modulius, kad galėtume valdyti VEX IQ Brain (2nd) ir gauti iš jo duomenis. Taigi pradėkite pridėdami šias instrukcijas prie projekto.
  • # Biblioteka importuoja
    iš „vex“ import *

    # Pagal numatytuosius nustatymus „Brain“ turėtų būti apibrėžta
    brain = Brain()
    brain_inertial = Inertial()
  • Tada pridėkite kodą, kad deklaruotumėte kintamąjį numOfDataEntries , kad būtų išsaugotas įrašymo duomenų įrašų skaičius, deklaruokite kintamąjį polling_delay_msec , kad išsaugotumėte duomenų skaitymo laiko intervalo reikšmę, ir sukurkite tuščią eilutės kintamąjį data_buffer , kad būtų išsaugotas. iš jutiklio nuskaitytus duomenis.
  • numOfDataEntries = 100
    polling_delay_msec = 50
    data_buffer = ""
  • Kadangi laiko žymai prie duomenų pridėti naudosime dabartinę laikmačio reikšmę, prieš pradėdami rinkti duomenis, turime atkurti laikmačio reikšmę į 0 sekundžių.
  • # Pridėti laikmačio inicijavimo kodą
    brain.timer.clear()
  • Prieš naudodami instrukciją, kuri paima duomenis iš VEX IQ Brain (2-oji) ir įrašo duomenis į buferį, pirmiausia turime ją suprasti.
    Ši instrukcija prideda esamą laikmačio reikšmę prie data_buffer kintamojo konkrečiu formatu.

    Python kodo eilutė yra paryškinta dalimis, kad būtų galima ją išsamiai paaiškinti. Kodo eilutėje rašoma: data_buffer += 1.3f % brain.timer.value() + kablelis. Pirma, operatorius += yra paryškintas ir pažymėtas kaip „Pridėti duomenis prie duomenų buferio eilutės“. Toliau 1.3f eilutė yra paryškinta ir pažymėta kaip Formatuoti eilutę. Toliau procento ženklas yra paryškintas ir pažymėtas kaip eilutės modulio operatorius. Toliau paryškinama komanda brain.timer.value() ir pavadinama „Dabartinė laikmačio reikšmė“. Galiausiai paryškinamas kablelio eilutės pridėjimas gale ir rodomas tekstas „Pridėkite kablelį pabaigoje duomenims atskirti“.

    Išskaidykime formato eilutę “%1.3f”

    • „%“: pristato konversijos specifikaciją.
    • „1“: nurodo mažiausią skaitmenų skaičių, kuris turi būti eilutėje
    • „.3“: nurodo skaičių po kablelio skaičių, kurį reikia įtraukti į formatuotą skaičių.
    • „f“: nurodo, kad formatuotina reikšmė yra slankiojo kablelio skaičius.

    Taigi galime naudoti formato eilutę „%1.3f“, kad suformatuotume slankiojo kablelio skaičių, kurio minimalus plotis yra 1 skaitmuo ir 3 skaitmenų po kablelio tikslumas.

  • Dabar galime nuskaityti laikmatį ir VEX IQ smegenyse įtaisyto inercinio jutiklio (2-asis) pagreičio vertę, o tada pridėti duomenis prie data_buffer kintamojo nurodytu formatu.
  • # Komandos duomenims įrašyti į buferį
    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"

    Ankstesnis kodas yra išsamiai paaiškintas. Pirmoji „data_buffer“ eilutė, naudojant brain.timer.value() funkciją, yra pažymėta „Add Timestamp to buffer“ (Pridėti laiko žymą prie buferio). Kitos trys eilutės pažymėtos „Pridėti pagreičio reikšmę išilgai X, Y ir Z ašių į buferį“.

  • Pastaba: „\n“ yra naujos eilutės simbolis. Tai rodo, kad eilutė čia baigiasi ir žymi naujos eilutės pradžią.
  • Tada, norėdami įrašyti tam tikrą skaičių duomenų įrašų į data_buffer kintamąjį, galime naudoti for loop pakartotinai vykdyti instrukcijas, kurios gauna duomenis, ir pridėti duomenis prie kintamojo data_buffer , kad būtų galima atlikti keletą iteracijų. Mūsų strategija yra naudoti kintamojo numOfDataEntries reikšmę iteracijų skaičiui nustatyti.
  • # Duomenų generavimas
    skirtas i diapazonui diapazone(0, numOfDataEntries):

    # Komandos duomenims įrašyti į buferį
    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"
  • Iki šiol mūsų programa įrašo duomenis taip greitai, kaip tik įmanoma. Tačiau norime įrašyti duomenis tam tikrais laiko intervalais. Todėl galime naudoti funkciją wait() 3 cikle for norėdami pristabdyti programą ir pridėti konkretų laiko intervalą tarp dviejų rodmenų. Laiko intervalo reikšmei nustatyti naudojame kintamojo polling_delay_msec reikšmę.
  • # Duomenų generavimas
    skirtas i diapazonui diapazone(0, numOfDataEntries):

    # Komandos duomenims įrašyti į buferį
    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)

Sveikiname! Baigėme programą, kad gautume rodmenis (pagreičio duomenis) iš inercinio jutiklio, įmontuoto VEX smegenyse. Toliau išnagrinėsime, kaip įrašyti duomenis į CSV failą SD kortelėje.

# Biblioteka importuoja
iš „vex“ import *

# Pagal numatytuosius nustatymus „Brain“ turėtų būti apibrėžtas
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Pridėti laikmačio inicijavimo kodą
brain.timer.clear()

# Duomenų generavimas
i intervale intervale (0, numOfDataEntries):

# Komandos duomenims įrašyti į buferį
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)

SD kortelės prijungimas prie VEX Brain

Prieš įrašydami duomenis į failą SD kortelėje, pirmiausia įdėkite SD kortelę į VEX Brain SD kortelės lizdą.

IQ (2-osios kartos) smegenys rodomos su paryškintu SD kortelės lizdu. SD kortelės lizdas yra „Brain“ šone, dešinėje nuo USB-C prievado.

Pastaba: Norėdami įrašyti duomenis, suformatuokite SD kortelę į FAT32. Rekomenduojame naudoti SD korteles, kurių dydis yra 32 GB ar mažesnis.

Norėdami užtikrinti, kad duomenis į failą SD kortelėje būtų galima įrašyti atitinkamomis sąlygomis, turėsime pridėti kodą, kad patikrintume, ar SD kortelė tinkamai įdėta į VEX IQ Brain (2-oji).

  • Norėdami patikrinti, ar SD kortelė įdėta, naudokite funkciją brain.sdcard.is_inserted() Jei SD kortelė neįdėta, VEX IQ Brain ekrane parodykite atitinkamą pranešimą ir palaikykite programą.
  • # Sulaikyti programą, jei SD kortelė neįdėta
    if not brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("Trūksta SD kortelės")
    while(True):
    wait(5, MSEC)
  • Pastaba: brain.sdcard.is_inserted() funkcija grąžina „True“, jei į „Brain“ įdėta SD kortelė.

Duomenų įrašymas į CSV failą SD kortelėje

Kol kas mūsų programa gali rinkti duomenis su VEX IQ Brain (2 vieta). Norėdami užbaigti duomenų registravimo projektą, turime įrašyti duomenis į kableliais atskirtų reikšmių (CSV) failą SD kortelėje, kad ateityje būtų galima ištirti ir analizuoti.

  • Rašydami skirtingų tipų duomenis į CSV failą, norime žinoti, kokio tipo duomenys yra kiekviename stulpelyje. Norėdami tai padaryti, prieš įrašydami duomenis galime pridėti CSV antraštės tekstą prie kintamojo data_buffer .
    Taigi, pridėkite kodą, kad deklaruotumėte kintamąjį csvHeaderText , kad išsaugotumėte CSV antraštės tekstą, kad nurodytumėte CSV failo stulpelių pavadinimus, ir deklaruokite kintamąjį sd_file_name , kad būtų įrašytas CSV failo pavadinimas, kurį norite įrašyti SD kortelė.
  • csvHeaderText = „laikas, x, y, z“
    sd_file_name = „myDataPY.csv“

Pastaba: Įsitikinkite, kad antraštės yra tokia pat tvarka kaip ir duomenys, saugomi kintamajame data_buffer.

  • Tada CSV antraštės tekstą pridėkite prie data_buffer eilutės prieš ciklo duomenims rinkti.
  • # Sukurti CSV antraštę
    data_buffer = csvHeaderText + "\n"

    # CSV duomenų karta
    , skirta i intervale (0, numOfDataEntries):

    # Komandos duomenims įrašyti į buferį
    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)
  • Prieš įrašydami duomenis į failą SD kortelėje, pirmiausia išsiaiškinkime, kaip naudoti funkciją brain.sdcard.savefile().

    Python kodo eilutė yra paryškinta dalimis, kad būtų galima ją išsamiai paaiškinti. Kodo eilutė yra tokia: brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Pirmiausia paryškinama skiltis „brain.sdcard.savefile“ ir pažymėta „Įrašyti bytearray į pavadintą failą SD kortelėje“. Toliau skyrius „sd_file_name“ yra paryškintas ir pažymėtas kaip „Failo pavadinimas“. Galiausiai, pabaigoje esantis bytearray(data_buffer, 'utf-8') yra paryškintas ir pažymėtas kaip Buferis.


    Ši instrukcija įrašo duomenis, saugomus kintamajame data_buffer į pavadintą CSV failą SD kortelėje.
    Išskaidykime:
    • brain.sdcard.savefile(): funkcija išsaugo baitų masyvą į pavadintą failą SD kortelėje. Funkcija grąžina į failą įrašytų baitų skaičių.

    • sd_failo_pavadinimas: pirmasis funkcijos parametras. Nurodo failo, kurį reikia įrašyti, pavadinimą. Šiame projekte failo pavadinimas saugomas kintamajame sd_file_name.

    • bytearray(datat_buffer,'utf-8'): antrasis funkcijos parametras. Nurodo baitų masyvą, kuris turi būti įrašytas į failą.

        • bytearray(): Metodas sukuria kintamą bytearray. Šioje instrukcijoje mes ją naudojame norėdami konvertuoti eilutę į baitų masyvą, nurodydami kodavimą.
        • data_buffer: pirmasis metodo parametras. Nurodo šaltinį, kuris turi būti konvertuojamas į baitų masyvą. Šiame projekte šaltinis yra duomenys, saugomi kintamajame data_buffer. 
        • „utf-8“: antrasis metodo parametras. Nurodo nurodytą kodavimą, naudojamą eilutei koduoti. Šioje instrukcijoje kodavimas yra „utf-8“. 
  • Po rinkti, naudokite funkciją brain.sdcard.savefile() , kad įrašytumėte duomenis, saugomus kintamajame data_buffer į CSV failą SD kortelėje. Be to, pridėkite kodą, kuris patikrintų funkcijos brain.sdcard.savefile() grąžinamą reikšmę, kad patikrintų, ar duomenys buvo sėkmingai įrašyti į failą, ir rodytų atitinkamą pranešimą „VEX IQ Brain“ ekrane, kad gautumėte atsiliepimus realiuoju laiku. „if“ sakinys pabaigoje prideda pranešimą, rodantį failo būseną, atspausdindamas arba SD Write Error , arba Data Writed.
  • # CSV duomenų karta
    skirta i diapazonui intervale (0, numOfDataEntries):

    # Komandos duomenims įrašyti į buferį
    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)

    # Įrašyti duomenis į SD kortelę
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("SD įrašymo klaida")
    kitaip:
    brain.screen.print("Duomenys įrašyti")
  • Pastaba: Funkcija brain.sdcard.savefile() grąžina į failą įrašytų baitų skaičių. Šiame projekte mes naudojame surinktus duomenis įrašyti į CSV failą, todėl į failą įrašytų baitų skaičius turi būti didesnis nei nulis. Kitaip tariant, jei funkcija „brain.sdcard.savefile() 0, galime daryti išvadą, kad duomenys nebuvo sėkmingai įrašyti į failą. Priešingu atveju duomenys buvo įrašyti į failą.

Sveikiname! Sukūrėme duomenų registravimo projektą, kuris renka pagreičio duomenis su VEX IQ Brain (2-as) ir išsaugo juos CSV faile SD kortelėje. Toliau išnagrinėsime, kaip atidaryti CSV failą duomenų analizei. 

# Biblioteka importuoja
iš „vex“ import *

# Pagal numatytuosius nustatymus „Brain“ turėtų būti apibrėžtas
brain = Brain()
brain_inertial = Inertial()

csvHeaderText = "time, x, y, z"
sd_file_name = "myDataPY.csv"
polling_delay_msec = 50
numOfDataEntries = 100
data_buffer = ""

# Sulaikyti programą, jei SD kortelė neįdėta
if not brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("Trūksta SD kortelės")
while(True):
wait(5, MSEC)

# Pridėti bet kokį jutiklį & laikmačio inicijavimo kodą čia
brain.timer.clear()

# Sukurti CSV antraštę
data_buffer = csvHeaderText + "\n"

# CSV duomenų generavimas
skirtas i diapazonui intervale(0, numOfDataEntries):

# Komandos duomenims įrašyti į buferį
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)

# Įrašyti duomenis į SD kortelę
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD rašymo klaida")
else:
brain.screen.print("Duomenys įrašyti")

CSV failo atidarymas duomenų analizei

Kai duomenys bus įrašyti į CSV failą SD kortelėje, galime naudoti skaičiuoklės programą, kad atidarytume failą, kad galėtume skaityti ir analizuoti duomenis. 

Pastaba: Dvi dažniausiai naudojamos skaičiuoklių programos yra „Google“ skaičiuoklės ir „Microsoft Excel“. Šiame straipsnyje mes naudosime „Google“ skaičiuokles (žiniatinklio pagrindu), kad atidarytume CSV failą SD kortelėje. Kitų programų naudojimo procesas yra panašus.

  • Išimkite SD kortelę iš VEX IQ Brain SD kortelės lizdo. Jei kompiuteryje yra įmontuotas Micro SD kortelės lizdas, SD kortelę galime įdėti tiesiai į tą lizdą. Kitu atveju įdėkite SD kortelę į SD kortelės adapterį ir prijunkite adapterį prie kompiuterio. 
  • Prisijunkite prie mūsų „Google“ paskyros ir atidarykite „Google“ skaičiuokles. Sukurkite naują skaičiuoklę.
  • Skaičiuoklėje atidarykite meniu „Failas“ , pasirinkite „Importuoti“ -> mygtuką „Įkelti“ -> „Naršyti“ , tada pasirinkite CSV failą kompiuteryje. Įkėlę CSV failą, spustelėkite mygtuką „Import Data“. Importavę duomenis spustelėkite „Atidaryti dabar“ kad pamatytumėte surinktus duomenis CSV faile.

    Projekto CSV duomenys atidaryti „Google“ skaičiuoklių dokumente. Yra keturi stulpeliai, rodantys laiką (Laikas), X, Y ir Z. Yra daug duomenų eilučių, kuriose dokumentuojamas pagreitis kiekvienu laiko žymu.

  • (Pasirenkama) Vienas paprastas būdas analizuoti duomenis – nubraižyti grafiką ir ieškoti duomenų tendencijų. Skaičiuoklėje atidarykite meniu „Įterpimas“ ir pasirinkite „Diagrama“ kad nubrėžtumėte grafiką naudodami CSV failo duomenis. Toliau pateiktame grafike pateikti „VEX IQ Brain“ (2-asis) surinktų pagreičio duomenų rezultatai.

    Chart of the data is opened in Google Sheets, showing the acceleration of the X, Y, and Z axes over time. The Z value stays near negative one, and the X and Y values stay near zero.


    Pastaba: 10 11 1215 16 17 18 19 20 21 22 23 24 24 24 3 4 5 6 7 8 9 10 11 12 13 13 14 14 14 15 16 17 18 19 21 12 13 13 14 14 13 14 14 15 16 17 19 21 12 13 13 14 14 13 14 14 16 18 19 21 12 13 14 13 14 14 21 12 13 14 14 13 14 14 15 16 17 19 21 12 13 14 14 16 19 21 13 14 ...4 16 19 21 13 14 14 14 16 19 21 13 14 14 14 16 19 21 13 14 14 14 21 13 14 14 14 16 19

Iki šiol baigėme duomenų registravimo projektą, kuris renka duomenis su VEX IQ Brain (2 vieta) ir išsaugo juos CSV faile SD kortelėje. Be to, išmokome skaityti SD kortelėje esantį CSV failą naudodami „Google“ skaičiuokles ir netgi sukurti grafiką tolesnei analizei. Kas toliau? Pabandykime suplanuoti įdomesnius eksperimentus naudodami VEX robotą duomenų registravimui, stebėti, kaip besikeičiantys aplinkos veiksniai veikia įvairių tipų duomenis ir giliau suprasti mus supantį pasaulį.

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: