SFMonitor

SFMonitor - программа для визуализации потоков данных из последовательного порта. Первоначальная идея программы была заимствована у хорошего человека Eli Bendersky. 

1. Установка

1.1. Windows


1.2. Linux


SFMonitor реализован на языке python и для своей работы требует предварительной установки следующих пакетов:
  1. python 3.4
  2. pyserial > 2.5
  3. pyqt > 4.11
  4. pyqtgraph
  5. formlayout > 1.0.9
Запуск приложения осуществляется с помощью скрипта "sfmonitor.pyw".

2. Интерфейс пользователя



2.1. Меню

Файл
  • Выбор COM-порта - выбор последовательного порта из списка доступных; выбор скорости порта;
  • Запуск монитора - запуск монитора на прием данных из порта;
  • Остановка монитора - остановка приема данных;
  • Настройки - настройка языка интерфейса;
  • Выход

Данные
  • Шкалы графика:
    • минимальные/максимальные значений, отображаемых на графике;
    • настройка размера страницы;
  • Настройка потоков:
    • цвет графика;
    • точечный график - переключение между точечным и сплошным;
    • беззнаковый/знаковый - как интерпретировать данные в пакете, со знаком или без;
    • размер значения в пакете - сколько байт занимает значение в пакете. Может быть 1 байт (0..255), или 2 (0..65535);
    • отображать шлейф - в режиме Позиция, за маркером тянется небольшой шлейф;
    • наличие разделителя значений - вариант пакета, в котором значения не разделяются символом 0x10, удобно для векторов;

Помощь
  • О программе

2.2. Форма

  • Выбрать порт - эквивалент пункту меню Выбор COM-порта;
  • Запустить - эквивалент пункту меню Запуск монитора;
  • Остановить - эквивалент пункту меню Остановка монитора;
  • Остановить порт - установка Break состояния порта на 0.25с (не используется); 
  • Сброс - сброс масштаба и текущих точек графика;
  • Формат данных - выбор формата данных: Простой, Функция y(t) и Функция y(x);
  • Вид графика - выбор вида графика: График, Вектор, Позиция;
  • Частота обновления - количество отрисовок графика в секунду;
  • Потоки - отображение/скрытие потока.

2.3. График

График поддерживает логарифмический режим, масштабирование и смешение при помощи мыши, формирование среднего, и т.п.

3. Форматы данных

SFMonitor имеет три формата данных: Простой (Simple), Функция y(t) (Complex v(t)), Функция y(x) (Complex y(x)).

3.1. Простой

В режиме "Простой", монитор принимает поток одно-байтовых величин. При этом, из полученного каждый момент пачки байт отбирается только последний. В связи с этим, следует внимательно отнестись к скорости передачи данных.

Пример источника на Arduino

void setup() {
  Serial.begin(115200);
  pinMode(A0, INPUT);
}

void loop() {
  // считываем значение АЦП на ноге A0, и передаем его в порт
  Serial.write(byte((analogRead(A0)/1024.0)*255));
  delay(10);
}


3.2. Complex

Режимы Функция подразумевают передачу пакетов определенного формата. 
Формат пакета имеет вид:

0x12,0xA1,0x00,0x10,0x01,0xFF,0x13

Здесь:

0x12 и 0x13 - границы пакета;
0x10 - разделитель чисел;
0x00,0xA1 и 0x01, 0xFF - передаваемые числа в диапазоне от 0 до 65535 (или 0..255 в случае однобайтовых значений);
0x7D - экранирующий символ.

В режиме Функция v(t) монитор берет только одно значение из каждого пакета. При этом, строится график v(t), где t - время получения пакета. Пакет Complex v(t) может содержать до трех значений, которые будут соответствовать трем графикам разных цветов.

В режиме Функция y(x) для построения оси абсцисс используется второе значение пакета. Этот режим полезен, в случае, если важно отобразить не время приема данных, а реальное время их отправки, зафиксированное на приемнике.

Для упрощения работы с вышеуказанным протоколом, была специально разработана библиотека SerialFlow для Arduino и Mbed. Скачать её можно тут: https://github.com/oevsegneev/arduino-dev/tree/master/libs/SerialFlow

Пример программы для Arduino с использованием библиотеки SerialFlow, осуществляющей отправку показаний акселерометра. В данном случае, в мониторе следует выбрать режим Complex v(t).

График данных акселерометра adxl345

static const byte PACKET_SIZE = 1;
static const byte VALUE_SIZE = 2;
static const boolean SEPARATE_VALUES = true;

#include <SerialFlow.h>

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>

Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
SerialFlow rd(&Serial); // RX, TX

void setup() {
    rd.setPacketFormat(VALUE_SIZE, PACKET_SIZE, SEPARATE_VALUES);
    rd.begin(115200);
    
    accel.begin();
    accel.setRange(ADXL345_RANGE_2_G);
}

void loop() {
    sensors_event_t event; 
    accel.getEvent(&event);

    rd.setPacketValue(event.acceleration.x);
    rd.sendPacket();

    delay(10);
}


4. Виды графика

4.1. График

Подходит для всех форматов данных. Отображает привычный всем график функции y(x). Если координата x превышает размер страницы (задается в меню Данные), то график переключается на следующую страницу. При переключении между страницами, старые данные стираются для увеличения производительности.

4.2. Вектор

В каждый момент времени отображает вектор значений в виде графика функции y(x), где x - номер ячейки вектора.

4.3. Позиция

Вместо графика отображается прямоугольник с координатами {x, y}, которые берутся из 0-го потока. 




Comments