collapse

* Links de Robótica

* Posts Recentes

Feira de electricidade e eletrónica por edeweld
[Hoje às 02:02]


Recomendação de um opamp para um DAC r2r por jm_araujo
[Ontem às 10:48]


RN42 e TP-Link MR3020 por doiga
[22 de Novembro de 2017, 19:22]


Ajuda Projecto IR / RF por senso
[22 de Novembro de 2017, 13:15]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]


Amplificador audio por beirao
[12 de Novembro de 2017, 23:43]

Autor Tópico: ENC28J60 e MFRC522  (Lida 7379 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
ENC28J60 e MFRC522
« em: 11 de Março de 2014, 18:42 »
Boas

Estou de volta de um projecto em que tenho de usar um módulo rfid para ler o id de um cartão e envia-lo através de uma rede ethernet, estou a usar como controlador ethernet um enc28j60 e leitor de rfid um módulo com um mfrc522, para testes estou a usar o arduino visto já existirem bibliotecas  :P

Acontece que o código funciona bem separadamente, mas quando o junto apenas o leitor de rfid funciona correctamente, a única coisa que o módulo ethernet faz é responder a pings.

Já varri as datasheets e ambos usam a mesma frequência de clock, o mesmo modo (modo 0) e não existem conflitos nas bibliotecas com pinos, cada um têm o seu /CS. Pelo que percebi o ENC28J60 põe em alta impedância o MOSI e MISO, na datasheet do MFRC522 não encontrei qualquer referência, será esse o problema? A primeira coisa que me ocorreu foi falta de RAM, mas usei uma pequena função para verificar a RAM livre e mesmo com o uso de strings e o buffer do TCP\IP a ocupar 500 bytes ainda têm ~1k livre .

As bibliotecas que estou a usar: https://github.com/jcw/ethercard e https://github.com/miguelbalboa/rfid

O código:

Código: [Seleccione]
#include <SPI.h>
#include <MFRC522.h>
#include <EtherCard.h>

MFRC522 mfrc522(10, 14); // Create MFRC522 instance.

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // Endereço MAC
static byte myip[] = { 192,168,2,2 }; // Endereço IP
static byte gwip[] = { 192,168,2,1 }; // Endereço GW
static byte hisip[] = { 192,168,2,1 }; // Endereço servidor remoto
char website[] PROGMEM = "192.168.2.1"; // Nome do servidor remoto
byte Ethernet::buffer[500];   // Buffer do TCP/IP
String id, lastId;

void setup()
{
  Serial.begin(57600);
  ether.begin(sizeof Ethernet::buffer, mymac, 8);
  ether.staticSetup(myip, gwip);
  ether.copyIp(ether.hisip, hisip);
  SPI.begin();
  mfrc522.PCD_Init();
}

void loop()
{
  ether.packetLoop(ether.packetReceive());
 
  id = "";
 
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial())
  {
    for (int i = 0; i < 4; i++)
    {
      if (mfrc522.uid.uidByte[i] < 0x10) //adds a leading zero
        id += "0";
     
      id += String(mfrc522.uid.uidByte[i], HEX);
    }
   
    if (id != lastId)
    {
      Serial.println(id);
      ether.browseUrl(PSTR("/?id="), "card id here", website, reply);
      tone(9, 2300, 500);
      lastId = id;
    }
   
    else
    {
      tone(9, 2300, 100);
      delay(200);
      tone(9, 2300, 100);
    }
   
    mfrc522.PICC_HaltA();
    delay(1000);
  }
}

// Resposta do servidor
static void reply (byte status, word off, word len)
{
  Serial.println((const char*) Ethernet::buffer + off);
}

Outra coisa: estou a guardar o id numa variável string, mas a função para enviar os dados por ethernet só aceita chars, qual é a melhor forma de tratar isso, tendo em conta que estou a comparar o id com o anterior para verificar se o cartão já foi lido?

Obrigado

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: ENC28J60 e MFRC522
« Responder #1 em: 11 de Março de 2014, 18:49 »
Strings e arrays de chars são a mesma coisa, a diferença é que tipicamente uma string é terminada com um caracter nulo, aka /0.
Porque é que o pessoal do arduino resolveu re-inventar isto:
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html

Não faço a mais pálida ideia.
Avr fanboy

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: ENC28J60 e MFRC522
« Responder #2 em: 11 de Março de 2014, 20:50 »
eu sei que strings são arrays de chars, sei que que para a comparação dos arrays posso usar o strcmp() e para copiar o conteúdo de um array para o outro o strcpy(), a minha duvida é como é que lido com os leading zeros uma vez que preciso de trabalhar com valores hexadecimais, com strings basta somar um 0, assim não estou a ver  ???

edit: não consegui resolver o problema na totalidade a trabalhar com arrays de chars e as funções da biblioteca string, voltei a usar strings e simplesmente a converter a string num array e chars para enviar para a função de envio:

Código: [Seleccione]
id.toCharArray(buffer, 9);
ether.browseUrl(PSTR("/?id="), (const char*)buffer, website, reply);

quando reescrever o código em C vou revisitar o problema, mas agora quero é ter isto a funcionar  ;D

voltamos ao problema inicial, as bibliotecas não se darem bem, por onde devo começar?
« Última modificação: 11 de Março de 2014, 22:08 por CBX »

Offline jmiguelff

  • Mini Robot
  • *
  • Mensagens: 204
Re: ENC28J60 e MFRC522
« Responder #3 em: 12 de Março de 2014, 11:28 »
CBX eu não conheço essas bibliotecas por isso a minha ajuda não é grande ajuda. :p

