Προγραμματισμός Arduino για αρχάριους: Ο ελεγκτής φωτισμού της κυκλοφορίας

Την περασμένη εβδομάδα μάθαμε για τη βασική δομή ενός προγράμματος Arduino και εξετάσαμε πιο προσεκτικά το παράδειγμα του "blink". Ας ελπίσουμε ότι εκμεταλλευτήκατε την ευκαιρία να πειραματιστείτε με κώδικα προσαρμόζοντας τους χρόνους.

Την περασμένη εβδομάδα μάθαμε για τη βασική δομή ενός προγράμματος Arduino και εξετάσαμε πιο προσεκτικά το παράδειγμα του "blink".  Ας ελπίσουμε ότι εκμεταλλευτήκατε την ευκαιρία να πειραματιστείτε με κώδικα προσαρμόζοντας τους χρόνους.
Διαφήμιση

Το φανάρι είναι ένα διασκεδαστικό μικρό έργο, το οποίο μπορεί να ολοκληρωθεί σε λιγότερο από μία ώρα. Μάθετε πώς να δημιουργήσετε το δικό σας - χρησιμοποιώντας ένα Arduino - και πώς να τροποποιήσετε το κύκλωμα για ένα προηγμένο μοντέλο.

Μην ανησυχείτε αν δεν έχετε χρησιμοποιήσει ποτέ ένα Arduino πριν, έχουμε έναν οδηγό για αρχάριους Ξεκινώντας με το Arduino: Οδηγός για αρχάριους Ξεκινώντας με το Arduino: Οδηγός για αρχάριους Το Arduino είναι μια πλατφόρμα πρωτοτύπου ηλεκτρονικών ανοικτών πηγών που βασίζεται σε ευέλικτες, να χρησιμοποιούν υλικό και λογισμικό. Πρόκειται για καλλιτέχνες, σχεδιαστές, χομπίστες και όσους ενδιαφέρονται να δημιουργήσουν διαδραστικά αντικείμενα ή περιβάλλοντα. Διαβάστε περισσότερα .

Σημείωση : Αυτή είναι η τελευταία σε μια σειρά tutorials για αρχάριους για το Arduino, την πλατφόρμα πρωτοτύπων ηλεκτρονικής ανοικτής πηγής. Ακολουθεί μια λίστα με τα προηγούμενα άρθρα της σειράς:

  • Τι είναι το Arduino και τι μπορείτε να κάνετε με αυτό Τι είναι το Arduino και τι μπορείτε να κάνετε με αυτό; Τι είναι το Arduino και τι μπορείτε να κάνετε με αυτό; Το Arduino είναι μια αξιοσημείωτη μικρή ηλεκτρονική συσκευή, αλλά αν δεν έχετε χρησιμοποιήσει ποτέ πριν, τι ακριβώς είναι και τι μπορείτε να κάνετε με ένα; Διαβάστε περισσότερα
  • Τι είναι ένα κιτ εκκίνησης Arduino και τι περιέχει; Τι περιλαμβάνεται σε ένα κιτ εκκίνησης Arduino; [Το MakeUseOf εξηγεί] Τι περιλαμβάνεται σε ένα κιτ εκκίνησης Arduino; [MakeUseOf Εξηγεί] Έχω εισαγάγει προηγουμένως το υλικό ανοικτού κώδικα Arduino εδώ στο MakeUseOf, αλλά θα χρειαστείτε κάτι περισσότερο από το πραγματικό Arduino για να χτίσετε κάτι από αυτό και να ξεκινήσετε πραγματικά. Arduino "εκκίνησης κιτ" είναι ... Διαβάστε περισσότερα
  • Περισσότερα ψυχρά εξαρτήματα για να αγοράσετε με το κιτ εκκίνησης 8 Περισσότερα δροσερά εξαρτήματα για τα έργα σας Arduino 8 Περισσότερα δροσερά εξαρτήματα για τα έργα σας Arduino Έτσι σκέφτεστε να πάρετε ένα κιτ εκκίνησης Arduino, αλλά αναρωτιέμαι αν κάποια βασικά LED και αντιστάσεις πρόκειται να γίνουν αρκετά για να σας κρατήσει απασχολημένο για το Σαββατοκύριακο; Πιθανώς όχι. Εδώ είναι άλλες 8 ... Διαβάστε περισσότερα
  • Ξεκινώντας με το κιτ Starter Kit της Arduino - Εγκατάσταση των προγραμμάτων οδήγησης & Εγκατάσταση του Board & Port Ξεκινώντας με το κιτ εκκίνησης Arduino - Εγκατάσταση προγραμμάτων οδήγησης & Εγκατάσταση του Board & Port Ξεκινώντας με το κιτ εκκίνησης Arduino - Εγκατάσταση προγραμμάτων οδήγησης & Λιμάνι Έτσι, έχετε αγοράσει τον εαυτό σας ένα κιτ εκκίνησης Arduino, και πιθανόν μερικά άλλα τυχαία δροσερά εξαρτήματα - τώρα τι; Πώς ξεκινάτε πραγματικά να προγραμματίζετε αυτό το πράγμα Arduino; Πώς το ρυθμίζετε ... Διαβάστε περισσότερα
  • Μια πιο προσεκτική ματιά στη δομή μιας εφαρμογής Arduino και του προγράμματος Blink Παράδειγμα

