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
`
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
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.
Console output (first block w/ some spaces removed and truncated for legibility in the forum):