Professional Documents
Culture Documents
(Physical Computing),
μέσω της πλατφόρμας Arduino.
Σημειώσεις Εργαστηρίου
Σπύρος Τσαλαπάτας
Τμήμα Γεωπονίας Ιχθυολογίας και Υδάτινου Περιβάλλοντος
Πανεπιστήμιο Θεσσαλίας
ΒΟΛΟΣ 2021
Αυτή η εργασία δημοσιεύεται από τον Σπύρο This work is licensed by Spyros Tsalapatas under the
Τσαλαπάτα, υπό την Creative Commons Creative Commons Attribution-ShareAlike 3.0 Unported
Attribution-ShareAlike 3.0 Unported License. Δείτε License. To view a copy of this license, visit
αντίγραφο της αδείας στο http://creativecommons.org/licenses/by-sa/3.0/.
http://creativecommons.org/licenses/by-sa/3.0/
-1-
Για να διανθιστεί η πρώτη πρόταση της προηγούμενης παραγράφου και να καταλάβουμε λίγο καλύτερα για
τι ακριβώς μιλάμε ας δούμε δύο διαφορετικούς ορισμούς.
«Ε.Π. είναι η χρήση λογισμικού και κατάλληλου υλικού για την υλοποίηση κατασκευών που μπορούν να
αισθανθούν και να ανταποκριθούν σε ερεθίσματα από τον πραγματικό κόσμο.
[http://en.wikipedia.org/wiki/Physical_computing]»
«Ε.Π. είναι μια μαθησιακή προσέγγιση στο πώς οι άνθρωποι επικοινωνούν μεταξύ τους μέσω υπολογιστών,
που έχει σαν αφετηρία και βάση τους έμφυτους τρόπους έκφρασης. Παραδοσιακά στη διδασκαλία σχεδίασης
Διεπιφανιών Υπολογιστή παίρνουμε σαν δεδομένο το υλικό (πληκτρολόγιο, οθόνη, ποντίκι, ηχεία και απλά
επικεντρωνόμαστε στη χρήση λογισμικού που είναι απαραίτητο για το σχεδιασμό μέσα σ’ αυτά τα όρια. Στον
Ε.Π. παίρνουμε το ανθρώπινο σώμα σαν δεδομένο και προσπαθούμε να σχεδιάσουμε μέσα στα όρια της
έκφρασής του. [Tom Igoe, http://www.tigoe.net/blog/what-is-physical-computing/]»
Ο συνδυασμός του πνεύματος των δυο ορισμών μπορεί να μας δώσει μια καλή εικόνα για τον Ε.Π. και τους
ανθρώπους που ασχολούνται μ’ αυτόν.
Βέβαια η τεχνολογία αυτή υπάρχει και αναπτύσσεται για δεκαετίες (ρομποτική, συστήματα αυτομάτου
ελέγχου). Μέχρι πρόσφατα όμως ήταν πολύπλοκη, ακριβή, και συνεπώς μη προσβάσιμη για το ευρύ κοινό.
Με την ανάπτυξη της υπολογιστικής ισχύος, τη μείωση του κόστους, και την απλοποίηση της διαδικασίας
προγραμματισμού των σχετικών συσκευών, η τεχνολογία άρχισε να χρησιμοποιείται για ερασιτεχνικούς,
καλλιτεχνικούς και εκπαιδευτικούς σκοπούς, από ανθρώπους με μικρή ή και μηδενική προηγούμενη
εμπειρία σε προγραμματισμό Η/Υ και ηλεκτρονική τεχνολογία. Το ρεύμα αυτό ενισχύθηκε από ανθρώπους
με σημαντική εμπειρία στον τομέα, που δημιούργησαν ολοκληρωμένα συστήματα υλικού και λογισμικού
ειδικά για χρήση από μη ειδικούς.
1.2 Φιλοσοφία και άδειες χρήσης Ανοιχτού και Ελεύθερου Λογισμικού και
υλικού
…
-1-
-2-
2 Στο ψητό
Υπάρχουν διάφορες εκδοχές του υλικού (πλακέτας) και επίσημες, σχεδιασμένες από την αρχική ομάδα, και
ανεπίσημες, σχεδιασμένες από άλλες ομάδες. Η κύρια λειτουργία είναι ίδια σε όλες τις εκδοχές. Οι διαφορές
εντοπίζονται στο μέγεθος και σε διάφορες λεπτομέρειες της διασύνδεσης με εξωτερικά εξαρτήματα και
συσκευές.
Ο μικροελεγκτής είναι ο «εγκέφαλος» του συστήματος. Βέβαια ο «εγκέφαλος» αυτός δεν έχει καμία
δυνατότητα επεξεργασίας αν δεν του δώσουμε εμείς προκαθορισμένες οδηγίες. Τη διαδικασία αυτή την
λέμε προγραμματισμό. Έχει ακίδες (pins, ποδαράκια) που χρησιμοποιούνται για την τροφοδοσία του
(ηλεκτρική), τη ρύθμιση της λειτουργίας του, και την διασύνδεση με άλλα εξαρτήματα και κατ’ επέκταση
εξωτερικές συσκευές.
Κάποιες από αυτές τις ακίδες είναι οι είσοδοι και έξοδοι του μικροελεγκτή. Μπορούμε να τις δούμε σαν
«νευρικές απολήξεις» πάνω στις οποίες είναι δυνατόν να συνδεθούν «αισθητήρια όργανα» (για τον άνθρωπο
είναι μεταξύ άλλων τα αυτιά και τα μάτια) και «μέλη» (για τον άνθρωπο τα χέρια και τα πόδια). Μέσω των
εισόδων δέχεται πληροφορία από τον εξωτερικό κόσμο, την οποία μπορεί να επεξεργαστεί. Μέσω των
-2-
-3-
εξόδων στέλνει πληροφορία στον εξωτερικό κόσμο που είναι δυνατόν να βασίζεται στην πληροφορία που
δέχτηκε. Για παράδειγμα, από μία είσοδο με αισθητήρα φωτισμού, παίρνει την πληροφορία ότι τα επίπεδα
του φωτισμού είναι χαμηλά (νύχτωσε ας πούμε) και από μία έξοδο ενεργοποιεί ένα διακόπτη για να ανάψει
ένα φως.
Ένα βασικό πλεονέκτημα του μικροελεγκτή είναι ότι καθεμία από τις συγκεκριμένες ακίδες μπορεί να
ρυθμιστεί είτε σαν είσοδος είτε σαν έξοδος ανάλογα με της ανάγκες της εφαρμογής που σχεδιάζουμε.
2.2 Η πλακέτα
Για να λειτουργήσει και να προγραμματιστεί ο μικροελεγκτής πρέπει να συνδεθεί με διάφορα πρόσθετα
εξαρτήματα που ρυθμίζουν κα εξασφαλίζουν την ομαλή τροφοδοσία και λειτουργία του και την επικοινωνία
του με έναν υπολογιστή για τον προγραμματισμό του. Η πλακέτα του Arduino (και οπουδήποτε άλλου
συστήματος) προσφέρει μία έτοιμη και λειτουργική διάταξη αυτών των εξαρτημάτων. Η σημαντικότερη
λειτουργία της όμως είναι ότι προσφέρει μία δομημένη και εργονομική διάταξη των διαθέσιμων ακίδων με
τυποποιημένες υποδοχές. Αυτό διευκολύνει πολύ τη χρήση.
Θα δούμε σ’ αυτό το στάδιο τα βασικά στοιχεία της δομής του Arduino. Τις λεπτομέρειες θα τις δούμε
προοδευτικά σε πρακτικά παραδείγματα.
1. Ο μικροελεγκτής
2. Είσοδος τροφοδοσίας (ρεύματος).
3. Είσοδος USB για τη διασύνδεση με τον υπολογιστή (όσο υπάρχει σύνδεση με τον υπολογιστή, δεν
είναι απαραίτητη η σύνδεση της εισόδου τροφοδοσίας).
4. Πλήκτρο επανεκκίνησης.
5. Ψηφιακές ακίδες (είσοδοι/έξοδοι)
6. Αναλογικές είσοδοι
7. Έξοδος τροφοδοσίας (για τα διάφορα εξαρτήματα που θα συνδέσουμε, αισθητήρες, φωτάκια,
κινητήρες κ.λπ.).
8. LED (φωτάκι) συνδεδεμένο στην ψηφιακή 13
-3-
-4-
Μία ακίδα λειτουργεί σαν είσοδος όταν τη χρησιμοποιούμε για να «διαβάσουμε» έναν αισθητήρα. Για
παράδειγμα ένα «φωτοκύτταρο», που θα μας δείξει αν το περιβάλλον είναι σκοτεινό ή φωτεινό. Την
πληροφορία αυτή μπορούμε να τη χρησιμοποιήσουμε για να ανάψουμε ή να σβήσουμε τη λάμπα του
προηγούμενου παραδείγματος.,
Μία ακίδα λειτουργεί ψηφιακά όταν μπορεί να έχει μόνο δύο διακριτές τιμές (Αναμμένο/Σβηστό, ή 1/0, ή
Αληθές/Ψευδές, όλα ισοδύναμα ή συνώνυμα κατά μία άλλη έννοια). Χρησιμοποιούνται για συσκευές που
έχουν σε μία από δύο διακριτές καταστάσεις. Για παράδειγμα ένα φως πού μπορεί να είναι ή αναμμένο ή
σβηστό, θα το συνδέσουμε για να το ελέγξουμε σε μία ψηφιακή έξοδο. Ένα διακόπτη που μπορεί να είναι ή
ενεργοποιημένος ή απενεργοποιημένος θα τον συνδέσουμε για να «διαβάσουμε» την κατάστασή του σε μία
ψηφιακή είσοδο. Τέτοιους διακόπτες μπορεί να έχουν τα συστήματα συναγερμού για να δείχνουν αν μία
πόρτα είναι ανοιχτή ή κλειστή.
Μία ακίδα λειτουργεί αναλογικά όταν μπορεί να έχει ένα εύρος τιμών, αν και περιορισμένο. Αυτό μας
επιτρέπει για παράδειγμα να ρυθμίσουμε την φωτεινότητα μιας λάμπας ή την ταχύτητα ενός κινητήρα που
συνδέονται σε μία έξοδο. Επίσης μας επιτρέπει να διαβάσουμε αισθητήρες θερμοκρασίας, ή έντασης
φωτισμού που δίνουν ένα εύρος τιμών και όχι απλά μία ένδειξη ενεργοποίησης ή απενεργοποίησης. Οι τιμές
είναι απαραίτητα ακέραιες και προφανώς διακριτές. Ο Arduino επιτρέπει για τις αναλογικές εξόδους
ακέραιες τιμές από 0 ως 255 (256 τιμές), και για τις αναλογικές εισόδους ακέραιες τιμές από 0 ως 1023 (1024
τιμές). Οι αριθμοί αυτοί είναι περίεργοι γιατί δεν είναι στρόγγυλοι, ας πούμε 250 αντί 256 και 1000 αντί για
1024. Αυτό ισχύει στο δεκαδικό σύστημα αρίθμησης, στο δυαδικό σύστημα οι αριθμοί 256 και 1024 είναι
στρόγγυλοι (100000000 και 10000000000 αντίστοιχα, βλέπε παράρτημα II). Μπορούμε να χρησιμοποιήσουμε
μία αναλογική έξοδο για να ρυθμίσουμε την ένταση μιας λάμπας. Μπορούμε να χρησιμοποιήσουμε μία
αναλογική είσοδο, με έναν κατάλληλο αισθητήρα, για να «διαβάσουμε» τη θερμοκρασία ενός χώρου.
Οι τιμές που παίρνουν οι αναλογικές συνδέσεις δεν έχουν άμεση σχέση με τα πραγματικά μεγέθη που
αντιπροσωπεύουν. Στο παράδειγμα της μέτρησης της θερμοκρασίας ας πούμε οι τιμές 0 ως 1023 δεν
σημαίνουν 00C ως 1023οC. Η αναλογική είσοδος λειτουργεί ως εξής.
• Ο αισθητήρας έχει τη δυνατότητα να μετρήσει ένα συγκεκριμένο εύρος τιμών του πραγματικού
μεγέθους. Για το παράδειγμα της θερμοκρασίας ας πούμε ότι ο συγκεκριμένος αισθητήρας μπορεί να
μετρήσει από 5οC ως 133οC.
• Αυτό δίνει ένα εύρος 128οC (133 – 5 = 128).
• Το εύρος αυτό διαιρείται σε 1024 ίσα μέρη με μέγεθος για το καθένα 0,125oC (128οC / 1024 ή 1/8
του βαθμού).
• Καθένα από αυτά τα μέρη («κομμάτια» θερμοκρασίας) αντιστοιχίζεται σε μία από τις τιμές της
αναλογικής εισόδου (0-1023) με τη σειρά.
0 1 2 1022 1023
5 οC 5,125 οC 5,250 οC 5,375 οC 132,750 οC 132,875 οC 133 οC
-4-
-5-
• Διαβάζοντας μία τιμή της αναλογικής εισόδου ξέρουμε ότι η πραγματική θερμοκρασία βρίσκεται
κάπου μέσα στο αντίστοιχο διάστημα. Μπορούμε να ορίσουμε ποια θα είναι η ονομαστική
(προσεγγιστική) θερμοκρασία για ολόκληρο το διάστημα επιλέγοντας ανάμεσα στην μικρότερη τιμή,
τη μεγαλύτερη τιμή ή (πιο σωστά) τη μέση τιμή.
3 Σηκώστε τα μανίκια
Κάθε ταξίδι αρχίζει μ’ ένα μικρό βήμα. Το απλούστερο πράγμα που μπορούμε να κάνουμε με ένα
μικροελεγκτή είναι αναβοσβήνουμε ένα LED. Για μεγαλύτερη ευκολία η ψηφιακή σύνδεση 13 του Arduino
έχει συνδεδεμένο ένα LED πάνω στην πλακέτα όπως είδαμε στην εικόνα 2. Προφανώς για αυτό το
παράδειγμα δεν χρειάζεται να συνδέσουμε τίποτε σε είσοδο ή σε έξοδο.
Είπαμε ότι για να μπορέσει να κάνει οτιδήποτε ο Arduino πρέπει να του δώσουμε οδηγίες. Αυτό γίνεται σε
δύο απλά στάδια.
1. Γράφουμε το πρόγραμμα στο προγραμματιστικό περιβάλλον ή το ανοίγουμε από ένα αρχείο. Στην
ορολογία του Arduino το πρόγραμμα λέγεται «σχέδιο» (sketch). Επίσης το περιεχόμενο ενός
προγράμματος ή και τα επιμέρους τμήματά του λέγονται γενικά «κώδικας». Το σχέδιο είναι οι
οδηγίες γραμμένες σε «γλώσσα προγραμματισμού» που είναι εύκολα κατανοητή στον άνθρωπο.
2. «Ανεβάζουμε» το πρόγραμμα στον Arduino σε γλώσσα που είναι κατανοητή σε υπολογιστή (γλώσσα
μηχανής). Την μετατροπή την κάνει αυτόματα το προγραμματιστικό περιβάλλον. Μόλις το
πρόγραμμα ανεβεί ο Arduino αρχίζει να το «τρέχει»
Οι γλώσσες προγραμματισμού έχουν πολύ αυστηρή σύνταξη. Απαιτούν συγκεκριμένη σειρά των διαφόρων
λέξεων, και ποικιλία σημείων στίξης σε συγκεκριμένες θέσεις. Πριν το προγραμματιστικό περιβάλλον
μετατρέψει τον κώδικα γλώσσα μηχανής, ελέγχει την σύνταξη. Αν εντοπίσει λάθη μας επισημαίνει σε ποιο
σημείο του κώδικα βρίσκονται.
-5-
-6-
Η μπλε λωρίδα στο πάνω μέρος είναι ο τίτλος του παράθυρου. Περιλαμβάνει ένα όνομα για το σχέδιο
βασισμένο στην ημερομηνία. Το όνομα βέβαια μπορούμε να το αλλάξουμε. Επίσης αναφέρεται η έκδοση του
περιβάλλοντος.
Η σκούρα κυανοπράσινη λωρίδα περιέχει συντομεύσεις για τις συχνότερα χρησιμοποιούμενες εντολές
[έλεγχος του κώδικα, έλεγχος και «ανέβασμα» στον Arduino, δημιουργία νέου σχεδίου, άνοιγμα σχεδίου,
αποθήκευση σχεδίου, σειριακό παράθυρο]. Το σειριακό παράθυρο χρησιμοποιείται για δεχόμαστε μηνύματα
από τον Arduino (λεπτομέρειες αργότερα).
Στη μαύρη περιοχή, το προγραμματιστικό περιβάλλον στέλνει μηνύματα σχετικά με την επικοινωνία του με
τον Arduino και με λάθη που έχει εντοπίσει στον κώδικα.
Ο κώδικας που φαίνεται στην Εικόνα 3 υπάρχει στο παράδειγμα Afesvesi. Για να το ανοίξουμε επιλέγουμε
από το μενού Αρχείο->Παραδείγματα->Seminar->Afesvesi. Θα ανοίξει ένα νέο παράθυρο με τον κώδικα.
Το πρώτο στοιχείο που βλέπουμε στην εικόνα 3 είναι κείμενο σε γκρίζο χρώμα, γραμμένο σε «ανθρώπινη»
γλώσσα. Το κείμενο αυτό λέγεται στην προγραμματιστική ορολογία σχόλιο, και προφανώς δεν είναι μέρος
-6-
-7-
Ότι δεν είναι γκρίζο είναι ο πραγματικός κώδικας. Βλέπουμε ότι το προγραμματιστικό περιβάλλον
χρησιμοποιεί τρία χρώματα. Ποια είναι η σημασία τους;
Το πορτοκαλί χρώμα σημειώνει τις δεσμευμένες λέξεις. Αυτές είναι εντολές ή άλλα στοιχεία κώδικα που
σημαίνουν κάτι συγκεκριμένο και δεν μπορούν να χρησιμοποιηθούν για άλλους σκοπούς (το ποιοι θα
μπορούσαν να είναι αυτοί οι σκοποί θα το δούμε παρακάτω). Για παράδειγμα το pinMode(13,
OUTPUT); σημαίνει όρισε την ακίδα 13 ως έξοδο (θυμηθείτε ότι κάθε ακίδα μπορεί να οριστεί σαν είσοδος
ή έξοδος). Σημειώστε ότι το περιβάλλον ξεχωρίζει τα πεζά γράμματα από τα κεφαλαία και τα θεωρεί
διαφορετικά. Το pinMode δεν είναι το ίδιο με το pinmode. Το πρώτο είναι δεσμευμένη λέξη και σημαίνει
κάτι συγκεκριμένο. Το δεύτερο δεν είναι δεσμευμένη λέξη και για το περιβάλλον δεν σημαίνει κάτι, εκτός αν
κατά κάποιο τρόπο το ορίσουμε εμείς. Λεπτομέρειες για το πώς και γιατί μπορούμε να δώσουμε ένα τέτοιο
ορισμό θα δούμε αργότερα. Αν γράφοντας τον κώδικα από λάθος πληκτρολογήσουμε pinmode, δεν θα
αλλάξει το χρώμα σε πορτοκαλί και θα το καταλάβουμε εύκολα.
Το μπλε χρώμα σημειώνει της σταθερές που αναγνωρίζει το περιβάλλον. Αυτές είναι σύμβολα για
συγκεκριμένες τιμές. Χρησιμοποιούνται για να μην χρειάζεται να θυμόμαστε μια τιμή (ας πούμε ένα αριθμό),
αν αυτή είναι δύσκολη, αλλά και για να διαβάζεται ο κώδικας πιο εύκολα. Για παράδειγμα, η αριθμητική τιμή
που δίνουμε για να ορίσουμε μία ακίδα ως έξοδο είναι 1. Η σταθερά OUTPUT συμβολίζει (αντιπροσωπεύει)
την τιμή 1. Το pinMode(13, OUΤPUT) είναι πιο σαφές για τον άνθρωπο από το pinMode(13, 1).
Επίσης δεν χρειάζεται να θυμόμαστε ποια είναι η αριθμητική τιμή για να ορίσουμε έξοδο.
Το μαύρο χρώμα είναι όλα τα άλλα στοιχεία του κώδικα και θα δούμε τις λεπτομέρειες καθώς θα
προκύπτουν σε παραδείγματα.
Παρατηρούμε ότι κάθε επιμέρους ακολουθία η τελειώνει με (;). Αυτό είναι ένα κομμάτι κώδικα που στην
αγγλική ορολογία λέγεται statement. Η πιο σωστή μεταφορά στα ελληνικά είναι «πρόταση». Όπως και η
προτάσεις στην «ανθρώπινη» γλώσσα περιγράφει πλήρως μία έννοια και μπορεί να σταθεί μόνη της. Η
πρόταση δεν τελειώνει στο τέλος της γραμμής αλλά μόνο όταν εμφανιστεί το (;). Θα μπορούσαμε δηλαδή να
γράψουμε και
pinMode(13,
HIGH);
Το κάθε κομμάτι είναι μία ρουτίνα ή συνάρτηση. Αγνοούμε προς το παρόν τη λέξη void, επισημαίνοντας ότι
είναι απλώς απαραίτητο να υπάρχει, τουλάχιστον για τις συγκεκριμένες ρουτίνες. Η επόμενη λέξη είναι το
όνομα της ρουτίνας, που ακολουθείται υποχρεωτικά από ένα ζεύγος παρενθέσεων. Η χρησιμότητα των
παρενθέσεων είναι πολύ συγκεκριμένη αλλά προς το παρόν απλά θα ξέρουμε ότι πρέπει να βρίσκονται εκεί.
Αμέσως μετά ανοίγει μία «καμπυλόγραμμη» αγκύλη που σημειώνει την αρχή του κώδικα της ρουτίνας. Ο
κώδικας της ρουτίνας κλείνει με την αντίστοιχη «καμπυλόγραμμη» αγκύλη.
Η ρουτίνα setup() πρέπει να υπάρχει πάντα σε ένα σχέδιο, έστω και κενή
void setup () {}.
Εκτελείται μία φορά όταν αρχίσει η εκτέλεση του σχεδίου και χρησιμοποιείται για να «στήσουμε» τον
Arduino για την εφαρμογή μας (να δηλώσουμε ποιες ακίδες θα είναι είσοδοι, ποιες έξοδοι και άλλα σχετικά).
Η ρουτίνα loop() πρέπει επίσης να υπάρχει πάντα και στην συντριπτική πλειοψηφία των περιπτώσεων
περιέχει τον λειτουργικό κώδικά μας (το κομμάτι που δίνει εντολές να ανάψουν φώτα, να ενεργοποιηθούν
κινητήρες, να «διαβαστούν» αισθητήρες κ.λ.π. Η setup() εκτελείται επαναλαμβανόμενη συνεχώς.
Η digitalWrite(13, HIGH) σημαίνει γράψε στην ακίδα 13 την τιμή HIGH. Η λέξη HIGH είναι
σταθερά του προγραμματιστικού περιβάλλοντος και αντιπροσωπεύει την τιμή 1. Πρακτικά σημαίνει «άναψε
ότι είναι συνδεδεμένο». Στην πραγματικότητα η λειτουργία είναι λίγο πιο σύνθετη αλλά προς το παρόν αυτό
μας αρκεί. Τα στοιχεία πού είναι μέσα στις παρενθέσεις λέγονται παράμετροι και είναι πληροφορίες που
χρειάζεται η εντολή για να κάνει αυτό που θέλουμε. Στην προκείμενη περίπτωση είναι η τιμή που θέλουμε να
γράψουμε και ο αριθμός της ακίδας στην οποία θέλουμε να τη γράψουμε.
Η digitalWrite(13, LOW) είναι αντίστοιχη με την προηγούμενη αλλά σημαίνει «σβήσε ότι είναι
συνδεδεμένο» (πάλι μία απλούστευση που προς το παρόν αρκεί). Η λέξη LOW είναι επίσης σταθερά και
αντιπροσωπεύει την τιμή 0.
Η delay(1000) σημαίνει περίμενε (μην κάνεις τίποτε) για 1 δευτερόλεπτο. Δίνουμε την τιμή 1000 γιατί η
delay() μετράει το χρόνο σε χιλιοστά του δευτερολέπτου. Για δύο δευτερόλεπτα δίνουμε 2000. Για μισό
δευτερόλεπτο δίνουμε 500 κ.ο.κ.
-8-
-9-
Στην κυανοπράσινη γραμμή με τις συντομεύσεις κάνουμε κλικ στο εικονίδιο με το βέλος . Σε λίγα
δευτερόλεπτα το πρόγραμμα θα έχει φορτωθεί και το LED της ακίδας 13 θα αναβοσβήνει.
Πρέπει να συνειδητοποιήσουμε ότι από τη στιγμή που το πρόγραμμα έχει φορτωθεί, ο Arduino λειτουργεί
αυτόνομα. Ο μόνος λόγος που τον αφήνουμε συνδεδεμένο με τον υπολογιστή είναι για να τροφοδοτείται με
ρεύμα. Μπορούμε αν θέλουμε να τον αποσυνδέσουμε και να τον τροφοδοτήσουμε με ένα κατάλληλο
τροφοδοτικό. Επίσης από τη στιγμή που έχει φορτωθεί το πρόγραμμα δεν σβήνεται ακόμα και αν
διακόψουμε την τροφοδοσία. Με την επαναφορά της αρχίζει να λειτουργεί και πάλι.
Μπορούμε εδώ να πειραματιστούμε αλλάζοντας τις τιμές στις προτάσεις delay() για να πετύχουμε
διαφορετικούς ρυθμούς.
4 Εξωστρέφεια.
Μέχρι στιγμής είδαμε τη βασική δομή ενός σχεδίου. Επίσης είδαμε το προγραμματιστικό περιβάλλον και πως
μπορούμε να «ανεβάσουμε» το σχέδιο στον Arduino. Τέλος είδαμε το σχέδιο σε λειτουργία και παίζοντας με
κάποιες τιμές μεταβάλλαμε αυτή τη λειτουργία.
Δεν είδαμε όμως πως μπορούμε να ελέγξουμε κάτι έξω από την πλακέτα του Arduino. Αυτή τη φορά, αντί να
αναβοσβήσουμε το ενσωματωμένο LED της ακίδας 13, θα αναβοσβήσουμε ένα εξωτερικό LED.
< VIR.>
Υπάρχουν περιορισμοί στο τι μπορούμε να συνδέσουμε σ’ ένα κύκλωμα και με ποιόν τρόπο. Αν συνδέσουμε
ένα λαμπάκι φακού στην πρίζα (μην το κάνετε ποτέ) θα καεί. Αν συνδέσουμε μία οικιακή λάμπα σε μπαταρία
-9-
-10-
δεν θα ανάψει. Για να είμαστε αποτελεσματικοί στο σχεδιασμό και υλοποίηση ηλεκτρικών κυκλωμάτων
πρέπει να ξέρουμε κάποιες βασικές αρχές. Επίσης θα ήταν καλό να μπορούμε να κάνουμε κάποιους
στοιχειώδεις υπολογισμούς.
Η πηγή είναι αυτή που «σπρώχνει» το ηλεκτρικό ρεύμα (ή απλά ρεύμα) για να τρέξει στο κύκλωμα. Σε ένα
αντίστοιχο υδραυλικό κύκλωμα θα ήταν η αντλία. Στην Εικόνα 4 η πηγή είναι στη δεξιά άκρη. Το μέγεθος
που περιγράφει τη δύναμη/δυνατότητα που έχει η πηγή να «σπρώξει» το ρεύμα ονομάζεται διαφορά τάσης
συμβολίζεται με V και μετριέται σε volt, που συμβολίζονται επίσης με V. Όπως ξέρουμε από τις μπαταρίες, η
πηγή έχει ένα θετικό πόλο (+) και ένα αρνητικό πόλο (-). Ο αρνητικός πόλος έχει κατά σύμβαση τάση 0V και
το σημείο στο οποίο συνδέεται στο κύκλωμα το λέμε γείωση. Σημειώνεται στο κύκλωμα με ένα τρίγωνο που
αποτελείται από οριζόντιες γραμμές (Εικόνα 4). Το σημείο στο οποίο συνδέεται ο θετικός πόλος της πηγής
λέγεται τάση τροφοδοσίας και έχει τάση την ονοματική τιμή της πηγής (1,5V μία κοινή μπαταρία, 5V για τον
Arduino). Σημειώνεται στο κύκλωμα (Εικόνα 4) με ένα σχήμα Τ που στο πάνω μέρος του γράφουμε την
ονομαστική τάση. Πολλές φορές σημειώνεται και με ένα βέλος που δείχνει προς τα πάνω. Βλέπουμε ότι τα
«θετικός» και «αρνητικός» αναφέρονται σε ένα σημείο που βρίσκεται ψηλότερα (μεγαλύτερη τιμή) και ένα
σημείο που βρίσκεται χαμηλότερα (μικρότερη τιμή) αντίστοιχα. ΔΕΝ αναφέρονται σε πάνω από το μηδέν και
κάτω από το μηδέν. Τα προαναφερθέντα σημαίνουν ότι η πηγή (και κατ’ επέκταση η τάση) εκτός από την
τιμή, έχει και φορά ή πολικότητα. Άρα η πηγή έχει γενικά ένα σωστό και ένα λάθος (ανάποδο) τρόπο να
συνδεθεί στο κύκλωμα. Στις συσκευές που τροφοδοτούνται από μπαταρία, σημειώνεται πάντα που πρέπει
να βρίσκεται ο θετικός πόλος και πού ο αρνητικός. Αντίστοιχα αν η πηγή είναι τοποθετημένη, υπάρχει ένας
σωστός και ένας λάθος (ανάποδος) τρόπος να συνδεθούν οι καταναλωτές. Αυτό δεν ισχύει απαραίτητα για
όλους τους καταναλωτές, αλλά πρέπει πάντα να το έχουμε υπ’ όψιν μας.
Το ηλεκτρικό ρεύμα είναι αυτό που μεταφέρει την ενέργεια μέσα από κύκλωμα προς τους καταναλωτές
(όπως, ας πούμε, το νερό που τρέχει σ’ ένα ρυάκι, μεταφέρει την ενέργεια που κινεί ένα νερόμυλο). Το
μέγεθος που περιγράφει πόσο ρεύμα «τρέχει» σε ένα κύκλωμα ονομάζεται ένταση, συμβολίζεται με I και
μετριέται σε Ampere, που συμβολίζονται με A. Όπως και η τάση, το ρεύμα εκτός από την τιμή του (0,5 Α ας
πούμε) έχει και φορά. Το ρεύμα τρέχει μέσα στο κύκλωμα, από το σημείο με την υψηλότερη τάση προς το
σημείο με τη χαμηλότερη τάση. Δηλαδή από το θετικό πόλο της πηγής προς τον αρνητικό. Στην Εικόνα 4 η
ροή του ρεύματος σημειώνεται με καμπύλα βέλη. Κάθε πηγή μπορεί να παρέχει ρεύμα μέχρι κάποια
συγκεκριμένη μέγιστη τιμή. Επίσης κάθε καταναλωτής μπορεί να ανεχθεί ροή ρεύματος μέχρι μία
συγκεκριμένη μέγιστη τιμή. Αν γίνει υπέρβαση αυτής της τιμής η πηγή ή ο καταναλωτής αντίστοιχα θα
καταστραφούν. --- έκλυση θερμότητας κ.λ.π. ----
Οι καταναλωτές είναι τα διάφορα εξαρτήματα και συσκευές που περιλαμβάνονται στο κύκλωμα.
Καταναλώνουν ενέργεια. Καταναλώνοντας την ενέργεια εμποδίζουν την ροή του ρεύματος στο κύκλωμα. Το
μέγεθος που περιγράφει το βαθμό στον οποίο ένας καταναλωτής εμποδίζει τη ροή του ρεύματος λέγεται
αντίσταση συμβολίζεται με R και μετριέται σε ohm (Ω). <πτώση τάσης>
Οι αγωγοί συνδέουν όλα τα άλλα στοιχεία μεταξύ τους και, πρακτικά, δεν καταναλώνουν ενέργεια ούτε
εμποδίζουν τη ροή του ρεύματος. Η αντίστασή τους είναι αμελητέα, πρακτικά μηδενική. Αν συνδέσουμε τον
αρνητικό και το θετικό πόλο μιας πηγής με έναν αγωγό, χωρίς να παρεμβάλλονται καταναλωτές, τότε
κάνουμε ένα βραχυκύκλωμα. Επειδή δεν υπάρχει κάτι που να εμποδίζει σημαντικά τη ροή του ρεύματος,
-10-
-11-
αυτή γίνεται πολύ μεγάλη και μπορεί, όπως προαναφέρθηκε, να καταστρέψει την πηγή. Αν
βραχυκυκλώσουμε μία μπαταρία, μπορεί (ακραία) να εκραγεί.
Στα κυκλώματα, κάθε συνεχής γραμμή, που περιλαμβάνει καταναλωτές και δεν περιλαμβάνει διακλαδώσεις,
ονομάζεται κλάδος.
Κάθε σημείο στο οποίο ενώνονται κλάδοι, ονομάζεται κόμβος.
Αν μία γραμμή ενώνει δύο κόμβους αλλά δεν περιλαμβάνει καταναλωτές, τότε δεν είναι κλάδος και οι δύο
κόμβοι ενώνονται σε έναν (τους θεωρούμε και είναι και πρακτικά ένας) .
Καταναλωτές που είναι συνδεδεμένοι στον ίδιο κλάδο, λέμε ότι είναι συνδεδεμένοι εν σειρά (Εικόνα 4, R3
και R4).
Καταναλωτές που είναι συνδεδεμένοι σε διαφορετικούς κλάδους, που αρχίζουν και καταλήγουν στους ίδιους
κόμβους λέμε ότι είναι συνδεδεμένοι παράλληλα (Εικόνα 4, R1 και R2 καθώς και ο συνδυασμός των R3 και
R4).
Στην πραγματικότητα το LED Είναι μία Φωτοεκπέμπουσα Δίοδος (Light Emitting Diode). Η δίοδος είναι ένα
εξάρτημα (καταναλωτής) που επιτρέπει στο ρεύμα να περνά από μέσα του μόνο κατά τη μία κατεύθυνση.
Άρα έχει σωστή και ανάποδη σύνδεση δηλαδή πολικότητα. Στην προκειμένη περίπτωση λέγεται
Φωτοεκπέμπουσα γιατί όταν περνάει ρεύμα από μέσα της, εκπέμπει φώς.
Βλέπουμε ότι το LED έχει δύο ακίδες (ποδαράκια) και ένα «κεφάλι». Βλέπουμε επίσης ότι το ένα ποδαράκι
είναι μακρύτερο. Το μακρύτερο ποδαράκι είναι ο θετικός πόλος και λέγεται άνοδος. Το κοντύτερο ποδαράκι
είναι ο αρνητικός πόλος και λέγεται κάθοδος. Επίσης παρατηρούμε ότι στην θέση της καθόδου η βάση του
κεφαλιού είναι πεπλατυσμένη. Αυτό μας βοηθά να ξεχωρίσουμε την κάθοδο από την άνοδο στην περίπτωση
που τα ποδαράκια είναι κομμένα. Κατά τη σύνδεση, για να περάσει ρεύμα και να ανάψει, η άνοδος πρέπει
να βρίσκεται προς το θετικό πόλο της πηγής και η κάθοδος προς τον αρνητικό. Αν το συνδέσουμε ανάποδα,
δεν θα περάσει ρεύμα και δεν θα ανάψει. Επίσης, και προφανώς, αν συνδέσουμε και τα δύο ποδαράκια στο
θετικό πόλο ή και τα δύο ποδαράκια στον αρνητικό πόλο το LED δεν θα ανάψει. Όταν το LED επιτρέπει να
περνά ρεύμα από μέσα του λέμε ότι άγει.
Όταν ένα LED άγει, έχει πρακτικά μηδενική αντίσταση. Άρα συμπεριφέρεται σαν αγωγός. Συνεπώς αν
συνδέσουμε ένα LED απευθείας στην πηγή θα προκαλέσουμε βραχυκύκλωμα. Για να το αποφύγουμε αυτό,
-11-
-12-
συνδέουμε πάντα το LED σε σειρά με έναν αντιστάτη. Τη ακριβή διάταξη αυτής της σύνδεσης θα τη δούμε
λίγο παρακάτω. Ο αντιστάτης είναι ένας καταναλωτής, που η μόνη του λειτουργικότητα είναι να εμποδίζει
(περιορίζει) τη ροή του ρεύματος στο κύκλωμα. Χαρακτηρίζεται από την αντίστασή του σε ohm (Ω).
Συνηθίζεται (κακώς) ο αντιστάτης να λέγεται αντίσταση. Αυτό μπορεί να προκαλέσει σύγχυση μεταξύ του
μεγέθους και του καταναλωτή (εξαρτήματος).
Έχει υποδοχές στις οποίες μπορούν να «κουμπώσουν» ηλεκτρικά και ηλεκτρονικά εξαρτήματα καθώς και
καλώδια για τη διασύνδεσή τους. Επειδή τα διάφορα εξαρτήματα ακολουθούν αυστηρά ένα πρότυπο για το
μέγεθος και της αποστάσεις των ακίδων τους και των ακροδεκτών τους είναι εύκολο να κατασκευάσουμε μια
τέτοια πλάκα στην οποία να μπορούμε να «κουμπώσουμε οποιοδήποτε από αυτά. Εγκυκλοπαιδικά, η
μικρότερη απόσταση μεταξύ ακίδων είναι 2.54mm (χιλιοστά). Όλες οι μεγαλύτερες αποστάσεις είναι ακέραια
πολλαπλάσια αυτής της βασικής. Η επιλογή του 2.54 φαίνεται περίεργη αλλά το πρότυπο σχεδιάστηκε σε
ίντσες· 2.54mm είναι 1/10 της ίντσας.
Οι υποδοχές της πλάκας είναι συνδεδεμένες μεταξύ τους σε ράγες (εσωτερικά διασυνδεδεμένες σε ενιαίους
αγωγούς) με τη διάταξη που φαίνεται στην εικόνα 4. Υπάρχουν συνήθως τέσσερεις οριζόντιες μεγάλες ράγες,
παράλληλες με τις μεγάλες πλευρές της πλάκας. Χρειάζεται προσοχή γιατί μπορεί αυτές οι ράγες να είναι
χωρισμένες στα δύο όπως φαίνεται στο πάνω μέρος της εικόνας 4. Υπάρχουν επίσης μερικές πλάκες που
έχουν μόνο δύο μεγάλες ράγες, μία σε κάθε πλευρά. Οι υπόλοιπες υποδοχές είναι συνδεδεμένες σε
κατακόρυφες πεντάδες, παράλληλες με τις μικρές πλευρές της πλάκας.
Τις μεγάλες ράγες τις χρησιμοποιούμε για να συνδέσουμε της πηγή μας, μία για το θετικό πόλο και μία για
τον αρνητικό σε κάθε πλευρά. Τις μικρές ράγες τις χρησιμοποιούμε για συνδέουμε τα διάφορα εξαρτήματα.
Τα ολοκληρωμένα κυκλώματα που έχουν δύο σειρές από ακίδες τα συνδέουμε πάντα στο κέντρο με τις
ακίδες εκατέρωθεν του κεντρικού κενού. Ακροδέκτες και ακίδες που είναι συνδεδεμένα στην ίδια ράγα είναι
συνδεδεμένα και μεταξύ τους.
Κατά σύμβαση χρησιμοποιούμε κόκκινο χρώμα για ότι είναι συνδεδεμένο στην τάση τροφοδοσίας και μαύρο
για ότι είναι συνδεδεμένο στη γείωση. Αν η πλάκα μας έχει τις μεγάλες ράγες κωδικοποιημένες χρωματικά
είναι καλό να χρησιμοποιούμε τις κόκκινες για την τάση τροφοδοσίας και τις μπλε (θα έπρεπε να είναι
μαύρες κανονικά) για τη γείωση. Επίσης θα είναι καλό η τάση τροφοδοσίας να είναι πάνω από τη γείωση
όπως κοιτάμε την πλάκα. Καλώδια που συνδέονται στη τάση τροφοδοσίας είναι καλό να είναι κόκκινα·
καλώδια που συνδέονται στη γείωση είναι καλό να είναι μαύρα. Επίσης είναι καλό να αποφεύγουμε αυτά τα
χρώματα για άλλες συνδέσεις. Οι τήρηση των συμβάσεων κάνει το κύκλωμά μας πιο «ευανάγνωστο». Αν για
-12-
-13-
οποιοδήποτε λόγο δεν μπορούμε να τηρήσουμε τα παραπάνω είναι καλό να κάνουμε μια δική μας
κωδικοποίηση και να την τηρούμε.
Οι τρεις άλλες λωρίδες (οι τρεις πρώτες) αντιπροσωπεύουν το μέγεθος του αντιστάτη. Τα χρώματα
αντιπροσωπεύουν μονοψήφιους αριθμούς κατά τον πίνακα
Μαύρο Καφέ Κόκκινο Πορτοκαλί Κίτρινο Πράσινο Μπλε Μώβ Γκρί Λευκό
0 1 2 3 4 5 6 7 8 9
Η σειρά των κορεσμένων χρωμάτων είναι κατά τη σειρά του ουράνιου τόξου. Τα δύο πρώτα χρώματα είναι τα
πιο σκοτεινά και τα δύο τελευταία είναι τα πιο φωτεινά από τα ακόρεστα.
Πίσω στις λωρίδες. Το μέγεθος του αντιστάτη γράφεται με τους αριθμούς που προκύπτουν από τις δύο
πρώτες λωρίδες, ακολουθούμενους από τόσο μηδενικά όσα υποδεικνύει η τρίτη λωρίδα.
ΠΡΩΤΗ ΛΩΡΙΔΑ
ΔΕΥΤΕΡΗ ΛΩΡΙΔΑ
ΤΡΙΤΗ ΛΩΡΙΔΑ
ΤΙΜΗ ΜΕ ΠΟΛΛΑΠΛΑΣΙΑΣΤΗ
ΜΕ ΔΙΑΧΩΡΙΣΤΙΚΑ Κ = ΧΙΛΙΑΔΕΣ (ΚΙΛΟ)
ΑΠΟΚΩΔΙΚΟΠΟΊΗΣΗ ΧΙΛΙΑΔΩΝ Μ = ΕΚΑΤΟΜΥΡΙΑ (ΜΕΓΑ)
Όταν γράφουμε την τιμή HIGH σε μία ακίδα ψηφιακής εξόδου ουσιαστικά δίνουμε εντολή στον Arduino να
συνδέσει (εσωτερικά) αυτή την ακίδα με το θετικό πόλο της πηγής. Άρα αυτή η ακίδα θα έχει τάση 5V και θα
-13-
-14-
είναι ισοδύναμη με το θετικό πόλο της πηγής. Αντίστοιχα όταν γράφουμε την τιμή LOW δίνουμε την εντολή
να συνδεθεί η ακίδα με τη γείωση (0V).
Για το παράδειγμα αυτό θα συνδέσουμε ένα LED στην ακίδα 9 του ARDUINO. Θα χρησιμοποιήσουμε την ίδια
διάταξη που χρησιμοποιήσαμε προηγουμένως για να το τροφοδοτήσουμε από την πηγή με μοναδική
διαφορά ότι η άκρη του αντιστάτη που συνδέονταν στο θετικό πόλο της πηγής θα συνδέεται τώρα με την
ακίδα 9. Όταν γράψουμε την τιμή HIGH στην ακίδα 9 θα έχουμε σύνδεση από την τάση τροφοδοσίας στη
γείωση και το LED θα είναι αναμμένο. Όταν γράψουμε LOW στην ακίδα 9 θα έχουμε σύνδεση από τη γείωση
στη γείωση και το LED δεν θα ανάψει.
Το κάθε γράμμα αντιπροσωπεύεται από μία ομάδα από τελείες και παύλες. Αν πρόκειται για μετάδοση με
φως, η τελεία αντικαθίσταται από μικρής διάρκειας αναλαμπή και ή παύλα από μεγάλης διάρκειας
αναλαμπή. Η ίδια λογική ισχύει και για ηχητική μετάδοση.
-14-
-15-
Οι διάρκειες των στοιχείων του κώδικα ακολουθούν τη λογική του παρακάτω πίνακα:
Α .- Η .... Ν -. Τ -
B -... Θ -.-. Ξ -..- Y -.--
Γ -- Ι .. Ο --- Φ ..-.
Δ -.. Κ -.- Π .--. Χ ----
Ε . Λ .-.. Ρ .-. Ψ --.-
Ζ --.. Μ -- Σ ... Ω .--
Πίνακας 3. Ελληνικά γράμματα σε κώδικα Morse
Θα επιλέξουμε αρχικά τη διάρκεια που επιθυμούμε για την τελεία (σύντομη αναλαμπή). Ας ορίσουμε αυτή τη
διάρκεια στο μισό δευτερόλεπτο (0,5s). Από αυτή την επιλογή προκύπτει ότι η διάρκεια της παύλας
(μακρύτερης αναλαμπής πρέπει να είναι 3x0,5 = 1,5s (ενάμιση δευτερόλεπτο).
Πρέπει να υπολογίσουμε επίσης τα διαστήματα ανάμεσα στις αναλαμπές. Θα θεωρήσουμε το SOS λέξη.
Σύμφωνα πάλι με τα όσα είπαμε παραπάνω τα διαστήματα ανάμεσα σε στοιχεία (τελείες ή παύλες) που
ανήκουν στο ίδιο γράμμα είναι ίσα σε διάρκεια με την τελεία, δηλαδή 0,5s (μισό δευτερόλεπτο). Τα
διαστήματα ανάμεσα σε γράμματα είναι τριπλάσια από την τελεία (όσο και η παύλα), δηλαδή 1,5s. Θα
-15-
-16-
θεωρήσουμε το SOS σαν λέξη. Ανάμεσα σε διαδοχικές εκπομπές του SOS θα έχουμε διάστημα λέξης, δηλαδή
7x0,5 = 3,5s.
5.3 Υλοποίηση
Για τη μετάδοση του σήματος SOS σ΄ αυτό το παράδειγμα θα χρησιμοποιήσουμε απλά ένα LED. Το κύκλωμα
είναι το ίδιο που χρησιμοποιήσαμε στο προηγούμενο παράδειγμα. Πρέπει απλά να προσέξουμε ότι το LED
είναι συνδεδεμένο στην ακίδα που θα χρησιμοποιήσουμε στο σχέδιο παρακάτω (την 9).
Τα στοιχεία που χρειαζόμαστε για το σχέδιό μας είναι επίσης γνωστά αφού το μόνο που χρειάζεται να
κάνουμε είναι να αναβοσβήνουμε ένα LED. Η λογική του κώδικα είναι απλή.
Είναι καλό να προσπαθήσουμε να γράψουμε όλο τον κώδικα μόνοι μας. Ο πλήρης και λειτουργικός κώδικας
υπάρχει στο παράδειγμα SOS.
6 Μεταβλητές
Το σχέδιο που γράψαμε κάνει αυτό που θέλουμε σωστά. Αν όμως θέλουμε κάθε φορά που το
χρησιμοποιούμε να μπορούμε να συνδέσουμε το LED σε διαφορετική ακίδα, τα πράγματα μπερδεύονται. Η
αναφορά στον αριθμό της ακίδας υπάρχει σε 19 σημεία του κώδικα. Θα μπορούσαμε βέβαια κάθε φορά να
εντοπίζουμε αυτά τα σημεία και να αλλάζουμε τον αριθμό της ακίδας. Θα μπορούσαμε επίσης να γράφουμε
19 διαφορετικά σχέδια (τόσες είναι οι διαθέσιμες ακίδες), ένα για κάθε ακίδα. Και οι δύο λύσεις είναι
χρονοβόρες, δυσλειτουργικές και άκομψες.
Υπάρχει ευτυχώς καλύτερη λύση. Μπορούμε να χρησιμοποιήσουμε μία μεταβλητή. Η μεταβλητή είναι ένα
«κουτί» στο οποίο δίνουμε ένα όνομα (ας πούμε «κουτί 1»). Μέσα στο κουτί μπορούμε να βάλουμε έναν
αριθμό. Μπορούμε επίσης όποτε χρειάζεται να αλλάζουμε αυτόν τον αριθμό. Όταν χρησιμοποιούμε το
όνομα της μεταβλητής στον κώδικά μας, δίνουμε εντολή να χρησιμοποιηθεί ο αριθμός που περιέχει το κουτί.
Στην περίπτωσή μας μπορούμε να βάλουμε το αριθμό 9 στο «κουτί 1». Κατόπιν για digitalWrite(9, HIGH), να
γράφουμε digitaWrite(«κουτί 1», HIGH). Αυτό σημαίνει γράψε στην ακίδα με τον αριθμό που περιέχεται στο
«κουτί 1» (μεταβλητή) την τιμή HIGH. Αν θέλουμε να αλλάξουμε το αριθμό της ακίδας στη οποία είναι
συνδεδεμένο το LED απλά πρέπει να αλλάξουμε τον αριθμό που περιέχει ή μεταβλητή, να τον κάνουμε ας
πούμε 13. Ο υπόλοιπος κώδικας θα παραμείνει ίδιος γιατί κάθε αναφορά στο «κουτί 1» θα παραπέμπει τώρα
στον αριθμό 13, τη νέα τιμή της μεταβλητής.
Για να χρησιμοποιήσουμε μία μεταβλητή στον κώδικά μας πρέπει πράτα να τη δηλώσουμε και μετά να της
δώσουμε μία τιμή.
-16-
-17-
Για να δηλώσουμε μία μεταβλητή πρέπει πρώτα να ορίσουμε τον τύπο της (αν είναι ακέραιος αριθμός,
πραγματικός αριθμός, γράμμα κ.λ.π.), και μετά το όνομά της. Προς το παρών θα μας χρειάζονται μόνο
ακέραιες μεταβλητές. Χρησιμοποιούμε της ακόλουθη πρόταση:
int akidaLed;
Το int είναι συντόμευση του integer που σημαίνει ακέραιος. Το akidaLed είναι το όνομα της μεταβλητής και
είναι δική μας επιλογή. Θα μπορούσε επίσης να είναι led ή akida ή fotaki ή metabliti1 ή agriotoumpanos ή
xq8rfDv. Αυτά τα ονόματα όμως δεν περιγράφουν ακριβώς (ή και καθόλου) τη χρήση της μεταβλητής και
κάνουν τον κώδικα δυσανάγνωστο.
Για να δώσουμε μία τιμή στη μεταβλητή χρησιμοποιούμε την ακόλουθη πρόταση:
Το σύμβολο -= όταν γράφουμε στη γλώσσα προγραμματισμού του Arduino σημαίνει ορισμό τιμής σε
μεταβλητή, και μόνο ορισμό τιμής σε μεταβλητή. Όλες οι άλλες έννοιες που μπορεί να έχουμε στο μυαλό μας
εδώ δεν ισχύουν.
Μπορούμε επίσης να δώσουμε μία αρχική τιμή στη μεταβλητή κατά τη δήλωσή της με την πρόταση:
int akidaLed = 9;
Προς το παρόν θα κάνουμε όλες τις δηλώσεις των μεταβλητών στην αρχή του κώδικα ΠΡΙΝ από τη ρουτίνα
setup(). Οι μεταβλητές μπορούν να δηλωθούν και σε άλλα σημεία, αλλά η λειτουργικότητά τους θα είναι
διαφορετική και δεν χρειάζεται να δούμε να μπούμε σε τόση λεπτομέρεια αυτή τη στιγμή.
Ο κώδικας για την εκπομπή του SOS με χρήση μεταβλητής για τον αριθμό της ακίδας υπάρχει στο
παράδειγμα SOSmetablitiAkida
Θα μπορούσαμε να χρησιμοποιήσουμε μία μεταβλητή για κάθε μία από αυτές και να της δίνουμε την
επιθυμητή τιμή. Τα ονόματα των μεταβλητών θα μπορούσαν να είναι mikriDiarkeia, meseaDiarkeia,
-17-
-18-
Είναι όμως καλύτερο να χρησιμοποιήσουμε ξεχωριστή μεταβλητή για κάθε λειτουργική διάρκεια του κώδικα
Morse, έστω και αν οι τιμές μερικών απ’ αυτές συμπίπτουν. Όπως ήδη είπαμε αυτό θα κάνει τον κώδικα πιο
ευανάγνωστο. Για παράδειγμα diarkTel, diarkPav, diastStoix, diastGramm, diastLeks. Οι δηλώσεις έχουν ως
εξής:
Ξέρουμε όμως ότι οι διάρκειες ορίζονται ως πολλαπλάσια της διάρκειας της τελείας. Θα ήταν λοιπόν
προτιμότερα να ορίζουμε μόνο τη διάρκεια της τελείας και οι υπόλοιπες να υπολογίζονται με ένα
πολλαπλασιασμό. Έτσι περιορίζουμε, ουσιαστικά μηδενίζουμε την πιθανότητα λάθους.
Τα σημεία που χρησιμοποιούμε για να δηλώσουμε αριθμητική πράξη λέγονται τελεστές. Στη γλώσσα
προγραμματισμού του Arduino χρησιμοποιούμε διαφορετικούς από τους συνηθισμένους τελεστές για τον
πολλαπλασιασμό και τη διαίρεση. Κατά τα άλλα η σύνταξη (δομή) είναι η ίδια μ’ αυτή που έχουμε συνηθίσει
<αριθμός><τελεστής><αριθμός> (5+3, 6-2, 8*3, 12/4).
Για να δηλώσουμε λοιπόν τις μεταβλητές και να ορίσουμε τη διάρκεια της τελείας και τη διάρκεια των
υπολοίπων βάση της διάρκειας της τελείας χρησιμοποιούμε τις ακόλουθες προτάσεις.
Επίσης στον υπόλοιπο κώδικα αντί να χρησιμοποιούμε σταθερούς αριθμούς για να δηλώσουμε τη διάρκεια
χρησιμοποιούμε τις αντίστοιχες μεταβλητές:
digitalWrite(akidaLed, HIGH);
delay(diarkTel);
digitalWrite(akidaLed, LOW);
delay(diarkStoix);
κ.ο.κ.
Τώρα για να αλλάξουμε το ρυθμό μετάδοσης αρκεί να αλλάξουμε την τιμή για τη διάρκεια της τελείας
(μεταβλητή diarkTel). Όλες οι τιμές των άλλων μεταβλητών θα υπολογιστούν αυτόματα και θα ακολουθούν
εγγυημένα το πρότυπο του κώδικα Morse (εκτός αν έχουμε κάνει εμείς καμιά ανοησία γράφοντας τον
κώδικα). Ο πλήρης κώδικας υπάρχει στο παράδειγμα SOSmetavlitiDiarkeia.
-18-
-19-
Θα δούμε την απλούστερη περίπτωση. Θα διαβάζουμε μία ψηφιακή είσοδο στην οποία θα συνδέσουμε ένα
διακόπτη στιγμιαίο διακόπτη. Ο διακόπτης αυτός είναι ενεργοποιημένος όσο τον πατάμε και
απενεργοποιείται όταν τον αφήσουμε. Αν ο διακόπτης είναι ενεργοποιημένος θα ανάβει ένα LED που θα
συνδέσουμε σε μία ψηφιακή έξοδο. Αν είναι απενεργοποιημένος το LED θα παραμένει σβηστό.
Ο διακόπτης πρέπει να συνδεθεί σε συνδυασμό με έναν αντιστάτη με συγκεκριμένο τρόπο, που φαίνεται στη
Εικόνα 11. Αν προσπαθήσουμε να δούμε το γιατί τώρα, μάλλον θα μπερδευτούμε περισσότερο. Απλά πρέπει
να ξέρουμε ότι αυτός είναι ο σωστός τρόπος. Το LED ξέρουμε ήδη πως συνδέεται.
Από άποψη κώδικα όλα τα στοιχεία που χρειαζόμαστε τα έχουμε δει εκτός από τον τρόπο που διαβάζουμε
την ακίδα ψηφιακής εισόδου. Για το σκοπό αυτό χρησιμοποιούμε την εντολή digitalRead(). Όπως
προηγουμένως ορίσαμε την χρησιμοποιούμενη ακίδα σαν έξοδο μπορούμε να ορίσουμε τώρα την ακίδα σαν
είσοδο pinMode(2, INPUT). Δεν είναι όμως απαραίτητο γιατί αρχικά όταν ενεργοποιηθεί ο Arduino
όλες οι ακίδες είναι ορισμένες σαν είσοδοι. Πρέπει πρώτα να ορίσουμε μία μεταβλητή στην οποία θα
βάζουμε την τιμή που θα διαβάζει η digitalRead() από την ακίδα. Έστω ότι τη μεταβλητή την
ονομάζουμε katastasiDiakopti και ο διακόπτης είναι συνδεδεμένος στην ακίδα 2. Η πρόταση που θα
χρησιμοποιήσουμε για το διάβασμα του διακόπτη είναι:
katastasiDiakopti = digitalRead(2);
Βλέπουμε δύο διαφορές. Κατ’ αρχήν ενώ η digitalWrite() είχε δύο παραμέτρους, η digitalRead() έχει
μόνο μία παράμετρο: τον αριθμό της ακίδας την οποία θέλουμε να διαβάσουμε. Προφανώς δεν υπάρχει
ανάγκη να ορίσουμε κάποια τιμή σε παράμετρο. Η δεύτερη διαφορά είναι ότι ενώ η digitalWrite()
χρησιμοποιείται μόνη της, η digitalRead() χρησιμοποιείται σε συνδυασμό με μία μεταβλητή. Αυτό
συμβαίνει γιατί όταν εκτελεστεί η digitalWrite() γράφει μία τιμή στην ακίδα, η τιμή παραμένει στην
ακίδα μέχρι να την αλλάξουμε και η δουλειά της εντολής έχει τελειώσει. Όταν όμως χρησιμοποιήσουμε την
digitalRead() η τιμή που διαβάζουμε υπάρχει στιγμιαία. Αν θέλουμε να τη χρησιμοποιήσουμε
αργότερα πρέπει να τη βάλουμε σε μία μεταβλητή. Μετά μπορούμε να χρησιμοποιούμε αυτή τη μεταβλητή
για να κάνουμε ότι χρειαστεί αφού η τιμή θα παραμείνει εκεί μέχρι να την αλλάξουμε.
Για την ολοκλήρωση της εφαρμογής θα συνδέσουμε ένα LED στην ακίδα 9. Ο πλήρης λειτουργικός κώδικας
υπάρχει στο παράδειγμα DiabasmaDiakopti.
-19-
-20-
Για να γράψουμε μία αναλογική τιμή στην ακίδα χρησιμοποιούμε την analogWrite() που παίρνει σαν
παραμέτρους τον αριθμό της ακίδας, και την τιμή που θέλουμε να γράψουμε:
Όπως έχουμε ήδη πει οι τιμές που μπορούμε να γράψουμε σε μία αναλογική έξοδο είναι ακέραιοι από 0 ως
255. Δείτε το παράδειγμα AnalogikiEksodosEllipes σαν άσκηση και το AnalogikiEksodos σαν λύση. Για το
παράδειγμα αυτό πρέπει να συνδέσουμε ένα LED στην ακίδα 6 όπως ακριβώς το συνδέσαμε σε άλλες ακίδες
σε προηγούμενα παραδείγματα. Το LED θα ανάβει σε διάφορες εντάσεις για μισό δευτερόλεπτο κάθε φορά.
Σαν παράδειγμα θα διαβάσουμε ένα ποτενσιόμετρο και θα χρησιμοποιήσουμε τη δυνατότητα του Arduino
να στέλνει πληροφορία στην οθόνη του υπολογιστή για να βλέπουμε την τρέχουσα τιμή της εισόδου.
-20-
-21-
Όλα τα ποτενσιόμετρα έχουν τρείς ακίδες σύνδεσης. Πάντα είναι κατασκευασμένα κατά τρόπο που να είναι
ευδιάκριτες δύο ακραίες ακίδες και μία μεσαία. Οι ακραίες ακίδες συνδέονται μία στην τάση τροφοδοσίας
και μία στη γείωση. Το ποτενσιόμετρο δεν έχει πολικότητα άρα δεν έχει σημασία ποια από τις ακραίες ακίδες
θα συνδεθεί στη τάση τροφοδοσίας και ποια στη γείωση. Η μεσαία ακίδα συνδέεται στην αναλογική είσοδο
του Arduino.
9.2.2 Πως γράφουμε πληροφορία από τον Arduino στην οθόνη του υπολογιστή.
Η δυνατότητα να γράφουμε στην οθόνη του υπολογιστή μας βοηθάει να εντοπίσουμε τυχόν λάθη στη
λειτουργικότητα του σχεδίου μας και να έχουμε καλύτερη εποπτεία της λειτουργίας της εφαρμογής μας. Εδώ
θα τη χρησιμοποιήσουμε για να δούμε πως μεταβάλλεται η τιμή μιας αναλογικής εισόδου όταν χειριζόμαστε
ένα ποτενσιόμετρο συνδεδεμένο σ’ αυτή.
Για να ενεργοποιήσουμε την δυνατότητα πρέπει κατ’ αρχήν να συμπεριλάβουμε την ακόλουθη πρόταση στη
setup():
Serial.begin(9600);
Αυτό λέει στον Arduino να αρχίσει (begin) σειριακή επικοινωνία (Serial) με τον υπολογιστή με ταχύτητα
9600bps. Το τι ακριβώς σημαίνει «σειριακή» και τι ακριβώς σημαίνει η ταχύτητα σε bps δεν έχει ιδιαίτερη
σημασία. Κρατάμε μόνο τις βασικές έννοιες «άρχισε» «επικοινωνία» στα «9600». Επίσης δεν
πειραματιζόμαστε με την ταχύτητα διότι μπορεί να έχει μόνο πολύ συγκεκριμένες τιμές και στις
περισσότερες εφαρμογές η ρύθμισή της δεν μπορεί να φέρει σημαντική βελτίωση.
Επιπλέον η πληροφορία γράφεται σε ειδικό παράθυρο στον υπολογιστή που στα αγγλικά λέγεται Serial
Monitor. Για να το ανοίξουμε πρέπει να χρησιμοποιήσουμε το εικονίδιο πάνω δεξιά στο
προγραμματιστικό περιβάλον, ή να επιλέξουμε από το μενού Εργαλεία->Παρακολούθηση σειριακής. Αν δεν
-21-
-22-
ανοίξουμε αυτό το παράθυρο, δεν θα βλέπουμε την πληροφορία· κατά τα άλλα το πρόγραμμα θα λειτουργεί
κανονικά.
Για να γράψουμε κάτι στη οθόνη του υπολογιστή χρησιμοποιούμε μέσα στη loop() τις εντολές
Serial.print()και Serial.println(). Θα δούμε πρακτικά με το παρακάτω παράδειγμα πως
λειτουργούν σε συνδυασμό με το διάβασμα μιας αναλογικής εισόδου. Ο κώδικας υπάρχει και στο
παράδειγμα AnologikiEisodosKaiSeiriaki.
int analogikiA0;
void setup(){
Serial.begin(9600);
}
void loop(){
analogikiA0 = analogRead(Α0);
Serial.print("H timi tis akidas einai: ");
Serial.println(analogikiA0);
}
Πρέπει πλέον να αναγνωρίζουμε ότι η πρώτη γραμμή είναι μια δήλωση ακέραιης μεταβλητής με όνομα
analogikiA0.
Στη setup() δίνουμε εντολή να αρχίσει η σειριακή επικοινωνία για να μπορούμε να στέλνουμε πληροφορία
στην οθόνη του υπολογιστή.
Στη loop() διαβάζουμε κατ΄ αρχήν την τιμή της αναλογικής εισόδου με την analogRead(). Επειδή
Μετά γράφουμε την πληροφορία στην οθόνη. Όλες οι εντολές που έχουν σχέση με την σειριακή επικοινωνία
αρχίζουν με «Serial.» (σημειώστε την τελεία). Ας πούμε εδώ απλουστευτικά ότι αυτό γίνεται για να
διευκρινίζεται ότι είναι εντολές που σχετίζονται με τη σειριακή επικοινωνία και όχι κοινές εντολές. Αν η
παράμετρος της print() ή της println()είναι κείμενο μέσα σε εισαγωγικά, τότε γράφουν αυτούσιο το
κείμενο (η χρήση των εισαγωγικών είναι εννοιολογικά ίδια με τη χρήση τους σε ένα απλό κείμενο). Αν η
παράμετρος δεν περικλείεται σε εισαγωγικά, τότε θεωρείται ότι είναι όνομα μεταβλητής και γράφεται η τιμή
της (και όχι το όνομά της). Η διαφορά ανάμεσα στη print() και την println() είναι ότι η println()
όταν τελειώσει στέλνει και αλλαγή γραμμής αντίθετα από την print(). Για παράδειγμα με τον παραπάνω
κώδικα το αποτέλεσμα στην οθόνη θα είναι κάτι σαν:
H timi tis akidas einai: 576H timi tis akidas einai: 435H timi tis akidas
einai: 367 . . .
Χρησιμοποιώντας κατάλληλα τις δύο εντολές μπορούμε να διαμορφώσουμε το κείμενο στην οθόνη για να
είναι πιο ευανάγνωστο και λειτουργικό.
Η λύση είναι να διαιρέσουμε την τιμή που διαβάσαμε με το 4 και να δώσουμε στην analogWrite το
αποτέλεσμα της διαίρεσης. Σημειώνεται ότι όταν διαιρούμε ακεραίους (μεταβλητές ορισμένες σαν
ακεραίους και συγκεκριμένους αριθμούς χωρίς υποδιαστολή) στον κώδικά μας, το αποτέλεσμα είναι το
πηλίκο της διαίρεσης (ακέραιο) και το υπόλοιπο απλά αγνοείται. Παραδείγματα: 6/3=2, 7/3=2, 8/3=2, 9/3=3
και προσοχή στο 0/3=0, 1/3=0, 2/3=0, 3/3=1.
Με αυτή τη λογική η μέγιστη τιμή που θα διαβάσουμε θα μετατραπεί σε 1023/4=255 που είναι η μέγιστη
τιμή για την έξοδο· η ελάχιστη τιμή που θα διαβάσουμε είναι το 0 και θα παραμείνει 0 (ελάχιστη)· η τιμή 512
που είναι ακριβώς στη μέση των τιμών εισόδου θα μετατραπεί σε 512/4 =128 που είναι ακριβώς στη μέση
των τιμών εξόδου.
Ομοίως όλες οι άλλες τιμές θα μετατραπούν αναλογικά. Η αναλογία είναι το μόνο που μας ενδιαφέρει στην
αναλογική είσοδο και έξοδο. Αν διαβάσουμε μία τιμή που είναι τα 3/7 της μέγιστης τιμής εισόδου, για να
πετύχουμε ένα αντίστοιχο αποτέλεσμα σε μία έξοδο πρέπει απλά να γράψουμε μία τιμή που αντιστοιχεί στα
3/7 της μέγιστης τιμής εξόδου. Map(v,s1,e1,s2,e2) function
Ας υποθέσουμε ότι έχουμε δύο LED και ένα στιγμιαίο διακόπτη. Θέλουμε να ανάβουμε το ένα LED όταν ο
διακόπτης είναι ενεργοποιημένος και το άλλο όταν δεν είναι. Πρέπει να μπορούμε να διαβάζουμε την
κατάσταση του διακόπτη, όπως ήδη κάναμε, και μετά ανάλογα να εκτελούμε μόνο τις εντολές που ανάβουν
το ένα LED ή μόνο τις εντολές που ανάβουν το άλλο.
Διάβασε την ακίδα του διακόπτη (ας πούμε την 4) και βάλε την τιμή στη μεταβλητή katastasiDiakopti.
Αν η τιμή της μεταβλητής είναι HIGH, άναψε το LED ακίδα 9 και σβήσε το LED στην ακίδα 10.
Αλλιώς άναψε το LED στην ακίδα 10 και σβήσε το LED στην ακίδα 9.
Παρατήρηση: Στην απλή περιγραφή λέμε απλά άναψε το ένα LED ή το άλλο. Για την εφαρμογή όμως όταν
πρέπει να ανάψει το ένα LED πρέπει ταυτόχρονα να σβήσει το άλλο. Ας πούμε ότι ο διακόπτης δεν είναι
ενεργοποιημένος και κατά συνέπεια δίνουμε εντολή
-23-
-24-
Ας το δούμε τώρα σε κώδικα (εννοείται ότι έχουμε ήδη δηλώσει τις μεταβλητές μας, έχουμε ορίσει την έξοδο
κ.λπ.)
katastasiDiakopti = digitalRead(4);
if (katastasiDiakopti == HIGH){
digitalWrite(9, HIGH);
digitalWirte(10, LOW);
-24-
-25-
Παραρτήματα
-25-
-26-
I Κώδικας Παραδειγμάτων
Τον κώδικα κάθε παραδείγματος μπορείτε να τον αντιγράψετε (copy/paste) στο προγραμματιστικό
περιβάλλον σε ένα νέο σχέδιο. Πρέπει όμως πρώτα να διαγράψετε ότι υπάρχει, συγκεκριμένα μία κενή void
setup() και μία κενή void loop().
/*
Αφέσβεση(αναβόσβημα)
Ανάβει ένα LED για ένα δευτερόλεπτο,
το σβήνει για ένα δευτερόλεπτο
και επαναλαμβάνει συνέχεια
void setup() {
// όρισε την ακίδα 13 ώς έξοδο.
pinMode(13, OUTPUT);
}
-26-
-27-
/*
SOS
Εκπέμπει το σήμα SOS σε κώδικα Morse.
Το σήμα επαναλαμβάνεται συνέχεια.
Χρησιμοποιεί ένα LED συνδεδεμένο στην ακίδα 9.
void setup() {
// όρισε την ακίδα 9 ώς έξοδο.
pinMode(9, OUTPUT);
}
void loop() {
// Επιλέγεται διάρκεια τελείας 0,5s (μισό δευτερόλεπτο)
// Βλέπε σημειώσεις για λεπτομέρειες του κώδικα Morse
-27-
-28-
-28-
-29-
/*
SOSmetablitiAkida
Εκπέμπει το σήμα SOS σε κώδικα Morse.
Το σήμα επαναλαμβάνεται συνέχεια.
Μπορούμε να επιλέξουμε σε ποιά ακίδα θα είναι το LED
μέσω της μεταβλητής akidaLed
// OΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΗΣ
int akidaLed = 9; // ορίζεται ΑΚΕΡΑΙΑ μεταβλητ΄ή με όνομα akidaLed
// και (αρχική) τιμή 9
void setup() {
// όρισε την ακίδα του LED ως έξοδο (ο αριθμός της είναι στη μεταβλητή akidaLed.
pinMode(akidaLed, OUTPUT);
}
void loop() {
// Επιλέγεται διάρκεια τελείας 0,5s (μισό δευτερόλεπτο)
// Βλέπε σημειώσεις για λεπτομέρειες του κώδικα Morse
-29-
-30-
-30-
-31-
/*
SOSmetablitiDiarkeia
Εκπέμπει το σήμα SOS σε κώδικα Morse.
Το σήμα επαναλαμβάνεται συνέχεια.
Μπορούμε να επιλέξουμε σε ποιά ακίδα θα είναι το LED
μέσω της μεταβλητής akidaLed
Μπορούμε να ορίσουμε τη διάρκεια της τελείας
μέσω της μεταβλητής diarkTel.
Οι υπόλοιπες διάρκειες υπολογίζονται αυτόματα και
οι τιμές τους δίνονται σε αντίστοιχες μεταβλητές
// OΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ
void setup() {
// όρισε την ακίδα του LED ως έξοδο (ο αριθμός της είναι στη μεταβλητή akidaLed)
pinMode(akidaLed, OUTPUT);
}
void loop() {
-31-
-32-
delay(diarkPav);
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του Ο (τρείς τελείες)
-32-
-33-
/*
DiabasmaDiakopti
Διαβάζει την κατάσταση ενός διακόπτη συνδεδεμένου στην ακίδα 2
Ανάβει ή σβήνει ένα LED σύμφωνα με την κατάσταση του διακόπτη.
int katastasiDiakopti; // Μεταβλητή για την αποθήκευση της κατάστασης του διακόπτη
void setup() {
pinMode(akidaDiakopti, INPUT); // Η ακίδα με το διακόπτη είναι είσοδος
pinMode(akidaLed, OUTPUT); // Η ακίδα με το LED είναι έξοδος
}
void loop() {
-33-
-34-
/* AnalogikiEksodosEllipes
Ανάβει ένα LED συνδεδεμένο στην ακίδα 6 σε διάφορα επίπεδα έντασης
void setup(){
pinMode(6, OUTPUT);
}
void loop(){
analogWrite(6, 0); // LED σβηστό
delay(500);
/* AnalogikiEksodos
Ανάβει ένα LED συνδεδεμένο στην ακίδα 6 σε διάφορα επίπεδα έντασης
void setup(){
pinMode(6, OUTPUT);
}
void loop(){
analogWrite(6, 0); // LED σβηστό
delay(500);
-34-
-35-
/*
AnalogikiEisodosKaiSeiriaki
Διαβάζει ένα ποτενσιόμετρο συνδεδεμένο στην ακίδα A0
και γράφει την τιμή στην οθόνη του υπολογιστή.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Για να δούμε την πληροφορία που γράφεται στην οθόνη του υπολογιστή
πρέπει να επιλέξουμε από το μενού του Arduino Εργαλεία->Σειριακή Οθόνη
META το ανέβασμα του σχεδίου στον Arduino.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int analogikiA0; // μεταβλητή για την τιμή που θα διαβάσουμε από την ακίδα
void setup(){
Serial.begin(9600); // άρχισε την επικοινωνία με τον υπολογιστή
void loop(){
analogikiA0 = analogRead(A0); // διάβασε την τιμή της ακίδας και φύλαξέ την στην μεταβλητή.
Serial.print("H timi tis akidas einai: "); // γραψε στην οθόνη επεξηγηματικό κείμενο
// μην αλλάζεις γραμμή.
Serial.println(analogikiA0); // γράψε στην οθόνη την τιμή της μεταβλητής analogikiA0
// μετά άλλαξε γραμμή.
delay(10); // ΑΠΑΡΑΙΤΗΤΗ μικρή καθυστέρηση για να σταθεροποιηθεί η επόμενη τιμή της εισόδου
}
-35-
-36-
/*
AnalogikiEisodosSeiriakiLED
Διαβάζει ένα ποτενσιόμετρο συνδεδεμένο στην ακίδα A0
γράφει την τιμή στην οθόνη του υπολογιστή
και ανάβει ένα ΛΕΔ.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Για να δούμε την πληροφορία που γράφεται στην οθόνη του υπολογιστή
πρέπει να επιλέξουμε από το μενού του Arduino Εργαλεία->Σειριακή Οθόνη
META το ανέβασμα του σχεδίου στον Arduino.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int analogikiA0; // μεταβλητή για την τιμή που θα διαβάσουμε από την ακίδα
int akidaLed = 6; // αριθμός ακίδας για αναλογική έξοδο (3,5,6,9,10 ή 11)
void setup(){
Serial.begin(9600); // άρχισε την επικοινωνία με τον υπολογιστή
void loop(){
analogikiA0 = analogRead(A0); // διάβασε την τιμή της ακίδας και φύλαξέ την στην μεταβλητή.
Serial.print("H timi tis akidas einai: "); // γραψε στην οθόνη επεξηγηματικό κείμενο
// μην αλλάζεις γραμμή.
Serial.println(analogikiA0); // γράψε στην οθόνη την τιμή της μεταβλητής analogikiA0
// μετά άλλαξε γραμμή.
analogWrite(6, analogikiA0 / 4); // γράψε την προσαρμοσμένη τιμή στην ακίδα 6
// -διαιρουμε την τιμή με το 4 γιατί η αναλογική είσοδος
// -δεχεται τιμές μεχρι το 255, ενώ η αναλογική
// -είσοδος δινει τιμές μεχρι το 1023
delay(10); // ΑΠΑΡΑΙΤΗΤΗ μικρή καθυστέρηση για να σταθεροποιηθεί η επόμενη τιμή της εισόδου
}
-36-
-37-
/*
IFdiakoptis
Διαβάζει ένα διακόπτη.
Αν είναι ενεργοποιημένος αναβοσβήνει ενα LED γρήγορα τρεις φορές
Αν δεν είναι ενεργοποιημένος δεν κάνει τίποτε
Περιμένει για λίγο και επαναλαμβάνει
*/
void setup(){
pinMode(akidaLed, OUTPUT); // ορισμός εξόδου
digitalWrite(akidaLed, LOW); // Για να είμαστε σίγουροι ότι τo LED θα είναι σβηστό στο ξεκίνημα.
}
void loop(){
katastasiDiakopti = digitalRead(akidaDiakopti);
-37-
-38-
/*
IF_ELSE_diakoptis
Διαβάζει ένα διακόπτη.
Αν είναι ενεργοποιημένος αναβοσβήνει ενα LED γρήγορα τρεις φορές
Αν δεν είναι ενεργοποιημένος αναβει το LED για ένα σχετικά μεγάλο διάστημα
Περιμένει για λίγο και επαναλαμβάνει
*/
void setup(){
pinMode(akidaLed, OUTPUT); // ορισμός εξόδου
digitalWrite(akidaLed, LOW); // Για να είμαστε σίγουροι ότι τo LED θα είναι σβηστό στο ξεκίνημα.
}
void loop(){
katastasiDiakopti = digitalRead(akidaDiakopti);
-38-
-39-
/*
IF_ELSE_FOR_diakoptis
Διαβάζει ένα διακόπτη.
Αν είναι ενεργοποιημένος αναβοσβήνει ενα LED γρήγορα τρεις φορές
Αν δεν είναι ενεργοποιημένος αναβει το LED για ένα σχετικά μεγάλο διάστημα
Περιμένει για λίγο και επαναλαμβάνει.
Χρησιμοποιούμε τη δομή FOR για να αποφύγουμε την μονότονη επανάληψη πανομοιότυπου κώδικα:
λέμε (αναψε-σβήσε τρεις φορές)
αντί (αναψε-σβήσε, αναψε-σβήσε, αναψε-σβήσε)
Αν οι επαναλήψεις είναι πιό πολλές, ας πούμε 100, το πλεονέκτημα είναι πιό προφανές
Εκτός από τον περιορισμό της έκτασής στου ο κώδικας γίνεται και πιό ευανάγνωστος
*/
void setup(){
pinMode(akidaLed, OUTPUT); // ορισμός εξόδου
digitalWrite(akidaLed, LOW); // Για να είμαστε σίγουροι ότι τo LED θα είναι σβηστό στο ξεκίνημα.
}
void loop(){
katastasiDiakopti = digitalRead(akidaDiakopti);
-39-
-40-
/*
FOR_monoxromatiko
ανάβει σιγά σιγά ένα LED
το σβήνει σιγά σιγά
και επαναλαμβάνει
*/
void setup(){
pinMode(akidaLed, OUTPUT);
}
void loop(){
-40-
-41-
/*
FOR_Trixromatiko
Σε ένα τριχρωματικό LED σαρώνει όλο το εύρος των χρωμάτων της ίριδας
αχίζει από κόκκινο
περνάει μέσα από το κίτρινο στο πράσινο
μετά μέσα από το κυανοπράσινο στο μπλέ
μετά μέσα από το μώβ πίσο στο κόκκινο.
*/
int kokkino = 5; // ακίδα για το κόκκινο χρώμα (αναλογική έξοδος)
int prasino = 6; // πράσινο
int ble = 9; // μπλε
void setup(){
pinMode(kokkino, OUTPUT);
pinMode(prasino, OUTPUT);
pinMode(ble, OUTPUT);
}
void loop(){
for (int i = 0; i <= 255; i= i + 5){ // 51 επαναλήψεις, το βήμα είναι 5 [0, 5, 10 ... 255]
analogWrite(kokkino, i); // το κόκκινο αυξάνεται (0-255 ανά 5)
analogWrite(ble, 255 - i); // το μπλε μειώνεται (255-0 ανά 5)
delay(50);
}
-41-
-42-
/*
WHILE_analogiki_eisodos
Διαβάζει ένα ποτενσιόμετρο και κρατάει το LED αναμμένο αν και για όσο η τιμή είναι >= 512
Μετά το σβήνει και το κρατάει σβησμένο όσο η τιμή είναι < 512
και επαναλαμβάνει
*/
void setup(){
pinMode(9, OUTPUT); // ορισμός ακίδας εξόδου
void loop(){
while (timi >= 512){ // όσο η τιμή που διάβασες είναι >= 512
timi = analogRead(akidaPot); // διάβασε μια νέα τιμή
Serial.println(akidaPot); // γράψε την τιμή στην οθόνη του υπολογιστή
delay(10); // περίμενε λίγο
}
while (timi < 512){ // όσο η τιμή που διάβασες είναι < 512
timi = analogRead(akidaPot); // διάβασε μια νέα τιμή
Serial.println(akidaPot); // γράψε την τιμή στην οθόνη του υπολογιστή
delay(10); // περίμενε λίγο
}
// Αν φθάσουμε εδώ η τελευταία τιμή που διαβάσαμε είναι >= 512
// Γυρνάμε στην αρχή για να ξανανάψει το LED και να συνεχιστεί η διαδικασία
// Η πρώτη εντολή θα ανάψει το LED, ορθά αφού η τελευταία τιμή που διαβάσαμε
// είναι >= 512.
}
-42-
-43-
Στο δεκαδικό σύστημα έχουμε 10 ψηφία (από 0 ως 9). Όταν αριθμώντας τελειώσουν τα ψηφία ο επόμενος
αριθμός είναι μία δεκάδα και γράφεται στα αριστερά των μονάδων. Η έννοια της δεκάδας συνδέεται άμεσα
με το γεγονός ότι έχουμε στη διάθεσή μας δέκα ψηφία.
Πριν πάμε στο δυαδικό σύστημα θα δούμε το οκταδικό που είναι πιο ευνόητο. Στο οκταδικό σύστημα έχουμε
οκτώ ψηφία (0-7). Όταν τα ψηφία τελειώσουν ο επόμενος αριθμός είναι μία οκτάδα. Άρα ο αριθμός που
γράφεται 10 στο οκταδικό είναι μία οκτάδα και μηδέν μονάδες ίσος με το 8 στο δεκαδικό. Ο αριθμός που
γράφεται 17 στο οκταδικό είναι μία οκτάδα και επτά μονάδες δηλαδή ίσος με το 15 στο δεκαδικό.
Στο δεκαδικό μετά το 99 (εννέα δεκάδες και εννέα μονάδες έχουμε δέκα δεκάδες ή μία δεκάδα δεκάδων και
γράφουμε 100) η αντίστοιχη κατάσταση στο οκταδικό προκύπτει για τον αριθμό που γράφεται 77 (7 είναι το
μεγαλύτερο διαθέσιμο ψηφίο για το οκταδικό όπως το 9 στο δεκαδικό). Εδώ έχουμε όμως επτά οκτάδες και
επτά μονάδες και ο επόμενος αριθμός είναι οκτώ οκτάδες ή μία οκτάδα οκτάδων που γράφεται στο οκταδικό
100. Είναι ίσος με το 64 (8x8) στο δεκαδικό. Βλέπουμε λοιπόν ότι αριθμοί που είναι στρόγγυλοι στο οκταδικό
σύστημα αρίθμησης δεν είναι στρόγγυλοι στο δεκαδικό (και αντίστροφα προφανώς).
Αντίστοιχα με το δεκαδικό σε ένα πολυψήφιο οκταδικό αριθμό το πρώτο ψηφίο από τα δεξιά αντιστοιχεί σε
μονάδες (1), το δεύτερο αντιστοιχεί (πολλαπλασιάζεται) σε οκτάδες (8), το επόμενο σε 64 (82), το επόμενο σε
512 (83), 4096(84).
Στο δυαδικό σύστημα έχουμε δύο μόνο ψηφία (0-1). Τα ψηφία τελειώνουν πολύ γρήγορα (θα λέγαμε
αμέσως) κατά την αρίθμηση. Το 1 στο δυαδικό γράφεται επίσης 1, όπως και σε όλα τα άλλα συστήματα. Στο
δυαδικό όμως ήδη έχουν τελειώσει τα διαθέσιμα ψηφία. Ο επόμενος αριθμός λοιπόν είναι μία δυάδα,
γράφεται 10 και είναι ίσος με το 2 στο δεκαδικό (μία δυάδα και μηδέν μονάδες).
Μετά αυξάνουμε πάλι τις μονάδες. Ο επόμενος αριθμός γράφεται 11 που είναι μία δυάδα και μία μονάδα
ίσος με το 3 στο δεκαδικό. Και πάλι μας τελείωσαν τα ψηφία και μάλιστα και για τις μονάδες και για τις
δυάδες. Άρα προσθέτουμε ένα ακόμα ψηφίο που αντιστοιχεί σε δύο δυάδες ή μία δυάδα δυάδων. Γράφουμε
100 που είναι ίσο με μία δυάδα δυάδων (2x2 = 4), μηδέν δυάδες και μηδέν μονάδες άρα 4 στο δεκαδικό.
Τα ψηφία αρχίζοντας από τα δεξιά αντιστοιχούν σε μονάδες (1), δυάδες (2), τετράδες (22 = 4), οκτάδες (23 =
8), δεκαεξάδες (24 = 16) κοκ. Ο αριθμός 1101 στο δυαδικό αντιστοιχεί (αρχίζοντας από δεξιά προς αριστερά,
ανάποδα) στον 1x1 + 0x2 + 1x22 + 1x23 = 1x1 + 0x2 + 1x4 + 1x8 = 13 στο δεκαδικό.
-43-
-44-
Στους πίνακες Α,Β,Γ,Δ βλέπουμε τις νότες και τις συχνότητές του για τις πιο χρηστικές οκτάβες. Το κεντρικό
ΛΑ είναι στο πίνακα Β σημειωμένο με γκρι φόντο.
Η δεύτερη στήλη κάθε πίνακα είναι η συχνότητα της νότας στρογγυλεμένη σε ακέραιο. Η tone() που
χρησιμοποιούμε για τον Arduino δέχεται μόνο ακέραιες συχνότητες. Ακόμα και αυτή η προσέγγιση όμως
δίνει πολύ καλά αποτελέσματα. Η τελευταία στήλη κάθε πίνακα είναι ένα μέτρο της απόκλισης της ακέραιης
προσέγγισης από την πραγματική συχνότητα. Εργαστηριακές παρατηρήσεις έδειξαν ότι αν το μέτρο αυτό
είναι κάτω από 5, οι περισσότεροι άνθρωποι δεν καταλαβαίνουν τη διαφορά. Βλέπουμε από τον πίνακα ότι
το μέτρο είναι λίγο πάνω από το 5 για μία μόνο νότα και κοντά στο 5 για μία μόνο ακόμα.
Α ΝΤΟ 131 130.81 2.48 Β ΝΤΟ 262 261.63 2.48 Γ ΝΤΟ 523 523.25 0.83 Δ ΝΤΟ 1047 1046.50 0.82
ΝΤΟ # 139 138.59 5.10 ΝΤΟ # 277 277.18 1.14 ΝΤΟ # 554 554.37 1.14 ΝΤΟ # 1109 1108.73 0.42
ΡΕ 147 146.83 1.98 ΡΕ 294 293.66 1.98 ΡΕ 587 587.33 0.97 ΡΕ 1175 1174.66 0.50
ΡΕ # 156 155.56 4.85 ΡΕ # 311 311.13 0.71 ΡΕ # 622 622.25 0.71 ΡΕ # 1245 1244.51 0.68
ΜΙ 165 164.81 1.96 ΜΙ 330 329.63 1.96 ΜΙ 659 659.26 0.67 ΜΙ 1319 1318.51 0.64
ΦΑ 175 174.61 3.82 ΦΑ 349 349.23 1.13 ΦΑ 698 698.46 1.13 ΦΑ 1397 1396.91 0.11
ΦΑ # 185 185.00 0.03 ΦΑ # 370 369.99 0.03 ΦΑ # 740 739.99 0.03 ΦΑ # 1480 1479.98 0.03
ΣΟΛ 196 196.00 0.02 ΣΟΛ 392 392.00 0.02 ΣΟΛ 784 783.99 0.02 ΣΟΛ 1568 1567.98 0.02
ΣΟΛ # 208 207.65 2.90 ΣΟΛ # 415 415.30 1.27 ΣΟΛ # 831 830.61 0.81 ΣΟΛ # 1661 1661.22 0.23
ΛΑ 220 220.00 0.00 ΛΑ 440 440.00 0.00 ΛΑ 880 880.00 0.00 ΛΑ 1760 1760.00 0.00
ΛΑ # 233 233.08 0.61 ΛΑ # 466 466.16 0.61 ΛΑ # 932 932.33 0.61 ΛΑ # 1865 1864.66 0.32
ΣΙ 247 246.94 0.41 ΣΙ 494 493.88 0.41 ΣΙ 988 987.77 0.41 ΣΙ 1976 1975.53 0.41
Ο πίνακας Ε δείχνει την αναλογία της συχνότητας της κάθε νότας μίας οκτάβας με βάση το ΝΤΟ· δεν έχει
ιδιαίτερη πρακτική σημασία.
Ο πίνακας ΣΤ δείχνει τις αναλογίες μηκών σωλήνων ή ελασμάτων που απαιτούνται για κατασκευάσουμε ένα
αυτοσχέδιο όργανο (Αυλό του Πανός, Μεταλλόφωνο ή Κρόταλλα). Σημειώνεται ότι σειρά από τις νότες είναι
αντίστροφη, διότι μακρύτερα μήκη δίνουν χαμηλότερες συχνότητες. Για την αίσθηση της μελωδίας έχει
σημασία κυρίως η αναλογία των συχνοτήτων. Ο πίνακας Ζ δίνει συγκεκριμένα μήκη σε εκατοστά. Αν βέβαια
θέλουμε να χρησιμοποιήσουμε το όργανό μας σε συνδυασμό με τυποποιημένα όργανα, πρέπει να είναι
κουρδισμένο. Ο πίνακας Η δίνει συγκεκριμένα μήκη σε εκατοστά για κλειστούς σωλήνες (Αυλό του Πανός)
κουρδισμένους στην οκτάβα του πίνακα Γ.
-44-
-45-
Όπου υπάρχει κείμενο ανάμεσα σε τρίγωνες αγκύλες (π.χ. <αριθμός ακίδας>) είναι περιγραφικό. Εξηγεί τι
πρέπει να βάλουμε σε αυτή τη θέση. Για το συγκεκριμένο παράδειγμα πρέπει να αντικατασταθεί από ένα
αριθμό ακίδας ή το όνομα μιας μεταβλητής που «περιέχει» έναν αριθμό ακίδας. Τις τρίγωνες αγκύλες δεν τις
περιλαμβάνουμε στον κώδικά μας.
-45-
-1-
Βιβλιογραφία
[1] Physical Computing, Θεόδωρος Χ. Κασκάλης, Τμήμα Διοίκησης Τεχνολογίας, Πανεπιστήμιο
Μακεδονίας, http://pdkap.sch.gr/praktika2010/ergasies/Physical_Computing.pdf
-1-
-1-
ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ
Φιλοσοφία και άδειες χρήσης Ανοιχτού και Ελεύθερου Λογισμικού και υλικού .............................................. 1
Η πλακέτα........................................................................................................................................................... 3
Σηκώστε τα μανίκια.......................................................................................................... 5
Το προγραμματιστικό περιβάλλον ..................................................................................................................... 5
Εξωστρέφεια. ................................................................................................................... 9
Στοιχεία που ξέρουμε αλλά μπορεί να μη θυμόμαστε. ..................................................................................... 9
Το ηλεκτρικό κύκλωμα................................................................................................................................... 9
Τα βασικά μεγέθη ........................................................................................................................................ 10
Υλοποίηση ........................................................................................................................................................ 16
Μεταβλητές ................................................................................................................... 16
Δήλωση και ορισμός τιμής μεταβλητής ........................................................................................................... 17
-1-
-2-
Χρήση τιμών από αναλογική είσοδο για έλεγχο αναλογικής εξόδου .............................................................. 23
ΠΑΡΑΡΤΗΜΑΤΑ
-2-