Sterowanie wentylatorem z Digispark

Ten post jest częścią serii o budowie komponentu multimedialnego.

Komponent multimedialny wymaga dodatkowego chłodzenia. W środku jest zasilacz, Raspberry Pi, wzmacniacz audio, pasek LED. Wszystkie te elementy będą generowały ciepło – które trzeba jakoś odprowadzić.

Wykorzystam do tego wentylator umieszczony w tylnym panelu komponentu. Wentylatorem tym będę sterował za pomocą niewielkiego Digispark’a.

Idea jest prosta:

  • Temperaturę będę mierzył czujnikiem MCP9700. Czujnik ten wystawia napięcie zależne od zmierzonej temperatury,
  • Napięcie z MCP9700 wprowadzę na pin analogowy Digispark,
  • W programie dla Digispark przełożę temperaturę na sygnał PWM o odpowiednim stopniu wypełnienia,
  • Sygnał PWM wprowadzę na N-MOSFETa, który będzie uruchamiał wentylator.
  • Będę sprawdzał obroty wentylatora upewniając się, że działa; jeżeli wentylator nie będzie odpowiadał – uruchomię sygnał dźwiękowy powiadamiający o uszkodzeniu.

Zanim zaczniecie – przeczytajcie:

Czujnik MCP9700

Czujnik MCP9700 to bardzo przyjemny  (i tani, ok. 2 zł, w porównaniu do DS18b20, ok. 6 złotych) element pomiarowy. Ma tylko trzy wyprowadzenia:
mcp_9700

  • VDD: zasilanie: 2.3 – 5.5V, pobór prądu: do 12uA,
  • VOUT: wyjście: 100mV – 1.75V,
  • GND: masa.

Napięcie na wyjściu VOUT jest zależne od temperatury:

  • minimalne napięcie to 100mV,
  • 100mV to -40ºC
  • każdy ºC to dodatkowe 10mV na VOUT.
 Temperatura  Napięcie na wyjściu VOUT
 0º  500mV
 35º  500mV + 35*10mV = 850mV
 45  500mV + 45*10mV = 950mV
 55  500mV + 55*10mV = 1.05mV
 60  500mV + 60*10mV = 1.10mV

W niektórych aplikacjach, takie podejście może być znacznie wygodniejsze niż np. skomplikowany protokół, którym komunikuje się DS18b20. Za pomocą Arduino czy Digispark napięcie mierzy się bardzo łatwo. Wystarczy wprowadzić je na jeden z pinów przetwornika ADC (np. A0..A6 UNO) a w kodzie wywołać funkcję „analogRead()”.

Dodatkowo, układ mierzący w ten sposób temperaturę łatwiej jest też testować. Wcale nie musicie podgrzewać czujnika (pomiary temperatury nie są łatwe). Wystarczy na odpowiednie wejście podać… napięcie. Możecie do tego użyć np. zasilacza laboratoryjnego. W przypadku DS18b20 posługującego się protokołem 1-Wire, jest znacznie trudniej. Oczywiście ds18b20 oferuje dodatkowe funkcje (jak alarmy). Cóż – coś za coś.

Więcej o czujniku MCP9700 przeczytacie tutaj: O czujniku MCP9700.

MCP9700 jest średnio stabilny i jego wskazania mogą się wahać. Literatura zaleca dodanie 2 kondensatorów 100nF (jak: tutaj):

Sposób podłączenia termometru MCP9700 (pobrano z startingelectronics.org)

Napięcie na wyjściu czujnika zmierzę za pomocą Digispark’a.

Odczyt temperatury z czujnika

Załóżmy, że czujnik podłączymy do portu P4. Wtedy:

Generowanie sygnału PWM na Digispark

Powiedzmy, że sygnał będziemy generować na porcie P0. Rozszerzymy teraz poprzedni program o dodatkowe procedury:

