Sous-vide: Mad og elektronik i én skøn forening
Sous-vide: Mad og elektronik i én skøn forening…
Sous-vide er lige som “low and slow” med grillen en teknik der fascinerer mig. Det går helt enkelt ud på at vacumpakke det og så tilberede det i varmt vand i mage timer. Vandtemperaturen vælges efter hvilken temperatur kødet skal ende på. Som med low and slow giver man med langtidstilberedning kødet mulighed for at nedbryde fibrene så kødet bliver utroligt mørt.
Såe… sår’n en dims må jeg da ha’ 🙂
Man kan selvfølgelig bare købe den færdig (se eks. her: link). For omkring 2500 kr er man i gang. Men nu er jeg jo både nørdet og nærig :-). Jeg har nu godt nok købt en vacuumpakker. Så fokus for denne blog er at bygge en Arduino-baseret temperaturstyring.
Der er følgende elementer i min sous-vide gryde:
Temperaturmåling- Styring af varmelegeme
- Cirkulation
- Temperaturregulering
- Display / setpoint-justering
- Kar
Denne blog handler om elektronik og firmware – senere kommer en anden om mekanikken.
Temperaturmåling
Jeg har købt en vandtæt temperaturføler. Den indeholder en DS18B20 (link) Maxim 1-wire temperaturføler – altså et digitalt serielt interface. Jeg lavede i sidste indlæg en gennemgang af sensoren og dens interface – så derfor se her: link.
Der viste sig dog nogle problemer med sensoren da jeg byggede den første mockup… 230V delen af projektet smadrede simpelthen one-wire bussen fra tid til anden. Jeg lavede derfor et simpelt filter der kasserer målinger der afviger mere end 5 grader fra den forrige måling. Det virker hæderligt omend der stadig slipper en ukorrekt måling igennem fra tid til anden. Der er absolut plads til forbedring.
Styring af varmelegeme
Varmelegemet er faktisk bare en dyppekoger der er forbundet til et relæ. Eller faktisk er det ikke et relæ men et solid-state relæ. Et solid state relæ er en switch baseret på enten thyristorer eller FET-transistorer.
Så – faktisk bare et relæ med mindre strøm til trækspolen og mindre larm :-).
Denne her kan styre 230V / 2A load med et 5V styresignal. Da varmelegemet jeg skal styre er på 300W (~300W/240V=1.25A) er det helt fint.
Søg efter “Solid-State Relay 2A” – den koster omkring 0,99 GBP.
Signalet er active low – så 0V er tændt og 5V er off. Og i softwaren er det eneste jeg skal tænke på at sætte den port jeg vælger til et output og så ellers sætte den on/off:
…MEN…AAAGRHHH… De solid state relæer jeg havde fået virker ikke… Jeg testede to stk… Heldigvis stoppede jeg der – og blev opmærksom på at min dyppekoger ikke var 300W (1.25A) – men 500W (2.1A)… lidt googling viser også at man ikke kan stole ret meget på de 2A de er rated til… Det er nok ikke Omron der er inden i trods det der står printet uden på…
Jeg testede en ny med en 40W el-pære – og så virkede den pludselig meget bedre…
Men – det løser jo ikke opgaven. Heldigvis havde jeg også købt nogle 10A solid state relæer – så det endte med sådan en i stedet. De er så active high – så high på udgangen give tændt heater.
Styring af cirkulation
“Rørepinden” drives af en gearmotor jeg har fundet på ebay. Det er en 6V DC-motor der kører med 60 omdr/min. Arduino’ens ben kan ikke trække strøm nok så jeg har brug for et eller andet til at drive motoren.
Rørepinden skal egentligt køre hele tiden – så måske skulle jeg bare sætte den direkte på strømforsyningen… Meeen omvendt vil jeg egentligt gerne kunne starte og stoppe den langsomt så det ikke skvulper så meget… Og til det formål vil det være smart med en PWM udgang.
Og – hov! Nederst i bunken af stumper fandt jeg et IRF520 baseret modul – det er godt nok en 9.2A fet… men det er vist fint nok :-)… Man skal dog lige huske at sætte en diode over motorterminalerne så man ikke risikerer at motoren “sparker igen” når man slukker FET’en. Årsagen til at en motor gør det er dels at der er en spolevirkning i viklingerne der forsøger på at holde strømmen konstant – og med open circuit så øger den spændingen for at forsøge at få strømmen til at løbe. Desuden “vender” motoren om og bliver en generator når man afbryder den og den bremser op. Den strøm motoren genererer skal kunne løbe et eller andet sted hen – ellers får man samme effekt med høje spændinger. Og har man høje spændinger så er det bare et spørgsmål om hvad der går i stykker først… 🙂
I firmwaren er det eneste der er nødvendigt at skrive en analog spænding til den PWM-udgang man vil bruge. Hvis man kan leve med 1kHz pwm-frekvens så er det en nem måde at lave PWM-styring på… Så jeg slipper i denne omgang for at tilpasse det H-bro library jeg lavede til robotbilen (link).
Der viste sig i praksis at være nogle mindre problemer med den opstilling… Nemlig at 60 omdr/min slet ikke er nok til at få vandet til at cirkulere. Jeg satte en strømforsyning i serie med motoren – så den fik omkring 12V i stedet for 5V… Og det hjalp. Så – nu har jeg bestilt en motor med en højere gearing – måske for høj men så kan jeg jo reducere den med PWM’en.
Temperaturregulering
Temperaturreguleringen har jeg i første omgang lavet som en helt simpel bang-bang regulering. Det vil sige at jeg tænde varmelegemet hvis temperaturen er 0,5 grader under setpunktet og slukker det når temperaturen er 0.5 grader over setpunktet. Det har vist sig at virke bedre end forventet – men når jeg får analyseret på opvarmningskurverne så vil jeg vurdere om jeg skal gøre noget ved det.
Display / temperaturjustering
Jeg har købt et 2×16 LDC keypad shield – altså et print med display og knapper der passer lige ned på Arduinoen. Og det er f… fikst 🙂
Det almindelige arduino LCD-library (LiquidCrystal.h – link) virker perfekt. Shielded bruger pin 4-9 – så det eneste man skal gøre er at oprette objectet med benene som parameter på constructoren. Derefter kalde “begin” med størrelsen af displayet – her 2×16 tegn. Endelig er det bare at gå i gang…:
Nu er der jo også nogle knapper… De er sat på med en spændingsdeler så hver knap repæsenteres af en spænding som kan måles med en analog indgang. Med en 10 bit ADC er der 2^10 mulige værdier – altså fra 0-1023:
| Key | Voltage | ADC |
| right | < 6% | <61 |
| up | 6 – 20% | <205 |
| down | 20-40% | <410 |
| left | 40 – 60% | <614 |
| select | 60-80% | <819 |
| none | 80 – 100% | >819 |
så:
Hvis man ikke gør andet vil koden tro at man har trykket på en knap hver gang man kalder funktionen (altså mens man holder knappen nede). Det vil i praksis betyde a knappen repeterer med en ukendt hastighed. For at undgå det har jeg lavet en stump ekstra kode der både sørger for at ét tryk kun giver respons én gang OG sørger for at repetere med en kendt hastighed:
Tilgiv at ovenstående kode er lidt rodet – jeg har lavet det som en klasse der oprettes og kaldes gennem sit interface. Se kode-linket herunder.
Strømforsyning
Jeg har købt nogle små 5V / 2A strømforsyninger. Simpelt og nemt :-).
Diagram
Firmware
Jeg har ad flere gange optimeret lidt på koden – både UI, struktur og funktionalitet. Konkret er der kommet et ur til, koden er blevet strukturet bedre og jeg fik fikset nogle læsefejl fra temperaturføleren.
Du kan hente arduino-imaget her: Download
Summary – og test 🙂
Skrue skrue skrue… Og voila blev konstruktionen sat sammen.
Første udgave var som nævnt voldsomt ustabil. Temperatursensoren gav fejlmålinger og koden gik ned med jævne mellemrun :-). Det opdagede jeg på den hårde måde ved første test 🙂 Koden crashede med varmelegemet tændt – og vandet nåede op på 80-90 grader. Det var lidt mere end plastikkarret kunne holde til – så det buler lidt nu… Godt jeg havde stillet den i vasken!!!
Jeg fik så det hele bygget lidt mere permanent sammen – med en mere hensigtsmæssig kabelføring og klar adskillelse af 230V og 5V. Det hjalp. Så forleden lavede jeg første test med en enkelt bøf 2 timer ved 54gr og dagen efter med en tyndsteg 11 timer ved 57gr. Begge var fine resultater – omend stegen var mere gennemstegt end jeg selv foretrækker :-).


