Радиолоцман Электроника en
расширенный поиск +
  
Срез:Микроконтроллеры

11-05-2009

Ethernet - устройство на микроконтроллере AVR

Microchip » ENC28J60

Теория:

Ethernet традиционно был довольно таки сложным интерфейсом. Все Ethernet чипы имели до сегодняшнего дня 100 и более контактов, их было тяжело найти в маленьких количествах и ими было тяжело управлять с помощью маленького микроконтроллера с небольшим количеством памяти. Компания Microchip изменила мир с появлением их нового Ethernet чипа - ENC28J60.

ENC28J60 это небольшой чип всего с 28 контактами, он имеет интерфейс SPI, который легко использовать с любого микроконтроллера.

Это открывает целый мир совершенно новых прикладных задач. Вы можете легко создавать небольшие устройства, которые могут распространиться на все в доме и просто будут подключены в сеть Ethernet. Вы более не должны разделять последовательные подключения или другие шины. Все может быть легко подключено через Ethernet. Расстояние больше не ограничивающий фактор. Даже WIFI соединения возможны, так как вы можете подключить устройства к беспроводному мосту.

Все детали можно заказать здесь shop.tuxgraphics.org. Программное обеспечение и схемы свободно доступны (Лицензия GPL V2).

Ethernet –устройство на микроконтроллере AVR

ENC28J60 Ethernet контроллер. Вводный курс

Чип ENC28J60 от компании Microchip это сказочный чип. Он включает протокол приема/передачи данных, MAC адрес, и протокол физического уровня в одном чипе. К нему подключаются несколько внешних элементов, в основном это кварцевый резонатор и Ethernet трансформатор, так же известный как магнит. Внешне он представляет из себя 28 – выводный чип в DIP корпусе, легко паяется и идеально подходит для применения в хобби.


Рисунок 1: Структурная схема подключения ENC28J60

Микроконтроллер таким образом может управлять любым вашим устройством: Вы можете подключить какие либо датчики (фото, тепловые), вы можете что ни будь включать и выключать, можете подключить LCD дисплей и т.п.

План действий

В этой первой статье мы создадим устройство с множеством интерфейсов ввода/вывода и входами аналого-цифрового преобразователя (АЦП). Однако мы будем управлять только небольшим реле, чтобы включать и выключать что ни будь. В последующих статьях мы сможем таким образом использовать это же устройство для более сложных вещей.

Основная цель статьи – показать схему подключения и объяснить программу. Мы будем использовать протокол UDP для посылки команд микроконтроллеру. Эти команды и будут причиной того, что микроконтроллер будет включать или выключать реле.

Я думаю, вполне возможно осуществить даже протокол TCP. Размер программы, реализующей UDP в данном устройстве – менее 3х килобайт, это меньше половины памяти контроллера Atmega88. TCP позволит нам управлять устройством через web браузер. Я пока что это не испытывал.

Схема

Здесь представлена схема. Большая ее часть стандартная для ENC28J60. Важно правильно соблюсти полярность светодиода LED-B, так как он определяет дуплексный процесс в чипе. Устройства, работающие в режиме полу-дуплекса способны обрабатывать только небольшой трафик.

Рисунок 2: Принципиальная схема устройства. (кликните на изображение, чтобы получить pdf версию, пригодную для печати).

Принципиальную схему предыдущей версии устройства вы найдете в секции загрузки. Реле подключается к разъему CONN3. Заметьте, диод D1 не бесполезен и не включен в неправильном направлении, даже если с виду кажется таковым. Он здесь для тех, кто планирует подключить к схеме небольшое реле с рабочим напряжением 6 вольт. Диод защищает целую схему от очень высокого напряжения, которое может быть вызвано катушкой реле.

Если вы используете реле с большой катушкой, вы должны также добавить резистор параллельно реле (1 или 2,2 кОм). Диод имеет конечное время отклика, и резистор предотвратит слишком быстрый рост напряжения, прежде чес диод срежет его.