Zauważcie, że w zależności od temperatury ustawiam różne poziomy stopnia wypełnienia sygnału. Zaczynam od 60%. Wartość ta została wyznaczona doświadczalnie. Poniżej niej wentylator rzęził.

Żeby uchronić się przed nagłymi przełączeniami wprowadziłem dodatkowe opóźnienia:

W ten sposób jakikolwiek by sygnał nie został podany, przez 10 sekund będzie utrzymywany poprzedni.

Wentylator

W praktyce, poza rozmiarami mechanicznymi, interesuje Was jedynie napięcie, jakie wentylator wymaga oraz prąd, jaki pobiera.

Mi akurat dostał się wentylator 12v, który pobiera ok 200mA prądu. Oczywiście wentylator będzie działał z niższym napięciem. W pewnym momencie pojawią się jednak mało przyjemne efekty dźwiękowe – jak buczenie czy piszczenie.

Wentylatory mają zazwyczaj 2 – 4 kabelków:

  • czerwony to zasilanie,
  • czarny to masa,
  • żółty to tacho: pojawiają się na nim 2 impulsy na obrót wentylatora (5v) – w ten sposób można monitorować szybkość z jaką wentylator się obraca,
  • niebieski – który pozwala na sterowanie obrotami wentylatora.

Mój wentylator ma 3 kabelki. Oznacza to, że muszę podać:

  • Czerwony kabel: 12v
  • Czarny: masę
  • Żółty – mogę analizować wyjście z tego pina, żeby upewnić się że wentylator dalej działa poprawnie.

Sterowanie szybkością obrotową takiego wentylatora odbywa się za pomocą PWM. Jego generację omówiłem powyżej. Teraz czas na podłączenie wentylatora do Digisparka. Potrzebny będzie tutaj tranzystor typu N-MOSFET. Wszystko na ten temat znajdziecie na blogu Gammon:

Sterowanie przez MOSFET (pobrane z: blogu Gammon)

Tacho

Ten żółty kabel z wentylatora trochę mnie intrygował, postanowiłem go więc wykorzystać. Pomysł jest prosty: jeżeli wentylator nie zwraca sygnału, to najprawdopodobniej się… popsuł. Koniecznie muszę wtedy uruchomić buzzera, który ostrzeże o niebezpieczeństwie przegrzania komponentu.

Ponieważ sygnał pochodzi z wiatraka, postanowiłem go trochę odseparować za pomocą prostego przedwzmacniacza (pobrane z: tutaj)

Wzmacniacz do tacho (pobrane z khm.de)

Wzmacniacz jest konieczny – wystarczy spojrzeć na przebiegi sygnału na wyjściu tacho (uwaga: 1 kratka to 200mV):

Układ wzmacniacza spisywał się całkiem nieźle przy bliskim maksymalnemu wypełnieniu sygnału sterującego wiatrakiem:

Niestety przy zmniejszaniu się stopnia wypełnienia sygnału sterującego wentylatorem, sygnał z tacho coraz mniej przypominał PWM – a jego wzmocnienie coraz trudniej się mierzyło:

W rezultacie sens miało raczej wykrywanie obrotów niż dok ładne określenie ich częstotliwości; konieczne było wielokrotne próbkowanie:

I buzzer…

Postanowiłem jeszcze dodać buzzer. W założeniu ma bipkać na starcie oraz zawsze, gdy kontroler zada obroty wentylatorowi – a ten nie będzie się obracał

Sprawdźmy piny:

 Pin Wykorzystanie
 P0  Wyjście do tranzystora sterującego wentylatorem
 P1  Buzzer (i dioda na Digispark)
 P2  Wejście tacho
 P3
 P4  Wejście dla czujnika  temperatury
 P5  Lepiej nie używać – stan niski spowoduje reset kontrolera

Pamiętajcie: buzzer może pobierać całkiem spory prąd. Najlepiej podłączać go przez tranzystor. Więcej o buzzerach: Buzzer.

Płytka…

Cały program

Jak to działa?

Źródła

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *