12.07.2009

Ethernet Shield по UDP (2)

В продолжение темы с UDP в Arduino - примеры и новая версия библиотеки.

В новой версии два изменения:

1. Если вы уже успели начать использовать предыдущую версию, то поменяйте обработку значения, возвращаемого ClientUDP::open(). Раньше успехом была единица, в случае неудачи - ноль. Теперь все наоборот ;) Если все успешно - будет ноль, в противном случае - это код ошибки.

Причина такого изменения тривиальна - в оригинальном Client.cpp довольно много мест, где стоит проверка и немедленный "молчаливый" возврат нуля: поди-ка разберись, почему open() "накрылся" - то ли сокетов свободных нет, то ли порт занят. Константы ошибок описаны в ClientUDP.h, быстродействие и размер кода не изменились.

2. Появилась публичная переменная uint16_t _sent, в которой сохраняется число переданных байт.

А вот это из-за специфики класса Print, от которого порожден оригинальный класс Client и мой "плагиатный" ClientUDP. Прототип write возвращает void, и чтобы иметь хоть какой-то шанс понять, отправилась дейтаграмма или нет, можно прочитать после ее вызова значение _sent. Расплата за это - два байта SRAM.

Скачать новую версию с примером (про который далее): ClientUDP_1.1.zip

Итак, для эксперимента надо взять пару Arduino:



...( это оригинальная Diecimila и Freeduino MaxSerial )...

Также понадобится две штуки Ethernet Shield:



...( это оригинальная Ethernet Shield и вариант от NKC Electronics )...

Следующий естественный ;) шаг - соединение их попарно:



...а также - в комплексе:



Платы работают в режиме разделения функций: к первой подключены три кнопки, она является передатчиком. Ко второй подключены светодиоды, и она - соответствено - является приемником. По нажатию или отпусканию кнопки формируется двухбайтовый UDP-пакет (номер кнопки + состояние), который отсылается приемнику. Приемник "декодирует" пакет, зажигая или гася соответствующий светодиод:



В качестве портов, к которым подключены и кнопки, и светодиоды, выбраны digital 7,6,5. Значение порта, ip-адресов и mac-адресов выбрано весьма произвольно, не ищите там скрытого смысла ;)

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

2 комментария:

  1. А есть в ethernet-шилдах автодетекция crossover или прямого кабеля?

    ОтветитьУдалить
  2. Auto MDI/MDIX? Да, поддерживает. Это в спецификациях Wiznet W5100 пробито.

    ОтветитьУдалить