Boa noite. Acredito que este tópico já tenha sido tratado por aqui, porém não consegui encontrar na minha busca uma resposta ao meu problema. Estou trabalhando em um projeto de um relógio de ponto, onde desejo ler a informação de um cartão RFID + data e hora de um módulo real time, e em seguida escrever tais informações em um cartão SD. O problema é que o módulo RFID usa a seguinte ligação:

SDA -> Pino 10;

SCK->Pino 13;

MOSI->Pino 10;

MISO->Pino 12;

RST->Pino 9;

E ai o módulo SD usaria a pinagem:

SDCS -> Pino 4;

SCK->Pino 13;

MOSI->Pino 11;

MISO->Pino 12;

Assim temos conflito nos pinos 12 e 13. Posso utilizar outra porta digital para ligar um dos dois módulos? Tenho ainda vagas as portas 5, 6, 7 e 8.

Obrigado

Exibições: 4409

Responder esta

Respostas a este tópico

Corrigindo... No RFID a pinagem é:

RFID usa a seguinte ligação:

SDA -> Pino 10;

SCK->Pino 13;

MOSI->Pino 11;

MISO->Pino 12;

RST->Pino 9; 

No barramento SPI (SCK, MOSI e MISO) é possível conectar vários escravos de forma pararela. O conflito só existe se for utilizado o mesmo pino SDA ou SS. Se estiver utilizando o Ethernet Shield não pode ser utilizado o pino 10 para SDA do RFID.

Daniel Gleison, obrigado por sua resposta. Tentei o seguinte:

Arduino   Modulo SD    RFID

Pino 4     SDCS               -

Pino 9                          RST

Pino 10       -                SDA

Pino 11   MOSI            MOSI

Pino 12   MISO            MISO

Pino 13   SCK              SCK

Com isso não haveria conflito, certo? Mas como eu coloco no código com qual slave eu quero "falar"?

Abcs

Não há conflito dessa forma. Lembrando que o Ethernet Shield utiliza o pino 10 como SS.

As bibliotecas de cada dispositivo se encarregam de fazer as chamadas. Mas uma boa prática é habilitar e desabilitar o pino SS de acordo com a chamada no código.

void RFID_ON (void)
{
digitalWrite (4, HIGH); //desabilita o SD
digitalWrite (10, LOW); //habilita o RFID
}

void SD_ON (void)
{
digitalWrite (10, HIGH); //desabilita o RFID

digitalWrite (4, LOW); //habilita o SD
}

Oi Daniel, me desculpe a falta de conhecimento. Estou colocando abaixo parte do código. Me dá uma dica de onde inserir o comando acima:

// Uso de portas:
// Display: D2, D3, D4, A0, A1 e A2
// RFID: D9, D10, D11, D12 e D13
// Portas livres: D5, D6, D7, D8 // A3, A4 e A5 // D0(RX) e D1(TX) - Ligados a porta USB

// Inclui as bibliotecas
#include <LiquidCrystal.h> // LCD
#include <SPI.h> // Comunicação
#include <RFID.h> // RFID
#include <SD.h> // Cartão SD

// Inicializa o LCD definindo os pinos de interface
LiquidCrystal lcd(16, 15, 14, 4, 3, 2);

// Inicializa o RFID definindo os pinos de interface
#define SS_PIN 10
#define RST_PIN 9

RFID rfid(SS_PIN, RST_PIN);

// Define as variáveis
int serNum0;
int serNum1;
int serNum2;
int serNum3;
int serNum4;
int temp;
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 5; // Define porta D5 como controle CS (ou SS) do módulo SD
File myFile;

void setup()
{
Serial.begin(9600); //Inicia e define a velocidade para comunicação com monitor serial
SPI.begin(); //Inicia a comunicação serial com periférico (RFID)
rfid.init(); //inicia o receptor do RFID
lcd.begin(16, 2); //Inicia o LCD com dimensões 16x2(Colunas x Linhas)
// Transforma portas analógicas em digitais: A0->14 / A1->15 / A2->16
pinMode(14, OUTPUT); // Onde estava ligado o display na porta digital 5 -> Porta analógica 0
pinMode(15, OUTPUT); // Onde estava ligado o display na porta digital 6 -> Porta analógica 1
pinMode(16, OUTPUT); // Onde estava ligado o display na porta digital 7 -> Porta analógica 2
pinMode(5, OUTPUT); // CS do SD card
}

