====== カラー受光&カラー発光 ======
===== 概要 =====
カラー受光してRGBの値を得ること、また、RGBの値を指定してカラー発光させることについては、
* カラー受光→カラーセンサー(S9706)
* カラー発光→フルカラーLED(色設定ユニット)
等で紹介しました。
今回は、これらの受光と発光を組み合わせてみました。
つまり、カラーをRGBの値として受光して、その値から、カラーをRGBの値として発光させて見ました。
===== 動作原理 =====
カラー受光の原理については、カラーセンサー(S9706)を参照してください。
カラー発光の原理については、フルカラーLED(色設定ユニット)を参照してください。
これらを組み合わせるためには、レンジ合わせの工夫が少し要ります。
<レンジ合わせ>
* カラー受光において、カラーセンサー(S9706)で得られる値(V1)は、0~4095です。
* カラー発光において、フルカラーLED(色設定ユニット)で指定できる値(V2)は、0~100です。
* そこで、V1を41で割ることにより、V2のレンジに合わせます。\\ %%100≒4095÷41%%
===== 回路図 =====
LED1は、手持ちの適当なフルカラー発光LEDを使用しました。
{{:imgpaste:202004:htmikan-20200430-113518.png}}
===== ソースコード =====
//**********************************************************************
/*
『カラー→カラー』
*/
//**********************************************************************
#define LED_R PORTA.F0
#define LED_G PORTA.F7
#define LED_B PORTA.F1
#define SW1 PORTB.F0
#define ON 0
#define OFF 1
#define GATE PORTA.F2
#define CK PORTA.F3
#define RANGE PORTA.F4
#define DOUT PORTA.F5
#define RANGE_SW PORTA.F6
//**********************************************************************
void GetColor(short sensitivity, int addTime, int pColor[])
{
static unsigned int RED, GREEN, BLUE, tmp;
static unsigned short cnt;
//
GATE = 0;
CK = 0;
RANGE = sensitivity;
GATE = 1;
for (; addTime > 0; addTime--) {
Delay_ms(1);
}
GATE = 0;
//赤色データの取り込み
RED = 0;
for (cnt = 0; cnt < 12; cnt++) {
CK = 1;
CK = 0;
tmp = DOUT << cnt;
RED |= tmp;
}
pColor[0] = RED;
//緑色データの取り込み
GREEN = 0;
for (cnt = 0; cnt < 12; cnt++) {
CK = 1;
CK = 0;
tmp = DOUT << cnt;
GREEN |= tmp;
}
pColor[1] = GREEN;
//青色データの取り込み
BLUE = 0;
for (cnt = 0; cnt < 12; cnt++) {
CK = 1;
CK = 0;
tmp = DOUT << cnt;
BLUE |= tmp;
}
pColor[2] = BLUE;
}
//**********************************************************************
static unsigned short pwm_cnt, led_R, led_G, led_B;
void interrupt() // 約0.128msec周期
{
static short onFlg, offFlg;
//
INTCON.T0IF = 0;
//
onFlg = (SW1 == 1) ? 0 : 1;
offFlg = (SW1 == 1) ? 1 : 0;
//
LED_R = (pwm_cnt <= led_R) ? onFlg : offFlg;
LED_G = (pwm_cnt <= led_G) ? onFlg : offFlg;
LED_B = (pwm_cnt <= led_B) ? onFlg : offFlg;
//約12.8msec(78Hz)
if (pwm_cnt < 100)
pwm_cnt++;
else
pwm_cnt = 1;
}
//**********************************************************************
void main()
{
static char buf[10];
static unsigned int color[3];
//
OSCCON = 0b01110000; // クロックは8Mhz
CMCON = 0b00000111; // コンパレータは使用しない。
ANSEL = 0b00000000; // A/D変換を使用する。
TRISA = 0b01100000;
TRISB = 0b00000001;
//LCDの初期化
Lcd_Config(&PORTB, 3, 1, 2, 7, 6, 5, 4);
Lcd_Cmd(LCD_CURSOR_OFF);
Lcd_Cmd(LCD_CLEAR);
Lcd_Chr(1, 2, 'R');
Lcd_Chr(1, 6, 'G');
Lcd_Chr(1, 10, 'B');
// TIMER0の設定
INTCON.T0IE = 1;
INTCON.T0IF = 0;
OPTION_REG.T0CS = 0;
OPTION_REG.PSA = 1;
OPTION_REG.PS0 = 0;
OPTION_REG.PS1 = 0;
OPTION_REG.PS2 = 0;
TMR0 = 0;
//
pwm_cnt = 1;
led_R = 50;
led_G = 50;
led_B = 50;
// 割り込みを許可する。
INTCON.PEIE = 1;
INTCON.GIE = 1;
//
while (1) {
//カラーデータの取得
GetColor(RANGE_SW, 100, color);
//
led_R = color[0] / 41;
led_G = color[1] / 41;
led_B = color[2] / 41;
//
ByteToStr(led_R, buf);
Lcd_Out(2, 1, buf);
ByteToStr(led_G, buf);
Lcd_Out(2, 5, buf);
ByteToStr(led_B, buf);
Lcd_Out(2, 9, buf);
}
}//~!
//**********************************************************************
===== 動作確認 =====
{{:imgpaste:202004:htmikan-20200430-113631.png?500}}
左側は、フルカラー発光LED(LED2)と電流制限抵抗です。
右側は、カラーセンサー、PIC、LCDです。
{{:imgpaste:202004:htmikan-20200430-113642.png}}{{:imgpaste:202004:htmikan-20200430-113646.png}}
LED1のR(赤)を、カラーセンサーの上で点灯させてみました。
LED2には、光を拡散させるために、ピンポン玉に穴を開けて被せています。
{{:imgpaste:202004:htmikan-20200430-113652.png}}{{:imgpaste:202004:htmikan-20200430-113657.png}}
LED1のG(緑)を、カラーセンサーの上で点灯させてみました。
{{:imgpaste:202004:htmikan-20200430-113704.png}}{{:imgpaste:202004:htmikan-20200430-113708.png}}
LED1のB(青)を、カラーセンサーの上で点灯させてみました。
{{:imgpaste:202004:htmikan-20200430-113715.png}}{{:imgpaste:202004:htmikan-20200430-113718.png}}
如何でしょう?
今回製作した物は、どんな応用が考えられるでしょうか?
例えば、光リピータ。。。光を直角に曲げる!?
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]