Friday, June 15, 2012


Is Reprap UP! to the Chinese challenge?

It appears that Delta Micro's UP! and UP! Mini are aiming to be a serious threat to Reprap and other personal 3D printer offerings in very short order.

The UP! Mini, a complete, out-of-the-box, 3D printing solution for under $1000

Do you want to read more?

Wednesday, June 06, 2012


Printed Circuitry: All covered up

Since my last blog post I've done a few more experiments on the printed circuitry front.  Previously I've done some tests that indicate we really need to put a radius on track corners or else the track comes out a little blobby. I did do this in the print in my last post, however it was only 0.5mm. Since then I've redone the board with 1.5mm radii and result is much better.  Also where two sections of track meet I've also a radius to maximise the contact between the two sections of track and hopefully improve the reliability. Unlike last time I deposited the metal track first and inserted most of the components afterwards and soldered by hand. This is mainly as I wanted to test my theory about rounded corners without wasting components:

I've also had a go at covering up the entire board; I tried a few times using completely solid fill on the cover layer. However the boards always stopped working. They were as tested before covering so I suspect that the amount of heat was too much for the metal and the track was melting or the upper layer was shorting through the plastic where it wasn't supposed to. However as it is all covered I can’t physically check. I'm now doing a 0.5mm tall cover layer at 15% fill. This also means that I can still test the board mid build as the track is still exposed.  I've elected to do a 0.5mm tall layer as the track doesn't quite sit flush with the top of the board, and this ensures that the head doesn't collide with the track. I haven't quite nailed depositing the alloy on an upper layer yet. The problem is that I need a perfect plastic solid layer, and I only have one layer to achieve this in. Normally we have 3/4 layers to get a nice smooth finish on exposed layers but due to the geometry I can't do this.
I'm going to try fitting a fan to my machine and fiddling with the plastic print settings to see if I can improve things.  For the time being I've just deposited the solder by hand. However I've still managed to cover the board and it still works so I've proven porous fill isn’t damaging the metal.

Saturday, June 02, 2012


Say goodby to thermistor table misery...

Tired of trying to remember which thermistor table to activate in your firmware?

Here's some code that calculates temperatures analytically in exactly the way that Nophead's really useful program does, but it does it on the fly in the RepRap controller.

In a .h file put:

// Set this if you want to define the constants in the thermistor circuit
// and work out temperatures algebraically - added by AB.


// See

// BETA is the B value
// RS is the value of the series resistor in ohms
// R_INF is R0.exp(-BETA/T0), where R0 is the thermistor resistance at T0 (T0 is in kelvin)
// Normally T0 is 298.15K (25 C).  If you write that expression in brackets in the #define the compiler 
// should compute it for you (i.e. it won't need to be calculated at run time).

// If the A->D converter has a range of 0..16383 and the measured voltage is V (between 0 and 16383)
// then the thermistor resistance, R = V.RS/(16383 - V)
// and the temperature, T = BETA/ln(R/R_INF)
// To get degrees celsius (instead of kelvin) add -273.15 to T

#define ABS_ZERO -273.15
#define AD_RANGE 16383

// RS 198-961
#define E_BETA 3960.0
#define E_RS 4700.0
#define E_R_INF ( 100000.0*exp(-E_BETA/298.15) )

// RS 484-0149; EPCOS B57550G103J
#define BED_BETA 3480.0
#define BED_RS 4700.0
#define BED_R_INF ( 10000.0*exp(-BED_BETA/298.15) )


And in a .cpp file put:

// Use algebra to work out temperatures, not tables
// NB - this assumes all extruders use the same thermistor type.  It also assumes Marlin-style analogue to
// digital readings (i.e. upside down...)
int temp2analogi(int celsius, const float& beta, const float& rs, const float& r_inf)
   float r = r_inf*exp(beta/(celsius - ABS_ZERO));
   return AD_RANGE - (int)(0.5 + AD_RANGE*r/(r + rs));

float analog2tempi(int raw, const float& beta, const float& rs, const float& r_inf)
   float rawf = (float)(AD_RANGE - raw);
   return ABS_ZERO + beta/log( (rawf*rs/(AD_RANGE - rawf))/r_inf );

int temp2analog(int celsius) { return temp2analogi(celsius, E_BETA, E_RS, E_R_INF); }
int temp2analogBed(int celsius) { return temp2analogi(celsius, BED_BETA, BED_RS, BED_R_INF); }
float analog2temp(int raw) { return analog2tempi(raw, E_BETA, E_RS, E_R_INF); }
float analog2tempBed(int raw) { return analog2tempi(raw, BED_BETA, BED_RS, BED_R_INF); }

By A->D readings upsidedown, I mean that Marlin subtracts A->D readings from their maximum range before using them, which is to say that as temperature goes up, the readings go up.  This is all very well, except that what is actually happening is that the thermistor's resistance is going down, and that's what you want to deal with here.

This code has to do some FP calculations of course (including logs and exponentials).  But most firmware only polls the temperatures a few times a second, so the processor load is minimal.

This page is powered by Blogger. Isn't yours?

Subscribe to
Posts [Atom]