Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Создание XMP‑1: бюджетная мобильная платформа на XMOS и Raspberry Pi

Введение

XMOS startKIT, доступный через Farnell (или Newark) всего за £12 (с НДС), предлагает компактную платформу формата кредитной карты, идеально сочетающуюся с Raspberry Pi. С минимальной пайкой — нужен только отвертка, бокорезы и плоскогубки — разработчики могут собрать функциональный робототехнический прототип, использующий многопоточную, низкоджиттерную параллельную обработку XMOS.

В этой статье мы пройдем через построение XMP‑1 (XMOS Mobile Platform), простой мобильной платформы, демонстрирующей высокоскоростной двунаправленный обмен между Raspberry Pi и XMOS startKIT через последовательный периферийный интерфейс (SPI). XMP‑1 также показывает, как управлять хоббийными сервоприводами через PWM, генерируемый прямо на плате XMOS, и как выставить веб-интерфейс для управления роботом в реальном времени.

Видеодемонстрации включены в оригинальный пост; первое показывает XMP‑1, обучающийся маршруту, второе — попытки робота воспроизвести маршрут с непрерывно вращающимися сервоприводами. Видео иллюстрируют как потенциал, так и ограничения текущего железа и прошивки.

Больше деталей

Этот пост — второй в серии экспериментов с XMOS startKIT. Часть 1 дала введение в терминологию XMOS, архитектуру и быстрый старт с примерами программ. Если вы новичок в XMOS, обзор Части 1 поможет понять концепции здесь. Часть 3 (название «XMOS startKIT: XMOS and Raspberry Pi Oscilloscope XAE 1000») возвращается к SPI-фреймворку и вводит использование ADC и реальную графику в браузере.

Для тех, кто фокусируется только на сборке и эксплуатации XMP‑1, можно пропустить расширенное обсуждение и перейти прямо к секциям кода в конце статьи. Прошивку можно скомпилировать и прошить на startKIT как описано в Части 1, а код Raspberry Pi работает на Node.js.

Обзор решения — железо и софт

Рисунок 1 (не показан) изображает готовый XMP‑1, питаемый от 5 В регулятора и приводящийся двумя непрерывно вращающимися хоббийными сервоприводами. Raspberry Pi берет на себя всю сеть, запуская легкий веб-сервер, отдающий index.html и интерпретирующий пользовательские команды в сообщения скорости/направления моторов.

Поток коммуникации иллюстрирован на Рисунке 2 (не показан). Pi генерирует PWM-сигнал для сервоприводов, отправляя SPI-пакет на XMOS startKIT. startKIT, действуя как SPI-slave, декодирует пакет и управляет сервоприводами соответствующими PWM-импульсами.

Последовательный периферийный интерфейс (SPI)

SPI опирается на четыре провода: SS, SCLK, MOSI и MISO. В этой настройке Raspberry Pi — мастер, выдающий такт и передающий данные на MOSI. Плата XMOS принимает данные на MOSI и возвращает статус или подтверждение на MISO. Линия SS активна в низком состоянии; используется пин CE1 Pi для выбора startKIT.

Осциллограмма (захваченная Tektronix MSO2024B) подтверждает целостность SPI-передачи. Три байта данных — 0x02, 0x00 и 0x10 — переданы от Pi к startKIT с опциональным нулевым ответом.

Управление хоббийными сервоприводами

Хоббийные сервоприводы конвертируют ширину PWM-импульса 1–2 мс в механическое вращение 0–180°, с 1.5 мс импульсом центрирующим вал. Непрерывно вращающиеся сервоприводы — вариация, удаляющая потенциометр и концевики — интерпретируют ширину импульса как команды скорости: 1.5 ms для нейтрали, 1 ms для полного реверса, 2 ms для полного вперед.

Каждое колесо XMP‑1 приводится непрерывно вращающимся сервоприводом. Эта схема упрощает проводку — внешний H‑мост не нужен — но ограничивает точное управление скоростью по сравнению с DC-моторами.

Начало разработки — подключение плат

Для разработки прошивки Raspberry Pi и startKIT соединены 26-пиновым шлейфом с IDC-коннекторами. Запасной IDC-коннектор может служить отладочным интерфейсом для зондирования сигналов мультиметром или осциллографом.

Реализация SPI (spi_process) на XMOS startKIT

Используя xTIMEcomposer IDE, импортируется встроенная библиотека SPI-slave, исходные файлы помещаются в директорию spi‑test/src. Следующая процедура инициализации настраивает источник такта, порты MOSI/MISO и интерфейс SPI-slave:

void spi_slave_init(spi_slave_interface &spi_if) { int clk_start; set_clock_on(spi_if.blk); configure_clock_src(spi_if.blk, spi_if.sclk); configure_in_port(spi_if.mosi, spi_if.blk); configure_out_port(spi_if.miso, spi_if.blk, 0); start_clock(spi_if.blk); return; }