void loop()
{
lcd.setCursor(0, 0);
lcd.print("Encoste o Cracha");
lcd.setCursor(0, 1);
lcd.print("No Circulo");
if (rfid.isCard()) //Identifica quando o cracha foi aproximado
{
//Inicia a leitura do ID do cartão e armazena nas variáveis Num0 -> Num4
rfid.readCardSerial();
serNum0 = rfid.serNum[0];
serNum1 = rfid.serNum[1];
serNum2 = rfid.serNum[2];
serNum3 = rfid.serNum[3];
serNum4 = rfid.serNum[4];

//Identifica o cartão
if (serNum0 == 35 && serNum1 == 54 && serNum2 == 151 && serNum3 == 244 && serNum4 ==118)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Este e o");
lcd.setCursor(0, 1);
lcd.print("Chaveiro");

myFile = SD.open("Chaveiro.txt", FILE_WRITE);

// if the file opened okay, write to it:
if (myFile)
{
myFile.println("Leitura 1");
myFile.close();

}

}

....... E assim continua identificando os outros crachás.

rfid.halt();
}

Abcs

Daniel,

Tinha esquecido de incluir no void setup() o 

SD.begin(4);

Além disso alterei o pino do SDSC para 5, já que vi que a biblioteca usa este pino. Asssim alterei tb o LCD para LiquidCrystal lcd(16, 15, 14, 5, 3, 2);

Acho que agora vai...

Deu certo, Paulo?

Daniel,

Me desculpe a demora em responde-lo. Deu certo sim. Inclui um módulo de tempo e tb um módulo bluetooth. Meu problema agora é o módulo de tempo que atrasa... Vou ver o que eu acho por ai sobre o assunto. Abcs

Sugiro vc usar o RTC DS3231. Eu tinha comprado ele pela primeira vez há pouco mais de 1 ano e ele está em funcionamento desde lá sem apresentar um único segundo de atraso

Gostei tanto dele após essa primeira experiência que comprei mais 10 iguais.

Li relatos de outros módulos RTC que atrasam. Fuja deles.

imhugo, obrigado pela dica. Onde vc comprou o módulo DS3231? Abcs

Putz to com uma dúvida parecida, no caso desejo ligar um shild SD, LCD e um RFID mas no shild LCD que é o ultimo da montagem tem uma matriz de pinos machos 3x5, na qual a primeira linha  e GND, a segunda 5V e a terceira vai do A1 -A5. E tenho medo de ligar nos pinos que tenho visto nos esquemas direto no shild LCD. Sera que pode rolar conflito, caso uma porta que esta sendo utilizado para o LCD também seja usada pelo RFID????

Diogo,

Fiz o seguinte:

// Inicializa o LCD definindo os pinos de interface
LiquidCrystal lcd(16, 15, 14, 5, 3, 2); // Ligação original -> lcd(7, 6, 5, 4, 3, 2);

// Transforma portas analógicas em digitais: A0->14 / A1->15 / A2->16
pinMode(14, OUTPUT); // Onde estava ligado o display na porta digital 5 -> Porta analógica 0
pinMode(15, OUTPUT); // Onde estava ligado o display na porta digital 6 -> Porta analógica 1
pinMode(16, OUTPUT); // Onde estava ligado o display na porta digital 7 -> Porta analógica 2

// Inicializa o RFID definindo os pinos de interface
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN, RST_PIN);

//Modulo RTC DS1307 ligado as portas A4 e A5 do Arduino
DS1307 rtc(A4, A5);

//Definicoes do pino SQW/Out
rtc.setSQWRate(SQW_RATE_1);
rtc.enableSQW(true);

Espero ter ajudado

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço