X-Git-Url: https://vault307.fbx.one/gitweb/micorpython_ir.git/blobdiff_plain/d60573594da7d18c86ff2bfd954a86a23eebcbe9..8ed1c53cbe389c2ee8a30dfa17853199fed4ae49:/ir_tx.py diff --git a/ir_tx.py b/ir_tx.py index 0697d9a..4a91336 100644 --- a/ir_tx.py +++ b/ir_tx.py @@ -6,7 +6,6 @@ # Copyright (c) 2020 Peter Hinch from pyb import Pin, Timer -from time import sleep_us, sleep from micropython import const from array import array import micropython @@ -27,18 +26,16 @@ _T2_RC6 = const(889) # IR abstract base class. Array holds periods in μs between toggling 36/38KHz # carrier on or off. Physical transmission occurs in an ISR context controlled -# by timer 2 and timer 5. -# Operation is in two phases: .transmit populates .arr with times in μs (via -# subclass), then initiates physical transmission. +# by timer 2 and timer 5. See README.md for details of operation. class IR: def __init__(self, pin, freq, asize, duty, verbose): tim = Timer(2, freq=freq) # Timer 2/pin produces 36/38KHz carrier self._ch = tim.channel(1, Timer.PWM, pin=pin) self._ch.pulse_width_percent(_SPACE) # Turn off IR LED - self._duty = duty + self._duty = duty if not _SPACE else (100 - duty) self._tim = Timer(5) # Timer 5 controls carrier on/off times - self._tcb = self._cb + self._tcb = self.cb # Pre-allocate self.verbose = verbose self.arr = array('H', 0 for _ in range(asize)) # on/off times (μs) self.carrier = False # Notional carrier state while encoding biphase @@ -51,9 +48,9 @@ class IR: self.tx(addr, data, toggle) self.append(_STOP) self.aptr = 0 # Reset pointer - self._cb(self._tim) # Initiate physical transmission. + self.cb(self._tim) # Initiate physical transmission. - def _cb(self, t): # T5 callback, generate a carrier mark or space + def cb(self, t): # T5 callback, generate a carrier mark or space t.deinit() p = self.aptr v = self.arr[p] @@ -88,18 +85,44 @@ class NEC(IR): self.append(9000, 4500) if addr < 256: # Short address: append complement addr |= ((addr ^ 0xff) << 8) - for x in range(16): + for _ in range(16): self._bit(addr & 1) addr >>= 1 data |= ((data ^ 0xff) << 8) - for x in range(16): + for _ in range(16): self._bit(data & 1) data >>= 1 - self.append(_TBURST,) + self.append(_TBURST) def repeat(self): self.aptr = 0 - self.append(9000, 2250, _TBURST) + self.append(9000, 2250, _TBURST, _STOP) + self.aptr = 0 # Reset pointer + self.cb(self._tim) # Initiate physical transmission. + +# NEC protocol +class SONY(IR): + + def __init__(self, pin, bits=12, freq=40000, verbose=False): # Sony specifies 40KHz + super().__init__(pin, freq, 3 + bits * 2, 30, verbose) + if bits not in (12, 15, 20): + raise ValueError('bits must be 12, 15 or 20.') + self.bits = bits + + def tx(self, addr, data, ext): + self.append(2400, 600) + bits = self.bits + v = data & 0x7f + if bits == 12: + v |= (addr & 0x1f) << 7 + elif bits == 15: + v |= (addr & 0xff) << 7 + else: + v |= (addr & 0x1f) << 7 + v |= (ext & 0xff) << 12 + for _ in range(bits): + self.append(1200 if v & 1 else 600, 600) + v >>= 1 # Philips RC5 protocol