Если вы планируете использовать нестабилизированный источник питания напряжением 9 вольт и более, в комбинации с 6-ти вольтовым реле, подключенном к разъему CONN3, вы можете добавить небольшой резистор (около 33 Ом, подберите экспериментально) последовательно к реле, чтобы компенсировать избыток напряжения.

Разъемы, на схеме названные IO-port и Analog-IN сейчас не используются. Они предназначены для будущей функциональности, которая будет описана в последующих статьях. В этом проекте мы используем только разъем CONN3.

Ethernet требует довольно больших токов, потому как работает с достаточно длинными кабелями. Вышеописанная схема потребляет около 200 миллиампер при 3,3 вольтах. Микросхема стабилизатора LM2937-33 требует таким образом охлаждения, если питающее напряжение более 5 вольт. Небольшого алюминиевого радиатора будет вполне достаточно.

Ethernet трансформаторы и фильтры

Микросхеме ENC28J60 требуется трансформатор с соотношением витков 1:1, аттестованный для 10base-T. Существует несколько видов очень хороших RJ45 разъемов, называемых «Magjack», которые имеют интегрированный трансформатор и дополнительные светодиоды. В дополнение вам нужна небольшая фильтрующая катушка (на схеме L1). 5-ти миллиметровое ферритовое кольцо с 5-7 витками тонкой проволоки подойдет.

Обновления устройства в 2007 году

В первом квартале 2007 года я переделал устройство, принимая во внимание следующие пункты:

1. Диод D1 был неправильно подключен к общему проводу GND вместо Vdd. Интересно, что никто не заметил этого недостатка. Неправильно подключенный диод защищал транзистор от переполюсовки, но не защищал против пиков напряжения, создаваемых катушкой реле. Однако, если вы последуете моим рекомендациям и подключите дополнительный резистор параллельно катушке, после размыкания цепи ток катушки будет течь через него и схема таким образом будет защищена.

2. Микросхема ENC28J60 имеет выход тактовой частоты. Сначала я хотел использовать его, но возникла проблема с прерыванием тактовых сигналов при перезапуске, что приводило к неправильной работе AVR микроконтроллера. Я связывался со службой технической поддержки фирмы Microchip, но они не поняли проблемы. Может быть PIC контроллеры фирмы Microchip менее чувствительны к непостоянным тактовым сигналам. В конечном счете я вычислил, что это работает если я не использую перезапуск и аппаратными и программными средствами во время инициализации чипа. Сейчас я использую только программный перезапуск и это работает хорошо. Микросхема ENC28J60 вырабатывает тактовый сигнал частотой 12,5 мегагерц. Это дает небольшое увеличение скорости по сравнению со встроенным в atmega88 тактовым генератором частотой 8 мегагерц. Фирма Atmel предписывает, atmega88 может работать на тактовых частотах 0-20 мегагерц при напряжении питания 4,5-5,5 вольт или 0-10 мегагерц при напряжении 2,7-5,5 вольт. Исходя из этого мы должны использовать максимальную тактовую частоту не более 10 мегагерц. Теоретически для нашего случая максимально допустимая тактовая частота будет где то между 10 и 20 мегагерц. Мои тесты показали, что при 3,3 вольтах на тактовой частоте 12,5 мегагерц устройство работает стабильно и надежно.

Если вы уже собрали предыдущую схему, не беспокойтесь. При разработке новой программы я учел особенности старого устройства. Таким образом: новое устройство не будет работать со старой программой, но старое устройство будет работать с новой программой. Для старого устройства не требуется ничего переделывать. Никогда ничего не меняйте в работающем устройстве! Для тех, кто желает взглянуть на схему старого устройства от 2006 года есть секция загрузки.

Шаг за Шагом. Сборка и тестирование.

