[SPI]Utiliser des périphériques avec des tensions différentes.

Bonjour,
J'ai actuelement un arduino Mega2560, un module Ethernet ENC28J60 en 5v et un module RFID en 3.3v

Je dispose de plusieurs CD4050 pour faire du level-shifting.

cependant je ne sais pas comment je doit cablé car il y a une différence de tension entre le module Ethernet et RFID.

J'ai essayé les deux modules indépendament et il marche sans problème.
pour l'ethernet j'avais brancher dirrectement sur le 5v de l'arduino,
pour le module RFID j'avais utiliser les CD4050 pour convertir le 5v en 3.3 et un deuxieme pour le 3.3v du miso vers 5v pour l'arduino.

Comment dois-je faire ?
Est-ce possible au moin ?

Je vous remercie.

Up please !
Merci
Timiti29

En fait je comprends pas vraiment ton problème, du moment que tu respectes les tensions de chaque module y'a pas de problème. Donc mis à part ton RFID qui doit avoir chacun de ses pin SPI derrière une porte du CD4050, y'a rien à changer.

Je vois pas vraiment ton questionnement vu que tu dis avoir déjà testé séparement

Bonjour,

Ton câblage de chaque module séparément marche ?
Si oui le problème n'en est pas un.

Tu branches exactement de la même façon que séparément en prenant juste soin de ne pas avoir la broche CS (chip select) au même endroit pour les deux modules.
C'est tout, c'est pas plus compliqué que ça :wink:

Bonjour,
Je poste donc mon schemas :

Je n'est pas mis de 4050 pour la liaison MISO entre le RFID et l'arduino car je n'obtient pas de bonne valeurs et par consequant, sa ne marche pas (bizard d'ailleurs)

bref, mon code ne fonctionnant pas, je penssais à un problème hardware.
le but du programme est de lire une carte RFID et quand il y en a une, on envoie les infos via une requete POST sur un serveur apache qui via un script php ajoute une entrée dans une basse de données MySQL.

J'ai donc bien ma lecture du tag, l'arduino dispose bien d'une adresse IP, ... mais je n'ai aucune trame (via wireshark sur mon pc)

Je pose le code pour ceux qui sont intérésé en piece jointe

Pourquoi n'est-je aucune trame ?

Merci
Timiti29

test1_Add_new.ino (25.9 KB)

Rajoute une diode (1N4148 ou assimilé) entre le MISO de l'ethernet et la ligne MISO 3v3/arduino.
Actuellement quand ton module ethernet parle il balance du 5v dans la ligne MISO commune qui va directement au module 3v3.
Ça a pas du faire de dégât mais ce serait bien de rajouter cette diode.

Bon sinon ton problème vient à coup sur du code, mais je t'avouerai que je j'ai pas eu le courage de le lire en entier.
Juste un conseil :

#define disMFRC digitalWrite(chipSelectPin, HIGH);
// ...
disMFRC 
// ...

C'est juste horrible à lire.

#define disMFRC() digitalWrite(chipSelectPin, HIGH)
// ...
disMFRC();
// ...

C'est tout de suite plus propre.

A mon avis tu as un problème de chipselect, actuellement c'est vraiment brouillon la façon dont tu sélectionne / désélectionne les modules.

Travail par bloc : tu sélectionnes X, tu fait ton truc avec X, tu désélectionnes X, le tout dans le même bloc.
Ton truc au début avec la partie ethernet qui vient ce mettre entre deux morceaux de lecteur mifare c'est typiquement le genre de truc qui va foutre la merde. Pour peu qu'en plus il y ait un timing précis à respecter pour l'initialisation c'est foutu.

Merci pour les propositions d'améliorations,

j'ai fait ce schemas avec la diode :

Je ne sais pas si c'est sa que tu me proposais mais chez moi sa ne fonctionne pas, mon lecteur ne lit plus mon tag avec la diode.
J'ai utilisé une 1N4148 comme l'image :

Merci.
Timiti29

sans vouloir faire mon chieur, mais tu voudrais pas modifier ton premier post dans le titre? utiliser au lieu de utilisé, ça me choque grave depuis quelque temps... :wink:

merci!

Faute corigé, désolé de cette erreur.

Timiti29

Il y a de l'idée mais moi je voyais pas le diode de ce côté mais sur le côté MISO ethernet.
Le but c'est de faire tomber le 5v à du ~3v3, une diode 1n4148 a une tension de jonction de ~0.6v en en mettant 3 en série tu arrives à quasiment 3v3 en partant de 5v.
Sinon il y a plus simple, une diode zener 3v3 entre MISO et GND mais je sait pas si tu en as.

Pour un de mes futurs projets je pense utiliser ce système pour adapter les voltages:

Issu de cette note d'application: http://www.semiconductors.philips.com/acrobat/applicationnotes/an97055.pdf

Est ce quelqu'un a relevé le schéma des petits modules que l'on trouve sur ebay ?

module_i2c_ebay.jpg

68tjs:
Est ce quelqu'un a relevé le schéma des petits modules que l'on trouve sur ebay ?

C'est un truc ultra classique :

Ok, c'est le schéma de la note d'application Philips.

68tjs:
Ok, c'est le schéma de la note d'application Philips.

Ben oui pourquoi chercher plus compliqué :grin:

Tatata j'aime bien rendre à César ce qui appartient à Jules.
Sparkfun a signé de son nom un schéma qui n'est pas de lui mais de Philips.
Il y a là un "détail", peut être pas visible par tous, mais moi j'y suis sensible.

Un truc m'échappe

Le schéma utilisant le MOSFET est sensé être bidirectionnel, ce qui est indispensable pour de l'I2C puisque les 2 signaux le sont.

