搜索
bottom↓
回复: 308

USB_M8_RGBLED彩灯

  [复制链接]

出0入0汤圆

发表于 2008-1-3 09:30:15 | 显示全部楼层 |阅读模式
用M8控制RGBLED测试了一下,效果不错。并做了一个上位机软件,通过USB控制,现将资料整理上传与君共享!

源码资料包
点击此处下载ourdev_196735.rar(文件大小:1.52M)

原理图(已更正)


PC软件界面


/*********************************************/
46楼的内容现整理到楼主位 --by bozai

上位机源码

点击此处下载ourdev_198432.rar(文件大小:989K)

所用控件
① iocomp.v3.04.SP2.Delphi.BCB

点击此处下载ourdev_198433.rar(文件大小:336K)

② AAFont 平滑特效字体控件包 V2.63

点击此处下载ourdev_198434.rar(文件大小:12.28M)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2008-1-3 09:31:37 | 显示全部楼层
调光效果

出0入0汤圆

 楼主| 发表于 2008-1-3 09:36:03 | 显示全部楼层
为查阅直观,下位机主要控制源码如下:

/******************************************************************************
* rgbCtrl.h
*
* Copyright XiaoCui' Products
*
* DESCRIPTION:
*
* modification history
* --------------------
* 01a, 01jan2008, cuiqingwei written
* --------------------
******************************************************************************/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>

#include "usbdrv.h"

/*
Explanation of the HSV color space:

H: Hue        - 色调(如红,蓝,黄,绿...)
S: Saturation - 饱和度
V: Value      - 亮度

Scaling of the HSV values:
H: [0-255] 0 = red,   42  = yellow, 85 = green, 128 = turquoise, 171 = blue, 214 = purple
S: [0-255] 0 = white, 255 = pure colors
V: [0-255] 0 = off,   255 = maximum brightness

*/

typedef struct {
        unsigned char r;
        unsigned char g;
        unsigned char b;
} RGB;

#define        Ledport         PORTD                // RGB Led Port
#define DDR_Ledport        DDRD
#define R_PIN           5                // R Output
#define G_PIN           6                // G
#define B_PIN           7                // B

/* 函数声名 */
void init(void);
void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v, RGB * out);

/* 全局变量 */

RGB lamp = {0,0,0};

unsigned char type,H,S,V;

//-------------------------------------------------------------------------------
// Init
//-------------------------------------------------------------------------------
void init(void)
{
          PORTD = 0;
        PORTB = 0;                // no pullups on USB and ISP pins
          DDRD = ~(1 << 2);        // all outputs except PD2 = INT0
          DDRB = 0;                   // all USB and ISP pins inputs

        DDR_Ledport = (1<<R_PIN)|(1<<G_PIN)|(1<<B_PIN);

        TCCR0 = 1;
        TIMSK = (1<<TOIE0);        // Overflow Interrupt f/256
       
       
}

uchar usbFunctionSetup(uchar data[8])
{
        usbRequest_t *rq = (void *)data;

    if( rq->bRequest )
        {
                type = 1;
                H = rq->wValue.bytes[0];
                S = rq->wValue.bytes[1];
                V = rq->wValue.bytes[2];
        }
        else
        {
                    type = 0;
                lamp.r = rq->wValue.bytes[0];
                lamp.g = rq->wValue.bytes[1];
                lamp.b = rq->wValue.bytes[2];
        }
          //computeOutputStatus();
    return 0;
}

//-------------------------------------------------------------------------------
// Main
//-------------------------------------------------------------------------------
int main(void)
{       
        cli();
        init();
        usbInit();
           sei();
       
           H = 180;
        S = 255;
        V = 355;
        type = 1;
                       
        for(;;)
        {
                usbPoll();

                if ( type )
                {
                        type = 0;
                        hsv_to_rgb(H,S,V,&lamp);
                }
        }
        return 0;
}

//-------------------------------------------------------------------------------
// Converts HSV to RGB
//-------------------------------------------------------------------------------
void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v, RGB * out)
{
        unsigned char r=0,g=0,b=0, i, f;
        unsigned int p, q, t;

        if( s == 0 ) {       
                r = g = b = v;
        }
        else
        {        i=h/43;
                f=h%43;
                p = (v * (255 - s))/256;
                q = (v * ((10710 - (s * f))/42))/256;
                t = (v * ((10710 - (s * (42 - f)))/42))/256;

                switch( i )
                {        case 0:
                                r = v; g = t; b = p; break;
                        case 1:
                                r = q; g = v; b = p; break;
                        case 2:
                                r = p; g = v; b = t; break;
                        case 3:
                                r = p; g = q; b = v; break;                       
                        case 4:
                                r = t; g = p; b = v; break;                               
                        case 5:
                                 r = v; g = p; b = q; break;
                }
        }
        out->r=r; out->g=g; out->b=b;
}

