Μηχατρονικά Συστήματα ΙI Τμήμα Μηχανολόγων Μηχανικών Τ.Ε. Τ.Ε.Ι. Κρήτης Παραδείγµατα χρήσης του µικροελεγκτή Arduino Εφαρµογές για το εργαστήριο Μέρος 4 ο : Δρ. Φασουλάς Γιάννης, Επίκ. Καθηγητής Μάρτιος 2016 30
Παράδειγμα 14: Έλεγχος φωτεινότητας με την χρήση φωτοαντίστασης LDR Σε αυτή την εργαστηριακή άσκηση χρησιμοποιούμε μια φωτοαντίσταση ως αισθητήριο μέτρησης φωτεινότητας, η οποία με την σειρά της θέλουμε να ρυθμίζει την φωτοβολία ενός LED που συνδέουμε στο pin 13 του μικροελεγκτή. Για την μέτρηση της φωτεινότητας υλοποιείστε τον διαιρέτη τάσης που παρουσιάζεται παρακάτω και οδηγείστε το σήμα μέτρησης από το διαιρέτη τάσης στν αναλογική είσοδο Α0. Στην συνέχεια γράψτε τον κώδικα που δίνεται και φορτώστε τον στον μικροελεγκτή. Τέλος πειραματιστείτε με τη λειτουργία του αισθητήρα. //PhotoResistor Pin int lightpin = 0; //the analog pin the photoresistor is //connected to //the photoresistor is not calibrated to any units so //this is simply a raw sensor value (relative light //LED Pin int ledpin = 13; //the pin the LED is connected to //we are controlling brightness so //we use one of the PWM (pulse width // modulation pins void setup( pinmode(ledpin, OUTPUT; //sets the led pin to output void loop( int lightlevel = analogread(lightpin; //Read the // lightlevel lightlevel = map(lightlevel, 0, 900, 0, 255; //adjust the value 0 to 900 to //span 0 to 255 lightlevel = constrain(lightlevel, 0, 255;//make sure the //value is betwween //0 and 255 analogwrite(ledpin, lightlevel; //write the value 31
Παράδειγμα 15: Έλεγχος θερμοκρασίας με αναλογικό αισθητήρα Σε αυτή την εργαστηριακή άσκηση χρησιμοποιούμε το αισθητήριο θερμοκρασίας TMP36 (Precision Temperature Sensor το οποίο διαθέτει μία αναλογική έξοδο και ευαισθησία 10 m volt/c o δ καθώς επίσης λειτουργεί με μία αρχική αντιστάθμιση (offset των 500m volt προκειμένου να παρέχεται η δυνατότητα μέτρησης και αρνητικών θερμοκρασιών. int temperaturepin = 0; //the analog pin the TMP36's Vout (sense pin is connected to //the resolution is 10 mv / degree centigrade //(500 mv offset to make negative temperatures an option void setup( Serial.begin(9600; //Start the serial connection with the copmuter //to view the result open the serial monitor //last button beneath the file bar (looks like a box with an antenae void loop( // run over and over again float temperature = getvoltage(temperaturepin; //getting the voltage reading from the //temperature sensor temperature = (temperature 0.5 * 100; //converting from 10 mv per degree with 500 mv offset //to degrees ((volatge - 500mV times 100 Serial.println(temperature; //printing the result delay(1000; //waiting a second /* * getvoltage( - returns the voltage on the analog input defined by * pin */ float getvoltage(int pin return (analogread(pin *.004882814; //converting from a 0 to 1023 digital range // to 0 to 5 volts (each 1 reading equals ~ 5 millivolts Ευαισθησία οργάνου: 10 mvolt/c o Υπάρχει ένα αρχικό offset: 500mvolt Μέγεθος αναλογικής βαθµιδοποίησης: Q=(5-0/1024=0.004882814 32
Παράδειγμα 16: Βιβλιοθήκη για οθόνη LCD 16 στηλών και 2 γραμμών Συνδέστε την οθόνη LCD στον μικροελεγκτή όπως παρουσιάζεται στο παρακάτω σχήμα και εκτελέστε το απλό παράδειγμα του κώδικα που σας δίνετε. Το ποτενσιόμετρο χρησιμοποιείται για την ρύθμιση της αντίθεσης των γραμμάτων. #include <LiquidCrystal.h> // δήλωση της βιβλιοθήκης LiquidCrystal lcd(12, 11, 5, 4, 3, 2; // δηλώνουµε τα PIN της οθόνης //(rs,enable,d4,d5,d6, d7 void setup( lcd.begin(16, 2; // ορίζουµε τις στήλες και τις γραµµές της οθόνης lcd.print("hello,world"; // εκτυπώνουµε το µήνυµα «hello,world» void loop( lcd.setcursor(0, 1; //θέτουµε τον κέρσορα στην επιθυµητή θέση (1 η στήλη, 2 η γραµµή lcd.print(millis(/1000; // εκτυπώνουµε τα δευτερόλεπτα από τηντελευταία επαναφορά " Τροποποιείστε το παραπάνω πρόγραμμα ώστε χρησιμοποιώντας τον αισθητήρα θερμοκρασίας του προηγούμενου παραδείγματος να εκτυπώνεται στην οθόνη LCD η τιμή της θερμοκρασίας περιβάλλοντος σε βαθμούς κελσίου. Επίσης, με το πάτημα ενός κουμπιού να εμφανίζεται η θερμοκρασία σε βαθμούς Φαρενάιτ με βάση τον παρακάτω τύπο [F]=32+[C]*9/5 Η Κλίμακα Φαρενάιτ είναι κλίμακα μέτρησης θερμοκρασίας και ονομάστηκε έτσι προς τιμήν του γερμανού φυσικού Γαβριήλ Φάρεναιτ (1686 1736 που την πρότεινε το 1724. Σήμερα έχει σχεδόν αντικατασταθεί από την κλίμακα Κελσίου, πλην όμως χρησιμοποιείται σε περιορισμένους, μη επιστημονικούς, σκοπούς στις Ηνωμένες Πολιτείες. Στην κλίμακα Φαρενάιτ το σημείο πήξης του νερού είναι οι 32 βαθμοί Φαρενάιτ ( F και το σημείο βρασμού του οι 212 ( F (σε κανονική πάντα ατμοσφαιρική πίεση, χωρίζοντας έτσι τα δύο σημεία αναφοράς κατά 180 βαθμούς. Συνεπώς, ένας βαθμός της κλίμακας Φαρενάιτ ισούται με το 1/180 του διαστήματος μεταξύ πήξης και βρασμού. Το αντίστοιχο διάστημα στην κλίμακα Κελσίου είναι 100 βαθμοί. Έτσι το διάστημα 1 βαθμού Φαρενάιτ είναι διάστημα 5/9 του ενός βαθμού Κελσίου. Οι δύο κλίμακες έχουν κοινό σημείο στους - 40 βαθμούς (δηλαδή - 40 F και - 40 C αναπαριστούν την ίδια θερμοκρασία. 33
Παράδειγμα 17: Παράδειγμα χρήσης των εξωτερικών Interrupt Με το παρακάτω πρόγραμμα μπορούμε να διαβάσουμε τον encoder του κινητήρα και να τυπώσουμε στην σειριακή θύρα του υπολογιστή την γωνία περιστροφής του κινητήρα αξιοποιώντας τα ΙΝΤ0 και ΙΝΤ1 του μικροελεγκτή Arduino UNO. #define encoder0pina 2 #define encoder0pinb 3 volatile unsigned int encoder0pos = 32768; unsigned int tmp = 0; //temporary position unsigned int Aold = 0; unsigned int Bnew = 0; volatile double angle = 0; // motor s angle void setup( pinmode(encoder0pina, INPUT; pinmode(encoder0pinb, INPUT; attachinterrupt(0, doencodera, CHANGE; // encoder pin on interrupt 0 (pin 2 attachinterrupt(1, doencoderb, CHANGE; // encoder pin on interrupt 1 (pin 3 Serial.begin (115200; void loop(//check each changes in position if (encoder0pos = tmp angle = (360.0/720.0*(encoder0Pos-32768; Serial.println(angle; Serial.print("\t"; Serial.println(encoder0Pos, DEC; tmp = encoder0pos; delay(10; void doencoderb(// Interrupt on B changing state Bnew=digitalRead(encoder0PinB; Bnew^Aold? encoder0pos++:encoder0pos--; void doencodera( // Interrupt on A changing state Bnew^Aold? encoder0pos++ : encoder0pos--; //Ternary operator (condition? Evaluated_when_true : evaluated_when_false Aold=digitalRead(encoder0PinA; Επεξήγησητωνακροδεκτώντουκαλωδίου«RJ12» Θύρες/Pin* Ονομασία* Χαρακτηριστικά* καλωδίου* Χρώμα* καλωδίου* Αρίθμηση*Θυρών/Pin* 1* ANALOG +9VΤροφοδοσία Άσπρο 2* GND Γείωση Μαύρο Aold% Aold% 3* GND Γείωση Κόκκινο 4* IPOWERA +5VΤροφοδοσία Πράσινο Εικόνα'3.4.6''Καλώδιο'«RJ12» 5* DIGIAI0 ΚανάλιΑοπτικού κωδικοποιητή Κίτρινο Bnew% Bnew% 6* DIGIAI1 ΚανάλιΒοπτικού κωδικοποιητή Μπλε μετατρέψτε το πρόγραμμα ώστε η γωνία περιστροφής να εκτυπώνεται σε μία οθόνη LCD που συνδέεται στον μικροελεγκτή. 34
Επίσης χρησιμοποιήστε το Arduino shield για να οδηγήσετε τον κινητήρα με το κανάλι Β. Επίσης στο πρόγραμμά σας να στέλνετε στο serial monitor του κινητήρα το ρεύμα που τραβάει ο κινητήρας και η ταχύτητα περιστροφής του κινητήρα. Κύκλωµα οδήγηση Διπολικού βηµατικού κινητήρα µε το ολοκληρωµένο L298 από το motor shield Summary' Operating*Voltage* 5V*to*12V* Motor*controller* L298P,*Drives*2*DC*motors*or*1*stepper*motor* Max*current* 2A*per*channel*or*4A*max*(with*external*power*supply* Current*sensing* 1.65V/A,*AD*converter*in*3V3*for*max*current*2A* Free*running*stop*and*brake*function* * * Function Channel-A Channel-B Direction Digital12 Digital13 Speed,(PWM Digital3 Digital11 Brake Digital9 Digital8 Current,Sensing Analog0 Analog1 #include <Stepper.h> #define STEPS 100 // change this to the number of steps on your motor // create an instance of the stepper class, specifying // the number of steps of the motor and the pins it's // attached to Stepper stepper(steps, 12, 13; int previous = 0; // the previous reading from the analog input void setup( stepper.setspeed(30; // set the speed of the motor to 30 RPMs void loop( int val = analogread(2; // move a number of steps equal to the change in the // sensor reading stepper.step(val - previous; // remember the previous value of the sensor previous = val; Τ.Ε.Ι. Κρήτης Δρ. Ι. Φασουλάς ΜΗΧΑΤΡΟΝΙΚΑ ΣΥΣΤΗΜΑΤΑ Ι Τµήµα Μηχανολόγων Μηχανικών Τ.Ε. 57 35