Ο, τι χρειάζεσαι

Εκτός από το βασικό Arduino, θα χρειαστείτε:

  • Κόκκινα, κίτρινα και πράσινα LED.
  • Πιπίλα.
  • 6 x 220; αντιστάσεις.
  • Σύνδεση καλωδίων.
  • 1 διακόπτης μπουτόν.
  • 1 x 10k; αντίσταση

Σχεδόν κάθε Arduino θα είναι κατάλληλη, εφόσον έχει αρκετά καρφίτσες. Βεβαιωθείτε ότι έχετε διαβάσει τον οδηγό αγορών μας Arduino Οδηγός αγοράς: Ποιο συμβούλιο πρέπει να πάρετε; Arduino Οδηγός αγοράς: Ποιο συμβούλιο πρέπει να πάρετε; Υπάρχουν τόσα πολλά διαφορετικά είδη σανίδων Arduino εκεί έξω, θα συγχωρεθήκατε για σύγχυση. Ποια θα πρέπει να αγοράσετε για το έργο σας; Ας βοηθήσουμε, με αυτόν τον οδηγό αγοράς Arduino! Διαβάστε περισσότερα αν δεν είστε σίγουροι για το μοντέλο που χρειάζεστε. Πιθανότατα έχετε αυτά τα εξαρτήματα στο κιτ εκκίνησης Τι είναι το κιτ εκκίνησης Arduino; [Arduino Beginners] Τι υπάρχει στο κιτ εκκίνησης Arduino; [Arduino Beginners] Αντιμετωπίζοντας ένα κουτί γεμάτο ηλεκτρονικά εξαρτήματα, είναι εύκολο να σας συγκλονίσει. Εδώ είναι ένας οδηγός για ακριβώς τι θα βρείτε στο κιτ σας. Διαβάστε περισσότερα.

Ένα απλό παράδειγμα

Ας ξεκινήσουμε λίγο. Ένα βασικό, ενιαίο φανάρι είναι ένα καλό μέρος για να ξεκινήσετε. Εδώ είναι το κύκλωμα:

arduino_traffic_light

Συνδέστε την άνοδο (μακρύ σκέλος) κάθε LED σε ψηφιακές ακίδες οκτώ, εννέα και δέκα (μέσω ενός αντιστάτη 220?). Συνδέστε τις κάθοδοι (κοντά πόδια) στο έδαφος Arduino.

Χρησιμοποίησα τον Fritzing για να σχεδιάσω αυτά τα διαγράμματα. Όχι μόνο είναι εύκολο στη χρήση, είναι δωρεάν!

Ο κώδικας

Αρχίστε με τον ορισμό των μεταβλητών έτσι ώστε να μπορούμε να αντιμετωπίσουμε τα φώτα με το όνομα και όχι με έναν αριθμό. Ξεκινήστε ένα νέο έργο Arduino και ξεκινήστε με αυτές τις γραμμές:

int red = 10; int yellow = 9; int green = 8; 

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

 void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); } 

Αυτό ήταν εύκολο. Τώρα για το δύσκολο μέρος - την πραγματική λογική ενός φανάρι. Δημιουργήστε μια ξεχωριστή λειτουργία για να αλλάξετε τα φώτα (θα δείτε γιατί αργότερα).

Όταν ξεκινάτε για πρώτη φορά τον προγραμματισμό, ο ίδιος ο κώδικας είναι πολύ στοιχειώδης - περιγράφει τις λεπτομέρειες λογικές λεπτομέρειες που παρουσιάζουν το μεγαλύτερο πρόβλημα. Το κλειδί για να είναι ένας καλός προγραμματιστής είναι να είναι σε θέση να εξετάσει οποιαδήποτε διαδικασία, και να το σπάσει στα βασικά του βήματα. Εδώ είναι το υπόλοιπο του κώδικα:

 void loop(){ changeLights(); delay(15000); } void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(3000); } 

