あまり早くないICを上手く使いこなすを止めて、早いCPUでサクサク動かす
今回のボードはESP-WROOM-32。
32画素の読み込みだと370us程度、露光時間を1msとすると700Hz以上でサンプリングできそう。
そこまで早いなら、標準的なライントレース制御でもいけるのではないだろうか
適当な画素の値を2値化して出力して、デジタルセンサのポートに繋ぎ、
適当な画素の値をまとめてDACで出力して、アナログセンサのポートに繋げば
そのまま置き換えもできるかもしれない。
といっても、ここからの調整は、実機にカメラと証明を取り付けて現物合わせになるので未検証。
#define CLK 16
#define SI 17
#define AO A0
#define SEN_R 18
#define SEN_MR 19
#define SEN_C 21
#define SEN_ML 22
#define SEN_L 23
#define THER_WHITE 50
#define ANA_R 25
#define ANA_L 26
unsigned char data[32];
void setup() {
// put your setup code here, to run once:
digitalWrite(SI, LOW);
pinMode(SI, OUTPUT);
digitalWrite(CLK, LOW);
pinMode(CLK, OUTPUT);
pinMode(SEN_R, OUTPUT);
pinMode(SEN_MR, OUTPUT);
pinMode(SEN_C, OUTPUT);
pinMode(SEN_ML, OUTPUT);
pinMode(SEN_L, OUTPUT);
pinMode(ANA_R, OUTPUT);
pinMode(ANA_L, OUTPUT);
Serial.begin(115200);
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(CLK, LOW);
for (int j = 0; j < 32; j++){
data[j]=analogRead(A0)/4;//12bit -> 10bit
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
digitalWrite(CLK, HIGH);
digitalWrite(CLK, LOW);
}
dacWrite(ANA_R, (data[12]+ data[13]+ data[14])/12); //data[x]は最大1024までになる
dacWrite(ANA_L, (data[18]+ data[19]+ data[20])/12); //DAC は8bit(最大255まで)なので、溢れないよう注意
if(data[ 5]>THER_WHITE){digitalWrite(SEN_R , HIGH);}else{digitalWrite(SEN_R , LOW);}//右端センサ
if(data[ 8]>THER_WHITE){digitalWrite(SEN_MR, HIGH);}else{digitalWrite(SEN_MR, LOW);}//右中センサ
if(data[16]>THER_WHITE){digitalWrite(SEN_C , HIGH);}else{digitalWrite(SEN_C , LOW);}//中心センサ
if(data[24]>THER_WHITE){digitalWrite(SEN_ML, HIGH);}else{digitalWrite(SEN_ML, LOW);}//左中センサ
if(data[27]>THER_WHITE){digitalWrite(SEN_L , HIGH);}else{digitalWrite(SEN_L , LOW);}//左端センサ
//Serial.println (data[15]);
delay(5);//ココで露光時間調整
}
}