Связь Arduino с ROS через UART

Я пытаюсь запрограммировать Arduino Mega(Crius) с Minnowboard Max A2 через интерфейс UART (Аппаратное управление потоком отключено).

Я могу успешно взаимодействовать с ROS (операционной системой робота) на Ubuntu 12.04, установленной на Minnowboard Max, через порт UART1, доступный на плате Minnow.

Crius UART имеет порт, совместимый с FTDi, с выводом DTR. К сожалению, у MinnowBoard нет вывода DTR для связи с Arduino (только контакты CTS/RTS для 1 из 3 портов UART). Таким образом, я не могу загрузить какой-либо скетч в Arduino через плату для рыбалки через UART. Я всегда должен подключаться к встроенному чипу FTDi-USB crius и загружать скетч.

Есть ли какой-либо обходной путь для загрузки скетча в Arduino через UART с платы для рыбалки ?

, 👍0

Обсуждение

Вы пробовали вывод RTS? Заголовок FTDI обычно утверждает, что RTS сбрасывает Arduino., @Nick Gammon


1 ответ


1

Вы можете использовать любой GPIO, который вам нравится, на Minnow, чтобы запустить сброс Mega для запуска загрузчика. Юн делает именно это, чтобы запрограммировать встроенный чип ATmega с помощью сценария, который они выбрали для названия "run-avrdude":

#!/bin/sh

echo 1 > /sys/class/gpio/gpio21/value
avrdude  -q -q -c linuxgpio -C /etc/avrdude.conf -p m32u4 -U efuse:r:/tmp/efuse:d
read EFUSE < /tmp/efuse
rm -f /tmp/efuse
if [ "x$EFUSE" = "x203" ] # 203 = 0xCB
then
    avrdude -c linuxgpio -C /etc/avrdude.conf -p m32u4 -U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xCB:m -Uflash:w:$1:i $2
else
    avrdude -c linuxgpio -C /etc/avrdude.conf -p m32u4 -U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xFB:m -Uflash:w:$1:i $2
fi
echo 0 > /sys/class/gpio/gpio21/value

Вы могли бы сделать что - то подобное, чтобы запустить загрузчик на удаленной плате-подключить любой вывод GPIO к линии сброса вашей платы Mega, а затем выполнить следующие логические действия:

  1. Установите GPIO для ВЫВОДА
  2. Установите GPIO на НИЗКИЙ уровень
  3. Задержите несколько мс
  4. Установите GPIO для ВВОДА
  5. Запустите avrdude.

Установив GPIO на ВХОД, вы эмулируете выход с открытым стоком. Если бы вы просто управляли GPIO ВЫСОКО, он удерживал бы контакт СБРОСА ВЫСОКО, и вы не смогли бы использовать интерфейс USB или кнопку СБРОСА. Установив его на вход, он затем эффективно отсоединяется от контакта СБРОСА, поэтому не будет мешать.

У Юна снова есть сценарий, который работает таким образом, "сброс mcu":

#!/bin/sh

echo 18 > /sys/class/gpio/export
echo "high" > /sys/class/gpio/gpio18/direction
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
echo 18 > /sys/class/gpio/unexport

У меня есть аналогичная настройка, но с использованием черного Биглебона и контроллера на базе PONTECH Quick240 PIC32. В моем IDE UECIDE я настроил специальное определение платы с добавлением следующего программатора, который выполняет сброс вручную через GPIO и запускает программу загрузки (pic32prog) за одну операцию:

upload.local.name=Local upload
upload.local.using=script
upload.local.script.0=__builtin_bullet::Entering programming mode...
upload.local.script.1=__builtin_gpio::7::low
upload.local.script.2=__builtin_delay::100
upload.local.script.3=__builtin_gpio::20::low
upload.local.script.4=__builtin_delay::100
upload.local.script.5=__builtin_gpio::20::hiz
upload.local.script.6=__builtin_delay::100
upload.local.script.7=__builtin_gpio::7::hiz
upload.local.script.8=__builtin_delay::100
upload.local.script.9=__builtin_bullet::Uploading sketch...
upload.local.script.10=${core.root}/tools/linux_arm/pic32prog::-S::-d::${port}::-B::${upload.maxbaud}::-p::${build.path}/${filename}.hex
upload.local.script.11=__builtin_bullet::Resetting board...
upload.local.script.12=__builtin_delay::100
upload.local.script.13=__builtin_gpio::20::low
upload.local.script.14=__builtin_delay::100
upload.local.script.15=__builtin_gpio::20::hiz

sketch.upload=local

Это немного отличается тем, что вам нужно удерживать второй GPIO на низком уровне, пока вы сбрасываете плату, чтобы запустить загрузчик, поэтому там используются два GPIO.

,