UART ... ардуина и LinuxCnC

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Impartial »

nkp писал(а):тогда не очень как то ...
Для реализации такого принципа считывания резольвера обычно применяют спец чипы. но они довольно дорогие. Проще уйти от абсолютного энкодера и сделать обратное преобразование. Т.е. подать квадратуру(синус, косинус) на выхода, а со входа считать компаратором знак. И дальше уже считать позицию счетчиком. Так сделано в большинстве станков советского производства.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение nkp »

Impartial писал(а):Для этого нужен драйвер сом порта работающий в серво потоке, т.е. в реалтаймовой части. Такого штатного нет. Надо самому писать. Однако, если до сих пор он никем не написан, значит там есть какой то непреодолимый бугор.
вот это разве не то?

Код: Выделить всё

component serport """Hardware driver for the digital I/O bits of the 8250 and 16550 serial port.

.B loadrt serport io=\\fIaddr[,addr...]\\fR
.PP
The pin numbers refer to the 9-pin serial pinout.  Keep in mind that these ports generally use rs232 voltages, not 0/5V signals.

Specify the I/O address of the serial ports using the module parameter
\\fBio=\\fIaddr[,addr...]\\fR.  These ports must not be in use by the kernel.
To free up the I/O ports after bootup, install setserial and execute a command
like:
.RS 
sudo setserial /dev/ttyS0 uart none
.RE
but it is best to ensure that the serial port is never used or configured by
the Linux kernel by setting a kernel commandline parameter or not loading
the serial kernel module if it is a modularized driver.
""";

pin out bit pin_1_in "Also called DCD (data carrier detect); pin 8 on the 25-pin serial pinout";
pin out bit pin_6_in "Also called DSR (data set ready); pin 6 on the 25-pin serial pinout";
pin out bit pin_8_in "Also called CTS (clear to send); pin 5 on the 25-pin serial pinout";
pin out bit pin_9_in "Also called RI (ring indicator); pin 22 on the 25-pin serial pinout";

pin out bit pin_1_in_not "Inverted version of pin-1-in";
pin out bit pin_6_in_not "Inverted version of pin-6-in";
pin out bit pin_8_in_not "Inverted version of pin-8-in";
pin out bit pin_9_in_not "Inverted version of pin-9-in";

pin in bit pin_3_out  "Also called TX (transmit data); pin 2 on the 25-pin serial pinout";
pin in bit pin_4_out "Also called DTR (data terminal ready); pin 20 on the 25-pin serial pinout";
pin in bit pin_7_out "Also called RTS (request to send); pin 4 on the 25-pin serial pinout";

param rw bit pin_3_out_invert;
param rw bit pin_4_out_invert;
param rw bit pin_7_out_invert;
param r u32 ioaddr;

option count_function;
option extra_setup;
option extra_cleanup;
option constructable no;

function read nofp;
function write nofp;

license "GPL";
;;

#include <asm/io.h>
#include <rtapi_errno.h>

#define MAX 8
int io[MAX] = {0,};
RTAPI_MP_ARRAY_INT(io, MAX, "I/O addresses of serial ports");

int get_count(void) {
    int i = 0;
    for(i=0; i<MAX && io[i]; i++) { /* Nothing */ }
    return i;
}

EXTRA_SETUP() {
    rtapi_print_msg(RTAPI_MSG_INFO, "requesting I/O region 0x%x\n",
			io[extra_arg]);
    if(!rtapi_request_region(io[extra_arg], 7, "serport")) {
	// set this I/O port to 0 so that EXTRA_CLEANUP does not release the IO
	// ports that were never requested.
	rtapi_print_msg(RTAPI_MSG_ERR,
	    "Could not register port at address 0x%x.  See\n"
	    "'man serport' for information on using 'setserial'\n"
	    "to make a port available to hal", io[extra_arg]);
        io[extra_arg] = 0; 
        return -EBUSY;
    }
    ioaddr = io[extra_arg];
    return 0;
}

EXTRA_CLEANUP() {
    int i;
    for(i=0; i < MAX && io[i]; i++) {
        rtapi_print_msg(RTAPI_MSG_INFO, "releasing I/O region 0x%x\n",
			io[i]);
        rtapi_release_region(io[i], 7);
    }
}

#define MSR (ioaddr + 6)
#define CTS (1<<4)
#define DSR (1<<5)
#define RI (1<<6)
#define DCD (1<<7)

#define MCR (ioaddr + 4)
#define DTR (1<<0)
#define RTS (1<<1)

#define LCR (ioaddr + 3)
#define BREAK (1<<6)

FUNCTION(read) { 
    int i = inb(MSR);

    pin_9_in = (i & RI) == 0;
    pin_9_in_not = (i & RI) == RI;

    pin_1_in = (i & DCD) == 0;
    pin_1_in_not = !(i & DCD) == DCD;

    pin_6_in = (i & DSR) == 0;
    pin_6_in_not = (i & DSR) == DSR;

    pin_8_in = (i & CTS) == 0;
    pin_8_in_not = (i & CTS) == CTS;
}

FUNCTION(write) {
    int i = 0, j=0;

    if(!pin_4_out ^ !pin_4_out_invert) i |= DTR;
    if(!pin_7_out ^ !pin_7_out_invert) i |= RTS;
    if(!pin_3_out ^ !pin_3_out_invert) j |= BREAK;

    outb(i, MCR);
    outb(j, LCR);
}
Последний раз редактировалось nkp 08 фев 2014, 23:35, всего редактировалось 1 раз.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение aftaev »

