Реєстрація даних за допомогою VEX Brain/Sensors (версія Python)

вступ

У цій статті ми обговоримо, як створити проект реєстрації даних, який дає команду VEX Robot збирати дані за допомогою VEX Brain і зберігати їх у файлі CSV на SD-карті для аналізу даних.

Реєстрація даних — це потужний інструмент, який ми можемо використовувати для допомоги в наукових дослідженнях, проведення власних експериментів і вирішення конкретних проблем. Існують різноманітні веселі та захоплюючі завдання, які ми можемо керувати роботом VEX, щоб виконати за допомогою реєстрації даних. Нижче наведено кілька прикладів:

  • Збір даних за допомогою датчика відстані для розрахунку швидкості робота
  • Водіння робота по класній кімнаті та збір даних за допомогою оптичного датчика для спостереження за змінами освітленості в різних місцях.
  • Візьміть робота в пригоду та запишіть дані GPS-координат для створення карти.

Навички кодування, необхідні для розробки проекту реєстрації даних

  • Використовуйте різні команди для збору даних за допомогою VEX Brain/Sensors і додавання їх до структури даних.
  • Запишіть дані у файл із значеннями, розділеними комами (CSV) на SD-карті.

Обладнання, необхідне для реєстрації даних:

  • A VEX Brain (IQ, V5, EXP)
  • Картка SD
  • Датчик або кілька датчиків (додатково, відповідно до необхідних даних)

Отримання даних від датчика

Ми можемо запрограмувати робота VEX (IQ, V5, EXP) для отримання даних від таких датчиків:

  • Інерційний датчик
  • Датчик відстані
  • Оптичний датчик
  • Датчик зору
  • Датчик обертання (V5, EXP)
  • Датчик GPS (V5)

Примітка: VEX IQ (2-го покоління) Brain і VEX EXP Brain мають вбудований інерційний датчик. Ми можемо збирати дані інерційного датчика за допомогою цих VEX Brians.

У цій статті ми розробимо проект реєстрації даних, який збирає дані прискорення за допомогою VEX IQ Brain (2nd) і зберігає їх на SD-карті. 

По-перше, нам потрібно написати коротку програму для отримання показань від таймера та інерційного датчика, вбудованого в VEX IQ Brain (2-й).

  • На початку цієї програми нам потрібно буде імпортувати модулі Python для керування VEX IQ Brain (2nd) і отримати з нього дані. Отже, почніть із додавання цих інструкцій до проекту.
  • # Бібліотека імпортує
    з vex import *

    # Brain має бути визначено за замовчуванням
    brain = Brain()
    brain_inertial = Inertial()
  • Далі додайте код, щоб оголосити змінну numOfDataEntries для зберігання кількості записів даних для запису, оголосите змінну polling_delay_msec для збереження значення інтервалу часу для читання даних і створіть порожню рядкову змінну data_buffer для зберігання дані, зчитані з датчика.
  • numOfDataEntries = 100
    polling_delay_msec = 50
    data_buffer = ""
  • Оскільки ми використовуватимемо поточне значення таймера для додавання позначки часу до даних, нам потрібно скинути значення таймера до 0 секунд, перш ніж розпочати збір даних.
  • # Додати код ініціалізації таймера
    brain.timer.clear()
  • Перш ніж використовувати інструкцію, яка отримує дані з VEX IQ Brain (2nd) і записує дані в буфер, нам потрібно спочатку це зрозуміти.
    Наступна інструкція додає поточне значення таймера до змінної data_buffer у певному форматі.

    Рядок коду Python виділено частинами для детального пояснення. Рядок коду читається так: data_buffer += 1.3f % brain.timer.value() + кома. Спочатку оператор += виділяється та позначається як Додати дані до рядка data_buffer. Далі рядок 1.3f виділяється та позначається як Рядок форматування. Далі знак відсотка виділяється та позначається як оператор модуля рядка. Далі команда brain.timer.value() виділяється та позначається як Поточне значення таймера. Нарешті, додавання рядка коми в кінці виділяється та виглядає як Додати кому в кінці для розділення даних.

    Давайте розберемо рядок формату “%1.3f”

    • «%»: представляє специфікатор перетворення.
    • «1»: вказує на мінімальну кількість цифр у рядку
    • “.3”: визначає кількість знаків після коми, які потрібно включити у відформатований номер.
    • «f»: вказує на те, що значення, яке потрібно відформатувати, є числом з плаваючою комою.

    Таким чином, ми можемо використовувати рядок формату «%1.3f» для форматування числа з плаваючою комою з мінімальною шириною 1 цифри та точністю 3 знаки після коми.

  • Тепер ми можемо прочитати таймер і значення прискорення інерційного датчика, вбудованого у VEX IQ Brain (2-й), а потім додати дані до змінної data_buffer у вказаному форматі.
  • # Команди для запису даних у буфер
    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"

    Попередній код детально пояснено. Перший рядок data_buffer, що використовує brain.timer.value(), позначено як Додати позначку часу до буфера. Наступні три рядки позначені як «Додати значення прискорення вздовж осей X, Y та Z до буфера».

  • Примітка: “\n” – символ нового рядка. Це вказує на те, що лінія закінчується тут і позначає початок нової лінії.
  • Потім, щоб записати певну кількість записів даних у змінну data_buffer , ми можемо використовувати цикл for , щоб багаторазово виконувати інструкції, які отримують дані та додають дані до змінної data_buffer протягом кількох ітерацій. Наша стратегія полягає у використанні значення змінної numOfDataEntries для визначення кількості ітерацій.
  • # Генерація даних
    для i в діапазоні(0, numOfDataEntries):

    # Команди для запису даних у буфер
    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() у циклі for , щоб призупинити програму, щоб додати певний проміжок часу між двома читаннями. Використовуємо значення змінної polling_delay_msec для визначення значення інтервалу часу.
  • # Генерація даних
    для i в діапазоні(0, numOfDataEntries):

    # Команди для запису даних у буфер
    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)

