Arduino Masterclass - Μάθημα 3.2 | Βιομιμητική Κίνηση: Υλοποίηση του αλγορίθμου "Run and Tumble"
Καλώς ήρθατε στο πιο "ζωντανό" μάθημα της Ενότητας 3. Σήμερα θα αφήσουμε πίσω μας την αυστηρή, γεωμετρική κίνηση και θα δανειστούμε μια στρατηγική από τη φύση. Θα προγραμματίσουμε το ρομπότ μας να κινείται όπως τα βακτήρια (π.χ. το E. coli), χρησιμοποιώντας τον αλγόριθμο Run and Tumble.
🧬 Τι είναι το "Run and Tumble";
Στη φύση, τα βακτήρια δεν έχουν χάρτες ή GPS. Για να βρουν τροφή, ακολουθούν μια απλή αλλά πανίσχυρη λογική:
Run (Τρέξιμο): Κινούνται σε μια ευθεία γραμμή για ένα διάστημα.
Tumble (Περιστροφή): Σταματούν και περιστρέφονται τυχαία προς μια νέα κατεύθυνση.
Επανάληψη: Αν το περιβάλλον βελτιώνεται (π.χ. περισσότερη τροφή ή καθαρότερος αέρας), το "Run" διαρκεί περισσότερο. Αν όχι, κάνουν "Tumble" πιο συχνά.
🛠️ Τι θα χρειαστείτε
Το ρομποτικό όχημα από το Μάθημα 3.1 (με L298N και 2 μοτέρ).
Arduino Uno ή Beetle ESP32-C3.
Προαιρετικά: Έναν αισθητήρα (π.χ. υπερήχων ή ποιότητας αέρα) για να επηρεάζει την κίνηση.
💻 Ο Κώδικας (The Implementation)
Σε αυτό το παράδειγμα, θα υλοποιήσουμε τη βασική τυχαία κίνηση. Θα χρησιμοποιήσουμε τη συνάρτηση random() για να δώσουμε στο ρομπότ "ελεύθερη βούληση".
// Ορισμός Pin για το L298N (βλ. Μάθημα 3.1)
const int motorA1 = 5;
const int motorA2 = 6;
const int motorB1 = 9;
const int motorB2 = 10;
void setup() {
pinMode(motorA1, OUTPUT);
pinMode(motorA2, OUTPUT);
pinMode(motorB1, OUTPUT);
pinMode(motorB2, OUTPUT);
// Αρχικοποίηση τυχαίας γεννήτριας μέσω μιας ελεύθερης αναλογικής θύρας
randomSeed(analogRead(0));
}
void loop() {
runStraight();
delay(random(1000, 3000)); // "Run" για 1 έως 3 δευτερόλεπτα
tumble();
delay(random(500, 1500)); // "Tumble" για τυχαίο χρόνο (γωνία)
}
void runStraight() {
digitalWrite(motorA1, HIGH);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, HIGH);
digitalWrite(motorB2, LOW);
}
void tumble() {
// Περιστροφή γύρω από τον εαυτό του
digitalWrite(motorA1, HIGH);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, LOW);
digitalWrite(motorB2, HIGH);
}
void stopRobot() {
digitalWrite(motorA1, LOW);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, LOW);
digitalWrite(motorB2, LOW);
}
🧠 Η Λογική της Unique Tech: Χημειοτακτισμός (Chemotaxis)
Στο δικό μας project MLA (Bio-Robotic System), δεν θέλαμε το ρομπότ απλώς να κινείται τυχαία. Θέλαμε να βρίσκει το σημείο με τον καθαρότερο αέρα μέσα σε ένα δωμάτιο.
Πώς το κάναμε:
Αν ο αισθητήρας run και αυξάνουμε την πιθανότητα για tumble. Έτσι, το ρομπότ "ξεφεύγει" γρήγορα από τις μολυσμένες περιοχές και "παγιδεύεται" εκεί που ο αέρας είναι καθαρός.
💡 Pro-Tip από το Εργαστήριο
"Όταν χρησιμοποιείτε τη συνάρτηση
random(), το Arduino παράγει τους ίδιους αριθμούς κάθε φορά που ξεκινάει. Για να είναι πραγματικά τυχαίο, χρησιμοποιήστε πάντα την εντολήrandomSeed(analogRead(0));στοsetup. Η θύρα$A0$ , επειδή είναι 'στον αέρα', διαβάζει ηλεκτρομαγνητικό θόρυβο που είναι πάντα διαφορετικός!"
🚀 Πρόκληση (Challenge)
Μπορείτε να τροποποιήσετε τον κώδικα ώστε αν το ρομπότ πλησιάσει ένα εμπόδιο (χρησιμοποιώντας τον αισθητήρα υπερήχων από το Μάθημα 2.1), να εκτελεί αυτόματα ένα "Tumble" 180 μοιρών;
Στο επόμενο μάθημα (3.3: Σερβοκινητήρες), θα μάθουμε πώς να δίνουμε ακρίβεια χιλιοστού στις κινήσεις μας!
Σχόλια
Δημοσίευση σχολίου