E3D toolchanger: Tuning the tool pickups with reprap global variables and macro’s assistance

After I installed the homing switches for X and Y on the E3D toolchanger, I finally had a decent starting point to get the tools pickup and parking tuned.

Originally, I used sensorless homing but this caused changing offset values of the X- and Y positions of the machine. So the tools could not be picked up or brought home consistently after a reset.

Now, everything works fine and the X-Y values don’t change anymore after a reset.

What I did was to first make some macros for a one-off setting of the X and Y postion of the 4 Tools for the toolhead’s positioning.  If you don’t do this, you have to change all X values manually in 8 macro’s every time you want to change the value of X.

This was done with a number of global variables.  After defining these in a macro, they need to be called before using them.  In Config.g, I made a reference to run  the macro of the globals.g macro so it runs every time you boot the Duet.

In config.g, after the Tool definitions I added the M98 code to start the global definition of the used variables:

M98 P”0:/sys/globals.g” ; Make global variables in this globals.g macro

This macro file looks like this in my case and please be aware that the actual variables will differ per machine, but this may give you a starting point:

global T0_X_dock=-12.3 ; X-Parking position of Tool 0
global T0_Y_dock=225.2 ; Y-Parking position of Tool 0
global T1_X_dock=80 ; X-Parking position of Tool 1
global T1_Y_dock=225.9 ; Y-Parking position of Tool 1
global T2_X_dock=212 ; X-Parking position of Tool 2
global T2_Y_dock=226 ; Y-Parking position of Tool 2
global T3_X_dock=304.7 ; X-Parking position of Tool 3
global T3_Y_dock=225.4 ; Y-Parking position of Tool 3

The tfree 1-3and the tpre 1-3 files will then be like this for T0, and you can make the others by just fulling in T1 , T2 or T3 where it now states T0:

; tfree0.g
; called when tool 0 is freed
G91
G1 Z4 F1000
G90
;Purge nozzle
;M98 P”purge.g”
;Move In
G53 G1 X{global.T0_X_dock} Y150 F50000
G53 G1 X{global.T0_X_dock} Y200 F50000
G53 G1 X{global.T0_X_dock} Y220 F50000
;G53 G1 X{global.T0_X_dock} Y{global.T0_Y_dock} F1000
G53 G1 Y{global.T0_Y_dock} F1000
;Open Coupler
M98 P”Coupler – Unlock.g”
;fan off
M106 S0
;Move Out
G53 G1 {global.T0_X_dock} Y175 F50000

; tpre0.g
; called before tool 0 is selected
;Unlock Coupler
M98 P”Coupler – Unlock.g”
;Move to location
G1 X{global.T0_X_dock} Y200 F50000 ; was X-10.5
;Move in
G1 X{global.T0_X_dock} Y220 F50000
;Collect
;G1 X{global.T0_X_dock} Y229.2 F1000 ;was f2500
G1 Y{global.T0_Y_dock} F1000
;Close Coupler
M98 P”Coupler – Lock.g”
;WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!
;if you are using non-standard length hotends ensure the bed is lowered enough BEFORE undocking the tool!
G91
G1 Z10 F1000
G90
;Move Out
G1 X{global.T0_X_dock} Y150 F10000; was 4000

And I made some macros for checking where the toolhead is positioned, right in front of the tools T0-T3:

; fit_T0.g
; called to fit the Tool just in front of the dock
G91
G1 Z4 F1000
G1 Y-10 F2000
G90
G53 G1 X150 Y100 F20000
;Move In
G53 G1 X{global.T0_X_dock} Y150 F10000
G53 G1 X{global.T0_X_dock} Y200 F10000
G53 G1 X{global.T0_X_dock} Y220 F10000

If you want to check wether you made the correct changes to globals.g, be aware that the new values in the globals.g variables macro will only be read when you reboot.  [If you want to redefine the values in any other way without rebooting, you will need another type of call function.]

E3D toolchanger upgrade: X-and Y- axis homing switches installing and configuring

My E3D toolchanger appeared to have some small inconsistencies in homing X and Y.

This became apparant after I tried to tune the exact positions of the tools pickup, after having homed.

Every time it was tuned, it worked well and the next day it was just a bit off. Then I retuned it again, and after a day it was off again.  Not a lot, but just 0.1 mm or a bit more.  But it did cause problems with the toolchanges.

So- after reading a bit I found that others had this problem as well and produced a solution: Just put in a couple of good X- and Y homing switches!

I even found the to be printed 3d-parts for mounting these switches. Thanx for this, folks!

The switches are the same type as for the Z-switch.

X-axis end switch
Y-axis end switch

I printed the mounts in PETG carbon on my Prusa mini and mounted  both switches on the E3D toolchanger.

After this, I amended config. g and the homing files, please see the rest of my post for this:

CONFIG.G CHANGES

; Endstops
M574 X1 S1 P”xstop” ; X min active high endstop switch
M574 Y1 S1 P”ystop” ; Y min active high endstop switch
M574 C0 ; no C endstop
M574 Z0 P”nil” ; no Z endstop switch, free up Z endstop input as Z endstop switch. (I changed  this part for correct working with RRF3.3+)

NEW HOMING FILES:

; homex.g
; called to home the x axis

M98 P”homey.g” ; Home Y always before homing X

G91 ; use relative positioning

G1 H2 Z3 F5000 ; lift Z 3mm
G1 H1 X-400 F15000 ; move left 400mm, stopping at the endstop
G1 X5 F15000 ; move away from end
G1 H1 X-400 F2000 ; move left 400mm, stopping at the endstop
G1 X2 F2000 ; move away from end
G1 H2 Z-3 F1200 ; lower Z

G90 ; back to absolute positioning

; homeall.g
; called to home all axes;

M98 P”homec.g” ; Home C (ToolHead)

M98 P”homex.g” ; Home X

M98 P”homez.g” ; Home Z

G1 X150 Y-49 Z20 F15000 ; Park

; homey.g
; called to home the Y axis

G91 ; use relative positioning

G1 H2 Z3 F5000 ; lift Z 3mm BED DOWN
G1 H1 Y-400 F15000 ; move to the front 400mm, stopping at the endstop
G1 Y5 F15000 ; move away from end
G1 H1 Y-400 F2000 ; move to the front 400mm, stopping at the endstop
G1 Y2 F2000 ; move away from end
G1 H2 Z-3 F1200 ; move Z BED UP

G90 ; back to absolute positioning

Z homing did not change and remains as is:

; homez.g
; called to home the Z axis
M98 P”Coupler – Unlock.g” ; Open Coupler
G91 ; Relative mode
G1 H2 Z5 F5000 ; Lower the bed
G90 ; back to absolute positioning
G1 X150 Y100 F50000 ; Position the endstop above the bed centre
M558 F1000 ; speed to 1000
G30 ; probe x 1
M558 F300 ; speed to 300
G30 ; probe x 1

Toolhead stepper fault and solution

The toolhead stepper of my E3D toolchanger system suddenly broke down.

The cause was a failed tool pickup move,  due to which the rotating axle of the toolhead pickup system got blocked.

After exchanging the stepper I changed the Duet’s settings so the C-drive will not be able to generate too much torque.

This will prevent the last teethed wheel to break whenever the driven pickup axle gets blocked under extreme circumstances.

After opening the case of the failed reduction box, I discovered 1 broken tooth of the final gear.

I ordered me a new one, and mounted this.  And I changed the C-drive’s settings to make use of the stall mechanism.  It took some tweaking to get this to work properly.  After all, picking up a tool must still work as this is the base intention.

All is OK again!

E3D toolchanger Hymera fans 2, 4, 6 and 8 intermittent problem solved

In the end, the solution to my intermittent on/off problem with my toolfans on the Hymera direct drives was extremely simple.

The picture shows the solution, as the Hymera stepper driver obviously interferes with the 40mm fans.  The problem was that these fans 2,4,6 and 8 not always started spinning.

I tried to exchange the fans which did not help, tested the Voltage, current , settings and so on.  Everything appeared to be OK.

Strangely enough, when testing the fan off the Hymera tool, even including the duct attached, everything woked fine.  Just did not work when mounted on the Hymera.

Finally, Just trying some things, I pushed a thin steel plate (NOT RVS) in between the fan and the stepper motor, and now it always works, even at 5% PWM!   Problem solved!

After testing at all tools, I made 4 better fitting thin plates and mounted these at the 4 tools and no problem exists anymore, ever since!

Custom E3D toolchanger Dock adapter plate

Jantec.nl E3D toolchanger Hymera DD DOCK adapter and 3mm shifted adapter download

Tool T2 and T3 (3rd and 4th from left) are about 1.5 mm apart in the standard build, which means that T2’s tool fan can draw almost no air. With the new custom adapter, the right tool T3 moves 3 mm to the right, allowing the left tool T2 to once again draw air with the clear fan and cool T2’s heatsink from the Hymera Direct Drive extruder.

With this custom adapter, the respective tool moves up 3 mm, giving you an extra 3 mm of space compared to the left tool.

This makes just enough room for the tool fan of the left adjacent tool to cool the heatsink.

So place this adapter in the 2nd and 4th places with Tool 1 and 3.

This will save the first (T0) and 3rd tool (T2) in terms of cooling!

On the left the original version, on the right my version modified in Autodesk Fusion 360 for the tools at position T1 and T3 (2nd and 4th)

 

 

Downloads:

Jantec.nl E3D toolchanger Hymera DD DOCK adapter and 3mm shifted adapter

Calibrating E3D coreXY 4-toolchanger 3d printer

I am in the process of calibrating the tools, the overall settings and so on so I can move on with the rest of the tools.

In doing so, I always set all tools to settings that are in comparison to the first tool, T0.

This way, should anything change,  I have a solid reference.

Tomorrow I will build and install the 2 other Hemera direct drive tools and possibly I can finally have my Benchy testpint made with all 4 Tools!

 

In the end, calibrating did not work very well and the solution is here:E3D toolchanger upgrade: X-and Y- axis homing switches installing and configuring  and E3D toolchanger: Tuning the tool pickups with reprap global variables and macro’s assistance

Building E3D coreXY 4-toolchanger 3d printer

MORE E3D TOOLCHANGER POSTS

 

4xHemera direct drive first prints 

Tuning the tool pickups with reprap global variables

X-and Y- axis homing switches installing and configuring

Hymera fans 2, 4, 6 and 8 intermittent problem solved

E3D 4-toolchanger 3D printer updates

Custom E3D toolchanger Dock adapter plate

Calibrating E3D coreXY 4-toolchanger 3d printer

multicolor gadget open hollow multicolor 3d printer designs

Toolhead stepper fault and solution

BUILDING MY MULTICOLOR E3D PRINTER

June 2022: Last week I ordered the E3D toolchanger 3d printer kit and today I built it (almost completely).

The delivery went a bit awkward from England, because of the VAT and clearance fees you have to pay in NL.

Because my Voron 2.4 is fast, but could not print everything in one day, I have to assemble 3 more extruders.

Below you can see my shot with a Hemera direct drive extruder mounted on the right side.

To be able to follow everything on the video, I set all of the tool change speeds to 10x slower for a moment.

After the first day of test runs I swapped the original Duet2wifi board for a Chinese clone.

From the clone the wifi is impeccable, but the new updated wifi module on the original Duet2wifi is also with all the updates not working properly.

Every time I perform a remote reboot after a config change the wifi crashes and the board eventually connects fictitiously to IP address 255.255.255.255.

Searched all sites for help but found nothing.

Lack of experience can hardly be it, I have plenty of printers running fine on duet2wifi.

Just to be sure I have ordered an original Duet ethernet board, then I can convert the original board to duet2ethernet and I can at least still use it.

I ordered the version with 4 tools, the direct drive hemeras.  I also want to work with soft filament.

The nice thing about this experimental printer is that everything works with Duet, and I have quite a bit of experience with that.

The E3D TC will be my first semi-pro multicolor printer.

I have an Ender3 pro with MMU2S, an A30M with Chimera dual nozzle and an I3BearV3 with dual magnetic carriages.

But out of these 3 systems there is no one that really makes perfect prints.  They each have their specific qualities and features.

The Ender3/MMU2S can quickly print PLA and PETG with 5 colors but requires a filament spillage tower on the bed and is very cumbersome and slow to use.

TheA30M with Chimera is nice and fast and large (300x300x400mm) in build volume.  But the print quality is reasonable at best.  The dual nozzle Chimera with the nozzles at the same height hits with each movement just with the unused nozzle the tip of the filament deposited by the active extruder.  This results in smudges and a less beautiful print.  Yet I use this reasonably often, especially for quick test prints and at 0.2 0f even 0.3 mm layer height.  That works fine.

First impressions:

Please note that the Duex5 and Duet2wifi are initially incorrectly mounted here! The Duet must be below the DUEX5!

Here the object fan duct of the original version is used, I will update this later to the new version with the surround air ducts.

I printed everything with orange ASA on the Voron 2.4 at 150mm/s and 0.2mm with the E3DV6 direct drive Voron extruder and a 0.4mm copper nozzle.  Again, that went great!

By the way, there is something to note about this kit.

It is definitely not an ‘out of the box’ working system.

The hardware is outstanding, so are the manuals, better than anything I’ve ever seen.

The Duet and Duex combination is perfect and all the cables and screws, nuts, pins, gears and so on are nicely labeled and of fine quality.

The available config files, macro files and example print files are also great to start with.

And therein lies the problem for non-experts: All values are set to the best possible configuration.

And depending on your choices of extruder, bowden or no bowden and so on you have to make some adjustments here and there.

I had to recalibrate everything in terms of pickup Y values in the tool changer files before the tool was actually picked up and returned nicely.

In addition, it turned out that the tool pickup has to be adjusted very accurately to get the slot in and out of the extruder plates.

You have to understand how this is built, especially in the firmware.

Then you understand that the system has to reset to the start position every time at the start, and then the system makes that the reference point. Then you have to measure where 1) the open position is and 2) the locked position is.  Those values must be entered as C values in the pickup and return macros.

What I also find difficult is that there are no sensors (yet) to check whether the tools are in use or parked.

That means that you can just give a command to do a homeall while there is still a tool hanging on the pickup.

I would like to know that because then you program around that.

And so there are some other things like no filament sensor on the tools, no LED lights on the pickup but I’ve already seen a handy bracket for that.

So a very nice and good system, worth its money and high quality material, design also beautiful and still much to tinker with. Thank goodness!

In any case I’m going to reuse my Z-homing files from the previously built mullti- extruder machines with Duet.

Because this E3D works with a pre-homing without the tools hanging from the pickup, you will have to calibrate a Tool at Z distance relative to the pickup value every now and then.

And also the mutual differences in X and Y of course, relative to Tool0.

I have some nice macro tinkering for that too!

Next week onwards!

hole and pipe placed to adjust the magnetic coupling with the socket screw

Circular clock WS2812 & Arduino nano

LEES DIT ARTIKEL IN HET NEDERLANDS

In the above video you see all required parts for the elctronics.  An arduino Nano, a time module LS3231 with battery back-up and a 4-parts ring each with 15 WS2812 LED’s that provide a 160mm 60 LED units clock.  You can build it as an open built unit as shown above with wire strings or in a 3d printable slim case that I developed.  See the pictures below.

For building this nice precise clock, you can use my design files for the housing on any 3d printer that has a horizontal bed size of at least 165x165mm.

Grab both the print STL’s . HERE. from the Prusa shared site where I uploaded these designs. (If the link breaks, search on the prusa site for ws2812 circular arduino clock).

OR get the STL file for the clock’s FRONT from my website HERE

AND get the STL file for the clock’s REAR from my website HERE

One STL is for the rear and includes the Nano box, the other is for the front face of the clock.  Position the rear STL 180 degrees (so up goes down) in your slicer, so both the box and the LED housing are at Z-0 level, i.e. facing down at the same horizontal level.   The front can best be printed with the flat side down.  ABS is not recommended since it has less stiffness, but will probably also work.  For me PETG or PLA works best.

Use white filament for the front part, the rear can be any color you like.

In the circle the 4 WS2812 LED segments are positioned in 1 full circle of about 160mm.

