Pages

Τρίτη 22 Απριλίου 2025

Συντακτικός Χρωματισμός Γλώσσας Assembly MSP430 στο Code Composer Studio - Theia

Εισαγωγή

Όσοι με γνωρίζουν, ξέρουν πως η συμπάθειά μου για τους μικροελεγκτές MSP430 της Texas Instruments είναι μεγάλη. Είναι 16 bit, πολυ χαμηλής κατανάλωσης, με μπόλικο διαθέσιμο περιφερειακό hardware και γενικά είναι πολύ φιλικοί στη χρήση σε προχωρημένα κυκλώματα. Βέβαια, άλλη μια μεγάλη συμπάθεια την έχω και στο λειτουργικό Linux που εδώ και πάρα πολλά χρόνια (από το 2ο μισό της δεκαετίας του '90) κάνει τα μηχανήματά μου να λειτουργούν άψογα. Ο συνδυασμός είναι που δημιουργεί και τη σημερινή ανάρτηση :)

Η εταιρία Texas Instruments, εδώ και αρκετά χρόνια (εγώ γνώρισα τη σειρά MSP430 από το 2003) έχει δημιουργήσει το περιβάλλον προγραμμαστισμού Code Composer Studio, ή αλλιώς CCS. Το CCS από κάποια έκδοση και μετά (δε θυμάμαι ποια) είναι βασισμένο στο περιβάλλον Eclipse, όπως και περιβάλλοντα από άλλες εταιρίες για τον προγραμματισμό των δικών τους μκροελεγκτών. Γενικά η πλατφόρμα Eclipse χρησιμοποιείται πάρα πολύ σε περιβάλλοντα προγραμματισμού μικροελεγκτών μιας και είναι αρκετά ευέλικτη και επεκτάσιμη. Η δύναμη του ανοικτού λογισμικού!

Όλα αυτά τα χρόνια, τα project που έχω φτιάξει με τους εν λόγω μικροελεγκτές και to CCS είναι πραγματικά άπειρα! Το CCS είναι, φυσικά, το εργαλείο με το οποίο φτιάχνω τον κώδικα κάθε φορά. Η γλώσσα που χρησιμοποιώ είναι η assembly μιας και συνήθως έχω να κάνω με ευαίσθητα χρονικά περιθώρια κατά την εκτέλεση του κώδικα, αλλά και του μεγάλου αριθμού βιβλιοθηκών που έχω χτίσει και επαναχρησιμοποιώ, με ελάχιστες τροποποιήσεις.

Τον τελευταίο καιρό και με την εμφάνιση της σειράς των μικροελεγκτών MSPM0, η Texas Instruments ξεκίνησε τη μετάβαση του CCS στην πλατφόρμα Eclipse-Theia. Εδώ είναι που ξεκινάει η ανάγκη για τη δημιουργία ενός extension για χρωματική σύνταξη της γλώσσας assembly για τους MSP430... Αλλά ας τα πάρουμε όλα από την αρχή.

Code Composer Studio και Eclipse Theia

Εδώ και λίγα χρόνια, η μαμά εταιρία ξεκίνησε μια προσπάθεια να αλλάξει το περιβάλλον στο οποίο βασιζόταν το CCS και να περάσει σταδιακά στην πλατφόρμα Eclipse-Theia. Η Eclipse Theia είναι μια νεότερη, ευέλικτη πλατφόρμα ανάπτυξης που μοιάζει οπτικά με το VS Code, αλλά με σημαντικές τεχνολογικές και αρχιτεκτονικές διαφορές από την κλασική Eclipse IDE. Tα βασικά χαρακτηριστικά και oi διαφορές τους φαίνονται στον ακόλουθο πίνακα:

Σύγκριση Eclipse IDE με Eclipse Theia
Χαρακτηριστικό Eclipse IDE Eclipse Theia
Αρχιτεκτονική Μονολιθική εφαρμογή (Desktop only) Διαχωρισμός client/server (cloud-ready)
Επεκτασιμότητα Χρησιμοποιεί παλιότερο plugin system (OSGi) Υποστηρίζει VS Code extensions (και δικά της plugins)
Τεχνολογία Java/SWT (παλιότερα GUI frameworks) HTML/CSS/TypeScript (modern web stack)
Cloud/Remote Development Απαιτεί "εξωτερικές" λύσεις (π.χ. Eclipse Che) Επίσημη υποστήριξη για cloud και containers
Διαθέσιμες Εκδόσεις Μόνο desktop εφαρμογή Λειτουργεί ως web app ή desktop (Electron)
Απίτηση σε Εξοπλισμό Βαρύτερο, με πιο πολλά pre-installed tools Πιο ελαφρύ και γρήγορο (συγκρίσιμο με VS Code)

Και οι δύο πλατφόρμες είναι ανοικτού κώδικα και υποστηρίζονται από το Eclipse Foundation.

Πλεονεκτήματα παλιόυ Eclipse IDE

  1. Ωριμότητα:Maturity:
    • Έχει περισσότερα built-in tools (π.χ., JDT για Java, CDT για C/C++).
    • Καλύτερη υποστήριξη για legacy projects (π.χ., Swing, RCP).
  2. Δεσμευμένη Κοινότητα:
    • Πιο πολλά plugins και εκπαιδευτικό υλικό για ειδικές χρήσεις (π.χ., enterprise Java).
  3. Ολοκληρωμένα Features:
    • Έτοιμα εργαλεία για debugging, profiling, και testing σε βάθος.

Πλεονεκτήματα Eclipse Theia

  1. Cloud-First:
    • Σχεδιάστηκε για cloud-based environments (π.χ., Docker, Kubernetes).
    • Μπορεί να τρέξει ως web application (π.χ., σε browser) ή ως desktop app.
  2. Συμβατότητα με VS Code:
    • Υποστηρίζει extensions του VS Code (μέσω του OpenVSX marketplace), αλλά και δικά της plugins.
    • Παρόμοιο UI/UX με το VS Code (π.χ., activity bar, side panels).
  3. Ευελιξία:
    • Επιτρέπει εξαιρετική προσαρμογή (π.χ., δημιουργία custom IDEs για συγκεκριμένες ανάγκες).
    • Ιδανική για embedded και IoT development (όπως ο MSP430).
  4. Ταχύτερη Εκκίνηση:
    • Λιγότερο "φορτωμένη" από την κλασική Eclipse, με πιο γρήγορη απόκριση.

Βλέπουμε πως η πλατφόρμα Theia είναι δημιουργημένη με βλέμα στις τρέχουσες τεχνολογίες και δυναμικές της δημιουργίας software. Συνεπώς είναι πολύ λογική η κίνηση της Texas Instruments να μεταβεί στη νέα πλατφόρμα για το Code Composer Studio. Αυτή τη στιγμή που δημιουργείται το παρόν άρθρο, το CCS Theia βρίσκεται στην έκδοση 20.1.1.8.

Code Composer Studio Theia

Το Code Composer Studio (CCS) Theia είναι η νεότερη, cloud-enabled έκδοση του παραδοσιακού CCS της Texas Instruments. Αποτελεί μια μοντέρνα εναλλακτική για ανάπτυξη ενσωματωμένων συστημάτων (MSP430, Sitara, C2000 κλπ.), με τεχνολογικές βελτιώσεις και νέες δυνατότητες. Τα χαρακτηριστικά του είναι:

  1. Μοντέρνα Αρχιτεκτονική:
    • Βασίζεται σε Eclipse Theia (web/cloud-ready) αντί για την παλιά πλατφόρμα Eclipse IDE.
    • Υποστηρίζει και desktop (Electron) και cloud-based ανάπτυξη (π.χ., μέσω Docker).
  2. VS Code-like Εμπειρία:
    • Παρόμοιο UI με το VS Code (activity bar, side panels, terminal integration).
    • Υποστηρίζει extensions του VS Code (μέσω του OpenVSX marketplace).
  3. Cloud & Remote Development:
    • Λειτουργεί σε containers (π.χ., Docker) για ευκολότερη διαχείριση dependencies.
    • Ιδανικό για ομαδικές εργασίες ή ανάπτυξη σε απομακρυσμένα συστήματα.
  4. Βελτιωμένη Επεκτασιμότητα:
    • Ευκολότερη ενσωμάτωση νέων εργαλείων και γλωσσών (μέσω TypeScript/JavaScript).
    • Διαχωρισμός μεταξύ frontend (browser) και backend (compiler/debugger).
  5. Ενσωματωμένα Εργαλεία TI:
    • Διατηρεί όλα τα γνωστά εργαλεία του CCS (π.χ., MSP430 compiler, debugger, EnergyTrace).
    • Επίσημη υποστήριξη για TI SDKs και πακέτα BSPs.

Πλεονεκτήματα του CCS Theia

  • Γρήγορη προσαρμογή: Εύκολη προσθήκη νέων γλωσσών ή εργαλείων (π.χ., Python για scripting).
  • Cross-platform: Λειτουργεί σε Windows/Linux/macOS και ως web app.
  • Debugging anywhere: Ο debugger μπορεί να τρέξει σε απομακρυσμένο μηχάνημα (π.χ., cloud server).
  • Σύγχρονη ανάπτυξη plugins: Με TypeScript αντί για Java (πιο προσβάσιμο για web developers).

Πιθανά Μειονεκτήματα

  • Λιγότερα plugins: Η κοινότητα ακόμα μεταναστεύει από το κλασικό Eclipse.
  • Όχι όλα τα features: Κάποιες προηγμένες λειτουργίες του classic CCS μπορεί να λείπουν.
  • Εξάρτηση από browsers: Η web έκδοση μπορεί να έχει περιορισμούς σε offline λειτουργία.

Σε γενικές γραμμές, το CCS Theia είναι ένα πολλά υποσχόμενο βήμα προς τη μελλοντική ανάπτυξη ενσωματωμένων συστημάτων, ιδιαίτερα αν είναι αναγκαία η ολοκλήρωαη cloud ή αν κάποιος προτιμάει μια VS Code-like εμπειρία. Ωστόσο, αν είναι απαραίτητα κάποια legacy plugins ή προηγμένες λειτουργίες του κλασικού CCS, ίσως αξίζει η αναμονή μέχρι να ωριμάσει.

Syntax Highlighting

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

Κάπως έτσι ξεκινάει και η σημερινή ανάρτηση... Τό κλασικό, παλιό CCS υποστηρίζει άψογα τη χρωματική σύνταξη, την οποία μάλιστα μπορούμε να επιλέξουμε ακόμα και τα χρώματα που θέλουμε να εμφανίζεται το κάθε στοιχείο. Ενώ το CCS Theia υποστηρίζει χρωματική σύνταξη σε ανώτερες γλώσσες προγραμματισμού, όπως C/C++, για την assembly ούτε καν υπάρχει στα πλάνα των κατασκευαστών του. Όσο για την ήδη υπάρχουσα χρωματκή σύνταξη, η επιλογή των χρωμάτων έχει γίνει από τους κατασκευαστές του CCS Theia και ο χρήστης δεν έχει τη δυνατότητα να τα αλλάξει!

Η συμπάθειά μου για τη γλώσσα assembly είναι γνωστή. Όμως το να έχω ένα περιβάλλον προγραματισμού χωρίς χρωματική σύνταξη είναι λίγο οδυνηρό, μιας κι έχω καλομάθει ακόμα από την εποχή του ZX Spectrum και του Amstrad 6128 που προγραμμάτιζα σε assembly του Z80, με χρωματική σύνταξη... βασική χρωματική σύνταξη αλλά υπήρχε! Βασικά, ήμουν της άποψης να αφήσω λίγο το Theia να ωριμάσει και μέχρι τώρα χρησιμοποιούσα το παλιό καλό CCS. Όμως, μιας και χρησιμοποιώ το openSUSE Tumbleweed το οποίο βάζει πάντα τις τελευταίες βιβλιοθήκες κλπ, μετά από κάποια αναβάθμιση το CCS σταμάτησε να λειτουργεί! Όχι, πως αυτό αργά ή γρήγορα δε θα συνέβαινε, ούτως ή άλλως. Και μιας κι έχει σταματήσει η υποστήριξή του από τη μαμά εταιρία, η χρήση του CCS Theia είναι πλέον μονόδρομος.

Αρχικά έγραφα τον κώδικα στο αγαπημένο μου Kate, στο οποίο εδώ και αρκετά χρόνια έχω φτιάξει χρωματική σύνταξη για την assembly του MSP430, ενώ κάποια στιγμή το εξέλιξα συμπληρώνοντας και τα νέα δεδομένα του MSP430X. Όμως, το να γυρίζεις από editor σε editor είναι λίγο κουραστικό. Έτσι, πήρα την απόφαση να δω πως μπορώ να προσθέσω χρωματική σύνταξη στο CCS Theia. Αρχικά να αναφέρω πως δεν έιχα ιδέα πώς θα μπορούσε να γίνει αυτό, αλλά έψαχνα ν βρω τίποτα έτοιμα extensions που να κάνουν τη δουλειά μου. Βρήκα κάποιο extension που έκανε για το VS Code και ψάχνοντας τριγύρω βρήκα πως το Theia υποστηρίζει τα VS Code Extensions. Προσάθησα να δω πως θα το εγκαταστήσω... Μου πήρε λίγο χρόνο και μερικές ταρζανιές και τελικά βρήκα τι να κάνω και που θα περάσω τον κατάλογο του extension για να το δει το Theia και να το χρησιμοποιήσει. Όμως, η χρωματική σύνταξη που μου προσεφερε δεν ήταν αυτό που ήθελα. Έτσι, μετά από αρκετό διάβασμα και reverse engineering σε άλλα plugins βρήκα πως μπορώ να φτιάξω ένα δικό μου extension επάνω στο ίδιο το CCS Theia.

Τελικό Syntax Highlighting Extension για το CCS Theia

Και αφού έβαλα κάτω το documentation του TextMate, του VS Code και του Eclipse Theia τελικά κατάφερα να δημιουργήσω ένα extension που να μου παρέχει όσα χρειάζομαι. Όλα; Περίπου. Αυτό που δε μπόρεσα να κάνω είναι να επιλέγω ακριβώς το χρώμα που θα ήθελα να εμφανίζεται το κάθε στοιχείο. Όμως, χρησιμοποιώντας τα ήδη υπάρχοντα χρώματα έχω αυτό που με βοηθάει, πλέον, να γράψω τον κώδικά μου στην αγαπημένη μου γλώσσα.

Αρχικά ας δούμε ποια είναι τα υπάρχοντα χρώματα. Για να μπορέσω να τα βρω, αρχικά έψαχνα αρχεία στα οποία περιγράφονται. Βασικά έτσι θα μπορούσα να τα αλλάξω, αλλά... δεν βρήκα τίποτα. Έτσι, πέρασα στο επόμενο βήμα, να χρησιμοποιήσω το εργαλείο CTRL+SHIFT+P => Developer: Inspect Tokens. Από τη στιγμή που το TextMate ορίζει κάποια classes (βλ. TextMate Language JSON) μπορούμε, με υπομονή, να τα δοκιμάσουμε όλα. Έτσι, βγαίνει το ακόλουθο στιγμότυπο:

Colour Classes Set By TextMate

Για να δημιουργηθεί το στιγμιότυπο με τα χρώματα χρησιμοποιήθηκε το LibreOffice Calc ενώ μέσα στα macros μπήκε κώδικας του JohnSUN που βρίσκεται στο forum του LiberOffice.org

Οι δυνατότητες που έχουν μπει στο extension είναι αρκετές. Ας τις δούμε όπως περιγράφοτναι μέσα στο readme.md του extension:

  • Ετικέτες: Οι ετικέτες είναι λεκτικά που ορίζονται να δείχνουν συγκεκριμένες τιμές, όπως την τρέχουσα θέση προγράμματος, μια σταθερά, κλπ. Για να δηλωθεί μια ετικέτα πρέπει να εμφανιστή στην αρχή-αρχή της γραμμής. Μια ετικέτα μπορεί να περιέχει γράμματα, κεφαλαία ή μικρα, ψηφία, την κάτω παύλα ('_') και το δολάριο ('$'), ενώ ο πρώτος της χαρακτήρας δε μπορεί να είναι ψηφίο ή δολάριο. Μπορεί να ακολουθείται προεραιτικά από ':'.Φυσικά, όταν χρησιμοποιούνται στον κώδικα για ανάκτηση της τιμής της ετικέτας, τότε δεν μπαίνει η ':'.
  • Τοπικές Ετικέτες: Οι τοπικές ετικέτες χρησιμοποιούνται μέσα σε macros. Όταν ένα macro γίνεται expand σε ένα σημείο του προγράμματος, αν ορίζει συγκεκριμένες ετικέτες, τότε στην περίπτωση που το macro χρησιμοποιείται παραπάνω από μια φορές, η ίδια ετικέτα θα ορίζεται και αυτή παραπάνω από μια φορές. Το αποτέλεσμα θα είναι η δημιουργία ένός σφάλματος. Γι' αυτό το λόγο περιγράφουμε τοπικές ετικέτες, στις οποίες, κάθε φορά που ένα macro γίνεται expand, ο compiler προσθέτει και έναν αριθμό μοναδικό ώστε να αποφευχθεί το πρόβλημα του επαναορισμού. Αυτές είναι κανονικές ετικέτες οι οποίες ακολουθούνται από το Αγγλικό ερωτηματικό ('?'). Μέσα στον κώδικα, όταν γίνεται χρήση της ετικέτας για ανάκτηση της ορισθείσας τιμής, το τελικό '?' είναι απαραίτητο να υπάρχει.
  • Ετικέτες Αντικατάστασης: Επίσης σε λειτουργίες macro υπάρχει η περίπτωση να θέλουμε να δωθεί μια τιμή από τις παραμέτρους. Αυτή η τιμή να αντικαταστήσει ένα τμήμα μιας άλλης ετικέτας. Έτσι, δημιουργούμε την ετικέτα αντικατάστασης, η οποία είναι μια κανονική ετικέτα που πριν και μετά από αυτή υπάρχψει το σύμβολο ':'. Κατά τη διάρκεια της μεταγλώτισσης αυτό το τμήμα της ετικέτας αντικαθίσταται με την ίδια της την τιμή. Ένα παράδειγμα είναι η ετικέτα ":count:"
  • Σχετικές ετικέτες: Είναι ατικέτες που αντικαθίστανται από κατάλληλη τιμή του PC στο σημείο που έχουν οριστεί, όπως η ετικέτα '$'.
  • Μνημονικά: Τα μηνμονικά είναι ουσιαστικά οι εντολές που γνωρίζει ο επεξεργαστής μας. Το extension αναγνωρίζει όλα τα μηνμονικά που περιέχει η οικογένεια MSP430 και η εκτεταμένη οικογένεια MSP430X. Τα μνημονικά χρωματίζονται διαφορετικά:
    1. Βασικά μνημονικά: Είναι τα μνημονικά που εκτελούν κανονικές λειτουργίες. Η οικογένεια MSP430 είναι τύπου RISC κι έτσι υποστηρίζει 27 βασικές εντολές.
    2. Μνημονικά αλλαγής της ροής του προγράμματος: Μνημονικά όπως τα JMP, BR, CALL και RET.
    3. Εξομοιούμενα μνημονικά: Είναι μνημονικά που θα μπορούσαν να χρησιμοποιηθούν, αλλά στην πραγματικότητα εξομοιώνουν κάποιες άλλες εντολές από ττα βασικά μνημονικά. Π.χ. ένα τέτοιο είναι το INC Rx όπου στην πραγματικότητα αυτό αντικαθίσταται από το ADD #1,Rx. Τέτοια μνημονικά υπάρχουν 24 μέσα στην assembly του MSP430 και αναγνωρίζονται από το extension δείχνοντάς τα διαφορετικά. Αυτό είναι αρκετά χρήσιμο αν κάποιος προσπαθεί να δει τους κύκλους που χρειάζεται μια εντολή ή το χώρο που καταλαμβάνει μέσα στη μνήμη, μιας και αυτό θα πρέπει να γίνει με βάση την ακριβή εντολή που εκτελείται.
    4. Εξομοιούμενα μνημονικά αλλαγής ροής προγράμματος: Είναι μνημονικά, όπως η εντολή RET που εξομοιώνεται με την εντολή MOV @SP+,PC και αλλάζει την ομαλή ροή του προγράμματος.
    5. Εκτεταμένα βασικά μνημονικά: Είναι μνημονικά της οικογένειας MSP430X που δεν υπάρχουν στην MSP430. Αυτά έχουν τη δυνατότητα να λειτουργούν με 20-bit καταχωρητές, για προσπέλαση σε μεγαλύτερη μνήμη και επεξεργασία 20-bit τιμών.
  • Εκτεταμένα εξομοιούμενα μνημονικά: Όπως η οικογένεια MSP430 έχει μνημονικά που τα εξομοιώνει με χρήση βασικών, έτσι γίνεται και με την οικογένεια MSP430X. Με τον ίδιο τρόπο θα δούμε την εντολή INCX Rx να εξομοιώνεται με χρήση της βασικής εντολής ADDX #1,Rx.
  • Εκτεταμένα μνημονικά αλλαγής ροής προγράμματος: Ανήκουν στην οικογένεια MSP430X και είναι μνημονικά που εκμεταλεύονται την επεκταμένη μνήμη 20-bit που χρησιμοποιεί. Αποτελείται από μνημονικά όπως CALLA που μπορεί να κάνει κλήση σε μια υπορουτίνα που βρίσκεται σε όλο το φάσμα της χρησιμοποιούμενης μνήμης και πάνω από τα πρώτα 64ΚΒ.
  • Εκτεταμένα εξομοιούμενα μνημονικά αλλαγής ροής προγράμματος: Εκτεταμένα μνημονικά αλλαγής ροής του προγράμματος, όπως η RETA που εξομοιώνεται από την εντολή MOVA @SP+,PC.
  • Επιθέματα των εντολών: Μια εντολή μπορεί να προσπελάσει τιμές ενός byte, μιας λέξης ή μιας 20-bit λέξης. Έτσι, υπάρχουν τα επιθέματα .B, .W και .A αντίστοιχα.
  • Καταχωρητές: Οι οικογένειες MSP430(X) έχουν 16 καταχωρητές, τους R0 έως R15. Κάποιοι από αυτούς έχουν ειδική λειτουργία, όπως ο R0 που είναι ο PC, ο R1 που είναι ο SP και ο R2 που είναι ο SR.
  • Αριθμούς: Δυαδικούς, οκταδικούς, δεκαδικούς ή δεκαεξαδικούς, είτε με χρήση προθέματος, όπως ο 0xFF35 είτε με χρήση επιθέματος, όπως ο 0FF35h.
  • Σύμβολα: Αριθμητικά ή λογικών πράξεων, κλπ.
  • Λεκτικά: Είτε με χρήση απλών είτε με χρήση διπλών εισαγωγικών.
  • Εκτεταμένοι χαρακτήρες: Οι ειδικοί χαρακτήρες που χρησιμοποιούνται όπως οι απλοί όταν προηγείται η '\', όπως ο '\n', κλπ.
  • Προ-ορισμένες συναρτήσεις: Από τον preprocessor ορίζονται κάποιες βασικές συναρτήσεις, όπως οι $HI16(), $LO16() ή $isdefed(). Αυτές οι συναρτήσεις πάντα ξεκινάνε από $
  • Εντολές του preprocessor: Οδηγείες που δίνουμε στον preprocessor ώστε να διαμορφώσει κατάλληλα το πρόγραμμά μας, όπως .align για να κάνει στοίχιση κάποιας μεταβλητής σε κατάλληλη θέση στη μνήμη, ή .sect που ορίζει τον τομέα της μνήμης στην οποία θα μπει το ακόλουθο τμήμα προγράμματος, κλπ.
  • Σχόλια: Είναι γνωστή η δύναμη των σχολίων στον κώδικά μας. Στην assembly υποστηρίζονται μόνο σχόλια μιας γραμμής. Αυτά είτε ξεκινάνε με ';' σε οποίοδήποτε σημείο μιας γραμμής (αρχή ή όχι), είτε ξεκινάνε με '*', αλλά αυτό πρέπει να είναι στην αρχή-αρχή της γραμμής.
  • Εμφωλευμένα σχόλια: Πολλές φορές μέσα στον κώδικά μας, εκτός από την επεξήγηση της λογικής του προγράμματος, βάζουμε και μηνύματα, είτε προς εμάς, για να θυμηθούμε κάτι σημαντικό που πρέπει να κάνουμε, είτε προς άλλους με τους οποίους συνεργαζόμαστε. Το extension δίνει τη δυνατότητα να δημιουργήσουμε τέτοιου είδους σχόλια. Αυτό γίνεται με κάποιες κωδικές λέξεις. Οι λέξεις που υποστηρίζονται είναι οι NOTE, INFO, TODO, TO-DO, FIXME, FIX-ME, FIXIT, FIX-IT και BUG. Όταν μέσα στα σχόλια εμφανίζεται αυτή η ετικέτα ακολουθούμενη από ':', τότε αναγνωρίζεται η εκκίνηση ενός εμφωλευμένου σχολίου και χρωματίζονται διαφορετικά. Προεραιτικά, η κωδική λέξη μπορεί να ακολουθείται από '@' και ένα username (π.χ. BUG@eliaschr:) ή να ακολουθεί ένα username με '@' (όπως eliaschr@TODO:). Το εμφωλευμένο σχόλιο συνεχίζεται σε όλες τις ακόλουθες γραμμές σχολίων, ακόμα και των κενών, μέχρι
    1. Εμφάνιση της κωδικής λέξης ακολουθούμενης από #end (όπως NOTE#end) ή
    2. Εμφάνισης μιας γραμμής κώδικα

Δύο ακόμα προσθήκες που έχουν γίνει στο Assembly Extension για CCS-Theia είναι η προσθήκη κάποιων αυτομάτων σχολίων. Πιο συγκεκριμένα, κάθε φορά που ξεκινάμε κάποιο αρχείο το πρώτο πράγμα που είναι καλό να γίνεται είναι η δημιουργία ένός τμήματος σχολίων στην αρχή του, που να περιγράφει το project στο οποίο ανήκει, το τι κάνει κλπ. Έτσι, όταν είναι ενεργοποιημένο το extension και γράψουμε τη λέξη #intro αυτόματα θα εμφανιστούν κάποια σχόλια που με τη χρήση του πλήκτρου tab μπορούμε να πάμε από τμήμα σε τμήμα για να το συμπληρώσουμε. Μπορούμε, λοιπόν, να συμπληρώσουμε το όνομα του project, το ονοματεπώνυμο του δημουργού, την ημερομηνία και κάποια περιγραφή για το αρχείο.

Ο δεύτερος τύπος σχολείων που υποστηρίζεται είναι μια εισαγωγή σε κάθε συνάρτηση. Με την πληκτρολόγηση της λέξης #head προστίθεται ένα τμήμα σχολίων για περιγραφή της συνάρτησης στην οποία ανήκει ο ακόλουθος κώδικας. Πιο συγκεκριμένα έχουμε τη δυνατήτα να συμπληρώσουμε μια περιγραφή, ποια είναι η είσοδος και η έξοδος της συνάρτησης, ποιους καταχωρητές χρησιμοποιεί,χρήση της stack, κλπ. Ακολουθεί ένα στιγμιότυπο που δείχνει το εν λόγω τμήμα.

Συμπεράσματα

Το CCS-Theia είναι ένα πολύ ωραίο περιβάλλον προγραμματισμού των μικροελεγκτών της εταιρίας Texas Instruments. Η συγκεκριμμένη δουλειά έχει γίνει για τις οικογένειες MSP430 και MSP430X και για τον προγραμματισμό τους σε γλώσσα Assembly. Δυστυχώς, πολλοί κατασκευαστές αγνοούν τη δύναμη της assembly και δίνουν μεγάλο βάρος μόνο στις γλώσσες υψηλότερου επιπέδου, όπως C/C++, Python κλπ. Όμως η χρήση ενός μικροελεγκτή πολλές φορές δε δίνει την ευχέρεια σε ένα προγραμματιστή να είναι αρκετά "τεμπέλης", αντιθέτως είναι πολλές οι φορές που η χρήση των πηγών του μικροελεγκτή πρέπει να γίνεται με φειδώ και σύνεση. Είναι αλήθεια πως η δύναμη των σημερινών μικροεπεξεργαστών έχει κάνει τους προγραμματιστές να θεωρούν το optimization κάτι που απλά κάνει ο compiler και η επεξεργαστική ισχύς είναι τέτοια που μπορεί να κάνει τη δημιουργία ενός μη efficient κώδικα να μη φαίνεται. Πάντως η γλώσσα assembly είναι μακριά από το να σταματήσει να χρησιμοποιείται!

Το εν λόγω extension καλύπτει την ανάγκη δημιουργίας κώδικα σε assembly για τις δύο οικογένειες μικροελεγκτών με επιτυχία, όσον αφορά τη χρωματική σύνταξη και την υποβοήθηση συγγραφής προγραμμάτων στο Code Composer Studio - Theia. Είναι, ελεύθερο να το κατεβάσει ο καθένας και να το χρησιμοποιήσει.

Ηλίας Χρυσοχέρης

Κυριακή 20 Σεπτεμβρίου 2020

DeepSeaRobotix - coYaght

Το σχολικό έτος 2019-2020 είχα την τιμή να βρίσκομαι σε τρία πολύ καλά σχολειά. Γυμνάσια και τα τρία, αλλά πολύ ενεργά σε εξωσχολικές δραστηριότητες. Ένα από αυτά ήταν και το 1ο Γυμνάσιο Γέρακα που ανήκει στη Δ.Δ.Ε Ανατολικής Αττικής. Στο συγκεκριμμένο σχολείο υπήρξε παλαιότερα ένα project που με τη βοήθεια του Ευγενιδίου Ιδρύματος είχαν φτιάξει ένα Hydrobot. Κάποια στιγμή ένας συνάδελφος, μαζί με το Διευθυντή του σχολείου, με ρώτησαν αν ήθελα να τους βοηθήσω να το εξελίξουν. Φυσικά η απάντηση ήταν θετική.

Το σχολείο ξεκίνησε τη συμμετοχή του στο διαγωνισμό European Junior Achievement 2019-2020, όπου κάθε σχολείο που συμμετέχει δημιουργεί μια εικονική επιχείριση και προωθεί το προϊόν της. Η διαδικασία περιέχει όλα τα καλά, όπως τη δημιουργία ενός Επιχειρισιακού Πλάνου, τη Διοίκηση της Επιχείρισης, κλπ. Ο διαγωνισμός, τελικά, έγινε μέσω διαδικτύου λόγω της πανδημίας του COVID-19.

Το όνομα της επιχείρησής μας; DeepSeaRobotix Α.Β.Ε.Ε. και το προϊόν μας είχε την ονομασία coYaght, μιας κι επρόκειτο για ένα Drone Θαλάσσης που θα ήταν η εξέλιξη του Hydrobot. Στο διαγωνισμό η επιχείρισή μας βαθμολογήθηκε με 91/100 καταλαμβάνοντας τη 12η θέση, ενώ κέρδισε το Ειδικό Βραβείο Αξιοποίησης Νέων Τεχνολογιών. Στο άρθρο αυτό, θα δούμε τον τρόπο κατασκευής και λειτουργίας του coYaght, αλλά πρώτα από όλα θα ήθελα να ευχαριστήσουμε το Ευγενίδιο Ίδρυμα για την προσφορά του που μας διέθεσε δωρεάν το κιτ του Hydrobot αλλά και του συστήματος HydroSensors V2 που περιείχε ένα Arduino Uno, ένα shield με δυνατότητα χρήσης κάρτας SD για εγγραφή δεδομένων, Real Time Clock για να κρατάει την ώρα με τη βοήθεια μπαταρίας και τρεις αισθητήρες, ένα θερμοκρασίας, έναν πίεσης κι ένα φωτισμού.

Τι θα δούμε σε αυτό το άρθρο

  • Τι είναι το coYaght
    • Μονάδα τροφοδοσίας
    • Οδηγοί κινητήρων
    • Arduino Uno και Υποκυκλώματά του
    • Raspberry Pi - Ο "Εγκέφαλος" του συστήματος
  • Έλεγχος του coYaght
    • Εγκατάσταση Λειτουργικού
    • Πρώτες παραμετροποιήσεις Hardware
    • Προετοιμασία δικτύωσης
    • Σύνδεση σε δικό μας τοπικό δίκτυο
    • Εγκατάσταση Arduino Software
    • Arduino Firmware
    • Προετοιμασία βάσης δεδομένων MySQL
    • Προετοιμασία Python
    • coYaght Server
    • Αυτόματη εκκίνηση του server με την εκκίνηση του Raspberry Pi
  • Χρήση του coYaght
  • Συμπεράσματα

Τι είναι το coYaght

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

Τα ηλεκτρονικά συστήματα που προστατεύει το κουτί από plexiglass είναι:

  • Ένα Raspberry Pi 3B+
  • Ένα Arduino Uno
  • Ένα SD Card + Real Time Clock Shield για το Arduino
  • Έναν αισθητήρα θερμοκρασίας
  • Έναν αισθητήρα πίεσης
  • Έναν αισθητήρα φωτεινότητας περιβάλλοντος
  • Μία κάμερα συνδεδεμένη στο Raspberry Pi
  • Δύο προβολείς λευκού φωτός για την κάμερα
  • Ένα κόκκινο κι ένα πράσινο φως που συμφωνούν με τα πρώτυπα της ναυσιπλοΐας (το κόκκινο αριστερά και το πράσινο δεξιά)
  • Τρεις οδηγούς για τα μοτέρ
  • Μια διάταξη τροφοδοσίας για τα ηλεκτρονικά χαμηλής τάσης (Raspberry και Arduino + Shield)

Ας γνωρίσουμε ένα-ένα τα κομμάτια του συστήματος και τη λειτουργία τους

Μονάδα τροφοδοσίας

Το coYaght τροφοδοτείται μέσω του καλωδίου δικτύου που περιέχει (Power Over Ethernet - PoE). Η τάση που δίδεται είναι μεγάλη, για να μπορέσει να κινήσει τα μοτερ της πλοήγησης και τους προβολείς. Αυτό σημαίνει πως δε μπορεί να συνδεθεί απευθείας στις ηλεκτρονικές πλακέτες του Raspberry Pi και του Arduino Uno. Επίσης, άλλο ένα πρόβλημα που υπάρχει είναι πως η τελική τάση που φτάνει στα κυκλώματα του coYaght δεν είναι καθόλου σταθερή· Εξαρτάται από την εξωτερική τροφοδοσία, τη ζήτηση σε ρεύμα την κάθε χρονική στιγμή κλπ. Η ζήτηση ρεύματος διαφέρει, διότι εξαρτάται πολύ από τον αριθμό των μοτέρ που είναι ενεργοποιημένα, αλλά και την επεξεργασία που κάνει το ίδιο το Raspberry Pi.

Για να μπορέσουμε να ξεπεράσουμε τα προβλήματα αυτά, είναι επιτακτική η ανάγκη χρήσης μιας τροφοδοτικής διάταξης που θα κατεβάζει την τάση που φτάνει στο coYaght μέσω του καλωδίου, στην τάση που μπορούν να δεχθούν τα ηλεκτρονικά κυκλώματα. Η μονάδα αυτή θα πρέπει επίσης να έχει αντοχή μεγάλη σε ριπές ρεύματος, λόγω του Raspberry Pi. Παρότι οι ασύρματες συνδέσεις BLE και WiFi δεν είναι ενεργοποιημένες, μιας και δεν είναι χρήσιμες, όπως και το γραφικό περιβάλλον χρήστη, το Raspberry Pi ζητάει ακανόνιστες ριπές ρεύματος, ανάλογα με τις λειτουργίες που εκτελεί κάθε στιγμή. Είναι, λοιπόν, ανάγκη η τροφοδοτική διάταξη να έχει αντοχές σε τέτοιες ριπές ρεύματος.

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

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

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

Οδηγοί κινητήρων

Το CoYaght διαθέτει τρεις κινητήρες (μοτέρ) για την πλοήγησή του μέσα στη θάλασσα, ένα για την κατακόρυφη κίνηση (βύθιση ή ανάδυση), ένα για την κίνηση του δεξιού του μέρους κι ένα για την κίνηση του αριστερού. Η κίνηση των δύο τελευταίων μπορεί να είναι και προς τις δύο κατευθύνσεις (πρόσω και όπισθεν). Οι κινητήρες λειτουργούν με τάση 12V ενώ οδηγούνται από τη μονάδα Arduino Uno. Συνεπώς, πρέπει να μπορούν να κινηθούν είτε δεξιόστροφα, είτε αριστερόστροφα με τάση οδήγησης αρκετά μεγαλύτερη από αυτή του κυκλώματος που δίνει τις εντολές.

Για να μπορέσει το Arduino να οδηγήσει τους κινητήρες θα πρέπει να παρεμβληθεί ένα κύκλωμα που να έχει τη δυνατότητα να οδηγεί τους κινητήρες με μεγάλη τάση (σε σύγκριση με αυτή του Arduino) ενώ ταυτόχρονα για πρέπει να μπορεί να επιλεχθεί και η πολικότητά της. Το κύκλωμα βασίζεται στην αρχή λειτουργείας της γέφυρας με MOSFET. Η γέφυρα οδηγείται από ειδικό ολοκληρωμένο κύκλωμα για να αποφευχθούν συμπεριφορές βραχυκυκλώματος της τροφοδοσίας και κατά συνέπεια την καταστροφή των κυκλωμάτων. Τα MOSFET λειτουργούν ως διακόπτες που συνδέουν το κάθε άκρο του μοτέρ που οδηγούν, είτε στα +12V, είτε στο 0. Το ποιο άκρο θα συνδεθεί πού, εξαρτάται από την εντολή που δίνει το Arduino.

Το σχηματικό διάγραμμα του κυκλώματος οδήγησης ενός κινητήρα φαίνεται στην ακόλουθη εικόνα:

Arduino Uno και Υποκυκλώματά του

Το όλο σύστημα του coYaght περιέχει ένα μικρό προγραμματιζόμενο υπολογιστή, μικρών δυνατοτήτων, το Arduino Uno. Αυτό δομείται από ένα μικροελεγκτή τύπου AVR atmega328P της Atmel (πλέον κομμάτι της Microchip, Inc.). Το κύκλωμα είναι open source. Έχει ένα απλό περιβάλλον προγραμματισμού που μπορούμε να γράψουμε κώδικα και να προγραμματίσουμε το Arduino με γλώσσα που μοιάζει αρκετά με τη C. Επιπλέον, περιέχει πολλές έτοιμες βιβλιοθήκες που μας γλυτώνουν από τον κόπο του προγραμματισμού χαμηλού επιπέδου και κάνουν τη ζωή μας πιο εύκολη. Με αυτό τον τρόπο, ο χρόνος που χρειαζόμαστε για να φτιάξουμε μια πλήρη εφαρμογή είναι αρκετά μικρότερος σε σύγκριση με περιπτώσεις χρήσης μικροελεγκτών άλλων εταιριών. Καθίσταται ιδανικό, λοιπόν, για ένα σχολικό περιβάλλον και μαθητές με όρεξη να γευτούν τον κόσμο των ψηφιακών ηλεκτρονικών και του προγραμματισμού.

Οι δυνατότητες που παρέχει το Arduino είναι η οδήγηση ή το διάβασμα ψηφιακών σημάτων, το διάβασμα αναλογικών σημάτων (ο μικροελεγκτής περιέχει μετατροπέα αναλογικού σήματος σε ψηφιακό), η επικοινωνία μέσω σειριακής θύρας, η οποία δρομολογείται σε υπολογιστή μέσω συνδέσμου USB. Υπάρχουν, επίσης, στο εμπόριο αρκετά κυκλώματα που εφαρμόζουν στους συνδέσμους του, δίνοντάς του επιπλέον δυνατότητες. Αυτά τα ονομάζουμε shields.

Στην περίπτωση του coYaght, το Arduino είναι το σύστημα που παίρνει μετρήσεις από τους αισθητήρες που είναι συνδεδεμένοι σε αυτό. Τις μετρήσεις τις δίνει στη σειριακή του έξοδο, η οποία οδηγείται στο σύνδεσμο USB. Αυτό σημαίνει πως ένας υπολογιστής συνδεδεμένος στο USB του, μπορεί να διαβάσει τις μετρήσεις που δίνει κάθε δευτερόλεπτο, το Arduino.

Κάτι ακόμα που κάνει το Arduino για το coYaght, είναι το να οδηγεί τους τρεις κινητήρες πλοήγησης. Ο τρόπος που θα πλοηγηθεί το coYaght μέσα στη θάλασσα περιγράφεται από εντολές που δίνει ο χρήστης, πού αλλού; στη σειριακή του πόρτα.

Τέλος, χρησιμοποιείται ένα shield που περιέχει ένα ολοκληρωμένο Real Time Clock (RTC) και μια θέση κάρτας SD. Η δουλειά του RTC είναι να μετράει το χρόνο, κρατώντας την ημερομηνία και την τρέχουσα ώρα. Τροφοδοτείται από μια μπαταρία, έτσι ώστε ακόμα κι αν το σύστημα δεν τροφοδοτείται, το RTC να συνεχίζει να μετράει το χρόνο χωρίς να χάνει ούτε δευτερόλεπτο. Το τμήμα της κάρτας SD δε χρησιμοποιείται στο coYaght.

Το μπλοκ διάγραμμα του υποσυστήματος φαίνεται στο ακόλουθο σχήμα:

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

Raspberry Pi - Ο "Εγκέφαλος" του συστήματος

Στο σύστημα του coYaght πρέπει να υπάρχει κι ένα υπολογιστικό σύστημα ικανό να μπορεί να συνδέεται με μια κάμερα και να δίνει το βίντεό της διαμέσου δικτύου σε real time streaming. Μια καλή λύση είναι ο υπολογιστής μιας πλακέτας Raspberry Pi και συγκεκριμμένα η έκδοση 3B+. Ο υπολογιστής αυτός διαθέτει όλα τα χαρακτηριστικά που χρειάζονται: Δικτύωση ethernet, σύνδεση για κάμερα, σύνδεση USB για να συνδεθεί το Arduino κλπ.

Το Raspberry τρέχει λειτουργικό Linux. Αυτό λύνει τα χέρια, τόσο στα θέματα της δικτύωσης και το χειρισμό περιφερειακών συσκευών, όπως η κάμερα και το Arduino, όσο και στην ανάπτυξη του κώδικα που χρειάζεται για να μπορέσει να λειτουργήσει σαν εξυπηρετητής web και να παρέχει ένα αρκετα φιλικό περιβάλλον χρήστη για το χειρισμό του συστήματος coYaght. Εύκολα δίνεται η δυνατότητα σύνδεσης σε κάποιο φορητό υπολογιστή, ο προγραμματισμός σε γλώσσα προγραμματισμού Python, ακόμα και η αναβάθμιση του firmware του Arduino. Η σύνδεση για τις ανάγκες προγραμματισμού γίνεται μέσω SSH ενώ μπορούν να τρέχουν ταυτόχρονα κι άλλοι servers για τις ανάγκες της δικτύωσης, όπως DHCP. Στη συνέχεια θα δούμε το στήσιμό του για να μπορέσει το coYaght να αποτελέσει ένα ολοκληρωμένο σύστημα υποβρύχιου drone.

Έλεγχος του coYaght

Όλος ο έλεγχος του coYaght γίνεται διαμέσου του Raspbery Pi. Ας δούμε, αρχικά, τον τρόπο με τον οποίο επιθυμούμε να λειτουργεί και με βάση αυτή τη λογική θα στήσουμε σιγά-σιγά το Raspberry για την επίτευξη του τελικού μας στόχου.

Κατ' αρχήν, η χρήση του συστήματος θα πρέπει να γίνεται από ένα απλό φυλλομετρητή (browser) σε ένα υπολογιστή ανεξαρτήτου λειτουργικού συστήματος. Αυτό σημαίνει πως θα πρέπει να υπάρχει μια σύνδεση δικτύου μεταξύ ενός υπολογιστή και του coYaght. Η σύνδεση με την οποία λειτουργεί το coYaght είναι μέσω καλωδίου ethernet το οποίο μεταφέρει και την ισχύ τροφοδοσίας του (Power over Ethernet - PoE).

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

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

Εγκατάσταση Λειτουργικού

Το Raspberry Pi είναι, όπως λέμε, υπολογιστής μιας πλακέτας (Single Board Computer - SBC). Για να γίνει χρήσιμο πρέπει να του φορτώσουμε ένα λειτουργικό σύστημα, όπως και στους υπολογιστές μας. Η εγκατάσταση γίνεται σε μια κάρτα μνήμης microSD. Η εγκατάσταση του λειτουργικού συστήματος γίνεται όπως περιγράφεται στο site του Raspberry.org. Στη σελίδα περιγράφεται η εγκατάσταση διαφόρων λειτουργικών. Εμείς χρησιμοποιήσαμε το προκαθορισμένο Raspberry Pi OS που είναι βασισμένο στο Ubuntu.

Μετά την εγκατάσταση του λειτουργικού στη διαθέσιμη microSD κάρτα, τποθετούμε την κάρτα στο Raspberry Pi, του συνδέουμε ένα πληκτρολόγιο, ένα ποντίκι μια οθόνη και δίκτυο. Λίγα δευτερόλεπτα μετά την ενεργοποίησή του βλέπουμε την αρχική οθόνη του γραφικού περιβάλλοντος Ubuntu.

Πρώτες παραμετροποιήσεις Hardware

Η παραμετροποίηση του Raspberry γίνεται από το εργαλείο raspi-config. Μιας και μιλάμε για παραμετροποίηση συστήματος, φυσικά, το raspi-config πρέπει να τρέξει κάτω από τον χρήστη root. Για να το τρέξουμε, ανοίγουμε μια κονσόλα και γράφουμε:

pi@coyaght:~ $ sudo raspi-config

Το ακόλουθο παράθυρο ανοίγει:

Με το πληκτρολόγιο μπορούμε να πλοηγηθούμε μέσα στα μενού και τις επιλογές του παραθύρου. Κάνουμε τις ακόλουθες επιλογές:

  • Network Options -> Hostname -> OK -> coyaght: Ρυθμίζουμε την ονομασία του coYaght. Πρέπει να χρησιμοποιήσουμε πεζούς χαρακτήρες σε όλα τα γράμματα
  • Boot Options -> Desktop / CLI -> Console: Απενεργοποιούμε το γραφικό περιβάλλον για να μη χρησιμοποιεί πόρους του συστήματος, αφού δεν πρόκειται να το συνδέσουμε σε μια οθόνη
  • Localization Options -> Change Time Zone -> Europe -> Athens: Ρυθμίζουμε τη ζώνη ώρας του συστήματος, να είναι σύμφωνη με τα πρότυπα της Ελλάδας
  • Interfacing Options -> Camera -> Yes: Ενεργοποιούμε το δίαυλο επικοινωνίας του επεξεργαστή με την κάμερα
  • Interfacing Options -> SSH -> Yes: Ενεργοποιούμε την πρόσβαση μέσω SSH

Προετοιμασία δικτύωσης

Συνέχεια έχει η προετοιμασία του δικτύου. Όταν το coYaght συνδέεται σε ένα laptop, στο χώρο στον οποίο θα χρησιμοποιηθεί, πρέπει να μην υπάρχει η ανάγκη ενός router ή άλλης δικτυακής συσκευής. Αυτό σημαίνει πως το σύστημα θα πρέπει να έχει μια στατική διεύθυνση δικτύου IP και να μπορεί να στείλει χαρακτηριστικά δικτύωσης και στο εν λόγω laptop. Χρειάζεται, δηλαδή, να τρέχει ένας DHCP server στο Raspberry Pi για να μπορέσει να γίνει η επικοινωνία σωστά. Άλλο ένα σημαντικό πράγμα που θα πρέπει να προσέξουμε, είναι πως αν το laptop έχει και ασύρματη σύνδεση, επειδή υπάρχουν πιθανότητες να είναι και αυτή συνδεδεμένη σε κάποιο ασύρματο δίκτυο, τα δύο υποδίκτυα να μην είναι κοινά. Με βάση όλες αυτές τις παραμέτρους, θα ορίσουμε τη διεύθυνση του Raspberry να είναι η 192.168.111.10/24. Ας δούμε πως γίνεται αυτή η διαδικασία.

Για να ρυθμίσουμε τη στατική IP θα πρέπει να ανοίξουμε το αρχείο /etc/dhcpcd.conf. Εκεί μέσα βάζουμε τις κατάλληλες ρυθμίσεις για το interface eth0. Φυσικά αν υπάρχουν προηγούμενες ρυθμίσεις θα πρέπει να τις σβήσουμε. Με τον επιθυμητό editor ανοίγουμε το αρχείο πάντα ως root και το τροποποιούμε:

pi@coyaght:~ $ sudo vi /etc/dhcpcd.conf

interface eth0
  static ip_address=192.168.111.10/24
  static routers=192.168.111.1
  static domain_name_servers=8.8.8.8

Το επόμενο βήμα είναι να κάνουμε το Raspberry Pi να λειτουργεί και ως DHCP server. Το πρωτο πράγμα που πρέπει να κάνουμε είναι να εγκαταστήσουμε το κατάλληλο πακέτο:

pi@coyaght:~ $ sudo apt-get install isc-dhcp-server

Στη συνέχεια πρέπει να παραμετροποιήσουμε τον εξυπηρετητή. Το πρώτο πράγμα που πρέπει να κάνουμε είναι να του πούμε ποιον δικτυακό σύνδεσμο θα χρησιμοποιεί:

pi@coyaght:~ $ sudo vi /etc/default/isc-dhcp-server

Προς το τέλος του αρχείου θα βρούμε κάπου τη γραμμή INTERFACESv4. Θα πρέπει να σιγουρευτούμε πως περιέχει μέσα το σύνδεσμο eth0. Με αυτό τον τρόπο λέμε στο server πως θα εξυπηρετεί το σύνδεσμο eth0 στον οποίο θα συνδέεται ο υπολογιστής:

INTERFACESv4="eth0"
INTERFACESv6=""

Τώρα πρέπει να του πούμε τι παραμέτρους θα στέλνει στους clients. Αυτές βρίσκονται στο αρχείο /etc/dhcp/dhcpd.conf:

pi@coyaght:~ $ sudo vi /etc/dhcp/dhcpd.conf

Στην αρχή του αρχείου βρίσκουμε τις γραμμές για options του domain-name και του domain-name-servers. Δίνουμε τις ακόλουθες τιμές:

# option definitions common to all supported networks...
option domain-name "coyaght_home";
option domain-name-servers 192.168.111.1;

Ο server αυτός είναι ο κυρίαρχος server του δικτύου, μιας και θα είναι ο μοναδικός μεταξύ του coYaght και του laptop που θα το χειρίζεται. Πρέπει να ενεργοποιήσουμε το authoritative. Ψάχνουμε μέσα στο αρχείο και το ενεργοποιούμε:

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

Τέλος προσθέτουμε γραμμές για τη δημιουργία του υποδικτύου που χρειάζεται να εξυπηρετεί αυτός ο DHCP:

subnet 192.168.111.0 netmask 255.255.255.0 {
  range 192.168.111.11 192.168.111.249;     #//Available address range to clients
  option domain-name-servers 192.168.111.1; #//DNS requests are sent to router (Though there won't be any :)
  option domain-name "coyaght_home";        #//The domain name. Here we set the same as earlier
  option routers 192.168.111.1;             #//The router is the gateway to other networks
  option broadcast-address 192.168.111.255; #//Broadcast address for this subnet
  default-lease-time 600;
  max-lease-time 7200;
}

Τώρα μένει να ενεργοποιήσουμε την υπηρεσία, ώστε να τρέχει αυτόματα στην εκκίνηση του συστήματος:

pi@coyaght:~ $ sudo update-rc.d isc-dhcp-server start
pi@coyaght:~ $ sudo service isc-dhcp-server start

Η τελευταία εντολή τρέχει την υπηρεσία αυτή τη στιγμή. Τώρα αν συνδέσουμε το καλώδιο δικτύου του coYaght σε έναν υπολογιστή, αυτός πρέπει να πάρει αυτόματα μια διεύθυνση IP στο υποδίκτυο 192.168.111.x

Τέλος, (για την ώρα), μιας και μέχρι να τελειώσουμε με την όλη εγκατάσταση ώστε να έχουμε ένα λειτουργικό coYaght, η σύνδεσή του θα γίνεται στο δικό μας τοπικό δίκτυο, καλό είναι να φτιάξουμε ένα μικρό script που να προσθέτει ρυθμίσεις ώστε να λειτουργεί σωστά ΚΑΙ στο δικό μας δίκτυο. Φτιάχνουμε ένα αρχείο που το ονομάζουμε bin/initnet.sh:

pi@coyaght:~ $ vi bin/initnet.sh

Στο αρχείο βάζουμε τις ακόλουθες γραμμές:

#!/bin/bash
# Must be run using sudo!
service isc-dhcp-server stop
ip address add 192.168.1.16/24 dev eth0
ip route del default
route add default gw 192.168.1.1 dev eth0
echo "The network is ready."

Το script αυτό κάνει τις εξής εργασίες:

  • Απενεργοποιεί προσωρινά τον DHCP server. Το δίκτυό μας σίγουρα έχει το δικό του από το router μας και δεν είναι καλό αυτά τα δύο να λειτουργούν ταυτόχρονα. Κάποια δικτυακή συσκευή θα μπορούσε να πάρει τις ρυθμίσεις που στέλνει το coYaght και να μην έχει πρόσβαση στο διαδίκτυο.
  • Προσθέτει μια IP διεύθυνση στον σύνδεσμο ethernet. Τώρα το coYaght ακούει και στις δύο διευθύνσεις (192.168.111.10 και 192.168.1.16).
  • Σβήνει το default route μιας και δεν υπάρχει σύνδεση internet σε αυτή
  • Προσθέτει ως default route το router του δικτύου μας, ώστε να έχει το coYaght πρόσβαση στο διαδίκτυο για updates και εγκαταστάσεις άλλων προγραμμάτων

Τώρα πρέπει να δηλωθεί ως εκτελέσιμο:

pi@coyaght:~ $ chmmod +x bin/initnet.sh

Τώρα, όταν συνδέουμε το coYaght στο δικό μας δίκτυο μπορούμε να μπαίνουμε με ssh και να τρέχουμε το script που μόλις φτιάξαμε με:

pi@coyaght:~ $ sudo bin/initnet.sh

Είναι, πλέον ώρα, να αρχίσουμε να λειτουργούμε το Raspberry Pi μέσω δικτύου. Το απενεργοποιούμε και μπορουμε να το συνδέσουμε στ δίκτυό μας με ένα καλώδιο:

pi@coyaght:~ $ sudo shutdown -h now

Σύνδεση σε δικό μας τοπικό δίκτυο

Στην κατάσταση που βρίσκεται αυτή τη στιγμή το Raspberry Pi δεν έχει πρόβλημα να συνδεθεί στο δικό μας τοπικό δίκτυο, όσο το προετοιμάζουμε για το coYaght. Αν θέλετε, πλέον μπορείτε να του αποσυνδέσετε το πληκτρολόγιο, το ποντίκι και την οθόνη. Είναι ρυθμισμένο για να μπορούμε να το χρησιμοποιούμε μέσω δικτύου.

Αυτό που θα πρέπει να προσέξουμε είναι πως όταν το συνδέσουμε στο δίκτυό μας, το Raspberry Pi ήδη τρέχει ένα DHCP server. Αν τον αφήσουμε έτσι, τότε αν προσπαθήσει να συνδεθεί κάποια άλλη συσκευή, δύο DHCP servers, ένας από το router του δικτύου μας κι ένας από το Raspberry Pi, θα στείλουν ρυθμίσεις. Η συσκευή έχει πιθανότητες να πάρει τις ρυθμίσεις του τελευταίου και να μη μπορεί να επικοινωνήσει σωστά ούτε με τις συσκευές του δικτύου, ούτε με το internet. Έτσι, θα πρέπει με το που ενεργοποιηθεί να συνδεθούμε και να τρέξουμε το script που φτιάξαμε τελευταίο.

Για να μπορέσουμε να συνδεθούμε θα πρέπει οι ρυθμίσεις της κάρτας δικτύου μας να είναι για το ίδιο υποδίκτυο που θεωρεί το Raspberry, δηλάδη το 192.168.111.0/24. Ανάλογα, λοιπόν, με το λειτουργικό που τρέχει ο υπολογιστής μας θα πρέπει να κάνουμε τις κατάλληλες ρυθμίσεις στην κάρτα δικτύου. Στην περίπτωση που και ο υπολογιστής μας τρέχει κάποια διανομή Linux μπορούμε να δώσουμε τις ακόλουθες εντολές σε μια κονσόλα:

eliaschr@pluto:~> su
Password: 
pluto:/home/eliaschr # ip address add 192.168.111.11/24 dev eth0
pluto:/home/eliaschr # exit

Σε διανομές βασισμένες σε Ubuntu, αρκεί να δώσουμε, αντί για τις παραπάνω, μόνο την ακόλουθη:

eliaschr@pluto:~> sudo ip address add 192.168.111.11/24 dev eth0

Θα έχει το ίδιο αποτέλεσμα. Τώρα, μπορούμε πολύ εύκολα να μπούμε στο Raspberry Pi και να εκτελέσουμε το Script bin/initnet.sh

eliaschr@pluto:~> ssh pi@192.168.111.10
pi@192.168.111.10's password: 
Linux coyaght 5.4.72-v7+ #1356 SMP Thu Oct 22 13:56:54 BST 2020 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Nov  9 18:35:46 2020 from 192.168.111.11

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@coyaght:~ $ sudo bin/initnet.sh
The network is ready.
pi@coyaght:~ $ 

Πλέον το σύστημα είναι εναρμονισμένο με το δικό μας δίκτυο και μπορούμε να κάνουμε όλους τους υπόλοιπους χειρισμούς για να το ολοκληρώσουμε.

Εγκατάσταση Arduino Software

Είναι ώρα να εγκαταστήσουμε προγράμματα. Μιας και το Raspberry Pi θα συνδεθεί με ένα Arduino μέσω USB θύρας, καλό είναι να έχουμε μέσα τα προγράμματα που μας χρειάζονται για να μπορούμε να κάνουμε και τον προγραμματισμό του τελευταίου. Αυτό θα μας βοηθήσει να μπορούμε να πειράζουμε το Firmware του ακόμα κι όταν τα ηλεκτρονικά κυκλώματα είναι αεροστεγώς κλεισμένα μέσα στο κουτί από plexiglass. Το βασικό πρόγραμμα που χρειαζόμαστε είναι το arduino-cli, αλλά για λόγους πληρότητας θα εγκαταστήσουμε και το περιβάλλον του Arduino IDE. Από τις ακόλουθες εντολές, οι δύο πρώτες είναι για να αναβαθμιστούν τα ήδη εγκαταστημένα πακέτα. Είναι μια διαδικασία που μας βοηθάει να έχουμε τις πιο πρόσφατες ενημερώσεις του λογισμικού μας:

pi@coyaght:~ $ sudo apt-get update
  .
  .
  .
pi@coyaght:~ $ sudo apt-get upgrade
  .
  .
  .
pi@coyaght:~ $ sudo apt-get install arduino
  .
  .
  .
pi@coyaght:~ $ sudo apt-get install avrdude
  .
  .
  .
pi@coyaght:~ $ sudo apt-get install avrdude-doc
  .
  .
  .
pi@coyaght:~ $ mkdir Downloads
pi@coyaght:~ $ cd Downloads/
pi@coyaght:~ $ curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh
  .
  .
  .
pi@coyaght:~ $ mv bin/ ..
pi@coyaght:~ $ cd ..
 

Τώρα θα πρέπει να ρυθμίσουμε το arduino-cli για να μπορεί να δει το Arduino μας:

pi@coyaght:~ $ arduino-cli config init
  .
  .
pi@coyaght:~ $ arduino-cli core update-index
  .
  .
pi@coyaght:~ $ arduino-cli core install arduino:avr

Μετά από αυτές τις εντολές, το arduino-cli θα μπορεί να δει κανονικά το Arduino μας και να το προγραμματίσει. Πώς, όμως, μπορεί να γίνει αυτό; Η δύναμη του arduino-cli είναι πως μπορεί να φορτώσει στο Arduino οποιδήποτε .hex αρχείο θελήσουμε. Για να δημιουργήσουμε το αρχείο .hex της εφαρμογής μας, μπορούμε να το κάνουμε στον υπολογιστή, στον οποίο κάνουμε και την ανάπτυξή του. Έχοντας την εφαρμογή του Arduino ανοιχτή στο Arduino IDE, πατάμε το πλήκτρο Verify. Στο κάτω τμήμα του παραθύρου βλέπουμε τα μηνύματα της μεταγλώτισσης. Στο τέλος, μπορούμε να δούμε σε ποιο κατάλογο καταχωρεί το τελικό εκτελέσιμο αρχείο που δημιουργήθηκε. Στη δικιά μας περίπτωση το αρχείο λέγεται /tmp/arduino_build_361228/hydrosensor_shield.ino.elf. Κάθε φορά που τρέχουμε το περιβάλλον ανάπτυξης, αυτός ο κατάλογος αλλάζει, γι' αυτό και πρέπει να το κοιτάζουμε κάθε φορά. Στον ίδιο κατάλογο βρίσκεται και το αρχείο που θα πούμε στο arduino-cli να στείλει στο arduino του coYaght.

Αρχικά θε πρέπει να αντιγράψουμε το .hex αρχείο στο Raspberry Pi για να προγραμματίσουμε το Arduino. Η εντολή που μας χρειάζεται είναι:

eliaschr@pluto:~> scp /tmp/arduino_build_361228/hydrosensor_shield.ino.hex pi@192.168.111.10:/home/pi/Dow
nloads/
pi@192.168.111.10's password: 
hydrosensor_shield.ino.hex                                                100%   29KB  29.0KB/s   00:00    

Αν συνδέσουμε το Arduino στο Raspberry Pi, τότε στο τελευταίο δημιουργείται μια σειριακή πόρτα με την ονομασία /dev/ttyACM0. Μέσω αυτής είναι που γίνεται η επικοινωνία μεταξύ των δύο. Για να γίνει ο προγραμματισμός, πρέπει να μπούμε στον κατάλογο που γράψαμε το .hex αρχείο και να χρησιμοποιήσουμε το arduino-cli:

pi@coyaght:~ $ cd Downloads/
pi@coyaght:~/Downloads $ arduino-cli upload -b arduino:avr:uno -p /dev/ttyACM0 -t -v -i hydrosensor_shiel
d.ino.hex
  .
  .

Μόλις τελειώσει η διαδικασία, το arduino θα τρέχει τον κώδικα που του στείλαμε.

Arduino Firmware

Τον τελικό κώδικα του firmware μπορεί κανείς να τον κατεβάσει από το GitHub. Θα πρέπει να κατεβάσετε τα τέσσερα αρχεία .ino και να τα τοποθετήσετε μέσα σε ένα κατάλογο με το όνομα hydrosensor_shield. Από εκεί μπορείτε να ανοίξετε το hydrosensor_shield.ino με το περιβάλλον προγραμματισμού Arduino IDE, να το παραλάξετε και να το λειτουργήσετε όπως επιθυμείτε. Μπορείτε να το κάνετε compile με το πλήκτρο Verify και να το στείλετε στο Arduino σας.

Ο κώδικας του firmware είναι βασισμένος στον κώδικα που δίνει το Ευγενίδιο Ίδρυμα στο αντίστοιχο project Hydrobot. Φυσικά έχουν γίνει αρκετές τροποποιήσεις για να μπορέσει να έρθει στα "μέτρα" του coYaght. Έχει απενεργοποιηθεί το τμήμα που ασχολείται με την SD κάρτα μνήμης, έχουν προστεθεί εντολές και παραμετροποιήσεις κι έχει παραλλαχθεί το μήνυμα των μετρήσεων που δίνει στη σειριακή θύρα, έτσι ώστε να ταιριάζει καλύτερα στο δικό μας σύστημα.

Στη σελιδα του GitHub υπάρχουν διαθέσιμες πληροφορίες για τον κώδικα του firmware. Τα ίδια τα αρχεία περιέχουν αρκετές πληροφορίες μέσα. Έτσι, μπορείτε να δείτε με λεπτομέρειες τον τρόπο με τον οποίο λειτουργεί όλο το firmware.

Προετοιμασία βάσης δεδομένων MySQL

Το σύστημά μας χρησιμοποιεί μια βάση δεδομένων για να καταχωρεί τις μετρήσεις έτσι ώστε όταν χρειαστεί να μπορέσουμε να τις ξαναδούμε. Η επιλεγμένη βάση δεδομένων είναι η MySQL (ή σε νεότερες εκδόσεις, mariaDB). Για να την εγκαταστήσουμε αρκεί η εντολή:

pi@coyaght:~ $ sudo apt-get install mariadb-server

Αρχικά η MySQL είναι ρυθμισμένη με ανοικτό το χρήστη root, τη σύνδεση νέσω δικτύου κλπ. Καλό είναι να γίνουν οι απαραίτητες ρυθμίσεις για τη θωράκιση του συστήματος:

pi@coyaght:~ $ sudo mysql_secure_installation

Με αυτή την εντολή μπορούμε να ρυθμίσουμε ένα password της αρεσκείας μας για το χρήστη root, να σβήσουμε τους ανώνυμους χρήστες, να απαγορέψουμε την πρόσβαση στη βάση δεδομένων από τον χρήστη root απομακρυσμένα και να σβήσουε την πρoτοποθετημένη βάση δεδομένων test. Φυσικά δεν ξεχνάμε να πούμε να επαναφορτωθούν τα δικαιώματα των χρηστών του εξυπηρετητή.

Το σύστημα του coYaght χρειάζεται ένα δικό του χρήστη και μια δικιά του βάση με τους δικούς της πίνακες. Ας δούμε πως θα γίνουν όλες αυτές οι ρυθμίσεις. Πρώτα θα δημιουργήσουμε τη βάση δεδομένων και τον χρήστη της:

pi@coyaght:~ $ mysql -u root -p
Enter password:
  .
  .

Στο σημείο αυτό έχουμε μπει στον server της MySQL. Ας δημιουργήσουμε τη βάση δεδομένων και τον χρήστη της:

MariaDB [(none)]> CREATE DATABASE coYaght;
CREATE USER 'coyaght'@localhost IDENTIFIED BY 'coYaght_Gerakas';
GRANT ALL PRIVILEGES ON coYaght.* TO 'coyaght'@localhost;
FLUSH PRIVILEGES;
EXIT;

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

pi@coyaght:~ $ mysql -u coyaght -p
Enter password:
  .
  .
MariaDB [(none)]> USE coYaght;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [coYaght]> CREATE TABLBE `measurements` (
    -> `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> `DateStamp` DATETIME NOT NULL,
    -> `Temp` DECIMAL(5,2) NOT NULL,
    -> `Press` DECIMAL(8,2) NOT NULL,
    -> `Depth` DECIMAL(7,3) NOT NULL,
    -> `Lux` DECIMAL(7,2) NOT NULL,
    -> `Batt` DECIMAL(4,2) NOT NULL,
    -> PRIMARY KEY (`id`),
    -> UNIQUE KEY `DateStamp` (`DateStamp`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Τώρα η βάση δεδομένων του coYaght είναι έτοιμη να δεχθεί δεδομένα.

Προετοιμασία Python

Για να λειτουργήσει το σύστημα, ο server που δημιουργούμε έχει γραφτεί σε python 3. Αυτό σημαίνει πως χρειάζονται τα κατάλληλα modules για να μπορέσει να γίνει χρήση της βάσης δεδομένων, της κάμερας και της σειριακής πόρτας. Το σύστημα πρέπει να έχει τη δυνατότητα να χρησιμοποιεί νήματα για να μπορεί να στέλνει δεδομένα από την κάμερα, να ελέγχει τα δεδομένα από τη σειριακή πόρτα και να στέλνει σε αυτήν εντολές. Όλα αυτά είναι ασύγχρονα κι έτσι δε θα μπορούσε ποτέ να γίνει με άλλο τρόπο.

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

pi@coyaght:~ $ sudo apt-get install python3-picamera ffmpeg python3-ws4py

Η βιβλιοθήκη χρήσης της κάμερας από την python είναι η picamera. Η βιβλιοθήκη ffmpeg είναι για επεξεργασία της εικόνας της κάμερας. Κανονικά δεν είναι απαραίτητη, αλλά μπορεί να μας φανεί χρήσιμη σε κάποιες περιπτώσεις test. Τέλος η βιβλιοθήκη ws4py δίνει τη δυνατότητα στην python να χρησιμοποιεί web sockets. Είναι χρήσιμη για το video streaming που θέλουμε να πετύχουμε. Οι δύο τελευταίες βιβλιοθήκες μας χρειάστηκαν κατά τη διάρκεια ανάπτυξης του κώδικα του συστήματος για διάφορα test. Δεν είναι απαραίτητες για την τελική λειτουργία του coYaght.

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

pi@coyaght:~ $ sudo apt-get install python3-pip

Τώρα είμαστε σε θέση να εγκαταστήσουμε τη βιβλιοθήκη χρήσης της σειριακής θύρας, pyserial:

pi@coyaght:~ $ sudo pip3 install pyserial

Αν δε χρησιμοποιηθεί η εντολή sudo πριν την pip3, τότε η βιβλιοθήκη θα εγκατασταθεί, αλλά τοπικά στο χρήστη και όχι καθολικά στο σύστημα. Παρόλα αυτά θα συνεχίσει να είναι λειτουργική, αλλά πριν τη χρησιμοποιήσουμε ως root θα πρέπει να προσθέσουμε τον κατάλογο /home/pi/.local/lib/python3.7/site-packages στη μεταβλητή συστήματος PYTHONPATH.

Τέλος, θα πρέπει να εγκαταστήσουμε τη βιβλιοθήκη που δίνει τη συνατότητα στην python να έχει πρόσβαση στη MySQL:

pi@coyaght:~ $ sudo apt-get install python3-pymysql

Πλέον είναι έτοιμη η python να επικοινωνήσει με όλα τα τμήματα που μας ενδιαφέρουν. Είναι ώρα να στήσουμε τον server μας.

coYaght Server

Στο σύστημα coYaght θα πρέπει να υπάρχει πρόσβαση μέσω ενός web browser ώστε να μην υπάρχει η ανάγκη για εγκατάσταση κάποιας στοχευμένης εφαρμογής. Η ιστοσελίδα που θα εμφανίζεται πρέπει να περιέχει όλα τα απαραίτητα στοιχεία για να μπορούμε να:

  • παρακολουθούμε την κάμερά του
  • μπορούμε να κάνουμε παύση στο βίντεο που μας δείχνει και να το ξαναεκκινούμε
  • παρακολουθούμε τις μετρήσεις των αισθητήρων ως γραφικές παραστάσεις
  • να σταματάμε και ξαναεκκινούμε τις μετρήσεις των αισθητήρων
  • πλοηγούμε το coYaght μέσα στη θάλασσα

Ο κώδικας του server έχει γραφτεί, όπως προείπαμε, σε python 3. Σαν εναρκτήριος κώδικας υπήρξε αυτός που βρίσκεται στη σελίδα 4. Advanced Recipes - Picamera 1.13 documentation. Πάνω σε αυτό τον κώδικα βασίστηκε η ομάδα μας για τη δημιουργία του server.

Φυσικά, το τμήμα της ιστοσελίδας πλοήγησης του coYaght κάνει χρήση τεχνολογιών διαδικυου, HTML, CSS και JavaScript. Το κομμάτι εμφάνισης γραφικών παραστάσεων προέρχεται από τη Google - Google Charts.

Τον πλήρη κώδικα μπορείτε να τον δείτε και να τον κατεβάσετε από το GitHub. Εκεί θα βρείτε και αρκετή τεκμηρίωση για τον τρόπο που λειτουργεί ο κώδικας. Επίσης, μέσα στα αρχεία υπάρχει επιπλέον τεκμηρίωση, ώστε κάποιος να μπορέσει να έχει μια καλύτερη καταννόηση της λειτουργίας του κάθε τμήματος κώδικα. Ας δούμε κι εδώ λίγα βασικά πράγματα.

Ο βασικός κώδικας του server (python) αποτελείται από τρία αρχεία:

  • database.py: Δημιουργεί την κλάση με την οποία μπορούμε πολύ εύκολα να έχουμε πρόσβαση στη βάση δεδομένων coYaght της MySQL
  • serial_arduino.py: Δημιουργεί την κλάση με την οποία μπορούμε να έχουμε πρόσβαση στη σειραική θύρα του arduino. Κάνει χρήση νημάτων για να μπορεί να διαχειριστεί τόσο την αποστολή εντολών προς αυτό, όσο και τη λήψη των μηνυμάτων που στέλνει το arduino. Κάθε γραμμή εισόδου ελέγχεται, τόσο για να πιστοποιηθεί η κατάσταση του συστήματος του arduino, όσο και για να φιλτραριστούν οι πληροφορίες της κάθε γραμμής και αν πρόκειται για πληροφορίες των αισθητήρων, να καταχωρηθούν στη βάση δεδομένων
  • controller.py: Είναι το κεντρικό πρόγραμμα του server. Κάνει χρήση των άλλων δύο τμημάτων που προαναφέρθηκαν. Εδώ δημιουργείται ο εξυπηρετητής web και φιλτράρονται όλα τα ερωτήματα που αποστέλλονται μέσω δικτύου.

Τα αρχεία της ιστοσελίδας που μεταφέρονται στους πελάτες βρίσκονται στον κατάλογο web. Κι εκεί η δομή που χρησιμοποιείται είναι απλή:

  • index.html: Είναι το βασικό αρχείου που δίνει το οπτικό τμήμα της ιστοσελίδας. Το πρώτο αρχείο που διαβάζεται από ένα φυλλομετρητή
  • images: Ο κατάλογος περιέχει όλες τις εικόνες που συμπληρώνουν το οπτικό κομμάτι της ιστοσελίδας
  • styles: Περιέχει όλα τα αρχεία .css για την εφαρμογή οπτικών στυλ επάνω στα στοιχεία της ιστοσελίδας
  • scripts: Περιέχει τα αρχεία της JavaScript που χρησιμοποιούνται για τις λειτουργίες της σελίδας, αλλά και την υπόλοιπη επικοινωνία με τον εξυπηρετητή

Η εν λόγω δενδρική δομή βρίσκεται μέσα σε ένα κατάλογο coYaght που φτιάχνουμε μέσα στον κατάλογο του χρήστη. Για να τον δημιουργήσουμε, αρκεί να εκτελέσουμε την ακόλουθη εντολή:

pi@coyaght:~ $ mkdir coYaght

Όταν όλη η δενδρική δομή των αρχείων του server εγγραφεί μεσα στον κατάλογο που μόλις δημιουργήσαμε, τότε μπορούμε να τρέξουμε τον server με την εντολή:

pi@coyaght:~ $ cd coYaght
pi@coyaght:~ $ sudo python3 controller.py

Αν όλα έχουν πάει σωστά, τότε από τον υπολογιστή μας θα μπορούμε να μπούμε στο περιβάλλον του coYaght με τη χρήση του φυλλομετρητή μας (πχ. Firefox). Εκεί θα χρησιμοποιήσουμε τη διεύθυνση IP του coYaght, 192.168.111.10, όπως φαίνεται και στην ακόλουθη εικόνα:

Ο λόγος που πρέπει να μπει το sudo μπροστά, είναι πως ο εξυπηρετητής μας ακούει στην πόρτα 80 στην οποία έχει πρόσβαση μόνο ο χρήστης root του συστήματος.

Αυτόματη εκκίνηση του server με την εκκίνηση του Raspberry Pi

Το να έχουμε κατασευάσει τον server δεν αρκεί. Θα πρέπει κάθε φορά που ενεργοποιούμε το coYaght να μπαίνουμε με ssh και να τρέχουμε με τις προηγούμενες εντολές το πρόγραμμα. Αυτό δεν είναι καθόλου βολικό. Θα πρέπει ο εξυπηρετητής να ενεργοποιείται αυτόματα όταν εκκινεί το Raspberry Pi. Αυτό σημαίνει πως πρέπει να μετατραπεί σε υπηρεσία.

Το λειτουργικό Linux που τρέχει το Raspberry Pi χρησιμοποιεί τον systemd ώς κύριο τρόπο διαχείρισής του. Αυτός είναι υπεύθυνος, εκτός των άλλων, για τις υπηρεσίες που θα ενεργοποιηθούν. Θα πρέπει, λοιπόν να τον καθοδηγήσουμε να δει το controller.py ως υπηρεσία και να το "σηκωσει" όταν εκκινήσει το λειτουργικό. Το πρώτο πράγμα που κάνουμε είναι να δημιουργήσουμε το αρχείο .service:

pi@coyaght:~ $ sudo vi /lib/systemd/system/coYaght.service

Μέσα σε αυτό θα πρέπει να βάλουμε τις ακόλουθες πληροφορίες:

[Unit]
Description=coYaght control service. Serves HTTP at port 80
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/pi/coYaght/controller.py
Restart=on-abort

[Install]
WantedBy=multi-user.target

Στη συνέχεια θα πρέπει να γίνει εκτελέσιμο:

pi@coyaght:~ $ sudo chmod 644 /lib/systemd/system/coYaght.service

Τέλος, θα πρέπει να πούμε στον systemd να ξαναδιαβάσει τις εγκαταστημένες υπηρεσίες και να ενεργοποιήσει την καινούργια:

pi@coyaght:~ $ sudo systemctl daemon-reload
pi@coyaght:~ $ sudo systemctl enable coYaght.service 
pi@coyaght:~ $ sudo systemctl status coYaght.service 

Η τελευταία εντολή μας δείχνει την κατάσταση της υπηρεσίας, πλέον, coYaght. Για να την εκκινήσουμε εμείς αρχεί η εντολή:

pi@coyaght:~ $ sudo systemctl start coYaght.service

Σε αυτό το σημείο αν κάνουμε μια επανεκκίνηση στο Raspberry Pi θα πρέπει να λειτουργήσει κανονικά ο server μας χωρίς άλλη παρέμβαση.

pi@coyaght:~ $ sudo shutdown -r now

Χρήση του coYaght

Για τη χρήση του coYaght, το πρώτο βασικό πράγμα είναι να συνδεθεί με ένα καλώδιο δικτύου σε έναν υπολογιστή. Αφού το ενεργοποιήσουμε, ο υπολογιστής θα πάρει μια διεύθυνση IP σύμφωνα με όσα προαναφέραμε. Από εκείνη τη στιγμή και μετά, με τη βοήθεια ενός φυλλομετρητή μπορούμε να μπούμε στην ιστοσελίδα του και να το χρησιμοποιήσουμε. Ένα βασικό σημείο είναι πως η αρχική ενεργοποίηση του coYaght πρέπει να γίνει στο επίπεδο της θάλασσας. Δεν εννοούμε πως θα πρέπει να βρίσκεται μέσα στη θάλασσα, αλλά στο επίπεδο 0. Αυτό είναι απαραίτητο γιατί το πρώτο πράγμα που κάνει το arduino είναι να μετρήσει την πίεση που δέχεται ο αντίστοιχος αισθητήρας και να κρατήσει την τιμή ως τιμή επιπέδου της θάλασσας.

Στην είσοδο της σελίδας του συστήματος, βλέπουμε το λογότυπο της DeepSeaRobotix, το οποίο καταλαμβάνει όλη την οθόνη. Στο κάτω μέρος βλέπουμε μια μπάρα κατάστασης που δείχνει πως ο server περιμένει να επικοινωνήσει με το arduino. Όταν αυτό ολοκληρωθεί και υπάρχει κανονική επικοινωνία μεταξύ Raspberry Pi και Arduino, τότε το λογότυπο φεύγει και τοποθετείται στο επάνω αριστερά μέρος, αφήνοντας όλη την υπόλοιπη οθόνη για το περιβάλλον χειρισμού.

Η οθόνη χωρίζεται σε τέσσερα μέρη:

  • Άνω δεξιά τμήμα: Live streaming της κάμερας
  • Άνω αριστερά τμήμα: Γραφήματα των αισθητήρων
  • Κάτω δεξιά τμήμα: Πλήκτρα πλοήγησης του coYaght στο οριζόντιο επίπεδο
  • Κάτω αριστερά τμήμα: Πλήκτρα πλοήγησης του coYaght στο κατακόρυφο επίπεδο

Το βίντεο που προέρχεται από την κάμερα του Raspberry Pi είναι ενεργοποιημένο. Κάτω από αυτό υπάρχει ένα πλήκτρο με το οποίο μπορούμε να κάνουμε παύση στο βίντεο ή αν είναι σε παύση να το εκκινήσουμε και πάλι.

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

Κάτι ακόμα που πρέπει να αναφέρουμε για τις γραφικές παραστάσεις, είναι πως βλέπουμε δύο πίνακες. Ο επάνω περιέχει τα γραφήματα της Πίεσης και της Θερμοκρασίας, ενώ ο κάτω δείχνει τα γραφήματα Φωτεινότητας και Τάσης Τροφοδοσίας. Η μέτρηση της πίεσης ανάγεται και στο βάθος στο οποίο βρίσκεται το coYaght, σε μέτρα. Έχουμε την επιλογή στο επάνω γράφημα να μας δείχνει είτε την πίεση που μετράει ο αισθητήρας σε KPa είτε το βάθος σε μέτρα. Η επιλογή γίνεται με το να επιλέξουμε την κατάλληλη μονάδα μέτρησης κάτω από το γράφημα Πίεσης και Θερμοκρασίας.

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

  • Q: Κίνηση άνω, προς την επιφάνεια της θάλασας
  • A: Κίνηση κάτω, προς το βυθό
  • NumPad 8: Κίνηση εμπρός
  • NumPad 2: Κίνηση πίσω
  • NumPad 6: Δεξιόστροφη περιστροφή γύρω από τον κάθετο άξονα του coYaght
  • NumPad 4: Αριστερόστροφη περιστροφή γύρω από τον κάθετο άξονα του coYaght
  • NumPad 9: Στροφή δεξιά με κίνηση εμπρός
  • NumPad 3: Στροφή δεξιά με κίνηση πίσω
  • NumPad 7: Στροφή αριστερά με κίνηση εμπρός
  • NumPad 1: Στροφή αριστερά με κίνηση πίσω.

Συμπεράσματα

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

Ως κατασκευή, το coYaght είναι ένα drone που έχει κάποια μειονεκτήματα, πράγματα που μας δίνουν ιδέες να προχωρήσουμε ακόμα και στην κατασκευή μιας άλλης έκδοσής του, αρκετά καλύτερης από αυτή. Μέσα σε όλα όσα αναφέρθηκαν σε brainstorming με την ομάδα, είναι η λειτουργία με περισσότερους κινητήρες για βελτίωση της σταθερότητας, χρήση επικλινόμετρου για βελτίωση της πλοήγησης, σασί που να είναι 3D εκτυπωμένο, για να μπορεί να αποσυναρμολογείται, κ.α.

Όσον αφορά την εφαρμογή χειρισμού, θα μπορούσε να προστεθεί κώδικας που να συγχρονίζει το RTC με την ημερομηνία και την ώρα του υπολογιστή (μιας και το Raspberry δεν έχει πρόσβαση στο internet για να πάρει την ώρα από εκεί), δημιουργία sessions με ονομασία και στίγμα GPS για το σημείο στο οποίο πρόκειται να γίνουν οι μετρήσεις, ρύθμιση της ταχύτητας των κινητήρων ώστε να έχουμε απόλυτο έλεγχο και στην ταχύτητα με την οποία θα κινείται προς κάθε κατεύθυνση μέσα στο νερό, καταγραφή του βίντεο σε αρχείο στον υπολογιστή μας, επαναφορά μετρήσεων ενός session, ακόμα και την απενεργοποίηση του συστήματος.

Ο σκοπός που δημιουργήθηκε το project αυτό ήταν περισσότερο η τριβή των μαθητών με την τεχνολογία ώστε να γνωρίσουν μονοπάτια της, που με τη βοήθεια του "στεγνού" μαθήματος θα ήταν αδύνατο να συμβεί. Πραγματικά θέλω να ευχαριστήσω τον Διευθυντή του 1ου Γυμνασίου Γέρακα, κ. Κουρτέση Θεόδωρο, που με ένταξε στο πρόγραμμα του Junior Achievement, όσο και τα παιδιά της ομάδας που με έκαναν να αισθανθώ και να θαυμάσω τη δύναμη του μυαλού που έχουν αυτές οι ηλικίες:

  • Αδαμαντιάδης Παναγιώτης
  • Αμερκάνος Ευστράτιος
  • Δροσάκης Γιάννης
  • Ζωγράφου Ελένη
  • Καλαβρού Ελευθερία
  • Λέκκας Αντώνιος
  • Μπούκη Αντιγόνη