Skip to content

Backside Electronics for my Ender 3

He strikes again... Teaching Tech with his all in one rear mounted electronics case.
Ok almost, since I have cable chains on my printer :-(

But hey this guy has a remix with a my cable chain connector, but not my MKS GenL 1.0 board, meeehh :-(

Hmm after about 5 min thinking and the power of sharing (and Fusion 360) I combined them to the Ender 3 all in one, universal rear electronics case - Right Case mks gen l with dragchain connector, printed it and now I have the electronics in the trunk too ;-)


Yes this is crooked, it will be next

IT'S DEAD ahahahah!!!1!11

:'( yes it's true I killed my Ender 3, RIP.

Ok RoSP maybe? Since it is kind of hard to destroy extruded aluminium profiles and the like so one could say it is brain dead?! (nice movie) Since the Mainboard (is this the right name?) and 3 of 4 stepper drivers are not working any more.

How did that happen you ask?

Hmm some stupid guy wanted to install one of then ass cheap Chinese filament run out sensors and had that what could possibly go wrong attitude.

To be fair this my first time to actually break any 3d Printer electronics and I'm playing with this stuff now for about 10 years. Of cause there is no schematic or documentation or googleable infos for my "sensor". And the connector fitted perfectly into a end stop socket of the MKS Gen L 1.0.

For some reason on my test setup with a ramps 1.4@ยต24v it worked fine, I guess that's why Chinese stuff is so dirt cheap, the "optimize" an Arduino Mega and a Ramps into a MKS Gen L 1.0 while at it just remove some not so important components.

I will never know since it's just too cheap and not open source (yes I look at you MKS Gen L 1.0) so I replaced them with the same items.

Is my Ender 3 now one of The Printing Dead community? ;-) It's came back to life after it died or is it more a Frankenstein Printer do I have to call it Herman now? :-D

More Ender 3 Mods... to make it silent

I realized I will never be done modding my Ender 3....

Newest list of changes and the result of the mod:

  • Installed a MKS Gen L 1.0 board with TMC2208 in drop in mode thing, no spi, no serial
    • Soo quiet now I love it :-D but those fans... :'(
  • Replaced the electronics fan with a Noctua 40x40x10 12v with one of these Mini dc-dc XM1584 step-down modules
    • Cooling is fine, I guess, no problem yet and I can not hear it... almost, 95% of the time there are way more noise from other sources.
  • Replased the PSU fan screws with some of these rubber screw thingies
    • PSU fan is now more silent too :-D
  • Installed a E3D Titan Extruder with this bracket
    • Almost no more clicking due to skipped extruder steps and I guess better print quality :-)

My Ender 3

I guess I'm done modding my Ender 3..... for now :-D

This nice guy from down under Teaching Tech / Youtube has a lot of good videos and I got most inspiration from him.

List of changes and the result of the mod:

  • Boot loader the the stock electronics and updated Marlin
  • Added cable drag chains to the bed and gantry thing with the Extruder, X axis and hot end thing
    • I had no accidentally unplugged Extruder motors since that so yes it helps.
  • Replaced the stock part cooling fan and fan duct with a 5050 Petsfang
    • way better cooling performance
    • not so sure about fan noise
  • added these yellow springs
    • Not sure if it helped with anything but is was cheap :-)
  • Added Stepper Dampers on X and Y
    • lowered the noise a little
  • Added a BL Touch
    • Hell yeah, auto bed leveling.... I will never go back to manual!!!!1!!

Operator Control Panel Remote Control

The Idea:

It would be nice to be able to the push all the physical OCP buttons by software (Network/TCP/IP).

In test automation some times the device or firmware is in a state where physical user input is required. E.g. the device was powered down or there is an "internal IP range" select thing and no other interface is running yet or just simple does the Open Mailslot button fire the correct OCP screen (we can read the OCP content by OCP automation)

It could look like this:

OCP diagram

Device X e.g. Raspberry Pi:

  • Connects to the network
  • Connects to an Interface Card e.g. by GPIOs

Interface Card e.g. 8x Relay board :

  • Connects to the OCP buttons.

Software:

  • A REST server receives commands and pushes the buttons.

Future Versions:

  • LED state detection (OpenCV?)
  • Device under test serial port access able by network too

Current Version (prototype thing):

Hardware:

  • Cables are soldered to the OCP buttons and connected to a 8 channel relay board
  • This board is connected to a Raspberry Pi by GPIO
  • The pi is connect to the Network.

Software:

  • On the Pi runs a python REST server (Flask is your friend)
  • It uses the Rasp Pi GPIOs to switch the relays
  • The Raspberry Pi Camera runs a a webcam
  • For manual pushing it shows a web page with links to push the buttons and the webcam image
  • For automated button pushing a simple http request can be made http://[IPofRaspi:SomePort]/key/enter?timepressed=3000

SourceCode

Problems:

Hardware:

  • Right now there are more than 8 buttons, so we need more / all

Software:

  • We can only push one button at a time,
  • Camera integration not so nice yet

Web UI

And a really "high" quality demo video :-) OCPButtonsDemo.mp4

r/c lights

Every thing is better with LEDs, right?

rc lights body with lights

So my r/c car needed some. Options are just buy a kit and be stuck with the vendor possibilities or DIY.

Of course DIY!!!

After some brainstorming I decided to start small.

Level 1:

  • head and tail lights
  • break lights
  • some blinking
  • switch able from the remote

Lucky for me my remote control set has 3 channels and with it's already custom firmware I can program it to cycle throug -100%, -50%,... to 100%.

