Как управлять несколькими роботами через ПК, используя последовательную связь? - PullRequest
1 голос
/ 10 сентября 2010

Я хочу управлять несколькими роботами, используя мой ноутбук .Роботы не обладают интеллектом, они отправляют значения датчиков на ПК, который вычисляет значения датчиков и отправляет результаты обратно роботам. (Централизованное управление роботами с помощью ПК).

Роботы общаются с ПК через последовательную связь с использованием Zigbeemudule.

Проблема: Как создать и отправить структуру (из робота) как {sen1, sen2, sen3 .., id робота} где sen1, sen2 ..значения датчиков и идентификатор робота для распознавания конкретного робота.После редактирования ..... Код, который я использовал для отправки датчиков, был похож на

 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 ]

1 голос
/ 05 октября 2010

Посмотрите на RS-485, если это возможно. Он все еще последовательный с точки зрения ПК и поддерживает многоточечное соединение. Я разработал робота, в котором большая часть обработки выполнялась на стороне ПК, а все остальные платы были соединены последовательно в одну шину RS-485.

0 голосов
/ 20 ноября 2010

Последовательный протокол RS232 - это точка2.

Мое решение - использовать архитектуру master / slave.

Почему: Во избежание проблем с доступом к каналу связи.

Архитектура: ПК является хозяином и делает запросы к своим рабам. Сохранения передают информацию только после основного запроса. Сообщение должно иметь как поля, так и данные. Все сообщения передаются на канал связи.

Я уже реализую это решение и отлично работает.

0 голосов
/ 11 сентября 2010

Это своего рода побеждает цель, поскольку RS-232 не является шиной, то есть у вас нет адресного пространства.вам необходимо подключить линию RS-232 к контроллеру, который управляет шиной для ваших двигателей или чего-то еще.и в основном инкапсулирует данные из контроллера в ваше программное обеспечение, работающее на компьютере.

0 голосов
/ 01 октября 2010

Похоже, вам нужно создать протокол для связи между ботами и ПК.Это может выглядеть примерно так:

Byte   Value  Description
 1     0xAA   First sync byte
 2     0x55   Second sync byte
 3     seq    Message sequence number, increments for each new message transmitted
 4     1      Message type (1 = Wheel encoder report)
 5     5      Number of data bytes to follow
 6     ID     Bot ID
 7     FL     Front left wheel encoder
 8     FR     Front right wheel encoder
 9     RL     Rear left wheel encoder
 10    RR     Rear right wheel encoder
 11    CS     Checksum of bytes 1 - 10

Теперь, если сообщения отправляются не в дискретных пакетах (например, UDP), а асинхронно через последовательный порт, то байты сообщения от разных ботов могут стать смешанными.Вышеприведенный протокол, по крайней мере, проверит целостность полученного сообщения, но вероятность получения действительного сообщения будет уменьшаться по мере увеличения числа ботов, одновременно передающих данные на ПК.

Метод решения асинхронной проблемы включаетвстраивание идентификатора бота в каждый передаваемый байт.Если ботов не более 16, то их идентификатор может быть помещен в верхний полубайт передаваемого байта, а 4-битные данные - в нижний полубайт.Затем для отправки одного байта данных потребуется два передаваемых байта: 0x1F + 0x13 = 0x3F от бота # 1.Это удвоило бы размер ваших сообщений и потребовало бы кода на принимающей стороне для распределения входящих данных в отдельные очереди приема для каждого бота.

0 голосов
/ 10 сентября 2010

Я не знаю, какой API вы используете с ПК для связи с конечными точками (роботами), но я предполагаю, что при отправке данных вы указываете либо короткий адрес, либо длинный адрес (MAC), либо некоторый идентификатор сокета / файла, который вы открыли, используя один из длинных или коротких адресов. Кроме того, я предполагаю, что идентификатор робота совпадает с коротким адресом - в противном случае вам потребуется создать некоторый код для сопоставления между идентификатором робота и коротким адресом. Я также предполагаю, что вы либо используете что-то вроде системного вызова select для ожидания данных от любого из ваших роботов, либо пытаетесь прочитать данные от каждого из них.

Если это так, то вы должны иметь возможность создавать конечный автомат для каждого робота, и всякий раз, когда вы получаете данные от этого робота, вы передаете конечному автомату этого робота, который его обрабатывает, и генерирует ответ этому роботу (или даже отправляет данные). к машинам других роботов). Конечный автомат будет почти похож на вашу программу с одним роботом, за исключением того, что он будет опираться на цикл обработки событий, получая для него данные от роботов. Вы также можете захотеть, чтобы цикл событий мог выдавать аварийные сигналы таймера для конечных автоматов. Это похоже на то, как вы пишете http-сервер, который может одновременно обрабатывать несколько клиентов.

Если я был совершенно не прав относительно вашего API, и у вас есть те радиомодули zigbee, которые просто действуют как последовательный порт без проводов, то вы в беспорядке, потому что я думаю, что вам придется перенастроить их, чтобы использовать более одного конечная точка за один раз - и ей придется изменить API, который вы используете для связи с роботами.

...