Щиро вітаю! Ми завершили програму для отримання показань (даних про прискорення) від інерційного датчика, вбудованого в VEX Brain. Далі ми розглянемо, як записати дані у файл CSV на SD-карті.

# Бібліотека імпортує
з vex import *

# Brain має бути визначено за замовчуванням
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Додати код ініціалізації таймера
brain.timer.clear()

# Генерація даних
for i in range(0, numOfDataEntries):

# Команди для запису даних у буфер
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(затримка_опитування_мсек, МСЕК)

Приєднання SD-карти до VEX Brain

Перш ніж записувати дані у файл на SD-карті, спочатку вставте SD-карту в слот для SD-карти VEX Brain.

IQ (2-го покоління) Brain показано з виділеним слотом для SD-карти. Слот для SD-карти знаходиться збоку Brain, праворуч від порту USB-C.

Примітка: Відформатуйте SD-карту у FAT32 для запису даних. Ми рекомендуємо використовувати SD-карти розміром 32 ГБ або менше.

Щоб переконатися, що запис даних у файл на SD-карті можна виконати за відповідних умов, нам потрібно буде додати код, щоб перевірити, чи SD-карту правильно вставлено у VEX IQ Brain (2-й).

  • Використовуйте функцію brain.sdcard.is_inserted() , щоб перевірити, чи вставлено SD-карту. Якщо SD-карта не вставлена, відобразіть відповідне повідомлення на екрані VEX IQ Brain і утримуйте програму.
  • # Призупинити програму, якщо SD-карта не вставлена
    якщо ні brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("SD-карта відсутня")
    while(True):
    wait(5, MSEC)
  • Примітка: функція ()повертає True якщо SD-карту вставлено в Brain.

Запис даних у файл CSV на SD-карті

Наразі наша програма може збирати дані за допомогою VEX IQ Brain (2nd). Щоб завершити проект реєстрації даних, нам потрібно записати дані у файл із значеннями, розділеними комами (CSV) на SD-карті для подальшої перевірки та аналізу.

  • Записуючи різні типи даних у файл CSV, ми хочемо знати, який тип даних містить кожен стовпець. Для цього ми можемо додати текст заголовка CSV до змінної data_buffer перед записом даних.
    Таким чином, додайте код для оголошення змінної csvHeaderText для зберігання тексту заголовка CSV, щоб указати назви стовпців для файлу CSV, і оголосите змінну sd_file_name для зберігання назви файлу CSV для запису в Флеш-картка.
  • csvHeaderText = "час, x, y, z"
    sd_file_name = "myDataPY.csv"

Примітка: Переконайтеся, що заголовки розташовані в тому самому порядку, що й дані, що зберігаються в змінній data_buffer.

  • Далі додайте текст заголовка CSV до рядка data_buffer перед циклом for для збору даних.
  • # Створення заголовка CSV
    data_buffer = csvHeaderText + "\n"

    # Генерація даних CSV
    for i in range(0, numOfDataEntries):

    # Команди для запису даних у буфер
    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-карті, давайте спочатку зрозуміємо, як використовувати функцію brain.sdcard.savefile().

    Рядок коду Python виділено частинами для детального пояснення. Рядок коду виглядає так: brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Спочатку розділ brain.sdcard.savefile виділяється та позначається як «Зберегти масив байтів у іменований файл на SD-карті». Далі розділ sd_file_name виділяється та позначається як Ім'я файлу. Нарешті, масив bytearray(data_buffer, 'utf-8') в кінці виділяється та позначається як Буфер.


    Ця інструкція записує дані, що зберігаються в змінній data_buffer , у файл CSV з іменем на SD-карті.
    Давайте розберемо:
    • brain.sdcard.savefile(): функція зберігає байтовий масив у файлі з назвою на SD-карті. Функція повертає кількість байтів, записаних у файл.

    • sd_file_name: перший параметр функції. Вказує назву файлу для запису. У цьому проекті ім'я файлу зберігається в змінній sd_file_name.

    • bytearray(datat_buffer,'utf-8'): другий параметр функції. Представляє масив байтів, який потрібно записати у файл.

        • bytearray(): метод створює змінний bytearray. У цій інструкції ми використовуємо його для перетворення рядка в байтовий масив, вказавши кодування.
        • data_buffer: перший параметр методу. Вказує джерело, яке потрібно перетворити на байтовий масив. У цьому проекті джерелом є дані, що зберігаються в змінній data_buffer. 
        • 'utf-8': другий параметр методу. Вказує вказане кодування, яке використовується для кодування рядка. У цій інструкції використовується кодування "utf-8". 
  • Після циклу for для збору даних використовуйте функцію brain.sdcard.savefile() , щоб записати дані, що зберігаються в змінній data_buffer , у файл CSV на SD-карті. Крім того, додайте код для перевірки значення, що повертається функцією brain.sdcard.savefile() , щоб переконатися, що дані були успішно записані у файл, та відобразити відповідне повідомлення на екрані VEX IQ Brain для отримання зворотного зв'язку в режимі реального часу. Оператор if в кінці додає повідомлення, яке показує стан файлу, друкуючи або SD Write Error , або Data Written.
  • # Генерація даних CSV
    для i в діапазоні(0, numOfDataEntries):

    # Команди для запису даних у буфер
    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-карту
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("Помилка запису на SD-карту")
    else:
    brain.screen.print("Дані записані")
  • Примітка: Функція brain.sdcard.savefile() повертає кількість байтів записаних у файл. У цьому проекті ми використовуємо його для запису зібраних даних у файл CSV, тому кількість байтів, записаних у файл, має бути більшою за нуль. Іншими словами, якщо функція () повертає , ми можемо зробити висновок, що дані не були успішно записані у файл. В іншому випадку дані були записані у файл.

