Orange Pi PC Otomatik İşlemci Soğutma Fanı
Tek kart bilgisayar kullanırken, işlemcinin ısınması nadirende olsa gündem de olan bir konudur. Bu yazımızda işlemci ısısına göre açılıp, kapanan bir soğutucu fan devresi oluşturuyoruz. Biz kart olarak Orange Pi PC, imaj olarak ise armbian kullandık, bu yüzden kütüphaneler, kablolama işlemleri sizin kartınıza göre farklılıklar içerebilir. İstediğiniz bir kart modelinde işlem varsa yorumlarda bahsederek bizden isteyebilirsiniz.
Kütüphaneler ve Gerekli Modüller
Kablolama ve devre şemasına geçmeden önce, kurmamız gereken bazı modüller mevcut, bunlar; Python ve WiringOP. Öncelikle kartımızı internete bağlayıp güncelleme işlemleri ile başlayalım. Python opsiyonel olup sizin kararınıza bağlı, eğer armbian imajı kullanıyorsanız zaten kurulu gelecektir.
sudo apt-get update sudo apt-get upgrade reboot sudo apt-get upgrade
Güncellemeleri indirdikten sonra bir kez cihazı tekrar başlatmak daha verimli ve kararlı olacaktır. Tekrar başlatma işleminden sonra “apt-get upgrade” komutu ile indirilen paketleri kurabilirsiniz.
WiringOP Kurulumu
mkdir komutu ile “indirilenler” klasörü oluşturmanıza gerek yok fakat indirmeler vb. işlemler için hazırda bulunması iyi oluyor.
mkdir indirilenler cd indirilenler git clone https://github.com/zhaolei/WiringOP.git -b h3 cd WiringOP/ sudo ./build
WiringOP kurulumu ardından GPIO pinlerini görmek ve test etmek için şu komutları kullanabilirsiniz.
gpio readall
Bu komutun ardından şöyle bir geri dönüş almanız gerekiyor:
+-----+-----+----------+------+---+-Orange Pi+---+---+------+---------+-----+--+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 12 | 8 | SDA.0 | ALT5 | 0 | 3 || 4 | | | 5V | | | | 11 | 9 | SCL.0 | ALT5 | 0 | 5 || 6 | | | 0v | | | | 6 | 7 | GPIO.7 | ALT3 | 0 | 7 || 8 | 0 | ALT3 | TxD3 | 15 | 13 | | | | 0v | | | 9 || 10 | 0 | ALT3 | RxD3 | 16 | 14 | | 1 | 0 | RxD2 | ALT3 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1 | 1 | 110 | | 0 | 2 | TxD2 | ALT3 | 1 | 13 || 14 | | | 0v | | | | 3 | 3 | CTS2 | IN | 1 | 15 || 16 | 0 | ALT3 | GPIO.4 | 4 | 68 | | | | 3.3v | | | 17 || 18 | 0 | ALT3 | GPIO.5 | 5 | 71 | | 64 | 12 | MOSI | ALT4 | 0 | 19 || 20 | | | 0v | | | | 65 | 13 | MISO | ALT4 | 0 | 21 || 22 | 0 | ALT3 | RTS2 | 6 | 2 | | 66 | 14 | SCLK | ALT4 | 0 | 23 || 24 | 0 | ALT4 | CE0 | 10 | 67 | | | | 0v | | | 25 || 26 | 0 | ALT5 | GPIO.11 | 11 | 21 | | 19 | 30 | SDA.1 | ALT5 | 0 | 27 || 28 | 0 | ALT5 | SCL.1 | 31 | 18 | | 7 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | | | 8 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | ALT3 | RTS1 | 26 | 200 | | 9 | 23 | GPIO.23 | IN | 1 | 33 || 34 | | | 0v | | | | 10 | 24 | GPIO.24 | IN | 1 | 35 || 36 | 0 | ALT3 | CTS1 | 27 | 201 | | 20 | 25 | GPIO.25 | ALT5 | 0 | 37 || 38 | 0 | ALT3 | TxD1 | 28 | 198 | | | | 0v | | | 39 || 40 | 0 | ALT3 | RxD1 | 29 | 199 | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+----------+------+---+-Orange Pi+---+------+----------+-----+-----+
Bu tabloda GPIO isimlerini, hangi modda kullanıldığını ve çıkış voltajlarını görebilirsiniz. Aşağıdaki tabloda kart üzerindeki pinleride görebilirsiniz. Yukarıdaki tablo ile eş zamanlı kullanmanızda fayda olucaktır.
İpucu
DC Fanı doğrudan 5V-3.3V çıkışlarına bağlayabilirsiniz fakat kartı kapatsanız bile güç kesilmediği sürece fanlar çalışacaktır, ayrıca korumasız bir şekilde bağlandıysa karta zarar verecektir, bu yüzden GPIO pinlerini kullanmak her zaman sizin için daha avantajlı olacaktır.
Devre Şeması
Öncelikle bahsetmeliyiz ki, herhangi bir motoru kontrolsüz bir şekilde karta bağlamak, kartın bozulma riskini arttıracaktır. Bu korumayı, transistör ve diyotlarla basit bir şekilde sağlayabilirsiniz. Temel olarak bu devreyi kullanacağız, “load” yani yük kısmına DC Fan modülümüzü bağlıyoruz.
Buradaki “2N3904″ transistörü tamamen tercihe bağlıdır, genel kullanım herhangi bir NPN transistör işinizi görecektir. Transistörü tetikleyici olarak kullanıyoruz, bu şekilde GPIO pininden gelen sinyale göre, açma ve kapama işlemi görücek.
Detay 1
Transistörün base bacağına bağlanan direncin sebebi, akım sınırlamak içindir, eğer bipolar transistör kullanmıyorsanız bu direnci kullanmanız gerekmeyebilir. Transistörün “datasheet”ini kontrol etmeniz sizin için daha iyi olacaktır, riske atmak istemiyorsanız bu devrede 1k ohm işinizi görecektir.
Detay 2
Eğer base bacağına zener ya da silikon diyot bağlarsanız, korumayı bir seviye ileri taşımış olursunuz. Transistörün kendi koruması yoksa, DC Fan yavaşladığında ya da durduğunda ters elektromotor kuvvetten dolayı, transistöre zarar verebilir.
İstediğiniz GPIO pinlerini kullanabilirsiniz, biz fiziksel olarak “26”, GPIO olarakta “21” olarak geçen pini kullandık. Tabii bunlar Orange Pi PC için geçerli, kendi kartınıza göre bir pin seçmelisiniz.
Program Kodu
Bash İle Çalışan
İstediğiniz bir klasörde, “nano fan.sh” komutu ile boş bir .sh sayfası oluşturup bu kodu doğrudan içine yapıştırabilirsiniz, sadece GPIO pinlerini ve PATH uzantısını değiştirmeniz gerekmekte.
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/fan.sh gpio mode 21 out gpio write 21 0 TEMP=50000 if [[ $(cat /sys/class/thermal/thermal_zone0/temp) -gt $TEMP ]]; then gpio write 21 1 sleep 1m else gpio write 21 0 fi gpio write 21 0
Oluşturduğunuz bash scriptini çalıştırmak için bulunduğu klasörde ./fan.sh yazarak testlerinizi yapabilirsiniz.
Kodun Detayları
#!/bin/bash
Terminalde .sh scriptlerini çalıştırırken sorun yaşamamak için ilk satıra bu kısmı eklemenizde fayda var. Bazı modellerde ve imajlarda bu kısım sorun çıkarmakta eğer böyle bir durumla karşı karşıya kalırsanız bunu kullanabilirsiniz:
#!/usr/bin/env bash
Bu satırın ardından “PATH” kısmına geliyoruz:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/fan.sh
Son kısımdaki “/root/fan.sh” kısmını kendinize göre değiştirmeniz gerekiyor. Eğer crontab ile otomatik şekilde kullanmayı planlamıyorsanız bu satırı tamamen silebilirsiniz.
gpio mode 21 out gpio write 21 0 TEMP=50000
gpio mode kısmında out ile “21.” pini çıkış olarak ayarladık, “write 21 0” ise “21.” pini LOW yap demek oluyor. Bazen script çalışırken sorunlar olabiliyor ya da yarıda kapanabiliyor böyle durumlarda fanın çalışmaya devam etmemesi için böyle “gpio write 21 0” yazma gereksinimi duyduk.
TEMP değişkeninde ise, kaç derecenin üstündeyken fanın aktifleşeceğine karar veriyoruz. Farkettiyseniz 50000 çok yüksek bir sayı, bunun sebebi bizim kartımızda sıcaklık verisini çektiğimizde gelen veri dönüştürülmemiş bir şekilde tam sayı olarak geliyor örnek verecek olursak, o an ki işlemci sıcaklığı 53 santigrat derece ise, “cat” ile çektiğimiz veri 53000 oluyor, isterseniz bu kısımlarda matematiksel işlemler yaparak her iki kısmıda 1000’e bölebilirsiniz, fakat fazla işlem olmaması için biz böyle kullandık.
if [[ $(cat /sys/class/thermal/thermal_zone0/temp) -gt $TEMP ]]; then gpio write 21 1 sleep 1m else gpio write 21 0 fi gpio write 21 0
If döngüsü kısmında ise, cat ile işlemcimizin sıcaklık verisini çekiyoruz “-gt” yani “greater than” operatörü ile “$TEMP” değişkenine yazdığımız sayı ile işlemci sıcaklığını kıyaslıyoruz, eğer işlemci sıcaklığı $TEMP değişkeninden büyük ise,
“gpio write 21 1” yani 21. pini HIGH yapıyoruz, devamında programı 1 dakika kadar bekletiyoruz. Bu sayede işlemci sıcaklığı yüksek bir oranda düşmüş oluyor.
eğer $TEMP değişkeninden büyük değilse “gpio write 21 0” yani 21. pini LOW yapıyoruz, devamında “fi” ile döngüden çıkıyoruz ve tekrar garanti amaçlı 21. pini LOW yapıyoruz.
İpucu
IF yerine farklı bir döngü kullanabilirsiniz fakat performans olarak işimize en çok yarayan bu oldu.
Crontab ile İşlemleri Otomatiğe Almak
Crontab durumu kurtaracak kadar yeterlidir, fakat aşağıda kod ile beraber revize ettiğimiz systemd ile kontrolü yapmak daha sağlıklı olacaktır.
Bu kısma kadar kod ve kablolama işlemi bitti, şimdi crontab kullanarak bu scripti ve olay döngüsü belli aralıklarla çalıştırma ayarını yapıyoruz, biz zaman değişkeni olarak 1 dakikayı tercih ettik. Kısacası bu program her 1 dakikada çalışacak ve, program içindeki değişkenleri kontrol edecek.
crontab -e
Bu komutun ardından karşınıza şöyle bir çıktı gelecektir, eğer böyle bir çıktı gelmiyorsa size büyük ihtimalle 1-2-3 gibi seçenekler sunacaktır, bunlardan en kolay olan “nano” seçeneği ile devam ederseniz görselde ki çıktı sizede gelecektir.
Crontab listesine oluşturduğunuz .sh scriptinin konumu ve çalışma döngü süresini yazarak işlemleri otomatiğe alabilirsiniz.
*/1 * * * * /root/fan.sh
Buradaki 1, her 1 dakika anlamına gelmektedir.
systemd ile İşlemleri Otomatiğe Almak
Sürekli çalışacak bir betiği crontab üzerinden çalıştırmak mantıklı değildir çünkü crontab belirli aralıklarla çalıştırmak için tasarlanmıştır. Sürekli çalışan bir betik için systemd
servis kullanmak daha uygun olacaktır.
Betiği Hazırlayın
Öncelikle betiğinizi /usr/local/bin/fan_kontrol.sh
gibi bir yola kaydedin ve çalıştırılabilir hale getirin:
sudo cp /path/to/your/script.sh /usr/local/bin/fan_kontrol.sh
sudo chmod +x /usr/local/bin/fan_kontrol.sh
Systemd Servis Dosyasını Oluşturun
Bir systemd servis dosyası oluşturun. Bunu /etc/systemd/system/fan_kontrol.service
dosyasına kaydedin:
sudo nano /etc/systemd/system/fan_kontrol.service
Dosyanın içine aşağıdaki içeriği ekleyin:
[Unit] Description=Fan Control Service After=network.target [Service] ExecStart=/usr/local/bin/fan_kontrol.sh Restart=always User=root [Install] WantedBy=multi-user.target
Servisi Etkinleştirin ve Başlatın
sudo systemctl daemon-reload sudo systemctl enable fan_kontrol.service sudo systemctl start fan_kontrol.service
Servisin Durumunu Kontrol Edin
Servisin durumunu kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
sudo systemctl status fan_kontrol.service
Betik İçeriği
#!/bin/bash # Yol değişkeni PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/fan.sh # GPIO pini ayarla GPIO_PIN=21 TEMP_THRESHOLD=50000 # GPIO pinini çıkış olarak ayarla gpio mode $GPIO_PIN out # GPIO pini sıfırla (fanı kapat) gpio write $GPIO_PIN 0 # Sürekli sıcaklık kontrolü while true; do CURRENT_TEMP=$(cat /sys/class/thermal/thermal_zone0/temp) if [[ $CURRENT_TEMP -gt $TEMP_THRESHOLD ]]; then gpio write $GPIO_PIN 1 # Fanı aç sleep 1m # 1 dakika bekle else gpio write $GPIO_PIN 0 # Fanı kapat fi sleep 5 # 5 saniye bekle ve tekrar kontrol et done
Bu adımları takip ederek fan kontrol betiğinizi sürekli çalışacak şekilde ayarlayabilirsiniz. systemd
servisi sayesinde betiğiniz, sistem her başladığında otomatik olarak çalışacak ve sürekli olarak fanı kontrol edecektir.
Stres Testleri ve Fan Etkileri
Linux kullanan cihazları test etmek için kullanılan “stress” betiği ile, yaptığımız fan uygulamasının etkilerini test edelim.
İki test esnasında da aynı betikler ve uygulamlar çalışmakta, ortam sıcaklığı neredeyse, cihaz konumu ise sabit. İki testte de 1 dakika sürecek, pasif alüminyum soğutma bloğu takılı olucak, aradaki tek fark ise, birinde fan 50C° çalışmaya başlayacak, birinde ise fan asla çalışmayacak.
Ortak Başlangıç Sıcaklığı
Bir Dakikalık Fansız Stres Test Sonucu
Bir Dakikalık 50C°’de Çalışan Fanlı Stres Test Sonucu
50C° Santigrata ulaşıp, çalışmaya başlaması ile 1 dakikada 6C° düşüş sağladı, isterseniz kod içindeki 1 dakika bekle süresini uzatabilirsiniz, biz sürekli ses gelmesini istemediğiniz için, ayrıca karta sürekli yüklenme yapılmadığı için böyle tuttuk.
Son Görüntüler
Biz tek kart bilgisayarımızı şuan bir otomasyon sistemi için kullanmaktayız, o yüzden görüntüleri maalesef masaüstünde çekemedik.
Uyarı
Kasaya bağladığınız fanın üfleme yönünün işlemciye baktığına emin olun. Ek olarak pasif alüminyum soğutucu kullanırsanız daha verimli sonuçlar alırsınız.
Tek Kart Bilgisayarın Kasası
Fan ve GPIO pinleri ile uyumlu kasaları bulmak oldukça zor, hele ki Orange Pi PC gibi yaygın olmayan model tek kart bilgisayarlar için. Bu sebeple kartımızın kasasını kendi 3D yazıcımız ile ürettik, detaylar için iletişime geçebilirsiniz.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.