Проблема всех устройств на микроконтроллерах в том, что их невозможно собрать с первого раза. Обычно, устройство отказывается работать по ряду причин, и тогда возникает главный вопрос – где здесь ошибки. Ошибки обычно попадаются и в аппаратной и в программной части. Вы имеете преимущество используя надежную основу. Вы знаете, что, по крайней мере эта программа работает и схема не содержит ошибок, так как вы основываетесь на моей разработке. Несмотря на это, все же имеет смысл собирать устройство по шагам и тестировать после каждого шага. Таким образом вы можете сузить область возможных ошибок.

Шаг первый:

Припаяйте микросхему LM2937-33 и необходимые конденсаторы к схеме. Разъем питания (на схеме обозначен как RawDC-In) к лабораторному источнику питания напряжением 5 вольт, и используя вольтметр, проверьте напряжение на выходе стабилизатора, должно быть 3,3 вольта. Теперь возьмите маленькую лампочку на 3,5 вольт от карманного фонаря или на 6 вольт от велосипеда и подключите ее к выходу стабилизатора. Проверьте напряжение, оно должно остаться равным 3,3 вольтам, даже при нагрузке.

Шаг второй:

Впаяйте микросхему ENC28J60, разъем «magjack» и все остальные детали кроме контроллера Atmega88. Снова подключите схему к лабораторному источнику в 5 вольт, ограничив максимальный ток в 300 миллиампер. На выходе стабилизатора вы должны опять получить 3,3 вольта. Теперь подключите Ethernet кабель от вашего сетевого концентратора (будь то Switch или Hub) к устройству. Зеленый светодиод на разъеме «Magjack» должен засветиться. Также должен засветиться светодиод, обозначенный как «link» на вашем концентраторе.

Ethernet использует протокол автоматической проверки целостности линии. Зеленый светодиод показывает, что проверка данной линии проходит успешно.

Шаг третий:

Припаяйте контроллер Atmega88 к плате. Подключите питание. Распакуйте файл eth_rem_dev-1.X (загрузить можно в конце статьи) и запустите команду "make test0.hex" из под шелла (ОС Unix или Linux). Эта команда скомпилирует файл test0.hex. загрузите этот файл в микроконтроллер (командой "avrdude -p m88 -c avrusb500 -e -U flash:w:text0.hex" или изменив аргумент команды «make»: "make load_test0"). Если у вас есть один из программаторов то tuxgraphics, вы можете просто напечатать "make load_test1" в Linux. Заметьте, что Atmega88 требует как минимум avr-glibc-1.4.X.

После этого красный светодиод замигает с частотой приблизительно 1 герц.

Сейчас все компоненты схемы уже проверены и будет очень хорошо, если устройство заработает с конечными программами. Во время разработки я использовал еще несколько программ для тестирования, которые включил в пакет eth_rem_dev-1.X.

* Тест 1: Позволит вам пинговать устройство по сети.
* Тест 2: Посылка и получение строки.

Все они описаны подробнее в файле README пакета eth_rem_dev-1.X. вы также можете использовать их как образцы программ для собственных разработок.

Последний шаг:

Отредактируйте файл main.c и измените 2 строчки:

static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};

static uint8_t myip[4] = {10,0,0,24};

для первого устройства, что вы соберете, вам не требуется менять параметр mymac. Но вам вероятно потребуется изменить IP адрес (параметр myip). Это должен быть свободный адрес из диапазона адресов вашей сети.

Здесь представлен диапазон частных IP адресов (не маршрутизируемых в интернете), которые вы можете использовать:

Маска подсети Сетевые адреса

255.0.0.0 10.0.0.0 - 10.255.255.255

255.255.0.0 172.16.0.0 - 172.31.255.255

255.255.255.0 192.168.0.0 - 192.168.255.255

Например: ваш WIFI маршрутизатор может иметь IP адрес 192.168.1.1, ваш компьютер может иметь адрес 192.168.1.12. это означает, что вы можете использовать адрес 192.168.1.10 и оставить некоторый диапазон адресов для других компьютеров в сети. Если вы используете в сети протокол DHCP, проверьте, чтобы этот адрес не дублировался в сети (исключите его из диапазона DHCP).

Теперь скомпилируйте программу командой "make", загрузите файл eth_rem_dev.hex в микроконтроллер пошлите устройству ваш первый пинг из шелла.

ping IP адрес вашего устройства(что вы назначили).

Вы должны получить ответ с 0% потерянных пактов (остановите команду нажав crtl-c).

Использование пакета eth_rem_dev чтобы включать и выключать что либо

Единственная полезная функция, реализованная в коде микроконтроллера – включение и выключение транзистора, подключенного к контакту PD7 (разъем CONN3). Остальная функциональность придет позднее.

Я написал небольшую программу – udpcom, которая посылает строку символов по протоколу UDP и ждет ответную строку. Udpcom также включен в пакет eth_rem_dev-1.X. эта программа очень маленькая и может быть перенесена на множество операционных систем с небольшими изменениями. Если вы переписали код программы под другую операционную систему, которая еще не поддерживается, пришлите мне код и я помещу его в следующий релиз.

Чтобы скомпилировать программу udpcom войдите в каталог eth_rem_dev-1.X/udpcom и скомпилируйте правильную версию программы из соответствующего подкаталога командой "make".

Команда включения реле: t=1

Команда выключения реле: t=0

Запрос состояния реле: t=?

Синтаксис команды udpcom: udpcom пароль, X=Y, IP адрес

Пароль, установленный по умолчанию в пакете eth_rem_dev-1.X - "secret". Вы можете изменить его в том же самом файле main.c, в котором вы изменяли IP адрес.

Вот пример:

./udpcom/unix/udpcom secret,t=1 10.0.0.24

II: data: secret,t=1, ip: 10.0.0.24 port: 1200

OK: 10.0.0.24: t=1

Сейчас транзистор, подключенный к выводу PD7 должен быть включен и, если вы подключили реле к этому транзистору, реле должно быть также включено.

./udpcom/unix/udpcom secret,t=? 10.0.0.24

II: data: secret,t=?, ip: 10.0.0.24 port: 1200

OK: 10.0.0.24: t=1

Здесь мы запросили состояние устройства, ответ "OK: 10.0.0.24: t=1" означает, что транзистор включен.

./udpcom/unix/udpcom secret,t=0 10.0.0.24

II: data: secret,t=0, ip: 10.0.0.24 port: 1200

OK: 10.0.0.24: t=0

Теперь транзистор, подключенный к выводу PD7 должен быть снова выключен.

Готовое к сборке Ethernet устройство удаленного переключения

Вот две фотографии устройства, которое я собрал.

Вид спереди с открытым корпусом: видно два светодиода вверху разъема «Magjack» и три дополнительных. Зеленый показывает что питание включено, красный загорается когда обрабатывается пакет UDP, желтый показывает текущее состояние реле (включено или выключено). Разъемы сзади это питание и выход реле. Слева, накрытий куском белого пластика, размещен блок питания на 9 вольт.

Вид сверху с открытым корпусом: видно небольшую Ethernet плату с микроконтроллером справа, слева (обособлены и практически не видны) реле и блок питания. Микросхема LM2937 прикреплена одним винтом к серой алюминиевой передней панели. Боковые стенки выполнены из дерева, верхняя и нижняя крышки из пластика.

Структура программ

Прежде чем мы рассмотрим программу для микроконтроллера, мы должны изучить как работает программирование сетевых сокетов в Linux. В нашем устройстве мы можем создать (и создаем) каждый бит кадра Ethernet. В Linux (или в любой порядочной ОС) мы работаем в более цивилизованной среде и не можем делать все, что захотим.

Каждый хост (любое, подключенное к сети устройство, которое имеет IP адрес, будь то компьютер, роутер и т.п.) имеет один Ethernet адрес (MAC адрес) на интерфейс и один или несколько IP адресов на интерфейс. Эти MAC адреса уникальны во всем мире, это сделано для того, чтобы упростить установку сетевых устройств. В нашем случае MAC адреса должны быть уникальны хотя бы в пределах локальной сети, это: Персональные компьютеры, маршрутизатор, WIFI роутер и маршрутизатор Интернет провайдера. МАС адреса всех этих устройств должны быть уникальны.

