В каком месте кода происходит подключение?

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013
#include <EtherCard.h>
static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
byte Ethernet::buffer[700];
 
void setup () {
 
  Serial.begin(57600);
  Serial.println("DHCP Demo");
 
  if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "Failed to access Ethernet controller");
 else
   Serial.println("Ethernet controller initialized");
 
  if (!ether.dhcpSetup())
    Serial.println("Failed to get configuration from DHCP");
  else
    Serial.println("DHCP configuration done");
 
  ether.printIp("IP Address:\t", ether.myip);
  ether.printIp("Netmask:\t", ether.mymask);
  ether.printIp("Gateway:\t", ether.gwip);
}
 
void loop() {
 
  ether.packetLoop(ether.packetReceive());
}

Люди добрые, подскажите, в каком месте когда происходит какраз таки соединение с Ethernet и получение IP адреса. Нужна ли здесь задержка?

leshak
Offline
Зарегистрирован: 29.09.2011

>соединение с Ethernet

Неведомый термин.

>получение IP адреса. 

строка 15

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

leshak пишет:

>соединение с Ethernet

Неведомый термин.

>получение IP адреса. 

строка 15

 

меня вот это ЕСЛИ и смущает. Если нет IP то отправляем в сериал ерор....., а конкретно Тут подключение, и нету...

leshak
Offline
Зарегистрирован: 29.09.2011

А давайте вы определитесь что вы понимаете под "подключением"?

Если строго, то "подключение" у вас происходит когда вы кабель втыкнули в шилд. Вы его подключили. Дальше вы можете посылать запросы сами и "слушать" запросы которые приходят по кабелю.

 

leshak
Offline
Зарегистрирован: 29.09.2011

ingener.solovyev пишет:

меня вот это ЕСЛИ и смущает. 

А вы не смущайтесь - это нормальная логика работы. Попытались получить IP-шник. Получилось - хорошо, не получилось - сообщили об этом. Что в этом "смущательного"?

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

leshak пишет:

ingener.solovyev пишет:

меня вот это ЕСЛИ и смущает. 

А вы не смущайтесь - это нормальная логика работы. Попытались получить IP-шник. Получилось - хорошо, не получилось - сообщили об этом. Что в этом "смущательного"?

тогда совсем идиотский вопрос, как в этой конструкции сделать проверку на получение ip и переподключение в случае его утери?

leshak
Offline
Зарегистрирован: 29.09.2011

>тогда совсем идиотский вопрос, как в этой конструкции сделать проверку на получение ip

Ну так строка же 15-ть. Получение IP-шника и проверка получили или нет. Фунция ether.dhcpSetup() - получает IP-шник. Если получила - вернула true, если не вышло получить - вернула false (роутер обесточен, нес dhcp сервера, мыши кабель перегрызли)

> и переподключение в случае его утери

Как вы можете его "утерять"? IP-шник это четыре циферки. dhcpSetup получила их и сохранила в ether.myip . Все "утерить вы их можете только если сами перезапишите его или вырубится питание контроллера. Но тогда при старте опять вызовется dhcpSetup и получит его заново.

Я вам опять говорю "А давайте вы определитесь что вы понимаете под "подключением"?"

Вы себе придумали какое-то соединение/подключение и пытаетесь найти то чего нет. Нет у вас никакого "соединения". Вся логика идет по принципу "запрос-ответ". Представте что вы в самолете. Подлетаете к аэродрому. Спрашивается диспетчера "я борт такой-то" (сообщили свой MAC адресс), дайте мне позывной на сегодня. Диспетчер вам отвечает "ваш позывной будет 192.168.1.5".  Вы запоминаете его. В дальшейшем все переговоры которые вы ведете (с диспетчером, с другими службами)- вы используете этот позывной.   Диспетчер тоже, на какое-то время "Запоминает" что вот этом MAC-адресу, соотвествует вот 192.168.1.5 (в первую очередь что-бы не отдать этот позвывной кому-то другому).

Если вы используете статичный адрес... значит вы просто не делаете никаких запросов "дай мне позывной". Сами себе его назначили и пользуетесь (но соотвественно никто не гарантирует что этим же позывным кроме вас никто в сети не пользуется).

Но еще раз. Никакого соединения - нет. Хотите что-то спросить сообщить. Нажали тангетку - послали сообщение в эфир. И слушаете ждете ответ. Между этитими действиями - нет никакого "постоянонго включения".

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

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

leshak
Offline
Зарегистрирован: 29.09.2011

1001 и одна причина. От проблем в сети (какой-то девайс флудит), сам ваш скетч бажный и зависает, библиотека бажная (и таки это да), проблемы с питанием, не подтянут reset к питанию (нужно подтянуть несмотря на то что в даташите сказано что он уже подтянут)

