
Chciałbym zaprezentować projekt regulatora PID do ekspresu do kawy. Używany jest z ekspresem La Pavoni Domus Bar, ale w zasadzie może sterować dowolnym ekspresem lub jakimkolwiek obiektem grzewczym/chłodniczym o mocy do ~ 1.5kW.
Motywacją do wykonania urządzenia była spora histereza fabrycznego regulatora dwustawnego (prawie 10°C) i idące za tym problemy z powtarzalnością procesu parzenia.
W skrócie założenia projektowe:
- ograniczenie ingerencji w ekpres do minimum,
- bezpieczeństwo użytkowania,
- wbudowane sterowanie grzałką, bez żadnych zewnętrznych styczników i SSR,
- sterowanie zaworem szybkiego spustu - umożliwienie "pre-infussion",
- sterowania czasem załączenia pompy, możliwość profilowania ciśnienia w przyszłości,
- wbudowany sekundnik do odmierzania czasu ekstrakcji, zegar RTC,
- wizualizacja nastaw i parametrów procesu na wyświetlaczu ciekłokrystalicznym,
- zmiany nastaw z poziomu menu, w czasie rzeczywistym,
- stylistyka zbliżona do stylistyki ekspresu.
Hardware
Sterownik posiada 3 optoizolowane wyjścia AC z załączaniem w zerze, w tym jedno wysokoprądowe do sterowania grzałką, oraz 1 optoizolowane wejście 230V.
Człon pomiarowy oparty jest o układ MAX31855 i obsługuje termoparę typu K. W układzie zintegrowano część analogową z kompensacją zimnego końca oraz 14-bitowy przetwornik ADC z interfejsem SPI. Dodatkowo układ wykrywa przerwanie obwodu termopary oraz doziemienie i zwarcie do VCC, co okazało się dość problematyczne, o czym dalej.
Sercem układu jest mikrokontroler Atmega32A (na schemacie jest 16, ale różnią się w zasadzie tylko ilością pamięci). Główne kryteria przy wyborze to wbudowane SPI i I²C, dużo (względnie

Układ zasilany jest z transformatora 6V, 2VA. 3.3V do układów scalonych brane jest ze stabilizatora LDO, a podświetlenie LCD zasilane jest prosto zza mostka, z dodatkową możliwością kluczowania PWM.
Schemat i PCB zrobione w Eagle (na schemacie jest Atmega16, ale różnią się w zasadzie tylko wielkością pamięci), dwustronne płytki wykonane metodą żelazkową. Z braku dostępu do HotAira, najtrudniejszym elementem do przylutowania było gniazdo wyświetlacza, odlutowane wcześniej z telefonu. Płytka panelu oraz cześć wysokonapięciowa zostały pocynowane pastą do lutowania rur miedzianych ogrzewaną palnikiem, reszta jest polakierowana. Nie obyło się bez pomyłek, stąd zwory na płytce. Zmiany są uwzględnione na schemacie.
Układ RTC DS1307 jak na razie nie jest wykorzystywany, ale część zmiennych można wynieść do RAMu podtrzymywanego bateryjnie.
Obudowa jest zrobiona z polerowanej blachy ze stali nierdzewnej, aby nie odróżniała się znacznie od ekspresu. Połączona jest z przewodem ochronnym/obudową samego ekspresu. Wszystkie przewody (poza TC) między ekspresem a regulatorem są wzięte ze starej płyty kuchennej, mają grubą izolację i są odporne na wysoką temperaturę. Jednym z głównych założen było niezniszczenie ekspresu, więc musiałem przecisnąć się istniejącymi otworami.
Software
Firmware napisany został w C (gcc + avr-libc), większość części kodu jest napisana jako nieblokująca, aczkolwiek ze względu na brak "bufora ramki" odświeżanie zawartości LCD zajmuje chwilę. Wyświetlacz LCD wzięty został z Nokii 5100, oparty jest na driverze PCF8833. Ze względu na to, że ramka ma 9bitów, pierwszy bit wysyłany jest programowo, a kolejne 8 leci już z wbudowanego SPI. Procesor chodzi na 7372800Hz, odświeżanie całego ekranu byłoby dość czasochłonne, więc gdzie tylko się da aktualizacje robione są fragmentami. Parametry procesu (u góry) oraz stan I/O (na dole) odświeżane są co 1s.
Płynność działania zapewnia podzielenie zadań rysowania i minimalizacja ich występowania. Obsługa wyświetlacza, I/O, filtracji i PID zajmuje zawsze sporo mniej niż 1 tick systemowy ~10ms.
Większość pamięci flash zajęły czcionki (8x8 i 8x16). Sporo zjada też obsługa liczb zmiennoprzecinkowych z avr-libc. W tej chwili używane są przy filtracji dolnoprzepustowej, a sam regulator operuje na int16_t, w planie jest przeróbka na stałoprzecinkowe.
Wszystkie ustawienia można zmieniać w wielopoziomowego menu, co widać na filmiku. Ze względu na typ zmiennych, w tej chwili K i Ti są typu całkowitego, co wpływa na zakres nastaw, jednak wystarcza do ustawienia stabilnego regulatora o zadowalających parametrach.
Soft + źródła będzie zamieszczony jak tylko uporam się z kwestiami licencyjnymi - część procedur obsługi LCD znalazłem w necie, ale daleko mu obecnie od wersji pierwotnej.
Wnioski, napotkane problemy
"Wszystkomający" MAX31855 okazał się trochę problematyczny, po podłączeniu uziemionego laptopa układ wykrywa doziemienie termopary, która jest przymocowana do bojlera (goła termopara - dwa zgrzane druty). Ekspres oczywiście też jest uziemiony i obwód się zamyka.
W kolejnej wersji mam zamiar optoizolować układ termopary, chyba że znajdę pasującą termoparę w obudowie z gwintem M4.
Mimo pełnej izolacji galwanicznej od sieci, wyświetlacz czasami potrafi się zawiesić od szpilek podczas wyłączania silnika pompy/młynka. Nie pomogły 2x 0,8mm blachy stalowej , skrócona do 40mm taśma między płytą główną a panelem, rozdzielenie żył sygnałowych masą, zasilanie z zewnątrz ani względnie duże pojemności przed i za stabilizatorami. Sam procesor nadal działa. Zdarza się to losowo raz na ~ 2tyg, restart załatwia sprawę. Cykliczny reset wyświetlacza z poziomu programu powoduje miganie, więc odpada.
Stała czasowa obiektu jest dość spora, a pomiar odbywa się na zewnątrz bojlera. O ile przy braku zakłóceń (parzenia kawy i napływu zimnej wody) regulacja jest na poziomie ±0.75°C wartości zadanej, to w czasie ekstrakcji zanim regulator włączy grzałkę mija kilka sekund. Ponieważ to "zakłócenie" sami świadomie powodujemy w znanym momencie, rozważam dodanie predyktora Smitha albo regulację adaptacyjną PID albo połączenie PID z regulatorem rozmytym.
Zapraszam do zapoznania się z dokumentacją, liczę na ciekawe pomysły które będzie można wdrożyć w wersji 2.0.
Więcej zdjęc, filmik z działania i bardziej szczegółowy opis urządzenia.
Film na vimeo







Cool? Ranking DIY