Once you have the rear electronics connected, the front will slide snug over it. No glue required.  But the LED ring can best be glued in 4 places with a drop of hotglue to the base of the rear housing.  Best to do this after you are sure everything works OK.

The LED parts are available on a.o. banggood , aliexpress and so on, search for 60LED circle WS2812 that has the 160 mm outer diameter.

Each LED represents a dot either for seconds, minutes or as hour indicator.

The colors detemine the function.  Blue is also used as Quarter indicator with less intensity, to have a feeling of positioning for the other LEDS when it is dark.

Please look at the video above of the ‘open’ demo model to understand how it works.

Below you can find the Arduino code for the used Nano3, as-is.  it works for me, and in the code you will also find all required electrical connections and the used Time module’s spec.

When connected to your PC, you can program the Arduino and via the serial interface you can afterwards change special settings of the clock like brightness, special quarter dimlit indicators, et cetera.  it’s all in the code below.

The controls can be sent via a serial interface with the usb input of the Arduino, via a terminalprogram like YAT or with the Arduino IDE program’s interface.

The commands are:

  • f; fader OFF
  • F; fader ON
  • m (number); dim the 4 blue marker LED’s with value (number)
  • S; sync to RTC time
  • s; sync to System time (computer)
  • t (time); change system time to:
  • b; brightness of all non-marker LEDs

Please donate $1 to my paypal account if you use (parts of) my developed materials so I can continue to share nice stuff for you to download

Hope you will have a good build!

Cheers,

jan

The Arduino code, to be used for programming the Arduino Nano3 is available at the bottom of this post as plain text to be imported in an empty arduino file (with copy and paste).

Take care to use only the libraries and time module that are specified in the code!  The used time module is of the better generation that holds the time very well, also on standby.

When connecting the wires between the neopixel segments, the arduino and the time module, use a temperature-regulated soldering tool.  Use a fan when you are soldering and don’t inhale the toxic gases while soldering.

The Arduino code is shown below, to be imported in Arduino in an .ino file.  With Arduino, you must compile the code to get the Arduino flashed with the program.  If you want to do this easier, you can make use of the binary file I already compiled for both Arduino nano versions (with full memory and with half memory). Both Arduino nano types will be OK to use for this build, but they each require specific firmware.

The last part of this post is the Arduino program for the clock:

 


/**
* NeoClock
*
* Clock using 60 WS2812B/Neopixel LEDs and DS3231 RTC
* Small changes and updates made by jan Griffioen, Amsterdam Europe 2018-2021
* Libraries needed:
* * Adafruit NeoPixel (Library Manager) – Phil Burgess / Paint Your Dragon for Adafruit Industries – LGPL3
* *
* * Arduino Timezone Library (https://github.com/JChristensen/Timezone) – Jack Christensen – CC-BY-SA
* * Time Library (https://github.com/PaulStoffregen/Time) – Paul Stoffregen, Michael Margolis – LGPL2.1
*/

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

#if defined(ESP8266)
#include <pgmspace.h>
#else
#include <avr/pgmspace.h>
#endif

/* for software wire use below
#include <SoftwareWire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>

SoftwareWire myWire(SDA, SCL);
RtcDS3231<SoftwareWire> Rtc(myWire);
for software wire use above */

/* for normal hardware wire use below */
#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
/* for normal hardware wire use above */

#include <TimeLib.h> //http://www.arduino.cc/playground/Code/Time
#include <Timezone.h> //https://github.com/JChristensen/Timezone

#include <EEPROM.h>

//Central European Time (Frankfurt, Paris)
TimeChangeRule CEST = {“CEST”, Last, Sun, Mar, 2, 120}; //Central European Summer Time
TimeChangeRule CET = {“CET “, Last, Sun, Oct, 3, 60}; //Central European Standard Time
Timezone CE(CEST, CET);

TimeChangeRule *tcr; //pointer to the time change rule, use to get the TZ abbrev
time_t utc;

#define PIN 5

unsigned long lastMillis = millis();
byte dimmer = 0x88;
byte hmark = 0;

byte ohour=0;
byte ominute=0;
byte osecond=0;

boolean fader=true;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