Как его заребутить?  Ну вот тем самым Reset (после чего скорее всего опять потребуется ether.begin и все что дальше).

Или читать даташит вдумчиво и искать команду ребута, или гуглить "enc28j60 reset" что быстро выводит на Подключение микроконтроллера к локальной сети: работаем с ENC28J60 / Связь железа с компьютером. / Сообщество EasyElectronics.ru

Или взять и заглянуть, а вдруг это уже реализовали в библиотеке. Так как с докуметацией на нее не очень складно, то смотреть заголовочные файл

enc28j60.h 

где можно увидеть парочку интересных функций

  static void powerDown();  // contrib by Alex M.
  static void powerUp();    // contrib by Alex M.
  

Что они делают - неведомо, но по названию "можно заподозрить".

Еще "обещающе" выглядит функция isLinkUp(). Хотя можно и самому пинговать какой-нибудь сервер (тот же роутер), что-бы точно знать есть связь или нет.

А вообще IMHO ресетить - это плохой способ борьбы с потерей связи. Правильнее - искать причину. Не претендую на статистическую достоверность, но моя статистика говорит что в 80% прична нестабильной его работы  - плохое питание 3.3V .  Далеко не всегда хватает того что дает туда дуина. Так что я бы рекомендовал начать с того что-бы сделать ему отдельный регулятор на 3.3V и запитать от внешнего блока питания дуину (вообщем если вы погуглите форум на тему enc28j60 то увидите что этот совет я даю чуть более чем регулярно).

Потом бы на пин Reset обратил внимание. Убедился что подтянут к питанию и не ловит помехи из эфира.

Ну а потом... уже пытался решать как выяснять есть ли связь (пинговать что-то внешнее, isLinkUp()) и в случае пропажи - ресетить (через пин reset(), дерграя ему питнание, командой как в статье по линку и т.п.)

 

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Спасибо! Буду изучать, направление дали.

leshak
Offline
Зарегистрирован: 29.09.2011

ingener.solovyev пишет:

Спасибо! Буду изучать, направление дали.

В первую очередь начните с питания. На некотрые дуины на 3v пин нормально могут подать не более 50ma, а enc28j60 - относительно прожористый, может не хватать ему. Поэтому - отдельный регулятор вешать (я брал с 5v пина и понижает до 3.3v). Если не помогло - убедится что на 5v пине достаточное напряжение. Если там маловато (могут быть проблемы с USB и т.п.), то попробовать сами дуину запитать через внешний разъем питания.

Вообщем "сначала питание, а потом  воспитание" :)

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

leshak пишет:

ingener.solovyev пишет:

Спасибо! Буду изучать, направление дали.

В первую очередь начните с питания. На некотрые дуины на 3v пин нормально могут подать не более 50ma, а enc28j60 - относительно прожористый, может не хватать ему. Поэтому - отдельный регулятор вешать (я брал с 5v пина и понижает до 3.3v). Если не помогло - убедится что на 5v пине достаточное напряжение. Если там маловато (могут быть проблемы с USB и т.п.), то попробовать сами дуину запитать через внешний разъем питания.

Вообщем "сначала питание, а потом  воспитание" :)

Попробую БП сменит для начала, он у меня 600mA 5v, поставлю 1а 7v

leshak
Offline
Зарегистрирован: 29.09.2011

ingener.solovyev пишет:

Попробую БП сменит для начала, он у меня 600mA 5v,

Ну, в принципе - не настолько он прожорливый. 600mA это за глаза. Если только блок не чудит, не дает пульсаций и т.п.

Ну и естественно если вы правильного его подключили. Куда он у вас подключен? Случайно не на внешний разъем питания? Если на внешний - то это скорее всего и есть причина (повезло что хоть иногда пингуется)

ingener.solovyev пишет:

поставлю 1а 7v

А вот этого, как ни странно может не хватить. По напряжению. Зависит от качества регулятора на вашей конкретной плате. В принципе - соотсветсвует "рекомендуемым" параметрам, но пападаются эксземпляры которым нужно от 7.5 вольт на внешний давать разъем (или VIN). Вообщем можете воткнуть, но померяйте какое в итоге напряжение вышло на 5v пине.

Вообще можете, до того как что-то менять, начать именно с того что-бы померять напряжение на 5v пине и 3V пине.

Блоки - это конечно хорошо убедится в них, но когда я говрил что он "прожорливый", речь шла чуть-чуть о другом. Он питается от 3v. А некоторые дуины не содержат отдельного регулятора питания для 3.3V. Они 3.3v получают из 5v с помощью микросхемы FT232 (для экономии), основное назначение которой - USB/UART конвертер. А 3.3V это "бесплатный бонус". Как и все бесплатное - хреновое. Больше 50ma - лучше не брать. Поэтому блок питания у вас может быть на 5A, а enc28j60 все равно будет страдать от недоедания.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

