RGB led renk ayarı nasıl?

Başlatan Maxim, 16 Kasım 2015, 18:26:04

Maxim

bir rgb led düşünün
ben bunun rengini 1 adet trimpot ile ayarlamak istiyorum
işte en soldan en sağa kadar genel olarak tüm renkleri görmem lazım beyaz da dahil.

devre, işlemci, 3 adet pwm kanalı falan hepsini yaptık diyelim.
benim asıl merak ettiğim, bu pwm kanal çıkışlarına neye göre ayar yapıcaz?
hangi pwm kanalına %kaç duty ile çıkış almalıyımki renkler trimpota göre değişsin.

microchipin bir rgb led kumanda devre ve kodu vardı tam hatırlayamıyorum
program sırayla bütün ledleri tarıyor ve tekrar baştan başlıyordu
işte bana onun manuel olanı lazım (duty değerleri lazım diyelim)

OG

Hocam önce şunun gibi bir sequence diyagram çıkaracaksınız.



Sonra bölümleme sayınıza göre pot ADC taksimatlandırmasını yapacaksınız.

Mesela 10 bölüm var ise 1023/10=123
Trimpot ile ölçülen her 123 deger bir bölüm için kendini gösterir.

0 -123 arası 1. bölümdesiniz
124 - 226 arası 2. bölümdesiniz
227 - 369 arası 3. bölümdesiniz 

gibi.
Daha sonra bulunduğun bölgeye göre net degeri elde ederiz
Örneğin 145 değeri okuduk ve 2. bölgedeyiz.
2. bölgede 0 degerim 124
145-124 = 21
21 x 10 = 210 ( 10bit pwm üzerinden 210/1023)
210 a göre ne yapmam gerekiyorsa o ledleri o kadar sürerim.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

MC_Skywalker

#2
Her renk kanalı 8 bit olarak kullanır. eher hangi bir görüntü işleme programnına baktığınızda her kanal 0 ile 255 arasında değer alır.


RGB sırlamalasını düşünürsenk her üç renk %100 duty aladığında Beyaz rengi verdiğini toplamsal renk sistemdinden dolayı biliyoruz. daha detaylı renk sistemlerinde renkler Kelvin cinsinde sıcaklıklarıyla tanımlanır





Maxim

hımm anladım biraz ve yazdıklarınızdan sonra bende araştırma yaptım
işin içine renklerin verdiği ışık kuvvetide giriyor galiba yani renk tonunun etkisi gibi birşey
kırmızı maviye göre daha parlak gelir ya gözümüze sanırım o

sonra baktım bir sürü hesab kitap çıktı karşıma

(R, G or B Mixing value/Sum of RGB mixing value) × Target intensity :
Red = (4.1/15.7) × 1.25 = 0.3264cd
Green = (10.6/15.7) × 1.25 = 0.84395 cd
Blue = (1.0/15.7) × 1.25 = 0.0796 cd

http://www.ledsmagazine.com/articles/print/volume-10/issue-6/features/understand-rgb-led-mixing-ratios-to-realize-optimal-color-in-signs-and-displays-magazine.html

http://ww1.microchip.com/downloads/en/AppNotes/00001562A.pdf

bu iş için kolay bir program vardır mutlaka

cerdemir

Belirli bir duty ye kadar hiç ışık vermeyebilirler. Bunu da değerlendirmek lazım.
-- cemal

mehmet

Hocam "hue to rgb" olarak araştırınız.
Bu örnek olabilir.
http://forum.arduino.cc/index.php?topic=8320.0
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

tekosis

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

garezza

Deneme amaçlı RGB şerit led için ufak bir kod yazmıştım. Belki faydası olur. Comporttan gelen veriye göre R,G,B oranı değişiyor ve bu şekilde 256*256*256 farklı renk elde edilebiliyor. Ancak sıkıntıları var. Veri geldiği an kırpışma oluyor yani kablosuz uygulamada kullanmak imkansız. Bunun dışında gün ışığı soğuk beyaz sıcak beyaz gibi özel beyazlar üretmek istediğimde alamadığımı gördüm bu kullandığım şerit ledden kaynaklıda olabilir. Neyse sonuçta deneme amaçlı basit bir uygulama umarım faydası olur.
#include <18F452.h>

#use delay(crystal=20000000)
#use FIXED_IO( A_outputs=PIN_A1,PIN_A0 )
#use FIXED_IO( E_outputs=PIN_E2 )
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1,errors)
unsigned int16 r = 0 , g = 0 , b = 0 , time = 0;
#define Blue PIN_A0
#define Red PIN_A1
#define Green PIN_E2



#INT_RDA
void  RDA_isr(void) 
{

disable_interrupts(INT_RDA);
disable_interrupts(GLOBAL);
if(fgetc(PORT1)==101)
 {
  if(fgetc(PORT1)==102)
  {
  r = fgetc(PORT1);
  g = fgetc(PORT1);
  b = fgetc(PORT1);
  }}
  r  = r*2;
  g  = g*2;
  b  = b*2;

}

void main()
{
 
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   r = 0;
   g = 0;
   b = 0;

   while(TRUE)
   {
    enable_interrupts(INT_RDA);
    enable_interrupts(GLOBAL);
    time++;
   if(time >= 511)
   time = 1 ;
   
   if(time <= b) output_high(Blue);
   else if(time >= b) output_low(Blue);
   
   if(time <= g) output_high(Green);
   else if(time >= g) output_low(Green);
   
   if(time <= r) output_high(Red);
   else if(time >= r) output_low(Red);
   
   }

}


Not: Kodların yanında açıklama yok bunun için özür dilerim ilk fırsatta eklemeye çalışacağım.