Ethernet Shield v1.0 (ENC28J60) + PN532 + Arduino NANO v3.0

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Доброго времени, форумчане. Есть некая проблема, с которой столкнулся, и, облазив всю доступную для понимания моему мозгу информацию в интернете, решил обратиться на форум за подсказкой. 

Имеется:
1) Ethernet Shield for NANO v1.0 на чипе ENC28J60 (1 шт)
2) Модуль RFID на чипе PN532 (1 шт)
3) Китайская копия Arduino NANO v3.0 (1 шт)

Суть проблемы:
Arduino надевается на Ethernet Shield "бутербродом", подключается модуль PN532 по I2C в пины , как указано в инструкции.
При включении и заливке скетча в Serial порт "выхрюкивает" информацию, что плата не найдена. Причем при отключении шилда Ethernet - все работает, сам Ethernet шилд тоже работает при подключении к нему например датчика BME280 по I2C (стояла Zabbuino на ардуинке). Может кто подсказать, что я делаю не так? Весь скетч прилагаю и заранее скажу, что библиотеку UIPEthernet не подключал и не настраивал модуль шилда специально для проверки работы вообще всего в купе.

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_PN532.h>

#define PN532_IRQ   (6)
#define PN532_RESET (7)

Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);

unsigned long timing = "10000";
uint32_t timer_delay = 0;

void setup(void) {
  Serial.begin(115200);
  nfc.begin();
  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Плата с чипом PN53x не найдена.");
    while (1); // halt
  }
  
  /************************************************************
    Установка максимального количества попыток чтения с карты.
    Это защита от бесконечного ожидания карты, которое обычно
    является стандартным поведением чипа PN532.
  *************************************************************/
  
  nfc.setPassiveActivationRetries(0xFF);

  // Команда настройки платы для чтения меток RFID.
  nfc.SAMConfig();
}


void loop() {
  MyFunction();
  timer_delay = 10000;
}