Så med andre ord virker helt almindelig “positiv” matematik på binære tal i 2’ers komplement. Men hvorfor egentligt det?
Jeg fandt et kit på ebay – så det tænkte jeg var et godt udgangspunkt 🙂
Samlingen er fikst lavet så motorerne / hjulene bliver holdt af nogle plexiglasstumper.
Der er en lille detalje man er nødt til at tage hensyn til “i den virkelige verden”. Nemlig det at en transistor (eller FET) tager lidt tid om at gå fra on til off og tilbage igen. Som vist i billedet betyder det at både A og B er tændt samtidig i et kort stykke tid. Med andre ord er der det man kalder “gennemtænding”. Når der både er strøm og spænding samtidig vil der afsættes effekt i transistoren. Det holder de sjældent til i længden… En yderligere detalje er at de fleste transistorer og FET’er er hurtigere til at tænde end til at slukke.
Til denne applikation er det fikst at vi kan drive begge motorer med samme modul.



Den dårlige undskyldning er selvfølgelig at jeg ikke tænkte på det fordi mit robot-kit blev leveret uden (ved en fejl)… Jammerligt dårlig undskyldning 🙂









Gul: rising / falling flanke




Der var den centralt placeret til at modtage “tryk” fra afbrydere (der skulle opgraderes med en fjeder) og havde adgang til lamperne der skulle styres. Mock-up og prototyperne på billederne er af dette modul. Vi designede et ret fedt koncept hvor printene fungerede både som køleflader og stik-forbindelser.