leshak пишет:

ingener.solovyev пишет:

Попробую БП сменит для начала, он у меня 600mA 5v,

Ну, в принципе - не настолько он прожорливый. 600mA это за глаза. Если только блок не чудит, не дает пульсаций и т.п.

Ну и естественно если вы правильного его подключили. Куда он у вас подключен? Случайно не на внешний разъем питания? Если на внешний - то это скорее всего и есть причина (повезло что хоть иногда пингуется)

ingener.solovyev пишет:

поставлю 1а 7v

А вот этого, как ни странно может не хватить. По напряжению. Зависит от качества регулятора на вашей конкретной плате. В принципе - соотсветсвует "рекомендуемым" параметрам, но пападаются эксземпляры которым нужно от 7.5 вольт на внешний давать разъем (или VIN). Вообщем можете воткнуть, но померяйте какое в итоге напряжение вышло на 5v пине.

Вообще можете, до того как что-то менять, начать именно с того что-бы померять напряжение на 5v пине и 3V пине.

Блоки - это конечно хорошо убедится в них, но когда я говрил что он "прожорливый", речь шла чуть-чуть о другом. Он питается от 3v. А некоторые дуины не содержат отдельного регулятора питания для 3.3V. Они 3.3v получают из 5v с помощью микросхемы FT232 (для экономии), основное назначение которой - USB/UART конвертер. А 3.3V это "бесплатный бонус". Как и все бесплатное - хреновое. Больше 50ma - лучше не брать. Поэтому блок питания у вас может быть на 5A, а enc28j60 все равно будет страдать от недоедания.

Собрано на следующих компанентах:

Распаячная плата, NANO v3.0, Ethernet Shield. Блок питания, как я и писал выше, так же китай.

leshak
Offline
Зарегистрирован: 29.09.2011

Это хорошо что вы указали из чего у вас собрано, но вы так и не ответили

1. Как у вас подключен внешний блок? 
2. Какое у вас, де факто, напряжение на 3V пине?

Но польза от того что вы указали что у вас Nano - уже есть.

Смотрим в схематику:

http://arduino.cc/en/uploads/Main/ArduinoNano30Schematic.pdf - видим что отдельного регулятора для 3.3V -нет.

Читам описание http://arduino.cc/en/Main/ArduinoBoardNano - " the 3.3V output (which is supplied by the FTDI chip) " - "3.3V выход запитан от FTDI чипа).

Если мы не хотим читать оригинал, то смотрим тут http://arduino.ru/Hardware/ArduinoBoardNano - "Микросхема FTDI FT232RL получает питание, только если сама платформа запитана от USB. Таким образом при работе от внешнего источника (не USB), будет отсутствовать напряжение 3.3 В, генерируемое микросхемой FTDI, при этом светодиоды RX и TX мигаю только при наличие сигнала высокого уровня на выводах 0 и 1."

Такм образом: какой блок питания - оно как-бы даже слегка второстепенно (но если подключили не туда - тоже может быть причиной) Сам шилд у вас питается от FTDI. Который по даташиту обещает возможное "плавание" выдаваемого напряжение от 3.0V до 3.6V. И это в случае если мы еге "не перегрузили", а если сильно много стали брать - то вообще никто ничего не обещал. Генерация напряжение у него - это вообще "побочная функция". 

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

leshak пишет:

Это хорошо что вы указали из чего у вас собрано, но вы так и не ответили

1. Как у вас подключен внешний блок? 
2. Какое у вас, де факто, напряжение на 3V пине?

Но польза от того что вы указали что у вас Nano - уже есть.

Смотрим в схематику:

http://arduino.cc/en/uploads/Main/ArduinoNano30Schematic.pdf - видим что отдельного регулятора для 3.3V -нет.

Читам описание http://arduino.cc/en/Main/ArduinoBoardNano - " the 3.3V output (which is supplied by the FTDI chip) " - "3.3V выход запитан от FTDI чипа).

Если мы не хотим читать оригинал, то смотрим тут http://arduino.ru/Hardware/ArduinoBoardNano - "Микросхема FTDI FT232RL получает питание, только если сама платформа запитана от USB. Таким образом при работе от внешнего источника (не USB), будет отсутствовать напряжение 3.3 В, генерируемое микросхемой FTDI, при этом светодиоды RX и TX мигаю только при наличие сигнала высокого уровня на выводах 0 и 1."

Такм образом: какой блок питания - оно как-бы даже слегка второстепенно (но если подключили не туда - тоже может быть причиной) Сам шилд у вас питается от FTDI. Который по даташиту обещает возможное "плавание" выдаваемого напряжение от 3.0V до 3.6V. И это в случае если мы еге "не перегрузили", а если сильно много стали брать - то вообще никто ничего не обещал. Генерация напряжение у него - это вообще "побочная функция". 

 

Я сейчас в уч. отпуске, померить не смогу до 23. БП подключен к выходу распаячной платы, от туда, если память не изменяет, на vin выход МК. Честно, пока понял, что следует попробовать подключить по USB.

leshak
Offline
Зарегистрирован: 29.09.2011

ingener.solovyev пишет:

БП подключен к выходу распаячной платы, от туда, если память не изменяет, на vin выход МК. 

Не очень понял что такое "распаячная плата". Но если у вас блок питания подключен в одно из этих мест (разъем внешнего питания или VIN пин)

То это более чем вероятная причина проблемы. Вам может не хватать питания не только шилду, но и самому контроллеру.

Почитайте описание своей платы: 

Входное напряжение (рекомендуемое)

7-12 В
Входное напряжение (предельное)
6-20 В

Если вы подали туда 5-ть вольт, то, прежде чем оно доберется до камня оно пройдет через регулятор питания. Которые тоже имеет КПД не 100%.  1.5-2В падения напряжения будет в любом случае. В результате сама ардуина у вас "живет" на напряжении 3-3.5V, вместо штатных 4.8-5V

Либо, если вы подключаете к USB, питание автоматически выбирается от USB  (как более выское) и блок питания у вас вообще не используется. Только видимость его имеется.

На внешний разъем (или пин VIN) нужно подавать от 7V (лучше 7.5v с небольшим запасом).

Если же блок у вас 5v - то питать нужно сразу на пин 5V. В обход регулятора.

Но, раз мы обходим регулятор,  требования к качеству блока - повышается. Уже он должен гарантировать что дает именно 5v. Что нет проседаний и всплесков выше 5v (это особенно важно!!).

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

а питание через USB в каких пределах по силе тока и напряжению?

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Leshak прошу подсказать....

leshak
Offline
Зарегистрирован: 29.09.2011

500 mA можно брать с USB. Ответ на этот вопрос самостоятельно нагугливается за минуту. И не нужно никого ждать/просить. Обычная справочная инфа. 
Но при этом, USB-хост нужно "предупредить" что мы собираемся брать до 500mA. Без предупреждения  до 100mA. В случае с ардуиной - специально ничего делать не нужно. USB-чип ардуины сам сообщает хосту что он "брать по маскимуму".

USB - это открытая спецификация. Все это описанно (хотя-бы на той же википедии). Да и тут на форуме, только я (не считая других) с десяток раз минимум говорил про "до 500mA, но лучше держатся в рамках 250-300". 

leshak
Offline
Зарегистрирован: 29.09.2011

Да даже искать не нужно. Банально идем и читаем описание первой попавшеся платы. Скажем

Arduino Uno | Аппаратная платформа Arduino

Цитата:

Токовая защита разъема USB

В Arduino Uno встроен самовостанавливающийся предохранитель (автомат), защищающий порт USB компьютера от токов короткого замыкания и сверхтоков. Хотя практически все компьютеры имеют подобную защиту, тем не менее, данный предохранитель обеспечивает дополнительный барьер. Предохранитель срабатыват при прохождении тока более 500 мА через USB порт и размыкает цепь до тех пока нормальные значения токов не будут востановлены.

Или википедия, в самом начале USB — Википедия

 

Цитата:

Для подключения периферийных устройств к шине USB используется четырёхпроводный кабель, при этом два провода (витая пара) в дифференциальном включении используются для приёма и передачи данных, а два провода — для питания периферийного устройства. Благодаря встроенным линиям питания USB позволяет подключать периферийные устройства без собственного источника питания (максимальная сила тока, потребляемого устройством по линиям питания шины USB, не должна превышать 500 мА, у USB 3.0 — 900 мА).

Там же можно узнать и про напряжение - 5 вольт

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

leshak пишет:

500 mA можно брать с USB. Ответ на этот вопрос самостоятельно нагугливается за минуту. И не нужно никого ждать/просить. Обычная справочная инфа. 
Но при этом, USB-хост нужно "предупредить" что мы собираемся брать до 500mA. Без предупреждения  до 100mA. В случае с ардуиной - специально ничего делать не нужно. USB-чип ардуины сам сообщает хосту что он "брать по маскимуму".

USB - это открытая спецификация. Все это описанно (хотя-бы на той же википедии). Да и тут на форуме, только я (не считая других) с десяток раз минимум говорил про "до 500mA, но лучше держатся в рамках 250-300". 

я этот вопрос задал как наводящий на следующий, питание от бп по юсб, подойдет ли для моей задачи стандартный от телефона? 5v 1A?