Μετράμε απόσταση και ταχύτητα στο ρομπότ R2

Μετράμε απόσταση και ταχύτητα στο ρομπότ R2

Τι θα κάνουμε σήμερα;

Σήμερα θα φτιάξουμε ένα ψηφιακό κοντέρ για το ρομπότ R2.

Θα μάθουμε πώς:

  • μετράμε πόσα εκατοστά έχει διανύσει το ρομπότ,
  • υπολογίζουμε την ταχύτητά του (σε cm/s),
  • ελέγχουμε αν οι υπολογισμοί μας είναι σωστοί, βλέποντας τι εμφανίζεται στο Serial Monitor.

Για τις δοκιμές μας, το ρομπότ θα είναι στον αέρα (κρατημένο ή σε βάση), ώστε να είναι συνδεδεμένο με καλώδιο USB στον υπολογιστή.


Τι θα μάθουμε;

Μετά το εργαστήριο θα μπορείς να εξηγήσεις:

  1. Πώς ένας μαγνήτης και ένας αισθητήρας μπορούν να μας πουν πόσο γύρισε μια ρόδα
  2. Πώς από τις περιστροφές βρίσκουμε απόσταση
  3. Πώς μετράμε χρόνο χωρίς να “παγώνει” το πρόγραμμα
  4. Γιατί το ρομπότ χρειάζεται δύο ρόδες για σωστό υπολογισμό
  5. Πώς ελέγχουμε τα αποτελέσματα στον υπολογιστή

Υλικά

  • Ρομπότ R2
  • 2 μαγνήτες (ένας σε κάθε ρόδα)
  • 2 μαγνητικούς αισθητήρες (ένας για κάθε ρόδα)
  • Υπολογιστής με Mind+
  • Καλώδιο USB

Σημαντική πληροφορία

Η περίμετρος κάθε ρόδας είναι:

20 εκατοστά

Άρα:

  • 1 πλήρης περιστροφή ρόδας = 20 cm
  • 1 πέρασμα μαγνήτη μπροστά από τον αισθητήρα = 20 cm

Η βασική ιδέα

Το ρομπότ έχει δύο ρόδες:

  • μία αριστερά
  • μία δεξιά

Όταν πηγαίνει ευθεία, οι ρόδες γυρίζουν σχεδόν το ίδιο. Όταν στρίβει, η μία ρόδα γυρίζει λίγο περισσότερο και η άλλη λίγο λιγότερο. Για να βρούμε πόσο προχώρησε το ρομπότ συνολικά, κάνουμε κάτι πολύ απλό και δίκαιο:

Παίρνουμε τον μέσο όρο της απόστασης των δύο τροχών.

Δηλαδή:Αποˊσταση ρομποˊτ=Αριστερηˊ αποˊσταση+Δεξιαˊ αποˊσταση2\text{Απόσταση ρομπότ} = \frac{\text{Αριστερή απόσταση} + \text{Δεξιά απόσταση}}{2}


Βήμα 1: Μετράμε πόσες φορές γύρισε κάθε ρόδα

Δημιουργούμε δύο μεταβλητές – μετρητές:

  • rotationL → πόσες φορές πέρασε ο μαγνήτης από την αριστερή ρόδα
  • rotationR → πόσες φορές πέρασε ο μαγνήτης από τη δεξιά ρόδα

Κάθε φορά που ο αισθητήρας “βλέπει” τον μαγνήτη θα πρέπει να αυξάνουμε τον αντίστοιχο μετρητή κατά 1. Όταν ο αισθητήρας δεν βλέπει τον μαγνήτη επιστρέφει την τιμή μηδέν (0) ενώ όταν τον βλέπει επιστρέφει την τιμή ένα (1).

Πολύ σημαντική διευκρίνιση: γιατί δεν μετράμε απλώς “αν ο αισθητήρας είναι 1”

Το πρόγραμμα τρέχει πάρα πολύ γρήγορα. Το “για πάντα” δεν εκτελείται μία φορά το δευτερόλεπτο, αλλά εκατοντάδες ή και χιλιάδες φορές. Όταν λοιπόν ο μαγνήτης περνάει μπροστά από τον αισθητήρα:

  • δεν εμφανίζεται για μία μόνο στιγμή,
  • αλλά για λίγο χρόνο, όσο κυλάει η ρόδα.

Αν το πρόγραμμα ελέγχει:

«Ο αισθητήρας είναι 1;»

τότε:

  • θα τον “δει” πολλές φορές,
  • και θα νομίσει ότι ο μαγνήτης πέρασε πολλές φορές,
  • ενώ στην πραγματικότητα πέρασε μία φορά.
Βλέπουμε σε αργή κίνηση πως ο αισθητήρας μένει πολύ ώρα αναμμένος όσο περνάει ο μαγνήτης

Το σωστό κόλπο: μετράμε την αλλαγή, όχι την κατάσταση

Θέλουμε να μετράμε μόνο τη στιγμή που ο μαγνήτης εμφανίζεται, όχι όλο το διάστημα που φαίνεται. Γι’ αυτό κρατάμε τη προηγούμενη κατάσταση του αισθητήρα. Θα χρειαστούμε λοιπόν άλλες 2 μεταβλητές:

  • beforeL (0 ή 1 – τι έβλεπε πριν ο αριστερός αισθητήρας)
  • beforeR (0 ή 1 – τι έβλεπε πριν ο δεξιός αισθητήρας)
Αρχικά θα τα κάνω 1 για να μην μετρήσει περιστροφή το R2 στην περίπτωση που ο μαγνήτης είναι κοντά στον αισθητήρα

Λογική (για κάθε ρόδα):

Αν τώρα ο αισθητήρας είναι 1
ΚΑΙ πριν ήταν 0
ΤΟΤΕ μετράμε 1 περιστροφή

Δηλαδή:

  • μετράμε μόνο το 0 → 1
  • όχι όσο μένει στο 1

Αυτό σημαίνει:

«Μετράμε το πέρασμα, όχι τη διάρκεια.»


Βήμα 2: Μετράμε χρόνο χωρίς wait ⏱️

Δεν χρησιμοποιούμε wait ή delay, γιατί:

  • το πρόγραμμα σταματά,
  • δεν μετρά αισθητήρες,
  • χάνει παλμούς.

Αντί γι’ αυτό, χρησιμοποιούμε ένα ρολόι.

Μεταβλητές:

  • lastTime → πότε κάναμε τελευταία φορά υπολογισμό

Ελέγχουμε συνέχεια:

«Πέρασαν 6000 ms (δηλαδή 6 δευτερόλεπτa) από την τελευταία φορά;»

Αν ναι → κάνουμε υπολογισμούς.


Βήμα 3: Υπολογισμός απόστασης

Κάθε 6 δευτερόλεπτa:

  1. Η απόσταση της αριστερής ρόδας είναι οι περιστροφές που έγιναν επί 20 εκατοστά
  2. Το ίδιο και για την δεξιά
  3. Άρα σε αυτό το δευτερόλεπτο το ρομπότ προχώρησε distance = (rotationL*20 + rotationR*20) / 2
  4. Άρα η συνολική απόσταση που έχει προχωρήσει είναι totalDistance = totalDistance + distance
  5. Μηδενίζουμε roationL και rotationR

Έτσι:

  • υπολογίζουμε πόσο προχώρησε το ρομπότ μέσα σε αυτά τα 6 δευτερόλεπτα
  • και το προσθέτουμε στο “κοντέρ”.

Βήμα 4: Υπολογισμός ταχύτητας

Αφού το distance είναι εκατοστά σε 6 δευτερόλεπτa, τότε:

speed = distance/6 (cm/s)


Έλεγχος με Serial Monitor (δοκιμές)

Για να ελέγξουμε αν όλα δουλεύουν σωστά:

  1. Συνδέουμε το R2 με καλώδιο USB στον υπολογιστή
  2. Ανοίγουμε το Serial Monitor
  3. Κάθε 6 δευτερόλεπτa τυπώνουμε:
  • roationL
  • rotationR
  • distance
  • totalDistance
  • speed

και δεν ξεχνάμε να ορίσουμε ότι η lastTime (πότε ελέγξαμε τελευταία φορά) είναι τώρα!

Το τελικό πρόγραμμα

Δοκιμή 1: Γύρνα τη ρόδα με το χέρι

  • 1 περιστροφή → +20 cm
  • 5 περιστροφές → +100 cm

Δοκιμή 2: Διαφορά ροδών

Γύρνα:

  • μόνο την αριστερή ρόδα → δες ότι ο μέσος όρος λειτουργεί
  • μόνο τη δεξιά → ίδιο αποτέλεσμα

Τι καταφέραμε

✔ Μετρήσαμε απόσταση χωρίς χάρακες
✔ Υπολογίσαμε ταχύτητα χωρίς χρονόμετρο
✔ Μάθαμε να δουλεύουμε με χρόνο χωρίς pause
✔ Χρησιμοποιήσαμε δύο ρόδες για πιο σωστά αποτελέσματα

Σχόλια

Δεν υπάρχουν ακόμη σχόλια. Γιατί δεν ξεκινάτε τη συζήτηση;

Αφήστε μια απάντηση