spi rfid+sd

Odpovědět
wes server
Příspěvky: 8
Registrován: 08 kvě 2018, 00:46
Reputation: 0

spi rfid+sd

Příspěvek od wes server » 17 čer 2018, 22:49

Dobrý den potřeboval bych jednoduchý program pro arduino mega, které by po přiložení rfid tagu ke čtečce přehrálo hudbu z sd karty.
Čtení a zápis na SD kartu jde dobře a s knihovnou TMRpcm jde dobře i přehrávání zvuku. A k rfid: mám http://navody.arduino-shop.cz/navody-k- ... 6-mhz.html vše funguje dobře, ale když to obojí spojím perou se o spi.

Kód: Vybrat vše

#include <SD.h>
#define SD_ChipSelectPin 10
#include <TMRpcm.h>
#include <SPI.h>

#include <MFRC522.h>
 

TMRpcm tmrpcm;

#define SDA_PIN 9
#define RST_PIN 8
MFRC522 rfid(SDA_PIN, RST_PIN);

void setup() {
   pinMode(10,OUTPUT);
   
   
tmrpcm.speakerPin=11;

  Serial.begin(9600);
 
  SPI.begin();

  rfid.PCD_Init();

if(!SD.begin(SD_ChipSelectPin))
{
  Serial.println("SD fail");
  return;
}
tmrpcm.setVolume(5);

}

void loop() {
  

  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  if ( ! rfid.PICC_ReadCardSerial())
    return;
    Serial.print("docteno");

  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.print("RFID tag typu: ");
  Serial.println(rfid.PICC_GetTypeName(piccType));

  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("Tento RFID tag neni podporovany (typ MIFARE Classic).");
    return;
  }
  
  Serial.print("Adresa RFID tagu: ");
  vypisHex(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();

  if(rfid.uid.uidByte[0] == 0xF0 & rfid.uid.uidByte[1] == 0x7E & rfid.uid.uidByte[2] == 0x57 & rfid.uid.uidByte[3] == 0x56) {
    Serial.println("Karta bila");
    tmrpcm.play("testa.wav");
  }
  else if(rfid.uid.uidByte[0] == 0x57 & rfid.uid.uidByte[1] == 0x3F & rfid.uid.uidByte[2] == 0xBB & rfid.uid.uidByte[3] == 0x79) {
    Serial.println("Detekovan modry privesek!");
    tmrpcm.play("testb.wav");
  }
 
  else {
    Serial.println("Detekovan neznamy RFID tag!");
  }
 
  
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
  Serial.println("konec loopu");
}

void vypisHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}
ke kódu: když odpojím miso čtečky SD tak to čte naprosto v pohodě, tak si myslím že to může být jen tím že se hádají o to kdo bude komunikovat. Vím že se má nějak zacházet s piny ss (u rfid popsaný sda myslím; u sd čtečky cs), aby věděly kdo komunikuje s masterem
a ještě dotaz trochu mimo: proč je na arduinu "vyhrazený" ss pin, jaký je rozdíl když použiji jiný?

Byl bych vděčný kdyby mi někdo poradil. Předem děkuji.

gilhad
Příspěvky: 497
Registrován: 07 bře 2018, 11:22
Reputation: 5

Re: spi rfid+sd

Příspěvek od gilhad » 18 čer 2018, 14:14

Jako chip select muzes pouzit jakykoliv vystupni pin, hodnotou na nem rika arduino danemu zarizeni, ze je zrovna vybrane a komunikuje se s nim.

SS pin jako vstupni je totez v obracenem gardu - i Arduino muze fungovat jako ovladane zarizeni a tim SS pinem mu rikas, kdy vnejsi master s nim chce mluvit a kdy se ho komunikace netyka a ma mlcet.


(protoze muzes zapojit takhle treba pet Arduin, jedno se chova jako master, ostatni ctyri se chovaji jako device, master z ruznych pinu posila ChipSelect na jednotlive device, ty to prijimaji na svem SlaveSelect pinu a podle toho komunikuji.

Dokonce jde udelat to, ze si takhle sit arduin predava nejakym vtipne vymyslenym protokolem "zezlo" a stridaji se v tom, kdo kdy bude master pro sit a kdo bude device)

wes server
Příspěvky: 8
Registrován: 08 kvě 2018, 00:46
Reputation: 0

Re: spi rfid+sd

Příspěvek od wes server » 18 čer 2018, 14:34

Děkuji za informaci k ss pinu, ale problém je že se mi ty zařízení hádají. Myslím si že by na ss pinu zařízení se kterým arduino komunikuje by měla být 0, a na ostatních 1, aby to fungovalo jak má. Čtečka SD karty komunikuje na začátku cca 1-2 vteřiny a tak je tam nula, ale potom když to čeká na načteni tagu tak jsem na ss u RFID čtečky naměřil neurčitý signál. Když odpojím čtečku SD (stačí MISO), tak mi to vypíše SDfail a čtečka RFID pracuje jak má.

gilhad
Příspěvky: 497
Registrován: 07 bře 2018, 11:22
Reputation: 5

Re: spi rfid+sd

Příspěvek od gilhad » 18 čer 2018, 23:10

