-
• #2
The approach is to put a "both" edge watch on the IR receiver and
cap(ture)()
the times of raises and falls. Electrically - schema wise - the device has to run 5V - it did show no signals when powered by 3.3V. The IR receiver data pin - 1, left from front - is on Espruino(-Wifi) pin B0, center pin - 2 - is on 0V / Ground, and pin 3 - right from front - is on 5V (USB Bat/In on Espruino(-Wifi). The paper behind the IR receiver is just there to give it better visibility/contrast in the picture. I used the Espruino-Wifi just because it was just the most handy... ;-)In the
decode()
I first just listed the times in the console - line 28 - from which it was difficult to detect patterns, because all these floats 'floated/flooded my eyes' and made it just a blur. Next step was to calculate and value adjust the interval between the signal changes lines 23..25: still a blur in regard of patterns, but at least I could see some repeated interval values... To 'see' the prevailing interval values s, I sorted the intervals by value ascending, which showed the prevailing values as listed in lines 30..39.For the final pattern visualization, I used the average of two adjacent long intervals to to separate and map the interval values to characters and showed latter as a single string for each button... and that's what you see in the console output.
Once in a while, the start sequence was not very clean - as said: cheap and flimsy is the 'keyboard' of the RC. I noticed that id did not really matter how long the button is pressed: after getting finally getting started with the transmission, it finishes always the same way (
...*040-
, mostly, once...*140
), and after that, it is just a repetition of a 'hold' pattern (-090-090-...
). Pressing the buttons very briefly emitted a very different signals for one and the same button (R(ow)=0, C(ol)=1
). Repetition of all the 20 RC buttons showed also differences based on how well each of them made contact in the RC.The test sequence was pressing a button on the RC, then BTN (BTN1) on the Espruino-Wifi. To make it really usable, some more code is needed to watch for a sequence and then jump into the decoding... subject of a future post. And = may be .- the repurposing of the 8-legged atTiny85 style mcs w/ code (reverse-engineering / decompiling?) - that were removed from the lighting modules as well - for offloading Espruino from doing this IR RC receiver side of business.
// infraReceiverTest.js // (c)20181002 allObjects // B0 on Espruino-Wifi var t=[]; function cap(e){t.push(e.time);} var infraWid; function w() { // watch infraWid = setWatch(cap, B0 , {repeat:true,edge:"both",debounce:0}); } function uw() { // unwatch if (infraWid) infraWid = clearWatch(infraWid); } var s, c=-1, r=-1; function decode() { var l = t.length - 1; if (l<2) { t = []; return; } t.forEach(function(e,i){ if (i<l) t[i] = Math.floor((t[i+1] - e) * 100000)/1000; }); t.pop(); // t.sort(); // t.forEach(function(e){ console.log(e); }); var dummy=` (for legibility in the forum color schema) --- Prevailing Interval Values (* 100) ----: many .054, few .055 <0.056: 0 many .057, few .058, .059 <0.115: 1 many .169, few .170 <0.197: * many .225 <0.569: - 4, 9 > : Math.floor() `; s=""; t.forEach(function(e,i){ s += (e<0.056)?"0" :(e<0.115)?"1" :(e<0.197)?"*" :(e<0.569)?"-" : ""+Math.floor(e) ; }); c++; if (c % 4 === 0) { r++; c = 0; } console.log(r,c,":",s); t = []; } function onInit() { pinMode(B0,"input_pulldown"); w(); setWatch(decode, BTN1 , {repeat:true, edge:"falling", debounce:100}); console.log("R C : Data pattern..."); } setTimeout(onInit,100);
Console output (first block w/ some spaces removed and truncated for legibility in the forum):
` |_| espruino.com 2v00 (c) 2018 G.Williams > RC: Data pattern... (RowCol 00 is top left button on remote control) 00: 0-11111111111111111*1*1*1*111*1*1*11111111110101010*0*0*0*0*0*0*0*040-090- 01: 0-11011111111111010*1*1*1*111*1*1*1*010*0101010101010*010*0*0*0*0*040-090- 02: 0-11111111111111111*1*1*1*111*1*1*111*1111110101010*010*0*0*1*0*0*040-090- 03: 0-11111111111111101*1*1*1*111*1*1*1*1*11111111010101010*0*0*0*0*0*040-090- 10: 0-11111111111111111*1*1*1*111*1*1*11111*11110101010*0*010*0*0*0*0*040-090- 11: 0-11111111111111101*1*1*1*111*1*1*1*111*1111110101010*010*0*0*0*0*040-090- 12: 0-11111111101111111*1*1*1*111*1*1*111*1*11110101010*01010*0*0*0*0*040-090- 13: 0-11111111111110111*1*1*1*111*1*1*1*1*1*11110101010101010*0*0*0*0*040-090- 20: 0-11111111111111111*1*1*1*111*1*1*1111111*110101010*0*0*010*0*0*0*040-090- 21: 0-11111111111111111*1*1*1*111*1*1*1*11111*01010101010*0*010*0*0*0*040-090- 22: 0-11111111111111111*1*1*1*111*1*1*111*111*010101010*010*010*0*0*0*040-090- 23: 0-11111111111111111*1*1*1*111*1*1*1*1*111*0101010101010*010*0*0*0*040-090- 30: 0-11111111111111111*1*1*1*111*1*1*11111*1*010101010*0*01010*0*0*0*040-090- 31: 0-11111111111111111*1*1*1*111*1*1*1*111*1*01010101010*01010*0*0*0*040-090- 32: 0-11111111111111111*1*1*1*111*1*1*111*1*1*110101010*0101010*0*0*0*040-090- 33: 0-11111111111111111*1*1*1*111*1*1*1*1*1*1*01010101010101010*0*0*0*040-090- 40: 0-11111111111111111*1*1*1*111*1*1*111111110*0101010*0*0*0*010*0*0*040-090- 41: 0-11111111111110111*1*1*1*111*1*1*1*1111110*010101010*0*1*010*0*0*040-090- 42: 0-11111111111111111*1*1*1*111*1*1*111*11010*1101010*010*0*010*0*0*040-090- 43: 0-11111111111111101*1*1*1*111*1*1*1*1*11110*01010101010*0*010*0*0*040-090- 50: 0-11111111111111111*1*1*1*111*1*1*11111*110*0101010*1*010*011*0*0*040-090- 51: 0-11111111111111111*1*1*1*111*1*1*1*111*110*110101010*010*011*0*0*040-090- 52: 0-11111111111110111*1*1*1*111*1*1*111*1*110*0101111*11010*010*1*1*040-090- 53: 0-11111111111111111*1*1*1*111*1*1*1*1*1*111*0111111111011*010*1*0*140-190- ----- once in a while not a regular start: 0 1 : 710-11111111111111111*1*1*1*111*1*1*1*11111111110101010*0*0*0*0*0*0*040-090-090-090-0 ----- sitting 'for ever' on a button: 0 1 : 0-11111111111110111*1*1*1*111*1*1*1*11111111111101010*0*1*0*0*0*0*040-090-090-090-090-190-090-090-090-090-090-090-090-090-090-090-090-090-090-190-090-090-02568 ----- pressing only 'very briefly' multiple times the same button (with decent pauses): 0 1 : 0-011040-11111111111101010*1*1*1*001*1*1*1*01101111111011110*0*1*1*1*1*1*140-0 0 1 : 0-11001101010110101*1*1*0*101*1*0*1*01011011111100111*1*0*1*1*1*1*140-0 0 1 : 0-11011011011111110*1*1*1*101*1*1*1*01111111111101010*1*1*1*1*1*1*140-0 0 1 : 0-11110010101101010*1*1*1*010*1*0*0*11111111110101111*1*1*1*1*1*1*140-090-0 0 1 : 0-10111011110111010*1*1*1*110*1*0*1*01011111111011111*1*1*1*1*1*1*140-090-0 0 1 : 0-11111011110110110*1*1*1*110*1*0*0*11010111110101010*1*1*1*1*1*1*140-0 `
Many of the lighting devices -multi color 'bulbs', strips, modules, neopixel xyz, etc. - are infrared remote controlled and come with flimsy, cheap remote. The remotes have quite a number of buttons, for example, 20 buttons in 4 columns and 5 rows. The remote control has a CR2025 3V button cell battery. The receiving side consists of an integrated IR receiver circuitry in a TO-92 style package w/ three (3) leads (as you also see in the conversation about Reusing some RGB LED interior lighting modules).
Since there was no use anymore for the IR RC parts, I gave it a shot to figure out what the remote control transmits and whether it could be useful to use it as a (remote) control or input device for an Espruino application.
1 Attachment