Francesco Truzzi tarafından
Hazırlıklı olun, Noel geliyor.
En son Noel’in sihirli atmosferini hissetmemin üzerinden bir süre geçti, ama bu yıl onu oldukça farklı bir şekilde kutlamak istiyorum.
IoT çağında, elimdeki tüm Arduinoları kullanarak internetle kontrol edilebilen bazı ışıklar inşa ediyorum.
Temel nokta, analog LED şeritleri, 3/10W RGB LED’ler (özel sürücüm işe yarayabilir!) ve WS2812B adreslenebilir şeritler gibi farklı ışık kaynaklarına bağlanabilen farklı “ışık istemcileri” olacağıdır (tabii ki zamanında gelirlerse).
Bu cihazların her biri TCP üzerinden komut alabilir. Bu, herhangi bir internet bağlantılı cihazdan kontrol edilebilecekleri anlamına geliyor. Hangi ışık istemcisine bağlanılacağını seçebileceğim bazı analog kontrollerin olacağı bir “kontrol kutusu” inşa ediyorum ve kullanıcı girişi (çubuklar ve potansiyometreler, heyecan verici!) aracılığıyla kontrol edebileceğim bir web arayüzü de barındıracak.
Mevcut aydınlatma modları şunlar olacak: manuel mod, solma modu (tek renk veya bir renkten diğerine), rastgele mod, strobe modu. Eğer zamanım olursa bazı foto/ses sensörleri eklemeyi düşünebilirim.
İşte tüm projenin kötü bir taslağı, orijinal olarak element14 forumları için çizildi:

Şimdi projem hakkında biraz daha derinlemesine gireceğim, böylece her şeyi daha iyi açıklayabilirim.
Donanım ve bileşenler
1. Arduino Yùn

Bugün başka büyük bir haber geliyor. element14 tarafından yıllık Noel DIY yarışması için 20 yarışmacıdan biri olarak seçildim. Bana bir Arduino Yùn (mmm, ağzım sulandı bile), bir Arduino Uno ve bir Infineon RGB kalkanı sağlayacaklar. Aslında tüm bu malzemeler dün geldi – bu yazıyı birkaç gün önce yazmaya başladım.
Buradaki büyük oyuncu kesinlikle Yùn. Oldukça kapsamlı bir şekilde hacklenebilen bir Linux tarafı var (Python? Javascript?) ve gerçek bir Atmega/Arduino tarafıyla birlikte internet bağlantısı sağlıyor. Tabii ki, ikisi Bridge kütüphanesini kullanarak seri bağlantı üzerinden iletişim kurabilir.
Yùn, daha önce rPi üzerinde kısmen kodladığım WebUI’yi barındıracak ve eğer Atmega yeterli belleğe ve güce sahipse, daha önce bahsettiğim kontrol kutusunun kalbi de olacak.
2. SeeedStudio’nun LinkIt ONE’ı

Bazılarınızın bildiği gibi, yakın zamanda SeeedStudio’dan bir LinkIt ONE aldım ve onunla oldukça fazla oynuyorum.
Oldukça güzel bir kart: nispeten düşük bir fiyatla çok fazla bellek, işlem gücü ve bağlantı seçeneği sunuyor. Ancak, Linux/Mac uyumluluğu (tabii ki SDK’dan bahsediyorum) ve az sayıda PWM çıkışı ve analog girişi gibi bazı tuhaflıkları var.
Ancak, Wi-Fi API’si iyi yapılmış ve kablosuz ağa bağlanmak oldukça kolay. Arduino UNO + ESP8266 modülleri ile karşılaştırıldığında, gece ve gündüz gibi.
Bu yüzden LinkIt projemdeki istemcilerden biri olacak. Muhtemelen bazı RGB şeritlere bağlayacağım çünkü Seeed’deki arkadaşlar bana iyi bir I2C LED şerit sürücüsü sağladılar ve bu iyi çalışıyor gibi görünüyor.
3. Arduino Uno

Her zaman kullanılan Arduino Uno, projemin istemcilerinden biri olacak.
Mümkünse, WS2812 şeritlerine (güzel bir Noel ağacı yapabilir, ama İtalyan postası çok yavaş, bu yüzden Şubat’ta gelirler diye korkuyorum) veya RGB şeritlere bağlanacak.
Wi-Fi bağlantısı için bir ESP8266 kullanacak. Bu küçük modüller oldukça popüler hale geliyor ve çekirdeklerine kadar hacklenebiliyor. Aslında, sadece ESP8266 kullanarak projemi geliştirebilirdim (güzel bir MCU’ya sahip ve topluluk desteği artıyor) ama zaman çizelgesi burada oldukça sıkı.
Ayrıca…
4. Infineon RGB Aydınlatma kalkanı

element14’teki nazik insanların bir başka kartı, analog RGB şeritleri kontrol eden bir Arduino kalkanıdır.
XMC1202 mikrodenetleyici ile güçlendirilmiştir ve 700mA akım (1A’lık bir zirve ile!), geniş (12-48V) giriş voltajı, parlaklık renk kontrolü ve I2C arayüzü gibi oldukça güzel özelliklere sahiptir.
Henüz test etmedim ama analog şeritler için ihtiyaç duyacağınız tüm özelliklere sahip gibi görünüyor.
5. Arduino Nano
Bunu dün yaktım. Gitti. Öldü, yok oldu, kaputt. En iyi arkadaşlarımdan biriydi ama gerçekten dikkat etmedim ve dağınık masam yüzünden kötü bir şekilde kısa devre yaptım (hayır, bu diyot ya da regülatör değil). Neyse ki, bir klondu ve 3€’dan fazla bir maliyeti yoktu.
5. Kontrol cihazı

Bunu bir ahşap kutuya koymayı umuyorum, ama şu anda durum böyle. Renk seçimi için üç potansiyometre, bir “giriş” butonu olan 2 eksenli bir joystick, bir “geri” butonu (solda gördüğünüz dokunsal anahtar) ve satın aldığım sitede çok daha büyük görünen bir I2C ekran var. Ne yazık ki, sadece 0.96″: Neyse ki 128×64 piksel ve harika kütüphaneler mevcut.
Bu şey Yùn’a bağlı ve geliştirme aşamasında. Lütfen kalan jumperları görmezden gelin (not: onları kendim AWG22 tel kullanarak yapmaya başladım, ekmek tahtalarım çok daha temiz!)
Yazılım
1. Web Arayüzü
Bu daha çok bir kavram kanıtı ve hala yapılacak çok iş var. Python (arka uç olarak CherryPy) ve Javascript ile yazılmıştır ve Yùn’un linux tarafında barındırılmaktadır. Herhangi bir ışığa bağlanabilir, böylece istediğiniz gibi kontrol edebilirsiniz.

Oldukça temel ve daha fazla özellik eklemeyi planlıyorum. Ayrıca, Javascript ile ilk deneyimim. Sağ üstte, bağlanmak istediğiniz istemciyi seçmek için kullanabileceğiniz bir buton var: bağlantı başarılıysa yeşil, aksi takdirde kırmızıya döner.
Renk seçiciyi Google’da buldum ve biraz değiştirdim: ne yazık ki, kimin yaptığını hatırlamıyorum çünkü birkaç hafta önceydi.
Web Arayüzü, Arduinolara okunacak şekilde aşağıdaki formda komutlar gönderiyor: MODE,R,G,B$. Örneğin, turuncu rengi ayarlamak istiyorsanız, komut “M,255,128,0$”, ‘$’ sonlandırıcı karakterdir. Burada bir örnek.

‘F’ solma anlamına gelir ve sonraki sayılar her rengin başlangıç ve bitiş değerleridir. Sonuncusu, bu durumda ‘5’, her solma adımı arasındaki gecikmedir (milisaniye cinsinden).
‘S’ strobe modudur ve ‘100’ her renk değişimi arasındaki gecikmedir (milisaniye cinsinden).
Gördüğünüz gibi, kod şu anda her gönderilen komut için yeni bir bağlantı açıyor. Bu oldukça kötü bir uygulama, bu yüzden bunu düzeltmem gerekecek.
2. Python sunucusu ve script (+ Arduino iletişimi).
Bunlar Yùn’un Linux tarafında çalışıyor ve Arduino şemasındaki setup() fonksiyonu tarafından çağrılıyor ve başlatılıyor. Arduino’dan Linux komutları çalıştırmak için kullanılabilecek Bridge ve Process sınıflarından yararlı bir komut seti var.
Bu durumda, runShellCommandAsynchronously() kullanarak engellemeyen bir Python süreci başlatıyorum (yani Arduino şeması çalışmaya devam ediyor, tamamlanmasını beklemeden).
WebUI uygulamasını ve çeşitli istemcilere bağlanan ve gerekli dizgileri gönderen scripti çalıştırmak için iki kez çağırıyorum.
İşte çeşitli istemcilere komut gönderen dosyanın önizlemesi (yine, bunu yeni yazdım ve optimize etmem gerekiyor). Arduino’dan alınan dizgiyi yalnızca önceki dizgiden farklıysa gönderiyor.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import socket
import string
import sys
sys.path.insert(0, ‘/usr/lib/python2.7/bridge/’)
from bridgeclient import BridgeClient
def send(host, port, command):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if(sock.connect_ex((host, port)) == 0): #bağlantı başarılıysa
print (“Bağlandı %s:%d”) % (host, port)
print (“Komut gönderiliyor %s”) % command
sock.send(command) #stringi gönder
sock.close() #ve soketi kapat
return 0
else:
print (“Bağlantı başarısız :(“)
return 1
bridge = BridgeClient()
last_command = “0”
while 1:
if(bridge.get(“status”) != “0”): #güncelleme gerekip gerekmediğini kontrol et
IP = bridge.get(“IP”) #IP’yi al
port = int(bridge.get(“port”)) #portu al ve tam sayıya çevir
command = bridge.get(“data”) #göndermemiz gereken stringi al
if(command != last_command): #eğer önceki komuttan farklıysa…
if(send(IP, port, command) == 0): #…gönder ve sonucu kontrol et
last_command = command #gönderdiğimiz string son gönderilen olur
bridge.put(“response”, “0”)
else:
bridge.put(“response”, “1”)
|
İşte böyle çalışıyor: Arduino sketch’inde Bridge.put(“destination”, “value”) fonksiyonunu çağırdığınızda, değerinizi “destination” değişkenine koyar. Bu değer, bir BridgeClient nesnesi tanımladıktan sonra Python script’inden bridge.get(“destination”) komutunu kullanarak alınabilir.
Tamamlanana kadar daha fazla kod göstermiyorum, ama her şey açık kaynak olacak. Bir video da geliyor!
Bizi izlemeye devam edin!
