• Defender Cocktail table gives new life to an old laptop - The background During a clean-out of my shed, I stumbled upon an old, discarded Dell laptop. Despite its inability to properly boot up, I saw potential in the device. I had always dreamed of owning an arcade machine that could play Defender, a classic game I used to play at the skating rink in my youth. For just 20 cents per game, I eagerly spent my allowance on it, but I never quite mastered the game. The arcade machine was unique in its design, featuring a cocktail table instead of the typical upright structure. I had learned about MAME, an arcade emulation program that allows you to play classic arcade games by loading them into the program. To truly recapture the experience, I knew I needed the same buttons and joystick found on the original cocktail table arcade machines. I was able to source these components easily, either from China or locally. I ordered the buttons, joystick, and interface board, and after wiping the laptop’s drive, I installed Lubuntu, a lightweight Linux operating system that I found through a Google search. The installation of MAME was straightforward and simple. With a quick Google search, I was able to find the ROMs and successfully play Defender on my newly installed MAME. The next challenge was to design a case to house all the components. I initially tried using an AI tool, but the results were not what I was looking for. After some reflection, I decided to pay homage to the original arcade machine that had captivated me years ago by building a smaller but respectful replica of the original. The build My first step was to remove the laptop from its original case. I wanted to eliminate any trace of the old case and retain only the minimum necessary components to make the machine work. Being a Dell laptop, I was concerned that removing parts might cause issues, but I stripped it back as far as I could. To my surprise, the motherboard booted up without any complaints when I hit the power button. One issue with stripping a laptop down to its bare components is that the original chassis often serves as a support structure for various internal components such as speakers, daughter boards, and WiFi boards. With the removal of the chassis, the hard drive was no longer securely held in place. It was not practical or reliable to use a 3D-printed clamping system, so I had to find another solution. I decided to clone the working drive over to a USB stick. This way I could do away with the HDD drive and use the USB on another computer if I wanted to. There appears to be no performance degradation when using the USB. Next, I designed the case for the arcade machine. I jotted down my ideas on paper and then transferred them to Fusion 360 to ensure accurate measurements. The old-style laptop I was using had some unique features, such as external buttons for power and audio, and a USB port and earphone socket that were connected to a daughter board via a cable. I designed holders for these buttons and ports so they would be accessible from the side of the case. I also needed to create a mount for the motherboard. I scanned the motherboard and imported it into Inkscape, then created an SVG and imported it into Fusion 360. This allowed me to carefully design a mounting bracket that lined up perfectly with the motherboard’s mounting holes. Another issue was that the control panel of the original arcade machine was huge. I found a clear photo of the control panel removed from an arcade machine on the web and used it as a reference. I copied the design and trimmed down the sides to fit the size I wanted for my machine. The button positions were identical to the original to maintain authenticity. The updated control panel was printed on an inkjet printer in two sections and glued to MDF for stability. Since it was a cocktail table, I wanted to protect the print from potential liquid damage. I placed an acrylic sheet on top for protection. Cutting acrylic can be challenging, check out my method below. I aimed to make the machine look like it was straight out of the same era, as if Williams themselves had released a home edition of Defender. To achieve this, I cut slots in the side just like the original. These slots served a practical purpose as well by keeping the laptop cool. The brackets that keep the acrylic down are the same as the orignal had. To add the final touch, I had to label the two buttons on the side of the machine for Player selection and adding credits. Instead of traditional labeling, I tried the FDM toner transfer technique. The arcade buttons had flat tops, so I designed the labels in Fusion 360 and printed them onto OHP film. The process turned out to be successful and I plan to create a video showcasing it soon. This brought the project to and end and I finally had my very own Defender!. Check the photos below for more details including “service mode”. This is a brief overview of this build. Make sure you subscribe to my channel for a full video out soon.

    The background

    During a clean-out of my shed, I stumbled upon an old, discarded Dell laptop. Despite its inability to properly boot up, I saw potential in the device. I had always dreamed of owning an arcade machine that could play Defender, a classic game I used to play at the skating rink in my youth. For just 20 cents per game, I eagerly spent my allowance on it, but I never quite mastered the game. The arcade machine was unique in its design, featuring a cocktail table instead of the typical upright structure.

    The OG Defender Cocktail table

    I had learned about MAME, an arcade emulation program that allows you to play classic arcade games by loading them into the program. To truly recapture the experience, I knew I needed the same buttons and joystick found on the original cocktail table arcade machines. I was able to source these components easily, either from China or locally. I ordered the buttons, joystick, and interface board, and after wiping the laptop’s drive, I installed Lubuntu, a lightweight Linux operating system that I found through a Google search. The installation of MAME was straightforward and simple.

    sudo apt install mame

    With a quick Google search, I was able to find the ROMs and successfully play Defender on my newly installed MAME. The next challenge was to design a case to house all the components. I initially tried using an AI tool, but the results were not what I was looking for. After some reflection, I decided to pay homage to the original arcade machine that had captivated me years ago by building a smaller but respectful replica of the original.

    The build

    My first step was to remove the laptop from its original case. I wanted to eliminate any trace of the old case and retain only the minimum necessary components to make the machine work. Being a Dell laptop, I was concerned that removing parts might cause issues, but I stripped it back as far as I could. To my surprise, the motherboard booted up without any complaints when I hit the power button.

    The heart of the matter an old DELL laptop

    One issue with stripping a laptop down to its bare components is that the original chassis often serves as a support structure for various internal components such as speakers, daughter boards, and WiFi boards. With the removal of the chassis, the hard drive was no longer securely held in place. It was not practical or reliable to use a 3D-printed clamping system, so I had to find another solution.

    There is nothing to hold the HDD in place without a chassis.

    I decided to clone the working drive over to a USB stick. This way I could do away with the HDD drive and use the USB on another computer if I wanted to.

    This USB now holds the entire OS and MAME

    There appears to be no performance degradation when using the USB.

    Next, I designed the case for the arcade machine. I jotted down my ideas on paper and then transferred them to Fusion 360 to ensure accurate measurements. The old-style laptop I was using had some unique features, such as external buttons for power and audio, and a USB port and earphone socket that were connected to a daughter board via a cable. I designed holders for these buttons and ports so they would be accessible from the side of the case.

    The luxury of external buttons and connectors.

    I also needed to create a mount for the motherboard. I scanned the motherboard and imported it into Inkscape, then created an SVG and imported it into Fusion 360. This allowed me to carefully design a mounting bracket that lined up perfectly with the motherboard’s mounting holes.

    Another issue was that the control panel of the original arcade machine was huge.

    Oriignal defender had a huge control panel.

    I found a clear photo of the control panel removed from an arcade machine on the web and used it as a reference. I copied the design and trimmed down the sides to fit the size I wanted for my machine. The button positions were identical to the original to maintain authenticity.

    The updated control panel was printed on an inkjet printer in two sections and glued to MDF for stability. Since it was a cocktail table, I wanted to protect the print from potential liquid damage. I placed an acrylic sheet on top for protection. Cutting acrylic can be challenging, check out my method below.

    I aimed to make the machine look like it was straight out of the same era, as if Williams themselves had released a home edition of Defender. To achieve this, I cut slots in the side just like the original. These slots served a practical purpose as well by keeping the laptop cool.

    Functional vents

    The brackets that keep the acrylic down are the same as the orignal had.

    mmmmmm fixings

    To add the final touch, I had to label the two buttons on the side of the machine for Player selection and adding credits. Instead of traditional labeling, I tried the FDM toner transfer technique. The arcade buttons had flat tops, so I designed the labels in Fusion 360 and printed them onto OHP film. The process turned out to be successful and I plan to create a video showcasing it soon.

    Print your own buttons

    This brought the project to and end and I finally had my very own Defender!. Check the photos below for more details including “service mode”.

    This is a brief overview of this build. Make sure you subscribe to my channel for a full video out soon.

    The original Defender tilted to the side but due to the LCD cable I could do the same
    Functional print P0RN
    My own Defender
  • Waterproofing WLED - I started out my Youtube channel with a video about WLED. Well, it was actually about a Larson scanner cap but in earnest, my videos were about WLED. The main reason being my boys wanted some sort of lighting on the trampoline for nighttime jumping. The idea for that project was that lights would stay out on the trampoline and when I wanted to use them we could just plug in the 18650 power banks. There were 12 power banks that I purchased off Aliexpress they were only a few dollars each and I sourced the 18650 (battery) locally for a few dollars also. The challenge at that point was charging 12 power banks at once which lead to the mega charger project. This worked pretty well. The batteries would work for a few days and I could then charge them all in just a few hours when they were dead. Almost perfect. I spent a bit of time trying to keep water out of the unit by creating galleries in the mating faces of the case and lid. I then filled these with silicone along with the tube holding the neopixel strip. This tube is a 10mm clear plastic that holds the strip upright. Originally I was using a plastic hose which wasn’t ideal. You can see my different iterations in my range test video. I used a regular USB male connector to connect the battery to the rest of the unit. In the photo above you can see the ESP-01 & WS2812, daughter board, with the battery (cover removed) plugged into the male USB connector. Note the small gallery running around the outside of the area containing the electronics. The problems began quite quickly with the contacts of this male plug started rusting pretty quickly. It didn’t really need rain for this to start happening. Just the regular condensation of any night would cause an issue. You could plug the battery in a few times to create a clean enough contact but this rust quickly moved to the batteries themselves. Towards the end of summer, the lights were dropping like flies with only a few functioning. Version 2 I have been putting it off for a while as I know the massive undertaking required but it is time to revisit these lights. We are already well into summer so this needs attention before winter turns up. My theory this time around is to completely seal the unit so moisture has no ability to access the electronics or battery connectors. Turning the unit on or off would also require a waterproof solution. Initially, I was looking at a toggle switch with a rubber cover. Although this might work to start with I can see it working loose and I still have a hole for moisture to work its way in. I have therefore opted for a reed switch and some small magnets on a sliding cover to turn the light on and off. My first testing found these cheap reed switches would actually stick shut when the current required to enable the LED strip was applied. I could only turn the light on but not turn it off! The only solution is to disconnect the battery. Seeing how this will eventually all be sealed this isn’t really an option. I then incorporated a MOSFET in the circuit. The little current required to activate the MOSFET meant the reed switch would now open its contacts when the magnet was removed. The power bank charger units were going to be cannibalized from the old power banks. This wasn’t really ideal as there was no easy access to the positive supply line. Also, they would need to be mounted horizontally taking up a bit of real estate. My local supplier sourced a nifty little BMS board that will charge a 18650 as well as boost the voltage to 5V. The board is really small and takes up a fraction of the space of the old BMS. This for some reason presented another issue where this board will not function with the MOSFET and reed switch combo! This BMS does come with a button which was a concern anyway as it wasn’t documented well as to what it does. Do I always have to click it to work? The workaround is to replace this switch with the reed switch directly, no need for the MOSFET anymore. If the switch is activated once the power is supplied. Double tap and the power is removed. Almost too good to be true so I will see how this pans out. The next challenge will be getting power into the unit without water. Here I intend to have two screws act as contacts and these will in turn rest on copper strips. I need a way to ensure good contact so I have created a spring-loaded type arrangement. I purchased a dozen clicky pens from K-Mart and robbed the springs from these for a few dollars. These will sit in two contacts that push up against the bottom of the unit. Looking down from above you can see where the contacts on the end unit slot in the holes to reach the contacts. It is keyed to make sure it is not possible to plug the unit in back to front. The mega charger doesn’t have the right connectors so I will either remove the Micro USB plugs or start fresh. I have a POC printing at the moment so hopefully, we will be back in production shortly!

    I started out my Youtube channel with a video about WLED. Well, it was actually about a Larson scanner cap but in earnest, my videos were about WLED. The main reason being my boys wanted some sort of lighting on the trampoline for nighttime jumping.

    The idea for that project was that lights would stay out on the trampoline and when I wanted to use them we could just plug in the 18650 power banks.

    There were 12 power banks that I purchased off Aliexpress they were only a few dollars each and I sourced the 18650 (battery) locally for a few dollars also. The challenge at that point was charging 12 power banks at once which lead to the mega charger project.

    This worked pretty well. The batteries would work for a few days and I could then charge them all in just a few hours when they were dead. Almost perfect.

    I spent a bit of time trying to keep water out of the unit by creating galleries in the mating faces of the case and lid. I then filled these with silicone along with the tube holding the neopixel strip. This tube is a 10mm clear plastic that holds the strip upright. Originally I was using a plastic hose which wasn’t ideal. You can see my different iterations in my range test video.

    I used a regular USB male connector to connect the battery to the rest of the unit.

    In the photo above you can see the ESP-01 & WS2812, daughter board, with the battery (cover removed) plugged into the male USB connector. Note the small gallery running around the outside of the area containing the electronics.

    The problems began quite quickly with the contacts of this male plug started rusting pretty quickly. It didn’t really need rain for this to start happening. Just the regular condensation of any night would cause an issue. You could plug the battery in a few times to create a clean enough contact but this rust quickly moved to the batteries themselves. Towards the end of summer, the lights were dropping like flies with only a few functioning.

    Version 2

    I have been putting it off for a while as I know the massive undertaking required but it is time to revisit these lights. We are already well into summer so this needs attention before winter turns up.

    My theory this time around is to completely seal the unit so moisture has no ability to access the electronics or battery connectors. Turning the unit on or off would also require a waterproof solution.

    Initially, I was looking at a toggle switch with a rubber cover. Although this might work to start with I can see it working loose and I still have a hole for moisture to work its way in.

    I have therefore opted for a reed switch and some small magnets on a sliding cover to turn the light on and off.

    My first testing found these cheap reed switches would actually stick shut when the current required to enable the LED strip was applied. I could only turn the light on but not turn it off! The only solution is to disconnect the battery. Seeing how this will eventually all be sealed this isn’t really an option.

    I then incorporated a MOSFET in the circuit. The little current required to activate the MOSFET meant the reed switch would now open its contacts when the magnet was removed.

    The power bank charger units were going to be cannibalized from the old power banks. This wasn’t really ideal as there was no easy access to the positive supply line. Also, they would need to be mounted horizontally taking up a bit of real estate.

    My local supplier sourced a nifty little BMS board that will charge a 18650 as well as boost the voltage to 5V.

    The board is really small and takes up a fraction of the space of the old BMS.

    This for some reason presented another issue where this board will not function with the MOSFET and reed switch combo!

    This BMS does come with a button which was a concern anyway as it wasn’t documented well as to what it does. Do I always have to click it to work? The workaround is to replace this switch with the reed switch directly, no need for the MOSFET anymore. If the switch is activated once the power is supplied. Double tap and the power is removed. Almost too good to be true so I will see how this pans out.

    The next challenge will be getting power into the unit without water. Here I intend to have two screws act as contacts and these will in turn rest on copper strips.

    I need a way to ensure good contact so I have created a spring-loaded type arrangement. I purchased a dozen clicky pens from K-Mart and robbed the springs from these for a few dollars.

    These will sit in two contacts that push up against the bottom of the unit.

    Looking down from above you can see where the contacts on the end unit slot in the holes to reach the contacts. It is keyed to make sure it is not possible to plug the unit in back to front.

    The mega charger doesn’t have the right connectors so I will either remove the Micro USB plugs or start fresh.

    I have a POC printing at the moment so hopefully, we will be back in production shortly!

  • Low polygon WLED Neopixel cement lamp completed - It took up to the wire but the lamp was completed on the 4th of December with the competition closing on the 5th. It was pretty tricky trying to get a good photo of the lamp as my camera exposure was determined to adjust for the lightness of the shade hiding the detail of the low polygon torso. There was no finishing on this casting at all. It came out very good. The seam lines are very dark but I am deciding if I am going to try and work these out or not. The problem with this low polygon version is the straight sharp edges. For the naturally shaped figure, I could just sand over the imperfections to naturally blend in. With this statue, I think the reworking will be obvious. The stand on the bottom was a last-minute edition. In fact, it didn’t even make it to the build video. The surface area around the bottom just isn’t big enough to securely stop the lamp from toppling over. I was going to paint this black but I think it complements the other white PLA in the print. I spent a good 2 hours on the weekend creating a build document in Instructables only to have it not save for some reason 😭. So quickly created another which should do for now. If Instructables do indeed reject the build I will create another build document on my site or maybe Hackaday. I really like how the wiring is all hidden from view that was a good gamble. The shade does look like it is floating. The WLED controller gives me so many options not only for effects but connectivity. I will create a follow-up video going through the configuration but I already have several videos covering different aspects of WLED.

    It took up to the wire but the lamp was completed on the 4th of December with the competition closing on the 5th.


    It was pretty tricky trying to get a good photo of the lamp as my camera exposure was determined to adjust for the lightness of the shade hiding the detail of the low polygon torso. There was no finishing on this casting at all. It came out very good. The seam lines are very dark but I am deciding if I am going to try and work these out or not.


    The problem with this low polygon version is the straight sharp edges. For the naturally shaped figure, I could just sand over the imperfections to naturally blend in. With this statue, I think the reworking will be obvious.


    The stand on the bottom was a last-minute edition. In fact, it didn’t even make it to the build video. The surface area around the bottom just isn’t big enough to securely stop the lamp from toppling over. I was going to paint this black but I think it complements the other white PLA in the print.

    I spent a good 2 hours on the weekend creating a build document in Instructables only to have it not save for some reason 😭. So quickly created another which should do for now. If Instructables do indeed reject the build I will create another build document on my site or maybe Hackaday.

    I really like how the wiring is all hidden from view that was a good gamble. The shade does look like it is floating.

    The WLED controller gives me so many options not only for effects but connectivity. I will create a follow-up video going through the configuration but I already have several videos covering different aspects of WLED.

  • Low polygon WLED Neopixel cement lamp - Instructables has a lamp competition on at the moment (probably ended by now). I am going to make a lamp from an STL found on Thingiverse. I will convert the STL to a mold using fusion 360. Cast cement in the mold as the basis for the lamp. All other fixtures will be 3D printed in clear PLA. Around the top and bottom of the lamp shade will be 20 neopixel LEDs (10 on the top and 10 on the bottom) these will then be controlled by an ESP-01 hidden in the base of the lamp. So far I have changed the design as the original STL was a bit “out there” so I have reduced the polygons making up the STL to be a little more artistic. The big issue at the moment is getting consistent results when casting the cement. After 3 attempts I got a pretty good result but this can vary and the latest low polygon version has been the worst result so far. I am not sure if it is because of the shape of the new lamp or because I didn’t spend as much time trying to get the air bubbles out of the cement. The lighting around the top and the bottom will use individual neopixels. You can purchase neopixels rings but none are available to me in the same size so I am making my own by hand. This consists of a PLA jig that holds the pixels while I solder single-core electrical wire to the contacts. So far I need to attempt another casting of the cement as the last did not go too well. Also, print all the fixtures I am running out of time to build!

    Instructables has a lamp competition on at the moment (probably ended by now). I am going to make a lamp from an STL found on Thingiverse. I will convert the STL to a mold using fusion 360. Cast cement in the mold as the basis for the lamp.

    All other fixtures will be 3D printed in clear PLA. Around the top and bottom of the lamp shade will be 20 neopixel LEDs (10 on the top and 10 on the bottom) these will then be controlled by an ESP-01 hidden in the base of the lamp.

    So far I have changed the design as the original STL was a bit “out there” so I have reduced the polygons making up the STL to be a little more artistic.

    The big issue at the moment is getting consistent results when casting the cement. After 3 attempts I got a pretty good result but this can vary and the latest low polygon version has been the worst result so far. I am not sure if it is because of the shape of the new lamp or because I didn’t spend as much time trying to get the air bubbles out of the cement.

    The lighting around the top and the bottom will use individual neopixels.


    You can purchase neopixels rings but none are available to me in the same size so I am making my own by hand.


    This consists of a PLA jig that holds the pixels while I solder single-core electrical wire to the contacts.

    So far I need to attempt another casting of the cement as the last did not go too well. Also, print all the fixtures I am running out of time to build!

  • Block bypass - A behind-the-build video will be available soon. In the meantime please enjoy the video below.

    A behind-the-build video will be available soon. In the meantime please enjoy the video below.

  • Remote cat door lock - I will be publishing a build guide through the usual channels soon. For now please enjoy the video above.

    I will be publishing a build guide through the usual channels soon. For now please enjoy the video above.

  • Sensing spider - Halloween is coming and spiders are perfect for creating a good scare. This project can be either 3D printed or made from wood. A great and challenging introduction to Arduino that demonstrates a practical use of multiple inputs and outputs. Using a PIR sensor our target is automatically detected and our spider deployed rapidly for the perfect fright. Check the video links if you get stuck on a step these are timestamped so should go directly to the place you are at. Code examples Here are the code examples shown for each sensor in my build video. Motor code PIR Code Switch code Supplies 1 × PIR sensor HC-SR501 1 × DC motor driver MX1508 1 × DC motor 1 × Arduino Uno 1 × Microswitch KW11-3Z 1 × 9v Battery and snap connector 1 × PLA or ABS for 3D print 6 × Screws 6x3mm self-tapping 2 × Scews 16x2mm 1 x Screw 50x3mm 1 × Cotton spool 1 × Toy spider approx 50-60mm wide or 3D printAdd TipAsk QuestionCommentDownload Step 1: Print STLS STLs can be found here. Print the STL files. The main chassis should not need support but I suggest you set the area around screw holes to 100% infill to prevent the filament splitting. If you are printing on an FDM printer, print the spider upside down. The spool will need support. Step 2: Install Arduino Screw the Arduino UNO into place using 4 6×3 screws. More details in the video here Step 3: Motor Installation Using a small hammer tap the drive boss onto the shaft of the motor. More details on the video here Step 4: Slide the Motor Into the Base of the Chassis. Slide the motor into the base of the chassis. Step 5: Install Microswitch The microswitch is installed into the front of the chassis with the two 2x16mm screws. One screw is fully tightened while the other is tightened just enough to hold the motor in place. More details are in the video here. Step 6: Install Limit Paddle The limit paddle stops the spider from driving too far up. The paddle is held in place by one 3×50 screw which runs across the chassis. The paddle should be able to move freely and without obstruction. When the paddle moves it should activate the microswitch. You should hear an audible click when the paddle is moved upwards. Step 7: Wire Motor Controller. Prepare the motor driver for installation. The motor driver can drive two motors but we only need to use one for this project. Add a length of wire to each of the MOTOR A outputs. These will eventually be connected to our motor. Add a length of wire to the + and – terminals of the board. Then a length of wire to IN1 and IN2. Put a header pin on all but the motor wires to make installation easier later on.  Step 8: Install the Motor Driver Board The motor driver board sits on top of the motor. There is a location for one screw and the rear of the board sits between two uprights. More details can be found here in the video. Step 9: Wire the PIR Sensor The PIR sensor has 3 connections Ground, 5V, and the signal wire. Attach a length of wire to each contact as shown below.  Step 10: Install the PIR Sensor Thread the wires from the PIR sensor through the hole in the base of the chassis next to the battery holder. Place the sensor in the sensor holder with the adjustment screws facing the holes in the sensor holder. Screw the sensor and holder into place. More details are in the video here. Step 11: Thread the Spool Thread your spider web (cotton) through the hole in the chassis and paddle below where the spool will go.  Then thread the cotton through the hole in the spool. You should be able to slide the spool over the drive boss which will keep the cotton in place. Attach your spider to the other end of the thread.  Step 12: Wiring Following the diagram below pay careful attention to the polarity (red and black wires), The colour of the signal wires isn’t important just use what you have laying around. The most important thing is to make sure you have the battery going to VIN, not to 5V otherwise you will cook your Arduino.  Step 13: Upload Sketch Copy and paste the following code into your Arduino IDE, no extra libraries are required. I am not a programmer by trade but this code seems to do the job. See if you can improve it. An interrupt would be a better choice than the do loop I have used for example. Step 14: Testing Once you upload the code the motor will probably try and drive immediately as the PIR is high when it turns on. For testing, I suggest you attach the unit to the roof somewhere to prevent the tangling of the cotton. Check my testing in the video for some tips.  Depending on the length of your thread, the weight of the spider, and the speed of the motor it might take a bit of tweaking to get the spider to drop and return to the full length of the thread. I suggest you check the principle of operation here: to get a goof idea of what is happening.  There are three main variables you can change.  frighdelay This is the time the spider waits between dropping. This value is milliseconds so 10000 is 10 seconds. Increase or decrease to your desire.  PWMvalue If the motor starts spinning at full speed the thread will double up on itself and the spider will drop a very short distance. The value is between 0 and 255. If you find the spider does not always fully unravel LOWERING this value makes the motor start slower. Keep increasing this value until you don’t have the cotton binding on itself. If the speed for the whole journey is too slow the spider will not have enough momentum to trigger the limit switch at the end of the run.  Acceleration This is how fast the Arduino will increase the speed. This is in milliseconds. Tweaking between this value and the PWMvalue you should be able to find the sweet spot for your spider. Notes about your spider Not all spiders are created equal. The weight and size of your spider will greatly affect how the project behaves. If your spider is too heavy it will unravel the web due to its weight. If it is too light it might not activate the limit switch. In my testing, the spider weighed around 6 grams.  Step 15: Install Battery and Scare Away! The 9V battery sits in the front of the unit in the box supplied. Once you have all your spiedy tweaking nailed in attach the unit above a doorway and enjoy the scares!

    Halloween is coming and spiders are perfect for creating a good scare. This project can be either 3D printed or made from wood. A great and challenging introduction to Arduino that demonstrates a practical use of multiple inputs and outputs.

    Using a PIR sensor our target is automatically detected and our spider deployed rapidly for the perfect fright.

    Check the video links if you get stuck on a step these are timestamped so should go directly to the place you are at.

    Code examples

    Here are the code examples shown for each sensor in my build video.

    Motor code

    const int motorFWD = 5; //UNO
    const int motorREV = 6; //UNO
    
    void setup() {
      // put your setup code here, to run once:
      pinMode(motorFWD, OUTPUT);
      pinMode(motorREV, OUTPUT);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    digitalWrite(motorFWD, 1);
    digitalWrite(motorREV, 1);
    }

    PIR Code

    const int PIRpin = 2;
    const int LEDpin =13;
    int PIRstate = 0;
    
    void setup() {
      pinMode(LEDpin, OUTPUT);
      pinMode(PIRpin, INPUT);
    }
    
    void loop() {
       PIRstate = digitalRead(PIRpin);
    
      if (PIRstate == HIGH ) {
        digitalWrite(LEDpin, HIGH);
        delay(1000);
      }
    digitalWrite(LEDpin, LOW);
    }

    Switch code

    /*
      Button
    
      Turns on and off a light emitting diode(LED) connected to digital pin 13,
      when pressing a pushbutton attached to pin 2.
    
      The circuit:
      - LED attached from pin 13 to ground through 220 ohm resistor
      - pushbutton attached to pin 2 from +5V
      - 10K resistor attached to pin 2 from ground
    
      - Note: on most Arduinos there is already an LED on the board
        attached to pin 13.
    
      created 2005
      by DojoDave <http://www.0j0.org>
      modified 30 Aug 2011
      by Tom Igoe
    
      This example code is in the public domain.
    
      https://www.arduino.cc/en/Tutorial/BuiltInExamples/Button
    */
    
    // constants won't change. They're used here to set pin numbers:
    const int buttonPin = 3;     // the number of the pushbutton pin
    const int ledPin =  13;      // the number of the LED pin
    
    // variables will change:
    int buttonState = 0;         // variable for reading the pushbutton status
    
    void setup() {
      // initialize the LED pin as an output:
      pinMode(ledPin, OUTPUT);
      // initialize the pushbutton pin as an input:
      pinMode(buttonPin, INPUT);
    }
    
    void loop() {
      // read the state of the pushbutton value:
      buttonState = digitalRead(buttonPin);
    
      // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
      if (buttonState == HIGH) {
        // turn LED on:
        digitalWrite(ledPin, HIGH);
      } else {
        // turn LED off:
        digitalWrite(ledPin, LOW);
      }
    }

    Supplies

    1 × PIR sensor HC-SR501

    1 × DC motor driver MX1508

    1 × DC motor

    1 × Arduino Uno

    1 × Microswitch KW11-3Z

    1 × 9v Battery and snap connector

    1 × PLA or ABS for 3D print

    6 × Screws 6x3mm self-tapping

    2 × Scews 16x2mm

    1 x Screw 50x3mm

    1 × Cotton spool

    1 × Toy spider approx 50-60mm wide or 3D printAdd TipAsk QuestionCommentDownload

    Step 1: Print STLS

    Print STLS

    STLs can be found here.

    Print the STL files. The main chassis should not need support but I suggest you set the area around screw holes to 100% infill to prevent the filament splitting. If you are printing on an FDM printer, print the spider upside down. The spool will need support.

    Step 2: Install Arduino

    Install Arduino

    Screw the Arduino UNO into place using 4 6×3 screws. More details in the video here

    Step 3: Motor Installation

    Motor Installation

    Using a small hammer tap the drive boss onto the shaft of the motor. More details on the video here

    Step 4: Slide the Motor Into the Base of the Chassis.

    Slide the Motor Into the Base of the Chassis.

    Slide the motor into the base of the chassis.

    Step 5: Install Microswitch

    Install Microswitch

    The microswitch is installed into the front of the chassis with the two 2x16mm screws. One screw is fully tightened while the other is tightened just enough to hold the motor in place. More details are in the video here.

    Step 6: Install Limit Paddle

    Install Limit Paddle

    The limit paddle stops the spider from driving too far up. The paddle is held in place by one 3×50 screw which runs across the chassis. The paddle should be able to move freely and without obstruction. When the paddle moves it should activate the microswitch. You should hear an audible click when the paddle is moved upwards.

    Step 7: Wire Motor Controller.

    Wire Motor Controller.

    Prepare the motor driver for installation. The motor driver can drive two motors but we only need to use one for this project. Add a length of wire to each of the MOTOR A outputs. These will eventually be connected to our motor. Add a length of wire to the + and – terminals of the board. Then a length of wire to IN1 and IN2. Put a header pin on all but the motor wires to make installation easier later on. 

    Step 8: Install the Motor Driver Board

    Install the Motor Driver Board

    The motor driver board sits on top of the motor. There is a location for one screw and the rear of the board sits between two uprights. More details can be found here in the video.

    Step 9: Wire the PIR Sensor

    Wire the PIR Sensor

    The PIR sensor has 3 connections Ground, 5V, and the signal wire. Attach a length of wire to each contact as shown below. 

    Step 10: Install the PIR Sensor

    Install the PIR Sensor
    Install the PIR Sensor

    Thread the wires from the PIR sensor through the hole in the base of the chassis next to the battery holder. Place the sensor in the sensor holder with the adjustment screws facing the holes in the sensor holder. Screw the sensor and holder into place. More details are in the video here.

    Step 11: Thread the Spool

    Thread your spider web (cotton) through the hole in the chassis and paddle below where the spool will go. 

    Then thread the cotton through the hole in the spool. You should be able to slide the spool over the drive boss which will keep the cotton in place.

    Attach your spider to the other end of the thread. 

    Step 12: Wiring

    Following the diagram below pay careful attention to the polarity (red and black wires), The colour of the signal wires isn’t important just use what you have laying around. The most important thing is to make sure you have the battery going to VIN, not to 5V otherwise you will cook your Arduino. 

    Step 13: Upload Sketch

    Copy and paste the following code into your Arduino IDE, no extra libraries are required. I am not a programmer by trade but this code seems to do the job. See if you can improve it. An interrupt would be a better choice than the do loop I have used for example.

    <!-- wp:preformatted -->
    <pre class="wp-block-preformatted">// constants won't change. They're used here to set pin numbers:
    const int PIRpin = 2;
    //const int LEDpin =1;  //digispark
    const int LEDpin =13; //UNO
    const int limitPin = 7;     // the number of the pushbutton pin
    //const int motorFWD = 0; //digispark
    // const int motorREV = 4; //digispark
    
    const int motorFWD = 5; //UNO
    const int motorREV = 6; //UNO
    const int frightDelay = 10000; //delay between actions
    
    const int acceleration = 25; //how fast the motor starts to int acceleration delay in ms 
    
    
    // variables will change:
    int limitState = 1;         // variable for reading the pushbutton status
    int PIRstate = 0;
    int MOTdirection = 1;
    int PWMValue = 200; // starting PWM value
    
    void setup() {
      // initialize the LED pin as an output:
      pinMode(LEDpin, OUTPUT);
      pinMode(PIRpin, INPUT);
      pinMode(motorFWD, OUTPUT);
      pinMode(motorREV, OUTPUT);
      pinMode(limitPin, INPUT_PULLUP);
    }
    
    void loop() {
    
    PIRstate = digitalRead(PIRpin);
    
      if (PIRstate == HIGH ) {
        PWMValue=200;
        digitalWrite(LEDpin, HIGH);
        do
        {
          limitState = digitalRead(limitPin); 
          driveMotor();
        } while (limitState != 0); //state is 1 button is not activated
    
          if (MOTdirection ==0){MOTdirection = 1;} else { MOTdirection = 0;}
    
    stopMotor();
    delay(500);
    lockMotor();
    delay(1000);
    stopMotor();
    delay(frightDelay);
    
     }
     digitalWrite(LEDpin, LOW);
    }
    
    void driveMotor(){
    
    if (PWMValue &lt; 255){++PWMValue;}  
    delay(acceleration);
    if (MOTdirection ==1)
    { 
    analogWrite(motorFWD, PWMValue);
    analogWrite(motorREV, 0);
    }
    else
    {
    analogWrite(motorFWD, 0);
    analogWrite(motorREV, PWMValue);
    }
    }
    
    void stopMotor(){
    analogWrite(motorFWD, 0);
    analogWrite(motorREV, 0);
    }
    
    void lockMotor(){
    digitalWrite(motorFWD, 1);
    digitalWrite(motorREV, 1);
    }</pre>
    <!-- /wp:preformatted -->
    
    <!-- wp:paragraph -->
    <p></p>
    <!-- /wp:paragraph -->

    Step 14: Testing

    Once you upload the code the motor will probably try and drive immediately as the PIR is high when it turns on. For testing, I suggest you attach the unit to the roof somewhere to prevent the tangling of the cotton. Check my testing in the video for some tips. 

    Depending on the length of your thread, the weight of the spider, and the speed of the motor it might take a bit of tweaking to get the spider to drop and return to the full length of the thread. I suggest you check the principle of operation here: to get a goof idea of what is happening. 

    There are three main variables you can change. 

    frighdelay

    This is the time the spider waits between dropping. This value is milliseconds so 10000 is 10 seconds. Increase or decrease to your desire. 

    PWMvalue

    If the motor starts spinning at full speed the thread will double up on itself and the spider will drop a very short distance. The value is between 0 and 255. If you find the spider does not always fully unravel LOWERING this value makes the motor start slower. Keep increasing this value until you don’t have the cotton binding on itself. If the speed for the whole journey is too slow the spider will not have enough momentum to trigger the limit switch at the end of the run. 

    Acceleration

    This is how fast the Arduino will increase the speed. This is in milliseconds. Tweaking between this value and the PWMvalue you should be able to find the sweet spot for your spider.

    Notes about your spider

    Not all spiders are created equal. The weight and size of your spider will greatly affect how the project behaves. If your spider is too heavy it will unravel the web due to its weight. If it is too light it might not activate the limit switch. In my testing, the spider weighed around 6 grams. 

    Step 15: Install Battery and Scare Away!

    The 9V battery sits in the front of the unit in the box supplied. Once you have all your spiedy tweaking nailed in attach the unit above a doorway and enjoy the scares!

  • ESP3D config file. - Here is the configuration settings I used for an ESP32CAM Cut and paste this in your configuration.h if you are facing issues.

    Here is the configuration settings I used for an ESP32CAM

    // This file was generated by ESP3D-Configurator V1.0.0-a14 
    /*
      configuration.h - ESP3D configuration file
    
      Copyright (c) 2014 Luc Lebosse. All rights reserved.
    
      This code is free software; you can redistribute it and/or
      modify it under the terms of the GNU Lesser General Public
      License as published by the Free Software Foundation; either
      version 2.1 of the License, or (at your option) any later version.
    
      This code is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Lesser General Public License for more details.
    
      You should have received a copy of the GNU Lesser General Public
      License along with This code; if not, write to the Free Software
      Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    */
    #ifndef _CONFIGURATION_H
    #define _CONFIGURATION_H
    //Setup station as default, use AP mode first if not done
    //Note: need both defined to enable it
    //Uncomment and edit them to define
    //#define STATION_WIFI_SSID "yourssid"
    //#define STATION_WIFI_PASSWORD "yourssidpassword"
    
    //You can also use a different config file for SSID/password
    //Just save it in same location as this configuration.h
    //This file is ignored by github
    #if defined __has_include
    #  if __has_include ("myconfig.h")
    #    include "myconfig.h"
    #  endif
    #endif
    
    
    /************************************
    *
    * Board description
    *
    * ESP Board  using ESP3D firmware
    *
    ************************************/
    // MCU=ESP32
    // ESP flash size=4MB
    // Form factor=Original (all pins)
    
    /************************************
    *
    * Serial Communications
    *
    * Settings and protocols
    *
    ************************************/
    
    // Serial Communication protocol
    // Basic serial protocol, without data change
    #define COMMUNICATION_PROTOCOL RAW_SERIAL
    
    // Serial port
    #define ESP_SERIAL_OUTPUT USE_SERIAL_0
    
    // Serial buffer size
    // 1024 Bytes
    // Maximum size of the serial buffer
    #define SERIAL_RX_BUFFER_SIZE 1024
    
    /************************************
    *
    * Target firmware
    *
    * Targeted firmware that ESP3D will communicate with
    *
    ************************************/
    // System type=3D printer
    
    // Target firmware
    // Marlin 2.x firmware
    #define DEFAULT_FW MARLIN
    
    /************************************
    *
    * Radio mode of ESP3D
    *
    * The radio mode ESP3D communicate with the network
    *
    ************************************/
    
    // Use WiFi 
    // Enable wifi communications
    #define WIFI_FEATURE 
    
    /************************************
    *
    * Channels of ESP3D
    *
    * The way ESP3D communicate
    *
    ************************************/
    
    // Use webserver
    // Enable http server
    #define HTTP_FEATURE 
    
    // Use telnet server
    // Enable telnet light (raw tcp) communications
    #define TELNET_FEATURE 
    
    // Enable notifications
    // Allows to send notifications to the user
    #define NOTIFICATION_FEATURE 
    
    // Notification message when online
    // The message that will be sent when the ESP is online
    #define NOTIFICATION_ESP_ONLINE "Hi, %ESP_NAME% is now online at %ESP_IP%"
    
    // Notification title message
    // The title of notification
    #define ESP_NOTIFICATION_TITLE "ESP3D Notification"
    
    /************************************
    *
    * Discovery methods of ESP3D
    *
    * The discovery methods of ESP3D
    *
    ************************************/
    
    // Use captive portal 
    // Enable captive portal in AP mode
    #define CAPTIVE_PORTAL_FEATURE 
    
    // Use mDNS discovery
    // This method need `bonjour` protocol on windows, or `avahi` on linux
    #define MDNS_FEATURE 
    
    // Use Simple Service Discovery Protocol
    // It is supported on Windows out of the box
    #define SSDP_FEATURE 
    
    /************************************
    *
    * SSDP Customization settings
    *
    * Customize your ESP3D
    *
    ************************************/
    
    // Model name
    // Modele name of device
    #define ESP_MODEL_NAME "ESP32"
    
    // Model number
    // Modele number of device
    #define ESP_MODEL_NUMBER "ESP3D 3.0"
    
    // Model url
    // Modele url of device
    #define ESP_MODEL_URL "https://www.espressif.com/en/products/devkits"
    
    // Manufacturer name
    // Manufacturer name of device
    #define ESP_MANUFACTURER_NAME "Espressif Systems"
    
    // Manufacturer url
    // Manufacturer url of device
    #define ESP_MANUFACTURER_URL "https://www.espressif.com"
    
    /************************************
    *
    * Flash filesystem
    *
    * Filesystem on flash
    *
    ************************************/
    
    // File system type
    // LittleFS
    // Type of file system used by ESP3D to store files
    #define FILESYSTEM_FEATURE ESP_LITTLEFS_FILESYSTEM
    
    // Enable date/time on files
    // Set date/time on files using SNTP or last webui connection
    #define FILESYSTEM_TIMESTAMP_FEATURE 
    
    /************************************
    *
    * SD filesystem
    *
    * Filesystem on SD card
    *
    ************************************/
    
    // SD card connection
    // Only your ESP board is connected to SDCard
    // Does your system has SD card and how it is connected to your ESP3D
    #define SD_DEVICE_CONNECTION ESP_DIRECT_SD
    
    // SD card library
    // Used by SDMMC
    #define SD_DEVICE ESP_SDIO
    
    // Sdio bit mode
    // 4 bits
    #define SDIO_BIT_MODE SD_FOUR_BIT_MODE
    
    // Enable date/time on files
    // Set date/time on files using SNTP or last webui connection
    #define SD_TIMESTAMP_FEATURE 
    
    /************************************
    *
    * Update ESP3D
    *
    * Update ESP3D firmware
    *
    ************************************/
    
    // Enable Web Update
    // Update firmware using WebUI
    #define WEB_UPDATE_FEATURE 
    
    // Enable SD card Update
    // Update firmware and settings using file on SDCard
    #define SD_UPDATE_FEATURE 
    
    /************************************
    *
    * Display settings
    *
    * Rendering screens
    *
    ************************************/
    
    // Printer screen
    // Your printer has a display
    #define PRINTER_HAS_DISPLAY 
    
    /************************************
    *
    * Camera settings
    *
    * Connected camera
    *
    ************************************/
    
    // Camera type
    // AI Thinker (ESP32-Cam)
    // Camera connected to ESP board, only ones with PSRAM are supported
    #define CAMERA_DEVICE CAMERA_MODEL_AI_THINKER
    
    // Flip horizontally
    // Flip camera horizontally
    //#define CAMERA_DEVICE_FLIP_HORIZONTALY 
    
    /************************************
    *
    * Levels of security
    *
    * How commands are allowed to be sent to ESP3D
    *
    ************************************/
    
    // Enable serial commands
    // Allow commands to be sent to ESP3D via serial port
    #define SERIAL_COMMAND_FEATURE 
    
    /************************************
    *
    * Additional features
    *
    * Extra settings
    *
    ************************************/
    
    // Enable direct control pin
    // Controls pins using [ESP201]
    #define DIRECT_PIN_FEATURE 
    
    /************************************
    *
    * Default settings for ESP3D
    *
    * Do not edit them
    *
    ************************************/
    
    // Gcode Host Feature
    // This feature allows to process Gcode files like macros.
    #define GCODE_HOST_FEATURE 
    
    // Settings location
    // EEPROM
    // Location where ESP3D will save settings
    #define ESP_SAVE_SETTINGS SETTINGS_IN_EEPROM
    
    // Add serial task
    // ESP32 need to add a task to handle serial communication
    #define SERIAL_INDEPENDANT_TASK 
    
    
    
    /************************************
    *
    * Development setting 
    * Do not modify them for production 
    ************************************/
    
    //Enable debug mode
    //Do not do this when connected to printer !!!
    //be noted all upload may failed if enabled
    //DEBUG_OUTPUT_SERIAL0
    //DEBUG_OUTPUT_SERIAL1
    //DEBUG_OUTPUT_SERIAL2
    //DEBUG_OUTPUT_TELNET
    //DEBUG_OUTPUT_WEBSOCKET
    //#define ESP_DEBUG_FEATURE DEBUG_OUTPUT_SERIAL0
    
    #ifdef ESP_DEBUG_FEATURE
    #define DEBUG_BAUDRATE 115200
    #define DEBUG_ESP3D_OUTPUT_PORT  8000
    #endif //ESP_DEBUG_FEATURE
    
    //Enable benchmark report in dev console
    //#define ESP_BENCHMARK_FEATURE
    
    //Disable sanity check at compilation
    //#define ESP_NO_SANITY_CHECK
    
    
    /************************************
    *
    * Sanity checks 
    * Do not modify 
    ************************************/
    
    #if defined (SD_TIMESTAMP_FEATURE) || defined (FILESYSTEM_TIMESTAMP_FEATURE)
        #define TIMESTAMP_FEATURE
    #endif //SD_TIMESTAMP_FEATURE || FILESYSTEM_TIMESTAMP_FEATURE 
    
    #if defined(PRINTER_HAS_DISPLAY)
    #define HAS_SERIAL_DISPLAY ""
    #endif // PRINTER_HAS_DISPLAY
    
    #if defined(CAMERA_DEVICE)
    #if CAMERA_DEVICE==CAMERA_MODEL_ESP32_CAM_BOARD || CAMERA_DEVICE==CAMERA_MODEL_ESP32S2_CAM_BOARD
    #define USE_BOARD_HEARDER 1
    #endif // CAMERA_DEVICE==CAMERA_MODEL_ESP32_CAM_BOARD || CAMERA_DEVICE==CAMERA_MODEL_ESP32S2_CAM_BOARD
    #endif // CAMERA_DEVICE
    
    #if !defined(WIFI_FEATURE) && !defined(ETH_FEATURE)
    #undef HTTP_FEATURE
    #undef TELNET_FEATURE
    #undef WEBDAV_FEATURE
    #undef FTP_FEATURE
    #undef WEB_UPDATE_FEATURE
    #undef CAPTIVE_PORTAL_FEATURE
    #undef SSDP_FEATURE
    #undef MDNS_FEATURE
    #undef NOTIFICATION_FEATURE
    #endif
    
    #endif //_CONFIGURATION_H

    Cut and paste this in your configuration.h if you are facing issues.

  • Doc Brown Inspired sunglasses - Check the show notes for the STL and SVG Photos below

    Check the show notes for the STL and SVG

    Photos below

  • Can you Wifi a 3D printer? - I was wondering if it was possible to Wifi my 3D printer. At the moment I need to either use an SD card or plug it into the front of my printer with a USB cord. These are two mechanical connections that will soon fail due to the constant operation. You could, of course just attach a dedicated unit like a raspberry Pi. This requires additional power requirements and a USB plug screaming to be snapped off. This along with the general shortage of raspberry pi in general puts me off this idea. There are lots of low-cost ESP wifi modules that could surely pass the serial data from wifi to the printer so I set out to see if this was indeed possible. In general, I would print directly from Octoprint from an old laptop that has a new lease on life with this important function. Before I can start I have to work out how to hack into the control board serial communication. Flash ESP3D to a ESP32 Download ESP-3D from here: https://github.com/luc-github/ESP3D Unzip the file somewhere you can find it easily.  Open ESP-3D in Arduino. Browse the download for the esp3d folder, within this the sketch esp3d.io can be found, open this file.  Pull the triggerI will assume you have flashed an ESP32 previously, if not configure this first. With your ESP-32 connected and selected in your boards try and flash the software. I very much doubt there is a single Arduino IDE install that is the same as another so you could have a lot of dependency errors when you try and flash the firmware or you may have none. For me, I just had two: Websockets: https://github.com/Links2004/arduinoWebSockets ESP32SSDP: https://github.com/luc-github/ESP32SSDP Once these libraries were installed I could flash the ESP-32 Configure ESP-3D Once you have successfully flashed the ESP shortly afterward a new AP will appear in your list of APs called ESP3D. Connect to this AP the password will be 12345678. This will open a captured portal page in a browser, there will be an error on the page.  Click on Choose files and navigate to esp3d/data select all the files and upload them.  After the upload, the files should appear in the ESP3D UI. Reboot the ESP-32  You should now be presented with the first-time configuration.  Choose Marlin, no other settings need to change here (E3V2) click Continue  On the next screen, you can configure your WiFi If you would like to connect to your local WiFI enter your AP and credentials otherwise leave the settings as they are to connect to the ESP-32 directly.  Click Continue You will now be presented with the ESP3D full UI. Click on ESP3D at the top of the UI.  From the top of the window click Printer.  Select Marlin from the dropdown and click Set An extra tab should now appear at top of the UI. This is as far as we can go with ESP3D for now. Connecting to the serial port As I mentioned earlier, 3D printers have serial but the data is communicated via a converter chip to computer-friendly USB. Most small controllers can not act as USB host so we need to hijack the serial before it gets to the converter chip. Looking at the schematic for the board the printer CPU connects directly to the serial-USB converter chip. There is no convenient header to connect to the serial so we will have to solder directly to the converter chip.  Below you can see my serial wires soldered to the chip.  Conventionally there is a header near buy that can supply our ESP32 with 3.3v and ground. Once you have soldered the serial connection and connected headers to the power route the wires with the control panel ribbon cable.  Remove the back cover of the aluminum extrusion and slide the holder (see STL) as far forward as it will go behind the ender control panel, insert the ESP32 Connect your new serial wires to GP01 and GP03 RX to TX and TX to RX connect the power wires to 3.3v and a GND.  Place the remaining cover over the ESP32 mount For now, the USB is only for flashing the ESP32. The developer has created an issue to enable pass-through support so you do not lose the ability to print via USB: https://github.com/luc-github/ESP3D/issues/800 If you have been successful you should see an IP address on the Ender screen.  Return to your browser and check your printer tab. and click the refresh button. You should see GCODE defaults you can change. If you only see Label Value Help the printer is not talking to the ESP32.  Virtual serial port We now need to trick your slicer or Octoprint that your computer has a COM port. To do this we use virtual serial port software. There are many different apps that will do this. I found this one easy to use and appears free: https://tibbo.com/soi/software.html The tool requires the IP of the ESP32 and a port number. The port number can be found in the ESP3D UI. This probably won’t change unless you change it.  Simply add the IP address in Tibbo or your virtual serial port software of choice and the port number. Here Tibbo has allocated COM5, remember your COM port.  Print! All things being equal when you try to connect from your slicer or Octoprint there should be a COM port and when you connect to that COM port you should have control of your printer as if the USB cable is attached.  Check the video at the top of the guide with my findings on how well the prints come out.  Test print Initially, I tried an ESP-01s the first print that came out was not good. It seems that the printer paused several times during the job. I am not sure if the network was slow or if the 8266 was just struggling to keep up. Looking at the network performance of the Ocotprint server it was not running out of capacity at all so I figured the 8266 was the bottleneck. Time for an upgrade. I tried an ESP32 with the same firmware and fired off another Benchy. This print came out significantly better. It was not perfect as there were one or two places where it looks like the print head may have stopped but nothing like the dozens of times it must have stalled with the 8266. Conclusion With a bit of tweaking, I think it would be possible to run a 3D printer with a low-cost ESP module. I have the ideal situation here as I have no other wifi signals to interfere and network latency could be an issue in a suburban area. Using Wifi would mitigate the issue of damaged USB plugs or SD card readers but it does introduce the issue of someone inadvertently rebooting the router. The general convenience of being able to print from anywhere without the requirement for extra power connections or add-ons might make it worthwhile. I will add a double pole switch so I can swap between Wifi and USB as both can not be used at the same time. Keep an eye out on my cults3d account as I will have a mounting bracket for the Ender 3 V2 and ESP32. Even if you did not want to print directly you can still use all the tools in ESP3D.

    I was wondering if it was possible to Wifi my 3D printer. At the moment I need to either use an SD card or plug it into the front of my printer with a USB cord.

    These are two mechanical connections that will soon fail due to the constant operation. You could, of course just attach a dedicated unit like a raspberry Pi. This requires additional power requirements and a USB plug screaming to be snapped off. This along with the general shortage of raspberry pi in general puts me off this idea.

    There are lots of low-cost ESP wifi modules that could surely pass the serial data from wifi to the printer so I set out to see if this was indeed possible.

    In general, I would print directly from Octoprint from an old laptop that has a new lease on life with this important function. Before I can start I have to work out how to hack into the control board serial communication.

    Flash ESP3D to a ESP32

    Download ESP-3D from here: https://github.com/luc-github/ESP3D

    Unzip the file somewhere you can find it easily. 

    Open ESP-3D in Arduino.

    Browse the download for the esp3d folder, within this the sketch esp3d.io can be found, open this file. 

    Pull the trigger
    I will assume you have flashed an ESP32 previously, if not configure this first.

    With your ESP-32 connected and selected in your boards try and flash the software.

    I very much doubt there is a single Arduino IDE install that is the same as another so you could have a lot of dependency errors when you try and flash the firmware or you may have none.

    For me, I just had two:

    Websockets:

    https://github.com/Links2004/arduinoWebSockets

    ESP32SSDP:

    https://github.com/luc-github/ESP32SSDP

    Once these libraries were installed I could flash the ESP-32


    Configure ESP-3D

    Once you have successfully flashed the ESP shortly afterward a new AP will appear in your list of APs called ESP3D. Connect to this AP the password will be 12345678. This will open a captured portal page in a browser, there will be an error on the page. 

    Click on Choose files and navigate to esp3d/data select all the files and upload them. 

    After the upload, the files should appear in the ESP3D UI.

    Reboot the ESP-32 

    You should now be presented with the first-time configuration. 

    Choose Marlin, no other settings need to change here (E3V2) click Continue 

    On the next screen, you can configure your WiFi

    If you would like to connect to your local WiFI enter your AP and credentials otherwise leave the settings as they are to connect to the ESP-32 directly. 

    Click Continue

    You will now be presented with the ESP3D full UI.

    Click on ESP3D at the top of the UI. 

    From the top of the window click Printer

    Select Marlin from the dropdown and click Set

    An extra tab should now appear at top of the UI.

    This is as far as we can go with ESP3D for now.


    Connecting to the serial port

    As I mentioned earlier, 3D printers have serial but the data is communicated via a converter chip to computer-friendly USB. Most small controllers can not act as USB host so we need to hijack the serial before it gets to the converter chip. Looking at the schematic for the board the printer CPU connects directly to the serial-USB converter chip.

    There is no convenient header to connect to the serial so we will have to solder directly to the converter chip. 

    Below you can see my serial wires soldered to the chip. 

    Conventionally there is a header near buy that can supply our ESP32 with 3.3v and ground.

    Once you have soldered the serial connection and connected headers to the power route the wires with the control panel ribbon cable. 

    Remove the back cover of the aluminum extrusion and slide the holder (see STL) as far forward as it will go behind the ender control panel, insert the ESP32

    Connect your new serial wires to GP01 and GP03 RX to TX and TX to RX connect the power wires to 3.3v and a GND. 

    Place the remaining cover over the ESP32 mount

    For now, the USB is only for flashing the ESP32. The developer has created an issue to enable pass-through support so you do not lose the ability to print via USB: https://github.com/luc-github/ESP3D/issues/800

    If you have been successful you should see an IP address on the Ender screen. 

    Return to your browser and check your printer tab. and click the refresh button.

    You should see GCODE defaults you can change. If you only see Label Value Help the printer is not talking to the ESP32. 


    Virtual serial port

    We now need to trick your slicer or Octoprint that your computer has a COM port. To do this we use virtual serial port software. There are many different apps that will do this. I found this one easy to use and appears free: https://tibbo.com/soi/software.html

    The tool requires the IP of the ESP32 and a port number. The port number can be found in the ESP3D UI. This probably won’t change unless you change it. 

    Simply add the IP address in Tibbo or your virtual serial port software of choice and the port number.

    Here Tibbo has allocated COM5, remember your COM port. 


    Print!

    All things being equal when you try to connect from your slicer or Octoprint there should be a COM port and when you connect to that COM port you should have control of your printer as if the USB cable is attached. 

    Check the video at the top of the guide with my findings on how well the prints come out. 


    Test print

    Initially, I tried an ESP-01s the first print that came out was not good. It seems that the printer paused several times during the job. I am not sure if the network was slow or if the 8266 was just struggling to keep up. Looking at the network performance of the Ocotprint server it was not running out of capacity at all so I figured the 8266 was the bottleneck. Time for an upgrade.

    First print was not great

    I tried an ESP32 with the same firmware and fired off another Benchy.

    ESP32 print was a significant improvement

    This print came out significantly better. It was not perfect as there were one or two places where it looks like the print head may have stopped but nothing like the dozens of times it must have stalled with the 8266.


    Conclusion

    With a bit of tweaking, I think it would be possible to run a 3D printer with a low-cost ESP module. I have the ideal situation here as I have no other wifi signals to interfere and network latency could be an issue in a suburban area. Using Wifi would mitigate the issue of damaged USB plugs or SD card readers but it does introduce the issue of someone inadvertently rebooting the router.

    The general convenience of being able to print from anywhere without the requirement for extra power connections or add-ons might make it worthwhile.

    I will add a double pole switch so I can swap between Wifi and USB as both can not be used at the same time. Keep an eye out on my cults3d account as I will have a mounting bracket for the Ender 3 V2 and ESP32. Even if you did not want to print directly you can still use all the tools in ESP3D.