Pizza V2

neues Rezept 🙂


2 Bleche, 500g Mehle

– Buchweizenmehl 180g
– Reisvolkornmehl 180g
– Maisstärke 100g
– Braunhirsemehl 40g
– Wasser 360ml
– 1Tüte Weinstein-Backpulver
– eine Gute Priese gemahlene Flohsamenschalen (Pulver)

Umluft 190°C
auf unterster Schiene 15-20min

funny plastic material…

did you know there is a plasict material that melts at about 60°C ?
the official name / main ingredient is
Polycaprolacton (PCL) (wikipedia: de en)
product names i found:

the challeng is to get a good water bath in the right temperature.
so for this i reused my HotPlate SMD soldering hardware.
created a profile that just heats to 60°C and waits…

i will add some pictures and experiment results here in some days 😉



Arduino Light-Barrier with TSOP4438

you just want to build a Light-Barrier (DE: Lichtschranke) ?

for example to measure speed? Or Count goals on a Table-Top-Football?

then you are at the right place.

We use a TSOP4438 as Receiver and some 5mm IR-LED as Sender.

the code

IR_TSOP4438_light_barrier_withDebounce/ir_light_barrier.ino

// based on
// Example of modulating a 38 KHz carrier frequency at 500 Hz with a variable duty cycle
// Author: Nick Gammon
// Date: 24 September 2012
// https://forum.arduino.cc/t/how-to-create-a-38-khz-pulse-with-arduino-using-timer-or-pwm/100217/44

// tweaked for TSOP4438
// https://www.vishay.com/docs/82459/tsop48.pdf
// find max burst length and min gap times:
//
// Minimum burst length 10 cycles/burst
// After each burst of length 10 to 40 cycles
//  a minimum gap time is required of ≥ 10 cycles
// Maximum number of continuous short bursts/second: 1500
//
// translates to:
// 38kHz = 26,3 us / Pulse → *10= 263us
// max burst length: <= 1052us  (26,3*40)
// min gap   length: >=  263us  (26,3*10)
// total cycle time of (1052+263=) 1315us 
// that violates the max bursts/second (666us/burst)
//
// on option is to optimize for the most bursts/second:
// so we use the min gap time as given and use the rest of the available time.
// 666us - 263us = 403 us burst length
// hopefully this way the AGC does not filter our stream...
// we now have to fit this to the best available prescaler / counter values:
// 672us fits good (this way we have less than the 1500 burst)
// this translates to 42 counts a' (0,0625us*256=) 16us
// so we use a gap length of 16us*17 = 272us 
// this gives us a burst length of 16us*(42-17)= 400us
//
// second option is to optimize for the longest burst length and have less bursts/second.
// here we will use a in-between leaning towards longer bursts:
// 0,0625us*256=16us
// 16us*50counts =  800us = 0,80ms = 1250,00Hz = 1250bursts/s
// 16us*80counts = 1280us = 1,28ms =  781,25Hz = 781,25bursts/s
// gap   length: 16us*17      =  272us 
// burst length: 16us*(80-17) = 1008us

// http://www.gammon.com.au/forum/?id=11504
// Timer 1
//   OC1A: D9
//   OC1B: D10
const byte LED = 9;

// Timer 2 (8bit)
//   OC2A: D11
//   OC2B: D3


// Clock frequency divided by 38 kHz frequency desired
const long timer1_OCR1A_Setting = F_CPU / 38000L;
// (16000000 / 38000) = 421,05
// this only works on Timer 1 - as it is a 16bit timer.

// ------------------------------------------
// in-between -  leaning for longer bursts
// target counts:
// CPU          16MHz (0,0625us)
// prescaler    256
// target       781kHz (1280us = 1,28ms)
const long timer2_top = (F_CPU / 256L) / 781L;
// (16000000 / 256) / 781 = 80
// calculate on / off ratio (toggle point)
const long timer2_compare = timer2_top * 1008L / 1280L;
// 80 * 1008 / 1280   =  80 - 17  =  63



volatile bool sender_active = false;

