×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
RaspberypiでカラーRGBセンサー
ラズパイマガジン2017年10月号のソースを解析してみました。
ちなみにこのセンサーの浜松フォトニックスは、神岡のスーパー
カミオカンデでニュートリノの光検知センサーのメーカーさんで
ノーベル賞受賞に貢献した会社です。
ラズパイマガジン全般に言えることなんだけど、ソースのコピペで
動作はするが、肝心のソース意味が理解できないのが問題だと思う
特にwiringpiを標準としているが、内容を理解して使わないと結局
何もできない事になる。超入門者はともかく、次のステップは苦労
しながら手組に挑戦が必要だが、この段階になると書籍がない
結局ネットでコピペで終わりになってしまう
まずは
ラズパイマガジン2017年10月号のソースを解析してみました。
ちなみにこのセンサーの浜松フォトニックスは、神岡のスーパー
カミオカンデでニュートリノの光検知センサーのメーカーさんで
ノーベル賞受賞に貢献した会社です。
ラズパイマガジン全般に言えることなんだけど、ソースのコピペで
動作はするが、肝心のソース意味が理解できないのが問題だと思う
特にwiringpiを標準としているが、内容を理解して使わないと結局
何もできない事になる。超入門者はともかく、次のステップは苦労
しながら手組に挑戦が必要だが、この段階になると書籍がない
結局ネットでコピペで終わりになってしまう
まずは
>import time, wiringpi as pi
時間を使うのでtimeを
wiringpiをインポート
時間を使うのでtimeを
wiringpiをインポート
>S11059_ADDR = 0x2A
i2cの接続アドレス sudo i2cdetect -y 1で確認
認識しない 安物のボードがケーブルが原因、取り替えましょう
過去ケーブルが内部で繋がっていない事が何度かあった、恐るべし中華品質
安物センサーの場合は、初期不良も多々、悩む時間があったらとっとと
買い換えるべし
amazonの評価でで誰かが複数個買って1個でも動作すればOKと
書いていたが安物センサーは、ラテン気質が必要、
このセンサーのように国内一流メーカー製品なら安心。
基本的にI2CであろうとSPIであろうと、センサーのレジスタと
raspberypiがやり取りしてデータの送受信をおこなう。
レジスタの概念が必須になる。
センサーにはレジスタマップがかならず公開されているので
そのマップに基づきデータの送受信を実施する
このソースは
x02a(センサー)のアドレスから8ビットをhに格納
x02a(センサー)のアドレス+1から8ビットをiに格納
hに8ビット上位ビットにシフトして下位8ビットにiをセット
16ビットにして10進数で戻す
上位ビットシフトだが256倍する方法もある
ワイアリングでインスタンス(動作させる為の名前)を作成
x02aアドレスをセット(今後は、このインスタンスはこのアドレスに対して
動作)
1秒間お待ちなさい
i2cの接続アドレス sudo i2cdetect -y 1で確認
認識しない 安物のボードがケーブルが原因、取り替えましょう
過去ケーブルが内部で繋がっていない事が何度かあった、恐るべし中華品質
安物センサーの場合は、初期不良も多々、悩む時間があったらとっとと
買い換えるべし
amazonの評価でで誰かが複数個買って1個でも動作すればOKと
書いていたが安物センサーは、ラテン気質が必要、
このセンサーのように国内一流メーカー製品なら安心。
>def read_sensor( reg ):
h = i2c.readReg8( S11059, reg ) #'8bit read
l = i2c.readReg8( S11059, reg + 1 ) #'8bit + 1byye
data = ( h << 8 ) + l #'shift8bit + 8bit
return ( data )
基本的にI2CであろうとSPIであろうと、センサーのレジスタと
raspberypiがやり取りしてデータの送受信をおこなう。
レジスタの概念が必須になる。
センサーにはレジスタマップがかならず公開されているので
そのマップに基づきデータの送受信を実施する
このソースは
x02a(センサー)のアドレスから8ビットをhに格納
x02a(センサー)のアドレス+1から8ビットをiに格納
hに8ビット上位ビットにシフトして下位8ビットにiをセット
16ビットにして10進数で戻す
上位ビットシフトだが256倍する方法もある
>i2c = pi.I2C() #instance
>S11059 = i2c.setup( S11059_ADDR ) #adress set
>time.sleep(1)
ワイアリングでインスタンス(動作させる為の名前)を作成
x02aアドレスをセット(今後は、このインスタンスはこのアドレスに対して
動作)
1秒間お待ちなさい
>while True:
i2c.writeReg8( S11059, 0x00, 0x89 ) #10001001 adcreset sleep off 14.ms
i2c.writeReg8( S11059, 0x00, 0x09 ) #00001001 x x x x low x x 1.4ms
time.sleep( 1.0 )
一生働け
x02aのx00にデータx89 を書き込め
レジスタマップのx00を見るとコントロールになっており、各ビットに
0か1をセットするとその動作になる
このx89はADCリセット、スリープ解除、通信14msという命令
x02aのx00にデータx09 を書き込め
このx09はADCリセット解除、通信14msという命令
(ここでraspberypiからのデータ送信命令を待機)
1秒間お待ちなさい
(待っている間、データが積分される)
ここまでは、秋月のデータシートのサンプル通り
固定モードで実行
> i2c.writeReg8( S11059, 0x03, 0x2A )
readモードに変更
という具合だが、
ポイントは
・マスタースレーブ間のデータのやり取り(プロトコル)
・レジスタ操作
・シフト演算
この3つの知識は必須、コピペではマスターできない
素朴な疑問、このセンサーは実務で何に使えるの?
一生働け
x02aのx00にデータx89 を書き込め
レジスタマップのx00を見るとコントロールになっており、各ビットに
0か1をセットするとその動作になる
このx89はADCリセット、スリープ解除、通信14msという命令
x02aのx00にデータx09 を書き込め
このx09はADCリセット解除、通信14msという命令
(ここでraspberypiからのデータ送信命令を待機)
1秒間お待ちなさい
(待っている間、データが積分される)
ここまでは、秋月のデータシートのサンプル通り
固定モードで実行
> i2c.writeReg8( S11059, 0x03, 0x2A )
readモードに変更
> r = read_sensor( 0x03 )
> g = read_sensor( 0x05 )
> b = read_sensor( 0x07 )
> ir = read_sensor( 0x09 )
x03,x05,x07,x09から読み出し
>def read_sensor( reg )で10進数に変換
>print ( "R:", r, " G:", g, " B:", b, " IR:", ir )
表示x03,x05,x07,x09から読み出し
>def read_sensor( reg )で10進数に変換
>print ( "R:", r, " G:", g, " B:", b, " IR:", ir )
という具合だが、
ポイントは
・マスタースレーブ間のデータのやり取り(プロトコル)
・レジスタ操作
・シフト演算
この3つの知識は必須、コピペではマスターできない
素朴な疑問、このセンサーは実務で何に使えるの?
PR