16F819とRGBセンサーを組み合わせる方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひよたん

16F819とRGBセンサーを組み合わせる方法について

#1

投稿記事 by ひよたん » 5年前

おはようございます。
C言語プログラミングでRGBセンサー(TCS34725 RGB sensor)とPIC16F819を組み合わせたいのですが、
PICとセンサーとの接続は、I2Cを用いて、クロック(SCK)と信号線(SDA)の2本をセンサーとPIC間で接続することぐらいしかわかりません。

PICをマスターモードに設定し、センサーをスレーブに(0x29)スレーブアドレス

i2cから読み取り、LCD(もしくはPUTTYなどPCに)にRGBの数字をprint するにはどうすればいいのでしょうか。
コードの書く工程などを教えていただけると嬉しいです。
ご教示ください!よろしくお願いします。



センサーのdata sheetです↓↓↓
https://cdn-shop.adafruit.com/datasheets/TCS34725.pdf


素人が書こうとした未完成で問題だらけのコードです。。。

コード:

#include<16F819.h>
#device adc=10

#FUSES NOWDT,INTRC_IO //NO WATCHDOG TIMER INTERNAL CLOCK OSCILLATOR NO CLOCKOUT
#FUSES NOPUT,NOMCLR,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOPROTECT

#use delay(clock=8000000)
#use rs232(baud=115200,xmit=PIN_B4,rcv=PIN_A1,STREAM=LCD)
#use i2c(master,sda=PIN_B1,scl=PIN_B4,FORCE_HW)

#define sensor_Write_address (0x29) //0x52?
#define sensor_Read_address (0x2A)   // 0x53? 

void int_Colour_Sensor(sLED){
    
    output_high(sLED);
    delay_ms(50);
    
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x00|0x80);                 //COMMAND BIT (0x80)
    i2c_write(0x13);                 //DATA BIT (STATUS REGISTER 0x13)
    i2c_stop();                      //STOP CONDITION
    
 //+++++++++++++++++++++++++++++++++
    
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x01|0x80);            //COMMAND BIT (ATIME, RGBC time=0x01) 
    i2c_write(0x00);                 //MAX COUNT 65535 (0x00)
    i2c_stop();                      //STOP CONDITION
    
 //+++++++++++++++++++++++++++++++++
    
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x0D|0x80);            //COMMAND BIT (CONFIGURATION REGISTER=0x0D) 
    i2c_write(0x00);                 //ENABLE WLONG (0x00)
    i2c_stop();                      //STOP CONDITION   
    
 //+++++++++++++++++++++++++++++++++
    
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x03|0x80);            //COMMAND BIT (WTIME, WAIT time=0x03) 
    i2c_write(0x00);                 //MAX WAIT TIME (0x00)
    i2c_stop();                      //STOP CONDITION   
       
 //+++++++++++++++++++++++++++++++++
    
    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x0F|0x80);            //COMMAND BIT (CONTROL REGISTER=0x0F) 
    i2c_write(0x00);                 //AGAIN (0x00)
    i2c_stop();                      //STOP CONDITION   
    
    delay_ms(50);
}


void Write_Colour_Sensor(int8 address,int8 data){
    i2c_start();
    i2c_write(sensor_Write_address);
    i2c_write(address);
    i2c_write(data);
    i2c_stop();
    
}

void Read_Colour_Sensor(){
    
    i2c_start();                     //MASTER TO SLAVE 
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x12|0x80);            //ID REGISTER (0x12)
    
    
    i2c_start();                    //START CONDITION
    i2c_write(sensor_Read_address); //READ 
    
 void SetupLCD(){
    
    fputc(control,LCD);   //SET BAUD
    fputc('r',LCD);
    fputc(control,LCD);   //SET 16 CHARACTER WIDTH
    fputc(4,LCD);
    fputc(control,LCD);   //SET  LINE LCD
    fputc(6,LCD);
    
    fputc(control,LCD);   //SET TO BRIGHTEST
    fputc(157,LCD); 
    delay_ms(200);        // ALLOW BRIGHTNESS ADJUST          
    fputc(command.LCD);   //CLEAR DISPLAY
    fputc(1,LCD);
    
    fprintf(LCD,"Display Ready");//PRINT MESSAGE
    delay_ms(5000);       //WAIT 5 SECONDS
    fputc(command,LCD);   //CLEAR DISPLAY
    fputc(1,LCD);
    
} 



アバター
あたっしゅ
記事: 664
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: 16F819とRGBセンサーを組み合わせる方法について

#2

投稿記事 by あたっしゅ » 5年前

Rapsberry Pi, Arduino, Micro Bit は、いじったことあるけど、PIC は、ちょっと(Arduino は、オフ会に、何度か行ったことがある)。いじってみたいという気持ちはあるが、時間が無限にあるわけではないので...
「PIC マイコン 相談室」で検索したが、YAHOO 知恵袋がヒットした。
PIC な人たちは、どこに集まっているのかな ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

Math

Re: 16F819とRGBセンサーを組み合わせる方法について

#3

投稿記事 by Math » 5年前

こういうことはマイクロチップのフォーラムに聞いた方がいいでしょうね。
https://www.microchip.com/forums/f183.aspx

昔は秋月電子には毎週通っていてワンボード・マイコンもたくさん作っていましたよ。(^^;


アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 16F819とRGBセンサーを組み合わせる方法について

#5

投稿記事 by みけCAT » 5年前

まずは現状のコードの問題点を修正しましょう。

まず、このセンサーのアドレスは「8bit」ではなく「7bit+R/Wビット」なので、
センサーのアドレス0x29にRead(1)/Write(0)を加えて、
Writeは0x52、Readは0x53です。
0x29と0x2Aでは2ビット異なってしまい、おかしいと考えられるでしょう。

次に、

コード:

    i2c_start();                     //START CONDITION
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x00|0x80);                 //COMMAND BIT (0x80)
    i2c_write(0x13);                 //DATA BIT (STATUS REGISTER 0x13)
    i2c_stop();                      //STOP CONDITION
という部分のコメントが不適切です。
0x00はSTATUSではなくENABLEであり、0x13はSTATUSレジスタに書き込む値です。
(この下に並んでいる他のレジスタに書き込む部分のコメントでは、正しい名前が書かれているようです)
0x13はAIEN、AEN、PONをオンにする値であり、間違ってはいないでしょう。
ただ、下の部分に「ENABLE WLONG (0x00)」とありますが、
自分の解釈ではWLONGを有効にするには0x02にするべきだと思います。

さらに、Read_Colour_Sensor関数が途中で途切れているようです。
C言語で関数の中にネストして関数を定義するのはGCC拡張なので、
次の関数(SetupLCD関数)の定義を開始する前に
Read_Colour_Sensor関数の本体のブロックを閉じるべきでしょう。

-----------------------------------------------------------------------

次に、RGBの数値を読み取る部分を作りましょう。
連続で読み込むモードを利用して、例えばこのような感じになると思います。
(コンパイル・テストはしていないので、間違っているかも知れません)

コード:

void Read_RGB(unsigned int* r, unsigned int* g, unsigned int* b){
    unsigned int tmp;
    
    i2c_start();                     //MASTER TO SLAVE 
    i2c_write(sensor_Write_address); //SLAVE ADDRESS (0x29)
    i2c_write(0x16|0x20|0x80);       //RDATAL REGISTER (0x16),AUTO INCREMENT
    
    
    i2c_start();                    //START CONDITION
    i2c_write(sensor_Read_address); //READ
    
    tmp = i2c_read();               //RDATAL REGISTER
    *r = (tmp<<8)|i2c_read();       //RDATAH REGISTER
    
    tmp = i2c_read();               //GDATAL REGISTER
    *g = (tmp<<8)|i2c_read();       //GDATAH REGISTER
    
    tmp = i2c_read();               //BDATAL REGISTER
    *b = (tmp<<8)|i2c_read();       //BDATAH REGISTER
    
    i2c_stop();                     //STOP CONDITION
}
-----------------------------------------------------------------------

そうしたら、読み取った数値を数字としてprintする部分を作りましょう。
fprintf関数で%uなどの書式を使うことで、printできると予想できます。
LCDのカーソルを移動するコマンドなども必要かもしれません。

「RGBセンサーから値を読み取る→読み取った値をprintする→適当な時間待つ」
をループで回すようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ひよたん

Re: 16F819とRGBセンサーを組み合わせる方法について

#6

投稿記事 by ひよたん » 5年前

みなさん、返信遅れて申し訳ありません。
I2C の前にADCでどのような数値をセンサーが出しているのか無駄に近い実験をずっとしてました。
皆さんの専門知識に基づいたアドバイスとてもありがたいです。

みなさん本当にありがとうございました。
できる限り自分の力で完成したいとおもいますが、またわからないことがあればご教示お願い致します。
ではよい週末を!

ひよたん

Re: 16F819とRGBセンサーを組み合わせる方法について

#7

投稿記事 by ひよたん » 5年前

みなさん、返信遅れて申し訳ありません。
I2C の前にADCでどのような数値をセンサーが出しているのか無駄に近い実験をずっとしてました。
皆さんの専門知識に基づいたアドバイスとてもありがたいです。

みなさん本当にありがとうございました。
できる限り自分の力で完成したいとおもいますが、またわからないことがあればご教示お願い致します。
ではよい週末を!

返信

“C言語何でも質問掲示板” へ戻る