Mas quando usas várias bibliotecas deves ter em atenção ao que está por baixo. As bibliotecas podem usar os mesmos recursos com configurações diferentes e portanto em conjunto não funcionam bem.


Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: ENC28J60 e MFRC522
« Responder #4 em: 12 de Março de 2014, 16:38 »
eu sei disso, por essa mesma razão é que a não funciona está por baixo, até já no próprio setup() acrescentei SPI.setClockDivider(SPI_CLOCK_DIV2), SPI.setDataMode(SPI_MODE0) e SPI.setBitOrder(SBFIRST), na scketch que têm apenas o código do cliente web funcionou, no que junta os dois acontece o mesmo, apenas o leitor rfid funciona, quer dizer, o modulo ethernet não está "morto" de todo, ao fazer um ping ele responde, simplesmente não envia nada quando deve...

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: ENC28J60 e MFRC522
« Responder #5 em: 15 de Março de 2014, 23:09 »
Liguei o logic analyzer e ambos os IC's parecem apenas enviar e receber informação quando o o seu CS está low, não sei mais por onde pegar nisto  >:(


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: ENC28J60 e MFRC522
« Responder #6 em: 15 de Março de 2014, 23:54 »
You need to go deeper..
Olhar para as bibliotecas e ver que recursos usam.
Avr fanboy

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.727
Re: ENC28J60 e MFRC522
« Responder #7 em: 16 de Março de 2014, 01:13 »
quando dizes que ele responde ao ping, é o processador que trata esse pedido ou é o controlador ethernet que já tem a camada responsável por esse tipo de pedidos?

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: ENC28J60 e MFRC522
« Responder #8 em: 16 de Março de 2014, 02:04 »
é o mcu, mais propriamente estas duas funções: ether.packetLoop(ether.packetReceive());

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.727
Re: ENC28J60 e MFRC522
« Responder #9 em: 16 de Março de 2014, 09:56 »
é o mcu, mais propriamente estas duas funções: ether.packetLoop(ether.packetReceive());

a minha questão era para tentar perceber se o problema estaria na comunicação por SPI mas aparentemente não. Eu já tive um problema do genero mas era porque um dos integrados mantinha os sinais do SPI num estado que não permitia partilhar o SPI, mas já não me recordo quias eram os integrados.

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: ENC28J60 e MFRC522
« Responder #10 em: 16 de Março de 2014, 13:45 »
Também pensei o mesmo,  mas como responde aos pings o problema está mesmo numa das bibliotecas, suspeito na do mfrc522 uma vez que a ethercard funciona sem problemas com outros spi slaves, por exemplo cartões SD

Fiz um pequeno teste, comentei tudo o que tivesse a haver com a biblioteca mfrc522 e fui descomentando uma função de cada vez, o problema parece estar numa destas, mfrc522.PICC_IsNewCardPresent() ou mfrc522.PICC_ReadCardSerial(), mas o código parece bastante inofensivo, a primeira envia um comando que pergunta se existe um novo cartão presente, a segunda lê o conteúdo do cartão, a segunda está dependente do que a primeira retorna, verdadeiro ou falso.

Vou ter de reler a biblioteca com mais atenção...

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: ENC28J60 e MFRC522
« Responder #11 em: 19 de Março de 2014, 19:14 »
Bem, li a biblioteca toda mais do que uma vez e não encontrei nada que pudesse causar mau funcionamento no bus, liguei o logic analyzer e também não encontrei nada de anormal, testei outra biblioteca e acontece exactamente o mesmo, consigo pingar o módulo a partir da linha de comandos, mas não envia mais nada, sem ser as respostas dos ecos, foi então que me lembrei, será um problema de timings?

Uma vez que ambos os chips usam o mesmo bus spi, logo o mesmo buffer, será que como o programa está constantemente a procurar tags rfid novas está sempre a ocupar o buffer com a sua informação e os dados referentes ao módulo ethernet nunca chegam a ser enviados?

Será que um rtos simples me resolve o problema?

O módulo do MRFC522 por acaso (ou não) até tem um pino IRQ, mas não sei se me vai resolver o problema, estas são as interrupções que podem ser configuradas:

IRq - timer unit - the timer counts from 1 to 0
TxIRq – transmitter - a transmitted data stream ends
CRCIRq - CRC coprocessor - all data from the FIFO buffer has been processed
RxIRq – receiver - a received data stream ends
IdleIRq - ComIrqReg register - command execution finishes
HiAlertIRq - FIFO buffer - the FIFO buffer is almost full
LoAlertIRq - FIFO buffer - the FIFO buffer is almost empty
ErrIRq - contactless UART - an error is detected

Que vos parece?

edit: parece que o SPI não tem nenhum buffer :o
« Última modificação: 19 de Março de 2014, 20:32 por CBX »

Offline zedlav

  • Mini Robot
  • *
  • Mensagens: 78
Re: ENC28J60 e MFRC522
« Responder #12 em: 19 de Março de 2014, 22:20 »
Boas.
Se tiveres o servidor no teu pc podes usar o wireshark http://www.wireshark.org/ para veres o que está acontecer na comunicação.



 

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: ENC28J60 e MFRC522
« Responder #13 em: 20 de Março de 2014, 00:12 »
eu sei, é o que tenho estado a usar...

Offline zedlav

  • Mini Robot
  • *
  • Mensagens: 78
Re: ENC28J60 e MFRC522
« Responder #14 em: 20 de Março de 2014, 09:19 »
O ENC28J60 chega a enviar o SYN para o servidor?