void MyFunction()
{
  if (millis() - timing >= timer_delay)
  {
    boolean success;
    uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Буфер для хранения полученного UID
    uint8_t uidLength;        // Длинна UID (4 или 7 байт в зависимости от типа карты ISO14443A)

    /*******************************************************************************************
      Ожидаем появление карт типа ISO14443A (Mifare и т.д.).  Как карта найдена, то
      в переменную буфера 'uid' будет побайтово записан UID карты, а в uidLength будет указано,
      какое количество байт получено с карты.
      4 байта - Mifare Classic
      7 байт - Mifare Ultralight
    ********************************************************************************************/

    success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
    if (success)
    {
      Serial.print(uid[0], HEX);
      Serial.print(":");
      Serial.print(uid[1], HEX);
      Serial.print(":");
      Serial.print(uid[2], HEX);
      Serial.print(":");
      Serial.println(uid[3], HEX);
      Serial.println("");
    }
    else
    {
      Serial.println("Время ожидания карты вышло.");
    }
    timing = millis();
  }
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Как устроено питание шилда? Он ест много тока. Обычно питать его надо отдельно от ардуины. Основное питание 3.3 вольта, которые на нане совсем слабые.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

nik182 пишет:
Как устроено питание шилда? Он ест много тока. Обычно питать его надо отдельно от ардуины. Основное питание 3.3 вольта, которые на нане совсем слабые.

Я, кстати, вообще не подумал об этом. Питается все от USB с пк, но я так думаю надо блок питания поставить. Либо просто кинуть провод 5V и GND с блока 5V 1A на VIN и GND ардуинки вариант?

Исходил из того, что при таком же подключении питания (USB с пк) сам Ethernet шилд работает даже с датчиком BME280 и корректно передает данные. Поэтому и заинтересовало то, что плату RFID ардуинка не видит.

И да, он питается от 3.3V.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Кстати, посмотрел на этот "бутербродный" шилд сам - стоит преобразователь AMS1117, так что питается эта штука, судя по дорожкам, от 5V я полагаю....

sadman41
Offline
Зарегистрирован: 19.10.2016

Шилд от RobotDyn, к примеру, разведён так, чтобы брать  питание с пина 5V и далее своим LDO до 3,3V сбрасывать:

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

sadman41 пишет:

Шилд от RobotDyn, к примеру, разведён так, чтобы брать  питание с пина 5V и далее своим LDO до 3,3V сбрасывать:

У меня точно такой же (цвет текстолита смысла не имеет, если маркировка одинаковая) =D

sadman41
Offline
Зарегистрирован: 19.10.2016

А этот PN532 по SPI работает? Если да, то куда у него CS завёрнут? А то, мож, они запараллелены с ENC-шилдом по шине?

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

PN532 может работать по SPI, I2C и HSU. Подключен сейчас через I2C в надежде, что раз датчик BME280 работает с шилдом - то и этот должен. Я предварительно ознакомился с тем, что шилд по SPI подключен и юзает пины D10-13 + D2 для прерывания ( если я правильно это понял). Изначально в скетче были такие значения

#define PN532_IRQ   (2)
#define PN532_RESET (3)

после чего заменил их на эти:

#define PN532_IRQ   (6)
#define PN532_RESET (7)

Перекинул пины - проблема не изменилась. Так же пишет что не находит плату PN532. Может дело в функции, которая берет versiondata? Я в глубь библиотеки не углублялся просто. По крайней мере не так глубоко, ибо очень сложно разбиратся в библиотеке, когда знания на уровне песочницы.

sadman41
Offline
Зарегистрирован: 19.10.2016

Если по I2C, то нет мыслей. В случае SPI - я бы думал на то, что CS один и тот же идёт на оба модуля.

Прозванивать разве что... маловероятно, но может нет соединения через ENC-шилд. Ну или он настолько много жрёт, что не хватает RFID-у.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

ENC шилд кстати не от RobotDyn, а от Wavgat, принципиально похожи, но вот знать бы так ли это на самом деле. Попробую прозвонить. Если найду решение - тут и отпишусь тогда уж. Может кто подкинет заодно идею куда еще глянуть.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

В итоге я прозвонил, но в итоге не нашел проблемы. Попробовал подключить по SPI таким образом:

#define PN532_SCK  (4)
#define PN532_MOSI (5)
#define PN532_SS   (8)
#define PN532_MISO (9)
Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

 

Но теперь он вообще выдает TIMEOUT! , следовательно плату не видит даже для инициализации. При этом пины прозваниваются от ардуинки до модуля PN532. Но подключил итого все 6 пинов (IRQ и RESET не подключал). Вопрос - эти пины критически важны?

nik182
Offline
Зарегистрирован: 04.05.2015

А разводка шилда есть? mosi miso  у nano это D11 D12 ноги, RST и IRQ тоже на шилде куда то точно выведены. Интернет пишет :

Плата ENC28J60 Ethernet_shield управляется и получает/передает данные по SPI интерфейсу. При этом используются следующие выводы Arduino Nano:
D10 – SS;
D11 – MOSI;
D12 – MISO;
D13 – SCK;
D2 – выход прерывания. При приеме пакета импульс на этот выход – сигнал для Arduino срочно обрабатывать пакет. Или, как минимум, принять во внимание, что надо получать данные.
 
На других выводах работать не будет.
Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Завтра сделаю фото всего, как есть. Сегодня уже все, домой. Оставил на работе все добро. По факту я бы посмотрел какие пины задействуются на шилде, если бы не ужасная китайская пайка колодок под пины - закрывается все. Сложно высмотреть. Поэтому сделаю фото самого шилда с 2 сторон, постараюсь без колодок, если смогу выпаять нормально.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Подождите, так а мне какие пины надо выводить отдельно? По I2C если подключать, то у меня пробовали себя пины от D2 до D8, и то при условии что я не подключал вообще библиотеку UIPEthernet, т. е. шилд вообще в скетче не играет, а reset и irq я выводил на разные пины, которые по идее не могут влиять на шилд.

nik182
Offline
Зарегистрирован: 04.05.2015

https://github.com/ntruchsess/arduino_uip

К этому шилду рекомендуют эту библиотеку.

По i2c ни разу ENC28J60 не подключал, даже ни разу не видел плат с i2c связью. По spi работал без проблем, но у меня не шилд, а плата с выводами. Когда втыкаешь шилд бутербродом ноги переопределить нельзя. Это только на дюпоновых проводочках можно пробовать с ногами играться. По крайней мере RST жёстко прописан на ноги наны.  

З.Ы. http://ww1.microchip.com/downloads/en/devicedoc/39662e.pdf Описание МС. I2C интерфейса нет!

sadman41
Offline
Зарегистрирован: 19.10.2016

nik182, по I2C он RFID подключает.

nik182
Offline
Зарегистрирован: 04.05.2015

Ну тогда через шилд ноги  А4 А5 должны просто насквозь пролетать , без последствий.  

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

RFID считыватель PN532 не определяется (как выяснилось) по I2C даже при прямом подключении к ардуинке, если кроме VCC, GND, SDA и SCL ничего не подключать. Я прошурхал интернет на тему того, что при подключении по I2C нужно в любом случае подцепить RSTO и IRQ на цифровые порты, которые выбираем сами. Это чисто то, от чего я отталкивался и что смог проверить.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Прилагаю фото самого шилда, который мне пришел. Сразу замечу - A5 имеется 2 шт xD. Выпаять колодки мне не удастся (нет фена или оловоотсоса), а в конец ломать то, что работает не хочется.

nik182
Offline
Зарегистрирован: 04.05.2015

Да ладно. Китайцы просто шелкографию попутали. А4 (который второй А5) с А5 тестером звонится?

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Конечно же нет) Чисто ошибка шелкографии.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

