01.02.2013

Ethernet Shield своими руками

Классический Ethernet Shield от Arduino на микросхеме Wiznet W5100 появился одним из первых, перенес уже как минимум три существенных ревизии, а также интегрирован в плату Arduino Ethernet.



Тем не менее, использование W5100 - вовсе не единственный способ добавить немного LAN в ваше устройство на основе Arduino. Давным-давно фирма Microchip выпустила Ethernet-контроллер ENC28J60, который изготавливается не только в SMD-исполнении, но и в DIP-корпусе, что сделало его незаменимым для DIY-любителей. От себя замечу, что это единственный Ethernet-контроллер в DIP-е, который вообще попадал мне в руки.



Если сравнивать W5100 и ENC28J60, сразу же выяснится, что их основная общая черта - способность работать по шине SPI и тем самым экономить пины микроконтроллера для других задач. Но по техническим характеристикам ENC28J60 уступает - он не может пощеголять ни аппаратной поддержкой TCP, ни скоростью 100 Мбит.

Но, быть может, вашему проекту оно и не надо?

Когда говорят о скорости 100 Мбит/с, подразумевают скорость работы физического интерфейса (а не скорость поступления полезных данных, которая всегда меньше). К сожалению, Arduino UNO/Mega работает на тактовой частоте 16 МГц и способен выполнять только 16 000 000 операций в секунду (одна инструкция за такт - на то он и RISC ;). Вероятно, он не справится со сложным потоком медиаданных, зато на обмен небольшими порциями управляющей информации - вполне способен. Скорее всего, вы не почувствуете разницу между 10 и 100 Мбит/с, если будете считывать состояние датчиков или давать управляющие команды. Сетевые интерфейсы, способные работать на 100 Мбит/с, как правило, поддерживают и 10 Мбит/с - если только эта скорость не будет запрещена в конфигурации сетевого устройства принудительно каким-то злым маньяком системным администратором.

Что касается аппаратной поддержки TCP, который обеспечивает гарантированную доставку данных для многих протоколов, включая http, то здесь тоже все относительно просто: микросхема W5100 работает с четырьмя соединениями одновременно, обрабатывая перезапросы; в микросхеме ENC28J60 такой возможности нет (хотя она и поддерживает подсчет контрольной суммы, а также имеет буфер на 8 килобайт). То, что не делается аппаратно - приходится реализовывать программно, хоть и нагружая МК Arduino. Для программиста прикладного уровня (читаем - для рядового Arduino-пользователя типа нас с вами) это решается использованием соответствующей библиотеки, с оглядкой на свободную память микроконтроллера. Опытным путем я установил, что разница по объему скетчей хоть и есть, но не такая драматически большая, как мне показалось с первого взгляда.

Что нужно для того, чтобы состыковать ENC28J60 с Arduino? Да практически тоже самое, что и W5100:
  • схема тактирования (кварц 25 МГц + емкости);
  • питание +3,3В;
  • шина SPI c согласованием уровней логических сигналов  (+5В у Arduino и +3,3В у контроллера Ethernet);
  • развязка с линией (трансформатор, разрядник и резисторы - желательно 1%-ые);
  • внешний "точный" (1%-ый) резистор для работы опорного источника напряжения.
Собственно, все эти компоненты вполне реально существуют в выводном исполнении - так почему бы не воспользоваться? Схемы можно найти в изобилие в интернете, например - вот вариант из Instructables.



Автономные модули и шилд-платы с ENC28J60 в SMD-исполнении давно доступны на EBay и у  прочих интернет-магазинов (в особенности, конечно же, в китайских) - но это всего лишь железо, реализация одной и той же, по сути, схемы. Программная часть наиболее грамотно разрабатывается JeeLabs, можно даже найти инструкции по миграции с EthernetShield на EtherCard (так называется их вариант кита для самостоятельной сборки). Идея же представить набор для самостоятельной сборки по праву принадлежит Open Electronics, а библиотеку можно скачать на GitHub.



Основываясь на этой разработке, свет увидела Freeduino EtherCard R1:




Схема оставлена практически без изменений. Вот несколько моментов, которые их отличают:
  1. Шилд подключается по SPI, но через проходную вилку - таким образом, к нему можно подключить еще один SPI-шилд, например MicroSD shield;
  2. Все резисторы, которые требуют повышенной точности, взяты действительно 1%-ые;
  3. Шилд стыкуется с платой максимально компактно - обратите внимание, что в отличие от оригинала, он полностью "сел" на плату (обратите внимание на разъем USB и край печатной платы шилда, чтобы понять, о чем я говорю);
  4. Бочкообразные электролиты несоразмерной емкости 470 мкФ заменены на низкопрофильные.
Купить шилд в собранном виде или в виде kit-а можно здесь, пошаговая инструкция по сборке доступна здесь.

При использовании библиотеки, не забывайте в инициализации ether.begin дописывать третий параметр - номер пина, к которому подключено разрешение работы. Библиотека по умолчанию предполагает D8, но в этом шилде - D10

Возьмите прилагающийся к библиотеке пример testDHCP и найдите строчки:

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");

Впишите номер пина в конце следующим образом:

  if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) 
    Serial.println( "Failed to access Ethernet controller");

И все тут же заработает (при наличии подключенной сетки с DHCP-сервером, конечно же ;)