EEVblog
Vložit
- čas přidán 3. 08. 2024
- How to capture and reverse engineer an infrared IR code and use an Arduino or other microcontroller to replay the command.
Oscilloscope and logic analyser capture, coding, troubleshooting, tounge angle, it's all here.
In this instance Dave captures the NEC (Japanese) code from his Canon video camera remote control on the digital oscilloscope, figures out all the bits and encoding, and writes an Arduino library to replay the code back, and verifies it with his Saleae Logic logic analyser.
Previous simple hack video: • EEVblog #505 - IR Lear...
CODE: gist.github.com/EEVblog/6206934
Forum: www.eevblog.com/forum/blog/eev...
EEVblog Main Web Site:
www.eevblog.com
EEVblog Amazon Store:
astore.amazon.com/eevblogstore-20
Donations:
www.eevblog.com/donations/
Projects:
www.eevblog.com/projects/
Electronics Info Wiki:
www.eevblog.com/wiki/ - Věda a technologie
Btw, just to be clear for folks, the 26ms that you divided by in your IRcarrier() function is THE PERIOD of the 38Khz. Freq = 1/Period, which means Period = 1/Freq = 1/38Khz = 0.0000263157 sec = 0.0263157msec = 26.3157usec, which is roughly 26usec.
So, your code wanted 9000usec of 38Khz carrier freq means that "how many periods of 26usecs do I need to generate?", which means 9000usec/26usec = 346 periods, that is, 346 iterations of the loop in your IRcarrier() function.
That's how the 38Khz carrier frequency is generated with an I/O pin.
Thanks a lot. That's the only part I didn't understood
"The old fashioned way" : A digital oscilloscope. :D
I understand your concern, his perception is relativistic
great work Dave.
i'm an electrical engineer who has been out of the technical loop for 25 years.
your videos are perfect for bringing somebody like me up to date.
Haha
Thanks for this video Dave! Your code is much more elegant and easier to understand than any of the IR libraries online. I was able to modify it to duplicate a Sony AV remote and it worked!
Brilliant, explained so well and in just the right level of detail. Thanks Dave!
Dave thank you for this video, I just got my first oscilloscope and this made my day for another semi beginner! The protocol explanation was great it helps me put what I have learned about protocols into real world examples! Thanks again!
Excellent explanation, thanks for showing how things actually work by theory using the oscilloscope.
Again got help from here after so many years, thanks Dave , you are a legend.
Amen to that. This channel is really getting good with all the how-tos as opposed to teardowns, mailbags, and rants (not that those aren't appreciated).
David - it’s an older video but I found it really useful! I’ve been recording a custom protocol used on original Macintosh keyboards (pre ADB) and plan to do an Arduino implementation. Your segment about using the Arduino and pitfalls to be mindful of confirmed the best practices I was anticipating - thank you!
If you don't have a digital scope, just connect the output of a photo diode to your line input of your pc's audio card and record the data.
thats a great idea!!
Dave R Good idea indeed but there's a limitation. The standard audio cards are made to sample from around 20Hz to 20000 Hz. That's not enough to see the actual carrier frequency, but its totally good enough to decode each button code. I just made this a couple of days ago, and I was able to decode every single button :D. Btw I used a free software that plots the mic input and lets you visualize interesting stuff like frequency gains.
What was the name of that free software you used, please?
There are soundcards capable of 24 bit @ 192khz. That ought to be enough for things like this :)
I just did this, as my receivers did not make a proper capture of the signal. using a standard sound card was able to clearly see the codes with a simple ir receiver (2 pin on mic input). my air conditioner had a 36-bit code, so I made a few modifications to the code posted here, adjusted the initial timings (assumed a 38khz carrier) and bam! working fine! captured the output to match the original remote, and from there I refined the timings. (i did not have an oscilloscope). an arduino pro mini 3.3v did the job perfectly
This is exactly how a fundamentals video should be done. Well played Dave, a great combination of theory, practical and how to salvage stuff from everyday consumer junk. I dont have enough thumbs to put up.
It's easy to throw a video onto CZcams. Not as much when you take the extra time to make the video concise yet meaty - like this video; well done.
By far one of the best explanations of IR signaling I've ever seen or read ... I definitely understand it 50% better than I did before watching the video ... but I am still uncertain how this knowledge can be applied to different protocols such as Sanyo, Sony etc. I'm going to power up the scope and see what I can figure out. Thank you for once again producing a quality electronic tutorial.
That's a great job done. I had been trying to do this in software on an ESP8266. Thanks to your informative video, especially the debug part, I am able to send IR from the ESP8266 and ultimately anywhere in the world!
Thanks Dave! You managed to put so many different topics into a simple project like this and kept it easy enough for starters to follow. Great Video, I really enjoyed it :)
Thanks so much for this. With this code and some remote control codes I found on the web I managed to regain remote control of my amplifier. It worked on the first try.
Dear Dave Master,
Thank you for sharing your vast knowledge with us so enthusiastic and smart.
Thanks Dave!
i used your code to make a AC ON/OFF control for the Dometic HB2500 Airco. As far as i known no replacement remote controls are available for this Dometic HB2500 so i am making my own to help out a neighbour. He was told to buy a new Airco for his RV when his remote control broke down.
Greetings from the low lands :-)
Really impressive, informative with full clarity. Thank you.
Really makes a nice change from teardowns. Nce job. Thanks Dave.
I recently made a remote control and IR receiver for dimming six leds individually. Used a timer to create the carrier signal and used the UART with a baud rate of 2400 to send the information, worked liked a charm :D Each transfer consisted of four bytes, the first and last byte are address bytes, I hardly get any bit error :)
Great video! I like the fact that you use the arduino platform, because it is easier to write code for than the usual development systems from AVR or Microchip.
A good little bit on reverse engineering. I like the fact that you pointed out something that not many newcomers (to programming) catch; the fact that subroutine calls do not take zero time to execute, especially when they have to change registers or interface to the real world... usually not a big deal, unless you are writing tight timing loops, and then it really matters. Good job.
Hello Dave,
a great video!!
For me it was always something mystical, when I read of decoded protocols. Thanks for your explanations.
Always great videos...ive watched you even before i started engineering and you're the real deal!
Great video, just what I needed to understand how IR remote controls work :)
This wold make a great new weekly segment! Great video :)
Huge thumbs up. I actually wanted to do a very similar project just the other day, I needed to clone a flimsy remote control. Thanks for the info, now I think I can tackle the task.
As you saw in the previous video, I am using the Arduino for the matrix display, it came with an Arduino driver and connection board.
Really interesting and informative. I am sure that various experts can take pot-shot criticism at various details. However it takes real cojones to produce and share this. Thank you.
Thanks for the video, Dave. My cable TV provider is going all digital so I need to use an external digital decoder box to be able to pick up all the old channels. I've been wanting to make a device that can send the IR codes to the external box. This video has certainly helped me to work out how to decode the IR signals sent by the remote.
Well explained and from many ways of capturing!!!
Well done Dave. This video is really useful. The setup and execution is a lot harder on your end I'm sure, but we get real meat - soup to nuts! Thank you for your efforts and please do many more like this. This is 100 times more valuable than a review video...
I miss this kinda thing, awesome vid
the BEST EVER tutorial about IR works. TOP! thanks!
Excellent video Dave, also a representation why I use AVR Studio and native C to do my projects. When you do a simple loop, toggling an output on the uC, the Arduino sketch gives about ~200kHz square, compared to a C loop's ~3MHz! Much faster and not much more complicated. Cheers!
Great video. For solving the timing issues what about :
1) Generating the signal inside an ISR with proper timer setup. Signals might be a little bit too late (because of the delay between the ISR and the signal is finally outputted on the pin) but at least it wont drift over the time.
2) using UART
I ran into this style problem (the timing of a carrier frequency) when driving led strands over software spi; I learned a valuable lesson about digitalWrite that day. Very cool stuff. I would really like to have seen a quick note in the video reminding people that the more human friendly code is REALLY time-inefficient on these limited platforms. At least the reminder is in there about what caused the problem.
this is pretty cool, when I got my first car, I used my remote control watch to start my car and open the doors, I didnt know about NEC protocol so I was decoding hex code, it was working pretty well, but I wish I had new about this decoding technique
What I enjoyed about this video is not the programming, although that is always instructive, but the reverse engineering of the raw pulses into a carrier freq., pulse codes, NEC standard... Big thumbs up video for newbie hackers and those who just want to understand how things work! Are there many major IR coding standards besides NEC?
Another very well known one is RC-5 (wikipedia.org/wiki/RC-5). It runs offically on a carrier of 36kHz, but a lot of manufacturers used 38 due to being misinformed or lazyness. It works anyhow. The bits are a fixed lenght where the direction (rising or falling) of the slope in the middle defines it's value.
The toggle bit Dave talks about is used for ch+ and ch- for example. It prevents to skip 5 channels if you keep the button a bit to longue.
What a bloody great video Dave.
Thanks for this! I love tutorials like this.
Amazing video with some nice tips here and there. Great stuff.
If you want to see some truly twisted IR encoding look at the MILES 2000 a.k.a. military laser tag. The older system used a relatively slow IR signal and when they decided to update things they still wanted to be able to use the old gear so they snuck in the new bits inside the existing bits. As I recall it was something like they split up the high time from one 'long' bit for the old system to many short bits for the new system. The old receivers would filter out the new fast bits and still work just fine and the new receivers would be able to 'see' the additional data.
Since it did not add value to the project we were working on at the time to decode the actual MILES 2000 signals we skipped it (we were adding haptic feedback to the soldiers gear so they would feel where they were hit.)
Mega thumbs up! amazing explanation for a semi-new player.
Thank you for this video, it was explained very easily and simply. 🤝
We are going to do it the old fashion way ... Let me grab my digital scope lol. Good fun tutorial I think I have a few remotes I can play around with here.
Dave, there exists (or did) an IR receiver with a carrier frequency of 455kHz. I have succeeded in sending audio over this IR module (something like a TL9000--but I seriously doubt that's the exact part number since it's been so long). Most interesting of all is I managed to send DTMF codes over it (to a DTMF decoder) for remote control applications, and even multiplexed and patented it after I added a feature that allowed more than one DTMF encoder button to be pressed and held continuously with a receiver modification to match. Then this wonderful high frequency IR decoder was discontinued--go figure. I think I got all mine from Vishay...still got a few of them though.
Yeah, I deliberately wanted to do that, and was hoping the digitalWrite routine would be slow enough to show that. It didn't let me down!
I have been experimenting a LOT with this crap. It's a real pain in the butt to get enough documentation to know what the heck to do. I have spent a lot of time accumulating documentation.
I'm doing it with a PIC chip. Specifically a PIC16F1503. I'm so close I can taste it. I have a handheld Qunda IR Remote Control Decoder. It sees and decodes my PIC's IR output but the TV is not. More tweaking needed.
One thing I noticed is that you assume is that the 38Khz duty cycle is 100%. ie., 50% ON, 50% OFF. It's not.
33% on time is more like it. Keeps LED's from burning up. They are usually pulsed at some insanely high currents.
I could write a book. Argh. Thanks for the video!
mike94560 I’m also working on a project that deals with a PIC16F883 and IR , how far did you get !? Can I see your results and how you got to where you wanted
I quite liked that video. Thanks, Dave.
Thanks for the explanation and code.
You could use one of the AVR timers to generate the carrier with an isr routine to blink the led, then just enable/disable the blinking in the isr for your bit times.
Excellent video.
More logic analyser videos!!!
I'd love to see you decode some code on an older videogame console or an old PC.
Very interesting for a beginner - thank you!
more of this style of video, please.
An Arduino sketch IS in native C. It's just calling an abstracted routine to write to the IO pin. You can simply bypass that if you want and the sketch will give you the exact same speed as AVR studio.
Great, at last totally understand! Thanks again!
As I pointed out to countless people, yes the previous hack was much simpler and faster, that's why I did it originally. But this isn't too hard, even if you have to write your own IR library as I showed, but yes, you need at least some programming knowledge. You can just cut'n'paste code though of course.
Excellent video. You even managed to review some code!! ;-) Great complete implementation of a smart solution to your specific need. But yeah I'm always a bit wondering as how fast these Arduino can actually deal with "real time" processing.
That would be the more efficient approach, but I think that this video is more about how to use your gear to reverse-engineer or diagnose a serial protocol and how to implement it in A microcontroller. The IR protocol is just a special case and Dave did a good job by not introducing PWM here...
Made me subscribe. Great job.
I know this is an old video, but for anyone watching that's having trouble getting the carrier frequency right, another approach would be to use a PWM channel and toggle it on and off rather than "bit banging" the carrier. The IR libraries Dave mentioned at the start likely do this. I'm sure Dave just chose this method because the code is easier to understand
I couldn't get any IR libraries to work on the ESP8266
According to the C11 standard: "The result of E1
Thank you. Very useful video. Maybe I can use this knowledge to make an Arduino talk to my Fluke
I really like this video, Dave. Very complete and everything. :)
Thanks! Very clear explanation.
Aah I see! thx for your explenation and fast response! I learned a lot about the code and how to send it. I allready knew a bit of IR but not how to send the codes. I only used my arduino once to decode IR and turn a LED on and off via my logitech harmony wich i programmed for a old sony VCR wich are the easiest to decode. anyways thank you very much for the video and your quick respose really apreciate it : )
IR LED's draw as much current as you give them, they don't "take" or "draw" current. You force the required current into them with a suitable dropper resistor.
I guess the long burst up front is for the receiver to set its AGC.
And the stop bit so every bit is followed by a leading edge, so you can just measure the time between leading edges.
Its interesting to think about how the transmission is often designed for the receiver to receive it cheaply and reliably, rather than for the ease of the transmitter
Great all around video.
Nicely done .. Loved it
Great Master, thank you. I am still searching for GPX-Device signals.
Thank you Dave!
a) I would have used a PWM signal to generate at least the clock signal, so you don't have to tweak the timing. The 'professional way' would be to write the whole IR-signal generating code in the overflow interrupt of the PWM timer. But don't worry, for a demo your code is more than adequate.
b) It could have used a little more cowbell.
That's a really great video, "real world" problem solving neat !
Andy Collinson in your blog have a nice ir project.
Great video! Very helpful - Thank you.
Subscribed!
Thank you! This was very helpful!
Excellent point! Would you mind making a video about this particular topic? I was wondering how exactly to "port" a Arduino IDE sketch into using base functions instead.
Well, when it takes 3.5us to write to an output pin using the recommended method, that could best be regarded as "dog slow"
Where is the Double LIKE / Double Thumb UP button ? :) I need to discover the code for a function of the remote and had not a clue how to do it. You saved me hours of head scratching. An now i know to emulate the command. Thank you !
This is a library, and I think it's simple enough beginners can use it.
Yes, great job !
Great real world project, simple approach. Loved it. Brace yourself for 1000 alternate opinions on how everyone else wants you to skin that cat.
To be precise, two clock cycles on the Atmega328, if the register and bit to set are immediate/constant. SBI instructions are nice. =]
The other fix would be to replace Arduino's digitalWrite routine with one that optimizes down to the single machine instruction it should be. Considering the "digitalwritefast" implementation is entirely source compatible and has been around for years, I've no idea why the Arduino team hasn't already included it.
awesome , and fun to play with! thanks
I've done this once. My solution for the carrier was to use the PWM module in the PIC I was using at the time to generate it. One side of the LED went to the PWM output pin, the other went to a pin with the data.
@Peter Mortensen The led was sourced from the data pin, and sinked into the pwm pin. Two pins, one driving the high side, the other driving the low.
Thanks Dave!
Really liked this video!! Really helpful :) thanks!
Thanks @Vorsteven for the clarification. Yes I was confused by reading that the IDE is based on the Processing IDE and that Wiring was influenced by the Processing language. My bad, sorry.
You beauty! Great explanations and even pretending to make a mistake ;)
For starters Arduino is perfect and I think a big part of viewers are starters so yeah. Not everyone is an electronics expert like you.
Once again. Thank you for the awesome video :-)
very helpful! thank you
So that people can just cut'n'paste setup routine into other code, it's more portable. setup is an Arduino specific thing. The while loop at the end stops it from running more than once. It's example code.
Thanks a lot Dave! Awesome video :-). I was surprised that connecting the IR LED directly to the output pin actually works. My readings said that one has to use a transistor, because IR LEDs draw more current than normal LEDs. So I went directly for a transistor circuit, but never brought it to work. Does your LED light up as bright as the original remote-control, when filmed with a digicam? I thought the brightness was my problem, but now I think I should look for the problem in the IR-Code...