X-Git-Url: https://vault307.fbx.one/gitweb/micorpython_ir.git/blobdiff_plain/2cc41dced14dadbc4df94bc36bf72ecbda9c2c6a..a5c58e92f187b72111774f417d82238ec7e3b6eb:/TRANSMITTER.md?ds=inline diff --git a/TRANSMITTER.md b/TRANSMITTER.md index c29a0dd..4f15c65 100644 --- a/TRANSMITTER.md +++ b/TRANSMITTER.md @@ -31,7 +31,7 @@ The transistor type is not critical. The driver assumes circuits as shown. Here the carrier "off" state is 0V, which is the driver default. If using a circuit where "off" is required to be -3.3V, the constant `_SPACE` in `ir_tx.__init__.py` should be changed to 100. +3.3V, the class variable `active_high` should be set `False`. ## 1.2 ESP32 Wiring @@ -106,8 +106,18 @@ occurs as a background process, on the Pyboard controlled by timers 2 and 5. Execution times on a Pyboard 1.1 were 3.3ms for NEC, 1.5ms for RC5 and 2ms for RC6. +Class variable: + 1. `active_high=True` Normally the IR LED drive circuit turns the LED on if + the pin goes high. If it works with the opposite polarity the variable should + be set `False` before instantiating. + #### NEC class +Class `NEC`. Example invocation: +```python +from ir_tx.nec import NEC +``` + This has an additional method `.repeat` (no args). This causes a repeat code to be transmitted. Should be called every 108ms if a button is held down. @@ -121,6 +131,11 @@ A value passed in `toggle` is ignored. #### Sony classes +Classes `SONY_12`, `SONY_15` and `SONY_20`. Example invocation: +```python +from ir_tx.sony import SONY_15 +``` + The SIRC protocol supports three sizes, supported by the following classes: 1. 12 bit (7 data, 5 address) `SONY_12` 2. 15 bit (7 data, 8 address) `SONY_15` @@ -132,6 +147,11 @@ value. #### Philips classes +Classes `RC5` and `RC6_M0`. Example invocation: +```python +from ir_tx.philips import RC5 +``` + The RC-5 protocol supports a 5 bit address and 6 or 7 bit (RC5X) data. The driver uses the appropriate mode depending on the `data` value provided. @@ -141,6 +161,42 @@ Both send a `toggle` bit which remains constant if a button is held down, but changes when the button is released. The application should implement this behaviour, setting the `toggle` arg of `.transmit` to 0 or 1 as required. +#### Microsoft MCE class + +Class `MCE`. Example invocation: +```python +from ir_tx.mce import MCE +# MCE.init_cs = 3 +``` +There is a separate demo for the `MCE` class because of the need to send a +message on key release. It is run by issuing: +```python +from ir_tx.mcetest import test +``` +Instructions will be displayed at the REPL. + +I have been unable to locate a definitive specification: the protocol was +analysed by a mixture of googling and experiment. Behaviour may change if I +acquire new information. The protocol is known as OrtekMCE and the remote +control is sold on eBay as VRC-1100. + +The remote was designed for Microsoft Media Center and is used to control Kodi +on boxes such as the Raspberry Pi. With a suitable PC driver it can emulate a +PC keyboard and mouse. The mouse emulation uses a different protocol: the class +does not currently support it. Pressing mouse buttons and pad will cause the +error function (if provided) to be called. + +This supports a 4 bit address, 6 bit data and 2 bit toggle. The latter should +have a value of 0 for the first message, 1 for repeat messages, and 2 for a +final message sent on button release. + +The remaining four bits are a checksum which the driver creates. The algorithm +requires an initial 'seed' value which my testing proved to be 4. However the +only [documentation](http://www.hifi-remote.com/johnsfine/DecodeIR.html#OrtekMCE) +I could find stated that the value should be 3. I implemented this as a class +variable `MCE.init_cs=4`. This enables it to be changed if some receivers +require 3. + # 4. Principle of operation ## 4.1 Pyboard @@ -163,8 +219,7 @@ This is performed by two hardware timers initiated in the constructor. Timer 2, channel 1 is used to configure the output pin as a PWM channel. Its frequency is set in the constructor. The OOK is performed by dynamically changing the duty ratio using the timer channel's `pulse_width_percent` method: this varies -the pulse width from 0 to a duty ratio passed to the constructor. The NEC -protocol defaults to 50%, the Sony and Philips ones to 30%. +the pulse width from 0 to a duty ratio passed to the constructor. The duty ratio is changed by the Timer 5 callback `._cb`. This retrieves the next duration from the array. If it is not `STOP` it toggles the duty cycle @@ -180,18 +235,7 @@ The carrier is generated by PWM instance `.pwm` running continuously. The ABC constructor converts the 0-100 duty ratio specified by the subclass to the 0-1023 range used by ESP32. -# 5. References - -[General information about IR](https://www.sbprojects.net/knowledge/ir/) - -The NEC protocol: -[altium](http://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol) -[circuitvalley](http://www.circuitvalley.com/2013/09/nec-protocol-ir-infrared-remote-control.html) - -Philips protocols: -[RC5](https://en.wikipedia.org/wiki/RC-5) -[RC5](https://www.sbprojects.net/knowledge/ir/rc5.php) -[RC6](https://www.sbprojects.net/knowledge/ir/rc6.php) +## 4.3 Duty ratio -Sony protocol: -[SIRC](https://www.sbprojects.net/knowledge/ir/sirc.php) +In every case where I could find a specified figure it was 30%. I measured +that from a variety of remotes, and in every case it was close to that figure.