ISR (TIMER2_COMPA_vect) {
    // used to combine the two timers...
    if (sender_active == false) {
        // enable timer1 output
        TCCR1A |= bit(COM1A0) ;  // Toggle OC1A on Compare Match
        // digitalWrite (LED_BUILTIN, HIGH);
        sender_active = true;
    } else {
        sender_active = false;
        // disable timer1 output
        TCCR1A &= ~bit(COM1A0) ;  // DO NOT Toggle OC1A on Compare Match
        digitalWrite (LED, LOW);  // ensure off
        // digitalWrite (LED_BUILTIN, LOW);
    }
}

void lightBarrierSender_setup() {
    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);

    // set up Timer 1 - gives us 38.095 KHz
    TCCR1A = bit (COM1A0); // toggle OC1A on compare
    TCCR1B = _BV(WGM12) | _BV (CS10);   // CTC to OCR1A, No prescaler
    OCR1A =  (16000000L / 38000L / 2) - 1;  // zero relative

    // setup Timer 2
    TCCR2A = 0;
    TCCR2B = 0;
    // toggle OC2A on compare
    // TCCR2A |= bit(COM2A0); 
    // fast pwm to OCR2A
    TCCR2A |= bit(WGM21) | bit(WGM20);
    TCCR2B |= bit(WGM22); 
    // prescaler 1024
    // TCCR2B |= bit(CS22) | bit(CS21) | bit(CS20);
    // prescaler 265
    TCCR2B |= bit(CS22) | bit(CS21);
    // top
    OCR2A = timer2_top - 1;  // zero relative
    // switch point
    OCR2B = timer2_compare - 1;  // zero relative
    // enable interrupts
    TIMSK2 = bit(OCIE2A);
    // TIMSK2 = bit(OCIE2B) | bit(OCIE2A);
}

/IR_TSOP4438_light_barrier_withDebounce/IR_TSOP4438_light_barrier_withDebounce.ino

// simple light barrier test


unsigned long debounceDuration = 10;

const byte beam1Pin = 2;
bool beam1State = LOW;
bool beam1StateLast = LOW;
unsigned long beam1Timestamp = 0;

const byte beam2Pin = 3;
bool beam2State = LOW;
bool beam2StateLast = LOW;
unsigned long beam2Timestamp = 0;



void setup(){ 
    Serial.begin(115200);
    Serial.println("IR_TSOP4438_light_barrier");
    Serial.println("setup...");
    
    pinMode(beam1Pin, INPUT);
    pinMode(beam2Pin, INPUT);

    lightBarrierSender_setup();
    
    Serial.println("running.");
}

void loop() {
    beam1_check();
    beam2_check();
}


void beam1_check() {
    bool beam1Current = digitalRead(beam1Pin);

    if(beam1Current != beam1StateLast) {
        beam1Timestamp = millis();
    }

    if ((millis() - beam1Timestamp) > debounceDuration) {
        // egal welcher wert - dieser ist länger als debounceDuration da!

        // check for state change
        if(beam1Current != beam1State) {
            beam1State = beam1Current;
            if(beam1State) {
                Serial.println("beam1 brock...");
            }
        }
    }

    beam1StateLast = beam1Current;
}

void beam2_check() {
    bool beam2Current = digitalRead(beam2Pin);

    if(beam2Current != beam2StateLast) {
        beam2Timestamp = millis();
    }

    if ((millis() - beam2Timestamp) > debounceDuration) {
        // egal welcher wert - dieser ist länger als debounceDuration da!

        // check for state change
        if(beam2Current != beam2State) {
            beam2State = beam2Current;
            if(beam2State) {
                Serial.println("beam2 brock...");
            }
        }
    }

    beam2StateLast = beam2Current;
}

or just download this arduino sketchbook:

deep dive into the details

To get the TSOP4438 to work we need to send a 38kHz Modulated Signal from the LED. the catch: the receiver is designed to ignore CONTINUOUS signals – that is the way to also reject all the Disturbance from surrounding things like Fluorescent Lamps or other things…

therefore we need to modulate again the 38kHz signal:
so that there are times the signal is send and breaks where the beam is off. The timing requirements for this Pattern are described in the Datasheet :

Minimum burst length 10 cycles/burst

After each burst of length 10 to 40 cycles
a minimum gap time is required of ≥ 10 cycles

For bursts greater than  40 cycles
a minimum gap time in the data stream is needed of  > 10 x burst length

Maximum number of continuous short bursts/second 1500

To Be continued…

Research:

  • https://www.vishay.com/docs/82459/tsop48.pdf#page=6&zoom=250,-155,381
  • https://forum.arduino.cc/t/how-to-create-a-38-khz-pulse-with-arduino-using-timer-or-pwm/100217/12
  • https://forum.arduino.cc/t/how-to-create-a-38-khz-pulse-with-arduino-using-timer-or-pwm/100217/64
  • http://www.gammon.com.au/forum/?id=11504&reply=6#reply6
  • http://www.gammon.com.au/forum/bbshowpost.php?id=11504&page=2
  • http://www.gammon.com.au/images/Arduino/Timer_2.png
  • http://www.gammon.com.au/images/Arduino/Timer_1.png
  • https://arduino.stackexchange.com/questions/31187/irremote-send-and-receive-same-arduino
  • http://www.righto.com/2010/03/detecting-ir-beam-break-with-arduino-ir.html?showComment=1447463463512#c570784324410264988


Vegane Elisenlebkuchen / Nusstaler

Diesmal war die Challenge *Basische* Leckereien für mich zu Zaubern.

es geht in Richtung Elisenlebkuchen – ich würde es eher als Nusstaler benennen.

Lebkuchen / Nusstaler Zubereitung

Zutaten

die meisten Zutaten habe ich von Rapunzel verwendet.

Zutaten

  • 50g Datteln
  • 90g Rosinen
  • 120g Haselnüsse
  • 140g Mandeln
  • 60g Cachewkerne
  • ca 7g Lebkuchengewürz
  • ca 4g Ceylon Zimt
  • ein bisschen geriebene und getrocknete Orangenschale
  • eine Halbe Zitrone (inkl. Schale!!)
  • einen kleinen Schluck Wasser

Zubereitumg

  • Datteln kleiner schneiden
  • Dateln & Rosinen mit sehr heisem Wasser einweichen
  • Nüsse alle zussammen mischen
  • hälfte davon in kleinen portionen mit einem Hexler sehr fein mahlen
  • zweite hälfte gröber hexeln
  • zur Seite stellen
  • Datteln & Rosinen Gewürze & die (zerteilte) Zitrone mit einem kleinen Teil des Einweich-Wassers sehr fein Hexeln
  • dies gibt eine feine creme
  • diese creme mit der Nussmischung verrühren / kneten
  • wenn gleichmäßig verknettet für mehrere Stunden Kühl-Stellen
  • Ofen Vorheizen: Umluft 140°C
  • dann den Teig in kleine Haufen aufteilen
  • diese dann zwischen den Handflächen rollen – dadurch entstehen Kugeln die eine glatte Oberfläche haben
  • jeweils die Kugel mit dem Handballen flachdrücken (ca 1cm Höhe)
  • dann ab in den Backofen (140°C Umluft) – ca 15-20min – leichte bräune = fertig 🙂
  • kurz auskühlen lassen

Frisch schmecken sie mir am besten 🙂
ich finde sie sehr gelungen – das nächste mal etwas mehr zitrone und mehr Zimt –
das macht es Frischer und Würziger.. (das Lebkuchengewürz hatte eine starke Nelke-Note..)

Das Konzept des Zweiteiligen Hexelns wie ich es mir beim letzten mal ausgemahlt habe ist aufgegangen.

Gerne wieder 🙂

actual soldering :-)

this morning i did a last test-run with the tweaked Felder ISO-Cream profile:

yeah… at the top i thought it is in the cooling step already and opened the window – with ~3°C cold air from outside it dropped fast..
then i found it is in the middle of the reflow – sorry… and closed the window again – until it really switched to cooling..

the old left-over pcb i use for these is done now.. i comes from my LEDBoard_4x4_16bit project – and if i remember correctly i backed it with the assembled board in the oven multiple times back then..
now grilled it again ~4-7 times. it smells very bad – is super dark discolored.. i think that is ok with about ~12 times solder cycles..

and then started to assemble a simple board to really test the profile 🙂

placed

then reflowed:

i added a paper-lid to have stable air inside..

reflow was successful 🙂
my profile is just a little bit to long for my right angle touch switches:

they melted away 🙁 – lesson learned – have a look in the datasheet and you know that they are very heat sensitive!

