Sx1278 sur arduino méga

Bonjour à tous,
Je voudrais ajouter un SX1278 à mon projet, qui communiquera avec un autre sur ESP32. Ce dernier centralisera tous les messages reçus de mes équipements (conception airsoft). Je n'arrive pas à le faire fonctionner sur le Mega, mais sur l'ESP32, il fonctionne parfaitement. Voici le code utilisé pour les tests et le message d'erreur. Merci.

TEST INITIALISATION LoRa <<<
SPI initialisé
Initialisation SPI/LoRa... ÉCHEC :cross_mark:

#include <SPI.h>
#include <RH_RF95.h>

// Définir les pins pour LoRa
#define RFM95_CS   10
#define RFM95_RST  42
#define RFM95_INT   8
#define RFM95_SCK  13
#define RFM95_MISO 12
#define RFM95_MOSI 11

RH_RF95 rf95(RFM95_CS, RFM95_INT);  // Utilisation des pins définies pour CS et DIO0

void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println(F(">>> TEST INITIALISATION LoRa <<<"));

  // Initialisation du SPI
  SPI.begin();
  Serial.println(F("SPI initialisé"));

  pinMode(RFM95_RST, OUTPUT);
  digitalWrite(RFM95_RST, LOW);
  delay(100);
  digitalWrite(RFM95_RST, HIGH);
  delay(100);

  Serial.print(F("Initialisation SPI/LoRa... "));
  if (!rf95.init()) {
    Serial.println(F("ÉCHEC ❌"));
    while (true);  // Bloque si l'initialisation échoue
  }
  Serial.println(F("OK ✅"));

  // Essayer une fréquence différente si celle-ci ne fonctionne pas
  Serial.print(F("Réglage fréquence 433 MHz... "));
  if (!rf95.setFrequency(433.0)) {
    Serial.println(F("ÉCHEC ❌"));
    while (true);  // Bloque si la fréquence ne peut pas être définie
  }
  Serial.println(F("OK ✅"));

  rf95.setTxPower(13, false);  // Puissance d'envoi réglée à 13 dBm
  Serial.println(F("Prêt à envoyer."));
}

void loop() {
  Serial.println(F("Envoi test..."));
  const char* msg = "Ping";
  rf95.send((uint8_t*)msg, strlen(msg));
  rf95.waitPacketSent();
  Serial.println(F("Message envoyé."));
  delay(5000);  // Attendre 5 secondes avant d'envoyer à nouveau
}

Bonjour,

C'est quoi un SX1278 ?!..

A suivre...

Ce circuit fonctionne en 3.3V. As-tu pris les précautions nécessaires pour l'interfacer avec une Mega?

C'est un module de communication LoRa en 433 MHz à longue portée. Oui, il est bien en 3,3 V sur mon Arduino.

Oui, mais les signaux d'interface attendent aussi du 3.3V. Est-ce que le module assure l'adaptation de niveau?

Désolé, je suis débutant et je ne comprends pas ce que vous voulez dire.
Le module LoRa est alimenté en 3,3V, donc je ne pense pas qu'il y ait de problème de niveau de tension. Les signaux d'interface devraient aussi être en 3,3V, ce qui devrait être compatible avec mon Arduino qui fonctionne en 3,3V. Est-ce que vous pensez à autre chose, comme un éventuel problème avec les broches ou les niveaux de signal ?

La Mega a un ATmega2560 qui fonctionne en 5V et les signaux en sortie ont un niveau haut qui est à 5V.
Le Sx1278 attends sur ses entrées des signaux ayant un niveau haut à 3.3V MAX.

Le fait que tu alimentes le module LoRa par la sortie 3.3V de la Mega ne change en rien le niveau des sorties digitales de la Mega.

Ah ! Je ne savais pas. Comment puis-je faire du coup ?

Tu pourrais donner un lien sur ce module, sur le site du vendeur par exemple?

sx1278

Tu pourrais utiliser 2 circuits comme ci-dessous par exemple

Ou un seul comme celui-ci

Bonsoir

ce petit circuit imprimé comporte un module Ra-01 d'AI Thinker.

Sous le capot du Ra-01 un circuit intégré SX1278 de Semtech , transceiver LoRa 433MHz(Data Sheet) et quelques composants (schéma Ra-01) mais pas d'apaptation de niveau logique 5V vers 3,3V

Il faut donc impérativement ajouter une adaptation de niveau logique 5V -> 3,3V pour tous les signaux SPI envoyés depuis la carte Mega vers module (SCK, MOSI, NSS)
Sans cette adaptation ni le fonctionnement ni la survie du SX1278 sont garantis

J'ai commandé deux TXB0108 pour 4 €. Merci pour toutes ces informations. :+1:

Merci je viens de commander 2 TXB0108 pour régler le problème. Merci

Sinon un pont diviseur pour passer du 5v à 3,3v, je le fais pour des écrans tft qui ont un niveau logique à 3,3v.

vous pouvez me donné plus de details? merci

Tu peux le calculer ici pour passer du 5v à 3,3v:

R1 1Ω et R2 2Ω ? ça donne 3,3333333333.

