Go Down

Topic: [completo] IrRemote send ma su tutti i pin (Read 318 times) previous topic - next topic

lestofante

Jun 06, 2014, 06:10 pm Last Edit: Jun 06, 2014, 06:12 pm by lesto Reason: 1
Ciao,

ultimamente ho avuo la necessità di pilotare parecchi apparati via telecomando. Il grosso problema è che la IrRemote usa un pin fisso (e necessariamente PWM) per creare il segnale modulato alla specifica frequenza.

Quindi ho implementato il tutto in SW, i valori sono er una portante a 38KHz o giù di lì. Tu passi un array di PARI elementi (ogni elemento è la durata us del segnale, alto, basso, alto, etc..), certo non sarà precisissimo (uso delayMicroseconds, qualcuno conosce di meglio?) ma funziona in modo dignitoso.

ecco la funzione (ATTENZIONE; disattiva gli interrupt per un bel pò, quindi non lamentatevi se vedete cose strane succedere):

Code: [Select]
void sendRaw(uint16_t* array, uint16_t sizeMess, byte pin){
 noInterrupts();
 
 uint8_t bit = digitalPinToBitMask(pin);
 uint8_t port = digitalPinToPort(pin);
 volatile uint8_t *out = portOutputRegister(port);

 boolean up = false;
 for (uint16_t count = 0; count < sizeMess; count++){
   up = !up;
   if (up){
     uint16_t volte = array[count]/(DELAY_US*2);
     for(uint16_t i=0; i<volte;i++){
       *out |= bit; //HIGH
       delayMicroseconds(DELAY_US);
       *out &= ~bit; // LOW
       delayMicroseconds(DELAY_US);
     }
   }else{
     *out &= ~bit; // force LOW
     delayMicroseconds(array[count]);
   }
 }
 
 interrupts();
}


ah, per modulare a 38KHz, se non erro, uso un
Code: [Select]
unsigned long DELAY_US = 7;
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Go Up