====== RGBロガー(PIC18F2550) ======
===== 概要 =====
カラーセンサー(S9706)の基本的な動作(RGBのデータを取得し、その値を単純にLCDに表示させる)については、実験室のカラーセンサー(S9706)で確認しました。
今回は、LCDに表示させるのではなく、取得したデータを、SDカードに逐次記録するようにしました。
===== 動作原理 =====
カラーセンサー(S9706)の動作原理については、実験室のカラーセンサー(S9706)を参照してください。
尚、S8706は感度設定が2段階(高感度、低感度)あるので、両感度のRGB値を取得し記録します。
記録速度は、1秒間に約3件分を記録します。
一行に、“H,R1,G1,B1,L,R2,G2,B2"の順番に記録します。
(H=高感度(R1,G1,B1)、L=低感度(R2,G2,B2))
$START
H,1234,1234,1234,L,1234,1234,1234
H,1234,1234,1234,L,1234,1234,1234
H,1234,1234,1234,L,1234,1234,1234
:
:
:
$STOP
===== 回路図 =====
{{:imgpaste:202004:admin-20200430-195241.png}}
===== ソースコード =====
//**********************************************************************
/*
『RGBロガー』
※デジタルカラーセンサ/S9706を使用し、RGBのデータをSDCに記録する。
※記録データは、高感度(RGB)、低感度(RGB)の2種類とする。
<記録例>
H,1234,1234,1234,L,1234,1234,1234
*/
//**********************************************************************
#define SW PORTC.F0
#define LED PORTC.F2
#define CR 0x0d
#define LF 0x0a
#define ON 0
#define OFF 1
#define GATE PORTB.F4
#define CK PORTB.F5
#define RANGE PORTB.F6
#define DOUT PORTB.F7
//**********************************************************************
void GetColor(short sensitivity, int addTime, unsigned 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 = RED;
pColor++;
//緑色データの取り込み
GREEN = 0;
for (cnt = 0; cnt < 12; cnt++) {
CK = 1;
CK = 0;
tmp = DOUT << cnt;
GREEN |= tmp;
}
*pColor = GREEN;
pColor++;
//青色データの取り込み
BLUE = 0;
for (cnt = 0; cnt < 12; cnt++) {
CK = 1;
CK = 0;
tmp = DOUT << cnt;
BLUE |= tmp;
}
*pColor = BLUE;
}
//**********************************************************************
void init_adc()
{
//A/D変換の設定
ADCON1.PCFG3 = 1;
ADCON1.PCFG2 = 0;
ADCON1.PCFG1 = 1;
ADCON1.PCFG0 = 0;
}
//**********************************************************************
void init_sdc()
{
static short cnt;
//SDC(MMC)の初期化
Spi_Init_Advanced(MASTER_OSC_DIV64, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH);
if (Mmc_Fat_Init(&PORTC, 6)) {
while (1) {
LED = ON;
Delay_ms(100);
LED = OFF;
Delay_ms(100);
}
}
Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH);
for (cnt = 0; cnt < 3; cnt++) {
LED = ON;
Delay_ms(300);
LED = OFF;
Delay_ms(300);
}
}
//**********************************************************************
void main()
{
//変数の定義
static char buf[16];
static short mode;
static double ad;
static unsigned int color[3];
//
OSCCON.IRCF2 = 1;
OSCCON.IRCF1 = 1;
OSCCON.IRCF0 = 1;
//ポートの設定
TRISA = 0b01111111;
TRISB = 0b10001111;
TRISC = 0b00000001;
//コンパレータは使用しない。
CMCON = 0b00000111;
//A/D変換の設定
init_adc();
//変数の初期化
LED = OFF;
mode = 0;
//SDC(MMC)の初期化
init_sdc();
//
while (1) {
if ((mode == 0) && (SW == ON)) {
while (SW == ON) {
Delay_ms(100);
}
mode = 1;
LED = ON;
//
Mmc_Fat_Assign("log.txt", 0xA0);
Mmc_Fat_Rewrite();
Mmc_Fat_Write("$START\r\n", 8);
}
//
if ((mode == 1) && (SW == ON)) {
while (SW == ON) {
Delay_ms(100);
}
mode = 0;
LED = OFF;
//
Mmc_Fat_Write("$STOP\r\n", 7);
}
//
if (mode == 1) {
//カラーデータの取得(高感度)
GetColor(1, 100, color);
//赤色データ表示
WordToStr(color[0], buf);
Mmc_Fat_Write("H,", 2);
Mmc_Fat_Write(&buf[1], 4);
//緑データ表示
WordToStr(color[1], buf);
Mmc_Fat_Write(",", 1);
Mmc_Fat_Write(&buf[1], 4);
//青色データ表示
WordToStr(color[2], buf);
Mmc_Fat_Write(",", 1);
Mmc_Fat_Write(&buf[1], 4);
//カラーデータの取得(低感度)
GetColor(0, 100, color);
//赤色データ表示
WordToStr(color[0], buf);
Mmc_Fat_Write(",L,", 3);
Mmc_Fat_Write(&buf[1], 4);
//緑データ表示
WordToStr(color[1], buf);
Mmc_Fat_Write(",", 1);
Mmc_Fat_Write(&buf[1], 4);
//青色データ表示
WordToStr(color[2], buf);
Mmc_Fat_Write(",", 1);
Mmc_Fat_Write(&buf[1], 4);
//
buf[0] = CR;
buf[1] = LF;
Mmc_Fat_Write(buf, 2);
}
}
}
//**********************************************************************
===== 動作確認 =====
単三電池では、少し、電圧が低いのですが、特に問題なく動作しました。
{{:imgpaste:202004:admin-20200430-195348.png?500}}
カラーセンサー(S9706)を、DIP変換基板に実装してからブレッドボードに差し込みます。
{{:imgpaste:202004:admin-20200430-195409.png?500}}
カラーセンサー(S9706)の感度が良過ぎるので、フィルタ(手作り)を取り付けました。
{{:imgpaste:202004:admin-20200430-195421.png?500}}
庭に出て測定してみました。
測定した時は、曇り空で風が吹いていました。(雲の移動が早い状態)
テキストファイル(“log.txt")に記録されたデータです。
{{:imgpaste:202004:admin-20200430-195544.png}}
高感度データ(RGB)と低感度データ(RGB)をExcelでグラフ表示してみました。
{{:imgpaste:202004:admin-20200430-195550.png?500}}
高感度データ(RGB)のみをExcelでグラフ表示してみました。
上側が飽和(サチュレーション(saturation))しています。(最大値は4095で、それ以上では飽和状態です)
{{:imgpaste:202004:admin-20200430-195601.png?500}}
低感度データ(RGB)のみをExcelでグラフ表示してみました。
{{:imgpaste:202004:admin-20200430-195612.png?500}}
このページは稲崎様の閉鎖した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]]