in general i have the feeling that my heating elements get a little bit to hot – the pcb also slightly discolored at on place…
so will keep an eye on this and improve it..

Open Points

  • add housing
    • i would like to have class at the top for a good view what is happening inside..
  • metal frame for heating-elements
  • quite 5V fan with PWM control for cooling
  • add second temperature sensor
  • spring thing to hold board down
  • way to fix sensor position on board
  • more heating elements for bigger working area
    • switchable configuration for long or more square pcbs?!
  • bigger / second power supply ?! (~750W)

Testing & Tuning the PID

for tuning i followed more or less the tutorial PID Without a PhD
from Tim Wescott

and the tutorial and video from PID Explained Team.

first i just checked with low temperatures of 20..40°C
as i went on and tested up to 260°C i noticed that the current did decrease. and the temperature did not increase any more.
i could see this in my graph as the heating got slower and slower with the rising temperature… (also the pid already saturated at the output..)

so i measured the resistance during the cool down of the heating elements to get some insights:
(4x in series → 48V/4=~12V/Module)

Temperature (°C)Resistance (Ohm)Current (A)Power @48V (W)
255401,1957
250391,2158
240381,2359
230361,2660,5
220381,2660,3
200341,3564,8
100261,888,6
8024296
60222,18104
4020,92,3110
2519,52,46118
Temperature / Resistance – 4 Modules in Series – 12V/Module

result: the ~57W is not enough to get to more than 255°C…

i rearranged the Modules into 3-in-series connection.
this means ~16V/Module – and tested again:

Temperature (°C)Resistance (Ohm)Current (A)Power @48V (W)
25527,51,4570
25027,01,572
24026,61,677
23025,61,6780
22025,31,782
20024,11,886
10018,82,1100
8017,52,7130
6016,7
4015,6
2514,3
Temperature / Resistance 3 Modules in Series – 16V/Module

with this i found that i can go above 255°C.

i then tested the profile for the Felder ISO-Cream “Clear” and found that in the reflow stage the heat-up is a little to slow:

config:3S profile:Felder ISO-Cream “Clear”
my setup

in the *my setup* picture is a temporary cardboard thing with a 80mm 12V fan (connected to 5V) to cool down faster between tests.
for the final setup i think i will buy 1 or two 5V and PWM capable fans….
and also exchange the *chamotte* ston with some metal frame.
this way i also can cool the bottom side..


so i again switch the configuration –
now i have a 2-in-series config: 24V/Module
CURRENTLY THIS TABLE IS ONLY CALCULATED VALUES!!

Temperature (°C)Resistance (Ohm)Current (A)Power @48V (W)
255202,4115
25019,52,46118
240192,52121
230182,67128
22017,52,74132
200172,82135
100133,69177
80124192
60114,36209
4010,454,59220
259,754,92236
CURRENTLY ONLY CALCULATED VALUES!!!!
Temperature / Resistance – 2 Modules in Series – 24V/Module

i also tested this with the Felder profile:

this time the heat-up is fast enough! 🙂
the nice and working pid tuning i had for the 4-in-series arrangement is now out of tune…
so i will have to re-tune it to get less overshoot / swing.

while having a break i thought about the maximal power in this configuration –
and found that this way i only be able to power 2×2 modules with my 250W power supply.
for now i leave it this way. in the long run i hope with the other frame concept i get more heat to the pcb and less into the stone and this way be able to use the 3S config.

Tuning

after a day of mostly waiting til the system cooled down again
– one test cycle <=60°C needs 400s → 6:40min –
i just rebuild my hw mounting setup.

this way i can warm up quicker and cool down much quicker as i do not store heat in the stone. – at least that is what i hope..

plot old setup
plot with old setup
plot new setup
plot with new setup

hmmm – does not seem to change much..

i then tested the actual Felder Profile:

Felder ISO-Cream ‘Clear’ – Sn96,5Ag3,0Cu0,5 – 2S1P – P 04.50 I 00.00 D 00.00

seems i have a working profile.
i will add a little more time for the prepare phase. so the pcb is really fully at the 50°C. at the top i have a little bit of a mis-match –
i saw on my temp sensor directly connected to the heating elements at the top ~265°C – so that is hot…
the pcb seems to increase its temperature resistance at higher temperatures… at the peak i have 230°C to 245°C error. and to the heating this results in ~35°C difference…