Par contre le schéma de l'adaptateur Sparkfun donne pour chaque "channel" un adaptateur bidirectionnel et un pont diviseur qui ne va que dans le sens HV vers LV.

Une raison ?

68tjs:
Est ce quelqu'un a relevé le schéma des petits modules que l'on trouve sur ebay ?
...
Ok, c'est le schéma de la note d'application Philips.

Et a quoi correspond alors le chip à 5 pattes en haut ?

Bonjour, j'ai recu un convertiseur LJ245A pour convertir mon 3v en 5v j'ai donc effectuer le branchement.

mais je n'arrive toujour pas a faire marcher mon programme.

J'ai donc mes deux composants branché en meme temps et quand j'essaye un programme qui utilise juste le lecteur RFID il lit tout de travers j'ai pas les bonnes donnée.
par contre quand je test un programme qui utilise juste le module ethernet sa marche, j'ai bien ma page qui s'affiche par exemple.

Le problème ne peut que ce situé au niveau hardware car pour le lecteur RFID je ne lit pas les bonnes infos meme en desactivant le CS du module ethernet avec un digitalwrite à HIGH

Je ne vois pas ou est le problème.

Merci à vous.
Timiti29

PS j'utilise cette librairie : GitHub - miguelbalboa/rfid: Arduino RFID Library for MFRC522 pour le module RFID
et GitHub - njh/EtherCard: EtherCard is an IPv4 driver for the ENC28J60 chip, compatible with Arduino IDE pour le module Ethernet ENC28J60
pour le module ethernet j'ai modifier le code pour qu'il utilise la librairie SPI au lieux de travailler directement avec les registres interne

j'ai donc effectué les modif suivante dans le fichier enc28j60.cpp:
#include <SPI.h>
puis les fonctions modifier :

static byte readOp (byte op, byte address) {
    enableChip();
/*    xferSPI(op | (address & ADDR_MASK));
    xferSPI(0x00);
    if (address & 0x80)
        xferSPI(0x00);
    byte result = SPDR;*/
    byte result;
    result = SPI.transfer(op | (address & ADDR_MASK));
    result = SPI.transfer(0x00);
    if(address & 0x80)
	result = SPI.transfer(0x00);
    disableChip();
    return result;
}

static void writeOp (byte op, byte address, byte data) {
    enableChip();
    //xferSPI(op | (address & ADDR_MASK));
    //xferSPI(data);
    SPI.transfer(op | (address & ADDR_MASK));
    SPI.transfer(data);
    disableChip();
}

static void readBuf(word len, byte* data) {
    enableChip();
    //xferSPI(ENC28J60_READ_BUF_MEM);
    byte result;
    result = SPI.transfer(ENC28J60_READ_BUF_MEM);
    while (len--) {
        //xferSPI(0x00);
        //*data++ = SPDR;
	result = SPI.transfer(0x00);
	*data++ = result;
    }
    disableChip();
}

static void writeBuf(word len, const byte* data) {
    enableChip();
    //xferSPI(ENC28J60_WRITE_BUF_MEM);
    byte result = SPI.transfer(ENC28J60_WRITE_BUF_MEM);
    while (len--)
    {
        //xferSPI(*data++);
	SPI.transfer(*data++);
    }
    disableChip();
}

J'ai tester le code avec juste le module ethernet et sa marche.

Le code pour lire uniquement la carte RFID :

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 8
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);	// Create MFRC522 instance.
MIFARE_Key keyA;
byte bufferrfid[18];
String postval = "req=INSERT IGNORE INTO rfid(`id`, `type`,`b0s0`, `b0s1`, `b0s2`, `b0s3` ) VALUES('', '1'";
String postvaltmp[4] = {"", "", "", ""};
char c2h(char c)
{  return "0123456789ABCDEF"[0x0F & (unsigned char)c];
}
void setup() {
	Serial.begin(9600);	// Initialize serial communications with the PC
	SPI.begin();			// Init SPI bus
	mfrc522.PCD_Init();	// Init MFRC522 card
	Serial.println("Scan PICC to see UID and type...");
        byte keytmp[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
        for (byte i = 0; i < 6; i++) {
	        keyA.keyByte[i] = keytmp[i];
        }
}

void loop() {
	// Look for new cards
	if (mfrc522.PICC_IsNewCardPresent()) {
                Serial.println("Nouvelle carte Presente!");
                if (mfrc522.PICC_ReadCardSerial())
                {
                      Serial.println("Carte selectionnée !");
                      byte res = mfrc522.PCD_Authenticate(PICC_CMD_MF_AUTH_KEY_A, 0, &keyA, &(mfrc522.uid));
                      Serial.print("Res = ");
                      Serial.println(res);
                      if(res == STATUS_OK)
                      {
                            byte buffersize = 18;
                            for(byte i=0; i<4; i++)
                            {
                                  res = mfrc522.MIFARE_Read(i, bufferrfid, &buffersize);
                                  for(byte j=0; j<16; j+=2)
                                  {
                                      postvaltmp[i] += c2h((bufferrfid[j] >> 4) & 0x0F);
                                      postvaltmp[i] += c2h(bufferrfid[j+1] & 0x0F);
                                  }
                                  Serial.println("");
                            }
                            for(int i=0; i < 4; i++)
                            {
                                postval += ", '";
                                postval += postvaltmp[i];
                                postval += "'";
                            }
                            postval += ");";
                            Serial.println(postval);
                            mfrc522.PICC_HaltA();
                      }
                }
        }
	// Dump debug info about the card. PICC_HaltA() is automatically called.
	//mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

La variable potval contient une requette SQL et la variable postvaltmp est un tableau qui contient les valeur des 4 premier bloc d'un tag

up please

Merci
Timiti29