/* Contact Image Sensor
Program for controlling an from an Canon MX700 OfficeJet Printer
Author: atzensepp 1.5.2017
CIS-Sensor-Modul Header:
1 LED Common Anode
2 LED B Cathode
3 LED G Cathode
4 LED R Cathode
5 GND
6 CLK
7 SP
8 Mode ???
9 3.3V
10 GND
11 V_ref ??? ~ Voltage Divider ~ 1.2 V
12 Analog Out
Connection to Arduino:
Arduino Uno CANON CIS-Sensor-Module
PC0 (A0) (6) CLK
PC1 (A1) (7) SP
PC2 (A2)
(11) V_ref (voltage divider -> 1.2 V)
PC4 (A4) (12) Analog Out
5V
(8) unknown I/O signal to GND ?
3.3V (9)
GND (5) (10)
PD7 (4) via 470 Ohm
PD6 (3) via 470 Ohm
PD5 (2) via 470 Ohm
5V (1)
Connection from Analog Out to Arduino:
3.3V
|
-
10k
_
|
A4 ---[ 1k ]----+---------o Analog Out (12)
|
-
10k
-
|
GND
*/
int analogPin = 4;
void ADC_init(void)
{
// choose AVcc as reference:
ADMUX = (1<<REFS0);
ADCSRA &= ~0x07;
ADCSRA |= 0x03;
ADCSRA |= (1<<ADEN); // ADC aktivieren
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten
}
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
Wandlung nicht übernommen. */
(void) ADCW;
}
void setup() {
// put your setup code here, to run once:
Serial.begin( 1000000 );
analogReference(DEFAULT ) ;
pinMode(A4, INPUT);
pinMode(PD7,OUTPUT);
pinMode(PD6,OUTPUT);
pinMode(PD5,OUTPUT);
// digitalWrite(A4, 0);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(A0,LOW);
digitalWrite(A1,LOW);
ADC_init();
ADMUX = (ADMUX & ~(0x1F)) | (4 & 0x1F);
}
void loop() {
char buf[2];
int cnt;
int val;
int emit=0;
int eightbits=1;
byte c;
// put your main code here, to run repeatedly:
if (Serial.available() > 0) {
// read the incoming byte:
c = Serial.read();
switch(c)
{
case 'S': emit=1; break;
case 'R' : digitalWrite(PD7,!digitalRead(PD7)); break;
case 'G' : digitalWrite(PD6,!digitalRead(PD6)); break;
case 'B' : digitalWrite(PD5,!digitalRead(PD5)); break;
case '8':
if(eightbits)
{
eightbits=0;
Serial.write('n');
}
else
{
eightbits=1;
Serial.write('y');
}
break;
}
digitalWrite(A1,HIGH);
delayMicroseconds(2);
digitalWrite(A0,HIGH);
delayMicroseconds(2);
digitalWrite(A0,LOW);
delayMicroseconds(2);
digitalWrite(A1,LOW);
delayMicroseconds(2);
for(cnt=0;cnt<5000;cnt++)
{
digitalWrite(A0,HIGH);
digitalWrite(A0,LOW);
delayMicroseconds(2);
val = analogRead(A4);
/* ADMUX = (ADMUX & ~(0x1F)) | (4 & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while (ADCSRA & (1<<ADSC) ) ; // auf Abschluss der Konvertierung warten
val=ADCW & 0x3ff;
*/
if(emit)
{
Serial.write((val>>2) & 0xff);
}
}
emit=0;
}
}