Sunday, November 13, 2011

Arduino ISP programmer, ή αλλιώς προγραμματίζοντας με το Arduino

-->
Μπορεί να μην έχω αναλύσει και πολλά για το Arduino που να αφορούν και πιο νέους στο "κόλπο" αλλά αυτό νομίζω πως πρέπει να το γράψω. Με τον παρακάτω "απλό" τρόπο μπορούμε να μετατρέψουμε το Arduino board που διαθέτουμε σε avr isp programmer και να προγραμματίσουμε πληθώρα από chips τα οποία είναι πιο μικρά και πιο φθηνά ώστε απ' τη μια να κάνουν τη δουλειά μας και απ' την άλλη να την κάνουν οικονομικά.


Προαπαιτούμενα:

Θα χρειαστούμε ένα Arduino, είτε το Duemilanove (ή Diecimila) ή το Mega αναλόγως τι έχουμε και φυσικά το interface του Arduino. Ακόμη, χρειαζόμαστε ένα ράστερ (breadboard) και μερικά υλικά ακόμα που αλλάζουν ανάλογα με την περίσταση.



Το σκεπτικό:

Αυτό που θα κάνουμε είναι να περάσουμε στο Arduino τον κώδικα που τον κάνει να συμπεριφέρεται σαν προγραμματιστής avr-isp και στη συνέχεια αφού συνδέσουμε το άλλο chip με το Arduino, μπορούμε να του περάσουμε το πρόγραμμα που θα συντάξουμε μέσω του interface, ή χρησιμοποιώντας απ' ευθείας το avrdude για να το φορτώσουμε.

Σαν παράδειγμα θα χρησιμοποιήσουμε το Blink_led που είναι το πιο απλό και θα το φορτώσουμε σε ένα attiny 2313.

Σίγουρα τα παρακάτω chips: attiny (45,85,2313) δουλεύουνε μέσα από το interface του Arduino και μπορούμε να φορτώσουμε το Blink_led *σχεδόν όπως είναι. Θα σας πρότεινα να πάρετε ένα από αυτά για αρχή καθώς δεν είναι και τόσο εύκολο να πετύχει. Αλλά αν το κάνετε μια φορά μετά δεν είναι τίποτα.

Διαδικασία:

1. Πάμε πρώτα να κατεβάσουμε τις νεότερες εκδόσεις από τα παρακάτω αρχεία και να κάνουμε κάποιες ρυθμίσεις:
Η έκδοση του interface του arduino που θα δουλέψω είναι η 022.
Πάμε στο φάκελο με το σχέδια-sketches συνήθως είναι εδώ: C:\Users\test\Documents\Arduino. Δημιουργούμε ένα νέο φάκελο με το όνομα hardware.
Μέσα εκεί βάλτε τα αρχεία από το arduino-tiny που κατεβάσετε πιο πριν. Δύο φάκελοι είναι: tiny, tools.
Μέσα στο φάκελο tiny, βρείτε το αρχείο boards.txt. Αυτό το αρχείο περιέχει τις λεπτομέρειες για κάθε επιμέρους attiny chip που πρόκειται να χρησιμοποιήσουμε. Στο παράδειγμά μας θα χρησιμοποιήσουμε ένα attiny2313 χωρίς κρύσταλλο άρα στα 1Mhz.
Πάμε στο αντίστοιχο κομμάτι μέσα στο αρχείο και κάνουμε την εξής αλλαγή:

# The following DO work (pick one)...
# attiny2313at1.upload.protocol=avrispv2
attiny2313at1.upload.using=arduino:arduinoisp
# attiny2313at1.upload.using=pololu

