Go Down

Topic: CCD Linear Sensor Array (from flatbed scanner) and Arduino (Read 1 time) previous topic - next topic

e-San

Hi!

So I got some idea and I need to build own scanner.
I tried to get some sensors from few old scanners and finally found one which I was able to find datasheet - µPD3799CY from NEC (attachment).

So connected it as suggested in datasheet except resistors, NOT-gates and preamp - input directly from arduino, output (V_out3) directly to arduino. Power supply - 12V.

I analyzed bilion times graph on page 8 and tried to make program:
Code: [Select]
int fiRB = 8;
int fi1 = 9;
int fi2 = 10;
int fiTG = 11;

int line = 0;

// PORTB maps to Arduino digital pins 8 to 13
// The two high bits (6 & 7) map to the crystal pins and are not usable;
//
// PORTB = {X1} {X2} {13} {12}   {11}  {10}   {9}  {8};
// PORTB = {X1} {X2} {13} {12} {fiTG} {fi1} {fi2} {RB};
// PORTB = 00000000;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  pinMode(fiRB, OUTPUT);
  pinMode(fi1, OUTPUT);
  pinMode(fi2, OUTPUT);
  pinMode(fiTG, OUTPUT);

  pinMode(A0, INPUT);

  delay(100);
 
  Serial.println("");
  Serial.println("Hit enter for measurement.");
}

void loop() {

  line = 0;
 
  Serial.println("Waiting for input.");
 
  while(!Serial.available()){}
  while( Serial.available()){ Serial.read(); }

  PORTB = B00000100;
  delayMicroseconds(1);
  PORTB = B00000101;
  delayMicroseconds(1);
  PORTB = B00000011;
  delayMicroseconds(1);
 
  // PORTB = {X1} {X2} {13} {12} {fiTG} {fi1} {fi2} {fiRB};

  for(int k=1; k<20; k++){

    for(int f = 0; k < 3; k++){
      PORTB = B00000100;
      delayMicroseconds(1);
      PORTB = B00000101;
      delayMicroseconds(1);
      PORTB = B00000011;
      delayMicroseconds(1);
      line++;
    }
     
    Serial.print(line++);
    Serial.print('\t');
     
    // PORTB = {X1} {X2} {13} {12} {fiTG} {fi1} {fi2} {fiRB};
    PORTB = B00000100;
    Serial.print("B00000100");
    Serial.print(":");
    Serial.print(analogReadFast(A0));
    Serial.print(" ");
 
    PORTB = B00000101;
    Serial.print("B00000101");
    Serial.print(":");
    Serial.print(analogReadFast(A0));
    Serial.print(" ");
     
    PORTB = B00000011;
    Serial.print("B00000011");
    Serial.print(":");
    Serial.println(analogReadFast(A0));
  }
 
  Serial.println("---------");

  for(int j=0; j < 6; j++){
 
    for(int i=1; i<900; i++){
      line++;
     
      // PORTB = {X1} {X2} {13} {12} {fiTG} {fi1} {fi2} {fiRB};
      PORTB = B00000100;
      delayMicroseconds(1);
      PORTB = B00000101;
      delayMicroseconds(1);
      PORTB = B00000011;
      delayMicroseconds(1);
    }

    Serial.print(line++);
    Serial.print('\t');
   
    // PORTB = {X1} {X2} {13} {12} {fiTG} {fi1} {fi2} {fiRB};
    PORTB = B00000100;
    Serial.print("B00000100");
    Serial.print(":");
    Serial.print(analogReadFast(A0));
    Serial.print(" ");
   
    PORTB = B00000101;
    Serial.print("B00000101");
    Serial.print(":");
    Serial.print(analogReadFast(A0));
    Serial.print(" ");
     
    PORTB = B00000011;
    Serial.print("B00000011");
    Serial.print(":");
    Serial.print(analogReadFast(A0));
    Serial.println("");

  }

}

int analogReadFast(byte ADCpin)
{ byte ADCSRAoriginal = ADCSRA;
  ADCSRA = (ADCSRA & B11111000) | 4;
  int adc = analogRead(ADCpin); 
  ADCSRA = ADCSRAoriginal;
  return adc;
}


The problem is that when I cover whole sensor, I get this:
Code: [Select]
2 B00000100:1023 B00000101:1023 B00000011:1023
5 B00000100:1023 B00000101:1023 B00000011:1023
8 B00000100:1023 B00000101:1023 B00000011:1023
11 B00000100:1023 B00000101:1023 B00000011:1023
14 B00000100:1023 B00000101:1023 B00000011:1023
17 B00000100:1023 B00000101:1023 B00000011:1023
20 B00000100:1023 B00000101:1023 B00000011:1023
23 B00000100:1023 B00000101:1023 B00000011:1023
26 B00000100:1023 B00000101:1023 B00000011:1023
29 B00000100:1023 B00000101:1023 B00000011:1023
32 B00000100:1023 B00000101:1023 B00000011:1023
35 B00000100:1023 B00000101:1023 B00000011:1023
38 B00000100:1023 B00000101:1023 B00000011:1023
41 B00000100:1023 B00000101:1023 B00000011:1023
44 B00000100:1023 B00000101:1023 B00000011:1023
47 B00000100:1023 B00000101:1023 B00000011:1023
50 B00000100:1023 B00000101:1023 B00000011:1023
53 B00000100:1023 B00000101:1023 B00000011:1023
56 B00000100:1023 B00000101:1023 B00000011:1023
---------
956 B00000100:1023 B00000101:1023 B00000011:1023
1856 B00000100:1023 B00000101:1023 B00000011:1023
2756 B00000100:1023 B00000101:1023 B00000011:1023
3656 B00000100:1023 B00000101:1023 B00000011:1023
4556 B00000100:1023 B00000101:1023 B00000011:1023
5456 B00000100:1023 B00000101:1023 B00000011:1023


Torch directly onto sensor:
Code: [Select]
2 B00000100:729 B00000101:452 B00000011:481
5 B00000100:1023 B00000101:487 B00000011:491
8 B00000100:1023 B00000101:531 B00000011:531
11 B00000100:1023 B00000101:532 B00000011:534
14 B00000100:1023 B00000101:531 B00000011:531
17 B00000100:1023 B00000101:512 B00000011:511
20 B00000100:1023 B00000101:539 B00000011:538
23 B00000100:1023 B00000101:535 B00000011:535
26 B00000100:1023 B00000101:536 B00000011:536
29 B00000100:1023 B00000101:534 B00000011:534
32 B00000100:1023 B00000101:539 B00000011:540
35 B00000100:1023 B00000101:536 B00000011:536
38 B00000100:1023 B00000101:532 B00000011:535
41 B00000100:1023 B00000101:519 B00000011:518
44 B00000100:1023 B00000101:534 B00000011:534
47 B00000100:1023 B00000101:534 B00000011:535
50 B00000100:1023 B00000101:534 B00000011:534
53 B00000100:1023 B00000101:533 B00000011:532
56 B00000100:1023 B00000101:535 B00000011:536
---------
956 B00000100:1023 B00000101:492 B00000011:495
1856 B00000100:1023 B00000101:489 B00000011:494
2756 B00000100:1023 B00000101:489 B00000011:494
3656 B00000100:1023 B00000101:489 B00000011:494
4556 B00000100:1023 B00000101:489 B00000011:494
5456 B00000100:1023 B00000101:487 B00000011:494


Until now it seems to be everything ok, but I've covered about 1/3 of sensor with green tape and the output is the same...

I've been trying different delays (after PORTB) and whole bunch of stuff i can do with software, but it seems to not affect the output. Even removing part before first for does not change anything...

Go Up