void setup() {

Serial.begin(57600);

strip.begin();
strip.setBrightness(50);

// Some example procedures showing how to display to the pixels:
// colorWipe(strip.Color(255, 0, 0), 50); // Red
//colorWipe(strip.Color(0, 255, 0), 50); // Green
//colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
// Send a theater pixel chase in…
//theaterChase(strip.Color(127, 127, 127), 50); // White
theaterChase(strip.Color(127, 0, 0), 50); // Red
//theaterChase(strip.Color(0, 0, 127), 50); // Blue

//rainbow(20);
rainbowCycle(2);
//theaterChaseRainbow(50);

strip.clear();
strip.show(); // Initialize all pixels to ‘off’

Rtc.Begin();

Rtc.Enable32kHzPin(false);
Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone);

if (!Rtc.GetIsRunning())
{
Serial.println(“Rtc was not actively running, starting now”);
Rtc.SetIsRunning(true);
}

if (!Rtc.IsDateTimeValid())
{
// Common Cuases:
// 1) the battery on the device is low or even missing and the power line was disconnected
Serial.println(“Rtc lost confidence in the DateTime!”);
}

byte eechk = EEPROM.read(0);
if(eechk == 0xAA) { //Assume this is our config and not a fresh chip
dimmer = EEPROM.read(1);
hmark = EEPROM.read(2);
fader = EEPROM.read(3);
}

timeSync();
}

void calcTime(void) {
utc = now();
CE.toLocal(utc, &tcr);
ohour = hour(utc);
ominute = minute(utc);
if(osecond != second(utc)) {
osecond = second(utc);
lastMillis = millis();

if(ominute == 0 && osecond == 0) {
//Every hour
timeSync();
}
}
}

void addPixelColor(byte pixel, byte color, byte brightness) {
color *= 8;
uint32_t acolor = brightness;
acolor <<= color;
uint32_t ocolor = strip.getPixelColor(pixel);
ocolor |= acolor;
strip.setPixelColor(pixel, ocolor);
}

void drawClock(byte h, byte m, byte s) {
strip.clear();

addPixelColor(m, 1, dimmer);

if(hmark > 0) {
for(byte i = 0; i<12; i++) {
addPixelColor((5*i), 2, hmark);
}
}

h %= 12;
h *= 5;
h += (m/12);
addPixelColor(h, 2, dimmer);
// 0x RR GG BB

if(fader) {
byte dim_s1 = dimmer;
byte dim_s2 = 0;
byte px_s2 = s+1;
if(px_s2 >= 60) px_s2 = 0;
unsigned long curMillis = millis()-lastMillis;
if(curMillis < 250) {
dim_s2 = 0;
dim_s1 = dimmer;
}else{
dim_s2 = map(curMillis, 250, 1000, 0, dimmer);
dim_s1 = dimmer – map(curMillis, 250, 1000, 0, dimmer);
}

// Add blue low intensity dots for 12(0),3, 6 and 9 O’çlock to verify where the clock is positioned..
addPixelColor(15, 128, 10);
addPixelColor(30, 128, 10);
addPixelColor(45, 128, 10);
addPixelColor(0, 128, 40);

addPixelColor(s, 0, dim_s1);
addPixelColor(px_s2, 0, dim_s2);
}else{
addPixelColor(s, 0, dimmer);
}

// add a background color
// setBrightness(Serial.parseInt());
// uint16_t j;
// for(j=0; j<60; j++) { // 1 cycles of colors on wheel
// strip.setPixelColor(j, Wheel(((j * 256 / strip.numPixels()) + j) & 255));
// }

strip.show();
}

byte rounds = 0;

void loop() {
calcTime();

if(rounds++ > 100) {
Serial.print(ohour);
Serial.print(“:”);
Serial.print(ominute);
Serial.print(“:”);
Serial.print(osecond);
Serial.println(“(C)JG-2020”);
rounds = 0;

}
//rainbow(21);
if (osecond == 59){theaterChase(strip.Color(0, 0, 127), 40); }// Blue; }
//if (ominute == 59 AND osecond == 59){theaterChase(strip.Color(0, 127, 0), 50); }// Green}
//if (ohour == 11 AND ominute == 59 AND osecond == 59){theaterChase(strip.Color(127, 127, 0), 50); }// Green}
else {drawClock(ohour,ominute,osecond);}

delay(10);

chkSer();
}

