DIY Laser Projector - Built from an old hard drive

Поділитися
Вставка
  • Опубліковано 8 тра 2023
  • #diy #laser #arduino #technology #programming
    In this video I design and build a portable laser text projector. It's battery operated and can display messages over 90 feet away. I can even connect to it wirelessly using bluetooth.
    Original code and 3D files:
    github.com/BenMakesEverything...
    Better code:
    github.com/BenMakesEverything...
    Intro music: Artificial Intelligence - Cyberwalker (via UA-cam Creator Music)
    Music in coding section: Stay Retro - AlexiAction (via Pixabay)
  • Наука та технологія

КОМЕНТАРІ • 1,4 тис.

  • @RealNovgorod
    @RealNovgorod 11 місяців тому +1046

    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).

    • @benmakeseverything
      @benmakeseverything  11 місяців тому +275

      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.

    • @RealNovgorod
      @RealNovgorod 11 місяців тому +110

      @@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
      @bazoo513 11 місяців тому +12

      What is the cause of that jitter? I don't think that IRQ and NMI even on ancient 1mHz 6502 were that "sloppy".

    • @greatbullet7372
      @greatbullet7372 11 місяців тому +5

      @@benmakeseverything im opting for a collab of you guys! as a C/C++ Engineer i could see a potential breaktrough in quality

    • @RealNovgorod
      @RealNovgorod 11 місяців тому +17

      @@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.

  • @NonEuclideanTacoCannon
    @NonEuclideanTacoCannon 11 місяців тому +50

    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.

    • @LeoInterVir
      @LeoInterVir 11 місяців тому +4

      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.

    • @randomdosing7535
      @randomdosing7535 11 місяців тому

      ​@@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

    • @mon4d
      @mon4d 11 місяців тому

      @@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 :)

  • @martyp7401
    @martyp7401 11 місяців тому +164

    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!

    • @Pseudothink
      @Pseudothink 6 місяців тому

      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?

    • @sterling_max
      @sterling_max 6 місяців тому

      agree!

  • @alexandredevert4935
    @alexandredevert4935 11 місяців тому +24

    Showing the prototypes and their issues is very educational. Great job !

  • @hiteshhere
    @hiteshhere 11 місяців тому +18

    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.

  • @defenestrated23
    @defenestrated23 11 місяців тому +195

    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.

    • @darylfortney8081
      @darylfortney8081 11 місяців тому +3

      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.

    • @Noubers
      @Noubers 11 місяців тому

      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.

    • @darylfortney8081
      @darylfortney8081 11 місяців тому

      @@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.

    • @Noubers
      @Noubers 11 місяців тому +2

      @@darylfortney8081 clearly just needs to minaturize the JWST mirror accutators ;)

    • @sheshankutty8552
      @sheshankutty8552 11 місяців тому +1

      Too much promotion of a CHINESE product ESP32. How much are you paid for ?

  • @mr_ambo24
    @mr_ambo24 9 місяців тому +4

    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

  • @awardfoto1
    @awardfoto1 9 місяців тому +7

    Content like this still makes UA-cam great.

  • @Scrogan
    @Scrogan 11 місяців тому +117

    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
      @benmakeseverything  11 місяців тому +35

      Interesting. I did not know that. I'll have to look into that further!

    • @philippegauthier1776
      @philippegauthier1776 11 місяців тому +14

      @@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?

    • @AshleyGittins
      @AshleyGittins 11 місяців тому +3

      @@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 :-)

    • @thomzz3449
      @thomzz3449 11 місяців тому +5

      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)

    • @ByteBitTV
      @ByteBitTV 11 місяців тому

      ​@@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).

  • @ShipwreckedMonki
    @ShipwreckedMonki 11 місяців тому +3

    Really neat project, thanks for sharing- the parallax effect when shining it into the corner of the room was especially neat, really different to how a normal projector looks

  • @makergiovanni
    @makergiovanni 11 місяців тому +1

    One of the best projects I have seen in the last months. Amazing!

  • @D1zZit
    @D1zZit 11 місяців тому +11

    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!

  • @claws61821
    @claws61821 11 місяців тому +21

    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.

  • @Gold171
    @Gold171 11 місяців тому +5

    Excellent production quality for a small UA-cam channel. Engaging and interesting from beginning to end. Nice work.

  • @raveltammeleht6278
    @raveltammeleht6278 2 місяці тому +1

    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!

  • @dennisdecoene
    @dennisdecoene 11 місяців тому

    Love this. Also kudo's for explaining your struggles to get this going and for your tenacity.

  • @AJMansfield1
    @AJMansfield1 11 місяців тому +39

    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.

    • @stephanc7192
      @stephanc7192 11 місяців тому +4

      Wow!

    • @benmakeseverything
      @benmakeseverything  11 місяців тому +8

      I really appreciate the info! I'll see what I can do about rewriting the code when I have time.

    • @Stabby666
      @Stabby666 11 місяців тому +3

      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 :)

  • @makebreakrepeat
    @makebreakrepeat 11 місяців тому +39

    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

    • @mjodr
      @mjodr 11 місяців тому +2

      Even though shorts/reels have completely taken over I, too, enjoy the longer format stuff.

  • @komojo
    @komojo 11 місяців тому +2

    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!

  • @CharonSin
    @CharonSin 9 місяців тому +1

    I love the gritty analog look and the wobble effect!! Very retro sci-fi.

  • @iananderson267
    @iananderson267 11 місяців тому +22

    Awesome. Great to see how this may develop in the future. Keep the ideas coming, Ben,

  • @ShawnHeil
    @ShawnHeil 11 місяців тому +13

    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.

  • @dennistucker1153
    @dennistucker1153 11 місяців тому +1

    One of the first projects I thought of was a laser projector. Love it.

  • @ed.puckett
    @ed.puckett 9 місяців тому

    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!!

  • @kingofbingus468
    @kingofbingus468 11 місяців тому +4

    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

    • @cinajunior
      @cinajunior 9 місяців тому +1

      I thought the same thing

  • @WistrelChianti
    @WistrelChianti 11 місяців тому +3

    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.

  • @Foga001
    @Foga001 11 місяців тому +1

    Love it! Reminds me of the old monochrome green phosporous crt displays, what i always found very nice!

  • @elliotmarks06
    @elliotmarks06 11 місяців тому +1

    Super cool! I'm glad to see this project getting the attention it deserves!

  • @AllToDevNull
    @AllToDevNull 11 місяців тому +8

    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.

    • @sheshankutty8552
      @sheshankutty8552 11 місяців тому

      Why do you spam with Chinese ESP32 ?!?!?! Shameless

  • @MightyFloyd
    @MightyFloyd 11 місяців тому +23

    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?

    • @benmakeseverything
      @benmakeseverything  11 місяців тому +8

      Thanks, I definitely want to try RGB, and more lines of resolution!

  • @theblubus
    @theblubus 8 місяців тому

    Fantastic start to a channel!
    I'm eager to see what other projects you'll come up with :)

  • @RobCCTV
    @RobCCTV 11 місяців тому

    Magnificent project. Clear logical thinking. Very well done!

  • @Alexandrsssd
    @Alexandrsssd 11 місяців тому +8

    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.

    • @makers_lab
      @makers_lab 11 місяців тому +3

      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 :)

  • @drzboy101
    @drzboy101 11 місяців тому +10

    You invented a paperless laser printer. 😋 But seriously great job.

  • @m.martin
    @m.martin 4 місяці тому

    True genius shows in simplicity... your design is so simple and straight forward! I liked it a lot! Thanks!

  • @ypoora1
    @ypoora1 11 місяців тому +1

    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.

  • @gtcollection6933
    @gtcollection6933 11 місяців тому +3

    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.

    • @benmakeseverything
      @benmakeseverything  11 місяців тому +1

      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.

    • @gtcollection6933
      @gtcollection6933 11 місяців тому

      @@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).

  • @V8Power5300
    @V8Power5300 11 місяців тому +10

    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

    • @albertmagician8613
      @albertmagician8613 4 місяці тому

      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.

  • @sdgb5363
    @sdgb5363 11 місяців тому

    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!

  • @jeffreypomeroy6173
    @jeffreypomeroy6173 8 місяців тому +2

    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.

  • @Rouverius
    @Rouverius 11 місяців тому +3

    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.

  • @dongiovanni1993
    @dongiovanni1993 11 місяців тому +3

    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.

    • @benmakeseverything
      @benmakeseverything  11 місяців тому +1

      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...

  • @Electronics61
    @Electronics61 10 місяців тому +2

    Good luck and all the hardwork that went into into the project

  • @kenworks6068
    @kenworks6068 11 місяців тому +1

    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.

  • @nevernether3368
    @nevernether3368 11 місяців тому +5

    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

  • @ShawnHeil
    @ShawnHeil 11 місяців тому +10

    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.

    • @klauszinser
      @klauszinser 11 місяців тому

      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) .

  • @MARKE911
    @MARKE911 11 місяців тому +1

    I am jealous at your knowledge and skills. I enjoy watching.

  • @ChristieNel
    @ChristieNel 11 місяців тому +2

    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.

  • @AndrijaKrstic
    @AndrijaKrstic 11 місяців тому +17

    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
      @benmakeseverything  11 місяців тому +7

      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.

    • @thatonesnowboarde
      @thatonesnowboarde 11 місяців тому

      @@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
      @critical_always 11 місяців тому

      Very smart suggestion. Kind of interlacing right?

    • @AndrijaKrstic
      @AndrijaKrstic 11 місяців тому

      @@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.

    • @zoenagy9458
      @zoenagy9458 11 місяців тому

      @@benmakeseverything also balance out the rotating section

  • @sybergoosejr
    @sybergoosejr 11 місяців тому +5

    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.

  • @sportbikeguy9875
    @sportbikeguy9875 6 місяців тому

    dude, insane build.... this is wild. im impressed

  • @lowellabeles5782
    @lowellabeles5782 11 місяців тому +1

    One of the Coolest projects ive seen!!!

  • @randomelectronicsanddispla1765
    @randomelectronicsanddispla1765 11 місяців тому +4

    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

    • @benmakeseverything
      @benmakeseverything  11 місяців тому +1

      Thanks for the input. I definitely think there is a lot of room for improvement in the code. I'm still learning Arduino.

    • @defenestrated23
      @defenestrated23 11 місяців тому

      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.

    • @stephanc7192
      @stephanc7192 11 місяців тому

      I like the idea of getting the lazer position directly.
      Laser printers uses this method.

  • @andresduranmolina7994
    @andresduranmolina7994 11 місяців тому +4

    Muy bueno tu proyecto, yo soy nuevo en arduino y aunque no entendí muy bien, me pareció increíble seguí así 👌🏻

  • @Luisvr05
    @Luisvr05 11 місяців тому

    I really hope to see more of this project. Awesome work!

  • @jonah.mp4564
    @jonah.mp4564 11 місяців тому +1

    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.

  • @coderentity2079
    @coderentity2079 11 місяців тому +12

    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!

    • @AshleyGittins
      @AshleyGittins 11 місяців тому

      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

  • @BrianBoniMakes
    @BrianBoniMakes 11 місяців тому +3

    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?

  • @karthikeyajavangula8423
    @karthikeyajavangula8423 11 місяців тому +1

    I've been wanting to make this since a very long time. It was fun to see you make it.
    I was thinking about adding a secondary rotating mirror for the vertical movement, but you made me realize I would only need one.
    Anyway, looking forward to a better version of this.

  • @apbosh1
    @apbosh1 9 місяців тому

    I can imagine the level of persistance needed to finish it. Incredible stuff. earned a subscriber here!

  • @Dragn7
    @Dragn7 9 місяців тому +3

    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?

  • @chrisc.5032
    @chrisc.5032 11 місяців тому +3

    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!!

    • @benmakeseverything
      @benmakeseverything  11 місяців тому +1

      Thanks, the teensy seems like a decent option. Powerful specs at a decent price. I might use that on the next version.

    • @JensChrBrynildsen
      @JensChrBrynildsen 7 місяців тому

      Great project! I'd also recommend using a Teensy 4.0 to replace the Arduino. @600Mhz it'll give you everything you want.@@benmakeseverything

  • @TheBaldr
    @TheBaldr 11 місяців тому

    I love the wobbling effect, it looks like this thing came from the Matrix.

  • @anonymstpbeach
    @anonymstpbeach 11 місяців тому +1

    That was awesome. Thank you for the time and work.

  • @makers_lab
    @makers_lab 11 місяців тому +4

    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.

  • @dave7038
    @dave7038 9 місяців тому +6

    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.

  • @ekojar3047
    @ekojar3047 5 місяців тому

    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

  • @dj13579100
    @dj13579100 11 місяців тому +1

    DVD burner lasers have excellent beam quality. They emit red light and are quite powerful.

  • @_tealpaws
    @_tealpaws 11 місяців тому +1

    I would love to make my own!
    Feeling really inspired by your channel.

  • @hermansims2296
    @hermansims2296 11 місяців тому

    I've watched a lot of your videos. This one was so awesome I finally subscribed.
    Thanks for the program.

  • @chakravarthyelumalai8408
    @chakravarthyelumalai8408 7 місяців тому

    Extremely awesome video. I'm sure it was lot harder than you make it appear to be. You rockk.

  • @ThatGuy_33
    @ThatGuy_33 11 місяців тому +1

    This is basically an analog CRT display and it’s incredible

  • @heinerml2
    @heinerml2 11 місяців тому

    Love the project, presentation and videography. Keep it up!

  • @saemranian
    @saemranian 7 місяців тому

    Awesome,
    Thanks for sharing

  • @chenurawinrada9978
    @chenurawinrada9978 8 місяців тому

    Amazing project sir.

  • @-Christoph-
    @-Christoph- 11 місяців тому

    I really like the wobbling of the letters. It just looks like you think a laser image should look like.

  • @marklatimer7333
    @marklatimer7333 11 місяців тому +1

    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.

  • @tankerock
    @tankerock 9 місяців тому

    Your channel has potential. Keep it up Ben! 🙌

  • @jacobhudec7817
    @jacobhudec7817 11 місяців тому +1

    Love your channel. Can't wait to see what else create!

  • @P8FPV
    @P8FPV 11 місяців тому +2

    The intro music kinda reminds me of Airwolf!!
    Cool project for sure 👍

  • @antoines1341
    @antoines1341 11 місяців тому

    I've wanted to make this for so long. Good job !

  • @stevesloan6775
    @stevesloan6775 11 місяців тому

    I love that you said you have to see it in real life.
    Everyones sees it differently.

  • @YousifFreestyle
    @YousifFreestyle 11 місяців тому

    This is an amazing feat! Well done!!

  • @funkykoval2099
    @funkykoval2099 11 місяців тому

    Congratulations!
    You are very persistent!

  • @TheOneG36
    @TheOneG36 11 місяців тому

    This intro was epic loved the sound ;)

  • @darkshadows65
    @darkshadows65 2 місяці тому

    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!

  • @electropyro4823
    @electropyro4823 11 місяців тому

    Congratulations dude!Keep posting!

  • @qrak_1576
    @qrak_1576 11 місяців тому +1

    "death star surplus parts" moment was an instant like for me 🤣 Anyway, awesome idea. I like it 👍

  • @madboyjv
    @madboyjv 11 місяців тому +1

    Excellent project and very well documented, it gives me very good tips to learn. Congratulations 👏 👏

  • @Bigbrank
    @Bigbrank 9 місяців тому +1

    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

  • @vinylcabasse
    @vinylcabasse 11 місяців тому +1

    very cool, unique project. excited to see what else you've done, subbed for sure.

  • @raziel3726
    @raziel3726 8 місяців тому

    Amazing Craftsmanship 👍🏻👍🏽👍

  • @IraQNid
    @IraQNid 11 місяців тому +2

    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.

  • @robertoscalone8024
    @robertoscalone8024 11 місяців тому

    Hello Ben! Excelent work! Its a amazong idea! Congratulations!

  • @mbuter2553
    @mbuter2553 11 місяців тому +1

    Awesome video Ben! Can’t wait to see what ur making next.

  • @reflector36
    @reflector36 8 місяців тому

    Thank you for mentioning laser safety,

  • @imrek
    @imrek 11 місяців тому +1

    Cool stuff man, thanks for the video.

  • @olivierconet7995
    @olivierconet7995 11 місяців тому

    Thanks to show all the process. Very interesting 👍!
    Creating, building, testing and building again. That's real life engineering 😁

  • @coose7448
    @coose7448 9 місяців тому

    Its kinda cool how it jitters a little bit back and forth. Gives it cyberpunk vibe

  • @ivangutowski
    @ivangutowski 9 місяців тому

    ;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 !!