あまり早くない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);//ココで露光時間調整 } }