void timeSync(void) {
RtcDateTime dt = Rtc.GetDateTime();
setTime(dt.Hour(),dt.Minute(),dt.Second(),dt.Day(),dt.Month(),dt.Year());

Serial.print(“Synced to: “);
Serial.print(dt.Year());
Serial.print(“-“);
Serial.print(dt.Month());
Serial.print(“-“);
Serial.print(dt.Day());
Serial.print(“-“);
Serial.print(dt.Hour());
Serial.print(“-“);
Serial.print(dt.Minute());
Serial.print(“-“);
Serial.println(dt.Second());
}

void timeSave(void) {
utc = now();

RtcDateTime store = RtcDateTime(year(utc), month(utc), day(utc), hour(utc), minute(utc), second(utc));
Rtc.SetDateTime(store);

Serial.print(“Synced to: “);
Serial.print(year(utc));
Serial.print(“-“);
Serial.print(month(utc));
Serial.print(“-“);
Serial.print(day(utc));
Serial.print(“-“);
Serial.print(hour(utc));
Serial.print(“-“);
Serial.print(minute(utc));
Serial.print(“-“);
Serial.println(second(utc));

}

void setBrightness(byte brightness) {
dimmer = brightness;
}

void chkSer(void) {
unsigned int iy;
byte im,id,iH,iM,iS;

if(!Serial.available()) return;

switch(Serial.read()) {
case ‘b’:
setBrightness(Serial.parseInt());
Serial.print(F(“Brightness changed to: “));
Serial.println(dimmer);
EEPROM.put(0, 0xAA);
EEPROM.put(1, dimmer);
break;
case ‘t’:
iy = Serial.parseInt();
im = Serial.parseInt();
id = Serial.parseInt();
iH = Serial.parseInt();
iM = Serial.parseInt();
iS = Serial.parseInt();
setTime(iH,iM,iS,id,im,iy);
Serial.println(F(“System time changed”));
break;
case ‘f’:
fader = false;
EEPROM.put(0, 0xAA);
EEPROM.put(3, 0);
Serial.println(F(“Fader off”));
break;
case ‘F’:
fader = true;
EEPROM.put(0, 0xAA);
EEPROM.put(3, 1);
Serial.println(F(“Fader on”));
break;
case ‘m’:
hmark = Serial.parseInt();
EEPROM.put(0, 0xAA);
EEPROM.put(2, hmark);
Serial.println(F(“HMark changed”));
break;
case ‘s’:
timeSync();
Serial.println(F(“Synced RTC to System”));
break;
case ‘S’:
timeSave();
Serial.println(F(“Synced System to RTC”));
break;
default:
Serial.println(‘?’);
}
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}

void rainbow(uint8_t wait) {
uint16_t i, j;

for(j=0; j<256; j++) {
for(i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i+j) & 25));//255
}
strip.show();
delay(wait);
}
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;

for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
for (int j=0; j<4; j++) { //do 4 cycles of chasing
for (int q=0; q < 3; q++) {
for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, c); //turn every third pixel on
}
strip.show();

delay(wait);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q=0; q < 3; q++) {
for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on
}
strip.show();

delay(wait);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r – g – b – back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 – WheelPos;
if(WheelPos < 85) {
return strip.Color(255 – WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 – WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 – WheelPos * 3, 0);
}

STL files for Minimill WMD16LV CNC conversion direct drive CNC adapters downloads with NEMA23 steppers

Please donate $1 to my paypal account if you use (parts of) my developed materials so I can continue to share nice stuff for you to download

Click on the URL(s) to download the appropriate STL-file(s)

MINIMILL_BF16L CNC_Y_adapter direct 2022_07_25_V1_5-jantec.nl

 

 

MINIMILL_BF16L CNC_X_adapter direct drive 2022_07_25_V1_5-jantec.nl

 

 

 

STL download voor de TOP direct drive adapter van de WMD16LV minifrees en Nema23 stappenmotor

MINIMILL_BF16L CNC_Z_adapter direct drive 2022_07_25_V1_5-jantec.nl