Oui, pour passer de 5 à 3,3v, c'est un rapport de 1/2 pour les résistances. Pour mes tft je mets plutôt R1= 5k et R2=10k.

[humour]
1Ω et 2Ω en série sur 5 V ça donne un courant de 1,6 A :grinning_face:

Pas vraiment certain que la sortie de la mega tienne plus d'une pico seconde.
[fin humour]

Remarque :

  1. Le principe d'un pont ne résout le problème que dans le sens 5 V -> 3,3 V (Mega → SX1278).
    Dans l'autre sens SX1278 → Mega cela ne fonctionnera que parce que le micro de la Mega est un AVR dont le point de basculement est Vcc/2 soit 2,5 V. Le Mega prendra un signal de 3,3 V d'amplitude comme un signal HIGH.
    Saches que ce ne sera pas obligatoirement valable avec un autre microcontrôleur.

  2. Attention au câblage du pont. L'I2C est très lente (400 khz max), le SPI, qui est utilisé par le SX1278, peut être très rapide.
    Avec un avr (horloge 16 MHz) la fréquence max du SPI est de 8 MHz, avec un ESP32, elle est à coup sûr de 20 Mhz et probablement de 40 MHz.

Les bibliothèques ont tendance à utiliser des valeurs élevées de l'horloge du SPI, la bibliothèque du SX1278 que j'ai regardé plaçait avec un ESP32-C3 le SPI à 20 MHz. On peut bien sûr baisser cette fréquence, mais ce n'est pas toujours simple.

A 20 MHz, pour réaliser le pont, il faudra câbler les résistances avec des longueurs de fils très courtes.
J'aurais tendance à plutôt conseiller un circuit spécialisé dans la translation de niveaux.

Néanmoins, je ne résiste pas à donner quelques conseils pratiques pour calculer pour définir un pont.

Pour définir un pont, je conseille de ne pas utiliser "classiquement" la formule tout aussi classique : Vout = Vcc * R2 / (R1+R2) que l'on voit partout.

Cette "formulation" de la "formule" est focalisée sur la tension et cache la notion de courant dans le pont. Notion qui est très importante quand c'est une sortie de microcontrôleur qui pilote le pont.

Si on remarque que terme Vcc / (R1+R2) n'est rien d'autre que le courant Ip dans le pont.
On peut écrire simplement Vout = R2 * Ip

Et maintenant, c'est le concepteur qui fixe le courant dans le pont comme point de départ, c'est-à-dire le courant que devra fournir la sortie du microcontrôleur.
C'est bien un choix de la responsabilité du concepteur.

Prenons Ip = 1 mA.
Pourquoi 1 mA ?
Parce que la datasheet du microcontrôleur de la Mega dit qu'il ne faut pas dépasser 20 mA et qu'avec un courant de 20 mA, le niveau de sortie n'est plus 5 V (Vcc) mais 4,6 V (Vcc-0,4 V) .

Comme 1 mA est très suffisant, il est inutile de se frotter aux limites du micro.

Dans tous les calculs, j'utiliserai une seule formule, celle de la loi d'ohm → U = R x I
Qui peut se triturer en R = U / I.
U en volt
R en ohm
I en ampère

Calcul :

La tension Vout théorique doit être de 3,3 V.

Info : la norme habituelle est qu'un circuit numérique considèrera comme un 1 logique tout signal supérieur à 0,7 fois Vcc. Soit pour le SX1278 : S>0,7*3.3 = 2,31 V

Il nous faut délivrer sur le SX1278 un signal supérieur à 2,31 V et ne pas dépasser 3,3V.

Je choisis Vout = 3,0 V.
Pourquoi ?
Avec 3,0 V je ne risque pas de dépasser 3,3V si la valeur d'une résistance "chinoise" est "un peu hors limites" et dans l'autre sens comme il y a toujours de l'atténuation dans les fils de liaison, je ne risque pas d'être inférieur à 2,31 V.

Remarque : cela fait un peu recette de cuisine, c'est très influencé par mon expérience tout ce qu'il y a de personnelle.

Loi d'ohm → Vout = R2 x I p
et R2 = U / I = 3,0 V / 0,001 A = 3000 Ω

C'est très simple de calculer R2 (bon je n'ai pas pris exactement 1 mA au hasard non plus) :grinning_face:

Pour R1 ce n'est pas plus compliqué
La tension aux bornes de R1 c'est la différence entre 5 V et 3,0 V = 2,0 V.
R1 = 2,0 / 0,001 = 2000 Ω

Pour finaliser le calcul :

  1. Tu recherches les valeurs normalisées les plus proches des valeurs théoriques
  2. Les valeurs théoriques qui viennent d'être calculées sont les valeurs de résistances minimales pour ne pas tirer plus que les 1 mA choisis.
    Rien n'interdit de choisir des valeurs supérieures ou inférieures en fonction des résistances disponibles au fond du tiroir.

Exemple de couple de valeurs (série E48 2%)
R1 3001 Ω
R2 = 2050 Ω
Vout = 5 * (3001/(3001+2050) = 2,97 V

1 Like