Monday, November 14, 2011

Εισαγωγή στο Arduino, serial communication

Λοιπόν συνεχίζοντας από το προηγούμενο παράδειγμα, όπου είδαμε εισαγωγικά μια πολύ απλή εφαρμογή, τώρα θα βάλουμε τον υπολογιστή να επικοινωνήσει με το Arduino. Ο υπολογιστής είναι συνδεδεμένος μέσω USB με το Arduino. Εκμεταλλευόμενοι αυτό θα χρησιμοποιήσουμε την σειριακή σύνδεση που υπάρχει μεταξύ τους και θα μεταδώσουμε "ερεθίσματα" στο interface του Arduino.

Ξεκινάμε από το πολύ απλό παράδειγμα που υπάρχει στο site του Arduino, arduino.cc για να δοκιμάσουμε απλοϊκά την σειριακή σύνδεση.

Διαδικασία:
Συνδέουμε το Arduino στον υπολογιστή και ανοίγουμε το interface του. Μετά αφού επιλέξουμε το board μας και την θύρα που είναι συνδεδεμένο, φορτώνουμε το αντίστοιχο πρόγραμμα.

Ψηφιακή Είσοδος:

Επιλέγουμε λοιπόν: File -> Examples -> Basics -> DigitalReadSerial .



Κώδικας:

/*
  DigitalReadSerial
 Reads a digital input on pin 2, prints the result to the serial monitor 
 
 This example code is in the public domain.
 */

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop() {
  int sensorValue = digitalRead(2);
  Serial.println(sensorValue, DEC);
}
Παρατηρήσεις:
  • Serial.begin(9600)
    Ανοίγουμε έναν σειριακό δίαυλο επικοινωνίας μεταξύ Arduino και pc με ρυθμό μεταφοράς τα 9600 bit ανα δευτερόλεπτο.
  • pinMode(2, INPUT)
    Ορίζουμε την υποδοχή 2 σαν υποδοχή εισόδου, την ένδειξη αυτή θα διαβάζει και θα στέλνει σειριακά στον υπολογιστή.

    Μπαίνουμε τώρα στον κύριο βρόχο του προγράμματος και ορίζουμε:
  • int sensorValue = digitalRead(2)
    Που σημαίνει ότι έχουμε μια μεταβλητή (sensorValue) που πέρνει αριθμητική τιμή (integer = ακέραιος). Η μεταβλητή αυτή κάθε στιγμή πέρνει την τιμή της ανάλογα με την τιμή της υποδοχής, στην περίπτωσή μας, η υποδοχή 2. Αυτό γίνεται μέσω της digitalRead(2) μια συνάρτηση που διαβάζει την κατάσταση ON/OFF μιας υποδοχής. Αν περνάει ρεύμα είναι στο 1 (ON ή HIGH όπως συνηθίζεται) αλλιώς είναι στο 0 (OFF ή LOW).
  • Serial.println(sensorValue, DEC)
    Τέλος, στην κονσόλα της σειριακής επικοινωνίας εκτυπώνει την τιμή της μεταβλητής (sensorValue) σε δεκαδικό σύστημα, ενώ αλλάζει γραμμή πριν την τυπώσει.


Κύκλωμα:

Εάν δεν έχετε διακόπτη, χρησιμοποιήστε απλά μερικά καλώδια σαν διακόπτη αλλά με αντίσταση τουλάχιστον.
Στο παρακάτω κύκλωμα, η αντίσταση που χρησιμοποιείται είναι 10k.

κύκλωμα ψηφιακής εφαρμογής (2)

Παρατηρήστε ότι συνδέουμε στις υποδοχές που λένε Digital το διακόπτη, γιατί θα χειριστούμε ψηφιακά δεδομένα, 0 και 1. Προφανώς 2 δύο συνδέσεις στα δεξιά δεξιά δεν χρειάζονται αφού δεν συνδέουμε τίποτα στην επάνω σειρά.

Αφού ολοκληρώσαμε και το κύκλωμα, φορτώνουμε στο Arduino τον κώδικα και ανοίγουμε την σειριακή κονσόλα πηγαίνοντας: Tools -> Serial Monitor ή αλλιώς πατώντας (Ctrl+Shift+M). Στο παράθυρο που εμφανίζεται, μπορούμε να στείλουμε και να λάβουμε σειριακά, δεδομένα από το Arduino. Για αρχή όμως το μόνο που μπορούμε να δούμε είναι 1 όταν ο διακόπτης είναι πατημένος και 0 όταν είναι ανοικτός.

Αναλογική Είσοδος:

Το παραπάνω παράδειγμα αφορούσε τις ψηφιακές υποδοχές δηλαδή ήταν είτε 0 είτε 1. Τώρα θα δούμε ένα παράδειγμα που αφορά τις αναλογικές υποδοχές και θα συνδέσουμε ένα ποτενσιόμετρο γι' αυτή τη δουλειά.
Φορτώνουμε τον κώδικα: File -> Examples -> AnalogReadSerial .

Κώδικας:
/*
  AnalogReadSerial
 Reads an analog input on pin 0, prints the result to the serial monitor 
 
 This example code is in the public domain.
 */

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue, DEC);
}

Παρατηρήσεις:

  • Serial.begin(9600)
    Ανοίγουμε λοιπόν και πάλι το σειριακό κανάλι όπως κάναμε κα πριν.
  • int sensorValue = analogRead(A0)
    Ορίζουμε την αριθμητική μεταβλητή η οποία πέρνει τιμή από την αναλογική υποδοχή (Α0). Με τη συνάρτηση analogRead() το Arduino διαβάζει μια αναλογική υποδοχή χρησιμοποιώντας έναν 10-bit μετατροπέα από αναλογικό σε ψηφιακό σήμα. Πράγμα που σημαίνει για παράδειγμα ότι από τα 0 έως τα 5V κυμαίνονται από 0-1023. Δηλαδή όταν έχουμε 0V έχουμε πέρνουμε 0 και όταν έχουμε 3V πέρνουμε μια τιμή 3* (5/1024) αφού κάθε 1/1024 αντιστοιχεί σε 5/1024=0.0049V.
  • Serial.println(sensorValue, DEC)
    Ομοίως με πριν, πηγαίνει σε νέα γραμμή κα μας δίνει την τιμή της μεταβλητής η οποία θα κυμαίνεται μεταξύ 0-1023. Την πραγματική τιμή σε Volts μπορούμε να τη βρούμε πολλαπλασιάζοντας με 0.0049 ή Serial.println(sensorValue*0.0049, DEC). *(Δεν το έχω δοκιμάσει αλλά είμαι σχεδόν σίγουρος ότι δουλεύει.)
Για περισσότερες λεπτομέρειες πάνω στην AnalogRead ανατρέξτε εδώ.

Κύκλωμα:
κύκλωμα αναλογικής εφαρμογής (3)
Πολύ απλό...προσοχή μόνο ότι το τρίτο ποδαράκι πάει στο 0 Analog pin και όχι στο Digtal. Εάν δεν το βάλετε στο 0 αλλάξτε το και στον κώδικα!

Φορτώστε τον κώδικα, ανοίξτε την σειριακή κονσόλα και παίξτε :)

Αυτά προς το παρόν, προσπαθώ να ανεβάζω υλικό αλλά δεν είναι πάντα εφικτό...
G00d luck 'n have fun


No comments:

Post a Comment