Структура spi_slave_interface отображает SPI-пины на порты XMOS:

typedef struct spi_slave_interface { clock blk; in port ss; in buffered port:8 mosi; out buffered port:8 miso; in port sclk; } spi_slave_interface;

Входящие SPI-данные читаются в буфер следующей рутиной, реализующей простой tag-length-value (TLV) протокол для переменной длины сообщений:

void spi_slave_in_buffer(spi_slave_interface &spi_if, unsigned char buffer[], int num_bytes) { unsigned int data; unsigned int vlen=0; clearbuf(spi_if.miso); clearbuf(spi_if.mosi); for (int i = 0; i < num_bytes; i++) { spi_if.mosi :> data; data=data<<24; buffer[i]=bitrev(data); if (i==2) { vlen=((unsigned int)buffer[1])<<8 | (unsigned int)buffer[2]; if (vlen==0) break; } if (i >= vlen+2) { break; } } }

Первый байт пакета — тег (0–255). Следующие два байта кодируют длину полезной нагрузки (до 4096 байт). Нечетный тег сигнализирует, что Raspberry Pi ожидает ответ; четный — что ответ не требуется.

Межпроцессорное взаимодействие

Ядра XMOS общаются через транзакционные интерфейсы, а не простые каналы. Это позволяет передавать множество типов данных и возвращать значения в одном вызове интерфейса, идеально для координации ядра обработки SPI, ядра обработки данных и ядра генерации PWM.

Примеры определений интерфейсов:

interface program_display { void backlight(int state, int color); void plot(int x, int y, int color); }

Проектирование IPC-архитектуры для обработки SPI-контента

Ядро spi_process захватывает входящие SPI-данные в буфер 4099 байт и передает указатель ядру data_handler через транзакцию с movable array. После обработки data_handler может заполнить буфер ответом и сигнализировать spi_process, что данные готовы к передаче обратно на следующем SPI-обмене.

interface to_rpi { void code(unsigned char c); }; interface from_rpi { unsigned char* movable array_data(unsigned char* movable bufp); };

Фрагменты логики ядер:

void spi_process(interface to_rpi server s, interface from_rpi client c) { unsigned char storage[4099]; unsigned char* movable buf=storage; buf=c.array_data(move(buf)); select { case s.code(unsigned char c): if (c==SEND) { spi_slave_out_buffer(spi_sif, buf, 4099); } break; } }
void data_handler(interface to_rpi client c, interface from_rpi server s) { select { case s.array_data(unsigned char* movable vp) -> unsigned char* movable vq: vq[0]=0x22; // tag vq[1]=0x00; // length vq[2]=0x00; vq=move(vp); tosend=1; break; } if (tosend) { c.code(SEND); } }

Эта архитектура обеспечивает универсальный двунаправленный коммуникационный канал между Raspberry Pi и XMOS startKIT, адаптируемый для широкого спектра робототехнических или IoT-проектов.

Реализация PWM (servo_handler) на startKIT

Рутина управления сервоприводами работает на выделенном ядре XMOS и управляет до восьми сервоприводов. PWM-сигнал каждого сервопривода генерируется переключением выходного пина с нужным рабочим циклом каждые 20 мс, с микросекундным разрешением для тонкой настройки скорости. Начальные значения центрированы (или стационарны для непрерывно вращающихся сервоприводов), и ядро обновляет сигнал на каждом цикле на основе последней команды, полученной через IPC-фреймворк.

Хотя текущий XMP‑1 использует только два непрерывно вращающихся сервопривода, прошивка поддерживает расширение до дополнительных моторов или управления DC-моторами через H‑мост интерфейс при необходимости.

Для полного исходного кода и инструкций по компиляции см. конец этой статьи.


Производственный процесс

  1. Бесшовная MQTT интеграция: NodeMCU DHT22 сенсоры с Raspberry Pi 3 B+ как брокер
  2. Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
  3. Бесшовный мониторинг температуры и влажности на Raspberry Pi с EzTemp
  4. Создание многодатчиковой системы мониторинга температуры и света с Raspberry Pi и DS18B20
  5. Мастерство управления датчиками и исполнительными механизмами на Raspberry Pi: акселерометр, сервопривод и потоко…
  6. Создайте автоматизированную аэропоническую систему с Raspberry Pi и датчиком влажности
  7. Raspberry Pi 3 B+ — Обновленные характеристики, спецификации и руководство по покупке
  8. Создание умного робота с Bridge Shield — интеграция Raspberry Pi и Arduino
  9. ValentFX представляет открытые FPGA-аддоны для BeagleBone и Raspberry Pi
  10. Создайте своего робота на Raspberry Pi с набором MonkMakes RRB2 — подробное руководство