Interrupts on Arduino introduce random ~10µs jitter, which is roughly consistent with the jitter amount in your tests. For tight timing, try to disable interrupts during the laser toggling and instead wait for the sync pulses from the photodiode by directly reading the pin register in a blocking while loop. The serial communication can be done between frames while waiting for the frame sync (if necessary, this will add one more disk rotation with laser off as a "blanking" interval).
Thanks for the info. I definitely need to optimize the code - I'm still pretty inexperienced with the more advanced features of Arduino. Looks like I have some reading to do.
@@benmakeseverything Yeah, I was also surprised by this "easter egg" when trying to find out why my pulses randomly become 10us longer a few percent of the time, which is pretty bad for time-critical bit-banging. Turns out it's a known issue, but it's pretty straight-forward to disable interrupts around the time-critical part of the code. Just be aware that you can't use timing functions (except microsecond delay) when interrupts are disabled, so the code has to be very "basic" in terms of execution flow (wait for trigger, write out the laser pulses, repeat; and do the "smart" stuff only after the frame has finished).
@@bazoo513 No idea, but most likely it's the Arduino bootloader implementation. Interrupts are used to keep track of the internal timers among other things.
Hey great video, i'm just a layman hobbyist but the way you work through your project outlining the errors and mistakes you encounter along the way and rectify them (rather than editing them out) really makes your content shine with extra value for me!
Agreed! I got value from this in the first minute or two when you talked about mirror galvanometer systems being too imprecise for text. I'd been thinking of prototyping one for a while, and you saved me that wasted time. The rest of your own journey was really well documented and interesting. How long did the whole process take you?
When I was a kid, my dad built a cool persistence of vision display with LEDs. Not a projector, but it made it look as though a LED marquee display was floating in the air over the device. It used those same optical transistor switches. This was in the early 90's, he envisioned miniaturizing it into a small ball to be used as a christmas tree ornament. He never moved further than the prototype, and a few years later similar devices were available retail.
He should have stuck with it, could have made money on it. So many people give up on ideas even when they have the market beat. I've done the same and missed my chance.
@@LeoInterVir hopefully i will be able to cash in my innovation that is very similar to this projector. But also sad that there is always someone in the world who steel my ideas
@@LeoInterVirIf you do stuff like this as a hobby it happens constantly. I used to think „I should have went with that idea“, but the reality is that at some point the boring stuff begins. Creating a prototype is exciting and sort of „easy“ or at least what drives me. But once you have to wrap your head around scalability, production, financing, marketing, distribution, legal stuff like patents or even licensing from others, it quickly get‘s a whole lot more boring. And still if you go through that effort, someone else can beat you at it. I‘m not trying to discourage people from developing consumer hardware, but don‘t feel bad for not sticking to a project. Ideas will come and go and eventually you will have a project where you will feel the need to share it in the community or even build a business around it! Until then it‘s an awesome hobby where you keep advancing and learning and having fun :)
If you don’t use tarduino delay functions but rather use noops and direct port writing you should be able to get a laser toggle every 2-4 clock cycles. You may want to invest in a MOSFET gate driver IC though.
@@benmakeseverything You can also use a timer compare output to get a 1 clock cycle. As long as the total ON-OFF loop is greater than what you need to reload the next loop which is around 16 clock to load 2x 1 byte from an array and increment index. Also by default an ISR call will push and pop many things when called and it takes around 30 cycles to do it, plus the ISR call isn't constant, I don't remember all but it's something between 3 and 7 cycles depending on what instruction is currently executing. Might be worth checking for ex rising edge call ISR, then in ISR wait for falling edge in a loop. That way you have a 1-2 cycles jitter max. Overall great project very well done. I'm impressed by the results, keep the good work. Are you planning on publishing the code?
@@philippegauthier1776 I had a feeling the jitter was likely down to the software, ISR timing makes complete sense. I guess one could also take the timing pulse and smooth it, but your suggestions sound more likely to be based in experience and thus more likely to work :-)
I also this it is an ISR issue, but rather coming from the timer interrupt. Arduino, by default, has its timer0 configured for millis() and micros(). The call to the timer0 overflow interrupt basically inserts small delays in the execution of your main code, causing jitter in your pulses. You might want to try disabling timer0. Or reprogram the timer with custom settings for your needs. (also, if the external interrupts turn out to be a problem, you could get away with a single pulse per rotation. Because the rotation speed won't change much within one revolution, it is safe to divide the time by the number of mirrors)
@@thomzz3449 Actually they could configure one of the MCU timers to count automatically in hardware on external interrupt and overflow after a certain number (amount of mirrors). The counter could still be initialized to zero by a software interrupt on the second ext int pin, but I would disable it after the initial position is known to save cycles (since I would not expect it to ever skip a mirror).
I love the retrofuturistic cyberpunk aesthetic of the scan lines and slight wobble. There's also a lot of tricks in both software and hardware to get better resolution. Definitely look into faster chips, the ESP32 is great in that regard. You could also use a shift register or serial control chip and external clock to control the beam pwm. Basically write your bytes into a register, and clock out bit by bit directly to the beam control. That will give tighter temporal accuracy as well.
ESP32 is a great chip, highly recommended. Also better to run it to the wire instead of on top of an operating system regardless of it being a real-time operating system or not.
I was going to suggest he tear their hair out and just get a small FPGA dev board. Good excuse to learn some HDL if anything and really can get extremely tight timings even on low end chips.
@@Noubers Yeah that would actually be the 'right' approach for flawless timing. To get it perfect each mirror also needs programmable nanosecond scale offsets to account for slight angle variations.
Dude, This is AWESOME !! To me the flickering and wobbling add a special sci-fi vibe to your texts rather than a flaw. Loved it. All the best. Keep going.
I wanted to build just this about 20 years ago. It was explained to me that it would be a bad idea compared to galvos, because the laser would spend a lot of time off, which means most of the light energy would be wasted and produce a relatively dim image. But how fun it is to see it working regardless.
Impressive results! I wouldn't have expected a 3D print to be stable enough, it's nice to see that a commercially-made polygonal mirror isn't the only option. But you don't actually need a faster CPU: The arduino you're using would be perfectly capable of precise 62.5 ns resolution pulses -- i.e. the full 16 MHz system clock rate -- if you exploited the Atmega328p's powerful Timer/Counter peripherals for the task. Here's how I'd do it: - Set up the 16-bit Timer1 peripheral in free-running mode (WGM mode 0) and with full system clock rate (i.e. no clock divider). This timer will just count up continuously; the fact it'll overflow from 0xFFFF back to zero every 4.096 ms is of no consequence as long as that's longer than a single scan line. - Wire the per-scan-line trigger to the ICP1 pin. This way, the input capture module can record the exact "start time" for each scan line _in hardware_ before triggering the input capture interrupt to set up at the start of the scan line. - Wire the laser to an additional XOR gate, whose inputs are wired to the OC1A and OC1B pins. The output compare channels will be used in 'toggle' mode so that, in conjunction with the XOR gate, they can effectively act as a single output with a two-element buffer, rather than two separate outputs with only single-element buffers. - The main task of the input capture interrupt (TIMER1_CAPT) is to copy ICR1 into a register, and then copy of the next line of the image into a separate buffer, adding that ICR1 value to each element of the buffer to offset it to the measured start time of the scan line (using 16-bit unsigned arithmetic so it overflows back to zero the same way the timer does). Aside from that, it's just a bit of bookkeeping at the start to reset the outputs to a known state (set COM mode to 'clear' and trigger FOC), and a bit more at the end to prime the output compare modules (set OCR1A and OCR1B with the first two values from the buffer, set COM modes back to 'toggle', and enable both compare match interrupts). - The compare match interrupts (TIMER1_COMPA and TIMER2_COMPB) then have a very simple task: each time their channel finishes triggering, retrieve the next value from the scan buffer and put it in their OCR register. That should be the absolute first thing the interrupts do, and then after that there's only some light bookkeeping, to clear their interrupt enable bit if the _next_ next value would be past the end of the buffer. - The interrupt for the index trigger is even simpler still: all it needs to do is reset the value of the row counter back to zero... and I guess you could flop image buffers here too; change the pointer the scan line interrupt uses to find the image to point to the frame that was being rendered while the previous frame was being displayed. The way I'm proposing to use the interrupts here is in a sense the most fundamental design pattern used for serious interrupt-driven embedded programming. Almost all hardware peripherals are specifically designed around this usage pattern, understanding that fact can make the rationale for their designs much easier to understand. Even though an interrupt seems instant compared to polling, there's still too many sources of jitter to rely on them to take actions that require precise timing. Rather, their responsibility is just to refill a hardware buffer from a software buffer before the hardware runs dry, or empty an hardware buffer before it overflows -- something that still has to be done "right away" rather than "next time the control loop feels like checking", but that way an extra microsecond or two of delay waiting for another interrupt to finish doesn't compromise the timing accuracy. This pattern is actually used twice as I describe it above, both copying data from the ICR1 register to use to populate the scan buffer, and of course moving data from the scan buffer to the OCR registers. With the design, you'd inherently have the full 62.5 ns precision of the full-speed system clock, and using both channels together means pulses could be as short as a single clock cycle, too. The interrupt execution time would limit the rate at which you could continuously switch it on and off, but even with minimal effort I'd expect at least 100 kHz. With high effort (i.e. implementing the compare match interrupts with hand-written assembly code) it'd be entirely plausible to achieve a maximum continuous pulse rate better than 1 MHz.
Yes I was going to write this. I've made some POV displays, and found it's stable if you just use the position trigger to restart a timer set to fire X times (X being the horizontal resolution you want) with the timer counter set based upon the amount of time it took for the previous revolution. So if the previous rotation took 1 second, and X is 16, you set the timer to fire at (16/1)hz - if it took .1 second, it'd be (16/0.1)hz etc. Basically it'll automatically adapt to the speed of the motor. The timer interrupt then just turns the lazer on/off as needed. You won't get a steady image in hte main thread, as the code is being interrupted at "random" intervals. In your case you'd further segment based on the number of mirrors. As long as the mirrors don't wobble it should be rock-steady :)
18:36 this shot looks really cool. It looks like a simple image slapped on in post production but the reflections of the laser show you whats really going on
Cool project !!! Some suggestions: Use 2 hall sensors with embedded magnets for possition, less air resistance is less noise and vibration. And your unballenced extra arm.... I would use shims and a screw for tight compression together with lock tite that screw. The shims define your angle. You can make a stack of different thicknesses and adjust very precisely with no movement whatsover. You could use the remote controll engine of the ESP32 for laser controll + you get wifi and ble for free. You could offset different colors and adjustd the scanline for the laser offset or create a multi color single point first.
For switching the laser you should use the 16 bit timer and do a timer compare interrupt. Set the prescaler to something that gives you adequate range and accuracy. Then just update the compare register to get the laser pulses you need. Remember to set the timer to reset on compare match
That is how I i can generate a bit bang midi on an Msp430. Works really well. Timer interrupts are useful as long as there are other things to be done but the full attention of the cpu is superior.
Instantly one of my favorite channels now! You know what? Make a hologram with it? Some holographic projectors use an array of speakers on top and bottom, to create a levitation field. Then they use a small white bead(sphere) as a "pixel" representation. Then there is a camera that tracks the small sphere and projects a laser light on it. The resulting image is a actual physically interactable 3D hologram!
Cool project! Decades ago I also had a notion to build something like that, but 256x192 (sinclair's screen, you know) with two rotors for frame and line respectively (50Hz, 16+KHz). MC's back then were too slow, but we already had some PLAs, so it wouldn't be a big deal. The main stopper was the mirrors fabrication precision needed. There was impossible to find needed machinery, so the project died far before any in-iron implementation. It's cool to see that now it's possible with no that much effort.
Thanks! I would like to do another version with higher resolution - perhaps 16 mirrors and 4 lasers at slightly different angles, giving 64 "pixels" vertical resolution. The mirror array is definitely the hard part...
This is great! I love how you managed to do it with a single laser and multiple mirrors at slightly different angles. Back in 2002 I tried to make a laser projector with 8 lasers, spinning mirrors and a parallel port. It didn't go so well 😂
Thanks! I found your video on constant current drivers really helpful when I was learning about how to power this, so thank you for making that! You may be interested to know I'm currently working on an improved version of this with much higher resolution and multiple colors. It will (hopefully) be done soon.
Just one precision regarding the use of constant current for driving Leds. Led's behaviour is similar to Zener diodes, it "limits" its own voltage generating lot of heat after the elbow is reached, this is why controling the current is much more practical.
Great job! The wiggle of the text is similar to the splash screen of games on old computers like the ZX Spectrum. You can project your text or image onto a horizontal series of falling water drops or solid flowing water in the form of a flat waterfall so as not to fight the wiggle but to make it an "interesting feature" of your project.
My ZX80 back in the 80's glitched every time you typed a key because the video was done purely in software, throwing the generation off while it was doing something else. Using reverse engineered code for the PAUSE function though and if you timed things precisely in all the possible code paths, literally adding up the count of Z80 CPU instruction cycles and balancing them out for all code paths padding with NOPs if necessary, writing fairly simple games that would be flicker free was possible, a lot of fun and more interesting than schoolwork :)
I figured he would use two sets of moving mirrors to achieve the raster effect like most show projectors but I'm impressed by the simplicity of the adjustable rotary mirrors.
Very nice work - thanks for letting us know what obstacles you found, as we all learn from each other. Some of us bold fail and build again. It is nice to see a win from time to time.
This is very similar to how the laser scanner assembly in a laser printer works. The laser is controlled by an analog video signal. Also, using front-surface mirrors may sharpen up the images.
A good point, Shawn. Maybe parts and ideas can be extracted from the laser scanner assembly in the laser printer (I suppose thats when the drum in the printer is activated to partially keep the toner) .
I built something similar a few years ago but it was for a diy laser projector. I instead had the lasers go through a dichroic mirror setup (for combined color), hit the mirror wheel, then hit a mirror that was attached to a planetary gear output with a motor that had a cui encoder (to control beam angle). I used an fpga though for controlling the drawing. I used a resin printer and didnt have to adjust my mirrors on my mirror wheel. I never finished the whole project due to lack of fpgas at the time (was trying for atleast 4k but was stuck at 2k due write limits due to fpga clock) and not correcting the beam sizes for the 3 laser diodes but this had definitely peaked my interest when i saw it.
This is a really awesome project, Ben, and a nice combination of old and new projection techniques! I can tell you that one part of the causes for the shuttering effect you noted actually is the carousel that you built, as each transition causes the image to "break" for a split second. You'll also get closer and more uniformly focused lines if you anchor the pivot point for your mirrors at the center height of those mirrors and in line with your laser. An interesting point to note is that a lot of larger home theater projectors use micromirror devices with broad 2D micromirror arrays within, one for each raster pixel art either the intended full resolution or some simple fraction thereof (and then vertical and horizontal servos in the latter case to multiply the apparent pixels); but many pico projectors use a module with just a single micromirror on centered vertical and horizontal pivots. My own limited understanding says that's identical in concept to the galvos in light show projectors and they just use tighter control. It might be fun to see what you can do with that knowledge.
I've seen a few different variations of this type of design, and I actually tried to make my own a few years ago! At one point I used a mini disco ball to get the mirrors. The version I made was wobbly with similar problems to your first prototype but I never took the next step to fix all the issues. I'm impresses that you stuck with it and actually got it working that well. Nice work!
Nice work! I love seeing the process. As satisfying as a 30 second montage is, it's important that people see that big projects take time and patience. Take my sub good sir, I look forward to what you're going to make next :D
I love it! I had an idea to do this myself years ago (even using multiple mirrors on a hard drive motor) but I couldn't crack it because of the complication of needing a second motor/mirror rig to get the vertical scan. Your solution of just using angled mirrors on a single motor is simple and elegant, very nicely done! Can I now throw a challenge at you? There are high power 650 nm Red and 445 nm Blue lasers available... RGB is your obvious next step!
Really impressive Ben. Well done on the persistence too. couple of ideas for your future versions. 1) Not sure about the availability of red and blue laser diodes that could have their output balanced with this green one, but RGB would be awesome! 2) how about using the super-fast HDD heads arm in a vertical orientation, with a small mirror on the top. you could use it between the diode and the spinning mirrors to dynamically apply micro vertical adjustments by your microcontroller, so you could programatically control the up-down scanline sweep, rather than manual mirror adjustments?
Amazing project! :) You could try altering the mirror angles in a cross pattern, so the point of mass would be equalized by the point of mass of the mirror on the other side of the wheel. This would also mean your code would have to change to render the lines in alternating manner from top/down to middle, instead of just top to down. Try doing anything you can to reduce the vibrations. It will help with wobble a lot.
@@benmakeseverything Would it be possible to put only 1 mirror and angle it with a stepper motor as it rotates around? It would require a Rotary Slip Ring but if you can programmatically adjust the mirror angle maybe you could get better results that way?
@@critical_always Yes, @thatonesnowboarde, the stepper motor could also be a good solution, Im just worried the steps might be too harsh for such small adjustments and lead to vertical wobble. An oscillating mirror attached to an electromagnet, like ones used for camera or dvd drive lens focusing might be a better option, but controlling it is very hard, especially if mirror is heavy.
I came across this video on Tic Toc and thought I'd go find the actual original content. Glad I did, thought it was a really cool idea/project. Arduino is something I have been wanting to learn how to use, I have had a project in mind that I have been wanting to work on for almost 10 years now. I queued up a few other videos and subscribed.
Thanks, I had no idea my stuff was being shared on TikTok, as I don't use that app. Appreciate you coming and watching the original. Arduino is definitely worth learning!
Pretty impressive results! A couple of ideas to improve, I'm not sure if they would be practical to implement. To stop the wobble, use a fast photodiode and a mirror in the output path of the laser, to synchronise the laser switching with the actual position of the laser beam. Have it inside the housing, laser turned on until it hits the photodiode, then quickly turn it off before the beam reaches the start of the opening. The switch faster, use the hardware UART and encode the character table into bytes, that would limit you horizontally to 8 pixels per character, unless there is a mode that has no start nor stop bit
A chain of shift registers would give you arbitrary width. Push bytes via the uart into the shift registers, then clock out bit by bit to control the beam.
This is a super well done video! Extremely informational, but you did a great job of breaking down some of the more advanced concepts and presenting them in an easy to understand manner. Such an incredibly cool project as well!
I just stumbled on this. Very cool. It reminds me a bit of the old mechanical televisions. What was wild is that your final design looks a bit like a "Mervyn 30 Line Mirror Drum". Another idea might be to look into a "mirror screw." At that point if you can get PWM driver for the laser, you could even display rough images.
You can also glue small, front-surface mirrors to small speakers and bounce the laser off of them. By using the right combination of signals you can do, X-Y vector graphics and text.
I vaguely remember reading something about holographic lens being used in Supermarket POS scanners doing a similar job of scanning a large area without the need of expensive optics.
You could possibly save and cut code complexity by only using one sync sensor (the top one for full rotation ) and divide the result down to x mirrors. This would probably net you a possible higher rotor speed and less power consumption by the motor for less resistance by the little fingers on the bottom.
There are short throw SD and HD Pico Laser Projectors for watching movies and such. Some are standalone while others are incorporated into the chassis of a computer, smart phone, etc. It might not be what you were looking for but worth mentioning.
Congrats. I did a similar 32bits/line laser projector 3 or 4 years ago. The only way I managed to get it to work was by using "thermally stable materials" all around. Equally stable mats in the linear and non-linear domains too. Therefore no composites, lots of exotics, not to mention quite a bit of carbide endmills consumables and crashes. I liked the HDD silent motor idea! Good vid, keep it up.
Interesting... I was just thinking an accurately machined aluminum block with X number of sides (chrome plated and polished to a mirror) would be perfect, but maybe it would still have issues.
@@benmakeseverything Wow. Never thought of polished surfaces! I've 4-ax the mirrors assembly on the rotary, pocketed holes and used mirrors you commonly find for co2 lasers. If machined clockwise only (i.e. no reversal/backlash) you should get within 5~10 microns all around. Okay for 100 meter! Side note; you couldn't possibly be using worst than the arduino platform latencies and overheads. Register level programming is of paramount importance for this project (stm32, cube ide here).
Very nice I designed a similar device 20 years ago ..I could not get the mirrors flat on the faces faces of the octagonal wheel ..So i decided to go with the galvanometer solution.Back in the day there was no 3D printing .I i had to do all by hand ..and a small lathe .It got me nowhere ..So i commend you for your effort
"Man... it's so annoying how wobbly the text is." Bro you have an Amazingly cool visual effect that genuinely makes the text look like old sci-fi. I'd go as far as to say Don't Fix It, or at least don't get rid of it fully, because it looks Really Good.
Handheld barcode readers have a little mirror oscillating in them. Use that insted of the hard drive. To have multiple lines - use another one with a lens to restrict it's angle / or use 12 cheap lasers. Also switch to esp32 - much faster, has bluetooth already, can act as an AP to provide a webpage for settings. Good job!
I suspect repeatability would be an issue with the oscillating mirrors - might work well for a y axis though. Big benefit of the mirrorwheelofdeath is it acts as a flywheel to get pretty consistent speed, which is also (angularly) linear since it doesn't have to reverse direction at the ends - it's what the fixed barcode readers in supermarkets use (you probably knew that though, by the sound of it). Actually laser printers do too, at least the ones I've pulled apart used to :D
I absolutely love this idea. And im wondering if you could use smaller mirrors and maybe stack them for multiple lines of text? I wanna build one as well but im limited by budget and knowledge of code lol so i hope you make another video
Wow well done Ben! It's pretty hard to challenge the cost of a large screen TV for a display system but for things that only need a one or two line display this might be the ticket. Sporting events? Business meetings? Directional signage?
You've probably already found what you need to fix the timing issues, but my suggestion would be to use the AVR timer/counter system directly rather than using the Arduino functions. Refer to the datasheet for the AVR model you are using for details. There are a variety of approaches to get what you want, but generally you would set the timer in countdown mode, enable the timer ISR, and set the compare output mode to toggle on compare match (PWM mode). In the ISR load the count for the next toggle time. The timer/counter configuration takes a bit of work to understand, but once you get it it's a very flexible and capable system that should be more than sufficient for what you're doing here.
Very nice. To avoid the need for timing adjustments in code for the scan lines, and perhaps to fix the wobble, you could try a sensor assembly just before the output window. Its purpose would be to detect the beam and start timing based on that. A light guide of some kind to a single detector might work. Power the laser at the start of a sweep, wait for a signal from the detector, and then the horizontal position is time relative to that. Have a single adjustment in code to account for any skew in the detector, which could be set through a web interface if you later used an MCU with WiFi such as an esp32.
Well done! I have been envisioning a very similar project for a couple years and never got around to it. This is a really clever implementation. +1 on the advice to ditch the Arduino. Maybe a Teensy 4 would be a good candidate, thanks to the Cortex M7. If you're feeling really ambitious, you could also switch to a hobbyist FPGA, like an Alchitry board or a TinyFPGA BX. Also, maybe you can order a planoconvex lens from ThorLabs or Newport to tighten up the resolution? Again, amazing stuff here!!
The idea of creating horizontal scanlines is mind blowing. Coming up with this means you must be some ingenious mind 🤭 All fun aside; it won't be long before young kids don't even realize that it all started with scanned images, although the original Nipkow disc used to have vertical scan lines instead. This is a cool build and definitely not an easy project to complete 👍
Cool project! To reduce the number of interrupts (and input sensors), perhaps you could omit the ISR_rev() function, and when you need to get the current mirror index, use a modulo-8 operation on mirrorFlag. This operation returns the remainder of a division rather than the actual result, which would be your current mirror index every time, regardless of the mirrofFlag count. Should be true even in the event of an integer overflow, as long as it's unsigned. Alternatively, what if you just reset the value to 0 in ISR_mirror() every time the value reached 8?
Saw this on Tik Tok someone is just taking content off your page but wanted to come here and give you a comment and a like and let you know it is a really cool Lazer projector you created.
I don't have the time to invest in the learning curve to build this, but love the effect and would buy one right now if the product was available to purchase. Great work!
I love the complete lack of any sort of distortion, de-focus or other destruction of the image when you move the text around, even around corners. It makes it almost holographic in nature.
as some advice for you if you make a future version to make it work better and much safer and cheaper. the simple solution is to use a powerfull led and 2 lenses(I actually used a similar method to get my
I actually like the jitter. It reminds me of the original hand-drawn cartoons where moments of stillness were diliberately given 'emotional tremor' 😊. Anyway, I think for an arduino, you have hit the best out of it and maybe an ESP, same price now(ish) and would help you out. Well done. A lovely project well described!
;Interesting project and very impressive. I've never really appreciated how fast code actually runs, but considering how insanely fast the lazer needs to be on an off.. yet you can easily add logic, variables etc. It shows how insanely fast processors are !!
I have been doing some thinking. It is possible to synthesize excited bromide in an argon matrix. Yes, it's an excimer frozen in its excited state. It's a chemical laser but in solid, not gaseous, form. Put simply, in deference to you, it's like lasing a stick of dynamite. As soon as we apply a field, we couple to a state that is radiatively coupled to the ground state. I figure you can extract at least ten to the twenty-first photons per cubic centimeter which will give one kilojoule per cubic centimeter at 600 nanometers, or, one megajoule per liter.
you said that you have a CNC mill. you will get more stability if you make the spinning parts out of Aluminum instead of plastic. You already made proof of concept. Also the Al part can be made with thinner wall thicknesses. balancing the spinning part you made would be easy.
Really awesome project ! i like how you filmed and narrate the video, also you didn't give up and build comething that actually work. Good job and i hope you will make a project 4.0 and a video about it ! Another susbriber :3
This is a fascinating project. I also wanted to mention that your style of code walkthrough was very effective. Best wishes to you, and keep up the good work!!
Knew it! When I saw that he'd killed the lasers, I knew it was the capacitor in the power supply. It's normal to put a cap to smooth out voltage in power supplies, and reduce the supply impedance during brief moments of high current demand. But that's for constant voltage supplies! I'm just posting this to congratulate myself cos I solved the problem, I'm pretty pleased with myself, I'm like Ben, I tinker but I lack proper electronics knowledge. So spotting that was a nice surprise for me that I got it right.
Excellent report, especially for the problems encountered. It's very important, in my opinion. Every development project faces issues. One that shines out is the lack of simple research like "would this thing turn on at this rate" and that info may be impossible to obtain for cheaper laser+controller combos. I know my own self, trying out things is great! Btw, in the end you said "in any ray" :D Spotted. Non-native here...
Interrupts on Arduino introduce random ~10µs jitter, which is roughly consistent with the jitter amount in your tests. For tight timing, try to disable interrupts during the laser toggling and instead wait for the sync pulses from the photodiode by directly reading the pin register in a blocking while loop. The serial communication can be done between frames while waiting for the frame sync (if necessary, this will add one more disk rotation with laser off as a "blanking" interval).
Thanks for the info. I definitely need to optimize the code - I'm still pretty inexperienced with the more advanced features of Arduino. Looks like I have some reading to do.
@@benmakeseverything Yeah, I was also surprised by this "easter egg" when trying to find out why my pulses randomly become 10us longer a few percent of the time, which is pretty bad for time-critical bit-banging. Turns out it's a known issue, but it's pretty straight-forward to disable interrupts around the time-critical part of the code. Just be aware that you can't use timing functions (except microsecond delay) when interrupts are disabled, so the code has to be very "basic" in terms of execution flow (wait for trigger, write out the laser pulses, repeat; and do the "smart" stuff only after the frame has finished).
What is the cause of that jitter? I don't think that IRQ and NMI even on ancient 1mHz 6502 were that "sloppy".
@@benmakeseverything im opting for a collab of you guys! as a C/C++ Engineer i could see a potential breaktrough in quality
@@bazoo513 No idea, but most likely it's the Arduino bootloader implementation. Interrupts are used to keep track of the internal timers among other things.
Hey great video, i'm just a layman hobbyist but the way you work through your project outlining the errors and mistakes you encounter along the way and rectify them (rather than editing them out) really makes your content shine with extra value for me!
Agreed! I got value from this in the first minute or two when you talked about mirror galvanometer systems being too imprecise for text. I'd been thinking of prototyping one for a while, and you saved me that wasted time. The rest of your own journey was really well documented and interesting. How long did the whole process take you?
agree!
When I was a kid, my dad built a cool persistence of vision display with LEDs. Not a projector, but it made it look as though a LED marquee display was floating in the air over the device. It used those same optical transistor switches. This was in the early 90's, he envisioned miniaturizing it into a small ball to be used as a christmas tree ornament. He never moved further than the prototype, and a few years later similar devices were available retail.
He should have stuck with it, could have made money on it.
So many people give up on ideas even when they have the market beat.
I've done the same and missed my chance.
@@LeoInterVir hopefully i will be able to cash in my innovation that is very similar to this projector. But also sad that there is always someone in the world who steel my ideas
@@LeoInterVirIf you do stuff like this as a hobby it happens constantly. I used to think „I should have went with that idea“, but the reality is that at some point the boring stuff begins. Creating a prototype is exciting and sort of „easy“ or at least what drives me. But once you have to wrap your head around scalability, production, financing, marketing, distribution, legal stuff like patents or even licensing from others, it quickly get‘s a whole lot more boring. And still if you go through that effort, someone else can beat you at it.
I‘m not trying to discourage people from developing consumer hardware, but don‘t feel bad for not sticking to a project. Ideas will come and go and eventually you will have a project where you will feel the need to share it in the community or even build a business around it!
Until then it‘s an awesome hobby where you keep advancing and learning and having fun :)
Showing the prototypes and their issues is very educational. Great job !
If you don’t use tarduino delay functions but rather use noops and direct port writing you should be able to get a laser toggle every 2-4 clock cycles. You may want to invest in a MOSFET gate driver IC though.
Interesting. I did not know that. I'll have to look into that further!
@@benmakeseverything You can also use a timer compare output to get a 1 clock cycle. As long as the total ON-OFF loop is greater than what you need to reload the next loop which is around 16 clock to load 2x 1 byte from an array and increment index.
Also by default an ISR call will push and pop many things when called and it takes around 30 cycles to do it, plus the ISR call isn't constant, I don't remember all but it's something between 3 and 7 cycles depending on what instruction is currently executing. Might be worth checking for ex rising edge call ISR, then in ISR wait for falling edge in a loop. That way you have a 1-2 cycles jitter max.
Overall great project very well done. I'm impressed by the results, keep the good work. Are you planning on publishing the code?
@@philippegauthier1776 I had a feeling the jitter was likely down to the software, ISR timing makes complete sense. I guess one could also take the timing pulse and smooth it, but your suggestions sound more likely to be based in experience and thus more likely to work :-)
I also this it is an ISR issue, but rather coming from the timer interrupt. Arduino, by default, has its timer0 configured for millis() and micros(). The call to the timer0 overflow interrupt basically inserts small delays in the execution of your main code, causing jitter in your pulses.
You might want to try disabling timer0. Or reprogram the timer with custom settings for your needs.
(also, if the external interrupts turn out to be a problem, you could get away with a single pulse per rotation. Because the rotation speed won't change much within one revolution, it is safe to divide the time by the number of mirrors)
@@thomzz3449 Actually they could configure one of the MCU timers to count automatically in hardware on external interrupt and overflow after a certain number (amount of mirrors). The counter could still be initialized to zero by a software interrupt on the second ext int pin, but I would disable it after the initial position is known to save cycles (since I would not expect it to ever skip a mirror).
Content like this still makes TH-cam great.
I love the retrofuturistic cyberpunk aesthetic of the scan lines and slight wobble. There's also a lot of tricks in both software and hardware to get better resolution.
Definitely look into faster chips, the ESP32 is great in that regard. You could also use a shift register or serial control chip and external clock to control the beam pwm. Basically write your bytes into a register, and clock out bit by bit directly to the beam control. That will give tighter temporal accuracy as well.
ESP32 is a great chip, highly recommended. Also better to run it to the wire instead of on top of an operating system regardless of it being a real-time operating system or not.
I was going to suggest he tear their hair out and just get a small FPGA dev board. Good excuse to learn some HDL if anything and really can get extremely tight timings even on low end chips.
@@Noubers Yeah that would actually be the 'right' approach for flawless timing. To get it perfect each mirror also needs programmable nanosecond scale offsets to account for slight angle variations.
@@darylfortney8081 clearly just needs to minaturize the JWST mirror accutators ;)
Too much promotion of a CHINESE product ESP32. How much are you paid for ?
I love the gritty analog look and the wobble effect!! Very retro sci-fi.
Dude, This is AWESOME !! To me the flickering and wobbling add a special sci-fi vibe to your texts rather than a flaw. Loved it. All the best. Keep going.
I wanted to build just this about 20 years ago. It was explained to me that it would be a bad idea compared to galvos, because the laser would spend a lot of time off, which means most of the light energy would be wasted and produce a relatively dim image. But how fun it is to see it working regardless.
Impressive results! I wouldn't have expected a 3D print to be stable enough, it's nice to see that a commercially-made polygonal mirror isn't the only option.
But you don't actually need a faster CPU: The arduino you're using would be perfectly capable of precise 62.5 ns resolution pulses -- i.e. the full 16 MHz system clock rate -- if you exploited the Atmega328p's powerful Timer/Counter peripherals for the task.
Here's how I'd do it:
- Set up the 16-bit Timer1 peripheral in free-running mode (WGM mode 0) and with full system clock rate (i.e. no clock divider). This timer will just count up continuously; the fact it'll overflow from 0xFFFF back to zero every 4.096 ms is of no consequence as long as that's longer than a single scan line.
- Wire the per-scan-line trigger to the ICP1 pin. This way, the input capture module can record the exact "start time" for each scan line _in hardware_ before triggering the input capture interrupt to set up at the start of the scan line.
- Wire the laser to an additional XOR gate, whose inputs are wired to the OC1A and OC1B pins. The output compare channels will be used in 'toggle' mode so that, in conjunction with the XOR gate, they can effectively act as a single output with a two-element buffer, rather than two separate outputs with only single-element buffers.
- The main task of the input capture interrupt (TIMER1_CAPT) is to copy ICR1 into a register, and then copy of the next line of the image into a separate buffer, adding that ICR1 value to each element of the buffer to offset it to the measured start time of the scan line (using 16-bit unsigned arithmetic so it overflows back to zero the same way the timer does). Aside from that, it's just a bit of bookkeeping at the start to reset the outputs to a known state (set COM mode to 'clear' and trigger FOC), and a bit more at the end to prime the output compare modules (set OCR1A and OCR1B with the first two values from the buffer, set COM modes back to 'toggle', and enable both compare match interrupts).
- The compare match interrupts (TIMER1_COMPA and TIMER2_COMPB) then have a very simple task: each time their channel finishes triggering, retrieve the next value from the scan buffer and put it in their OCR register. That should be the absolute first thing the interrupts do, and then after that there's only some light bookkeeping, to clear their interrupt enable bit if the _next_ next value would be past the end of the buffer.
- The interrupt for the index trigger is even simpler still: all it needs to do is reset the value of the row counter back to zero... and I guess you could flop image buffers here too; change the pointer the scan line interrupt uses to find the image to point to the frame that was being rendered while the previous frame was being displayed.
The way I'm proposing to use the interrupts here is in a sense the most fundamental design pattern used for serious interrupt-driven embedded programming. Almost all hardware peripherals are specifically designed around this usage pattern, understanding that fact can make the rationale for their designs much easier to understand.
Even though an interrupt seems instant compared to polling, there's still too many sources of jitter to rely on them to take actions that require precise timing. Rather, their responsibility is just to refill a hardware buffer from a software buffer before the hardware runs dry, or empty an hardware buffer before it overflows -- something that still has to be done "right away" rather than "next time the control loop feels like checking", but that way an extra microsecond or two of delay waiting for another interrupt to finish doesn't compromise the timing accuracy.
This pattern is actually used twice as I describe it above, both copying data from the ICR1 register to use to populate the scan buffer, and of course moving data from the scan buffer to the OCR registers.
With the design, you'd inherently have the full 62.5 ns precision of the full-speed system clock, and using both channels together means pulses could be as short as a single clock cycle, too. The interrupt execution time would limit the rate at which you could continuously switch it on and off, but even with minimal effort I'd expect at least 100 kHz. With high effort (i.e. implementing the compare match interrupts with hand-written assembly code) it'd be entirely plausible to achieve a maximum continuous pulse rate better than 1 MHz.
Wow!
I really appreciate the info! I'll see what I can do about rewriting the code when I have time.
Yes I was going to write this. I've made some POV displays, and found it's stable if you just use the position trigger to restart a timer set to fire X times (X being the horizontal resolution you want) with the timer counter set based upon the amount of time it took for the previous revolution. So if the previous rotation took 1 second, and X is 16, you set the timer to fire at (16/1)hz - if it took .1 second, it'd be (16/0.1)hz etc. Basically it'll automatically adapt to the speed of the motor. The timer interrupt then just turns the lazer on/off as needed. You won't get a steady image in hte main thread, as the code is being interrupted at "random" intervals. In your case you'd further segment based on the number of mirrors. As long as the mirrors don't wobble it should be rock-steady :)
18:36 this shot looks really cool. It looks like a simple image slapped on in post production but the reflections of the laser show you whats really going on
I thought the same thing
I love finding new channels like this. I can’t wait to see what he makes.
It’s really fun watching a channel evolved from just a few videos
Cool project !!!
Some suggestions: Use 2 hall sensors with embedded magnets for possition, less air resistance is less noise and vibration. And your unballenced extra arm....
I would use shims and a screw for tight compression together with lock tite that screw. The shims define your angle. You can make a stack of different thicknesses and adjust very precisely with no movement whatsover. You could use the remote controll engine of the ESP32 for laser controll + you get wifi and ble for free. You could offset different colors and adjustd the scanline for the laser offset or create a multi color single point first.
Why do you spam with Chinese ESP32 ?!?!?! Shameless
For switching the laser you should use the 16 bit timer and do a timer compare interrupt. Set the prescaler to something that gives you adequate range and accuracy. Then just update the compare register to get the laser pulses you need.
Remember to set the timer to reset on compare match
That is how I i can generate a bit bang midi on an Msp430. Works really well. Timer interrupts are useful as long as there are other things to be done but the full attention of the cpu is superior.
Instantly one of my favorite channels now!
You know what? Make a hologram with it?
Some holographic projectors use an array of speakers on top and bottom, to create a levitation field. Then they use a small white bead(sphere) as a "pixel" representation. Then there is a camera that tracks the small sphere and projects a laser light on it. The resulting image is a actual physically interactable 3D hologram!
Cool project! Decades ago I also had a notion to build something like that, but 256x192 (sinclair's screen, you know) with two rotors for frame and line respectively (50Hz, 16+KHz). MC's back then were too slow, but we already had some PLAs, so it wouldn't be a big deal. The main stopper was the mirrors fabrication precision needed. There was impossible to find needed machinery, so the project died far before any in-iron implementation. It's cool to see that now it's possible with no that much effort.
Thanks! I would like to do another version with higher resolution - perhaps 16 mirrors and 4 lasers at slightly different angles, giving 64 "pixels" vertical resolution. The mirror array is definitely the hard part...
The wobbling honestly looks awesome. Very cyberpunk.
Personally i would space the lines just a little bit further so the letters can be a bit taller.
Thanks! Been pondering trying this very technique for a while. Very interesting to see the issues and the design iteration re angling of the mirrors.
This is great! I love how you managed to do it with a single laser and multiple mirrors at slightly different angles. Back in 2002 I tried to make a laser projector with 8 lasers, spinning mirrors and a parallel port. It didn't go so well 😂
Thanks! I found your video on constant current drivers really helpful when I was learning about how to power this, so thank you for making that! You may be interested to know I'm currently working on an improved version of this with much higher resolution and multiple colors. It will (hopefully) be done soon.
Excellent production quality for a small TH-cam channel. Engaging and interesting from beginning to end. Nice work.
Just one precision regarding the use of constant current for driving Leds. Led's behaviour is similar to Zener diodes, it "limits" its own voltage generating lot of heat after the elbow is reached, this is why controling the current is much more practical.
Great job! The wiggle of the text is similar to the splash screen of games on old computers like the ZX Spectrum. You can project your text or image onto a horizontal series of falling water drops or solid flowing water in the form of a flat waterfall so as not to fight the wiggle but to make it an "interesting feature" of your project.
My ZX80 back in the 80's glitched every time you typed a key because the video was done purely in software, throwing the generation off while it was doing something else. Using reverse engineered code for the PAUSE function though and if you timed things precisely in all the possible code paths, literally adding up the count of Z80 CPU instruction cycles and balancing them out for all code paths padding with NOPs if necessary, writing fairly simple games that would be flicker free was possible, a lot of fun and more interesting than schoolwork :)
I figured he would use two sets of moving mirrors to achieve the raster effect like most show projectors but I'm impressed by the simplicity of the adjustable rotary mirrors.
Awesome. Great to see how this may develop in the future. Keep the ideas coming, Ben,
Two camera setups where the presenter only looks at/talks to one camera just look weird and I find them off putting.
Now that you brought it to my attention I agree
Very nice work - thanks for letting us know what obstacles you found, as we all learn from each other. Some of us bold fail and build again. It is nice to see a win from time to time.
This is very similar to how the laser scanner assembly in a laser printer works. The laser is controlled by an analog video signal. Also, using front-surface mirrors may sharpen up the images.
A good point, Shawn. Maybe parts and ideas can be extracted from the laser scanner assembly in the laser printer (I suppose thats when the drum in the printer is activated to partially keep the toner) .
I built something similar a few years ago but it was for a diy laser projector. I instead had the lasers go through a dichroic mirror setup (for combined color), hit the mirror wheel, then hit a mirror that was attached to a planetary gear output with a motor that had a cui encoder (to control beam angle). I used an fpga though for controlling the drawing. I used a resin printer and didnt have to adjust my mirrors on my mirror wheel. I never finished the whole project due to lack of fpgas at the time (was trying for atleast 4k but was stuck at 2k due write limits due to fpga clock) and not correcting the beam sizes for the 3 laser diodes but this had definitely peaked my interest when i saw it.
This is a really awesome project, Ben, and a nice combination of old and new projection techniques! I can tell you that one part of the causes for the shuttering effect you noted actually is the carousel that you built, as each transition causes the image to "break" for a split second. You'll also get closer and more uniformly focused lines if you anchor the pivot point for your mirrors at the center height of those mirrors and in line with your laser.
An interesting point to note is that a lot of larger home theater projectors use micromirror devices with broad 2D micromirror arrays within, one for each raster pixel art either the intended full resolution or some simple fraction thereof (and then vertical and horizontal servos in the latter case to multiply the apparent pixels); but many pico projectors use a module with just a single micromirror on centered vertical and horizontal pivots. My own limited understanding says that's identical in concept to the galvos in light show projectors and they just use tighter control. It might be fun to see what you can do with that knowledge.
DVD burner lasers have excellent beam quality. They emit red light and are quite powerful.
You invented a paperless laser printer. 😋 But seriously great job.
Haha I guess you are right! thanks
I've seen a few different variations of this type of design, and I actually tried to make my own a few years ago! At one point I used a mini disco ball to get the mirrors. The version I made was wobbly with similar problems to your first prototype but I never took the next step to fix all the issues. I'm impresses that you stuck with it and actually got it working that well. Nice work!
Nice work! I love seeing the process. As satisfying as a 30 second montage is, it's important that people see that big projects take time and patience. Take my sub good sir, I look forward to what you're going to make next :D
Even though shorts/reels have completely taken over I, too, enjoy the longer format stuff.
I love it! I had an idea to do this myself years ago (even using multiple mirrors on a hard drive motor) but I couldn't crack it because of the complication of needing a second motor/mirror rig to get the vertical scan. Your solution of just using angled mirrors on a single motor is simple and elegant, very nicely done! Can I now throw a challenge at you? There are high power 650 nm Red and 445 nm Blue lasers available... RGB is your obvious next step!
Really impressive Ben. Well done on the persistence too. couple of ideas for your future versions. 1) Not sure about the availability of red and blue laser diodes that could have their output balanced with this green one, but RGB would be awesome! 2) how about using the super-fast HDD heads arm in a vertical orientation, with a small mirror on the top. you could use it between the diode and the spinning mirrors to dynamically apply micro vertical adjustments by your microcontroller, so you could programatically control the up-down scanline sweep, rather than manual mirror adjustments?
Thanks, I definitely want to try RGB, and more lines of resolution!
I can imagine the level of persistance needed to finish it. Incredible stuff. earned a subscriber here!
Amazing project! :)
You could try altering the mirror angles in a cross pattern, so the point of mass would be equalized by the point of mass of the mirror on the other side of the wheel. This would also mean your code would have to change to render the lines in alternating manner from top/down to middle, instead of just top to down. Try doing anything you can to reduce the vibrations. It will help with wobble a lot.
Thanks! I think you are correct, the mirrors should be alternated in a different way to balance it out. If I build a second one, I'll try that.
@@benmakeseverything Would it be possible to put only 1 mirror and angle it with a stepper motor as it rotates around? It would require a Rotary Slip Ring but if you can programmatically adjust the mirror angle maybe you could get better results that way?
Very smart suggestion. Kind of interlacing right?
@@critical_always Yes,
@thatonesnowboarde, the stepper motor could also be a good solution, Im just worried the steps might be too harsh for such small adjustments and lead to vertical wobble.
An oscillating mirror attached to an electromagnet, like ones used for camera or dvd drive lens focusing might be a better option, but controlling it is very hard, especially if mirror is heavy.
@@benmakeseverything also balance out the rotating section
I came across this video on Tic Toc and thought I'd go find the actual original content. Glad I did, thought it was a really cool idea/project. Arduino is something I have been wanting to learn how to use, I have had a project in mind that I have been wanting to work on for almost 10 years now. I queued up a few other videos and subscribed.
Thanks, I had no idea my stuff was being shared on TikTok, as I don't use that app. Appreciate you coming and watching the original. Arduino is definitely worth learning!
Pretty impressive results!
A couple of ideas to improve, I'm not sure if they would be practical to implement.
To stop the wobble, use a fast photodiode and a mirror in the output path of the laser, to synchronise the laser switching with the actual position of the laser beam. Have it inside the housing, laser turned on until it hits the photodiode, then quickly turn it off before the beam reaches the start of the opening.
The switch faster, use the hardware UART and encode the character table into bytes, that would limit you horizontally to 8 pixels per character, unless there is a mode that has no start nor stop bit
Thanks for the input. I definitely think there is a lot of room for improvement in the code. I'm still learning Arduino.
A chain of shift registers would give you arbitrary width. Push bytes via the uart into the shift registers, then clock out bit by bit to control the beam.
I like the idea of getting the lazer position directly.
Laser printers uses this method.
Imagine “I should make a laser scrolling device” and actually spending the rest of the year making it instead of doing something else
This is a super well done video! Extremely informational, but you did a great job of breaking down some of the more advanced concepts and presenting them in an easy to understand manner. Such an incredibly cool project as well!
Love it! Reminds me of the old monochrome green phosporous crt displays, what i always found very nice!
I just stumbled on this. Very cool. It reminds me a bit of the old mechanical televisions. What was wild is that your final design looks a bit like a "Mervyn 30 Line Mirror Drum". Another idea might be to look into a "mirror screw." At that point if you can get PWM driver for the laser, you could even display rough images.
I am jealous at your knowledge and skills. I enjoy watching.
You can also glue small, front-surface mirrors to small speakers and bounce the laser off of them. By using the right combination of signals you can do, X-Y vector graphics and text.
I vaguely remember reading something about holographic lens being used in Supermarket POS scanners doing a similar job of scanning a large area without the need of expensive optics.
You could possibly save and cut code complexity by only using one sync sensor (the top one for full rotation ) and divide the result down to x mirrors. This would probably net you a possible higher rotor speed and less power consumption by the motor for less resistance by the little fingers on the bottom.
There are short throw SD and HD Pico Laser Projectors for watching movies and such. Some are standalone while others are incorporated into the chassis of a computer, smart phone, etc. It might not be what you were looking for but worth mentioning.
Congrats. I did a similar 32bits/line laser projector 3 or 4 years ago. The only way I managed to get it to work was by using "thermally stable materials" all around. Equally stable mats in the linear and non-linear domains too. Therefore no composites, lots of exotics, not to mention quite a bit of carbide endmills consumables and crashes. I liked the HDD silent motor idea! Good vid, keep it up.
Interesting... I was just thinking an accurately machined aluminum block with X number of sides (chrome plated and polished to a mirror) would be perfect, but maybe it would still have issues.
@@benmakeseverything Wow. Never thought of polished surfaces! I've 4-ax the mirrors assembly on the rotary, pocketed holes and used mirrors you commonly find for co2 lasers. If machined clockwise only (i.e. no reversal/backlash) you should get within 5~10 microns all around. Okay for 100 meter! Side note; you couldn't possibly be using worst than the arduino platform latencies and overheads. Register level programming is of paramount importance for this project (stm32, cube ide here).
Its kinda cool how it jitters a little bit back and forth. Gives it cyberpunk vibe
Muy bueno tu proyecto, yo soy nuevo en arduino y aunque no entendí muy bien, me pareció increíble seguí así 👌🏻
Very nice I designed a similar device 20 years ago ..I could not get the mirrors flat on the faces faces of the octagonal wheel ..So i decided to go with the galvanometer solution.Back in the day there was no 3D printing .I i had to do all by hand ..and a small lathe .It got me nowhere ..So i commend you for your effort
"Man... it's so annoying how wobbly the text is."
Bro you have an Amazingly cool visual effect that genuinely makes the text look like old sci-fi.
I'd go as far as to say Don't Fix It, or at least don't get rid of it fully, because it looks Really Good.
Handheld barcode readers have a little mirror oscillating in them. Use that insted of the hard drive. To have multiple lines - use another one with a lens to restrict it's angle / or use 12 cheap lasers. Also switch to esp32 - much faster, has bluetooth already, can act as an AP to provide a webpage for settings. Good job!
I suspect repeatability would be an issue with the oscillating mirrors - might work well for a y axis though. Big benefit of the mirrorwheelofdeath is it acts as a flywheel to get pretty consistent speed, which is also (angularly) linear since it doesn't have to reverse direction at the ends - it's what the fixed barcode readers in supermarkets use (you probably knew that though, by the sound of it). Actually laser printers do too, at least the ones I've pulled apart used to :D
This is basically an analog CRT display and it’s incredible
I absolutely love this idea. And im wondering if you could use smaller mirrors and maybe stack them for multiple lines of text? I wanna build one as well but im limited by budget and knowledge of code lol so i hope you make another video
Good luck and all the hardwork that went into into the project
Wow well done Ben! It's pretty hard to challenge the cost of a large screen TV for a display system but for things that only need a one or two line display this might be the ticket. Sporting events? Business meetings? Directional signage?
One of the best projects I have seen in the last months. Amazing!
You've probably already found what you need to fix the timing issues, but my suggestion would be to use the AVR timer/counter system directly rather than using the Arduino functions. Refer to the datasheet for the AVR model you are using for details.
There are a variety of approaches to get what you want, but generally you would set the timer in countdown mode, enable the timer ISR, and set the compare output mode to toggle on compare match (PWM mode). In the ISR load the count for the next toggle time.
The timer/counter configuration takes a bit of work to understand, but once you get it it's a very flexible and capable system that should be more than sufficient for what you're doing here.
I love the glitchy effect on the text, it's so real! I think ots perfect if you can just make it half as tall with smaller screws and 3d prints
Very nice. To avoid the need for timing adjustments in code for the scan lines, and perhaps to fix the wobble, you could try a sensor assembly just before the output window. Its purpose would be to detect the beam and start timing based on that. A light guide of some kind to a single detector might work. Power the laser at the start of a sweep, wait for a signal from the detector, and then the horizontal position is time relative to that. Have a single adjustment in code to account for any skew in the detector, which could be set through a web interface if you later used an MCU with WiFi such as an esp32.
The intro music kinda reminds me of Airwolf!!
Cool project for sure 👍
Well done! I have been envisioning a very similar project for a couple years and never got around to it. This is a really clever implementation. +1 on the advice to ditch the Arduino. Maybe a Teensy 4 would be a good candidate, thanks to the Cortex M7. If you're feeling really ambitious, you could also switch to a hobbyist FPGA, like an Alchitry board or a TinyFPGA BX. Also, maybe you can order a planoconvex lens from ThorLabs or Newport to tighten up the resolution? Again, amazing stuff here!!
Thanks, the teensy seems like a decent option. Powerful specs at a decent price. I might use that on the next version.
Great project! I'd also recommend using a Teensy 4.0 to replace the Arduino. @600Mhz it'll give you everything you want.@@benmakeseverything
The idea of creating horizontal scanlines is mind blowing. Coming up with this means you must be some ingenious mind 🤭
All fun aside; it won't be long before young kids don't even realize that it all started with scanned images, although the original Nipkow disc used to have vertical scan lines instead.
This is a cool build and definitely not an easy project to complete 👍
Cool project!
To reduce the number of interrupts (and input sensors), perhaps you could omit the ISR_rev() function, and when you need to get the current mirror index, use a modulo-8 operation on mirrorFlag. This operation returns the remainder of a division rather than the actual result, which would be your current mirror index every time, regardless of the mirrofFlag count. Should be true even in the event of an integer overflow, as long as it's unsigned. Alternatively, what if you just reset the value to 0 in ISR_mirror() every time the value reached 8?
Saw this on Tik Tok someone is just taking content off your page but wanted to come here and give you a comment and a like and let you know it is a really cool Lazer projector you created.
Thanks for letting me know. I don't use Tik Tok so I was unaware. Do you happen to recall the account name by any chance?
@@benmakeseverything yeah it was xrazzielx and I also found benmakeseverythingfans trying to find your page.
Try repurposing the optical parts from a grocery store POS scanner. done.
I love the wobbling effect, it looks like this thing came from the Matrix.
If you were on the stock market... i'd buy shares.
I don't have the time to invest in the learning curve to build this, but love the effect and would buy one right now if the product was available to purchase. Great work!
Damnit brother, I wasn't halfway done with your video before I subscribed. You're relentless and I cannot stop getting enough! You're awesome!
One of the Coolest projects ive seen!!!
Super cool! I'm glad to see this project getting the attention it deserves!
I love the complete lack of any sort of distortion, de-focus or other destruction of the image when you move the text around, even around corners. It makes it almost holographic in nature.
I love that you said you have to see it in real life.
Everyones sees it differently.
as some advice for you if you make a future version to make it work better and much safer and cheaper.
the simple solution is to use a powerfull led and 2 lenses(I actually used a similar method to get my
I actually like the jitter. It reminds me of the original hand-drawn cartoons where moments of stillness were diliberately given 'emotional tremor' 😊. Anyway, I think for an arduino, you have hit the best out of it and maybe an ESP, same price now(ish) and would help you out. Well done. A lovely project well described!
first time i will blame youtube for showing this awsome dude after years..
;Interesting project and very impressive.
I've never really appreciated how fast code actually runs, but considering how insanely fast the lazer needs to be on an off.. yet you can easily add logic, variables etc. It shows how insanely fast processors are !!
Building an approximate inverse of the JWSP is bound to have some bland imperfections along the way.
Very relatable explanations!
Very interesting prototype. It would be something usefully in the near future. Thanks for sharing this toys.
"death star surplus parts" moment was an instant like for me 🤣 Anyway, awesome idea. I like it 👍
I'd love to see a sort of laser show being done with this sort of thing, having it react to music and do effects based on its frequency and such.
I have been doing some thinking. It is possible to synthesize excited bromide in an argon matrix. Yes, it's an excimer frozen in its excited state.
It's a chemical laser but in solid, not gaseous, form. Put simply, in deference to you, it's like lasing a stick of dynamite. As soon as we apply a field, we couple to a state that is radiatively coupled to the ground state. I figure you can extract at least ten to the twenty-first photons per cubic centimeter which will give one kilojoule per cubic centimeter at 600 nanometers, or, one megajoule per liter.
Despite the bad editing but you definitely got a new subscriber here
you said that you have a CNC mill. you will get more stability if you make the spinning parts out of Aluminum instead of plastic. You already made proof of concept. Also the Al part can be made with thinner wall thicknesses. balancing the spinning part you made would be easy.
I love the look this gives. Can you shrink it down and project it right onto my retina?
Thanks! You should run that idea by your eye doctor - I'd like to hear their reaction 😆
i love the project its really helped me with mine
Really awesome project ! i like how you filmed and narrate the video, also you didn't give up and build comething that actually work.
Good job and i hope you will make a project 4.0 and a video about it ! Another susbriber :3
Magnificent project. Clear logical thinking. Very well done!
This is a fascinating project. I also wanted to mention that your style of code walkthrough was very effective. Best wishes to you, and keep up the good work!!
Knew it! When I saw that he'd killed the lasers, I knew it was the capacitor in the power supply. It's normal to put a cap to smooth out voltage in power supplies, and reduce the supply impedance during brief moments of high current demand. But that's for constant voltage supplies!
I'm just posting this to congratulate myself cos I solved the problem, I'm pretty pleased with myself, I'm like Ben, I tinker but I lack proper electronics knowledge. So spotting that was a nice surprise for me that I got it right.
Thanks to show all the process. Very interesting 👍!
Creating, building, testing and building again. That's real life engineering 😁
Love this. Also kudo's for explaining your struggles to get this going and for your tenacity.
I wish TH-cam was set up like the New York Stock Exchange because this channel has a bright future.😎
Excellent report, especially for the problems encountered. It's very important, in my opinion. Every development project faces issues. One that shines out is the lack of simple research like "would this thing turn on at this rate" and that info may be impossible to obtain for cheaper laser+controller combos. I know my own self, trying out things is great!
Btw, in the end you said "in any ray" :D Spotted. Non-native here...
cool raster scanning!
Honestly, the jitter kinda gives it its own charm. You should keep it!