ラズパイマガジン2020年夏号の配線なしで動かす工作入門だが
カラーセンサーについてなんの説明もないし、型番もデータシートも何もない
読者サイトからソースを落として、動いた動いたで終わりのつもりなのでしょうね

多分、このセンサーだと思うけどメーカーは不明、データシートも存在しない
なんの勉強にもならん
写真の配列だと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にしてもレジスタとビット操作の説明がない
もっとも最近はセンサメーカさんがライブラリを用意してくれているので
ワン命令で済むが、やはり仕組みを知っているといないで大違いである
ラズパイマガジンの役目が終わった