//-------------------------------------------------------------------------------
// Timer  0 Interrupt, f/256
//-------------------------------------------------------------------------------
SIGNAL (SIG_OVERFLOW0)
{       
        static unsigned char PWM_cnt;
        static unsigned char prescale;


        if(prescale++){                               
                prescale=0;                // Used to halve the PWM frequency
                return;
        }

        if (PWM_cnt <lamp.r)
                Ledport |= (1 << R_PIN);
        else
                Ledport &=~(1 << R_PIN);

        if (PWM_cnt <lamp.g)
                Ledport |= (1 << G_PIN);
        else
                Ledport &=~(1 << G_PIN);

        if (PWM_cnt <lamp.b)
                Ledport |= (1 << B_PIN);
        else
                Ledport &=~(1 << B_PIN);

        PWM_cnt++;
}

/*------------------------------------------------------------------------------
                                0ooo
                       ooo0     (   )
                       (   )     ) /
                        \ (     (_/
                         \_)        By:cuiqingwei [gary]
------------------------------------------------------------------------------*/

出0入0汤圆

 楼主| 发表于 2008-1-3 09:40:04 | 显示全部楼层
调试一角

出0入0汤圆

发表于 2008-1-3 09:53:23 | 显示全部楼层
强帖!

用的模拟USB 是用公版的那个?

出0入0汤圆

 楼主| 发表于 2008-1-3 09:55:39 | 显示全部楼层
呵呵,是的,公版那个.

出0入0汤圆

发表于 2008-1-3 10:30:41 | 显示全部楼层
不错,libusb的好例子

出0入0汤圆

发表于 2008-1-3 10:42:30 | 显示全部楼层
这个好玩。不知RGBLED彩灯那里有卖?多少钱?

出0入0汤圆

发表于 2008-1-3 11:15:01 | 显示全部楼层
不错

出0入0汤圆

发表于 2008-1-3 11:56:47 | 显示全部楼层
不错,帮顶!

出0入0汤圆

发表于 2008-1-3 12:11:56 | 显示全部楼层
很好 很强大

出0入0汤圆

发表于 2008-1-3 12:13:55 | 显示全部楼层
牛啊!

出0入0汤圆

发表于 2008-1-3 12:38:14 | 显示全部楼层
问一下,你们的板子都是怎么弄的啊?做板费也太贵了吧,为了自己玩,不值得吧?

出0入0汤圆

发表于 2008-1-3 12:41:51 | 显示全部楼层
能不能看看你的上位机的源代码啊?压缩包里没有啊!谢谢了先!

出0入0汤圆

 楼主| 发表于 2008-1-3 12:52:56 | 显示全部楼层
板子,自己焊的啊。搞搞好玩,只能自己焊了,

出0入0汤圆

发表于 2008-1-3 13:02:12 | 显示全部楼层
不错

出0入0汤圆

发表于 2008-1-3 15:59:43 | 显示全部楼层
牛B!

期待上位机!

出0入0汤圆

发表于 2008-1-3 16:27:58 | 显示全部楼层
用电脑可以控制电机了...

出0入0汤圆

发表于 2008-1-3 16:52:18 | 显示全部楼层
非常好的创意.

可以设计做一个"粉丝"用的RGB-LED支持牌.

顺便问一下,RGBLED的价格大约是多少?有相关资料吗?

出0入0汤圆

 楼主| 发表于 2008-1-3 17:01:55 | 显示全部楼层
to 马老师:

我是在上海赛格电子买的5个6元。买多了,可能会讲到1元。主要是准备做个东西要用好多RGB,先搞了几个试试。



datasheet如下
点击此处打开ourdev_196972.pdf(文件大小:108K)

出0入0汤圆

发表于 2008-1-3 17:07:22 | 显示全部楼层
谢谢qingwei_cui 阿伟.

出0入0汤圆

 楼主| 发表于 2008-1-3 17:09:48 | 显示全部楼层
RGB_5mm_Package

出0入0汤圆

发表于 2008-1-3 17:23:25 | 显示全部楼层
真漂亮啊···呵呵!
用好点的片子,应该还可以做出更复杂更漂亮的作品吧!
学习ing····

出0入0汤圆

发表于 2008-1-3 17:29:53 | 显示全部楼层
上位机用的是VB吗?

出0入0汤圆

 楼主| 发表于 2008-1-3 17:33:18 | 显示全部楼层
C++Builder

出0入70汤圆

发表于 2008-1-3 17:40:35 | 显示全部楼层
wowo,这个RGB-LED可真是太cool了,我也去买几个来玩玩。
它有多亮呢?

