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.