К тому же сейчас установлен этот шилд на стенде, ардуинка зашита под Zabbuino и подключен датчик BME280 по i2C - данные на сервер мониторинга приходят

sadman41
Offline
Зарегистрирован: 19.10.2016

Тоись Nano+ENC работает, Nano+PN532 работает, а Nano+ENC+PN532 - не работает. Но всё прозванивается. 

Тогда только питания побольше накинуть остаётся...

sadman41
Offline
Зарегистрирован: 19.10.2016

Кстати, вот у рободина, судя по пинаутам, заняты D7 и D8:

https://robotdyn.com/pub/media/0G-00004976==NanoEthENC28J60-Shield/DOCS/PINOUT==0G-00004976==NanoEthENC28J60-Shield.pdf

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Ок, я подключал к пинам D2 и D3, D3 и D4, D4 и D5, D5 и D6, D6 и D7, D7 и D8. Пробовал подключать к D3 и D5, D4 и D6. При всех вариантах - проблема одинаковая. Может быть проблема с совместимостью?

sadman41
Offline
Зарегистрирован: 19.10.2016

На D2 явно висит ENC. Но на D4/D5 я ничего не вижу. Впрочем, я и схемы от красного шилда не вижу. Хрен его знает. Надо в руках крутить. 

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

На всякий случай написал продавцу с просьбой обозначить задействованные пинауты на этой плате. WAVGAT может что-то скажет.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Feronos пишет:

WAVGAT может что-то скажет.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Про Wavgat надо писать в первом же предложении своего вопроса. 

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Тут дело в том, что не знал, чей именно модуль - заказывал-то не я. Уточнил чей модуль у друга - вот и написал и сюда, и продавцу.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

