Как управлять несколькими роботами через ПК, используя последовательную связь?
Я хочу управлять несколькими роботами, используя мой ноутбук. Роботы не обладают интеллектом, они отправляют значения датчиков на ПК, который вычисляет значения датчиков и отправляет результаты обратно роботам (централизованное управление роботами с помощью ПК).
Роботы общаются с ПК через последовательную связь с помощью модуля Zigbee.
Проблема: Как создать и отправить структуру (из робота), такую как {sen1, sen2,sen3.., id робота}, где sen1, sen2..are - значения датчиков, а id робота - для распознавания конкретного робота. После редактирования..... Код, который я использовал для отправки датчиков, был похож.
void TxData(unsigned char tx_data)
{ SBUF = tx_data; //Transmit data that is passed to this function
while(TI == 0); //wait while data is being transmitted
}
а затем отправка значений датчика по одному
TxData(left_whiteline_sensor);
TI=0; // resetting transmit interrupt after each character
TxData(middle_whiteline_sensor);
TI=0;
TxData(right_whiteline_sensor);
TI=0;
TxData(front_sharp_sensor);
TI=0;
В конце ПК читает эти значения в буфере
read(fd, buf1, sizeof(buf1));
.....
options.c_cc[VMIN]=4; // wait till not getting 4 values
Это работало нормально, когда был только один робот, теперь, когда у нас есть несколько роботов, и каждый робот отправляет данные, используя вышеуказанную функцию, я получаю смешанные значения датчиков всех роботов на стороне ПК. Одним из решений является создание структуры, о которой я упоминал выше, и отправка ее на ПК. Это то, что я хочу спросить " Как создать и отправить такую структуру " Извините, что не правильно сформулировал вопрос раньше.
Спасибо...
5 ответов
Посмотрите на RS-485, если это возможно. Он все еще последовательный с точки зрения ПК и поддерживает многоточечное соединение. Я разработал робота, в котором большая часть обработки выполнялась на стороне ПК, а все остальные платы были подключены последовательно к одной шине RS-485.
Последовательный протокол RS232 является точкой2.
Мое решение - использовать архитектуру master/slave.
Почему: чтобы избежать проблем с доступом к каналу связи.
Архитектура: ПК является ведущим и делает запросы своим подчиненным. Сохранения передают информацию только после основного запроса. Сообщение должно иметь как поля, так и данные. Все сообщения транслируются на канал связи.
Я уже реализую это решение и работает отлично.
Похоже, вам нужно создать протокол для связи между ботами и ПК. Это может выглядеть примерно так:
Значение байта Описание 1 0xAA Первый байт синхронизации 2 0x55 Второй байт синхронизации 3 seq Порядковый номер сообщения, приращения для каждого передаваемого нового сообщения 4 1 Тип сообщения (1 = отчет о кодировщике колес) 5 5 Количество следящих байтов данных 6 ID ID бота 7 FL Датчик положения левого переднего колеса 8 FR Датчик положения переднего правого колеса 9 RL Датчик положения заднего левого колеса 10 RR Датчик положения заднего правого колеса 11 CS Контрольная сумма байтов 1 - 10
Теперь, если сообщения отправляются не в дискретных пакетах (например, UDP), а асинхронно через последовательный порт, тогда байты сообщения от разных ботов могут стать смешанными. Вышеуказанный протокол, по крайней мере, проверит целостность полученного сообщения, но вероятность получения действительного сообщения будет уменьшаться по мере того, как увеличивается число ботов, одновременно передающих на ПК.
Метод решения асинхронной проблемы включает в себя внедрение идентификатора бота в каждый передаваемый байт. Если ботов не более 16, то их идентификатор может быть помещен в верхний полубайт передаваемого байта, а 4-битные данные - в нижний полубайт. Затем для отправки одного байта данных потребуется два передаваемых байта: 0x1F + 0x13 = 0x3F от бота #1. Это удвоило бы размер ваших сообщений и потребовало бы кода на принимающей стороне для разделения входящих данных в отдельные очереди приема для каждого бота.
Это своего рода побеждает цель, так как RS-232 не является шиной, то есть у вас нет адресного пространства. вам нужно подключить линию RS-232 к контроллеру, который управляет шиной для ваших двигателей или чего-то еще. и в основном инкапсулировать данные из контроллера в ваше программное обеспечение, работающее на компьютере.
Я не знаю, какой API вы используете с ПК для связи с конечными точками (роботами), но я предполагаю, что при отправке данных вы указываете либо короткий адрес, длинный адрес (MAC), либо какой-либо сокет / идентификатор файла, который вы открыли, используя один из длинных или коротких адресов. Кроме того, я предполагаю, что идентификатор робота совпадает с коротким адресом - в противном случае вам потребуется создать некоторый код для сопоставления между идентификатором робота и коротким адресом. Я также предполагаю, что вы используете что-то вроде select
системный вызов, чтобы дождаться данных от любого из ваших роботов или попытаться прочитать данные от каждого из них.
Если это так, то вы должны иметь возможность создавать конечный автомат для каждого робота, и всякий раз, когда вы получаете данные от этого робота, вы передаете конечному автомату этого робота, который обрабатывает его и генерирует ответ этому роботу (или даже отправляет данные другому конечные автоматы роботов). Конечный автомат будет почти похож на вашу программу с одним роботом, за исключением того, что он будет полагаться на цикл обработки событий, получая для него данные от роботов. Вы также можете захотеть, чтобы цикл событий мог выдавать аварийные сигналы таймера для конечных автоматов. Это похоже на то, как вы написали бы http-сервер, который мог бы обрабатывать несколько клиентов одновременно.
Если я был совершенно неправ в отношении вашего API, и у вас есть те радиомодули zigbee, которые просто действуют как последовательный порт без проводов, то вы в замешательстве, потому что я думаю, что вам придется перенастроить их, чтобы использовать более одной конечной точки на время - и придется изменить API, который вы используете для связи с роботами.