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
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 createTemperatureLookup.py program does, but it does it on the fly in the RepRap controller.
In a .h file put:
And in a .cpp file put:
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.
Here's some code that calculates temperatures analytically in exactly the way that Nophead's really useful createTemperatureLookup.py 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. #define COMPUTE_THERMISTORS #ifdef COMPUTE_THERMISTORS // See http://en.wikipedia.org/wiki/Thermistor#B_or_.CE.B2_parameter_equation // 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) ) #endif
And in a .cpp file put:
#ifdef COMPUTE_THERMISTORS // 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); } #endif
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.