Περιγραφή: Περιστρέφοντας δεξιόστροφα το ποτενσιόμετρο, ελέγχουμε το άναμμα 5 LED διαφορετικών χρωμάτων σε συνδυασμούς (πράσινο-μπλε/κίτρινο-κόκκινο/λευκό). Κατά την αντίστροφη περιστροφή του ποτενσιόμετρου, τα LED ανάβουν αντίστροφα.
Physical Computing στο σχολείο με τον εξοπλισμό Polytech S2.1
Τίτλος: Δραστηριότητα ΑΓ1.25 Γωνιόμετρο (2)
Περιγραφή: Περιστρέφοντας δεξιόστροφα το ποτενσιόμετρο, ελέγχουμε το άναμμα 4 LED διαφορετικών χρωμάτων (πράσινο/κίτρινο/μπλε/κόκκινο). Κατά την αντίστροφη περιστροφή του ποτενσιόμετρου, τα LED ανάβουν αντίστροφα (κόκκινο/μπλε/κίτρινο/πράσινο).
Physical Computing στο σχολείο με τον εξοπλισμό Polytech S2.1
Τίτλος: Δραστηριότητα ΑΓ1.21 Φανάρι κυκλοφορίας
Περιγραφή: Όταν ο αισθητήρας είναι OFF, το πράσινο LED είναι αναμμένο. Όταν ο αισθητήρας είναι ON, το κίτρινο LED αναβοσβήνει 5 φορές για 0,5 δευτερόλεπτο και στη συνέχεια το κόκκινο LED μένει αναμμένο για 2,5 δευτερόλεπτα.
(Στην δραστηριότητα του οδηγού προτείνεται ο αισθητήρας αφής, που όμως δεν υπάρχει στο πακέτο και εδώ έχει αντικατασταθεί από τον αισθητήρα κλίσης)
Περιγραφή: Όταν η στάθμη του νερού ανεβαίνει, το κίτρινο LED ανάβει προειδοποιώντας, ενώ όταν η στάθμη ξεπεράσει το κρίσιμο όριο, το κόκκινο LED ανάβει, και ο μηχανισμός υπερχείλισης (σερβοκινητήρας) ενεργοποιείται.
Περιγραφή: Όταν ο αισθητήρας πατιέται με μικρή δύναμη, η λυχνία LED ανάβει και παραμένει αναμμένη. Όταν ο αισθητήρας πατιέται με μεγάλη δύναμη, η λυχνία LED σβήνει και παραμένει σβησμένη.
Ένας κινητήρας συνεχούς ρεύματος συνδέεται σε γέφυρα Η και ελέγχεται με δύο κουμπιά (στιγμιαίους διακόπτες Α και Β) και ένα ποτενσιόμετρο. Το κουμπί Α λειτουργεί ως διακόπτης On/Off: ένας ακίνητος κινητήρας αρχίσει να περιστρέφεται όταν πατηθεί το κουμπί Α. Με το ποτενσιόμετρο η ταχύτητα του κινητήρα αυξάνεται ή μειώνεται. Πατώντας το κουμπί Α άλλη μια φορά, ο κινητήρας σταματά. Με το κουμπί Β ελέγχεται η κατεύθυνση, ώστε ο κινητήρας να περιστρέφεται και με τις δύο φορές.
Εξαρτήματα και συνδέσεις
1 Arduino Uno R3, breadboard, καλώδια, τροφοδοσία κινητήρα
1 κινητήρας συνεχούς ρεύματος (dc motor)
1 γέφυρα Η (Η Bridge)
1 Ποτενσιόμετρο 10 kΩ
2 στιγμιαίους διακόπτες (push buttons)
2 αντιστάτες 10 ΚΩ
Η ακίδα 1 της γέφυρας H συνδέεται στην ψηφιακή ακίδα 9 στο Arduino. Από εδώ ενεργοποιείται η γέφυρα H: όταν δέχεται 5V ο κινητήρας ξεκινά, όταν δέχεται 0V ο κινητήρας σταματά. Η σύνδεση στην PWM 9 εξασφαλίζει τον έλεγχο της ταχύτητας του κινητήρα μέσω του ποτενσιόμετρου, αφού μπορούμε να έχουμε και 254 ενδιάμεσες τιμές τάσης, επιπλέον των 0 και 5V.
H ακίδα 2 της γέφυρας H συνδέεται στην ψηφιακή ακίδα 3 στο Arduino και η ακίδα 7 της γέφυρας στην ψηφιακή ακίδα 2. Αυτές είναι οι ακίδες που θα χρησιμοποιηθούν στη γέφυρα H για τον καθορισμό της κατεύθυνσης περιστροφής. Εάν η ακίδα 3 είναι LOW και η ακίδα 2 HIGH, ο κινητήρας θα περιστραφεί προς μία κατεύθυνση. Εάν η ακίδα 2 είναι LOW και η ακίδα 3 HIGH, ο κινητήρας θα περιστραφεί προς την αντίθετη κατεύθυνση. Εάν και οι δύο ακίδες είναι HIGH ή LOW ταυτόχρονα, ο κινητήρας θα σταματήσει να περιστρέφεται.
Η ακίδα 16 της γέφυρας H συνδέεται με τα 5V που έρχονται από το Arduino.
Οι ακίδες 4 και 5 είναι και οι δύο οι γειώσεις.
Στις ακίδες 3 και 6 της γέφυρα H συνδέεται ο κινητήρας. Αυτές οι δύο ακίδες θα ενεργοποιούνται και θα απενεργοποιούνται ανάλογα με τα σήματα που έρχονται στις ακίδες 2 και 7.
Στην ακίδα 8 της γέφυρας συνδέεται η εξωτερική τροφοδοσία από την πηγή, απαραίτητη σε κάθε έργο που περιλαμβάνει κινητήρες.
Κώδικας
const int controlPin1 = 2; //συνδέεται στην ακίδα 7 της γέφυρας
const int controlPin2 = 3; //συνδέεται στην ακίδα 2 της γέφυρας
/* οι ψηφιακές 2 και 3 σε συνδυασμό LOW/HIGH καθορίζουν τη φορά περιστροφής ενώ αν είναι
και οι δύο LOW ή HIGH, ο κινητήρας σταματά */
const int enablePin = 9; //συνδέεται στην ακίδα 1 της γέφυρας και την ενεργοποιεί
const int directionSwitchPin = 4; //κουμπί Β, ελέγχει τη φορά περιστροφής του κινητήρα
const int onOffSwitchStateSwitchPin = 5; //κουμπί Α, ελέγχει την έναρξη/λήξη της κίνησης του κινητήρα
const int potPin = A0; //το ποτενσιόμετρο ελέγχει την επιτάχυνση/επιβράδυνση
int onOffSwitchState = 0; //ανίχνευση τρέχουσας κατάστασης του κουμπιού Α
int previousOnOffSwitchState = 0; //καταγράφει την προηγούμενη κατάσταση του κουμπιού Α
int directionSwitchState = 0; //ανίχνευση τρέχουσας κατάστασης του κουμπιού Β
int previousDirectionSwitchState = 0; //καταγράφει την προηγούμενη κατάσταση του κουμπιού Β
int motorEnabled = 0; // ελέγχεται αν ο κινητήρας περιστρέφεται ή όχι
int motorSpeed = 0; // ταχύτητα
int motorDirection = 1; // παρακολουθεί σε ποια κατεύθυνση περιστρέφεται ο κινητήρας
void setup() {
pinMode(directionSwitchPin,INPUT);
pinMode(onOffSwitchStateSwitchPin,INPUT);
pinMode(controlPin1,OUTPUT);
pinMode(controlPin2,OUTPUT);
pinMode(enablePin,OUTPUT);
digitalWrite(enablePin,LOW);// ο κινητήρας αρχικοποιείται στο OFF
}
void loop() {
onOffSwitchState = digitalRead(onOffSwitchStateSwitchPin); //διάβασε την κατάσταση του κουμπιού Α
delay(1);
directionSwitchState = digitalRead(directionSwitchPin); //διάβασε την κατάσταση του κουμπιού Β
motorSpeed = analogRead(potPin)/4; //μετατροπή των 1024 τιμών του Α0 σε 256 του PWM
if(onOffSwitchState != previousOnOffSwitchState){
if(onOffSwitchState ==HIGH){
motorEnabled = !motorEnabled; //ο τελεστής ! χρησιμοποιείται όταν έχουμε δύο μόνο δυνατές καταστάσεις 0 και 1
/*κουμπί Α: αν διαφέρει η τρέχουσα κατάσταση από την προηγούμενη τιμή και ο διακόπτης είναι πατημένος HIGH,
τότε κάνε τη μεταβλητή της ισχύος του κινητήρα 1 (ο κινητήρας να κινηθεί)
αλλιώς, κάνε τη μεταβλητή 0. */
}
}
if (directionSwitchState != previousDirectionSwitchState) {
if (directionSwitchState == HIGH) {
motorDirection = !motorDirection;
/*κουμπί Β: αν διαφέρει η τρέχουση κατάσταση από την προηγούμενη τιμή και ο διακόπτης είναι HIGH,
τότε κάνε τη μεταβλητή της φοράς κίνησης ισχύς του κινητήρα 1 (άλλαξε κατεύθυνση)
αλλιώς, κάνε τη μεταβλητή 0. */
}
}
if(motorDirection == 1){
digitalWrite(controlPin1, HIGH);
digitalWrite(controlPin2, LOW);
/*αλλάζει η κατεύθυνση με αυτόν τον συνδυασμό*/
}
else {
digitalWrite(controlPin1, LOW);
digitalWrite(controlPin2, HIGH);
}
if(motorEnabled == 1) {
analogWrite(enablePin, motorSpeed);
}
else {
analogWrite(enablePin, 0);
}
previousDirectionSwitchState = directionSwitchState;
previousOnOffSwitchState = onOffSwitchState; //αποθήκευση της τρέχουσας κατάστασης των διακοπτών, ως "προηγούμενη κατάσταση" για την επόμενη εκτέλεση του προγράμματος.
}