And a quick look into my electronic part bins showed yeah I have all needed parts.

BoM:

  • 4x LEDs
  • 4x matching resistors
  • bains >> Arduino
  • power main r/c battery
  • some connectors ( for connecting the receiver and the LEDs, I want to be able to easily disconnect it )
  • cables
  • hot glue

Basically the Arduino is connected in parallel to channel 2 and 3 ( throttle and the button) The Arduino reads the PWN signals from the receiver and does some LEDs blinking.

Simple right? No? here is a schematic thing

rc lights schematic

HW version 1, kind of huge ;-)

rc lights perfboard version1

HW version 2, better. rc lights perfboard version2

And a PCB idea

rc lights pcb

And the Fritzing project file rc-lights-v4-arduino-mini-pro.fzz

Software:

rclightv3_serialoutput.ino

/
RC Lights by Stefan.Schmidt@knallakoff.de

Utility.h for the foreach(), pachted for IDE 1.0
v4
pro mini

http://arduino.cc/playground/Code/Utility
patch http://markus.jabs.name/2011/12/arduino-kennt-wprogram-nicht-mehr/
/
#include <Utility.h>
boolean debug = false;

//def input for 3 channel
int channel1_pin = 14;
unsigned int channel1_pulse;
int channel2_pin = 15;
unsigned int channel2_pulse;
int channel3_pin = 16;
unsigned int channel3_pulse;


int lstates[8] = {0, 0, 0, 0, 0, 0, 0, 0};  //to stor the lights start.... only 1 used until now
// only 4 are used, more to come...
byte headr = 10;
byte headl = 11;
byte backr = 3;
byte backl = 6;
byte revl = 5;
byte tr = 9;
byte tl = 12;
byte ex1 = 13;

byte lights[8] = {headr, headl, backr, backl, revl, tr, tl, ex1};



void setup(){
    if (debug){
        Serial.begin(9600);
    }
    // input setup
    pinMode(channel1_pin, INPUT);
    pinMode(channel2_pin, INPUT);
    pinMode(channel3_pin, INPUT);

    // output setup
    foreach(lights, 8, pinMode, OUTPUT);
    // by default all LEDs are on, so you can see if they are working
    foreach(lights, 8, digitalWrite, HIGH);
}

void loop()
    {  
    // Read the channles, CH1 Steering, CH2 Throttle and 
    // CH3 multi position switch, -100%, -50%, 0%, 50% and 100% on my H-GT3b with 0.41 PSX Firmware, 4 of 8 are possible positions are used
    // CH1 disabled by default I do not use it (not connected) and this add delay so it does not blink so fast ;-)

    //channel1_pulse = pulseIn(channel1_pin, HIGH, 20000);
    channel2_pulse = pulseIn(channel2_pin, HIGH, 20000);
    channel3_pulse = pulseIn(channel3_pin, HIGH, 20000);

    // Some Debug to see what is read from the channels
    if (debug){
        Serial.print("c1: ");
        Serial.print(channel1_pulse);
        Serial.print(" c2: ");
        Serial.print(channel2_pulse);
        Serial.print(" c3: ");
        Serial.println(channel3_pulse);
    }

    //begin switching depending on CH3 position
    //CH3 100% - some fast single blinking (
    if (channel3_pulse > 1900) {
        if (lstates[4]== 0){
            digitalWrite(lights[0], HIGH);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], LOW);
            } 
        if (lstates[4]== 1){
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], HIGH);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], LOW);
            } 
        if (lstates[4]== 2){
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], LOW);
            } 
        if (lstates[4]== 3){
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], HIGH);
            lstates[4]= -1;
            }
        lstates[4]++;    
    }

    //CH3 50% - some 4 LED blinking slower
    if ((channel3_pulse > 1700)and (channel3_pulse < 1900)) {
        if (lstates[4]== 0){
            digitalWrite(lights[0], HIGH);
            digitalWrite(lights[1], HIGH);
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], HIGH);
            lstates[4]= 1;
            } 
        else {
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], LOW);
            lstates[4]= 0;
            }
        delay(150);
    }

    //CH3 0% - LEDs blinking in X pattern - slower

    if ((channel3_pulse > 1400)and (channel3_pulse < 1700)) {
        if (lstates[4]== 0){
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], HIGH);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], HIGH);
            lstates[4]= 1;
            } 
        else {
            digitalWrite(lights[0], HIGH);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], LOW);
            lstates[4]= 0;
            }
        delay(300);
    }

    //CH3 -50% - normal 4 LED on (normal light) if CH2 is beaking /reverse rear LEDs blink
    if ((channel3_pulse > 1200)and (channel3_pulse < 1400)) {
        digitalWrite(lights[0], HIGH);
        digitalWrite(lights[1], HIGH);
        digitalWrite(lights[2], HIGH);
        digitalWrite(lights[3], HIGH);
        lstates[4]= 0;
        if ((channel2_pulse < 1300)) {
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], LOW);
            lstates[4]= 1;
            delay(30);
            }
        if ((channel2_pulse < 1300)and(lstates[4]== 1)) {
            lstates[4]= 0;
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], HIGH);
            delay(30);
            }
    }

    //CH3 -100% - lights off, if CH2 is beaking /reverse rear LEDs blink 
    if ((channel3_pulse > 900)and (channel3_pulse < 1200)) {
        digitalWrite(lights[0], LOW);
        digitalWrite(lights[1], LOW);
        digitalWrite(lights[2], LOW);
        digitalWrite(lights[3], LOW);
        if ((channel2_pulse < 1300)) {
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], HIGH);
            }
        } 
    }