出0入0汤圆

发表于 2008-1-3 18:31:37 | 显示全部楼层
请问在BCB里面那里找到基色调节的滚动条?我没有找到呢!

出0入0汤圆

发表于 2008-1-3 19:12:13 | 显示全部楼层
不錯,鼎....

出0入0汤圆

发表于 2008-1-3 19:36:51 | 显示全部楼层
漂亮

出0入0汤圆

发表于 2008-1-3 20:01:34 | 显示全部楼层
你的LED叫啥名字呀?说英文商家听不懂

出0入0汤圆

发表于 2008-1-3 22:27:32 | 显示全部楼层
很漂亮

出0入0汤圆

发表于 2008-1-3 23:11:32 | 显示全部楼层
楼主作的真漂亮,前年我用3个LED作个样子难看得很。不知道楼主的灯罩用什么东西做的?

出0入0汤圆

发表于 2008-1-3 23:24:57 | 显示全部楼层
不错。刚好昨天在以下网址上也看到一个,使用3W的RGB LED:
http://www.microsyl.com/
“Kitchen Mood Light LED Lightning”




出0入0汤圆

 楼主| 发表于 2008-1-4 09:11:07 | 显示全部楼层
to 27楼 用控件IOCOMP中的Slider

to 32楼 用磨砂玻璃罩会好些,不过我不找到,最后是用女友的香水瓶盖,呵呵,

出0入0汤圆

发表于 2008-1-4 11:27:29 | 显示全部楼层
太好了,真精彩的控件。只是安装时候花我了一段时间,在胡里胡涂中安装好了,我也说不清楚如何安装的,反正安装了几次不成功,最后一次不知道为什么安装成功了。现在,我将他提供在这里,方便人家。谢谢楼主了!
IOCOMP控件:
点击此处下载ourdev_197261.rar(文件大小:12.17M)

出0入0汤圆

发表于 2008-1-4 14:21:37 | 显示全部楼层
楼主很强,势必成为显示方面的强人

出0入0汤圆

发表于 2008-1-4 15:06:37 | 显示全部楼层
小崔 怎么我按照你的电路搭了块板出来 接上usb结果是不能识别该硬件哦 ,同时我在论坛上找了了一些usbasp的驱动也不行 谢谢指导

出0入0汤圆

 楼主| 发表于 2008-1-4 18:04:57 | 显示全部楼层
to 楼上,不好意思,usb口我用的是 PD0 和 PD2  电路是临时拿原来一个图改的。 你在程序中把USB口改一下吧。

出0入0汤圆

发表于 2008-1-4 18:56:45 | 显示全部楼层
不错 顶下

出0入0汤圆

发表于 2008-1-4 21:47:36 | 显示全部楼层
对于这个东西.我还是比较感兴趣LIBUSB这个东西。想把它用于普通的的USB.比如PDIUSBD12的上位机.不知道拿位成功应用过了。
AVRUSB我看上位机只用了控制传输。而没有批量传输。再就是用LIBusb上位机怎么选择端点呢?还是有点不明白。希望搞过的前辈指点一二。

出0入0汤圆

发表于 2008-1-5 00:44:04 | 显示全部楼层
阿伟:

什么牌子,型号的香水?赶紧给我老婆买一瓶去 :-P

出0入10汤圆

发表于 2008-1-5 01:33:17 | 显示全部楼层
有意思,也做个,顶了

出0入0汤圆

 楼主| 发表于 2008-1-7 09:26:20 | 显示全部楼层
重新上传正确的电路图,由于我的个人疏忽导致37楼走了弯路表示歉意!

出0入0汤圆

发表于 2008-1-7 11:03:30 | 显示全部楼层
qingwei_cui 阿伟 :
请问可以把上位机软件上传一下吗?如果能上传,我相信大家都会非常感谢你的!!!我也刚学C++BUILDER6.0,现正在学习上位机软件呢!

出0入0汤圆

 楼主| 发表于 2008-1-7 11:27:19 | 显示全部楼层
应楼上强烈要求,现将Software上传。仅供参考,传播请注明作者及出处,谢谢!

上位机源码

点击此处下载ourdev_198432.rar(文件大小:989K)

所用控件
① iocomp.v3.04.SP2.Delphi.BCB

点击此处下载ourdev_198433.rar(文件大小:336K)

② AAFont 平滑特效字体控件包 V2.63

点击此处下载ourdev_198434.rar(文件大小:12.28M)

出0入0汤圆

 楼主| 发表于 2008-1-7 11:31:59 | 显示全部楼层
控件,都是我用着非常好的。没问题,如果有安装问题,烦请自己解决吧。我喜欢仔细学习别人的东西,更喜欢请教baidu,google.超喜欢上ouravr学习别人的成果。不喜欢没看就问,这也是我在AVR上混了许久而积分确像个初学者的原因。呵呵!

