CircuitPython class to access the MFRC522 RFID reader
![medias/montage.jpg]
Based on the wendlers/micropython-mfrc522 MicroPython library.
Basic class to access RFID readers of the type MFRC522. This is basically a re-write of this Python port for the MFRC522. I tried to strip things down and make them more "pythonic" so the result is small enough to run on CircuitPython boards.
Put the modules mfrc522.py, examples/read.py, examples/write.py to the root of the flash FS on your board.
I used the following pins for my setup:
| Signal | GPIO RP2040 XIAO | Note |
|---|---|---|
| sck | D8 | |
| mosi | D10 | |
| miso | D9 | |
| rst | D6 | |
| cs | D7 | Labeled SDA on most RFID-RC522 boards |
Now enter the REPL you could run one of the two examples:
This will wait for a MifareClassic 1k card. As soon the card is detected, it is authenticated, and 16 bytes are read from address 0x08.
For detecting, authenticating and writing to a card:
import write
write.do_write()
This will wait for a MifareClassic 1k card. As soon the card is detected, it is authenticated, and 16 bytes written to address 0x08.
circuitpython/code.py :
lit le tag sur le lecteur (refactor du code de do_read.py), envoie l'uuid en controlChange midi (port 0 à 7) en 2 * 7bits.
nb: les uuid de tags nfc sont encodés en 4 * 8bits(0-255). Le midi supporte uniquement des nombres jusqu'à 7bits (0-127). Le nombre est découpé et envoyé en 2 * 7 bits (2
controlChangemidi) et reconstitué dans le code de lecture (en html et Processing, ici).
function messageMIDI(MidiEvent) { if (MidiEvent.data[1] != null) { console.log( "qui:",MidiEvent.target.name); const port = MidiEvent.data[1]; const valeur = MidiEvent.data[2]; // reconstitution du tag en 8 * 7 bits switch(port) { case 7: tag[Math.floor(port/2)] += valeur; document.body.innerHTML += `uuid : <strong>${tag[0].toString(16)} ${tag[1].toString(16)} ${tag[2].toString(16)} ${tag[3].toString(16)}</strong><br>`; break; default: if (port%2 == 0) { // debut de chiffre tag[Math.floor(port/2)] = valeur*128; } else { tag[Math.floor(port/2)] += valeur; console.log(`${tag[Math.floor(port/2)].toString(16)}`) } } } }
import themidibus.*; MidiBus bus; int tag[] = new int[4]; void setup() { MidiBus.list(); // 1 -> numero dans liste des input //MidiBus(java.lang.Object parent, int in_device_num, int out_device_num) bus = new MidiBus(this, 1,2); } void controllerChange(int channel, int number, int value) { switch(number) { case 7: tag[floor(number/2)] += value; println("uuid :",hex(tag[0],2),hex(tag[1],2),hex(tag[2],2),hex(tag[3],2)); break; default: //println(number,value,hex(value),"générique"); if (number%2 == 0) { // debut de chiffre tag[floor(number/2)] = value*128; } else { tag[floor(number/2)] += value; } } }
let table = []; let tag = []; //let index = 0; let oldTag = ""; window.addEventListener("keydown", (event) => { if (event.key !== undefined) { //console.log("reçu: ",event.code); switch (event.code) { case "Enter": // fin du tag // transform string to number //oldTag = tag.toString(); console.log("tag :",tag.join(":")); // vide tag; tag = []; break; case "KeyM": // fin du chiffre tag.push(parseInt(table.join("")).toString(16)); // vide table table = []; //index++; break; default: // remove "Digit" in the string and push in the array //console.log("code:",event.code,"key:", event.key) table.push(event.code.replace(/Digit/gm, "")); } } });
l'api Midi est supportée sur Chrome Desktop et mobile, sur Firefox Desktop (à condition de redémarrer le navigateur après branchement du lecteur+RP2040). Sur Edge et Opera Desktop (non testé). Safari ne supporte pas le midi.
est un exemple d'usage avec 3 tags qui permettent de scroller un contenu (une section de 100vh). envoi des uuid de tags en midi.
est en exmple d'usage avec 4 tags qui permettent de scroller un contenu. envoi des uuid de tags en HID (équivalents claviers)