i will report when i solder the first real board. 😉

the idea & planing

the idea came from this Applied Science Video:
Electroluminescent paint and multi-channel control circuit
21 Nov 2018
starting at 11:25

there is a link to amazon for a element – and it is not available to delivery to germany 🙁
so i went on with some help of friends and found

dimensionsvoltagepowercurrentresistance
(guess)
power@
6V
power@ 9Vpower@ 12Vpower@
24V
link
70mm x 15mm12V70W5,8A2,06R17W39W70W280WHALJIA 12V 70W Wired MCH Metal Ceramic Heating Plate Heating Element 70mm x 15mm
70mm x 15mm24V110W4,6A5,2R7W15,6W27W110WHaljia 24V 110W Wired MCH Metal Ceramic Heating Plate Heating Element 70mm x 15mm
40mm x 40mm12V48W4A3R12W27W24W192WHaljia 12 V48 W Wire MCH Metal Ceramic Heating Plate Heating Element 40 mm x 40 mm
40mm x 40mm24V96W46R24W13,5W48W96WHaljia 24 V96 W WIRED MCH Metal Ceramic Heating Plate Heating Element 40 mm x 40 mm

to get an idea of how much power i actually need i had a look at the small commercial IR-Heaters and Hot-Plates –
they all have about 800W:

180mm * 235mm = 42300 mm² = 423 cm²
a = 60mm * 60mm = 3600 mm² = 48 cm (1x4)
b = 60mm * 80mm = 4800 mm² = 48 cm (2x2)
c = 60mm * 90mm = 5400 mm² = 54 cm² (1x6)
d = 60mm * 120mm = 7200 mm² = 72 cm² (1x8)
e = 120mm * 60mm = 7200 mm² = 72 cm² (2x4)
f = 120mm * 90mm = 10800 mm² = 108 cm² (2x6)
g = 120mm * 120mm = 14400 mm² = 144 cm² (2x8)

423 cm² == 800W
1 cm² == x

x = 800W *   1cm² / 423cm² = 1,89W
a = 800W *  36cm² / 423cm² = ~68W (1x4) 
b = 800W *  48cm² / 423cm² = ~91W (2x2) 
c = 800W *  54cm² / 423cm² = ~102W (1x6)
d = 800W *  72cm² / 423cm² = ~136W (1x8)
e = 800W *  72cm² / 423cm² = ~136W (2x4)
f = 800W * 108cm² / 423cm² = ~204W (2x6)
g = 800W * 144cm² / 423cm² = ~272W (2x8)

30x40mm: ~23W/module
60x15mm: ~17W/module

then i calculated the resistance of the found element to check on what wattage i can do at what voltages:

U = R*I
P = U*I
→ P = U*(U/R)

(i added these *guesses* in the table above)

So I decided to go with the 70x15mm 24V model.
and will update here if i found how this works out..

and for the first test setup i will go with the concept
12V→ 27W / module
so definitive more then enough..

as power supply i will use a MeanWell GST280A48-C6P
(reichelt) with an fitting connector (reichelt)
to get a 5V for the controller i will go with a recom R-78HB50-05 (VIN: 9-72V)
and for switching the power to the heating elements i will use IRLB4030PBF – MOSFET N-LogL 100V 180A 370W 0,0043R TO220AB
and to drive this a BC 550C as mentioned in this nice article:
Schalten und Steuern mit Transistoren III – Mit MOSFETs höhere Ströme schalten
for temperature measurement i use a Adafruit Universal Thermocouple Amplifier MAX31856 Breakout with an Thermocouple Type-K Glass Braid Insulated – K
and have the plan to use a Melexis IR thermometer
i have ordered a MLX90614ESF-BAA-000-TU
i hope that with this i can precisely track the surface temperature..

so when all the parts arrive i can go on.. with building.

for the Controller i plan to write it in CircuitPython and run it on an adafruit (maybe ItsyBitsyM4) PyBadge
for now i just want to use the arduino serial plotter or similar with an second CDC-device enabled to log the progress and the flash-drive function of CircuitPython for a text-file with the temperature-profile.
i have written a request in the adafruit CircuitPython forum if there are any PID controller things out there…