Как управлять несколькими роботами через ПК, используя последовательную связь?

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

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

Проблема: Как создать и отправить структуру (от робота) например, {sen1, sen2, sen3.., идентификатор робота, где 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 

Это отлично работало, когда был только один робот, теперь, когда у нас есть несколько роботов, и каждый робот отправляет данные, используя вышеуказанную функцию, я получение смешанных значений датчиков всех роботов на стороне ПК. Одним из решений является создание структуры, о которой я упоминал выше, и отправка ее на ПК. Это то, что я хочу спросить "Как сделать и отправить такую ​​структуру" Извините, что не правильно сформулировал вопрос раньше.

Спасибо...


person Dinesh    schedule 10.09.2010    source источник
comment
ERm... в чем именно заключается ваш вопрос? Кроме того, это домашнее задание?   -  person Goz    schedule 10.09.2010
comment
Вам придется уточнить свой вопрос лучше. Вам нужна помощь с использованием последовательного порта в C? Сериализация данных? Разговариваете со своим стеком zigbee? Программировать роботов? Строить скайнет?   -  person nmichaels    schedule 10.09.2010
comment
Да что именно ты спрашиваешь?   -  person Joshua Evensen    schedule 10.09.2010


Ответы (5)


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

person Padu Merloti    schedule 05.10.2010

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

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

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

person nategoose    schedule 10.09.2010

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

person polemon    schedule 11.09.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, то их ID можно поместить в старший полубайт передаваемого байта, а 4 бита данных — в младший. Тогда для отправки одного байта данных потребуется два байта передачи: 0x1F + 0x13 = 0x3F от бота №1. Это удвоит размер ваших сообщений и потребует кода на принимающей стороне для разделения входящих данных на отдельные очереди приема для каждого бота.

person jholl    schedule 01.10.2010

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

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

Зачем: Чтобы избежать проблем с доступом к каналу связи.

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

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

person Gustavo Corrente    schedule 20.11.2010