Щиро вітаю! Ми розробили проект реєстрації даних, який збирає дані прискорення за допомогою VEX IQ Brain (2nd) і зберігає їх у файлі CSV на SD-карті. Далі ми розглянемо, як відкрити файл CSV для аналізу даних. 

# Бібліотека імпортує
з vex import *

# Brain має бути визначено за замовчуванням
brain = Brain()
brain_inertial = Inertial()

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

# Призупинити програму, якщо SD-карта не вставлена
якщо ні brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-карта відсутня")
while(True):
wait(5, MSEC)

# Додати будь-який датчик & сюди код ініціалізації таймера
brain.timer.clear()

# Створити заголовок CSV
data_buffer = csvHeaderText + "\n"

# Генерація даних CSV
for i in range(0, numOfDataEntries):

# Команди для запису даних у буфер
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)

# Запис даних на SD-карту
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("Помилка запису на SD")
else:
brain.screen.print("Дані записані")

Відкриття файлу CSV для аналізу даних

Після того, як дані будуть записані у файл CSV на SD-карті, ми можемо використовувати програму для роботи з електронними таблицями, щоб відкрити файл для читання та аналізу даних. 

Примітка. Двома найпоширенішими програмами для роботи з електронними таблицями є Google Таблиці та Microsoft Excel. У цій статті ми будемо використовувати Google Таблиці (веб-інтерфейс), щоб відкрити файл CSV на SD-карті. Процес використання інших програм аналогічний.

  • Вийміть SD-карту з гнізда SD-карти VEX IQ Brain. Якщо комп’ютер має вбудований слот для карт Micro SD, ми можемо вставити SD-карту безпосередньо в цей слот. В іншому випадку вставте SD-карту в адаптер SD-карти, а потім під’єднайте адаптер до комп’ютера. 
  • Увійдіть до нашого облікового запису Google і відкрийте Google Sheets. Створіть нову електронну таблицю.
  • В електронній таблиці відкрийте меню «File» , виберіть «Import» -> «Upload» -> «Browse» , потім виберіть файл CSV на комп’ютері. Після завантаження файлу CSV натисніть кнопку «Імпорт даних». Після імпортування даних натисніть «Відкрити зараз» , щоб переглянути зібрані дані у файлі CSV.

    CSV-файли з даними проєкту відкрито в документі Google Таблиць. Є чотири стовпці, що містять значення часу (Time), X, Y та Z. Є багато рядків даних, які документують прискорення для кожної позначки часу.

  • (Необов’язково) Один із простих способів аналізу даних – намалювати графік, а потім знайти тенденції в даних. В електронній таблиці відкрийте меню «Вставити» і виберіть «Діаграма» , щоб намалювати графік, використовуючи дані у файлі CSV. Наведений нижче графік є результатом даних про прискорення, зібраних за допомогою VEX IQ Brain (2-й).

    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.


    Примітка: Ми можемо використовувати редактор діаграм , щоб вибрати інший тип діаграми або відредагувати діаграму відповідно до наших потреб.

До цього моменту ми завершили проект реєстрації даних, який збирає дані за допомогою VEX IQ Brain (2nd) і зберігає їх у файлі CSV на SD-карті. Крім того, ми навчилися читати файл CSV на SD-карті за допомогою Google Таблиць і навіть створювати графік для подальшого аналізу. Що далі? Давайте спробуємо спланувати більш захоплюючі експерименти з використанням робота VEX для реєстрації даних, щоб спостерігати, як мінливі фактори навколишнього середовища впливають на різні типи даних, і отримати глибше розуміння навколишнього світу.

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

Last Updated: