Infra Rood DX Mini universeel controller


Een simpele goedkope afstandbediening is degene die hiernaast te zien is, voor tuner en audio bediening zeer geschikt.
Afkomstig van DealExtreme nu ook bij Knutselaar.eu te bestellen voor 2,50 Euro (ingesteld op het juiste protocol).
Deze afstandbediening wordt ingesteld op het NEC protocol geleverd, onderstaande Proton Basic voorbeeld code voor de PIC 18F25K22 werkt goed op dit type. De code is bedoeld voor hetzelfde schema als wat gebruikt wordt voor de Infra Rood Analyzer.(alleen de serieele poort wordt nu niet gebruikt.) De code laat alleen de functie van de toetsen zien op het 2×16 display en doet verder nog niets.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
'****************************************************************
'*  Name    : NEC-Receiver.BAS                                  *
'*  Author  : Knutselaar.eu                                     *
'*  Notice  : Copyright (c) 2012 Knutselaar.eu                  *
'*          : All Rights Reserved                               *
'*  Date    : 07/13/2012                                        *
'*  Version : 1.0                                               *
'*  Notes   : Voor Deal-Extreme Mini controller 2724 (1e serie (2012))*
'*          : Mute    = 11 (hex 0B)                             *
'*          : AV/TV   = 64 (hex 40)                             *
'*          : Can. Up = 71 (hex 47)                             *
'*          : Aan/Uit = 72 (hex 48)                             *
'*          : Vol.Low = 73 (hex 49)                             *
'*          : Vol. Up = 75 (hex 4B)                             *
'*          : Chan.Dw = 77 (hex 4D)                             *
'****************************************************************
Device 18F25K22
                                                                 
CONFIG_START                                                    
     FOSC = INTIO67         ;Internal oscillator block, port function on RA6 and RA7  
     FCMEN = Off            ;Fail-Safe Clock Monitor disabled
     IESO = Off             ;internal external switchover mode
     ;PWRT = On             ;power-up timer For 18F25K20
     PWRTEN = On            ;power-up timer For 18F25K22
     BOREN = On             ;brown-out reset
     ;BORV = 27             ;brown-out reset value (2,7V) For 18F25K20
     BORV = 285             ;brown-out reset value (2,85V) for 18F25K22
     WDTEN = Off            ;watchdog timer
     WDTPS = 128            ;1:128 WDT prescalar
     PBADEN = Off           ;analog port B<4:0>
     STVREN = On            ;stack overflow reset
     LVP = Off              ;low voltage programming
     XINST = Off            ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
     Debug = Off            ;no debug
CONFIG_END

    XTAL 64
   
    Symbol IR_PIN      = PORTB.0  ; 38Khz ir ontvanger op poort B.0
    Symbol Speaker     = PORTC.5
    Symbol LEDGreen    = PORTA.5
   
    Symbol lowLimit    = 85
    Symbol highLimit   = 130

    Dim u             As Byte    ; puls teller
    Dim v             As Byte    ; hulp variable
    Dim w             As Byte    ; byte teller
    Dim x             As Word    ; timing teller voor puls aan (later bit teller)
    Dim y             As Word    ; timing teller voor puls uit
    Dim z             As Byte    ; puls teller
    Dim bitStart      As Byte
    Dim printArray[16]As Byte
    Dim onArray[40]   As Word    ; puls tijd aan array
    Dim offArray[40]  As Word    ; puls tijd uit array
   
    Dim a_bit         As Byte    ; adres bit
    Dim b_bit         As Byte    ; 2e adres bit
    Dim c_bit         As Byte    ; data bit
    Dim d_bit         As Byte    ; complimetair data bit
    Dim test_bit      As Byte    
    Dim x_bit         As Byte
    Dim type          As Byte
    Dim mode          As Byte
    Dim mute          As Byte
    Dim IR_Status     As Byte
   
    OSCCON = %01110000           ; 16Mhz intern osc
    OSCTUNE= %01000000           ; 4x PLL aan geeft 64Mhz
    ANSELA = %00000000           ; 18F25K22 poort A digitaal
    ANSELB = %00000000           ; 18F25K22 poort B digitaal
    ANSELC = %00000111           ; 18F25K22 Poort C RX,TX,C5,SCL en SDA digitaal
    ;ALL_DIGITAL TRUE             ; Alle poorten digitaal voor 18F25K20
 
    Clear                        ; wis geheugen
 
    Cls                          ; init display

    Sound Speaker , [115,20]
         
    Print At 1, 1,  "Knutselaar.eu   "
    Print At 2, 1,  "IR NEC ontvanger"
   
    DelayMS 3000
   
snelleLoop:                             ;moet snel omdat vanuit deze loop de lengte van de IR startpuls gemeten wordt.

    If IR_PIN = 0 Then GoSub IR_Receiver
    If IR_Status > 0 Then GoSub IR_Aktie
   
    GoTo  snelleLoop
   
IR_Receiver:
        v = 0 : w = 0 : y = 0 : type = 0
        High LEDGreen                   ; groen aan
       
        For z = 1 To 40                 ; puls teller
            For x = 1 To 2000           ; max 20 ms timer, meten puls aan
                If IR_PIN = 1 Then
                    onArray[z] = x      ; array vullen
                    GoTo skipx  
                End If
                DelayUS 9               ; 9us + ongeveer 1uS reken tijd
            Next x
            skipx:
           
            If x > 880 And x < 940 Then type = 1       ;NEC startpuls 9mS
 
            For y = 1 To 8000          ; max 80 ms timer, meten puls uit
                If  IR_PIN = 0 Then
                    offArray[z] = y    ; array vullen
                    GoTo skipy
                End If
                DelayUS 9
            Next y
           
            Low LEDGreen
            GoTo IR_timeout                ; timeout
            skipy:
        Next z
   
    IR_timeout:
        x = 0
       
        If onArray[1] < 300 Then                               ' te korte start puls (stoorpuls)
            bitStart = 3
        Else
            bitStart = 2
        End If
       
        For u = bitStart To z
       
            If offArray[u] > 1400 Then                          ' >14 ms geen puls
                v = u
                x = 0
            Else
                If u > 1 And u = v +1 Then
                Else
                    x = x + 1
                End If
            End If
   
            Select x
                Case 1  
                    If offArray[u] < lowLimit Then x_bit.0 = 0
                    If offArray[u] > highLimit Then x_bit.0 = 1
                Case 2
                    If offArray[u] < lowLimit Then x_bit.1 = 0
                    If offArray[u] > highLimit Then x_bit.1 = 1
                Case 3
                    If offArray[u] < lowLimit Then x_bit.2 = 0
                    If offArray[u] > highLimit Then x_bit.2 = 1
                Case 4
                    If offArray[u] < lowLimit Then x_bit.3 = 0
                    If offArray[u] > highLimit Then x_bit.3 = 1
                Case 5
                    If offArray[u] < lowLimit Then x_bit.4 = 0
                    If offArray[u] > highLimit Then x_bit.4 = 1
                Case 6
                    If offArray[u] < lowLimit Then x_bit.5 = 0
                    If offArray[u] > highLimit Then x_bit.5 = 1
                Case 7
                    If offArray[u] < lowLimit Then x_bit.6 = 0
                    If offArray[u] > highLimit Then x_bit.6 = 1
                Case 8
                    If offArray[u] < lowLimit Then x_bit.7 = 0
                    If offArray[u] > highLimit Then x_bit.7 = 1
            End Select
           
            If x = 8 Then
                w = w + 1                    ' byte teller
                Select Case w
                    Case 1
                        a_bit = x_bit
                    Case 2
                        b_bit = x_bit
                    Case 3
                        c_bit = x_bit
                    Case 4
                        d_bit = x_bit
                End Select
                x = 0
            End If
           
        Next u
       
        If z > 4 Then                              'indien minder dan 4 pulsen; herhaal
            test_bit = ~d_bit
                                  'd_bit inverteren
            If c_bit = test_bit And type = 1 Then  'testen of c_bit is complimetair aan d_bit
                Sound Speaker , [115,20]
            Else
                Sound Speaker , [125,10]
                DelayMS 5
                Sound Speaker , [125,10]
            End If
           
            IR_Status = 1
        Else
           
            If type = 1 Then                       ;NEC herhaal (toets blijft ingedrukt)
                Sound Speaker , [115,1]  
                IR_Status = 2
            End If
                           
        End If
 
        Low LEDGreen
Return

IR_Aktie:
   
    If IR_Status = 2 Then DelayMS 400    'vertaging bij toets ingedrukt houden
   
    Select Case c_bit
        Case 11
            mute = ~mute                 'inverteren
            If mute = 0   Then Str printArray = "Mute Aan        "
            If mute = 255 Then Str printArray = "Mute Uit        "
        Case 64
            mode = mode + 1
            If mode = 4 Then mode = 1
           
            Select Case mode
                Case 1
                    Str printArray = "Volume          "
                Case 2
                    Str printArray = "Hoog            "
                Case 3
                    Str printArray = "Laag            "
            End Select
           
            DelayMS 700                   'onderdrukken toets (te) lang indrukken (herhaal)
        Case 71
            Str printArray = "Channel Up      "
        Case 72
            Str printArray = "Aan/Uit         "
        Case 73
            If mode = 0 Then mode = 1
           
            Select Case mode
                Case 1
                    Str printArray = "Volume Lager    "
                Case 2
                    Str printArray = "Hoog Minder     "
                Case 3
                    Str printArray = "Laag Minder     "
            End Select
           
        Case 75
            If mode = 0 Then mode = 1
           
            Select Case mode
                Case 1
                    Str printArray = "Volume Hoger    "
                Case 2
                    Str printArray = "Hoog Meer       "
                Case 3
                    Str printArray = "Laag Meer       "
            End Select
           
        Case 77
            Str printArray = "Cannel Down     "
    End Select
   
    Print At 1, 1,  "Knutselaar.eu   "
    Print At 2,1, Str printArray
   
    IR_Status = 0      
   
Return
End

De code in de remote controller blijkt voor de tweede serie die door Knutselaar.eu verkocht wordt te zijn gewijzigd (vanaf 2013) hieronder de nieuwe code.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
'****************************************************************
'*  Name    : NEC-Receiver.BAS                                  *
'*  Author  : Henk Zeeman                                       *
'*  Notice  : Copyright (c) 2013 Knutselaar.eu                  *
'*          : All Rights Reserved                               *
'*  Date    : 14-Jan-2013                                       *
'*  Version : 2.0                                               *
'*  Notes   : Voor Deal-Extreme Mini controller 2724 (2e serie) *
'*          : Mute    = 11 (hex 0B)                             *
'*          : Can. Up = 25 (hex 19)                             *
'*          : Chan.Dw = 24 (HEX 18)                             *
'*          : Aan/Uit = 63 (hex 3F)                             *
'*          : Vol.Low = 21 (hex 15)                             *
'*          : Vol. Up = 18 (hex 12)                             *
'                                                               *
'*          : AV/TV knop geeft opeenvolgend 6 codes             *
'*          : AV/TV   = 33 (hex 21)                             *
'*                      34 (hex 22)                             *
'*                      60 (hex 3C)                             *
'*                      40 (hex 28)                             *
'*                      19 (hex 13)                             *
'*                      173(hex AD)                             *
'****************************************************************
Device 18F25K22
                                                                 
CONFIG_START                                                    
     FOSC = INTIO67         ;Internal oscillator block, port function on RA6 and RA7  
     FCMEN = Off            ;Fail-Safe Clock Monitor disabled
     IESO = Off             ;internal external switchover mode
     ;PWRT = On             ;power-up timer For 18F25K20
     PWRTEN = On            ;power-up timer For 18F25K22
     BOREN = On             ;brown-out reset
     ;BORV = 27             ;brown-out reset value (2,7V) For 18F25K20
     BORV = 285             ;brown-out reset value (2,85V) for 18F25K22
     WDTEN = Off            ;watchdog timer
     WDTPS = 128            ;1:128 WDT prescalar
     PBADEN = Off           ;analog port B<4:0>
     STVREN = On            ;stack overflow reset
     LVP = Off              ;low voltage programming
     XINST = Off            ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
     Debug = Off            ;no debug