No na ty SS piny u zarizeni (SD, RFID) by mely jit ruzne kabliky od ruznych Arduino pinu a Arduino by tam melo vnutit (nastavit natvrdo) uroven, jakou si ono samo preje, samotne zarizeni do urovne napeti na tom pinu nema co kecat.

Takze bud je nekde spatne zapojeni/spatny kontakt, nebo je nejake to zarizeni porouchane (ale na to to moc nevypada), nebo program v Arduinu dela kraviny (tedy bud ten pin nenastavi vubec, nebo ho nastavi jako vstupni, nebo s nim rychle kmita nahoru/dolu), coz je po spatnem zapojeni druha nejpravdepodobnejsi chyba - klidne muze byt v nejake knihove nejaky ten pin zapsany "natvrdo", nebo spatne nastaveny.

(spatne zapojeni samozrejme je i kdyz na SS pin u RFID pripojis pin, ktery uz pouziva Arduino na neco jineho, nebo ho na neco kdoviproc pouziva ten druhy shield (SD). Nebo naopak.)

Z filozofickeho hlediska tu mas chybu v uvaze:
PROTOZE tam je na zacatku 1-2 sec nula, tak PROTO ctecka SD muze (smi) komunikovat (a komunikuje)
PROTOZE u RFID mas spatny signal (bud "neurcity", nebo spis je rychle se menici) tak RFID stridave zkousi a nezkousi komunikovat a protoze to nezvlada, (nebo to nezvlada/neceka Arduino,) tak z komunikace lezou nesmysly

Proste ty SS piny musi ridit Arduino a musi s tim pocitat ty programy uvnitr (takze pokud odpojis SD prez SS pin a pripojis RFID prez jeho SS pin, tak s miso/mosi musi v tu chvili pracovat knihovna pro RFID a nikoli knihovna pro SD. A samozerejne naopak kdyz odpojis RFID a pripojis SD, tak mosi/miso musi kontrolovat knihovna pro SD.) Je dobre mozne, ze knihovna pro SD ma nekde nejake cekani na nacteni tagu (ci ceho) a po chvili cekani (nebo prubezne) se snazi prez miso/mosi komunikovat s SD, ackoli ty ses prepojil na RFID - je na tobe, aby sis zaridil, aby k tomuto stavu nedochazelo.

(Tedy bud projit ty knihovny a ramcove pochopit co delaji a upravit je, nebo to udelat uplne hloupe a pockat, az se jedna knihovna vypovida, vyprsi ji vsechny mozne timeouty a uz nic po zarizeni nechce (idealne ji od zarizeni zcela odpojit) a teprve pak se prepojit na to druhe zarizeni a zase se venovat jen jemu, dokud je o cem si s nim povidat.

wes server
Příspěvky: 8
Registrován: 08 kvě 2018, 00:46
Reputation: 0

Re: spi rfid+sd

Příspěvek od wes server » 19 čer 2018, 19:44

Tak ten "neurčitý" signál opravdu kmitá, ale nevím jak nechat ty knihovny vypovídat. Skoušel jsem převzít nad piny kontrolu, tak že jsem si vytvořil dvě funkce, které na jednom pinu dají 1 a na druhý dají 0 (ta druhá naopak) a vždy když jsem zavolal funkci z knihovny tak předtím jsem ty piny nastavil. Akorá myslím že jsem se s tou knihovnou pral a nefungovalo to. A ještě jeden dotaz: jak mám zobrazit ten obsah knihovny (znám se s arduinem cca rok (od 14) a tvoření, úpravu... knihoven jsem ještě neřešil

gilhad
Příspěvky: 497
Registrován: 07 bře 2018, 11:22
Reputation: 5

Re: spi rfid+sd

Příspěvek od gilhad » 20 čer 2018, 00:07

Ty knihovny nekde jsou nainstalovane, tak se tam podivej. jsou to normalni ceckove zdrojaky stejne jako ten tvuj program. Pokud ti tam delaji neco "za zady" jako ze si to nastavi na interrupt, timer a tak, tak je klidne muzes prepsat, aby to delaly jak potrebujes. (knihovna neni svaty obrazek, je to naprosto normalni kod, jako kazdy jiny)

wes server
Příspěvky: 8
Registrován: 08 kvě 2018, 00:46
Reputation: 0

Re: spi rfid+sd

Příspěvek od wes server » 20 čer 2018, 15:31

Knihovnu se tedy pokusím nějak pochopit a upravit, ale nevím jak dlouho to bude trvat (snad ne dlouho). A ještě mě napadlo tu čtečku RFID připojit přes i2c, myslím že by to jít mělo, ale nepovedlo se mi najít příklady ke knihovnám které to umí, tak kdyby někdo věděl budu rád.

wes server
Příspěvky: 8
Registrován: 08 kvě 2018, 00:46
Reputation: 0

Re: spi rfid+sd

Příspěvek od wes server » 20 čer 2018, 20:24

a ještě jedna věc: když hned na začátek loopu dám přehrání zvuku test a hned potom delay( delka pisnicky), tak se písnička přehraje a potom kod pokračuje tím že nenajde kartu a loop se opakuje

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host