Arduino er et “format” som reelt bare dækker over en Atmel ATmega processer hvor det grundlæggende (oscillator og forsyning) ligger på boardet og alle pins er ført ud til pinheaders så det er nemt at slutte andre enheder til.
Stifterne bag Arduino røg for nogle år siden i totterne på hinanden. Det var noget med at de hver især mente at eje domæne og registrerede varemærker. Så i dag kan Arduino også købes under navnet Genuino…
Arduino giver faktisk ret meget for pengene. Og kan man ikke være i formatet kan man skifte til Arduino Mega2560 der er baseret på ATmega2560. Den har 16 analoge inputs og 54 digitale i/o. Det kan man hurtigt få lyst til hvis man begynder at sætte display, 2-3 temperatursensorer, relæudgange og andet sjov på samme controller…
Uanset hviket miljø man vælger er der utroligt mange ting der bare virker “out of the box”. Ting man som traditionel udvikler selv må klare – såsom biblioteker med adgang til hardwaren og håndtering af interrupts etc. Alt det og meget mere er der taget hånd om – men som gammel embedded udvikler kræver det altså lidt tilvænning ikke at have indflydelse på alting 🙂
Et lille tip til brug af ebay… Hvis du vælger “Lowest price + P&P” så får du alle dem med gratis fragt 🙂 først i listen.
Nano har ikke indbygget USB-adaptor – så det første var at slutte USB-serial port til. Det var ret nemt 🙂 – 6 ben lige igennem. Det er her “female to female jumper cables” kommer i brug. Det er en dejligt nem måde at klaske ting sammen på. Ikke egnet til den endelige applikation men fin til test.
Jeg stod for nylig med en udfordring – en af mine arduino sensorer holdt op med at virke når jeg kommunikerede med den for hurtigt… Min eneste indsigt i kommunikationen var gennem det softwaren gav – og det bragte mig ikke videre… Interfacet er via SPI som jeg bit-banger – dvs. styrer manuelt i stedet for at bruge den indbyggede SPI-controller i ATmega microcontrolleren.

Da jeg fik den opstod der ca. en halv times total forvirring om drivere. Pulseview ville ikke genkende min logikanalysator… Det viste sig at Hobby Components har lavet en opdatering i efteråret og forvirringen skyltes dels at jeg ikke vidste hvilken version jeg havde og dels at jeg ikke tænkte på at tage USB-stikket ud og ind og genstarte Pulseview flere gange. Så – hermed viderebragt 🙂



Tiden bliver så samplerate * samples… “Run” knappen sætter det hele i gang. Hvis man ikke gør andet starter sampling med det samme – men man kan også definere triggere. Det gøres ved at clicke på et signal og definere hvilke flanker der skal fungere som triggere.
