Outils pour utilisateurs

Outils du site


e45-ttl-100

Ceci est une ancienne révision du document !


Le transceiver (émetteur/récepteur) LoRa E45-TTL-100

  • Basé sur le SX1276 de semtech.
  • “E32-868T20D”
  • Pilotable avec un UART.
  • Mono canal.
  • 100 mW
  • Pas de support pour le RSSI (Radio Signal Strength Indicator)
  • Consommation un peu trop élever pour être alimenté par le 3.3V de l'ESP32.

Fabrication d'un kit de mesure du signal LoRa

2 Modules :

  • Une module mobile qui emet des messages et mesure la qualité du signal et le débit (ou meilleut spread factor) utilisable.
  • Une simili gateway fixe qui répond au message LoRa

Algorithme de négociation du spread factor :

  • Si pas de méssage valide depuis linkDeadTimeout, on écoute sur le plus gros SF.
  • Si validMessageCountSpeedIncreaseThreshold messages séquentielle valides reçu alors on tente d'augmenter le SF
  • Si on a reçu speedIncreaseRequestCount demandes séquentielles valides de changement de SF on change de SF.
  • Si on a pas reçu de message depuis tooFastTimeout on décrémente le SF.
  • Après un retour à la normal suite à un tooFastTimeout on ne retente pas l'augmentation de SF avant un temps waitBeforeSpeedIncreaseInterval
  • La gateway acquitte les méssages en retournant le message avec le numéro de sequence incrémenté.
  • Tant qu'un message n'est pas acquitté il est retransmis.
  • linkDeadTimeout > 2 x tooFastTimeout
  • tooFastTimeout dépend du SF tel que tooFastTimeout > 2 x messageTransmissionTime
  • messageTransmissionTime = messageSize / SFdebit
  • waitBeforeSpeedIncreaseInterval > 10 * messageTransmissionTime ?

Contenu des messages :

  • indicateur de session
  • indicateur de sequence
  • SF demandé

Code :

Gateway

String sessionId = random; int seqId = 0; byte requestedSpreadFactor = 0; int sequentialValidMessages = 0; int speedIncreaseReqCount = 0;

long lastValidMessageReceivedTimestamp = now();

while(lastValidMessageReceivedTimestamp + LINK_DEAD_TIMEOUT > now()) {

while (lastMessageSentTimestamp + TOO_FAST_TIMEOUT > now()) {
  String message = receiveMessage();
  
}
  

}

Emetteur

SPEED_INC_VALID_MSG_COUNT = SPEED_INC_REQ_COUNT = TOO_FAST_TIMEOUT = LINK_DEAD_TIMEOUT = WAIT_ACK_TIMEOUT = MIN_AIR_RATE = 0; MAX_AIR_RATE = 5;

String sessionId = random; int seqId = 0; byte requestedAirRate = 0; int sequentialValidMessages = 0; int speedIncreaseReqCount = 0;

long lastValidMessageReceivedTimestamp = now();

while(lastValidMessageReceivedTimestamp + LINK_DEAD_TIMEOUT > now()) {

message = sessionId + "_" + seqId + "_";
if (sequentialValidMessages > SPEED_INC_VALID_MSG_COUNT) {
  message = message + (requestedAirRate + 1);
}
while (lastMessageSentTimestamp + TOO_FAST_TIMEOUT > now()) {
  // Try to send a message and get an ack for TOO_FAST_TIMEOUT
  
  sendMessage(message);
  long lastMessageSentTimestamp = now();
  while (lastMessageSentTimestamp + WAIT_ACK_TIMEOUT > now()) {
    // Try to get an ack for WAIT_RESPONSE_TIMEOUT
    
    String message = receiveMessage();
    int msgSessionId = message.substring();
    int msgSeqId = message.substring();
  
    if (msgSessionId == sessionId && msgSeqId == seqId + 1) {
      sequentialValidMessages += 1;
      int msgRequestedAirRate = message.substring();
      if (msgRequestedAirRate == requestedAirRate + 1) {
        speedIncreaseReqCount += 1;
      
        if (speedIncreaseReqCount > SPEED_INC_REQ_COUNT) {
          speedIncreaseReqCount = 0;
          requestedAirRate = min(requestedAirRate + 1, MAX_AIR_RATE);
          configLora(requestedSpreadFactor);
        }
      }
    
      seqId = msgSeqId + 1;
      lastValidMessageReceivedTimestamp = now();
    
    } else {
      sequentialValidMessages = 0;
    }
  }
}

if (lastMessageSentTimestamp + TOO_FAST_TIMEOUT > now()) {
  sequentialValidMessages = 0;
  requestedAirRate = max(requestedAirRate - 1, MIN_AIR_RATE);
}

}

Ressources

e45-ttl-100.1547677252.txt.gz · Dernière modification : 2019/01/16 22:20 de bigMax