CCS C ile neopixel(adreslenebilir ledler) kullanımı (ws2812 protokolü)

Başlatan makine_terbiyecisi, 09 Nisan 2018, 13:28:35

makine_terbiyecisi

Merhaba arkadaşlar,
Neopixel yani adreslenebilir ledler üzerinde bir projem var. Bu konuda nasıl bir yol izleyebilirim.
Datasheet okudum.

Her renk 8-bir olarak kontrol ediliyor. Dolayısıyla bir ledin kontrolü için 24-bit gönderilir.
Protokol kısmına kısmen hakimim. Anlamadığım nokta şu hangi seri haberleşme yöntemi ile yapmalıyım.

İyi çalışmalar.
# ÖĞRENELİM, ÖĞRETELİM #

M.Salim GÜLLÜCE

Datasheet te ayrıntısı war zaten. Tek kablo üzerinden uygulanan FIFO yapısıyla seri bilgi aktarımı..
Önce uzak led bilgisini çıkarsınız en sona en yakın led bilgisini.
Her çıkış bir önceki çıkışı b adım öteye öteler.
Sayfa 3, 4 ve 5 bu bilgileri zaten içeriyor.
https://cdn-shop.adafruit.com/datasheets/WS2812.pdf

makine_terbiyecisi

Yanıtınız için teşekkür ederim.

Dediğinizi biliyorum. Detaylıca inceledim. Bilmiyorum belki de takıldığım nokta çok basit olabilir. Fakat anlamadığım ben 0xA9C bu 24-bitlik veriyi ledlere göndermek istesem nasıl yaparım?

int32 data = 0xA9C;

spi_write(data);     //spi
fprintf(UART, data); //rs-232

Bunları kullanmak doğru olur mu?
Bir diğer nokta bu ledlere gönderilen verinin hızı max. 800kHz olmalı diye datasheetten okumuştum.
Bunu nasıl sağlayabilirim.

İyi çalışmalar.
# ÖĞRENELİM, ÖĞRETELİM #

mehmet

Arduino kodlarını inceleyiniz. Daha
hızlı yol alırsınız.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

fide

Merhaba. Ws2812de kendisi infaruj ledlerin sürülmesine benzeyen bir protokol oluşturmuş. Diyelim ki 1 bit 3mikrosaniyede gönderiliyor. Bu 3 usaniyenin 1mikrosaniyesi lojik 1, 2 mikrosaniyesi lojik 0 okursa durumu 0 kabul ediyor. 2mikrosaniyesi lojik1, 1 mikrosaniye 0 olursa 1 kabul ediyor. Buna göre önce 8biti kodlayacak kütüphaneyi yaz yada arduinodan çevir. Sonra her led için rgb olmak üzere 3byte göndereceksin. Kaç tane rgb ledin varsa o kadar sayıda veri göndreceksin. Veriler arasında belirli milisaniye beklemek ledlerin resetlenip ilk ledin veri almasını sağlıyor. Sanırım takıldığın nokta burası.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

makine_terbiyecisi

Yanıtlarınız için teşekkür ederim.

Ben veriyi hangi haberleşme(spi, uart, i2c, wire, vs.) üzerinden göndereceğimi bilemedim.
Datashette veri işlemi hızı 800kHz yani 1.25us(1/800kHz = 1.25us) değerini aşmamalıdır ifadesi yer alıyor.
Bunun için baud rate değerine dikkat etmem gerekecek. Biliyorum.

Benim takıldığım nokta burası. Hangi haberleşme?

iyi çalışmalar.
# ÖĞRENELİM, ÖĞRETELİM #

M.Salim GÜLLÜCE

Ben kendi görüşümü söylersem "hiçbirisi".
Kendi protokolünü oluştur. Tek kanaldan çıktı oluştur.
SPI UART I²C veya diğerleri çift yönlü protokollerdir.
Sana "saldım çayıra mevlam kayıra" protokolü lazım. :D
Boud Rate timing olayına dikkat etmen gerek sadece.

Akıllı Ledlerle ilgilenmedim hiç.
Ama Sinclair-Spectrum parmaklamışlığımız war.
Kaset çalar üğzerinden gelen sesleri data olarak okuyordu.
Sonuçta tek canlı tel üzerinden data okuma.

makine_terbiyecisi

Yanıtın için teşekkür ederim.

Benimde aklıma ondan başka bir yol gelmiyor. Kendi protokolümü oluşturacağım.
Bu baud-rate için bir önerin var mı?
# ÖĞRENELİM, ÖĞRETELİM #

JOKERAS

