ラズパイマガジン2020年夏号のカラーセンサ 1

ラズパイマガジン2020年夏号の配線なしで動かす工作入門だが
カラーセンサーについてなんの説明もないし、型番もデータシートも何もない

読者サイトからソースを落として、動いた動いたで終わりのつもりなのでしょうね

ビットトレードワンZC-CLS381RGB

多分、このセンサーだと思うけどメーカーは不明、データシートも存在しない
なんの勉強にもならん

写真の配列だと5V GND SCL SDA GP23 GP19 3.3V

一応ソースから解析してみると
その前にpigpiodを起動しておく必要がある。

sudo systemctl enable pigpiod
sudo systemctl start pigpiod
これはgpioアクセス用のライブラリ
詳しくはhttp://abyz.me.uk/rpi/pigpio/python.htmlを参照

なお次回からpigpioは自動起動されるのでうざい場合は
sudo systemctl disable pigpiod
で終了

sudo systemctl enable pigpiod
sudo systemctl start pigpiod
sudo systemctl disable pigpiod



サンプルプログラムを見ると
I2cの使用アドレスとチャネルをオープン
次の40000がわからんけど多分感度補正か?

待機

CLS381_ADDR = 0x53

pi = pigpio.pi()
I2C_CH = 1

color_sensor = cls381( pi, I2C_CH, CLS381_ADDR )
class cls381:
    AMBIENT_MODE = 0x02
    COLOR_MODE = 0x06
    def __init__( self, pi, ch, addr ):
        self.pi = pi
        self.ch = ch
        self.addr = addr
        self.i2c = self.pi.i2c_open( self.ch, self.addr )

        self.norma_red   = 40000
        self.norma_green = 60000
        self.norma_blue  = 40000
        self.bright = 1
        time.sleep(1)

モードをセット
0x00のレジスタにカラーモード0x06をセット

color_sensor.set_mode( color_sensor.COLOR_MODE )

class cls381:
    def set_mode( self, mode ):
        if ( mode == self.COLOR_MODE ):
            self.pi.i2c_write_byte_data( self.i2c, 0x00, self.COLOR_MODE )
        else:
            self.pi.i2c_write_byte_data( self.i2c, 0x00, self.AMBIENT_MODE )

データの読み込み
0x0dから3バイト 以下 0x10 0x13 0x0a
下位1バイト目を16ビットシフト + 中位1バイトを8ビットシフト +上位1バイトをセット 

( red, green, blue, ir ) = color_sensor.get_color()
class cls381:
    def get_color( self ):
        ( count, value )= self.pi.i2c_read_i2c_block_data( self.i2c, 0x0d, 3 )
        green = ( value[ 2 ] << 16 ) + ( value[ 1 ] << 8 ) + value[ 0 ]

        ( count, value )= self.pi.i2c_read_i2c_block_data( self.i2c, 0x10, 3 )
        red = ( value[ 2 ] << 16 ) + ( value[ 1 ] << 8 ) + value[ 0 ]

        ( count, value )= self.pi.i2c_read_i2c_block_data( self.i2c, 0x13, 3 )
        blue = ( value[ 2 ] << 16 ) + ( value[ 1 ] << 8 ) + value[ 0 ]

        ( count, value )= self.pi.i2c_read_i2c_block_data( self.i2c, 0x0a, 3 )
        ir = ( value[ 2 ] << 16 ) + ( value[ 1 ] << 8 ) + value[ 0 ]

        return( red, green, blue, ir )

わかりやすいセンサーのようですね
レジスタ0x00がコントローラで
レジスタ0x0dが緑 0x10が赤 0x13がブルー 0x0aが赤外

その他いろいろモードがありそうだけどデータシートがないので
わからない 

I2cはレジスタの操作が必須だが、この雑誌記事では何の理解できない
3002のSPIにしてもレジスタとビット操作の説明がない

もっとも最近はセンサメーカさんがライブラリを用意してくれているので
ワン命令で済むが、やはり仕組みを知っているといないで大違いである

ラズパイマガジンの役目が終わった

カテゴリー iot