PIN pour émission sur chip Aurel

Bonjour,

je suis totalement débutant.

J'essaie d'utiliser un Arduino Mega avec chip Aurel (acheté sur nodo-shop) pour émettre des messages radio.

Le manuel de l'ensemble est dispo sur ce lien. et le manuel du chip Aurel est dispo ici.

Mes difficultés portent sur l'init / modif des valeurs des PINs.

Le manuel de nodo-shop dit

Arduino RFLink
5V 5V
GND GND
D14 DAT IN Transceiver
D15 TX / RX Transceiver
D19 DAT OUT Transceiver
D20 SDA I2C
D21 SCL I2C
D22 ENABLE Transceiver
D49 CS
D51 MOSI
D50 MISO
D52 SCK
D46
D47

D'après la page 3 du manuel du chip Aurel, j'ai l'impression que pour être en émission, il faut :
Data IN (Aurel PIN 4, Arduino PIN 14) à 1 ?
TX/RX (Aurel PIN 5, Arduino PIN 15) à 1
ENABLE (Aurel PIN 6, Arduino PIN 22) à 1
Data Out (Aurel PIN 9, Arduino PIN 19) "connected to pull down" ?

Ai-je bien compris ?

Et au-delà, sauriez-vous proposer une modif des connexions PINs dans le script suivant (réalisé pour une autre config matérielle) pour que cela marche avec mon chip ?

#include <SerialTerminal.hpp>

#define PIN_RF_TX_VCC               15                                          // +5 volt / Vcc power to the transmitter on this pin
#define PIN_RF_TX_DATA              14                                          // Data to the 433Mhz transmitter on this pin

// Variables
byte ERS_pin = PIN_RF_TX_DATA;
int long_pulse = 825;
byte message[17] = {0x00, 0x00, 0x00, 0x7E, 0x44, 0xAE, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0xFF, 0x80};
byte old_state, num_byte;
byte bitstuff = 0;
maschinendeck::SerialTerminal* term;

void writeBit(bool Bit) {
  old_state = !old_state;
  digitalWrite(ERS_pin, old_state);
  delayMicroseconds(long_pulse);

  if (Bit) {
    old_state = !old_state;
    digitalWrite(ERS_pin, old_state);
  }
  delayMicroseconds(long_pulse);
}

void conversion(byte input) {
  for (byte n = 0; n < 8; n++) { // boucle pour chaque bit
    writeBit(bitRead(input, n));
    if (num_byte >= 4 && num_byte <= 14) {
      if (bitRead(input, n) == 1)
        bitstuff++;  // incrémente le compteur bitstuffing
    }
    if (bitRead(input, n) == 0)
      bitstuff = 0;
    if (bitstuff >= 5) {
      writeBit(0);
      bitstuff = 0;
    }
  }
}

void commande(byte prechauffage, byte chauffage) {
  if ((chauffage <= 100) and ((prechauffage==0) or (prechauffage==3) or (prechauffage==4))) {
    for (byte x = 0; x < 3; x++) { // boucle de 3 messages
      old_state = 0;
      message[9] = x;  // numero message : 0 à 2
      if (x == 2) {
        message[10] = prechauffage;
      } else {
        message[10] = prechauffage + 0x80;
      }
      message[11] = chauffage;
      
      int checksum = 0;
      for (int i = 4; i <= 12; i++) {
        checksum -= message[i];
      }
      message[13] = highByte(checksum);
      message[14] = lowByte(checksum);

      Serial.println("Trame envoyée : ");
      for (byte i = 1; i <= 16; i++) {
        if (message[i] <= 0x0F)
          Serial.print("0");
        Serial.print(message[i], HEX);
      }
      Serial.println("");
      for (num_byte = 1; num_byte < 17; num_byte++) { // boucle de 16 bytes
        conversion(message[num_byte]);
      }
      digitalWrite(ERS_pin, LOW);
      delay(33);
    }
    digitalWrite(ERS_pin, LOW);
  } else {
    return;
  }
}

void ERS_command(String opts) {
  digitalWrite(LED_BUILTIN, HIGH);
  maschinendeck::Pair<String, String> operands = maschinendeck::SerialTerminal::ParseCommand(opts);
  int mode = operands.first().toInt();
  Serial.print("Mode : ");
  switch (mode) {
    case 0:
      Serial.println("Réduit");
      break;
    case 3:
      Serial.println("Confort");
      break;
    case 4:
      Serial.println("Hors gel");
      break;
    default:
      Serial.print("Inconnu (");
      Serial.print(mode);
      Serial.println(")");
  }
  
  Serial.print("Température d'eau ");
  Serial.print(operands.second());
  Serial.println(" degré(s)");
  
  commande(mode,operands.second().toInt());   // reduit 0, confort 3, hors gel 4, chauffage 0 à 100
  Serial.print("Commande envoyée");
  digitalWrite(LED_BUILTIN, LOW);
}