Сетевые программы разделены по номерам портов. Не может быть двух активных номеров портов одновременно. Например, вы не можете иметь на одном компьютере два web сервера, одновременно работающих на 80 порту. Когда вы посылаете в сеть пакет данных, локальный номер порта выделяется случайным образом и данные посылаются к удаленному IP адресу и заданному номеру порта (например, 80=http).

Если в системе запущен процесс приложения, прослушивающий порт с номером X локально (сервер), вы не можете запустить другое приложение, посылающее данные на это порт. Однако одно и то же приложение может и посылать, и принамать данные с одного и того же порта.

Порты с номерами, меньшими 1024 зарезервированы. Используем порт с номером 1200.

Сетевой интерфейс компьютера Ethernet AVR устройство

MAC1,IP1 src.port=34256 --> MAC2, IP2 dest.port=1200

ответ:

MAC1,IP1 dest.port=34256 <-- MAC2, IP2 src.port=something(e.g 1200)

UDP не надежный?? На самом деле это не так. Локальной сети почти все пакеты доходят без потерь, если нет проблем с конфигурацией дуплексного режима в сетевых устройствах. Но это уже другая проблема и она должна быть устранена как можно быстрее. Процент утерянных пакетов в локальной не перегруженной сети ниже чем определено в 10EE-9 иными словами 1 на 100 000 000. При нормальной загрузке сети Linux непрерывно каждый день в течении 24 часов, это менее чем 1 пакет в месяц.

UDP очень надежен в локальной сети и это значит, что мы должны иметь возможность послать команду повторно не причиняя вреда. Мы не должны реализовывать устройство, переключаемое одной командой, одна команда должна использоваться для включения, а другая для выключения. Если послать команду повторно (в случае потери), это не вызовет изменений.

Ниже я перечислил файлы с исходными кодами программы микроконтроллера, которые вы можете легко изменить для своих нужд.

main.c – все исполнение начинается здесь. Здесь запускается вся инициализация, здесь также реализован главный цикл.

enc28j60.c, enc28j60.h -- описание аппаратных особенностей микросхемы

enc28j60.

net.h – сетевые константы, позиции отдельных байт, заголовки

ip_arp_udp.c, ip_arp_udp.h – функции стека протоколов IP, ARP, ICMP и UDP

traffic.txt – полностью раскодированные сетевые сообщения, взятые с помощью сетевого анализатора. Это упрощает понимание того, что происходит в коде.

Фильтры

Как вы можете себе представить, проблема в том, что Ethernet может передавать гораздо больше данных, чем маленький микроконтроллер может обработать через последовательный SPI интерфейс, даже если бы этот интерфейс работал с тактовой частотой в несколько мегагерц. В каждом Ethernet контроллере имеется буфер, но он быстро заполнился бы мусором в шумной сети Windows. Микросхема ENC28J60 в связи с этим имеет фильтры.

Нужный нам трафик это: UDP трафик предназначенный для нашего MAC адреса, кроме того, мы обрабатываем пакеты IP/ICMP для нашего MAC, когда происходит пинг нашего устройства и ARP пакеты к нашему MAC или широковещательные. IP сеть невозможна без ARP. (*новый абзац, чтобы не было путаницы).

Все широковещательные IP пакеты должны быть проигнорированы. Микросхема ENC28J60 имеет множество простых фильтров, которые мы будем использовать для этого. Это фильтр одноадресной передачи (пропускает только пакеты, предназначенные для нашего МАС адреса). Из других пакетов нам нужны только широковещательные ARP пакеты. Это пакетный фильтр, мы запрограммируем его на МАС адрес назначения MAC=FF:FF:FF:FF:FF:FF (широковещательный) и тип Ethernet данных content-type=ARP. Это происходит во время инициализации и реализовано в файле enc28j60.c.