出0入0汤圆

发表于 2008-1-7 11:35:37 | 显示全部楼层
顶楼主,牛人啊!
已帮忙把真确的电路图和46楼的内容整理到楼主位。

上周去苏州赛格也买了10个这种led,不知道一不一样,我的是8mm的,那种透明的,full color,还没试不知道效果怎么样。
我买的只要8毛一个,不知道能不能用。

出0入0汤圆

 楼主| 发表于 2008-1-7 11:35:53 | 显示全部楼层
再传个自动改变色彩的程序:

/******************************************************************************
* rgbAuto.h
*
* Copyright XiaoCui' Products
*
* DESCRIPTION:
*
* modification history
* --------------------
* 01a, 01jan2008, cuiqingwei written
* --------------------
******************************************************************************/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>

/*
Explanation of the HSV color space:

H: Hue        - 色调(如红,蓝,黄,绿...)
S: Saturation - 饱和度
V: Value      - 亮度

Scaling of the HSV values:
H: [0-255] 0 = red,   42  = yellow, 85 = green, 128 = turquoise, 171 = blue, 214 = purple
S: [0-255] 0 = white, 255 = pure colors
V: [0-255] 0 = off,   255 = maximum brightness

*/

typedef struct {
        unsigned char r;
        unsigned char g;
        unsigned char b;
} RGB;

#define Ledport          PORTD                // RGB Led Port
#define DDR_Ledport           DDRD
#define R_PIN           5                        // R Output
#define G_PIN           6                        // G
#define B_PIN           7                        // B

/* 函数声名 */
void init(void);
void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v, RGB * out);

/* 全局变量 */

RGB lamp = {0,0,0};

unsigned char H,S,V,h;

//-------------------------------------------------------------------------------
// Init
//-------------------------------------------------------------------------------
void init(void)
{
          PORTD = 0;
        PORTB = 0;                        // no pullups on USB and ISP pins
          DDRD = ~(1 << 2);        // all outputs except PD2 = INT0
          DDRB = 0;           // all USB and ISP pins inputs

        DDR_Ledport = (1<<R_PIN)|(1<<G_PIN)|(1<<B_PIN);

        TCCR0  = 1;
        TCNT1H = 0xB6;                 // setup
        TCNT1L = 0xC2;
        TCCR1B = 0x03;                 // start Timer
        TIMSK  = (1<<TOIE1)|(1<<TOIE0);        // Overflow Interrupt f/256
}


//-------------------------------------------------------------------------------
// Main
//-------------------------------------------------------------------------------
int main(void)
{       
        cli();
        init();
           sei();
       
           H = 0;
        S = 255;
        V = 255;
                       
        for(;;)
        {
                if ( H != h )
                {
                        hsv_to_rgb(H,S,V,&lamp);
                        h = H;
                }
        }
        return 0;
}

//-------------------------------------------------------------------------------
// Converts HSV to RGB
//-------------------------------------------------------------------------------
void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v, RGB * out)
{
        unsigned char r=0,g=0,b=0, i, f;
        unsigned int p, q, t;

        if( s == 0 ) {       
                r = g = b = v;
        }
        else
        {        i=h/43;
                f=h%43;
                p = (v * (255 - s))/256;
                q = (v * ((10710 - (s * f))/42))/256;
                t = (v * ((10710 - (s * (42 - f)))/42))/256;

                switch( i )
                {        case 0:
                                r = v; g = t; b = p; break;
                        case 1:
                                r = q; g = v; b = p; break;
                        case 2:
                                r = p; g = v; b = t; break;
                        case 3:
                                r = p; g = q; b = v; break;                       
                        case 4:
                                r = t; g = p; b = v; break;                               
                        case 5:
                                 r = v; g = p; b = q; break;
                }
        }
        out->r=r; out->g=g; out->b=b;
}

//-------------------------------------------------------------------------------
// Timer  0 Interrupt, f/256
//-------------------------------------------------------------------------------
SIGNAL (SIG_OVERFLOW0)
{       
        static unsigned char PWM_cnt;
        static unsigned char prescale;


        if(prescale++){                               
                prescale=0;                                // Used to halve the PWM frequency
                return;
        }

        if (PWM_cnt <lamp.r)
                Ledport |= (1 << R_PIN);
        else
                Ledport &=~(1 << R_PIN);

        if (PWM_cnt <lamp.g)
                Ledport |= (1 << G_PIN);
        else
                Ledport &=~(1 << G_PIN);

        if (PWM_cnt <lamp.b)
                Ledport |= (1 << B_PIN);
        else
                Ledport &=~(1 << B_PIN);

        PWM_cnt++;
}

//-------------------------------------------------------------------------------
// Timer  0 Interrupt, 100mSec, f/64
//-------------------------------------------------------------------------------
SIGNAL (SIG_OVERFLOW1)
{
        TCNT1H = 0xB6;        
        TCNT1L = 0xC2;

        H++;
}
/*------------------------------------------------------------------------------
                                0ooo
                       ooo0     (   )
                       (   )     ) /
                        \ (     (_/
                         \_)        By:cuiqingwei [gary]
------------------------------------------------------------------------------*/

出0入0汤圆

 楼主| 发表于 2008-1-7 11:39:55 | 显示全部楼层
谢谢  bozai 章其波 顺便请问:"为什么我过了24小时就不能更改原帖了?是不是级别不够啊!"

出0入0汤圆

发表于 2008-1-7 11:40:00 | 显示全部楼层
不错的学习资料啊
顶一个

出0入0汤圆

发表于 2008-1-7 11:48:11 | 显示全部楼层
to 【50楼】 qingwei_cui 阿伟
    不客气! 24小时修改时间的问题,大家都这样的,只有这个版的版主和站长是可以无限期修改的。

出0入0汤圆

发表于 2008-1-7 14:04:16 | 显示全部楼层
mega8也可以模拟做USB了,厉害!!那个公版在什么地方?ouravr里有吗?

出0入0汤圆

发表于 2008-1-7 14:13:26 | 显示全部楼层
小崔 你好 按照你新的电路图 我重新搭了一个电路 请问我的电脑不能识别硬件 是那部分出现了问题哦 谢谢

出0入0汤圆

发表于 2008-1-7 14:23:09 | 显示全部楼层
楼上的,你在USB的D+ D-上各加一个3.6V的稳压管,楼主的这个电路是很早的图纸了,后来因为发现某些机器因为电平问题无法识别硬件,加了两个36.v的稳压管后就好了。

我现在使用的是最新版图纸,是加了稳压管的,试验了很多台机子了,没有在发现硬件错误的。

出0入0汤圆

发表于 2008-1-9 09:37:53 | 显示全部楼层
真的不错..

出0入0汤圆

发表于 2008-1-9 15:00:54 | 显示全部楼层
版主,我用48的怎么不认识硬件呢?RGB直闪哦

出0入0汤圆

 楼主| 发表于 2008-1-9 17:44:54 | 显示全部楼层
请先用49楼的程序,看一下颜色是不是可以渐变。成功了,再试USB控制的程序。

出0入0汤圆

发表于 2008-1-10 01:23:54 | 显示全部楼层
不是很明白hsv到rgb转换的原理,能否解析一下。

出0入0汤圆

发表于 2008-1-17 16:07:57 | 显示全部楼层
恩  很好!

出0入0汤圆

发表于 2008-1-22 18:44:55 | 显示全部楼层
楼主,上位机源码解压的时候有错误啊!您看看啊!谢谢了!

出0入0汤圆

发表于 2008-1-22 22:00:54 | 显示全部楼层
uchar usbFunctionSetup(uchar data[8])
{
        usbRequest_t *rq = (void *)data;

    if( rq->bRequest )
        {
                type = 1;
                H = rq->wValue.bytes[0];
                S = rq->wValue.bytes[1];
                V = rq->wValue.bytes[2];
        }
        else
        {
            type = 0;
                lamp.r = rq->wValue.bytes[0];
                lamp.g = rq->wValue.bytes[1];
                lamp.b = rq->wValue.bytes[2];
        }
          //computeOutputStatus();
    return 0;
}
我实在看不明白,盼望有人简单的说一下啊!谢谢了

出0入0汤圆

 楼主| 发表于 2008-1-24 10:49:20 | 显示全部楼层
已有兄弟改编了,呵呵!
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=891574&bbs_page_no=3&bbs_id=9999

出0入0汤圆

发表于 2008-2-16 23:50:22 | 显示全部楼层
楼主  我想明白模拟USB驱动那块   能否提供点参考资料?   谢谢!!

出0入0汤圆

发表于 2008-2-17 00:03:33 | 显示全部楼层
LZ:做的漂亮!

出0入0汤圆

发表于 2008-2-17 17:29:31 | 显示全部楼层
楼主真牛,佩服

出0入0汤圆

发表于 2008-6-4 20:17:12 | 显示全部楼层
LZ,能否介绍一下RGB混色方面的知识?我只知道用三组PWM组合控制RGB色彩(调压),但你的上位机竟能调这么多参数。谢谢啦。。

出0入0汤圆

发表于 2008-6-4 20:25:18 | 显示全部楼层
LZ强,学习.

出0入0汤圆

发表于 2008-6-4 20:25:56 | 显示全部楼层
不错~

建议搞成HID方式,这样应该可以免驱动

出0入0汤圆

发表于 2008-6-4 21:41:22 | 显示全部楼层
不知道mark了没有

出0入0汤圆

发表于 2008-6-4 22:00:34 | 显示全部楼层
HSV颜色空间
HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180° 。饱和度S取值从0到1,所以圆锥顶面的半径为1。HSV颜色模型所代表的颜色域是CIE色度图的一个子集,这个模型中饱和度为百分之百的颜色,其纯度一般小于百分之百。在圆锥的顶点(即原点)处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处S=0,V=1,H无定义,代表白色。从该点到原点代表亮度渐暗的灰色,即具有不同灰度的灰色。对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。HSV模型对应于画家配色的方法。画家用改变色浓和色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时加入不同比例的白色,黑色即可获得各种不同的色调。
RGB颜色空间
RGB(red,green,blue)颜色空间最常用的用途就是显示器系统,彩色阴极射线管,彩色光栅图形的显示器都使用R、G、B数值来驱动R、G、B 电子枪发射电子,并分别激发荧光屏上的R、G、B三种颜色的荧光粉发出不同亮度的光线,并通过相加混合产生各种颜色;扫描仪也是通过吸收原稿经反射或透射而发送来的光线中的R、G、B成分,并用它来表示原稿的颜色。RGB色彩空间称为与设备相关的色彩空间,因为不同的扫描仪扫描同一幅图像,会得到不同色彩的图像数据;不同型号的显示器显示同一幅图像,也会有不同的色彩显示结果。显示器和扫描仪使用的RGB空间与CIE 1931 RGB真实三原色表色系统空间是不同的,后者是与设备无关的颜色空间。btw:Photoshop的色彩选取器(Color Picker)。可以显示HSB、RGB、LAB和CMYK 色彩空间的每一种颜色的色彩值。

出0入0汤圆

发表于 2008-6-4 22:04:55 | 显示全部楼层
HSV->RGB和LZ的方法很象了。
RGB颜色空间转换为HSV空间颜色值:

void Rgb2Hsv(float R, float G, float B, float& H, float& S, float&V)
{
     // r,g,b values are from 0 to 1
    // h = [0,360], s = [0,1], v = [0,1]
    // if s == 0, then h = -1 (undefined)

    float min, max, delta,tmp;
    tmp = min(R, G);
    min = min( tmp, B );
    tmp = max( R, G);
    max = max(tmp, B );
    V = max; // v

    delta = max - min;

    if( max != 0 )
      S = delta / max; // s
    else
    {
       // r = g = b = 0 // s = 0, v is undefined
      S = 0;
      H = UNDEFINEDCOLOR;
      return;
    }
    if( R == max )
        H = ( G - B ) / delta; // between yellow & magenta
   else if( G == max )
        H = 2 + ( B - R ) / delta; // between cyan & yellow
   else
        H = 4 + ( R - G ) / delta; // between magenta & cyan

    H *= 60; // degrees
    if( H < 0 )
       H += 360;
}

HSV颜色空间转换为RGB空间颜色值:

void Hsv2Rgb(float H, float S, float V, float &R, float &G, float &B)
{
     int i;
    float f, p, q, t;

    if( S == 0 )
    {
    // achromatic (grey)
        R = G = B = V;
        return;
    }

    H /= 60; // sector 0 to 5
    i = floor( H );
    f = H - i; // factorial part of h
    p = V * ( 1 - S );
    q = V * ( 1 - S * f );
    t = V * ( 1 - S * ( 1 - f ) );

    switch( i )
    {
    case 0:
        R = V;
        G = t;
        B = p;
       break;
    case 1:
       R = q;
       G = V;
       B = p;
       break;
    case 2:
       R = p;
       G = V;
       B = t;
       break;
    case 3:
       R = p;
       G = q;
       B = V;
       break;
    case 4:
       R = t;
       G = p;
       B = V;
       break;
    default: // case 5:
       R = V;
       G = p;
       B = q;
       break;
    }
}

出0入0汤圆

发表于 2008-6-4 22:09:39 | 显示全部楼层
还有个问题想问一下大家:
    我想设计一个RGB灯的色彩会跟随着音乐(比如通过MP3的音频线)的节奏不断变化,有什么好办法提取出音乐信号?(用这个信号去作为一个控制源)请大家赐教。谢谢。

出0入0汤圆

发表于 2008-6-4 23:41:02 | 显示全部楼层
使用麦克风取音乐信号,经过滤波去掉不需要的频率,再接运放得到某个频率的节奏变化,接到单片机引脚

出0入0汤圆