Impartial писал(а):Для реализации такого принципа считывания резольвера обычно применяют спец чипы. но они довольно дорогие.
типо этого UART ... ардуина и LinuxCnC #3 ?
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Dmaster
Мастер
Сообщения: 1272
Зарегистрирован: 15 июл 2011, 13:36
Репутация: 476
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Dmaster »

nkp писал(а):мне кажеться тс хочет использовать как раз uart меса (5и23)
именно!!!!!! uart есть еще у 5i20
" Linux CNC - наше всё"
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Impartial »

nkp писал(а):вот это разве не то?
Нет. В данном случае ком порт используется только как расширение лпт. Увеличивает количество входов-выходов. Как последовательный порт он не работает.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Сергей Саныч »

Теоретически можно, наверное, на основе serport сделать свой компонент, который бы позволял принимать последовательные данные. Работа с 8250/16450 достаточно проста.
Impartial писал(а):Однако, если до сих пор он никем не написан, значит там есть какой то непреодолимый бугор.
Скорее всего, сработал принцип "неуловимого Джо".
Чудес не бывает. Бывают фокусы.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Impartial »

aftaev писал(а): типо этого UART ... ардуина и LinuxCnC #3 ?
Ну да, это оно. Сколько стоит?
Сергей Саныч писал(а):Скорее всего, сработал принцип "неуловимого Джо"
Врядли. Судя по форумам многие интересуются возможностью управлять движением по ком порту. Есть реализация модбаса, что в принципе одно и тоже, но этот компонент предназначен для работы только в пользовательском режиме. Для пульта это подойдет, а для движения нет. Даже концевики хомов нельзя через него подключать.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение aftaev »

Impartial писал(а):Сколько стоит?
там же цена есть в ссылке :)
123.png (3163 просмотра) <a class='original' href='./download/file.php?id=24581&mode=view' target=_blank>Загрузить оригинал (69.33 КБ)</a>
Засада только, можно купить от 160 штук или заказать образцы. У меня не вышло :hehehe:
aftaev писал(а):На их сайте типо можно заказать бесплатные образцы http://www.analog.com/ru/analog-to-digi ... ct-samples
только для этого нужен корпоративный емайл :)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4605
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1622
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение selenur »

Я периодически семплы беру у них, но вот время доставки семплов иногда растягивается до 3-х месяцев
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Сергей Саныч »

Impartial писал(а):Врядли. Судя по форумам многие интересуются возможностью управлять движением по ком порту. Есть реализация модбаса, что в принципе одно и тоже, но этот компонент предназначен для работы только в пользовательском режиме.
Ничего сложного в работе с COM-портом нет, поскольку устройство древнее и все регистры прекрасно описаны. Проблема, КМК, только в малой скорости самого порта и подключаемых устройств. На типичной для Modbus скорости 19200 бод можно за один сервоцикл (1 мсек) передать или принять меньше двух байт. А цикл обмена по RTU - минимум 20 байтов.
Можно, конечно, отказаться от модбаса и использовать упрощенные протоколы и поднять скорость (стандартно максимум до 115200). Но это получатся узкоспециализированые решения, требующие нестандартной периферии. Которые, если и появятся, вряд ли попадут в стандартную поставку LCNC.
Чудес не бывает. Бывают фокусы.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение nkp »

Сергей Саныч писал(а):А цикл обмена по RTU - минимум 20 байтов.
это конечно не существенно в данном ракурсе , но - почему 20?
(исходя из протокола)
Аватара пользователя
Dmaster
Мастер
Сообщения: 1272
Зарегистрирован: 15 июл 2011, 13:36
Репутация: 476
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Dmaster »

Зачем изобретать велосипед?.. у месы почти каждая anything I/O может общаться по UART

как ТС прошу дать оценку вот этому
https://github.com/araisrobo/linuxcnc/b ... ot2/uart.c
" Linux CNC - наше всё"
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Сергей Саныч »

nkp писал(а):почему 20?
Запрос (в приведенном источнике, табл. 3-4 - 8 байт)
Пауза (3,5 байтовых интервала)
Ответ (табл. 3-5 - 7 байт)
Пауза (3,5)
Итого 22.
Чудес не бывает. Бывают фокусы.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Impartial »

Dmaster писал(а):Зачем изобретать велосипед?.. у месы почти каждая anything I/O может общаться по UART
Какая разница где этот юарт находится в штатном оборудовании компа или в месе. Штатный даже более предпочтителен. Проблема не уйдет из за перемены места ее пребывания.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Serg »

Те, что на платах 5i25/6i25 умеют работать на скоростях до 2 Mbit/s.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Impartial »

Штатный тоже это умеет на новых компах. Только это ничего не дает. Все равно мало.
Допустим написали идеальный драйвер умеющий без задержек вытаскивать на уровень приложения данные и без задержек передавать на физический уровень. Что получаем в разрезе движения?
Если использовать весь интервал сервоцикла, то максимальная пропускная способность канала - 200 байт за сервоцикл при 2 мбит скорости.
Для синхронизации с сервоциклом нужно в его начале передать запрос - допустим 1 байт. На этот запрос получаем ответ - данные энкодеров, состояния концевиков, контрольную сумму. Это на 4 оси не менее 20 байт. Дальше комп считает ПИДы и выдает значения текущей скорости, состояния выходов и контрольную сумму. Это еще около 20 байт. Приемная сторона должна настроить по этим данным свои системы управления скоростью. И это все при условии, что в канале нет сбоев, что при 2 мбит маловероятно.
В общем весьма непростая задачка с непредсказуемым выходным результатом.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: UART ... ардуина и LinuxCnC

Сообщение Serg »

А, тут про управление движением - тогда фик, в Месе эти порты используются только для расширения IO. Максимум на один порт они умеют навешивать полторы тысячи двоичных пинов.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

Вернуться в «LinuxCNC»