Modifications

Sauter à la navigation Sauter à la recherche
3 538 octets ajoutés ,  6 mai 2012 à 22:25
Ligne 291 : Ligne 291 :  
[[Fichier:cds-mesure3.jpg]]
 
[[Fichier:cds-mesure3.jpg]]
    +
== BONUS! Reading photocells without analog pins ==
 +
 +
Because photocells are basically resistors, its possible to use them even if you don't have any analog pins on your microcontroller (or if say you want to connect more than you have analog input pins). The way we do this is by taking advantage of a basic electronic property of resistors and capacitors. It turns out that if you take a capacitor that is initially storing no voltage, and then connect it to power (like 5V) through a resistor, it will charge up to the power voltage slowly. The bigger the resistor, the slower it is.
 +
 +
[[Fichier:cds-condensateur1.jpg]]
 +
''This capture from an oscilloscope shows whats happening on the digital pin (yellow). The blue line indicates when the sketch starts counting and when the couting is complete, about 1.2ms later.''
 +
 +
This is because the capacitor acts like a bucket and the resistor is like a thin pipe. To fill a bucket up with a very thin pipe takes enough time that you can figure out how wide the pipe is by timing how long it takes to fill the bucket up halfway.
 +
 +
[[Fichier:cds-condensateur2.jpg]]
 +
[[Fichier:cds-condensateur3.jpg]]
 +
In this case, our 'bucket' is a 0.1uF ceramic capacitor. You can change the capacitor nearly any way you want but the timing values will also change. 0.1uF seems to be an OK place to start for these photocells. If you want to measure brighter ranges, use a 1uF capacitor. If you want to measure darker ranges, go down to 0.01uF.
 +
<nowiki>/* Photocell simple testing sketch.
 +
Connect one end of photocell to power, the other end to pin 2.
 +
Then connect one end of a 0.1uF capacitor from pin 2 to ground
 +
For more information see www.ladyada.net/learn/sensors/cds.html */
 +
 +
int photocellPin = 2;    // the LDR and cap are connected to pin2
 +
int photocellReading;    // the digital reading
 +
int ledPin = 13;    // you can just use the 'built in' LED
 +
 +
void setup(void) {
 +
  // We'll send debugging information via the Serial monitor
 +
  Serial.begin(9600); 
 +
  pinMode(ledPin, OUTPUT);  // have an LED for output
 +
}
 +
 +
void loop(void) {
 +
  // read the resistor using the RCtime technique
 +
  photocellReading = RCtime(photocellPin);
 +
 +
  if (photocellReading == 30000) {
 +
    // if we got 30000 that means we 'timed out'
 +
    Serial.println("Nothing connected!");
 +
  } else {
 +
    Serial.print("RCtime reading = ");
 +
    Serial.println(photocellReading);    // the raw analog reading
 +
 +
    // The brighter it is, the faster it blinks!
 +
    digitalWrite(ledPin, HIGH);
 +
    delay(photocellReading);
 +
    digitalWrite(ledPin, LOW);
 +
    delay(photocellReading);
 +
  }
 +
  delay(100);
 +
}
 +
 +
// Uses a digital pin to measure a resistor (like an FSR or photocell!)
 +
// We do this by having the resistor feed current into a capacitor and
 +
// counting how long it takes to get to Vcc/2 (for most arduinos, thats 2.5V)
 +
int RCtime(int RCpin) {
 +
  int reading = 0;  // start with 0
 +
 +
  // set the pin to an output and pull to LOW (ground)
 +
  pinMode(RCpin, OUTPUT);
 +
  digitalWrite(RCpin, LOW);
 +
 +
  // Now set the pin to an input and...
 +
  pinMode(RCpin, INPUT);
 +
  while (digitalRead(RCpin) == LOW) { // count how long it takes to rise up to HIGH
 +
    reading++;      // increment to keep track of time
 +
 +
    if (reading == 30000) {
 +
      // if we got this far, the resistance is so high
 +
      // its likely that nothing is connected!
 +
      break;          // leave the loop
 +
    }
 +
  }
 +
  // OK either we maxed out at 30000 or hopefully got a reading, return the count
 +
 +
  return reading;
 +
}
 +
</nowiki>
 +
 +
[[Fichier:cds-condensateur4.jpg]]
    
Source:  [http://www.ladyada.net/learn/sensors/cds.html cds]
 
Source:  [http://www.ladyada.net/learn/sensors/cds.html cds]
29 917

modifications

Menu de navigation