Page 57 - Linux Inside τ. 10

Linux Inside
57
χρησιμοποιεί το Arduino τελικά, βρε παιδιά; Η αλήθεια είναι ότι
αυτή η ερώτηση είναι αρκετά συχνή, έχει πολλές διαφορετικές
απαντήσεις και είναι όλες τους κατά κάποιο τρόπο σωστές. Ας
τα πάρουμε από την αρχή. Η πιο συνηθισμένη απάντηση είναι
ότι το Arduino προγραμματίζεται στη γλώσσα Wiring. Στην
πραγματικότητα, τα προγράμματα του Arduino γράφονται σε
μία γλώσσα που βασίζεται στη Wiring, αλλά με αρκετές προ-
σθήκες και αλλαγές ούτως ώστε να θεωρείται από πολλούς
μία ξεχωριστή γλώσσα-διάδοχός της. Ας θεωρήσουμε όμως
σωστή την πρώτη απάντηση. Τι είδους γλώσσα είναι η Wiring;
Είμαι σίγουρος ότι οι περισσότεροι την ακούτε για πρώτη φο-
ρά. Στην ουσία δεν είναι τίποτε άλλο παρά μία απλουστευμένη
έκδοση της C++. Είναι μία γλώσσα που αναπτύχθηκε ερευνη-
τικά όταν ακόμα το Arduino ήταν σε βρεφικό στάδιο και από
ένα σημείο και μετά χώρισαν οι δρόμοι τους, επιλέγοντας δια-
φορετικά μονοπάτια. Εδώ έρχεται και η τρίτη πιο συνηθισμένη
απάντηση στο ερώτημα, που είναι ότι το Arduino προγραμματί-
ζεται σε C ή C++. Και αυτό είναι σωστό. Μπερδευτήκατε;
Στην πραγματικότητα, όταν προγραμματίζουμε, αυτό γίνεται
σε Wiring. Βέβαια, οποιοσδήποτε έχει γράψει ποτέ στη ζωή του
C ή C++ εδώ θα αρχίσει να ωρύεται και να φωνάζει ότι γρά-
φουμε C ή C++. Στην πραγματικότητα, η Wiring απλώς κάνει
κάποιες παραδοχές που ισχύουν συγκεκριμένα για το Arduino
για να διευκολύνει τη ζωή μας. Όταν κάνουμε compile τον κώ-
δικά μας, ένα πρόγραμμα του Arduino φροντίζει να μετατρέψει
το πρόγραμμά μας σε έγκυρη C++ και στη συνέχεια χρησιμο-
ποιεί τον GCC (συγκεκριμένα το avr-gcc, μία έκδοση του GCC
που υποστηρίζει τους μικροεπεξεργαστές τύπου AVR, όπως
αυτός του Arduino) και κάνει compile τον καθαρό C++ κώδικά
μας. Ας δούμε ένα παράδειγμα. Έστω το απλό πρόγραμμα
Blink, το οποίο αναβοσβήνει ένα LED στο Arduno.
/*
Blink
Turns on an LED on for one second, then off for one
second, repeatedly.
This example code is in the public domain.
*/
void setup() {
//
initialize the digital pin as an output.
//
Pin 13 has an LED connected on most Arduino
boards:
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}
Ας θεωρήσουμε ότι αυτό το πρόγραμμα πρόκειται για ένα
πρόγραμμα γραμμένο σε C. Άλλωστε όποιος γνωρίζει από C,
θα το αναγνώρισε ήδη. Βλέπουμε δύο συναρτήσεις, ονόματι
setup() και loop() οι οποίες καλούν τρεις άλλες συναρτήσεις με
κάποια ορίσματα, που είναι είτε αριθμοί είτε κάποια σταθερά
(
οι HIGH και LOW είναι σταθερές, όπως υποδηλώνει το ότι εί-
ναι γραμμένες με κεφαλαία). Αυτό που λείπει όμως είναι κατ’
αρχάς η συνάρτηση main()! Πάντα όλα τα C και C++ προ-
γράμματα περιέχουν μία συνάρτηση main() από την οποία ξεκι-
νάει η εκτέλεση. Το άλλο παράξενο είναι ότι δεν χρησιμοποιού-
με καμία βιβλιοθήκη! Χωρίς βιβλιοθήκες δεν μπορούμε να χρη-
σιμοποιήσουμε καμία εξωτερική συνάρτηση. Επομένως πού
ορίζονται οι loop(), setup(), pinMode(), digitalWrite() και delay()
που χρησιμοποιούμε στον κώδικά μας; Τέλος, όπως γνωρίζου-
με, στο Arduino η συνάρτηση setup() εκτελείται μία φορά στην
αρχή και στη συνέχεια εκτελείται συνεχόμενα επ’ άπειρον η
loop(). Πώς και γιατί γίνεται αυτό; Όπως είπαμε, το πρόγραμ-
μα του Arduino (ή Arduino IDE όπως λέγεται επισήμως) ανα-
λαμβάνει να κάνει τη μετατροπή σε καθαρή C/C++. Ας δούμε
ποιο είναι το αποτέλεσμα μετά τη μετατροπή.
#
include<Arduino.h>
int main(void)
{
setup();
for(;;)
loop();
}
#
line 1 "build/blink.ino"
/*
Blink
Turns on an LED on for one second, then off for one
second, repeatedly.
This example code is in the public domain.
*/
void setup() {
//
initialize the digital pin as an output.
//
Pin 13 has an LED connected on most Arduino
boards:
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}
Παρατηρήσατε τις αλλαγές; Κατ’ αρχάς, προστίθεται το
#
include<Arduino.h>. Αυτό είναι το header file το οποίο περιέ-
χει τους ορισμούς για όλες τις συναρτήσεις του Arduino που
χρησιμοποιούμε. Έτσι, ως αρχάριοι χρήστες μπορούμε να χρη-
σιμοποιήσουμε όλες τις γνωστές συναρτήσεις που μας παρέχει
το Arduino, χωρίς να χρειαστεί να κατανοήσουμε όλα τα παρά-
ξενα περί libraries, headers, function prototypes κ.λπ. Καλό, έτσι;
Συνεχίζοντας πιο κάτω, βλέπουμε τον παλιό μας φίλο, τη main()!
Η απλότητα του Arduino είναι ότι μετατρέπει τη C σε κάτι που ο
απλός χρήστης καταλαβαίνει πιο εύκολα. Μέσα στη main() κα-
λείται μία φορά η setup() και μετά σε έναν ατέρμονο βρόχο κα-
λείται η loop(). Ίσως να σας παραξενεύει λίγο η εντολή for(;;) αλ-
Project - Arduino Hacks
Το codebender επί το έργον. Εδώ βλέπετε τον editor
όπου γράφετε τα προγράμματά σας.
1