RFID модуль, на сколько я понял, тоже от него же, поскольку пришло все разом и одним заказом.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вавгат ещё сетевые чипы не клепает, но схемку шилда глянуть не мешало бы.
С другой стороны - можно BME подвесить на D4/D5 и попросить Zabbuino опросить его - сразу будет понятно - заняты пины или нет.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Если я правильно помню, то Zabbuino собирался и настраивался по вашему посту далекого времени. За это, кстати, отдельный респект и уважение. Тогда хотел бы уточнить такой момент. Если я просто пересажу BME с A4/A5 пинов на D4/D5 пины, надо ли будет что-то менять в библиотеке и заново зашивать zabbuino? Просто я много чего поотключал блочно, будет ли работать?

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Вопрос снят - подключил BME в D4/D5 - все работает, данные снимает.

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Итого, выходит, что A4/A5 и D4/D5 шилдом не заняты...

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Я вот думаю, может ли сам Ethernet шилд блочить пины для передачи данных? Если так, то может надо сделать некие настройки пинов заранее или прописать в скетче работы двух библиотек разом? А то я уже не знаю что и думать

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Как вариант еще можно залить скетч для пинга ардуинки и подключать отдельно по пинам сначала шилд, а потом, если пинг идет, пропустить через нее RFID. Времени не много есть, попробую сделать так.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020


Залил этот скетч:
 
#include <SPI.h>
#include <UIPEthernet.h>

byte mac[] = {0xAE, 0xB2, 0x26, 0xE4, 0x4A, 0x5C}; // MAC-адрес
byte ip[] = {10, 10, 10, 21}; // IP-адрес
//byte myDns[] = {192, 168, 1, 1}; // адрес DNS-сервера
//byte gateway[] = {192, 168, 1, 1}; // адрес сетевого шлюза
//byte subnet[] = {255, 255, 255, 0}; // маска подсети

EthernetServer server(2000); // создаем сервер, порт 2000
EthernetClient client; // объект клиент
boolean clientAlreadyConnected = false; // признак клиент уже подключен

void setup() {
  Ethernet.begin(mac, ip); // инициализация контроллера
  server.begin(); // включаем ожидание входящих соединений
  Serial.begin(115200);
  Serial.print("Server address:");
  Serial.println(Ethernet.localIP()); // выводим IP-адрес контроллера
}

void loop() {
  client = server.available(); // ожидаем объект клиент
  if (client) {
    // есть данные от клиента
    if (clientAlreadyConnected == false) {
      // сообщение о подключении
      Serial.println("Client connected");
      client.println("Server ready"); // ответ клиенту
      clientAlreadyConnected = true;
    }

    while (client.available() > 0) {
      char chr = client.read(); // чтение символа
      server.write(chr); // передача клиенту
      Serial.write(chr);
    }
  }
}

 

 
подключил пины проводками от ардуинки относительно шилда по SPI (10, 11, 12, 13, 5V и GND) - пинг есть.

Переделал схему. Добавил к ардуинке PN532 по I2C (A5 - SCL, A4 - SDA, 3.3V - VCC, GND - GND, D4 - RST0, D5 - IRQ) и залил этот скетч (собрал 1 из 2):

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_PN532.h>
#include <UIPEthernet.h>

// Для подключения I2C
#define PN532_IRQ   (5)
#define PN532_RESET (4)
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);

byte mac[] = {0xAE, 0xB2, 0x26, 0xE4, 0x4A, 0x5C}; // MAC-адрес
byte ip[] = {10, 10, 10, 21}; // IP-адрес
//byte myDns[] = {192, 168, 1, 1}; // адрес DNS-сервера
//byte gateway[] = {192, 168, 1, 1}; // адрес сетевого шлюза
//byte subnet[] = {255, 255, 255, 0}; // маска подсети

EthernetServer server(2000); // создаем сервер, порт 2000
EthernetClient client; // объект клиент
boolean clientAlreadyConnected = false; // признак клиент уже подключен

unsigned long timing = "10000";
uint32_t timer_delay = 0;

