Ik heb een Pioneer XR-A550 hifi systeem dat ik gebruik als versterker voor muziek/geluid van mijn PC op mijn hobbytafel. Dit werkt op zich heel goed, maar op het einde van de dag zet ik de spanning van de tafel uit. Als ik dan de dag erna de spanning weer opzet dan is de versterker al zijn instellingen kwijt. Ik moet dan weer op aux drukken en het volume terug omhoog zetten. Na een paar jaar is het toch tijd om dit eens te automatiseren.
Hierbij heb ik ervoor gekozen om de IR codes van de afstandsbediening te reproduceren met een eigen schakeling. Voor de elektronica had ik nog een paar printen liggen van de Soldeer / SMD Inspectie Camera, die hebben een microcontroller met een mosfet op 1 van de uitgangen om zo een hogere stroom te schakelen voor de IR LED.
De behuizing is 3D geprint en is ontworpen om op de aluminium rail van mijn LED lamp te klikken.
Om de IR commando’s te achterhalen heb ik een IR receiver aan een logic analyzer gekoppeld. De signalen heb ik dan in een spreadsheet gedecodeerd, en vervolgens wat “quick and dirty code” gemaakt om deze te reproduceren.
Het signaal van de IR LED moet gemoduleerd worden op 38Khz. Om dit te doen gebruik ik de PWM module in de microcontroller. Deze staat ingesteld op PWM met een frequentie van 38Khz, vervolgens stuur ikĀ duty-cycle 0 voor uit en 50% voor aan. Daarnaast heb ik LATAbits.LATA6 gebruikt voor debug.
Dit resulteert in volgende code:
void main(void) { uint8_t Buffer, Counter, VolumeCounter; // initialize the device SYSTEM_Initialize(); //************************************************************************** //Startup delay __delay_ms(2000); __delay_ms(2000); //************************************************************************** //Send Aux Irheader(); Buffer = 0b10011010; for (Counter = 0; Counter < 8; Counter++) { if (Buffer & 0x80){ IrOne(); }else{ IrZero(); } Buffer = Buffer << 1; } Buffer = 0b01100101; for (Counter = 0; Counter < 8; Counter++) { if (Buffer & 0x80){ IrOne(); }else{ IrZero(); } Buffer = Buffer << 1; } Buffer = 0b11001101; for (Counter = 0; Counter < 8; Counter++) { if (Buffer & 0x80){ IrOne(); }else{ IrZero(); } Buffer = Buffer << 1; } Buffer = 0b00110010; for (Counter = 0; Counter < 8; Counter++) { if (Buffer & 0x80){ IrOne(); }else{ IrZero(); } Buffer = Buffer << 1; } IrZero(); //************************************************************************** //Delay after power on __delay_ms(2000); __delay_ms(2000); //************************************************************************** //Volume ++ 10x for (VolumeCounter = 0; VolumeCounter < 10; VolumeCounter++){ Irheader(); Buffer = 0b10011010; for (Counter = 0; Counter < 8; Counter++) { if (Buffer & 0x80){ IrOne(); }else{ IrZero(); } Buffer = Buffer << 1; } Buffer = 0b01100101; for (Counter = 0; Counter < 8; Counter++) { if (Buffer & 0x80){ IrOne(); }else{ IrZero(); } Buffer = Buffer << 1; } Buffer = 0b10101111; for (Counter = 0; Counter < 8; Counter++) { if (Buffer & 0x80){ IrOne(); }else{ IrZero(); } Buffer = Buffer << 1; } Buffer = 0b01010000; for (Counter = 0; Counter < 8; Counter++) { if (Buffer & 0x80){ IrOne(); }else{ IrZero(); } Buffer = Buffer << 1; } IrZero(); __delay_ms(1000); } //************************************************************************** //Infinite loop, don't do anything while (1) { } } void Irheader(void){ LATAbits.LATA6 = 0; PWM1_LoadDutyValue(127); __delay_us(8550); LATAbits.LATA6 = 1; PWM1_LoadDutyValue(0); __delay_us(4200); } void IrOne(void){ LATAbits.LATA6 = 0; PWM1_LoadDutyValue(127); __delay_us(550); LATAbits.LATA6 = 1; PWM1_LoadDutyValue(0); __delay_us(550); } void IrZero(void){ LATAbits.LATA6 = 0; PWM1_LoadDutyValue(127); __delay_us(550); LATAbits.LATA6 = 1; PWM1_LoadDutyValue(0); __delay_us(1560); }
Een video van de schakeling in werking:
Please accept YouTube cookies to play this video. By accepting you will be accessing content from YouTube, a service provided by an external third party.
If you accept this notice, your choice will be saved and the page will refresh.
Gerelateerde producten: