Arduino Starter Project #1

Έλληνας Ιωάννης

1. Είσοδος δεδομένων

  • Όταν το πλήκτρο δεν είναι πατημένο, η τάση στην είσοδο είναι 5 V. Όταν είναι πατημένο, η τάση είναι 0 V. Ένα πάτημα (on-off) δημιουργεί έναν παλμό.
  • Ο παρακάτω κώδικας ανάβει το LED που είναι μόνιμα συνδεδεμένο στον Arduino Uno (dp-13) όσο το πλήκτρο είναι πατημένο και το σβήνει όταν το αφήσουμε.

Κώδικας

int ledPin = 13;// choose the pin for the Arduino LED
int inputPin = 2;// choose the input pin
int val = 0;// variable for reading the pin status[/sourcecode]

 

void setup() {
pinMode(ledPin, OUTPUT);// declare ledPin as output
pinMode(inputPin, INPUT);// declare inputPin as input
}

void loop() {
val = digitalRead(inputPin);// read pushbutton
if (val == HIGH) {// check if the input is HIGH (button released)
digitalWrite(ledPin, LOW);// turn LED OFF
} else {
digitalWrite(ledPin, HIGH);// turn LED ON
}
}
  • Ένα στιγμιαίο πάτημα του πλήκτρου Ρ δημιουργεί έναν παλμό “active low”.
  • Ο κώδικας που ακολουθεί ανάβει ή σβήνει το LED διαδοχικά κάθε φορά που πατιέται το πλήκτρο.

Σημείωση: Στην ανάγνωση ενός πλήκτρου υπάρχει η έννοια του “debouncing”. Η μορφή του παλμού που δημιουργείται κατά το πάτημα ενός πλήκτρου είναι η παρακάτω. Λόγω του θορύβου που δημιουργεί η μεταλλική επαφή μπορεί να υπάρξει λανθασμένη διάγνωση για το πότε πατήθηκε το πλήκτρο. Η τεχνική ασφαλούς ανάγνωσης του πλήκτρου με “debounce” είναι η εξής:

  • Δημιουργούμε την τρέχουσα τιμή του πλήκτρου val και την προηγούμενη τιμή του previous, που αρχικά είναι και τα δύο  “HIGH” (κατάσταση ηρεμίας).
  • Όταν πατηθεί το πλήκτρο, τα val και previous σταθεροποιούνται σε κατάσταση “LOW” (πλήκτρο πατημένο).
  • Όταν αφεθεί το πλήκτρο, για να θεωρηθεί ότι έγινε πληκτρολόγηση, πρέπει το val να είναι “HIGH” ενώ το previous να είναι “LOW” και να έχει παρέλθει χρόνος μεγαλύτερος από 200 ms (μεταβλητή “debounce”) από το τελευταίο πάτημα.
  • Η συνάρτηση millis() δίνει το χρόνο από τη στιγμή εκκίνησης του προγράμματος.

Κώδικας


int ledPin = 13;// choose the pin for the Arduino LED

int inputPin = 2;// choose the input pin

int val = 0;// variable for reading the pin status

int state = LOW;// the current state of the LED (initially LOW)

int previous = HIGH;// the previous reading from the input pin

long time = 0;// the last time the output pin was toggled

long debounce = 200; // the debounce time, increase if the output flickers

void setup() {

pinMode(ledPin, OUTPUT); // declare ledPin as output

pinMode(inputPin, INPUT); // declare inputPin as input

}

void loop() {

val = digitalRead(inputPin); // read pushbutton

if (val == HIGH && previous == LOW && millis() - time > debounce) {

// ... invert the output

if (state == HIGH)

state = LOW;

else

state = HIGH;

// ... and remember when the last button press was

time = millis();

}

digitalWrite(ledPin, state);

previous = val;

}

Σημείωση: Εναλλακτικά, μόλις ανιχνευθεί val=HIGH και previous=LOW δημιουργούμε χρονοκαθυστέρηση debounce και εφόσον η τιμή val παραμένει HIGH οριστικοποιούμε την αλλαγή κατάστασης.

 2. Έξοδος δεδομένων

Η πιο συνηθισμένη έξοδος είναι το LED. Η συνδεσμολογία είναι η εξής:

Συνδεσμολογία (α)

  • Όταν η έξοδος Digital Pin 3 γίνει “1” (VOH=5V) θα υπάρξει ένα ρεύμα προς το LED (source IOH) το οποίο από τα χαρακτηριτικά του μC είναι περίπου 18 mA για έξοδο 4.5 V.
  • Το ρεύμα αυτό είναι αρκετό για να ανάψει το LED. Εάν τοποθετήσουμε αντίσταση περιορισμού R  πρέπει να υπολογίσουμε την τιμή της. Για ρεύμα IF=18mA, δημιουργείται πτώση τάσης VF=1.85 V. Επομένως: R=(4.5-1.85)V/18mA=147 Ω à R=120 Ω.

  • Σε συνδυασμό με το πρώτο πρόγραμμα του μπουτόν:

int ledPin = 3;        // choose the pin for external LED

int inputPin = 2;     // choose the input pin

int val = 0;             // variable for reading the pin status

void setup() {

pinMode(ledPin, OUTPUT);    // declare ledPin as output

pinMode(inputPin, INPUT);                // declare inputPin as input

}

void loop() {

val = digitalRead(inputPin);     // read pushbutton

if (val == HIGH) {                                // check if the input is HIGH (button released)

digitalWrite(ledPin, LOW);      // turn LED OFF

} else {

digitalWrite(ledPin, HIGH);     // turn LED ON

}

}

Συνδεσμολογία (β)

  • Όταν η έξοδος Digital Pin 3 γίνει “0” (VOL=0V) θα υπάρξει ένα ρεύμα από την πηγή προς το LED (sink IOL) το οποίο από τα χαρακτηριτικά του μC είναι περίπου 18 mA για έξοδο 0.5 V.
  • Ο υπολογισμός της αντίστασης R γίνεται τώρα ως εξής: R=(5-1.85-0.5)V/18mA=147Ω à R=120Ω.
  • Σε συνδυασμό με το πρώτο πρόγραμμα του μπουτόν:

int ledPin = 3;        // choose the pin for external LED

int inputPin = 2;     // choose the input pin

int val = 0;             // variable for reading the pin status

void setup() {

pinMode(ledPin, OUTPUT);    // declare ledPin as output

pinMode(inputPin, INPUT);                // declare inputPin as input

}

void loop() {

val = digitalRead(inputPin);     // read pushbutton

if (val == HIGH) {                                // check if the input is HIGH (button released)

digitalWrite(ledPin, HIGH);     // turn LED OFF

} else {

digitalWrite(ledPin,LOW);      // turn LED ON

}

}

 3.  Παλμική οδήγηση

Η έξοδος dp-3 του μC μπορεί να δώσει και παλμική τάση/ρεύμα, της μορφής:

Duty cycle=τ/Τ

Οι λόγοι που οδηγούμε τα LED με παλμικό ρεύμα είναι οι εξής:

  • Παρέχουν μεγαλύτερη φωτεινότητα. LED’s που οδηγούνται με παλμικό ρεύμα 200% της κανονικής τιμής με duty cycle 50% φαίνονται πιο φωτεινά από τη συνεχή τους οδήγηση με ρεύμα ίσο με τη μέση τιμή του παλμικού ρεύματος.
  • Μεγαλύτερη διάρκεια ζωής.
  • Μικρότερη κατανάλωση.

Η συχνότητα της οδήγησης πρέπει να είναι μεγαλύτερη των 50 Hz για να μην υπάρχει τρεμόπαιγμα (συνήθως είναι >=200Hz).

Κώδικας για οδήγηση PWM


int value = 0;                            // variable to keep the actual value

int ledPin = 3;                           // LED connected to digital pin 3

void setup() {

pinMode(ledPin, OUTPUT);

}

void loop() {

for(value = 0 ; value >= 255; value+=5) // fade in (from min to max)

{

analogWrite(ledPin, value);           // sets the value (range from 0 to 255)

delay(80);                                        // waits for 30 milli seconds to see the dimming effect

}

for(value = 255; value >=0; value-=5)   // fade out (from max to min)

{

analogWrite(ledPin, value);

delay(80);

}

}

 

Παρατήρηση: Μια τιμή value=64 (256/64=4) σημαίνει ότι το LED θα μένει αναμμένο το ¼ της περιόδου Τ και συνεπώς θα βλέπουμε το ¼ της μέγιστης φωτεινότας. Η συχνότητα είναι περίπου 500 Hz ή T=2 ms.

 

Η συνάρτηση analogWrite δεν επηρεάζει τη συχνότητα του PWM, δηλαδή την περίοδο Τ. Εάν θέλουμε να την αλλάξουμε θα πρέπει να επέμβουμε στους καταχωρητές του μC που αφορούν αυτήν τη λειτουργία, δηλαδή τους Timers 0,1 και 2. Χρειάζεται όμως προσοχή γιατί επηρεάζονται και οι συναρτήσεις που δημιουργούν χρονοκαθυστερήσεις, η λειτουργία των οποίων βασίζεται στη λειτουργία των ίδιων χρονιστών.  Οδηγίες υπάρχουν στο http://arduino.cc/playground/Code/PwmFrequency.

Για παράδειγμα, μπορούμε να αλλάξουμε τη συχνότητα για το παράδειγμά μας ως εξής:

setPwmFrequency(3, 1024);

Η βασική συχνότητα λειτουργίας για το pin 3 είναι 31250 Ηz και επομένως η παραπάνω συνάρτηση θα αλλάξει τη συχνότητα του PWM σε περίπου 31 Hz. Θα παρατηρήσουμε το τρεμόπαιγμα του LED λόγω της χαμηλής συχνότητας.


int value = 0;

int ledPin = 3;

void setup() {

pinMode(ledPin, OUTPUT);

}

void loop() {

setPwmFrequency(ledPin, 1024);

value=64;

analogWrite(ledPin, value);

}

void setPwmFrequency(int pin, int divisor) {

uint8_t mode;

if (pin==3){

switch (divisor){

case 1024:mode=0x7;

break;}

TCCR2B = TCCR2B & 0b11111000 | mode;}

}
Tags: ,

Leave a Reply