maandag 4 maart 2013

Lijndetectie met CNY70


Proefopstelling CNY70

















Voor de eerste proefopstelling heb ik één CNY70 aangesloten op mijn arduino om eens te gaan kijken welke waardes er binnen zouden komen op de microcontroller.

De CNY70 bestaat uit een infrarood LEDje en een fototransistor in één behuizing. Ook zit er op de voorkant een laagje dat een groot deel van normaal “daglicht” weg filtert. Als dus de IF-LED aan staat word er een deel van de licht weer teruggekaatst en door de fototransistor opgevangen waardoor er meer stroom gaat lopen van Emitter naar Collector.

Als voorbeeld heb ik onderstaand schema gebruikt voor het aansluiten van de CNY70 op de arduino:




















Op dit schema is de IF-LED via een 220 ohm weerstandje aangesloten op de +5v van de arduino.
De fototransistor is via een spanningdeling aangesloten op een analoge ingang van de arduino.
Op die manier krijgt de arduino een nette 0 – 5 volt binnen afhankelijk van de hoeveelheid ligt die op de fototransistor valt.

Via de Seriële monitor is op een computerscherm exact af te lezen hoeveel spanning er binnen komt. Dit gaat met een precisie van  0 tot 1023 (0 – 5v).

Verder vond ik het handig om ook zonder computer een indicatie te hebben van de meetwaarden dus besloot ik 10 LED’s op de uitgangen aan te sluiten die via een comperrator oplichten bij een bepaalde waarde.

Ook heb ik een voltmetertje aangesloten op de analoge ingang van de arduino om te kunnen monitoren welke spanning er aanwezig is.

Tot slot leek het me handig om nog een potmeter in te bouwen die ervoor zorgt dat als de auto zich in een lichte ruimte bevindt de waarden een beetje kunnen worden aangepast.


Monitor analoge inganswaarden:
















Programma arduino:

int x = 10;                               // meetsnelheid

int sensor = A0;                      // fototransistor
int potm = A1;                        // potmeter 10K
int schakelaar = 1;                 // drukknop
int IFled = 2;                           // infraroodLED

int a = 3;                                 // indicatieLED a
int b = 4;                                                // indicatieLED b
int c = 5; ;                               // indicatieLED c
int d = 6;                                                // indicatieLED d
int e = 7;                                                // indicatieLED e
int f = 8;                                 // indicatieLED f
int g = 9;                                                // indicatieLED g
int h = 10;                               // indicatieLED h
int i = 11;                                // indicatieLED i
int j = 12;                                // indicatieLED j


void setup(){
 
  pinMode(sensor, INPUT);
  pinMode(potm, INPUT);
  pinMode(schakelaar, INPUT);
  pinMode(IFled, OUTPUT);
 
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(h, OUTPUT);
  pinMode(i, OUTPUT);
  pinMode(j, OUTPUT);
 
  Serial.begin(9600);              //Seriele monitor baudrate

}
void loop (){
 
  if (schakelaar = HIGH) {digitalWrite(IFled, HIGH);}
  if (schakelaar = LOW) {digitalWrite(IFled, LOW);}
   
  int sensorValue = analogRead(A0);
  int potmValue = analogRead(A1);
  int combiValue = (sensorValue);
 
  // print sensorValue op de seriele monitor:
   Serial.println(combiValue);
  
  delay(x);
 
  if (combiValue < 1000) {digitalWrite(a, HIGH);}
  if (combiValue > 1000) {digitalWrite(a, LOW); }
 
  if (combiValue < 900) {digitalWrite(b, HIGH);}
  if (combiValue > 900) {digitalWrite(b, LOW); }
 
  if (combiValue < 800) {digitalWrite(c, HIGH);}
  if (combiValue > 800) {digitalWrite(c, LOW); }
 
  if (combiValue < 700) {digitalWrite(d, HIGH);}
  if (combiValue > 700) {digitalWrite(d, LOW); }
 
  if (combiValue < 600) {digitalWrite(e, HIGH);}
  if (combiValue > 600) {digitalWrite(e, LOW); }
 
  if (combiValue < 500) {digitalWrite(f, HIGH);}
  if (combiValue > 500) {digitalWrite(f, LOW); }
 
  if (combiValue < 400) {digitalWrite(g, HIGH);}
  if (combiValue > 400) {digitalWrite(g, LOW); }
 
  if (combiValue < 300) {digitalWrite(h, HIGH);}
  if (combiValue > 300) {digitalWrite(h, LOW); }

  if (combiValue < 200) {digitalWrite(i, HIGH);}
  if (combiValue > 200) {digitalWrite(i, LOW); }
 
  if (combiValue < 100) {digitalWrite(j, HIGH);}
  if (combiValue > 100) {digitalWrite(j, LOW); }
 
}




Testen
Vervolgens was het tijd om het zooitje maar eens te gaan testen.
Ik besloot een kleurenstrookje te nemen en eens te kijken welke waarde nou bij welke kleur binnenkwam. Dit zijn mijn resultaten:

Blauw:
85
Groen:
70
Geel:
62
Rood:
90
Zwart:
777
Wit:
59

Wat mij hierbij vooral opvalt, is dat eigenlijk zwart verreweg het meeste contrast heeft in verhouding tot de rest van de kleuren. Mijn hypothese was dat wit vrijwel alles terug zou kaatsen en de andere kleuren juist veel zouden opnemen. Uit bovenstaande resultaten blijkt dus dat ik het verkeerd had. We kunnen dus overwegen om een zwarte streep te kiezen i.p.v. een witte om zo een duidelijker verschil te hebben in analoge meetwaarden.


Geen opmerkingen:

Een reactie posten