Auteur Sujet: Identification des trains par infrarouge  (Lu 20990 fois)

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1178
  • HO avec DCC++
    • Voir le profil
Re : Identification des trains par infrarouge
« Réponse #30 le: mai 12, 2025, 10:18:00 pm »
Voici le Gerber du récepteur.


bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1178
  • HO avec DCC++
    • Voir le profil
Re : Identification des trains par infrarouge
« Réponse #31 le: mai 13, 2025, 11:00:54 pm »
Bonsoir à tous,

En intégrant le fichier IRTimer.hpp (et juste celui là), le code de l'emetteur pour le Nano et pour l'ATtiny sont maintenant identiques.

J'ai fait les tests avec un ATtiny 45, les résultats sont là encore assez bluffants. Je crois que la qualité des composants VISHAY y est pour beaucoup et la modulation à 38 Khz aussi. J'ai regardé la datasheet du TSOP4838. C'est vraiment complet à l'intérieur pour filtre au mieux les signaux et garantir la qualité du traitement.

J'ai fait le Gerber pour l'ATtiny



Voici le code de l'emetteur qui est le même pour le Nano ou les ATtiny

#include <Arduino.h>

// Configuration du timer pour PWM IR
#  if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) || defined(__AVR_ATmega168__)
#define IR_USE_AVR_TIMER2  // Utilise Timer2 pour l'envoi (pin D3)
#define IR_SEND_PIN 3                   // Broche utilisée
#  elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
#define IR_SEND_PIN 4                   // Broche utilisée
#define IR_USE_AVR_TIMER_TINY1 // send pin = (pin 4) ATtiny25 / 45 / 85
#  endif

#define SEND_PWM_BY_TIMER  // Active le mode PWM matériel

#include "IRTimer.hpp"  // Part of Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote.


constexpr uint8_t ID = 0xA5;            // Identifiant à envoyer
constexpr uint16_t BIT_DURATION = 250;  // Durée minimale d'un front en µs

// Envoie un octet codé via LED IR
void sendByte(uint8_t value) {
  for (int i = 7; i >= 0; i--) {        // MSB
    bool bit = (value >> i) & 0x01;
    if (bit) {
      // 1
      disableSendPWMByTimer();
      delayMicroseconds(BIT_DURATION);
      enableSendPWMByTimer();
      delayMicroseconds(BIT_DURATION);
    } else {
      // 0
      disableSendPWMByTimer();
      delayMicroseconds(BIT_DURATION * 2);
      enableSendPWMByTimer();
      delayMicroseconds(BIT_DURATION * 2);
    }
  }
  // Fin de trame
    disableSendPWMByTimer();
    delayMicroseconds(BIT_DURATION * 4);
    enableSendPWMByTimer();
    delayMicroseconds(BIT_DURATION * 4);
}

void setup() {
  pinMode(IR_SEND_PIN, OUTPUT);
  timerConfigForSend(38);   // Fréquence IR : 38 kHz
  disableSendPWMByTimer();  // Démarre éteint
}

void loop() {
  sendByte(ID);
}


Le Gerber est téléchargeable ci-dessous.

Christophe