İlgili Dataları-Frame'i bitlerine ayırıp 1 için belli genişlikte, 0 için belli genişlikte
bir Porttan seri olarak gönderin.
Şeması,tek yollu haberleşme donanımı olduğunu gösteriyor.
Tek yollu haberleşme Protokollerinde Clock olmaması sizi aldatmasın.
Pixel Led içindeki işlemci-Receiver sizin gönderdiğiniz Bitler'in genişliğinden
gelen datanın ne olduğunu anlayabilir.
Tıpkı IR, RF Protokollerindeki gibi.

makine_terbiyecisi

Alıntı yapılan: JOKERAS - 10 Nisan 2018, 11:40:21İlgili Dataları-Frame'i bitlerine ayırıp 1 için belli genişlikte, 0 için belli genişlikte
bir Porttan seri olarak gönderin.
Şeması,tek yollu haberleşme donanımı olduğunu gösteriyor.
Tek yollu haberleşme Protokollerinde Clock olmaması sizi aldatmasın.
Pixel Led içindeki işlemci-Receiver sizin gönderdiğiniz Bitler'in genişliğinden
gelen datanın ne olduğunu anlayabilir.
Tıpkı IR, RF Protokollerindeki gibi.

Evet öyle oluyor. Benim anlamadığım 24-bit göndereceğim ya. Bu 24-bir nasıl bir frame olacak?

Teşekkürler.
# ÖĞRENELİM, ÖĞRETELİM #

JOKERAS

O sizin keyfinize kalmış bir şey.
Ne göndereceğinizi siz belirleyeceksiniz.
Mesela Gök Kuşağı göndermek için olan Frame'i ya hazır kütüpanesini bulacak,yada kendiniz oluşturacaksınız.
Ne bileyim.

M.Salim GÜLLÜCE

Alıntı yapılan: makine_terbiyecisi - 10 Nisan 2018, 11:36:44Yanıtın için teşekkür ederim.

Benimde aklıma ondan başka bir yol gelmiyor. Kendi protokolümü oluşturacağım.
Bu baud-rate için bir önerin var mı?

Checksum kullanman gerekmeyecek sanırım.
o yüzden datasheet limitlerine uygun frekans üzerinden yola çıkarak baudrate hesabı yapabilirsin.
zaten sıfırlar ve birler birbirinden farklı uzunlukta oldukları için ortalama eşitmiktarda 1 ve 0 olarak düşünerek yapmaya çalış.

M.Salim GÜLLÜCE

Alıntı yapılan: makine_terbiyecisi - 10 Nisan 2018, 11:44:28Evet öyle oluyor. Benim anlamadığım 24-bit göndereceğim ya. Bu 24-bir nasıl bir frame olacak?

Teşekkürler.
Mantık yürüterek renk standartlarında RGB sıralamasıyla 8+8+8=24 bit olacak şekilde datalarını gönderirsen ardışık kaç led için gönderim yapacaksan en sondaki ledi en önce ye sıralayarak dataları gönderirsen problem olmayacaktır sanırım.
birkaç denemeden sonra zaten olaya vakıf olacaksın.
Sonrasında biz senden öğreneceğiz.  ;D

M.Salim GÜLLÜCE

çıkış sırası şöyle 4 led olduğunu varsayarsak...

 Bağlantı tarafı -> led1 + led2 + led3 + led4
gönderilecek bilgi ise
öncelik sırası led4(RGB) +led3(RGB) + led2(RGB) + led1(RGB)
bir ledi açarsak önce R sonra G sonra B gönderilecek.
Led4{R(b=11111110) + G(b=00000001) + B(b=00011110)} olsun
gönderime sıralayacak olursak
led4 R için önce 0 sonra sırasıyla 1111111, toplamda 8 bit
led4 G için önce 1 sonra sırasıyla 0000000, toplamda 8 bit
led4 B için önce 0 sonra sırasıyla 1111000, toplamda 8 bit
toplam 24 bit
yani önce kırmızı küçük değerli bitleri göndereceksin.

makine_terbiyecisi

Alıntı yapılan: Mehmet Salim GÜLLÜCE - 10 Nisan 2018, 12:01:13Mantık yürüterek renk standartlarında RGB sıralamasıyla 8+8+8=24 bit olacak şekilde datalarını gönderirsen ardışık kaç led için gönderim yapacaksan en sondaki ledi en önce ye sıralayarak dataları gönderirsen problem olmayacaktır sanırım.
birkaç denemeden sonra zaten olaya vakıf olacaksın.
Sonrasında biz senden öğreneceğiz.  ;D

Elbette burdaki amacımız o zaten. :D
# ÖĞRENELİM, ÖĞRETELİM #