カメラ誘導マシンでよく使われているTSL1401をArduinoで動かしてみる
とりあえず128画素を読んでみると
1フレームの読み込みに15.4ms程度かかっている。遅すぎる。
ので、高速化を検討。
まず、128画素も使わないので4画素に1回のみ取り込むことにしてAD変換の回数を1/4にする。
ライントレースに使うデータとしては、32画素もあれば十分だろう。
4.38ms位になった。これで、露光時間を含めると150fps~160fps位になりそう。
でも、Advanceのセンサ置き換えには、もう少し欲しいところ。
遅い画素の読み取り(AD変換)に手をつける。
analogRead()を早くしたい。
garretlabさんを参照すると
Arduinoの初期化関数init()内でADCの変換時間を決めるADCSRレジスタを設定しているようだ。
早速、hardware/arduino/avr/cores/arduino/wiring.cを覗くと
と書いてある。Arduino Nanoは16MHzなので、ADCSR=0b111(分周比128)になってそうである。
ので、スケッチに戻り、void setup()に下記コードを追記して分周比を32に変更する。
ADCSRA = ADCSRA & 0xfd;//Division Factor 128->32
と、
1.892msとなった。露光時間が2msなら 250fps相当になる。
#define LED 13
#define AO A0
#define SI 11
#define CLK 12
unsigned char data[32];
void setup() {
// put your setup code here, to run once:
pinMode(LED, OUTPUT);
digitalWrite(SI, LOW);
pinMode(SI, OUTPUT);
digitalWrite(CLK, LOW);
pinMode(CLK, OUTPUT);
ADCSRA = ADCSRA & 0xfd;//Division Factor 128->32
Serial.begin(9600);
while (!Serial);
}
void loop() {
// put your main code here, to run repeatedly:
delay(500);
while(1)
{
digitalWrite(SI, HIGH);
digitalWrite(CLK, HIGH);
digitalWrite(SI, LOW);
delayMicroseconds(10);
digitalWrite(LED, HIGH);
digitalWrite(CLK, LOW);
for (int j = 0; j < 32; j++){
data[j]=analogRead(A0)/4;
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
}
digitalWrite(LED, LOW);
Serial.println (data[15]);
delay(5);
}
}