Lynx-EyEDの電音鍵盤 新館

制御とか数学とか駄文とか

LPC1114を使うArduino互換API環境、MARYDuinoでカラーセンサーを使う話

最近作っているSpartan-6 MicroBoardスタック用カメラボードはロボットの目の部分、つまり画像認識やSURF処理のために作っています。
ついでにiOS環境でHSV変換プログラミングをしているのはiPhone上のカメラで捕らえた映像の色認識をするため。
これから書く、カラーセンサーは色データをフィードバックしてカラーマッチング、およびロボットのカメラの露出の積算時間予測のために使います。

実はこの3つはすべてひとつのロボット作品のために作っていたりします。

で、秋月で偶然 浜松ホトニクス製S9706というデジタルカラーセンサーを見つけました。店頭価格900円。

f:id:Lynx-EyED:20111112223927j:image

Arduinoで制御してる事例は多くあるようなので参考にさせていただきました。
f:id:Lynx-EyED:20111112223926p:image
↑これ、SPIが使えそうですがArduinoだとSPIが8bitなのでRGBの変換データがそれぞれ12bit、計36bit分のデータが流れてくるため、shiftIn()関数使ってるんですね。

MARYDuinoで制御します。*1
ブレッドボードに配線
f:id:Lynx-EyED:20111112182131j:image

#include <libmary.h>
#include <stdlib.h>
#include <SPI.h>

#define S9706_GATE	C33		//Low->High:光量の積算。S9706の6番->(CN3_3に接続)
#define S9706_RANGE	C31		//受光感度調整。S9706の4番->(CN3_1)に接続。

//     PIO0_6(CN4_3)	: SCLK -> S9706の5番(CK)
//     PIO0_8(CN4_5)	: MISO -> S9706の1番(Dout)

void setup()
{
	pinMode(S9706_GATE,OUTPUT);
	pinMode(S9706_RANGE,OUTPUT);
	Serial.begin(9600);
	SPI.setBitLength(12);		//12bit ADC
	SPI.setDataMode(SPI_MODE2);
	SPI.begin();
	Serial.println("Start");
}

int r,g,b;

void loop()
{
	digitalWrite(S9706_GATE,LOW);
	digitalWrite(S9706_RANGE,HIGH);

	Serial.println("積算を開始");
	digitalWrite(S9706_GATE,HIGH);
	delay(4);
	

	Serial.println("積算を終了");
	Serial.println("データリード開始");

	digitalWrite(S9706_GATE,LOW);

	r = SPI.transfer(0xfff);
	g = SPI.transfer(0xfff);
	b = SPI.transfer(0xfff);

	Serial.print("r = ");
	Serial.println(r,DEC);
	Serial.print("g = ");
	Serial.println(g,DEC);
	Serial.print("b = ");
	Serial.println(b,DEC);

	delay(1000);

}

データはTeraTermなどで見ることができます。(LPCXpresso環境でコンパイルした際は、UTF-8)

参考文献

*1:※MARYDuino環境のダウンロードと詳しい内容はこちらから http://www45.atwiki.jp/marykiban/pages/47.html