CONFIG_END

    XTAL 64
   
    Symbol IR_PIN      = PORTB.0  ; 38Khz ir ontvanger op poort B.0
    Symbol Speaker     = PORTC.5
    Symbol LEDGreen    = PORTA.5
   
    Symbol lowLimit    = 85
    Symbol highLimit   = 130
   
    Declare LCD_DATAUS 75       'voor de wat langzamere LCD schermpjes.

    Dim u             As Byte    ; puls teller
    Dim v             As Byte    ; hulp variable
    Dim w             As Byte    ; byte teller
    Dim x             As Word    ; timing teller voor puls aan (later bit teller)
    Dim y             As Word    ; timing teller voor puls uit
    Dim z             As Byte    ; puls teller
    Dim bitStart      As Byte
    Dim printArray[16]As Byte
    Dim onArray[40]   As Word    ; puls tijd aan array
    Dim offArray[40]  As Word    ; puls tijd uit array
   
    Dim a_bit         As Byte    ; adres bit
    Dim b_bit         As Byte    ; 2e adres bit
    Dim c_bit         As Byte    ; data bit
    Dim d_bit         As Byte    ; complimetair data bit
    Dim test_bit      As Byte    
    Dim x_bit         As Byte
    Dim type          As Byte
    Dim mode          As Byte
    Dim mute          As Byte
    Dim IR_Status     As Byte
   
    OSCCON = %01110000           ; 16Mhz intern osc
    OSCTUNE= %01000000           ; 4x PLL aan geeft 64Mhz
    ANSELA = %00000000           ; 18F25K22 poort A digitaal
    ANSELB = %00000000           ; 18F25K22 poort B digitaal
    ANSELC = %00000111           ; 18F25K22 Poort C RX,TX,C5,SCL en SDA digitaal
    ;ALL_DIGITAL TRUE             ; Alle poorten digitaal voor 18F25K20
 
    Clear                        ; wis geheugen
 
    Cls                          ; init display

    Sound Speaker , [115,20]
         
    Print At 1, 1,  "Knutselaar.eu   "
    Print At 2, 1,  "IR NEC ontvanger"
   
    DelayMS 3000
   
snelleLoop:                             ;moet snel omdat vanuit deze loop de lengte van de IR startpuls gemeten wordt.

    If IR_PIN = 0 Then GoSub IR_Receiver
    If IR_Status > 0 Then GoSub IR_Aktie
   
    GoTo  snelleLoop
   
IR_Receiver:
        v = 0 : w = 0 : y = 0 : type = 0
        High LEDGreen                   ; groen aan
       
        For z = 1 To 40                 ; puls teller
            For x = 1 To 2000           ; max 20 ms timer, meten puls aan
                If IR_PIN = 1 Then
                    onArray[z] = x      ; array vullen
                    GoTo skipx  
                End If
                DelayUS 9               ; 9us + ongeveer 1uS reken tijd
            Next x
            skipx:
           
            If x > 880 And x < 940 Then type = 1       ;NEC startpuls 9mS
 
            For y = 1 To 8000          ; max 80 ms timer, meten puls uit
                If  IR_PIN = 0 Then
                    offArray[z] = y    ; array vullen
                    GoTo skipy
                End If
                DelayUS 9
            Next y
           
            Low LEDGreen
            GoTo IR_timeout                ; timeout
            skipy:
        Next z
   
    IR_timeout:
        x = 0
       
        If onArray[1] < 300 Then                               ' te korte start puls (stoorpuls)
            bitStart = 3
        Else
            bitStart = 2
        End If
       
        For u = bitStart To z
       
            If offArray[u] > 1400 Then                          ' >14 ms geen puls
                v = u
                x = 0
            Else
                If u > 1 And u = v +1 Then
                Else
                    x = x + 1
                End If
            End If
   
            Select x
                Case 1  
                    If offArray[u] < lowLimit Then x_bit.0 = 0
                    If offArray[u] > highLimit Then x_bit.0 = 1
                Case 2
                    If offArray[u] < lowLimit Then x_bit.1 = 0
                    If offArray[u] > highLimit Then x_bit.1 = 1
                Case 3
                    If offArray[u] < lowLimit Then x_bit.2 = 0
                    If offArray[u] > highLimit Then x_bit.2 = 1
                Case 4
                    If offArray[u] < lowLimit Then x_bit.3 = 0
                    If offArray[u] > highLimit Then x_bit.3 = 1
                Case 5
                    If offArray[u] < lowLimit Then x_bit.4 = 0
                    If offArray[u] > highLimit Then x_bit.4 = 1
                Case 6
                    If offArray[u] < lowLimit Then x_bit.5 = 0
                    If offArray[u] > highLimit Then x_bit.5 = 1
                Case 7
                    If offArray[u] < lowLimit Then x_bit.6 = 0
                    If offArray[u] > highLimit Then x_bit.6 = 1
                Case 8
                    If offArray[u] < lowLimit Then x_bit.7 = 0
                    If offArray[u] > highLimit Then x_bit.7 = 1
            End Select
           
            If x = 8 Then
                w = w + 1                    ' byte teller
                Select Case w
                    Case 1
                        a_bit = x_bit
                    Case 2
                        b_bit = x_bit
                    Case 3
                        c_bit = x_bit
                    Case 4
                        d_bit = x_bit
                End Select
                x = 0
            End If
           
        Next u
       
        If z > 4 Then                              'indien minder dan 4 pulsen; herhaal
            test_bit = ~d_bit
                                  'd_bit inverteren
            If c_bit = test_bit And type = 1 Then  'testen of c_bit is complimetair aan d_bit
                Sound Speaker , [115,20]
            Else
                Sound Speaker , [125,10]
                DelayMS 5
                Sound Speaker , [125,10]
            End If
           
            IR_Status = 1
        Else
           
            If type = 1 Then                       ;NEC herhaal (toets blijft ingedrukt)
                Sound Speaker , [115,1]  
                IR_Status = 2
            End If
                           
        End If
 
        Low LEDGreen
