Inhoudsopgave:
- Stap 1: Kort overzicht van het circuit
- Stap 2: Kort overzicht van de software
- Stap 3: I2C-pakketinhoud
- Stap 4: Afstandsbedieningscodes verkrijgen (ui32Data)
- Stap 5: Hoe u uw I2C-slave-apparaat kunt testen?
- Stap 6: Uw ontwerp verkleinen
- Stap 7: Conclusie
- Stap 8: Gebruikte referenties
Video: I2C infrarood afstandsbediening met de Arduino - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:19
PreambleThis Instructable beschrijft hoe u een universele afstandsbediening kunt maken met I2C voor de interface.
Hoe vreemd zeg je, een I2C-slave-apparaat gebruiken?
Ja, een I2C-slaveapparaat.
Dit komt omdat de nauwkeurige timing van IR-pakketten behoorlijk veeleisend is en waar een typische Arduino moeite mee zal hebben als hij al veel andere taken tegelijkertijd uitvoert. Het is beter om de computerbelasting te verdelen door zoveel mogelijk tijdintensieve activiteiten toe te wijzen aan speciale processors (beter nog steeds in hardware). Aangezien I2C een goed gedocumenteerde en robuuste communicatiemethode is tussen IC's, heb ik deze als interface gekozen.
Invoering
Zoals hierboven vermeld, beschrijft deze instructable hoe huishoudelijke apparaten zoals tv, dvd-speler en satelliet enz. te bedienen met behulp van de IRremote-bibliotheek op de Arduino.
Het eindigt met een ontwerpvoorbeeld dat de Arduino verandert in een I2C-slave-afstandsbedieningsmodule (foto 1 hierboven) met prototype-testcircuit (foto 2 hierboven) en gaat verder in detail hoe u uw ontwerp kunt verkleinen tot de minimale componenten die nodig zijn, zodat het kan worden ingebed in een ander ontwerp. In mijn geval gebruik ik dit embedded apparaat in een IoT Universal afstandsbedieningsapparaat gebaseerd op een ESP8266-12E.
Welke onderdelen heb ik nodig?
Om de in stap 1 (IR-zender) afgebeelde schakeling te bouwen, hebt u de volgende onderdelen nodig;
- 2 off 10K weerstanden
- 1 off 390R weerstand
- 1 uit 33R weerstand
- 1 uit 3K8 weerstand
- 1 uit Rode LED
- 1 uit IR Led TSAL6400
- 1 uit Transistor BC337
- 1 off 220uF condensator
- 1 uit Arduino Uno
Om de in stap 4 (IR-ontvanger) afgebeelde schakeling te bouwen, hebt u de volgende onderdelen nodig;
- 1 off 10K weerstand
- 1 korting op TSOP38328
- 1 off 220uF condensator
- 1 uit Arduino Uno
Om het circuit te bouwen dat is afgebeeld in stap 5 (Slave-testcircuit), hebt u de volgende onderdelen nodig;
- 4 off 10K weerstanden
- 2 off 390R weerstand
- 1 uit 33R weerstand
- 1 uit 3K8 weerstand
- 2 uit Rode LED
- 1 uit IR Led TSAL6400
- 1 uit Transistor BC337
- 1 off 220uF condensator
- 2 uit SPST-knoppen
- 2 uit Arduino Unos
Om het circuit te bouwen dat is afgebeeld in stap 6 (gekrompen ontwerp), hebt u de volgende onderdelen nodig;
- 3 off 10K weerstanden
- 1 off 270R weerstand
- 1 uit 15R weerstand
- 4 off 1K weerstanden
- 1 uit Rode LED
- 1 uit IR Led TSAL6400 of TSAL5300
- 1 uit Transistor BC337
- 1 uit 220uF condensator elektrolytisch @ 6.3v
- 1 off 1000uF condensator elektrolytisch @ 6.3v
- 2 off 0.1uF condensatoren
- 2 off 22pF condensatoren
- 1 uit 16MHz Xtal
- 1 van ATMega328P-PU
Opmerking: u hebt ook een FTDI-apparaat nodig om de ATMega328P te programmeren
Welke vaardigheden heb ik nodig?
- Een minimale kennis van elektronica,
- Kennis van Arduino en zijn IDE,
- Een beetje geduld,
- Enig begrip van I2C zou nuttig zijn (zie hier voor enkele algemene I2C/Wire Library-details).
Behandelde onderwerpen
- Kort overzicht van het circuit,
- Kort overzicht van de software,
- I2C-pakketinhoud,
- Afstandsbedieningscodes ophalen (ui32Data),
- Hoe u uw I2C Slave-apparaat kunt testen,
- Je ontwerp verkleinen,
- Conclusie,
- Referenties gebruikt.
Vrijwaring
Zoals altijd gebruikt u deze instructies op eigen risico en worden ze niet ondersteund.
Stap 1: Kort overzicht van het circuit
Het doel van het circuit is om IR-afstandsbedieningscodes te verzenden. Het ontwerp is vrij eenvoudig en vrij eenvoudig.
Wanneer transistor Q1 a BC337 NPN wordt ingeschakeld via een logische van Arduino PWM O/P D3 naar weerstand R5, gaat de stroom door leds 1 en 2. Alleen beperkt door respectievelijk ballastweerstanden R3 en R4. Q1 wordt gebruikt om de stroom die door de IR-diode gaat (IF Max = 100mA) te verhogen tot meer dan wat de Arduino O/P kan ~40mA @ +5v voeding.
Condensator C1 a 220uF Elektrolytisch zorgt voor enige stabilisatie die voorkomt dat de voedingsrail uitvalt door het vermogen dat wordt opgenomen door Leds 1 en 2.
Weerstanden R1 en R2 zijn I2C pull-ups.
Stap 2: Kort overzicht van de software
Preambule
Om deze broncode succesvol te compileren heb je de volgende extra bibliotheek nodig;
IRremote.h
- Door: z3t0
- Doel: Infrarood externe bibliotheek voor Arduino: verzend en ontvang infraroodsignalen met meerdere protocollen
- Van:
Codeoverzicht
Zoals getoond in afbeelding 1 hierboven, configureert de code bij het opstarten de microcontroller-I/O en peilt vervolgens de status van de interne softwarevlag 'bFreshDataFlag'. Wanneer deze vlag is ingesteld, bevestigt de controller dat de lijn 'Bezet' is (verzendt datapin D4 laag) en gaat naar de 'eBUSY'-status, leest achtereenvolgens de knopdrukcommando's in uDataArray en verzendt de IR-gemoduleerde gegevens naar de IR-LED in een volgorde van verzending.
Zodra de gegevens in uDataArray volledig zijn verzonden, wordt de status 'eIDLE' hervat en wordt de 'Bezet'-regel opgeheven (verzendt gegevenspin D4 hoog). Het apparaat is nu klaar om meer toetsaanslagen te ontvangen die het einde van de transmissiereeks markeren.
Ontvangst van IR-knop drukgegevens
Wanneer gegevens via I2C naar de infraroodafstandsbediening worden verzonden, wordt een onderbreking geactiveerd en wordt de functie-aanroep ReceiveEvent() asynchroon geactiveerd.
Eenmaal geactiveerd worden de ontvangen I2C-gegevens sequentieel in de buffer 'uDataArray' geschreven.
Als tijdens de gegevensontvangst een einde van de reeks wordt gesignaleerd door de master (bFreshData!=0x00), wordt de 'bFreshDataFlag' ingesteld, waarmee het begin van de transmissiereeks wordt gesignaleerd.
Afbeeldingen 2…3 geven een voorbeeld van een typische pakketvolgorde.
Opmerking: volledige broncode hier beschikbaar
Stap 3: I2C-pakketinhoud
Het formaat van het controlepakket dat via I2C naar de slave wordt verzonden, wordt hierboven in afbeelding 1 gegeven, de betekenis van elk veld wordt hieronder gegeven
Betekenis van de controlepakketvelden
byte bEncoding;
-
IR afstandsbediening codering,
- RC6 (hemel) = 0,
- SONY = 1,
- SAMSUNG = 2,
- NEC = 3,
- LG = 4
uint32_t ui32Data;
De hexadecimale weergave van de binaire IR-gegevensstroom 4 databytes (unsigned long), LSByte … MSByte
byte bNumberOfBitsInTheData;
Aantal bits in de gegevens (max. 32). Bereik = 1 … 32
byte bPulseTrainHerhaalt;
Hoeveel herhalingen van deze pulstrein. Bereik = 1 … 255. Typisch 2…4 herhalingen. Misschien wilt u dit uitbreiden voor aan/uit-commando's, aangezien het ontvangende apparaat soms een paar extra pulstreinherhalingen nodig heeft om een inschakelsignaal te ontvangen
byte bVertragingTussenPulseTreinHerhalingen;
Vertraging tussen herhalingen van deze pulstrein. Bereik = 1 … 255mS. Meestal 22 mS … 124 mS
byte bButtonHerhalingen;
Simuleert herhaald indrukken van dezelfde knop (maar ondersteunt de gewijzigde code niet zoals een Apple-afstandsbediening, het herhaalt alleen de knopcode). Bereik = 1 … 256. Standaard = 1
uint16_t ui16DelayBetweenButtonRepeats;
Vertraging tussen knopherhalingen (unsigned int). 2 bytes in totaal LSByte … MSByte. Bereik = 1 … 65535mS. Standaard = 0mS
byte bFreshData;
-
Verse gegevens. Een waarde die niet nul is. Als laatste geschreven, activeert de IR TX-reeks. Bereik 0x00…0xFF
- Er komen nog meer controlepakketten = 0
- Dit is het laatste controlepakket = niet-nulwaarde 1, 2, … 255
Let op het gebruik van de compiler-richtlijn '_packed_'. Dit is om ervoor te zorgen dat de gegevens pakketbyte voor byte in het geheugen zijn, ongeacht het gebruikte doelsysteem (Uno, Due, ESP8266 enz.). Dit betekent dat de koppeling tussen registerAllocationType en dataArrayType alleen sequentieel hoeft uit te klokken/klokken in bytes vanuit een controlepakket, wat de TX/RX-software eenvoudig maakt.
Stap 4: Afstandsbedieningscodes verkrijgen (ui32Data)
Er zijn drie manieren waarop u een respectieve sleutelcode voor de afstandsbediening kunt verkrijgen;
- Via bittelling met een oscilloscoop,
- Zoek het op op een website,
- Decodeer het direct uit de datastroom in software.
Via bittelling met een scope
Dit is geen efficiënte methode omdat het behoorlijk wat tijd kost en mogelijk meer dan één poging vereist, maar het kan zeer nauwkeurig zijn. Het is ook nuttig bij het visueel valideren van codes die zijn verkregen met methode 2 en 3, ook bij het bepalen van eventuele eigenaardigheden van een afstandsbediening. Bijvoorbeeld bij het ingedrukt houden van een knop op een Apple IR-afstandsbediening. De afstandsbediening zal in eerste instantie een commandoreeks geven en daarna een herhaalde gecomprimeerde reeks van 0xF….
Zoek het op op een website
De database met afstandsbedieningscodes op de Linux Infrared Remote Control-website is een goede bron.
Het nadeel is echter dat u misschien een paar codes moet proberen totdat u er een vindt die voor u werkt. Mogelijk moet u ook enkele weergaven van de codes interpreteren om ze om te zetten in hun equivalente hexadecimale vorm.
Decodeer het rechtstreeks uit de datastroom
Met behulp van het circuit in afbeelding 1 hierboven in combinatie met het IRremote-bibliotheekvoorbeeld 'IRrecvDumpV2.ino' is het mogelijk om de datastroom rechtstreeks vanaf de afstandsbediening te decoderen. Afbeelding 2 toont een gedecodeerde Samsung TV-afstandsbediening voor een aan/uit-knop in het Arduino IDE-terminalvenster.
Gecombineerde ontvanger/zender
Foto's 3 en 4 hierboven tonen een oplossing die zowel ontvangst als verzending van IR-commando's mogelijk maakt om eenvoudig prototypen mogelijk te maken.
Om het indrukken van de IR-afstandsbedieningsknop te decoderen, moet u de Arduino flashen met het voorbeeld 'IRrecvDumpV2.ino' dat bij de IRremote-bibliotheek wordt geleverd.
Het werkt ook even goed voor verzending als IR-commando's. Een rode led is inbegrepen als visuele indicatie dat het apparaat in actie is.
Stap 5: Hoe u uw I2C-slave-apparaat kunt testen?
Gebruik de broncode hier en het circuit dat hierboven in afbeelding 1 is beschreven, programmeer de 'Master' Arduino met 'IR_Remote_Sim_Test.ino' en de 'Slave' Arduino met 'IR_Remote_Sim.ino'.
Ervan uitgaande dat je een Sony Bravia TV, Sky HD-box en een Sony BT SoundBar hebt, druk je op knop 1 en je tv schakelt over naar BBC1 (kanaal 101). Druk op knop 2 en je soundbar wordt gedempt. Druk nogmaals en het dempen wordt weer opgeheven.
Tijdens het uitvoeren van de IR-transmissievolgorde zal LED3 oplichten om aan te geven dat de slave bezet is en zal LED1 in lijn met het IR-transmissieproces flikkeren.
Als u niet hetzelfde entertainmentsysteem hebt ingesteld als hierboven, kunt u de slaaf natuurlijk opnieuw programmeren met 'IRrecvDumpV2.ino', uw afstandsbedieningscommando's decoderen en ze vervolgens programmeren in de 'IR_Remote_Sim_Test.ino' voor uw gegeven scenario.
Afbeelding 2 toont het overzicht van de testsoftware op systeemniveau tussen Master en Slave.
Stap 6: Uw ontwerp verkleinen
Ok, dus ervan uitgaande dat je deze instructable hebt gevolgd, vertrouwend op twee Arduino's om je thuisapparaten te bedienen, is niet het meest efficiënte gebruik van je Arduino-voorraad. Als u dus de schakeling bouwt die in de afbeelding hierboven wordt getoond en de instructies hier volgt om de ATMega328P te programmeren met 'IR_Remote_Sim.ino', kunt u het hele systeem terugbrengen tot de minimale componenten. Hiermee kunt u uw ontwerp in een ander systeem insluiten.
Stap 7: Conclusie
De oplossing is stabiel en werkt goed, hij zit al een aantal weken zonder problemen in een ander systeem.
Ik koos de Arduino Uno R3 omdat ik een apparaat wilde met voldoende RAM, zodat ik een knopbuffer van redelijke diepte kon hebben. Ik heb genoegen genomen met een buffergrootte van 20 pakketten (MAX_SEQUENCES).
Het hybride TX/RX-schild dat ik heb gemaakt, kwam ook goed van pas bij het decoderen van Sony- en Sky-afstandsbedieningen. Hoewel ik moet bekennen dat ik van tijd tot tijd mijn digitale scoop gebruikte om te controleren of de software-gedecodeerde IR-opdracht hetzelfde was als die van de ontvangen IR (TSOP38328).
Het enige dat ik anders zou hebben gedaan, zou zijn geweest om het constante stroomcircuit voor de IR-led te gebruiken, zoals hierboven weergegeven in foto 2.
Een ander punt om op te merken is dat niet alle IR-zenders gemoduleerd zijn met 38KHz, de TSOP38328 is geoptimaliseerd voor 38KHz.
Stap 8: Gebruikte referenties
IRremote.h
- Door: z3t0
- Doel: Infrarood externe bibliotheek voor Arduino: verzend en ontvang infraroodsignalen met meerdere protocollen
- Van:
IR Remote bibliotheek
- z3t0.github.io/Arduino-IRremote/
- https://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
IR (infrarood) ontvangersensor - TSOP38238 (equivalent)
https://cdn-shop.adafruit.com/datasheets/tsop382.pdf
Opvulling van gegevensstructuren tot woordgrenzen vermijden
- https://github.com/esp8266/Arduino/issues/1825
- https://github.com/tuanpmt/esp_bridge/blob/master/modules/include/cmd.h#L15
- https://stackoverflow.com/questions/11770451/what-is-the-meaning-of-attribute-packed-aligned4
Goede bron van IR-afstandsbedieningsdetails
https://www.sbprojects.com/knowledge/ir/index.php
I2C
- https://playground.arduino.cc/Main/WireLibraryDetailedReference
- https://www.arduino.cc/en/Referentie/WireSend
IR-afstandsbedieningen-database
- https://www.lirc.org/
- https://lirc-remotes.sourceforge.net/remotes-table.html
BC337-gegevensblad
https://www.onsemi.com/pub/Collateral/BC337-D. PDF
1N4148 Gegevensblad
https://www.vishay.com/docs/81857/1n4148.pdf
Aanbevolen:
Bedien uw LED's met de afstandsbediening van uw tv?! -- Arduino IR-zelfstudie: 5 stappen (met afbeeldingen)
Bedien uw LED's met de afstandsbediening van uw tv?! || Arduino IR-zelfstudie: in dit project zal ik je laten zien hoe ik de nutteloze knoppen op de afstandsbediening van mijn tv heb hergebruikt om de LED's achter mijn tv te bedienen. Je kunt deze techniek ook gebruiken om allerlei dingen te besturen met een beetje code-editing. Ik zal ook wat vertellen over de theorie
TV-afstandsbediening wordt een RF-afstandsbediening -- NRF24L01+ zelfstudie: 5 stappen (met afbeeldingen)
TV-afstandsbediening wordt een RF-afstandsbediening || NRF24L01+ Tutorial: In dit project laat ik je zien hoe ik de populaire nRF24L01+ RF IC heb gebruikt om de helderheid van een ledstrip draadloos aan te passen via drie nutteloze knoppen van een tv-afstandsbediening. Laten we beginnen
Infrarood tripwire: 3 stappen
Infrarood Tripwire: 110 Volt Bron
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze
Hoe een tv-afstandsbediening of anders te emuleren met Arduino Irlib: 3 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Hoe een tv-afstandsbediening of anders te emuleren met Arduino Irlib: Inleiding Hallo allemaal en welkom bij mijn eerste Instructable. Vandaag zullen we leren, zoals de titel al zegt, om e TV-afstandsbediening of iets dergelijks te emuleren dat werkt met infraroodsignalen met behulp van Arduino (elk model) .Het probleem was: Hoe kan ik codes naar een