void setup() {
  pinMode(PIN_RF_TX_DATA, OUTPUT);                                              // Initialise in/output ports
  pinMode(PIN_RF_TX_VCC,  OUTPUT);                                              // Initialise in/output ports
  digitalWrite(PIN_RF_TX_VCC,HIGH);                                             // turn VCC to RF transmitter ON
  digitalWrite(ERS_pin, LOW);
  pinMode (LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
 
  term = new maschinendeck::SerialTerminal(57600);
  term->add("ERS", &ERS_command, "ERS mode heat\nmode : 0=Reduit, 3=Confort, 4=Hors gel\nheat : Température de chauffage entre 0 et 100");
}


void loop() {
 term->loop();
}

Merci beaucoup pour votre aide

Bonjour

Pour émettre : mettre ENABLE à 1, puis TX(Aurel) à 1 et ensuite envoyer par la sortie TX Arduino les données en série sur l'entrée Data IN du module Aurel

Pour recevoir : mettre ENABLE à 1, Puis TX(Aurel) à 0 en ensuite réceptionner dans l'entrée RX Arduino les données provenant de la sortie Data Out du module Aurel

En dehors de phases d'émission ou de réception il est possible de mettre en veille le module AUREL en metant ENABLE à 0

Est-ce que ceci irait (à moitié récupéré d'une autre source qui marchait en réception, et que j'ai essayé d'adapter pour l'émission)... ? Quelles sont les corrections à apporter ? (j'ai regroupé les parties concernés au début a priori)

Merci beaucoup... !

#include <SerialTerminal.hpp>

#define TRANSCEIVER_TX_PIN      19    // Set the pin that sends data to your 433.42 Mhz Transmitter
#define TRANSCEIVER_MODE_PIN    15    // Aurel transceivers have a pin that let the hardware switch to RX and TX mode
#define TRANSCEIVER_ENABLE_PIN  22    // Aurel transceivers have a pin that must be set to HIGH to enable the transmitter
#define TRANSCEIVER_TX HIGH
#define TRANSCEIVER_RX  LOW

// Variables
byte ERS_pin = TRANSCEIVER_TX_PIN;
int long_pulse = 825;
byte message[17] = {0x00, 0x00, 0x00, 0x7E, 0xFF, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0xFF, 0x80};
byte old_state, num_byte;
byte bitstuff = 0;
maschinendeck::SerialTerminal* term;

void setup() {
  // set the Aurel transceiver to TX mode
  pinMode(TRANSCEIVER_MODE_PIN, INPUT);
  digitalWrite(TRANSCEIVER_MODE_PIN, TRANSCEIVER_TX);

  // enable Aurel transmitter
  pinMode(TRANSCEIVER_ENABLE_PIN, INPUT);
  digitalWrite(TRANSCEIVER_ENABLE_PIN, HIGH);

  delay(500);

  // assign an interrupt on pin x on state change
  pinMode(TRANSCEIVER_TX_PIN, OUTPUT);
  
  digitalWrite(ERS_pin, HIGH);
  pinMode (LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
 
  term = new maschinendeck::SerialTerminal(57600);
  term->add("ERS", &ERS_command, "ERS mode heat\nmode : 0=Reduit, 3=Confort, 4=Hors gel\nheat : Température de chauffage entre 0 et 100");
}

void writeBit(bool Bit) {
  old_state = !old_state;
  digitalWrite(ERS_pin, old_state);
  delayMicroseconds(long_pulse);

  if (Bit) {
    old_state = !old_state;
    digitalWrite(ERS_pin, old_state);
  }
  delayMicroseconds(long_pulse);
}

void conversion(byte input) {
  for (byte n = 0; n < 8; n++) { // boucle pour chaque bit
    writeBit(bitRead(input, n));
    if (num_byte >= 4 && num_byte <= 14) {
      if (bitRead(input, n) == 1)
        bitstuff++;  // incrémente le compteur bitstuffing
    }
    if (bitRead(input, n) == 0)
      bitstuff = 0;
    if (bitstuff >= 5) {
      writeBit(0);
      bitstuff = 0;
    }
  }
}

void commande(byte prechauffage, byte chauffage) {
  if ((chauffage <= 100) and ((prechauffage==0) or (prechauffage==3) or (prechauffage==4))) {
    for (byte x = 0; x < 3; x++) { // boucle de 3 messages
      old_state = 0;
      message[9] = x;  // numero message : 0 à 2
      if (x == 2) {
        message[10] = prechauffage;
      } else {
        message[10] = prechauffage + 0x80;
      }
      message[11] = chauffage;
      
      int checksum = 0;
      for (int i = 4; i <= 12; i++) {
        checksum -= message[i];
      }
      message[13] = highByte(checksum);
      message[14] = lowByte(checksum);

      Serial.println("Trame envoyée : ");
      for (byte i = 1; i <= 16; i++) {
        if (message[i] <= 0x0F)
          Serial.print("0");
        Serial.print(message[i], HEX);
      }
      Serial.println("");
      for (num_byte = 1; num_byte < 17; num_byte++) { // boucle de 16 bytes
        conversion(message[num_byte]);
      }
      digitalWrite(ERS_pin, LOW);
      delay(33);
    }
    digitalWrite(ERS_pin, LOW);
  } else {
    return;
  }
}

void ERS_command(String opts) {
  digitalWrite(LED_BUILTIN, HIGH);
  maschinendeck::Pair<String, String> operands = maschinendeck::SerialTerminal::ParseCommand(opts);
  int mode = operands.first().toInt();
  Serial.print("Mode : ");
  switch (mode) {
    case 0:
      Serial.println("Réduit");
      break;
    case 3:
      Serial.println("Confort");
      break;
    case 4:
      Serial.println("Hors gel");
      break;
    default:
      Serial.print("Inconnu (");
      Serial.print(mode);
      Serial.println(")");
  }
  
  Serial.print("Température d'eau ");
  Serial.print(operands.second());
  Serial.println(" degré(s)");
  
  commande(mode,operands.second().toInt());   // reduit 0, confort 3, hors gel 4, chauffage 0 à 100
  Serial.print("Commande envoyée");
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
 term->loop();
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.