-
Notifications
You must be signed in to change notification settings - Fork 55
Слоты расширения
Контроллер имеет два слота расширения, но вполне вероятно, что пластиковый корпус не прорезан для их использования, это сделано для избежания неприятных инцидентов. Итак, если настала пора работать с картами расширения, то нам понадобится нож. Вывинчиваем четыре самореза, нежно открываем корпус, стараясь не потерять кнопки.
Затем при помощи обыкновенного ножа делаем прорези, корпус уже предослаблен в нужном месте, резаться должно легко. Пока видны непосредственно разъёмы, отметим их распиновку. Слотов расширения два, JX1 и JX2, на последующих фотографиях показана работа с портом JX2.
На этой фотографии показана стандартная разветвительная карточка.
Если у вас её нет, не беда, можно сделать самостоятельно, начиная с самых простых вариантов:
Разъём стандартный edge board connector с шагом в 2.54мм, допустимая толщина текстолита 1.37-1.78мм. Итак, карточка вставлена, давайте проверим распиновку. Схема нам говорит, что 11й пин порта JX2 - это EPWM1_A. Точнее, это PWM управление порта S5. Заходим в Настройки->Сервоприводы, включаем сервопривод на порту S5 и выставляем ему какой-нибудь угол (на фотографии 60). Тыкаемся осциллографом в соответствующий пин и наблюдаем квадратный сигнал, ширина которого зависит от выставленного угла. На фотографии специально показана разветвительная плата, сделанная "на коленке", так как на ней хорошо видно, какой именно пин разъёма мы проверяем.
Давайте попробуем простейшую проверку связи между десктопом и контроллером ТРИК: используем последовательный порт UART0 контроллера, а со стороны десктопа возьмём стандартный usb to serial свисток.
Внимание, последовательный порт, выведенный на слоты расширения, работает на напряжении 3.3В. Подключение пятивольтовых устройств грозит сжечь контроллер.
Используем только три провода: земля на контроллере с землёй usb2serial свистка (здесь зелёный). TX на контроллере с RX на свистке (здесь белый) и RX на контроллере с TX на свистке (жёлтый).
Подключаемся по ssh на контроллер, выставляем скорость последовательного порта 1Мб/сек и выводим содержимое порта:
root@trik-e44067:~# stty -F /dev/ttyS0 1000000 raw
root@trik-e44067:~# cat /dev/ttyS0
На десктопе также выставляем скорость и пишем что-нибудь в порт, эта надпись должна появиться на контроллере:
~$ stty -F /dev/ttyUSB0 1000000 raw
~$ echo "foo bar" >/dev/ttyUSB0
Если нам нужно работать с устройствами, требующими пятивольтовой логики, то можно использовать стандартный преобразователь уровней. Я переставил джампер на моём usb2serial свистке на 5В, а затем соединил последовательные порты контроллера ТРИК (который по-прежнему работает на 3.3В) и усб свистка через преобразователь на мосфетах bss138:
Итак, первое подключение робосервопривода (кликабельно):
Dynamixel использует полудуплексный протокол, поэтому подключать напрямую последовательный порт не получится. Вкратце, со стороны контроллера ТРИК нам понадобится три управляющих провода: RX, TX и переключатель, который будет говорить, хотим мы получать или отправлять, эрзац-версия RTS/CTS.
Оригинальный мануал предполагает использовать связку двух чипов 74hc04+74hc126:
Вместо этого я использовал один чип 74ls241:
Direction сигнал (зелёный провод) переключает либо RX, либо TX в hi-z состояние. Триковский RX жёлтый, триковский TX белый. Одна сторона (верхняя на фотографии, рыжие провода) макетной платы имеет напряжение 3.3В, вторая 5В (нижняя на фотографии, красные провода). 12В напряжение для сервопривода берутся непосредственно с разветвительной платы. Управляющий провод сервопривода также жёлтого цвета. Серые/чёрные провода - (общая) земля.
Исходный код примера брать здесь. Он предполагает один подключенный сервопривод с идентификатором 1, работающий на скорости 57600 бод. В данном примере я использовал GPIO1_11 ногу для переключения RX/TX.
Внимание, для переключающего сигнала я использовал GPIO ногу контроллера. Самый простой способ управления GPIO через sysfs интерфейс. К сожалению, это очень медленно, время переключения измеряется десятками миллисекунд, в то время как сервопривод отвечает (обычно) через десять микросекунд. Поэтому работа с GPIO должна вестись непосредственно через регистры процессора.
Добрая часть команд для робосервоприводов не требуют ответа от привода, таким образом, связь может быть односторонней. Здесь (по сравнению с прошлым разом) я убрал управление направлением и RX со стороны контроллера ТРИК:
Если вдруг почему-то сервопривод не отвечает, то вместо дата-провода сервопривода можно подключить usb2serial свисток на приём сигнала и смотреть реально переданные данные.
Зелёные провода остались, логический преобразователь уровней подтянут к 5В, поэтому чип 74sn241 настроен на передачу данных от контроллера к сервоприводу. Сервопривод будет отвечать после получения команд, поэтому теоретически это не очень хорошо не переключаться в режим приёма, но 74sn241 достаточно хорош, чтобы спокойно терпеть такие надругательства.
Вообще говоря, тема защиты сигнальных линий весьма важна, так как я уже несколько раз видел ситуации, где робот пережимает кабель, подавая все 12В на 5В/3.3В сигнальную линию. Поэтому в настоящем роботе защитой пренебрегать нельзя ни в коем случае! Но это тема для отдельного разговора.
Итак, мой сервопривод настроен на скорость 57600 бод, идентификатор 1. Я подключаюсь по ssh к контроллеру и выполнаю следующие команды:
stty -F /dev/ttyS0 57600 raw
Это настраивает порт в режим 8n1, скорость 57600 бод. Затем следующая команда поворачивает привод в одно почти крайнее состояние:
printf "\xFF\xFF\x01\x05\x03\x1E\xCD\x00\x0B" >/dev/ttyS0
Вот такая в противоположное:
printf "\xFF\xFF\x01\x05\x03\x1E\x32\x03\xA3" >/dev/ttyS0
Не забывайте, что управляющий пакет содержит и контрольную сумму, поэтому эти команды сработают только для этих двух положений и только для сервопривода с идентификатором 1.