Заключение

Это маленькое Ethernet устройство открывает совершенно новый мир фантастических применений. Оно маленькое, простое в сборке и имеет бесконечные возможности использования.

Связь быстрая, нет задержки между посылкой команды и ответом. Это сильно отличается от стандартной скорости в 9600 бод, используемой в большинстве случаев для связи с микроконтроллерами.

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

Замечания по безопасности

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

Загрузки и ссылки

  • Страница загрузок для данной статьи: программы the eth_rem_dev, схемы, обновленное ПО.
  • ЛинуксФокус, «домашняя сеть, глоссарий и общий обзор», данные 6-ти летней давности, но большинство актуально до сих пор. Это введение в основы сети.
  • Здесь хранится подсказка, что я получил от посетителя: замена микросхемы стабилизатора LM2937-33 на другой стабилизатор, позволяющий использовать источник питания напряжением до 30 вольт, без специального охлаждения: (DE-SW033, ключевой регулятор напряжения).

На английском языке: An AVR Microcontroller Based Ethernet Device

Перевод: по заказу РадиоЛоцман

    ENC28J60 на РадиоЛоцман.Цены — от 110 до 322 руб.
    ETHERNET CONTROLLER W/SPI, 28SOIC; Ethernet Type:IEEE802.3; Interface Type:SPI; Current, Supply:180mA; Voltage, Supply Min:3.1V; Voltage, Supply Max:3.6V; Termination Type:SMD; Case Style:SOIC; Pins,...
    Цены на ENC28J60
    ПоставщикПроизводительНаименованиеЦена
    КонтестENC28J60/SS110 руб.
    ЭлитанMicrochipENC28J60-I/SO121 руб.
    КимMicrochipENC28J60-I/SO322 руб.
    ТаймЧипсMicrochipENC28J60MLпо запросу
    Океан ЭлектроникиMicrochipENC28J60T-C/SSпо запросу
    Все 24 предложений от 18 поставщиков »
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • Интересная и полезная конструкция и статья. Но с настройкой немного сложно (для меня).
  • Добрый день! Огромное спасибо за статью, интересное устройство. Не могу пока справиться с такой задачей. При пинге теряются пакеты. Если пакеты длиной 1-4 байта проходят 100%, то для 32 байт 10 - 20% потерь. 1024 вообще пропихнуть не смог. Отличие от приведенной схемы в том, что я использовал трансформаторную сборку+конденсатор для 10т, а не магджек. Пока причины не нашел, то ли провода от разъема (~5 см) навивают помехи, то ли катушку L1 изготовил не правильно. Подскажите, пожалуйста, как искать. Спасибо!
  • вероятно проблема в буфере приёма, слишком мал для 1024 байт
  • Вероятно вы нашли тему шестилетней давности , где парни изобретали роутер с трансформаторной развязкой !
  • Не перевелись еще некроманты в степях интернета :)
Рекомендуемые публикации по теме:
Форум  »
Обсуждение: Самоучитель разработчика устройств на микроконтроллерах AVR (+ CD-ROM)
Книги  »
10 практических устройств на AVR-микроконтроллерах. Книга 1 (+ CD-ROM)
Книги  »
10 практических устройств на AVR-микроконтроллерах. Книга 3 (+ CD-ROM)
Книги  »
Разработка устройств на микроконтроллерах AVR (+ CD-ROM)
Схемы  »
Бесконтактный тахометр на микроконтроллере AVR. Часть 2. Программное обеспечение для микроконтроллера

При перепечатке материалов с сайта прямая ссылка на РадиоЛоцман обязательна.

Приглашаем авторов статей и переводов к публикации материалов на страницах сайта.

Срезы ↓
радиолоцман вконтакте радиолоцман одноклассники радиолоцман facebook радиолоцман twitter радиолоцман google плюс