επιλέγουμε στο πεδίο upload arduino:arduinoisp βγάζοντας τη δίεση (#) αλλά προσέχοντας να έχουμε επιλέξει μόνο ένα (βάζουμε # στην γραμμή που ήταν προεπιλεγμένη, δηλαδή την κάνουμε σχόλιο). Ορίζουμε ουσιαστικά τον τρόπο με τον οποίο θα προγραμματίσουμε το attiny. (πόσο πιο απλά μπορεί να τα γράψω;)

Για το άλλο αρχείο, μπορούμε να το αφήσουμε προς το παρόν και να δοκιμάσουμε την έκδοση που ήδη υπάρχει στο arduino. Αλλιώς πάμε στο φάκελο του προγράμματος, arduino-022/examples/ArduinoISP και αντικαθιστούμε το αρχείο ArduinoISP.pde με αυτό που κατεβάσαμε. Αυτός είναι ο κώδικας που μετετρέπει το arduino σε ISP programmer.

-->

2. Μέσα στο arduino IDE:

Φορτώνουμε πρώτα τον κώδικα για τον προγραμματιστή.
Ακολουθούμε όλη τη γνωστή διαδικασία, συνδέουμε δηλαδή την πλακέτα του arduino στο pc, επιλέγουμε τον τύπο του board μας. Αλλά προσέξτε, στην καρτέλα boards έχουν προστεθεί τα attiny. Τώρα όμως επιλέγουμε το board του arduino αφού αυτό θα προγραμματίσουμε. 

Από το μενού File -> Examples -> ArduinoISP  φορτώνουμε τον κώδικα στο arduino μας. Εάν έχετε κάνει ήδη την συνδεσμολογία θα δείτε λογικά το ένα από τα 3 LEDs να ανάβει.
Τα LEDs πάνε έτσι, και μόνο στα DIGITAL pins:

// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave


 Έχουμε λοιπόν τον arduino-ISP programmer έτοιμο. Πάμε να δούμε τώρα τη συνδεσμολογία.

3. Συνδεσμολογία:

Όσον αφορά μόνο την πλακέτα του arduino, θα χρειαστεί να βάλουμε 3 LEDs για να δούμε ότι όντως δουλεύει, ουσιαστικά παρατηρώντας εκείνο στο πιν 9. Συνδέουμε με μια αντίσταση (1k ας πούμε) κάθε ένα LED στη γείωση και στο αντίστοιχο πιν.
Προσοχή: Όλες οι συνδέσεις αφορούν τα digital pins.

LEDs ένδείξεων (1)

Τώρα δεν μας μένει παρά να συνδέσουμε το attiny με το arduino. Για να το κάνουμε αυτό, παρατηρούμε τα σχόλια στον κώδικα του ArduinoISP. Τα παρακάτω αλλάζουν βέβαια για το mega. Λεπτομέρειες πιο κάτω.

// 10: slave reset
// 11: MOSI
// 12: MISO
// 13: SCK

Για να βρούμε τα αντίστοιχα πινς των attiny θα χρειαστούμε το αντίστοιχο datasheet από την Atmel. Με μια αναζήτηση πχ attiny2313 θα είναι από τα πρώτα αποτελέσματα. Για το 2313 έχουμε:

attiny 2313 pinout (2)

Άρα έχουμε:
  • RESET - 1
  • MOSI - 17
  • MISO - 18
  • SCK - 19 ( αν και το γράφει UCSK/SCL )
Συνδέουμε στο breadboard to attiny...

arduinoISP-attiny2313 connections (3)

Μιας και έδωσα για το attiny2313, θα βάλω και για τα attiny45/85 pinouts.

attiny 45/85 pinouts (4)
1: RESET - digital 10
2: nc
3: nc
4: GND (γείωση)
5: MOSI - digital 11
6: MISO - digital 12
7: SCK - digital 13
8: +5V

Κανονικά τώρα θα έπρεπε να ήμασταν έτοιμοι να φορτώσουμε κώδικα στο tiny, αλλά υπάρχει άλλο ένα θέμα που πρέπει να λύσουμε.

Για να αποτρέψουμε το arduino να κάνει reset μόνο του, κάτι που μπορεί να μας χαλάσει τη διαδικασία προγραμματισμού, πρέπει να συνδέσουμε το RESET του arduino μέσω μιας αντίστασης των 120Ohm στη γείωση. Αν δεν έχετε 120Ohm κάντε συνδυασμούς αντιστάσεων μεταξύ των ορίων 110-124Ohm. Βέβαια ανάλογα με το arduino που έχετε καλό θα ήταν να κάνετε μια αναζήτηση. Αν δεν δουλέψει το παραπάνω, τότε ανάλογα με το arduino board που έχετε δοκιμάστε:
  • Arduino Mega: Παρεμβάλουμε μεταξύ RESET και 5V έναν πυκνωτή 100nF ή μεγαλύτερο για να αποτρέψουμε το autoreset. Επίσης τα pins για SPI είναι διαφορετικά. Έχουμε:
    50 - MISO
    51 - MOSI
    52 - SCK
    53 - SS
    Για το mega υπάρχει και ξεχωριστό post με κάποιες διαφορές που έχει.
  • Arduino Uno: Μεταξύ RESET και γείωσης παρεμβάλλεται ένας πυκνωτής 10uF. (Προσοχή στη σύνδεση, στη γείωση μπαίνει το ποδαράκι που έχει τη ρίγα με το (-).)
Αν δεν δουλέψουν τα παραπάνω ρίξτε μια ματιά και εδώ: http://www.arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection.

4. Προγραμματίζοντας το attiny

Λοιπόν, έφτασε επιτέλους η ώρα να φορτώσουμε τον κώδικα... Το arduino μας είναι έτοιμο να προγραμματίσει.
Μέσα από το interface, επιλέγουμε το board που έχουμε, στην περίπτωσή μας το attiny2313 @ 1Mhz.

επιλογή board (4)
Έπειτα φορτώνουμε ένα δοκιμαστικό πρόγραμμα, το κλασσικό Blink από το μενού File -> Examples -> Basic -> Blink. Αλλά αλλάζουμε το πιν 13 μέσα στον κώδικα σε πιν 0. Αυτό το πιν είναι αν δεν κάνω λάθος το 12 στο 2313 και το 5 στα 45/85.
Κλείνοντας:
Αν όλα πάνε καλά θα πρέπει όταν συνδέσουμε ένα LED στο αντίστοιχο πιν (πιν 2) και στη γείωση να αναβοσβήνει. Αν δεν πάνε μην απογοητεύεστε, υπάρχουν πολλές παράμετροι που μπορεί να φταίνε, αλλά με υπομονή θα βρείτε λύση. Θα συνεχίσω πάνω στο θέμα αυτό ειδικά με τα σφάλματα που μπορεί να προκύψουν.

Και ένα βίντεο από τον προγραμματισμό ενός 2313, ενώ ήδη υπάρχει άλλο ένα προγραμματισμένο το οποίο αναβοσβήνει λίγο πιο δεξιά.


No comments:

Post a Comment