发表于 2008-6-5 00:27:14 | 显示全部楼层
顶!我对颜色算法那部分比较感兴趣,希望楼主能说得更多的,谢谢!

出0入0汤圆

发表于 2008-6-5 00:32:05 | 显示全部楼层
不知楼主有没有熟悉HSI算法?在背投拼接电视墙上用得很多,可惜不太会.
很想了解一下,无限感激!

出0入0汤圆

发表于 2008-6-5 08:34:42 | 显示全部楼层
好东西,记号!

出0入0汤圆

发表于 2008-6-5 09:56:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-6-10 22:43:32 | 显示全部楼层
阿伟你好啊!你在20楼和22楼上贴的led在哪里能买到啊?我正急需啊!!

出0入0汤圆

发表于 2008-6-11 09:28:03 | 显示全部楼层
学习一下!有用的东西比较多!

出0入0汤圆

发表于 2008-6-11 11:24:11 | 显示全部楼层
请问颜色调制,混色之类的知识应该属于哪一门技术啊,有什么专门介绍这个的书吗?

出0入0汤圆

 楼主| 发表于 2008-6-11 11:52:27 | 显示全部楼层
to【79楼】

我从上海赛格电子买的,联系方式如下:

KEDA 朱志强
宜兴市科达电子有限公司上海办事处
地址:上海市北京东路668号赛格电子市场2E37号
电话:53080339
e-Mail:yxkdash@21cn.com

出0入0汤圆

发表于 2008-6-11 11:54:21 | 显示全部楼层
很炫!哈!

出0入0汤圆

发表于 2008-6-12 06:59:53 | 显示全部楼层
好东西!

出0入0汤圆

发表于 2008-6-12 12:44:34 | 显示全部楼层
楼主,请问问您的原理图是用什么软件画的啊?

出0入0汤圆

 楼主| 发表于 2008-6-13 00:58:13 | 显示全部楼层
【85楼】 eagle

出0入0汤圆

发表于 2008-6-20 11:35:57 | 显示全部楼层
棒。。。

出0入0汤圆

发表于 2008-6-20 14:46:20 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-7-10 18:17:19 | 显示全部楼层
北京西四买到了,一块五一个
死活不讲价

出0入0汤圆

发表于 2008-7-11 01:39:13 | 显示全部楼层
恩,很有意思的小制作,有空也研究一下

出0入0汤圆

发表于 2008-7-12 14:07:32 | 显示全部楼层
楼主能不能给小弟讲讲混色原理,最这个很感兴趣。就是看不懂楼主的程序?
还有个问题。M8是自带PWM输出的,并且有三路PWM那为什么还要用软件模拟PWM呢?为什么不直接使用M8自带的PWM?
  求解?

出0入0汤圆

 楼主| 发表于 2008-7-14 11:01:18 | 显示全部楼层
RGB色彩模式:
颜色属性:简单的说就是自然界万物的颜色(你就先这么理解吧)。
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

(原文件名:1.PNG)
独特之处:色彩丰富饱满,但不能进行普通的分色印刷。
混色设定(加法混合):RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好象有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和(两盏灯的亮度嘛!),越混合亮度越高,即加法混合。有色光可被无色光冲淡并变亮。如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光。知道它的混合原理后,在软件中设定颜色就容易理解了。红、绿、蓝三盏灯的叠加情况,中心三色最亮的叠加区为白色,加法混合的特点:越叠加越明亮。红、绿、蓝三个颜色通道每种色各分为255阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色数值相同时为无色彩的灰度色,而三色都为255时为最亮的白色,都为0时为黑色。

(原文件名:2.PNG)
CMYK色彩模式:
颜色属性:简单说就是专门用来印刷的颜色。
它是另一种专门针对印刷业设定的颜色标准,是通过对青(C)、洋红(M)、黄(Y)、黑(K)四个颜色变化以及它们相互之间的叠加来得到各种颜色的,CMYK即是代表青、洋红、黄、黑四种印刷专用的油墨颜色,也是Photoshop软件中四个通道的颜色。
具体到印刷上,是通过控制青、洋红、黄、黑四色油墨在纸张上的相叠印刷来产生色彩的,它的颜色种数少于RGB色。

(原文件名:3.PNG)
独特之处:色彩不如RGB色丰富饱满,在PHOTOSHOP中运行速度会比RGB色慢,而且部分功能将无法使用,由于颜色种数没有RGB色多,当图像由RGB色转为CMYK色后颜色会有部分损失(从CMYK转到RGB则没有损失),但它也是唯一一种能用来进行四色分色印刷的颜色标准。
混色设定(减法混合):CMYK是以对光线的反射原理来设计定的,所以它的混合方式刚好与RGB相反,是"减法混合"——当它们的色彩相互叠合的时候,色彩相混,而亮度却会减低。为什么会这样呢?来看看光线是怎样通过印刷品而进入眼睛的,就会清楚了,(如图:)

(原文件名:4.PNG)
把四种不同的油墨相叠地印在白纸上后,由于油墨是有透明度的,大部分光线第一次会透过油墨射向纸张,而白纸的反光率是较高的,大部分光线经白纸反射后会第二次穿过油墨,然后射向眼睛,此时光线对油墨的透射就产生了色彩效果。
实际上这时我们就好象在看着多个重叠的有色玻璃一般,光线多穿过一层,亮度就降低一些,而颜色也会相互混合一次。
青、洋红、黄三色印墨的叠加情况,中心三色的叠加区为黑色,减法混合的特点:越叠加越暗。
在软件中,青、洋红、黄、黑四个通道颜色每种各按百分率记算,100%时为最深,0%时最浅,而黑色和颜色混合几乎没有太大关系,它的存在大多是为了方便地调节颜色的明暗亮度(而且在印刷中,单黑的使用机会是很多的)。
与加法混合一样,三色数值相同时为无色彩的灰度色.

(原文件名:5.PNG)
注:本文为针对一些初学者能够快速理解,在文字上多用了些口语化的表达,一些专业名词也许会与教科书上有些出入,请以教科书为准。
   因网上系统不能上传CMYK图,所以与CMYK相关的图实际上是用RGB图来替代的,请大家以电脑上的CMYK图的实际色彩为准。

出0入0汤圆

发表于 2008-7-14 11:15:36 | 显示全部楼层
这样单颗就有RGB的LED是会比较难找,可以找那种R,G,B分别显示的,反正你外面还是要加一个雾化效果的外壳来得到均匀光。单独的R,G,B管子好找一些,价格大概是0.3,0.4一颗,20ma的电流驱动。

出0入0汤圆

发表于 2008-7-14 16:25:39 | 显示全部楼层
我搞到一个3W的RGB LED 如果电源功率和散热做好可以做一间屋子的照明灯用了,昨天用他在M8上写了小小的程序,可以输入音乐,颜色跟着音乐变化。
   现在还是做颜色变化的算法。想听听LZ做颜色变化是怎么做的?尤其是提到的 色调(RGB颜色) 色饱和(颜色的深浅) 亮度(整体亮度)。
   昨天还专门和同学讨论了一一些高中时彩色电视机的原理,想从其中找到合适的算法来能想是电视机的那些调整量来随意方便的调整。 提到高中时彩色原理时都快忘完了。汗!。。。。  不过还是找回来点,现在就是在想办法把色饱和做好。
  
   请教楼主:色调  明白-就是对三基色RGB的各个电压的调整,就是色调调整。
             色饱和  就是对三个颜色的色差进行调整  。不过现在还没有想起来如何用程序实现色差的修改(控制)。
             亮度:就是对 三基色RGB整体的亮度调整。这个程序应该简单。
       不知道我上面叙述是否正确?请LZ点评。

出0入0汤圆

发表于 2008-7-14 21:54:07 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-7-16 16:51:53 | 显示全部楼层
95楼的朋友直接看R,G,B三色的加法原理就好了。对于亮度,饱和度,色调的概念,可以看看windows里自带的画图程度-编辑颜色-规定自定义颜色。 玩玩就知道该怎么混色了。还有,对你这种3w的R,G,B,最好是用改变电流的方式来调节亮度(PWM脉宽调制)而不要用改变电压的方式。用电阻限流来控制大功率led不好办的,温度上升后led压降减小,电阻上的电压增大,回路电流加大,led更热,压降更小,形成了一个正反馈。

出0入0汤圆

发表于 2008-7-16 21:20:06 | 显示全部楼层
记号。
好漂亮!

出0入0汤圆

发表于 2008-7-17 11:31:10 | 显示全部楼层
回97楼,我驱动的LED是通过三极管开驱动的,在LED的电路中串联有一个10欧姆电阻,做为限流,也应该是电流控制吧。
也可能是我在楼上说时叙述不正确,

   对于配色,我是基本了解点,我对彩色电视机原理率懂点,关键是写程序不明白该怎么写这些颜色的算法。所以向各位高手前辈请教。

出0入0汤圆

发表于 2009-2-21 20:38:04 | 显示全部楼层
原理图用的是eagle

出0入0汤圆

发表于 2009-2-21 22:08:06 | 显示全部楼层
R,G,B三色的加法可得出不同的颜色,各有256阶,对于亮度,饱和度,色调怎么调节的,能否详细说明

出0入0汤圆

发表于 2009-2-21 23:11:47 | 显示全部楼层
路过
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-22 12:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表