void setup(void) {
  Ethernet.begin(mac, ip); // инициализация контроллера
  server.begin(); // включаем ожидание входящих соединений
  Serial.begin(115200);
  Serial.print("IP:");
  Serial.println(Ethernet.localIP()); // выводим IP-адрес контроллера
  nfc.begin();
  uint32_t vdata = nfc.getFirmwareVersion();
  if (! vdata) {
    Serial.print("Плата с чипом PN53x не найдена.");
    while (1);
  }
  /************************************************************
    Установка максимального количества попыток чтения с карты.
    Это защита от бесконечного ожидания карты, которое обычно
    является стандартным поведением чипа PN532.
  *************************************************************/
  nfc.setPassiveActivationRetries(0xFF);

  // Команда настройки платы для чтения меток RFID.
  nfc.SAMConfig();

}

void loop(void) {
  ping();
  MyFunction();
  timer_delay = 10000;
}



void MyFunction()
{
  if (millis() - timing >= timer_delay)
  {
    boolean success;
    uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Буфер для хранения полученного UID
    uint8_t uidLength;        // Длинна UID (4 или 7 байт в зависимости от типа карты ISO14443A)

    /*******************************************************************************************
      Ожидаем появление карт типа ISO14443A (Mifare и т.д.).  Как карта найдена, то
      в переменную буфера 'uid' будет побайтово записан UID карты, а в uidLength будет указано,
      какое количество байт получено с карты.
      4 байта - Mifare Classic
      7 байт - Mifare Ultralight
    ********************************************************************************************/

    success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
    if (success)
    {
      Serial.print(uid[0], HEX);
      Serial.print(":");
      Serial.print(uid[1], HEX);
      Serial.print(":");
      Serial.print(uid[2], HEX);
      Serial.print(":");
      Serial.println(uid[3], HEX);
      Serial.println("");
    }
    else
    {
      Serial.println("Время ожидания карты вышло.");
    }
    timing = millis();
  }
}

void ping() {
  client = server.available(); // ожидаем объект клиент
  if (client) {
    // есть данные от клиента
    if (clientAlreadyConnected == false) {
      // сообщение о подключении
      Serial.println("Client connected");
      client.println("Server ready"); // ответ клиенту
      clientAlreadyConnected = true;
    }

    while (client.available() > 0) {
      char chr = client.read(); // чтение символа
      server.write(chr); // передача клиенту
      Serial.write(chr);
    }
  }
}

В итоге COM порт "хрюкнул" вот это:

IP:10.10.10.21
TIMEOUT!
Плата с чипом PN53x не найдена.
 
Может проблема все же где-то в библиотеке Pn532 кроется? Я с ними не дружу просто) не понимаю много ( не "погромист" я)
Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Так, новая инфа. Отключил D5 - RST0 --- в цикл loop вошел, пинг есть, но при этом выдает 

IP:10.10.10.21
Время ожидания карты вышло.
 
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Feronos пишет:

Добавил к ардуинке PN532 по I2C (A5 - SCL, A4 - SDA, 3.3V - VCC, GND - GND, D4 - RST0, D5 - IRQ) 

Уверены, что по 3.3V Ардуина тока нормально отдаёт?

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Замерял мультиметром - 3.2V выдавала (хотя я не уверен, у меня на работе 2 Nano и одна Pro Mini на 3.3V)

sadman41
Offline
Зарегистрирован: 19.10.2016

Если Nano не Robotdyn, то для сохранения психического здоровья лучше считать, что 3.3V на ней нет.

 

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

Хорошо, будем так считать. Можно понизить питание с 5V до 3.3V резисторами? Или лучше понижающий модуль найти где-нибудь?

P.S.: NANO от WAVGAT

sadman41
Offline
Зарегистрирован: 19.10.2016

А что, RFID прямо на 3.3В? Тогда надо на 1117 что-нить исполнить, думаю.

Feronos
Feronos аватар
Offline
Зарегистрирован: 19.02.2020

RFID на 3.3, а что можно придумать такое на 1117? Чисто купить - ну хз)