Εγινε! Τώρα, μεταφορτώστε και εκτελέστε (βεβαιωθείτε ότι έχετε επιλέξει τη σωστή πλακέτα και τη θύρα από τα μενού Εργαλεία > Θύρα και Εργαλεία > Πίνακας ). Θα πρέπει να έχετε ένα φανάρι εργασίας που αλλάζει κάθε 15 δευτερόλεπτα, όπως αυτό (επιτάχυνε):

Μια διασταύρωση πεζών

Τώρα που γνωρίζετε τα βασικά, ας τα βελτιώσουμε. Προσθέστε ένα κουμπί για τους πεζούς για να αλλάξετε το φως όποτε το επιθυμούν:

arduino_traffic_light_with_button

Παρατηρήστε πως το φανάρι είναι ακριβώς το ίδιο με το προηγούμενο παράδειγμα. Συνδέστε το κουμπί στο ψηφιακό pin 12. Θα παρατηρήσετε ότι ο διακόπτης έχει υψηλή αντίσταση 10k; αντίσταση που συνδέεται με αυτό, και ίσως να αναρωτιέστε γιατί. Αυτό ονομάζεται αντίσταση τραβήγματος προς τα κάτω. Είναι μια δύσκολη ιδέα να κατανοήσετε από την αρχή, αλλά φέρτε μαζί μου.

Ένας διακόπτης είτε αφήνει την ροή ρεύματος είτε όχι. Αυτό φαίνεται αρκετά απλό, αλλά σε ένα λογικό κύκλωμα, το ρεύμα πρέπει πάντα να ρέει σε υψηλή ή χαμηλή κατάσταση (θυμηθείτε - 1 ή 0, υψηλή ή χαμηλή). Μπορεί να υποθέσετε ότι ένας διακόπτης που δεν πιέζεται στην πραγματικότητα θα οριστεί ως σε χαμηλή κατάσταση, αλλά στην πραγματικότητα λέγεται ότι είναι «πλωτός», επειδή δεν υπάρχει καθόλου ρεύμα.

Σε αυτή την πλωτή κατάσταση, είναι πιθανό ότι μια ψευδής ανάγνωση θα συμβεί καθώς κυμαίνεται με ηλεκτρικές παρεμβολές. Με άλλα λόγια, ένας πλωτός διακόπτης δεν παρέχει ούτε αξιόπιστη υψηλή, ούτε χαμηλή κατάσταση ανάγνωσης. Μια αντίσταση pull-down διατηρεί μικρή ποσότητα ρεύματος που ρέει όταν ο διακόπτης είναι κλειστός, εξασφαλίζοντας έτσι μια ακριβή χαμηλή κατάσταση ανάγνωσης. Σε άλλα λογικά κυκλώματα, αντ 'αυτού μπορεί να βρεθεί αντίστασης pull-up - αυτό λειτουργεί με την ίδια αρχή, αλλά αντίστροφα, διασφαλίζοντας ότι η συγκεκριμένη λογική πύλη είναι προεπιλεγμένη.

Τώρα, στο βρόχο του κώδικα, αντί να αλλάζουμε τα φώτα κάθε 15 δευτερόλεπτα, θα διαβάσουμε την κατάσταση του διακόπτη του κουμπιού και θα αλλάξουμε μόνο τα φώτα όταν είναι ενεργοποιημένα.

Ο κώδικας

Ξεκινήστε προσθέτοντας μια νέα μεταβλητή στην αρχή του προγράμματος:

 int button = 12; // switch is on pin 12 

Τώρα, στη λειτουργία ρύθμισης, προσθέστε μια νέα γραμμή για να δηλώσετε τον διακόπτη ως είσοδο. Έχω προσθέσει επίσης μια μόνο γραμμή για να ξεκινήσει το φανάρι στο πράσινο στάδιο. Χωρίς αυτήν την αρχική ρύθμιση, θα απενεργοποιηθούν, μέχρι την πρώτη φορά που ξεκίνησε μια αλλαγήLights () χρησιμοποιώντας μια συνάρτηση.

 pinMode(button, INPUT); digitalWrite(green, HIGH); 

Αλλαγή ολόκληρης της συνάρτησης βρόχου προς την ακόλουθη:

 void loop() { if (digitalRead(button) == HIGH){ delay(15); // software debounce if (digitalRead(button) == HIGH) { // if the switch is HIGH, ie. pushed down - change the lights! changeLights(); delay(15000); // wait for 15 seconds } } } 

Αυτό πρέπει να το κάνει. Μπορεί να αναρωτιέστε γιατί το κουμπί ελέγχεται δύο φορές ( ψηφιακό κουμπί ανάγνωσης ), χωρισμένο με μικρή καθυστέρηση. Αυτό ονομάζεται debouncing. Όπως και ο αντιστάτης έλξης που απαιτείται για το κουμπί, αυτός ο απλός έλεγχος σταματάει τον κώδικα να ανιχνεύει δευτερεύουσες παρεμβολές με το πάτημα ενός κουμπιού. Δεν χρειάζεται να κάνετε κάτι τέτοιο (και ίσως να δουλέψει καλά χωρίς αυτό), αλλά είναι καλή πρακτική.

Αναμονή εντός της εντολής if για 15 δευτερόλεπτα, τα φανάρια δεν μπορούν να αλλάξουν για τουλάχιστον αυτή τη διάρκεια. Μόλις ολοκληρωθούν 15 δευτερόλεπτα, ο βρόχος επανεκκινείται. Κάθε επανεκκίνηση του βρόχου, διαβάστε ξανά την κατάσταση του κουμπιού, αλλά αν δεν πατηθεί, η εντολή if δεν ενεργοποιείται ποτέ, τα φώτα δεν αλλάζουν ποτέ και απλώς ξαναρχίζει.

Δείτε πώς φαίνεται αυτό (επιτάχυνε):

Μια σύνδεση

Ας δοκιμάσουμε ένα πιο προηγμένο μοντέλο. Αντί για τη διέλευση πεζών, τροποποιήστε το κύκλωμα για να έχετε δύο φανάρια:

arduino_dual_traffic_light

Συνδέστε το δεύτερο φανάρι στις ψηφιακές ακίδες 11, 12 και 13.

Ο κώδικας

Κατ 'αρχάς, ορίστε τις νέες καρφίτσες της κυκλοφορίας στις μεταβλητές και τις ρυθμίστε ως έξοδο, όπως ακριβώς και στο πρώτο παράδειγμα:

 // light one int red1 = 10; int yellow1 = 9; int green1 = 8; // light two int red2 = 13; int yellow2 = 12; int green2 = 11; void setup(){ // light one pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); // light two pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green2, OUTPUT); } 

Τώρα ενημερώστε τον βρόχο σας για να χρησιμοποιήσετε τον κώδικα από το πρώτο παράδειγμα (αντί για το πέρασμα των πεζών):

 void loop(){ changeLights(); delay(15000); } 

Για άλλη μια φορά, όλες οι εργασίες εκτελούνται στη λειτουργία changeLights () . Αντί να πας κόκκινο > κόκκινο & κίτρινο > πράσινο, αυτός ο κωδικός θα εναλλάσσει τα φανάρια. Όταν κάποιος είναι πράσινος, ο άλλος θα είναι κόκκινος. Εδώ είναι ο κώδικας:

 void changeLights(){ // turn both yellows on digitalWrite(green1, LOW); digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); delay(5000); // turn both yellows off, and opposite green and red digitalWrite(yellow1, LOW); digitalWrite(red1, HIGH); digitalWrite(yellow2, LOW); digitalWrite(red2, LOW); digitalWrite(green2, HIGH); delay(5000); // both yellows on again digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(green2, LOW); delay(3000); // turn both yellows off, and opposite green and red digitalWrite(green1, HIGH); digitalWrite(yellow1, LOW); digitalWrite(red1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red2, HIGH); delay(5000); } 

Εδώ είναι αυτό που μοιάζει με (επιτάχυνση):

Αυτό είναι για αυτή τη φορά, οπότε ελπίζω να μάθατε πολλά και να διασκεδάσετε να γράφετε από το μηδέν. Πήρατε τα χέρια σας βρώμικα με μερικά LED και αντιστάσεις, καθώς και προσθέτοντας ένα διακόπτη με μια αντίσταση pull down - ελπίζουμε να καταλάβετε γιατί χρειαζόμαστε ένα. Παίξτε με τον κώδικα, ρυθμίστε το και, κυρίως, διασκεδάστε. Εάν κάνετε οποιεσδήποτε προσθήκες ή αλλαγές, γιατί να μην μας ενημερώσετε για τα σχόλια;

Image Credit: ανδροστρωτήρας μέσω του Shutterstock.com

In this article