Return

IR_Aktie:
   
    If IR_Status = 2 Then DelayMS 400    'vertaging bij toets ingedrukt houden
   
    Select Case c_bit
        Case 11
            mute = ~mute     'inverteren
            If mute = 0   Then Str printArray = "Mute Aan        "
            If mute = 255 Then Str printArray = "Mute Uit        "
        Case 33             'AV/TV (mode1)
            mode = 1
            Str printArray = "Volume          "
           
        Case 34              'AV/TV (mode2)
            mode = 2
            Str printArray = "Hoog            "
           
        Case 60              'AV/TV (mode3)
            mode = 3
            Str printArray = "Laag            "  
           
        Case 40
            mode = 4
            Str printArray = "Niet gebruikt 4 "
           
        Case 19
            mode = 5
            Str printArray = "Niet gebruikt 5 "

        Case 173
            mode = 6
            Str printArray = "Niet gebruikt 6 "        
           
        Case 24
            Str printArray = "Cannel Down     "
           
        Case 25
            Str printArray = "Channel Up      "
           
        Case 63
            Str printArray = "Aan/Uit         "
           
        Case 21                '<-- lager/minder
            Select Case mode
                Case 1
                    Str printArray = "Volume Lager    "
                Case 2
                    Str printArray = "Hoog Minder     "
                Case 3
                    Str printArray = "Laag Minder     "
            End Select
           
        Case 18                '--> hoger/meer
            Select Case mode
                Case 1
                    Str printArray = "Volume Hoger    "
                Case 2
                    Str printArray = "Hoog Meer       "
                Case 3
                    Str printArray = "Laag Meer       "
            End Select
           

    End Select
   
    Print At 1, 1,  "Knutselaar.eu   "
    Print At 2,1, Str printArray
   
    IR_Status = 0      
   
Return
End

Met de AV/TV toets kan de de functie van de volume toetsen omgezet worden naar hoog en laag toonregeling.
Verder hebben de toetsen de functies zoals op de controller aangegeven.

Instellen van juiste protocol wanneer dit (per ongeluk) gewijzigd is:

Deze afstandbediening is een universele type, dit houdt in dat het op verschillende protocols ingesteld kan worden. Volgens de beschrijving kan het protocol veranderd worden door de “Mute” toets langer dan 5 seconden vast te houden, net zo lang tot het apparaat waarmee het werkt reageerd (mute).
Voor het bovenstaande NEC protocol kun je dan lang wachten. Heb zelf uitgevonden dat dit anders moet/kan.
Om tot het NEC protocol te komen moet men eerst de “Mute” toets ruim 5 seconden vasthouden, daarna moet de AV/TV toets net zo lang vastgehouden worden totdat op het display “volume”, “hoog” of “laag” verschijnt, dit is na 5 seconden. Te lang vasthouden heeft tot gevolg dat de controller doorspringt naar het volgende protocol, je moet dan weer de “mute” toets lang vasthouden en met de “AV/TV” toets opnieuw proberen.
De NEC code zoals hierboven is de eerste die met de “AV/TV” toets langskomt.




Hit Counter by Digits