> ультразвуковые сенсоры дистанции
С ультразвуковыми сенсорами реальная проблема.
Остальное кое-как можно использовать.
Linux не является RTOS. RT-патч даёт только возможность вытеснения кода ядра, но это не особо спасает.
Например, на STM32 у меня через MCP23S17 сразу десять ультразвуковых датчиков работает. Обмен через SPI с DMA. Абсолютно без как-либо напрягов для CPU.
На одну ногу ультразвукового датчика нужно подать сигнал длительностью 10 микросекунд. На RPi это невозможно сделать. Конечно датчик работает, если длительность импульса больше 10 мкс, но не в 100% случаев. После подачи сигнала на триггер нужно ждать низкий уровень на другой ноге. Интервал времени между моментом, когда на ноге RPi появился низкий сигнал, и моментом, когда об этом стало известно приложению, вообще не детерминирован. Достоверно измерить длительность импульса практически невозможно.
У GM25-370 датчик Холла на валу двигателя.
У модели, где после редуктора 150 об/сек, вал вращается со скоростью 11500 об/сек. Нужно два канала, чтобы знать направление.
На мой взгляд, на прерываниях это нереально сделать на любом микроконтроллере, а особенно на Arduino.
У STM32 аппаратно инкрементируется счётчик, если на первом канале энкодера сигнал пришел раньше. И декрементируется, если на втором канале пришел раньше.
> Интересно было бы взглянуть на вашу платформу. С десятью сонарами)
Самому интересно :-). Пришлось всё-таки MCP23S17 применить — ног мало. В бою сразу десять ещё не пробовал. Пока жду посылки.
Возник такой вопрос. Как на Arduino c энкодерами поступили? Прерывание на ногу?
P.S.
Сам STM32 Nucleo-144 взял. Наверно, некий оверхед, но аппаратно четыре энкодера поддерживает. Плюс USB (в большой комп или микро-комп). Ещё десять ультразвуковых датчиков. В итоге 144 ноги уже почти закончились :-).
Вот такой набор есть:https://ru.aliexpress.com/item/ONE-Set-of-Car-Parts-included-25-motor-85mm-wheel-Tyre-Width-38mm-coupling-motor-bracket/32609240322.html?spm=2114.10010208.1000022.1.VPYTw7&isOrig=true#extend
Правда скорость вращения не очень высокая (редуктор такой).
Сам начал с желтых пластмассовых двигателей. Потом решил 25мм двигатель и 85мм колёса. Сейчас же жду 130мм колёса и 37мм двигатели 400RPM.
Двигатели с датчиком Холла. Наконец-то я понял, что мне повезло со специальностью :-) (Приборостроение) и очень полезно знать про системы с обратной связью.
> Лучше уж взять нормальный контроллер управления железом (ARM Cortex M3..4)
Ага. У них гарантированное время реакции на прерывание. И вложенные прерывания…
Было любопытно посмотреть на решения проблемы.
Один человек портировал FreeRTOS на Xen и запустил параллельно с Linux (в Cortex-A7 аппаратная виртуализация).
Есть порт FreeRTOS на Raspberry Pi.
Плату на Cortex-M соединяют с платой на Cortex-A (SPI, USB ...).
Производители SoC на одном кристалле размещают Cortex-A Cortex-M. Это самое правильное и удобное для использования. Эх, если бы знать всё заранее :-), то выбрал бы изначально такой вариант.
Это я чисто гипотетически предполагаю возможность лёгкой замены, если вдруг чего. Пока до камеры не дошел. Долго ещё идти :-)
RPi3 же с WiFi и Bluetooth вышла. Может быть проще её купить, чем отдельно USB-свистки.
Увидел свой путь, но наоборот :-).
Я немного боле года назад начал делать колёсного робота.
Сначала казалось, что нужна многоядерная плата. Купил двухъядерную Banana Pi.
Первым ударом был ультразвуковой датчик. Я не мог предположить, что Linux с PREEMPT RT вообще не подходит для таких вещей.
Датчику нужно на одну ногу подать 10 микросекунд для запуска, а на второй ноге ждать пока сигнал станет ровен нулю. Эти вещи делать НЕЧЕМ!!! Конечно народ к Raspberry Pi подключает такие датчики и жалуется, что они не точные. Однако дело вовсе не в датчиках.
Приобрёл STM32 Nucleo-64 и подключил 10 датчиков через MCP23S17. Аллилуйя! Всё идеально. Однако к тому времени поменял платформу. Теперь было нужно 4 ШИМ и 4 энкодера (моторы с датчиком Холла). 64-х ног Nucleo-64 категорически не хватало. И тут появились STM32 Nucleo-144. Я сразу себе приобрёл с новеньким Cortex-M7. А он по USB подключен к Banana Pi (можно безболезненно на Raspberry Pi заменить).…
Потом узнал, что многие производители SoC дополнительно встраивают ядра Cortex-M (или собственные, например, в BeagleBone Black) для выполнения на них Real-Time OS.
С ультразвуковыми сенсорами реальная проблема.
Остальное кое-как можно использовать.
Linux не является RTOS. RT-патч даёт только возможность вытеснения кода ядра, но это не особо спасает.
Например, на STM32 у меня через MCP23S17 сразу десять ультразвуковых датчиков работает. Обмен через SPI с DMA. Абсолютно без как-либо напрягов для CPU.
На одну ногу ультразвукового датчика нужно подать сигнал длительностью 10 микросекунд. На RPi это невозможно сделать. Конечно датчик работает, если длительность импульса больше 10 мкс, но не в 100% случаев. После подачи сигнала на триггер нужно ждать низкий уровень на другой ноге. Интервал времени между моментом, когда на ноге RPi появился низкий сигнал, и моментом, когда об этом стало известно приложению, вообще не детерминирован. Достоверно измерить длительность импульса практически невозможно.
У модели, где после редуктора 150 об/сек, вал вращается со скоростью 11500 об/сек. Нужно два канала, чтобы знать направление.
На мой взгляд, на прерываниях это нереально сделать на любом микроконтроллере, а особенно на Arduino.
У STM32 аппаратно инкрементируется счётчик, если на первом канале энкодера сигнал пришел раньше. И декрементируется, если на втором канале пришел раньше.
> Интересно было бы взглянуть на вашу платформу. С десятью сонарами)
Самому интересно :-). Пришлось всё-таки MCP23S17 применить — ног мало. В бою сразу десять ещё не пробовал. Пока жду посылки.
P.S.
Сам STM32 Nucleo-144 взял. Наверно, некий оверхед, но аппаратно четыре энкодера поддерживает. Плюс USB (в большой комп или микро-комп). Ещё десять ультразвуковых датчиков. В итоге 144 ноги уже почти закончились :-).
Правда скорость вращения не очень высокая (редуктор такой).
https://ru.aliexpress.com/item/2pcs-lot-130mm-Plastic-Wheels-New-Style-robot-wheels-new-wheels-for-DIY-smart-car-Robot/32549479884.html?spm=2114.10010208.1000022.1.mF0e0Q&isOrig=true#extend
https://ru.aliexpress.com/item/JGB37-555B-6v-24v-High-torque-DC-gear-motor-with-high-precision-encoder-Speed-encoder-motor/32700191670.html?spm=2114.10010208.1000022.1.gMGZix&isOrig=true#extend
Самые дешёвые, которые попались:
А мотор такой:
Пока ничего сказать не могу по поводу качества мотора JGB37-555B. Крутящий момент у него высокий (по ссылке таблица есть).
Сам начал с желтых пластмассовых двигателей. Потом решил 25мм двигатель и 85мм колёса. Сейчас же жду 130мм колёса и 37мм двигатели 400RPM.
Двигатели с датчиком Холла. Наконец-то я понял, что мне повезло со специальностью :-) (Приборостроение) и очень полезно знать про системы с обратной связью.
Почему? Freescale™ i.MX 6. Много чего на нём есть.
Вот попалось: http://www.udoo.org/udoo-neo/
Ага. У них гарантированное время реакции на прерывание. И вложенные прерывания…
Было любопытно посмотреть на решения проблемы.
Один человек портировал FreeRTOS на Xen и запустил параллельно с Linux (в Cortex-A7 аппаратная виртуализация).
Есть порт FreeRTOS на Raspberry Pi.
Плату на Cortex-M соединяют с платой на Cortex-A (SPI, USB ...).
Производители SoC на одном кристалле размещают Cortex-A Cortex-M. Это самое правильное и удобное для использования. Эх, если бы знать всё заранее :-), то выбрал бы изначально такой вариант.
RPi3 же с WiFi и Bluetooth вышла. Может быть проще её купить, чем отдельно USB-свистки.
Увидел свой путь, но наоборот :-).
Я немного боле года назад начал делать колёсного робота.
Сначала казалось, что нужна многоядерная плата. Купил двухъядерную Banana Pi.
Первым ударом был ультразвуковой датчик. Я не мог предположить, что Linux с PREEMPT RT вообще не подходит для таких вещей.
Датчику нужно на одну ногу подать 10 микросекунд для запуска, а на второй ноге ждать пока сигнал станет ровен нулю. Эти вещи делать НЕЧЕМ!!! Конечно народ к Raspberry Pi подключает такие датчики и жалуется, что они не точные. Однако дело вовсе не в датчиках.
Приобрёл STM32 Nucleo-64 и подключил 10 датчиков через MCP23S17. Аллилуйя! Всё идеально. Однако к тому времени поменял платформу. Теперь было нужно 4 ШИМ и 4 энкодера (моторы с датчиком Холла). 64-х ног Nucleo-64 категорически не хватало. И тут появились STM32 Nucleo-144. Я сразу себе приобрёл с новеньким Cortex-M7. А он по USB подключен к Banana Pi (можно безболезненно на Raspberry Pi заменить).…
Потом узнал, что многие производители SoC дополнительно встраивают ядра Cortex-M (или собственные, например, в BeagleBone Black) для выполнения на них Real-Time OS.