SFMonitor - программа для визуализации потоков данных из последовательного порта. Первоначальная идея программы была заимствована у хорошего человека Eli Bendersky.
1.1. Windows
Дистрибутив: http://git.robotclass.ru/download/SFMonitor-1.2-win32.msi
1.2. Linux
Исходные коды: https://github.com/makeitlab/software_tools.git
SFMonitor реализован на языке python и для своей работы требует предварительной установки следующих пакетов:
python 3.4
pyserial > 2.5
pyqt > 4.11
pyqtgraph
formlayout > 1.0.9
Запуск приложения осуществляется с помощью скрипта "sfmonitor.pyw".
2.1. Меню
Файл
Выбор COM-порта - выбор последовательного порта из списка доступных; выбор скорости порта;
Запуск монитора - запуск монитора на прием данных из порта;
Остановка монитора - остановка приема данных;
Настройки - настройка языка интерфейса;
Выход
Данные
Шкалы графика:
минимальные/максимальные значений, отображаемых на графике;
настройка размера страницы;
Настройка потоков:
цвет графика;
точечный график - переключение между точечным и сплошным;
беззнаковый/знаковый - как интерпретировать данные в пакете, со знаком или без;
размер значения в пакете - сколько байт занимает значение в пакете. Может быть 1 байт (0..255), или 2 (0..65535);
отображать шлейф - в режиме Позиция, за маркером тянется небольшой шлейф;
наличие разделителя значений - вариант пакета, в котором значения не разделяются символом 0x10, удобно для векторов;
Помощь
О программе
2.2. Форма
Выбрать порт - эквивалент пункту меню Выбор COM-порта;
Запустить - эквивалент пункту меню Запуск монитора;
Остановить - эквивалент пункту меню Остановка монитора;
Остановить порт - установка Break состояния порта на 0.25с (не используется);
Сброс - сброс масштаба и текущих точек графика;
Формат данных - выбор формата данных: Простой, Функция y(t) и Функция y(x);
Вид графика - выбор вида графика: График, Вектор, Позиция;
Частота обновления - количество отрисовок графика в секунду;
Потоки - отображение/скрытие потока.
2.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.1. График
Подходит для всех форматов данных. Отображает привычный всем график функции y(x). Если координата x превышает размер страницы (задается в меню Данные), то график переключается на следующую страницу. При переключении между страницами, старые данные стираются для увеличения производительности.
4.2. Вектор
В каждый момент времени отображает вектор значений в виде графика функции y(x), где x - номер ячейки вектора.
4.3. Позиция
Вместо графика отображается прямоугольник с координатами {x, y}, которые берутся из 0-го потока.