Το προφίλ μας στο Google Plus
4

SSTV …ή αλλιώς άκου να δεις!

Την εποχή του Markoni, την επανάσταση στον τομέα της μεταφοράς πληροφοριών την έφεραν οι ραδιοεπικοινωνίες. Όπως πολλές άλλες τεχνολογίες, έτσι κι αυτή ξεκίνησε από εργαστήρια με δυσεύρετο και πανάκριβο εξοπλισμό αλλά τελικά διαδόθηκε σε ένα μεγάλο μέρος του κοινού. Οι hackers εκείνης της εποχής, οι ραδιοερασιτέχνες, αξιοποιούσαν τα ραδιοκύματα για να εκπέμψουν δικά τους μηνύματα. Σήμερα, η νέα γενιά ρεδιοερασιτεχνών χρησιμοποιεί τα ραδιοκύματα για να εκπέμψει ήχο, εικόνα αλλά *και* δεδομένα.

Ήδη από την εισαγωγή του άρθρου είμαστε σίγουροι ότι έχετε καταλάβει πού το πάμε. Η μετάδοση σκέτου ήχου είναι πολύ μπανάλ πλέον. Σε ό,τι αφορά στη μετάδοση της εικόνας υπάρχει ένα ευρέως διαδεδομένο πρότυπο, που ακούει στο όνομα SSTV (Slow-Scan TeleVision). Μη σας μπερδεύει όμως η παρουσίας της λέξης Television, μέσα στο όνομα. Δεν πρόκειται για τηλεοπτικό σήμα σαν αυτό που μεταφέρουν τα πρότυπα PAL, NTSC και SECAM, των 25 με 30 καρέ ανά δευτερόλεπτο. Μέσω του SSTV μπορούμε να μεταδώσουμε αναλογική εικόνα (ασπρόμαυρη ή έγχρωμη) με ρυθμό ανανέωσης από 10 έως 1/114 FPS, ανάλογα με τον τρόπο μετάδοσης, τα χρώματα και την ανάλυση. Μήπως αναρωτιέστε σε τι μπορεί να φανεί χρήσιμη μια τόσο αργή μετάδοση; Οι εξαιρετικά χαμηλές προδιαγραφές του προτύπου επιτρέπουν τη μετάδοση σε πολύ μεγάλες αποστάσεις και μέσα από διαύλους μικρού εύρους, που προορίζονται για ήχο. Σκεφτείτε ότι το SSTV αξιοποιήθηκε σε διαστημικά προγράμματα όπως το Luna 3, το Faith 7 και το Apollo. Μπορεί να μη σας πέρασε ποτέ από το μυαλό, αλλά το πασίγνωστο βίντεο της βόλτας του Neil Armstrong στη Σελήνη, που προβλήθηκε ζωντανά σε ολόκληρο τον κόσμο, μεταδόθηκε από τη Σελήνη προς τον επίγειο σταθμό μέσω SSTV. Και για όσους έχουν καλπάζουσα φαντασία, ναι, ο διαστημικός σταθμός ISS εκπέμπει ακόμα και σήμερα σήμα SSTV.

Το SSTV είναι αναλογικό σήμα που μεταφέρει ψηφιοποιημένα δεδομένα. Έτσι, πριν από την αποστολή απαιτείται μια διαδικασία κωδικοποίησης των ψηφιακών δεδομένων και, αντίστοιχα, μετά τη λήψη του αναλογικού σήματος ακολουθεί μια διαδικασία αποκωδικοποίησης. Όταν αναφερθήκαμε στο ρυθμό ανανέωσης της εικόνας, είπαμε ότι δεν είναι σταθερός κι ότι εξαρτάται από διάφορους παράγοντες. Ε, λοιπόν, ένας από αυτούς είναι η κωδικοποίηση. Στον κόσμο του SSTV, βλέπετε, δεν υπάρχει κάποιο de facto πρότυπο για την ενσωμάτωση των δεδομένων της εικόνας στα ραδιοκύματα. Υπάρχουν πολλά διαφορετικά πρότυπα, με το καθένα να παρουσιάζει τα δικά του προτερήματα και μειονεκτήματα. Τα δημοφιλέστερα εξ’ αυτών, που εξακολουθούν να χρησιμοποιούνται ως τις μέρες μας, είναι τα Martin, Scottie, Robot και οι παραλλαγές τους.

Στα ενδότερα του SSTV
Τώρα ενδέχεται να προβληματιστήκατε: Πώς μπορεί ο αποδέκτης ενός σήματος να γνωρίζει το πρότυπο κωδικοποίησης που χρησιμοποιεί ο αποστολέας; Μια απλοϊκή λύση θα ήταν να έχει προηγηθεί συνεννόηση μεταξύ των δύο και να γίνεται χρήση ενός προσυμφωνημένου προτύπου. Κάτι τέτοιο όμως δεν είναι πάντα εφικτό και σίγουρα δεν είναι καθόλου βολικό. Το ίδιο πρόβλημα εμφανίζεται και σε άλλα συστήματα επικοινωνίας. Σκεφτείτε για παράδειγμα τα FAX ή τα παλιά MODEM, που επέτρεπαν τη σύνδεση στο Internet μέσω των αναλογικών τηλεφωνικών γραμμών. Σε αυτές στις συσκευές, πριν από τη μετάδοση των “ωφέλιμων” δεδομένων προηγείται ένα στάδιο διερεύνησης των υποστηριζόμενων προτύπων. Αυτή η διαδικασία διερεύνησης καταλήγει σε μια “συμφωνία” μεταξύ των συσκευών, για το πώς ακριβώς θα ανταλλάσουν δεδομένα. Αυτό το αρχικό στάδιο της επικοινωνίας είναι γνωστό ως χειραψία ή handshake, όπως συνηθίζουν να λένε στην ευρύτερη περιοχή της Καλλιμασιάς Χίου (Σ.τ.Ε. Κωνσταντίνε;!) Το SSTV βέβαια δεν προβλέπει την αμφίδρομη επικοινωνία και δεν θα μπορούσε να πραγματοποιηθεί κάποιο handshake, ούτε θα πετυχαίναμε κάποια συμφωνία. Εδώ ακολουθείται μια απλούστερη προσέγγιση: Το σήμα που εκπέμπει ο αποστολέας, μαζί με τα δεδομένα της εικόνας μεταφέρει και το χρησιμοποιούμενο πρότυπο κωδικοποίησης. Ο δέκτης λαμβάνει αυτή την πληροφορία και το σύστημα αποκωδικοποίησης ρυθμίζεται αυτομάτως. Ωραία, θα πείτε, αλλά τι γίνεται αν ο δέκτης καθυστερήσει να συνδεθεί και χάσει την αρχή του σήματος; Κανένα πρόβλημα! Το επιλεγμένο πρότυπο κωδικοποίησης εκπέμπεται διαρκώς, όχι μόνο στην έναρξη της εκπομπής.

Στην εικόνα βλέπουμε το περίγραμμα (envelope ή contour) ενός σήματος SSTV και, συγκεκριμένα, του τμήματος με το VIS header. Το συγκεκριμένο ενσωματώνει τον κωδικό 42.

Στην εικόνα βλέπουμε το περίγραμμα (envelope ή contour) ενός σήματος SSTV και, συγκεκριμένα, του τμήματος με το VIS header. Το συγκεκριμένο ενσωματώνει τον κωδικό 42.

Κάθε φορά που ξεκινά η εκπομπή ενός καρέ (frame) της εικόνας, το πρότυπο SSTV προβλέπει την εκπομπή ενός σήματος με το όνομα VIS (Vertical Interval Signaling). Ουσιαστικά είναι κάτι σαν το Vertical Sync του VGA. Μόνο που στην περίπτωση του SSTV δεν πρόκειται για έναν απλό παλμό, αλλά για ένα ελαφρώς πιο σύνθετο σήμα. Πριν από την έναρξη του VIS εκπέμπονται τρεις τόνοι, ένας στα 1900Hz, ένας στα 1200Hz κι ένας ακόμα στα 1900Hz. Η αποστολή τους είναι εξαιρετικά απλή: Ειδοποιούν τον εκάστοτε δέκτη ότι ακολουθεί η εκπομπή του VIS. Το συγκεκριμένο σήμα, βλέπετε, έχει βαρύνουσα σημασία. Εκτός του ότι σηματοδοτεί την έναρξη ενός καρέ, περιλαμβάνει την πληροφορία για το χρησιμοποιούμενο πρότυπο κωδικοποίησης. Η διάρκεια του σήματος VIS ανέρχεται στα 30ms και στα δύο του άκρα (αρχή και τέλος) περιλαμβάνει δύο τόνους στα 1200Hz, με τον καθένα να διαρκεί 3ms. Ουσιαστικά, αυτοί οι δύο τόνοι αποτελούν το start bit και το stop bit αντίστοιχα. Όπως υποψιάζεστε, ο χρόνος των 3ms είναι η διάρκεια εκπομπής για όλα τα bits. Επομένως, αν αφαιρέσουμε το χρόνο των start και stop bits από τα 30ms που διαρκεί το VIS, απομένει χρόνος για οκτώ ακόμα bits. Από αυτά, τα επτά πρώτα αναπαριστούν την ταυτότητα του χρησιμοποιούμενου προτύπου κωδικοποίησης, ενώ το τελευταίο χρησιμοποιείται για την ανίχνευση σφαλμάτων κατά τη μετάδοση (parity bit). Το λογικό 0 μεταφέρεται ως ένας τόνος των 1300Hz, ενώ το λογικό 1 ως ένας τόνος των 1100Hz. Οι 128 διαφορετικές τιμές που μπορούν να περιγράψουν τα επτά bits είναι περισσότερες από τα διαθέσιμα πρότυπα κωδικοποίησης.

Μετά από το stop bit του VIS ακολουθεί η αποστολή των γραμμών της εικόνας. Η έναρξη κάθε γραμμής σηματοδοτείται με την εκπομπή ενός τόνου στα 1200Hz. Μπορείτε να τον φαντάζεστε σαν το horizontal sync του VGA. Μετά από κάθε τέτοιο τόνο, εκπέμπονται τα δεδομένα για τα pixels της εκάστοτε γραμμής. Με λίγα λόγια, η εικόνα στο SSTV σχηματίζεται pixel προς pixel και γραμμή προς γραμμή (scan lines). Εν ολίγοις, η εικόνα μεταφέρεται όπως σε όλα τα πρότυπα αναλογικής μετάδοσης της εικόνας. Παρεμπιπτόντως, αν θέλετε να μάθετε περισσότερα γι’ αυτά τα πρότυπα και ειδικά για το VGA, μπορείτε να διαβάσετε το άρθρο “Κατασκευάστε έναν υπολογιστή, μέρος 3: Pixel προς pixel” (τεύχος 048).

Κωδικοποίηση χρώματος
Το χρώμα των pixels αναπαρίσταται και πάλι με τη χρήση διαφορετικών συχνοτήτων. Για παράδειγμα, στο πρότυπο Robot B/W 24 η συχνότητα 1500Hz αντιστοιχεί σε ένα μαύρο pixel, ενώ η συχνότητα 2300Hz αντιστοιχεί σε ένα λευκό pixel. Οι ενδιάμεσες συχνότητες ερμηνεύονται σαν τις αντίστοιχες διαβαθμίσεις του γκρι. Κι επειδή το συγκεκριμένο πρότυπο προβλέπει σαν ελάχιστο βήμα για τη μεταβολή της συχνότητας τα 12,5Hz, στο διάστημα από 1500 έως 2300Hz μπορούν να “χωρέσουν” 64 αποχρώσεις του γκρι. Στο ίδιο πρότυπο, ο χρόνος που απαιτείται για τη σάρωση μιας γραμμής ανέρχεται στα 93ms, ενώ η ανάλυση της εικόνας είναι 320×240 (320 pixel ανά γραμμή και 240 γραμμές). Αν κάνουμε τις πράξεις και προσθέσουμε το χρόνο για τα σήματα οριζόντιου και κατακόρυφου συγχρονισμού, διαπιστώνουμε ότι η εκπομπή μιας ολόκληρης εικόνας διαρκεί περί τα 25 δευτερόλεπτα. Σας φαίνεται πολύ λίγο; Περιμένετε και θα δείτε.

Σε αυτό το διάγραμμα βλέπουμε πώς μεταβάλλεται το χρώμα των pixels, καθώς η συχνότητα του σήματος ανεβαίνει από τα 1500Hz στα 2300Hz. Τα σκαλοπατάκια οφείλονται στο γεγονός ότι το πρότυπο που έχει χρησιμοποιηθεί (Robot B/W) προβλέπει τη μεταβολή της συχνότητας μόνο κατά ένα συγκεκριμένο βήμα.

Σε αυτό το διάγραμμα βλέπουμε πώς μεταβάλλεται το χρώμα των pixels, καθώς η συχνότητα του σήματος ανεβαίνει από τα 1500Hz στα 2300Hz. Τα σκαλοπατάκια οφείλονται στο γεγονός ότι το πρότυπο που έχει χρησιμοποιηθεί (Robot B/W) προβλέπει τη μεταβολή της συχνότητας μόνο κατά ένα συγκεκριμένο βήμα.

Στην περίπτωση των έγχρωμων προτύπων, όπως είναι το δημοφιλές Martin M1, για τον καθορισμό του χρώματος κάθε pixel συνδυάζονται τρεις τόνοι: Ένας για το κόκκινο, ένας για το πράσινο κι ένας για το μπλε. Για κάθε τόνο ισχύουν αυτά που περιγράψαμε νωρίτερα, στο πρότυπο Robot B/W 24. Επομένως, για κάθε χρωματική συνιστώσα έχουμε και πάλι 64 διαβαθμίσεις κι αυτό σημαίνει ότι το πλήθος των διαθέσιμων χρωμάτων ανέρχεται στα 64 x 64 x 64 = 256144 χρώματα. Σαν να λέμε, έχουμε 18 bits χρώματος — λίγο παράξενο βάθος, αλλά σίγουρα ικανοποιητικό. Οι τρεις τόνοι για κάθε συνιστώσα εκπέμπονται διαδοχικά (πρώτα για το πράσινο, μετά για το μπλε και τέλος για το κόκκινο). Η διάρκεια αυτών των τόνων είναι μεγαλύτερη από αυτή του προτύπου Robot, ενώ στο ενδιάμεσο παρεμβάλλονται και μικρές παύσεις. Τελικά, αν και η ανάλυση της εικόνας στο πρότυπο Martin M1 είναι μόλις 320×256, η εκπομπή μιας ολόκληρης εικόνας διαρκεί περί τα 2 λεπτά.

Κάθε πρότυπο υποστηρίζει διαφορετικό τρόπο κωδικοποίησης της οπτικής πληροφορίας και διαφορετική ανάλυση. Για παράδειγμα, αντί του κλασικού RGB, τα έγχρωμα πρότυπα Robot-κάτι (υπάρχουν αρκετές παραλλαγές) χρησιμοποιούν το χρωματικό φορμάτ YCrCb. Το Υ περιγράφει τη φωτεινότητα, ενώ τα Cb και Cr περιγράφουν τις διαφορές στον χρωματικό τόνο σε σχέση με το μπλε και το κόκκινο αντίστοιχα. Άλλα πρότυπα, όπως το Wraase SC-2, προβλέπουν διπλάσιο χρόνο αποστολής για το πράσινο χρώμα. Αυτό σημαίνει ότι μπορούν να εκπεμφθούν περισσότερες αποχρώσεις. Η επιλογή του πράσινου δεν έγινε τυχαία και οφείλεται στο γεγονός ότι το ανθρώπινο μάτι είναι περισσότερο ευαίσθητο στο συγκεκριμένο χρώμα. Τέλος, κάποια άλλα πρότυπα στοχεύουν στην αποστολή ευκρινέστερης εικόνας, θυσιάζοντας το ρυθμό ανανέωσης. Για παράδειγμα, η εκπομπή μιας εικόνας στο Scottie DX ανέρχεται στα 4,5 λεπτά!

Στα έγχρωμα πρότυπα του SSTV, όπως είναι το Martin M1, για κάθε pixel εκπέμπονται τρεις διαφορετικοί τόνοι. Ο καθένας αντιστοιχεί σε ένα από τα τρία βασικά χρώματα (κόκκινο, πράσινο, μπλε). Εδώ βλέπουμε πώς συνδυάζονται οι τρεις τόνοι για να πάρουμε οκτώ κύρια χρώματα.

Στα έγχρωμα πρότυπα του SSTV, όπως είναι το Martin M1, για κάθε pixel εκπέμπονται τρεις διαφορετικοί τόνοι. Ο καθένας αντιστοιχεί σε ένα από τα τρία βασικά χρώματα (κόκκινο, πράσινο, μπλε). Εδώ βλέπουμε πώς συνδυάζονται οι τρεις τόνοι για να πάρουμε οκτώ κύρια χρώματα.

Κάθε πρότυπο κωδικοποίησης προβλέπει διαφορετικούς χρόνους για τη μετάδοση των “εξαρτημάτων” της εικόνας. Ωστόσο, οι γενικές αρχές παραμένουν ίδιες σε κάθε περίπτωση. Πριν εγκαταλείψουμε τη θεωρία θα θέλαμε να επιστήσουμε την προσοχή σας σε μια ενδιαφέρουσα λεπτομέρεια: Οι συχνότητες που χρησιμοποιούνται για τους διάφορους τόνους βρίσκονται κοντά στα 2KHz. Ξέρετε τι σημαίνει αυτό; Αν οδηγήσουμε το σήμα SSTV σε έναν ενισχυτή κι από εκεί σε ένα ηχείο, θα ακούσουμε καθαρά όλα τα επιμέρους σήματα που απαρτίζουν την εικόνα :D

Η αναπαράσταση τμήματος ενός scanline, κωδικοποιημένο κατά Martin M1. Το μέγεθος Ts αντιστοιχεί στη διάρκεια του τόνου οριζόντιου συγχρονισμού, ενώ τα Tg, Tb και Tr αντιστοιχούν στις διάρκειες των τόνων για τα χρώματα πράσινο, μπλε και κόκκινο ενός pixel. Ο χρόνος T1 αποτελεί τις παύσεις που περιλαμβάνει το σήμα ανάμεσα σε κάθε τόνο.

Η αναπαράσταση τμήματος ενός scanline, κωδικοποιημένο κατά Martin M1. Το μέγεθος Ts αντιστοιχεί στη διάρκεια του τόνου οριζόντιου συγχρονισμού, ενώ τα Tg, Tb και Tr αντιστοιχούν στις διάρκειες των τόνων για τα χρώματα πράσινο, μπλε και κόκκινο ενός pixel. Ο χρόνος T1 αποτελεί τις παύσεις που περιλαμβάνει το σήμα ανάμεσα σε κάθε τόνο.

Απαραίτητος εξοπλισμός
Όσοι σκέφτεστε ότι δεν έχετε τα τεχνικά μέσα για να παρακολουθήσετε τη συνέχεια του άρθρου, κάνετε λάθος. Ο εξοπλισμός που απαιτείται για την αποκωδικοποίηση σημάτων SSTV δεν είναι άλλος από τον υπολογιστή μας. Βέβαια για τη λήψη του σήματος απαιτείται εξοπλισμός SDR, αλλά και πάλι δεν πρόκειται για κάτι ακριβό ή σπάνιο. Μπορεί εκείνο το κύκλωμα τηλεόρασης σε στικάκι που έχετε ξεχασμένο σε κάποιο συρτάρι ή και η κάρτα τηλεόρασης που έχετε μόνιμα στον υπολογιστή, να είναι κατάλληλa. Περισσότερα για το SDR (Software-Defined Radio) μπορείτε να διαβάσετε στο ομώνυμο άρθρο του τεύχους 023. Πάντως για την εκπομπή σημάτων SSTV τα πράγματα είναι ακόμα απλούστερα. Προκειμένου να εκπέμψουμε σε μικρή εμβέλεια μπορούμε να στραφούμε στο αγαπημένο μας Raspberry Pi. Στη συνέχεια, για λόγους που εξυπηρετούν την παρουσίαση, θα εξετάσουμε τη μετάδοση σήματος SSTV και για το τέλος θα αφήσουμε τη λήψη και την αποκωδικοποίηση.

Οι παλιοί αναγνώστες θα θυμούνται το πρόγραμμα PiFM, με τη βοήθεια του οποίου ένας ακροδέκτης GPIO του RPi μετατρέπεται σε κεραία για τη μετάδοση σημάτων FM. Στο τεύχος 029 αξιοποιήσαμε το εν λόγω εργαλείο (PiFM) για την αναμετάδοση του σήματος ενός ραδιοφωνικού σταθμού, ενώ στο τεύχος 037 μπήκαμε στον πειρασμό να δημιουργήσουμε το δικό μας σύστημα μετάδοσης δεδομένων. Όσοι έχετε διαβάσει τα αντίστοιχα άρθρα, γνωρίζετε ότι το PiFM υποστηρίζει μόνο την αναμετάδοση ηχητικών δεδομένων, αποκλειστικά με διαμόρφωση FM και μόνο στο σχετικό φάσμα συχνοτήτων. Το PiFM, όμως, αποτελεί Ελεύθερο Λογισμικό κι ο πηγαίος κώδικάς του διανέμεται δωρεάν και χωρίς περιορισμούς. Μη νομίζετε ότι θα το ρίξουμε ξαφνικά στις προγραμματιστικές επεμβάσεις. Αν κάναμε κάτι τέτοιο θα έπρεπε να ξεχάσουμε για τα καλά το SSTV, μια που θα χρειαζόμασταν αρκετές σελίδες σε αρκετά τεύχη. Αυτή τη φορά, λοιπόν, θα εργαστούμε με μια τροποποιημένη εκδοχή του PiFM, που δημιούργησε ο Evariste Courjaud. Αναφερόμαστε στο εργαλείο RPiTX, το οποίο επιτρέπει τη μετάδοση με διαμόρφωση FM, AM, SSB, VFO, FSQ και SSTV, σε συχνότητες από 130ΚHz έως 750MHz. Το RPiTX, σε αντίθεση με το PiFM, δεν μπορεί να μεταδώσει “απλά” αρχεία ήχου, ούτε και “σκέτες” εικόνες. Υποστηρίζει μόνο αρχεία IQ και FT. Τα πρώτα είναι γνωστά σε όλους τους ραδιοερασιτέχνες που χρησιμοποιούν το GNU Radio, ενώ τα δεύτερα παράγονται από μια σειρά μικρών προγραμμάτων που συνοδεύουν το RPiTX. Όπως δηλώνουν τα ονόματα των εν λόγω προγραμμάτων (pissb, piam, pifm, pisstv και pifsq), το καθένα χειρίζεται σήματα διαφορετικής διαμόρφωσης. Με μια πρώτη εξέταση, η αρθρωτή (modular) λογική που ακολουθεί το RPiTX μοιάζει άσκοπα περίπλοκη, αλλά όπως θα δείτε προσφέρει μεγάλη ευελιξία.

Το διάγραμμα των ακροδεκτών GPIO, σε ένα Raspberry Pi πρώτης γενιάς. Ο ακροδέκτης που αξιοποιεί το RPiTX, πάνω στον οποίο προσαρμόζουμε τη λιλιπούτεια κεραία, είναι ο υπ' αριθμόν 12 (GPIO 18).

Το διάγραμμα των ακροδεκτών GPIO, σε ένα Raspberry Pi πρώτης γενιάς. Ο ακροδέκτης που αξιοποιεί το RPiTX, πάνω στον οποίο προσαρμόζουμε τη λιλιπούτεια κεραία, είναι ο υπ’ αριθμόν 12 (GPIO 18).

Πριν εξετάσουμε τη χρήση του RPiTX και των εργαλείων που το συνοδεύουν, πρέπει να πούμε δυο λόγια για την εγκατάστασή τους. Ο πηγαίος κώδικας του προγράμματος βρίσκεται στο github και διανέμεται μαζί μ’ ένα script, που αναλαμβάνει την εγκατάσταση των απαιτούμενων βιβλιοθηκών και τη μεταγλώττιση. Για να κατεβάσουμε τον πηγαίο κώδικα αρκεί να ανοίξουμε μια κονσόλα στο Raspberry Pi και να δώσουμε κάτι τέτοιο:

$ git clone https://github.com/F5OEO/rpitx.git

Η διαδικασία λήψης θα ολοκληρωθεί γρήγορα και θα δημιουργηθεί ένας κατάλογος με το όνομα rpitx. Το επόμενο βήμα είναι να εισέλθουμε στον κατάλογο και να εκτελέσουμε το script της εγκατάστασης:

$ cd rpitx
$ ./install.sh

Κατά τη διάρκεια της μεταγλώττισης θα ερωτηθούμε για τη λήψη και την εγκατάσταση διάφορων άλλων πακέτων. Για τη σωστή ολοκλήρωση της διαδικασίας πρέπει να απαντήσουμε καταφατικά σε όλες τις σχετικές ερωτήσεις. Μετά την εγκατάσταση, το rpitx κι όλα τα συνοδευτικά εργαλεία θα έχουν τοποθετηθεί στον κατάλογο /usr/bin και θα είναι έτοιμα προς χρήση.

Πριν αξιοποιήσουμε τα νέα εργαλεία πρέπει να κάνουμε μια μικρή “φυσική” προσθήκη στο Raspberry Pi. Αναφερόμαστε στην τοποθέτηση μιας κεραίας, που θα διευκολύνει τη μετάδοση του σήματος. Το μόνο που χρειαζόμαστε είναι ένα μικρό κομμάτι σύρματος (5cm είναι αρκετά), που θα πρέπει να προσαρμόσουμε στον ακροδέκτη GPIO 18. Παρεμπιπτόντως, οφείλουμε να επισημάνουμε ότι η αναμετάδοση ραδιοσυχνοτήτων απαιτεί ειδική άδεια. Στη δική μας περίπτωση, όμως, η εξαιρετικά περιορισμένη εμβέλεια του πομπού (βλέπε Raspberry Pi) είναι σίγουρο ότι δεν θα ενοχλήσει κανέναν.

Τα πρώτα βήματα
Για αρχή θα εξετάσουμε ένα απλό σενάριο, μόνο και μόνο για να δείτε τη γενική ιδέα. Θα μεταδώσουμε το περιεχόμενο ενός αρχείου ήχου, στα 100MHz και με διαμόρφωση FM. Όπως αντιλαμβάνεστε, κάτι τέτοιο θα μπορούσε να γίνει πανεύκολα και με το PiFM. Εμείς ωστόσο θα στηριχτούμε στο RPiTX και σε ένα από τα συνοδευτικά εργαλεία που ονομάζεται pifm. Αρχικά, με τη βοήθεια του pifm θα δημιουργήσουμε από το αρχείο ήχου ένα αρχείο FT και στη συνέχεια θα εκπέμψουμε το περιεχόμενο του εν λόγω αρχείου με τη βοήθεια του RPiTX.

$ pifm sampleaudio.wav fmaudio.ft
$ sudo rpitx -m RF -i fmaudio.ft -f 100000 -l

Η χρήση του pifm είναι απλή: Η πρώτη παράμετρος είναι το αρχείο ήχου που θέλουμε να μετατρέψουμε και η δεύτερη δηλώνει το όνομα του αρχείου που θα δημιουργηθεί. Περνώντας στο rpitx, παρατηρήστε ότι το εκτελούμε με τη βοήθεια του sudo. Το εν λόγω πρόγραμμα, βλέπετε, πρέπει να έχει πρόσβαση στους ακροδέκτες GPIO και αυτό προϋποθέτει δικαιώματα root. Η παράμετρος –m καθορίζει τον τρόπο λειτουργίας (mode) του προγράμματος και δεν υπάρχει λόγος να το ρίξουμε πάλι στη θεωρία. Στην περίπτωση της εκπομπής σημάτων FM επιλέγουμε τον τρόπο λειτουργίας RF. Με την παράμετρο –i ορίζουμε το όνομα του αρχείου που θέλουμε να μεταδώσουμε, ενώ με την παράμετρο –f δίνουμε τη συχνότητα εκπομπής σε KHz. Τέλος, η παράμετρος –l (από το loop) επιβάλλει την επαναλαμβανόμενη εκπομπή του αρχείου.

Ας δούμε ένα εξίσου απλό παράδειγμα. Ας υποθέσουμε ότι θέλουμε να εκπέμψουμε το περιεχόμενο ενός αρχείου ήχου, στη συχνότητα 1700kHz και με διαμόρφωση AM. Αυτή τη φορά, μαζί με το rpitx θα χρησιμοποιήσουμε και το piam:

$ piam sampleaudio.wav amaudio.ft
$ sudo rpitx -m RFA -i amaudio.ft -f 1700 -l

Νομίζουμε ότι δεν χρειάζεται κάποια ιδιαίτερη επεξήγηση. Το μόνο που αλλάζει είναι η χρήση του mode RFA και φυσικά, η συχνότητα εκπομπής που δίνουμε μετά την παράμετρο –f.

Εκπομπή εικόνας
Ας επιστρέψουμε τώρα στο θέμα μας. Η εικόνα πρέπει να έχει συγκεκριμένες διαστάσεις και βάθος χρώματος, σύμφωνα με το πρότυπο κωδικοποίησης που σκοπεύουμε να χρησιμοποιήσουμε. Το pisstv υποστηρίζει το πρότυπο Martin M1 κι αυτό σημαίνει ότι η εικόνα πρέπει να έχει διατάσεις 320×240 pixels και βάθος χρώματος 8 bits. Επιπρόσθετα, η εικόνα πρέπει να είναι αποθηκευμένη σε ασυμπίεστη μορφή αλλά, όπως καταλαβαίνετε, αυτό δεν αποτελεί περιορισμό του προτύπου. Πρόκειται για μια ιδιαιτερότητα του τρόπου λειτουργίας του pisstv. Τελικά, για να εκπέμψουμε μια εικόνα πρέπει να κάνουμε τα εξής: Αρχικά πρέπει να εξασφαλίσουμε ότι έχει τις σωστές διαστάσεις και το αναμενόμενο βάθος χρώματος. Κάτι τέτοιο μπορεί να γίνει ακόμα και με το πιο απλό σχεδιαστικό πρόγραμμα και δεν χρειάζεται κάποια περαιτέρω εξήγηση. Στη συνέχεια πρέπει να μετατρέψουμε το αρχείο εικόνας σε μια μορφή κατανοητή από το pisstv. O πιο απλός και γρήγορος τρόπος είναι με τη βοήθεια του πακέτου ImageMagick. Αν δεν το έχετε εγκαταστήσει ήδη στο Raspberry, αρκεί να δώσετε κάτι τέτοιο:

$ sudo apt-get install imagemagick

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

$ convert -depth 8 picture.jpg picture.rgb

Τώρα μπορούμε να τρέξουμε το pisstv, για να δημιουργήσουμε το αρχείο FT που στη συνέχεια θα εκπέμψει το RPiTX:

$ pisstv picture.rgb picture.ft
$ sudo rpitx -m RF -i picture.ft -f 14230

Αυτό ήταν όλο. Η πρώτη μας μετάδοση εικόνας SSTV είναι γεγονός!

Μετά από αυτό το μικρό κατόρθωμα ανοίγονται μπροστά μας απεριόριστες δυνατότητες. Τι θα λέγατε αν εκπέμπαμε την εικόνα που λαμβάνουμε από μια μικρή κάμερα; Ο καλύτερος υποψήφιος γι’ αυτή τη δουλειά είναι το Raspberry Pi Camera Module. Για να πετύχουμε το σκοπό μας, κατασκευάσαμε ένα απλούστατο BASH script:

 
#!/bin/bash

echo "Press [CTRL+C] at any moment to stop..."

while :
do
	raspistill -w 320 -h 256 -o ~/img.jpg -t 1
	convert -depth 8 ~/img.jpg ~/img.rgb
	pisstv ~/img.rgb ~/img.ft
	sudo rpitx -m RF -i ~/img.ft -f 14230
done

Όπως βλέπετε, το σκριπτάκι τυπώνει ένα μήνυμα και στη συνέχεια εισέρχεται σε έναν ατέρμονα βρόχο. Εκεί μέσα γίνεται όλη η δουλειά. Κατ’ αρχάς, με τη βοήθεια του raspistill παίρνουμε ένα στιγμιότυπο (still) από το οπτικό πεδίο της κάμερας. Στη συνέχεια, με τον τρόπο που είδαμε λίγο νωρίτερα εκπέμπουμε την εικόνα και η διαδικασία επαναλαμβάνεται.

Sound-check, αλλά για την εικόνα
Για τους φίλους ραδιοερασιτέχνες, ο περιορισμός στους τέσσερεις τοίχους τους σπιτιού είναι ανυπόφορος. Η χρήση του Raspberry Pi σε συνδυασμό με το RPiTX δεν αποτελεί “σοβαρή” λύση. Ένας ραδιοερασιτέχνης θα προτιμούσε να κωδικοποιήσει την εικόνα σύμφωνα με κάποιο πρότυπο του SSTV και στη συνέχεια να λάβει το αποτέλεσμα με τη μορφή ενός αρχείου ήχου. Έτσι, θα μπορούσε να εκπέμψει τον ήχο (δηλαδή την εικόνα) μέσω του πανίσχυρου ραδιοερασιτεχνικού εξοπλισμού. Ε, λοιπόν, αν κι αυτή η διαδικασία μοιάζει αδιάφορη για τους περισσότερους από εμάς, πετυχαίνει έναν uber-geeky σκοπό: Θα μας επιτρέψει να ακούσουμε μια εκπομπή SSTV!

Αν νομίζετε ότι σκοπεύουμε να μπλέξουμε με περισσότερα εξωτικά εργαλεία, σφάλλετε τα μάλα. Η βιβλιοθήκη PySSTV μπορεί να πετύχει όλα όσα θέλουμε, χωρίς πολλά-πολλά. Όπως αντιλαμβάνεστε, πρόκειται για βιβλιοθήκη της αγαπημένης μας γλώσσας προγραμματισμού, της Python. Με τη βοήθειά της, καθώς και τη συνδρομή της PIL (Python Image Library), μπορούμε να χρησιμοποιούμε όλα τα δημοφιλή φορμά εικόνας (BMP, PNG, JPEG, GIF κ.ά.) και να παράγουμε σήμα SSTV στη μορφή αρχείων WAV. Η PySSTV υποστηρίζει μια ικανοποιητική γκάμα από πρότυπα κωδικοποίησης, όπως τα Martin M1, Martin M2, Robot B/W 8, Robot B/W 24, Scottie S1, Pasokon P3 κ.ά. Ο κώδικας της βιβλιοθήκης βρίσκεται στο αποθετήριο https://pypi.python.org/pypi/PySSTV και η εγκατάστασή της πραγματοποιείται πανεύκολα, είτε με τη βοήθεια των setup tools είτε με τη χρήση του εξαιρετικού package manager ονόματι pip. Αυτή τη φορά δεν χρειάζεται να δουλέψουμε στο Raspberry Pi. Μπορούμε να στραφούμε σε κάποιο “μεγάλο” σύστημα που τρέχει Linux ή και σε κάποια εικονική μηχανή. Στο δικό μας σύστημα είχαμε ήδη εγκατεστημένο το pip και το μόνο που χρειάστηκε να κάνουμε ήταν να ανοίξουμε μια κονσόλα:

$ pip install pysstv

Με την ευκαιρία, σημειώστε ότι μπορείτε να μάθετε τα πάντα για τους package manager της Python στο άρθρο “Βγάλτε βόλτα την Python” του τεύχους 034. Εκτελώντας το παραπάνω, μέσα σε λίγα δευτερόλεπτα η βιβλιοθήκη PySSTV θα έχει εγκατασταθεί και θα είναι έτοιμη προς χρήση. Τώρα, το μόνο που μένει είναι να φτιάξουμε ένα πρόγραμμα που θα την αξιοποιεί. Σωστά; Και ναι, και όχι. Ο “φυσιολογικός” τρόπος χρήσης είναι ακριβώς αυτός που περιγράψαμε, αλλά εμείς θα καταφύγουμε σε μια πρόχειρη και γρήγορη λύση. Θα χρησιμοποιήσουμε τη βιβλιοθήκη σαν ένα module της Python, στο οποίο θα περάσουμε τις επιθυμητές παραμέτρους μονομιάς:

$ python -m pysstv --mode MartinM1 input.png output.wav

Προφανώς, το input.png αποτελεί την εικόνα που θέλουμε να εκπέμψουμε και το output.wav αποτελεί το αρχείο ήχου με το σήμα SSTV. Τώρα, μπορούμε να ανοίξουμε έναν audio player και να ακούσουμε …την εικόνα. Δεν ξέρουμε τι θα ακούσετε εσείς και πώς θα σας φανεί, αλλά τα δικά μας αφτιά βουίζουν ακόμα.

Ακούει κανείς;
Για να οπτικοποιήσει κανείς τις εκπομπές μας, για να καταφέρει να δει τις εικόνες που εκπέμπουμε, χρειάζονται ειδικά προγράμματα. Για καλή μας τύχη υπάρχουν αρκετά δωρεάν εργαλεία. Εμείς δοκιμάσαμε το MMSSTV και το RX-SSTV, αλλά αυτό που μας κέρδισε ήταν το πρώτο. Μπορείτε να το κατεβάσετε από τη διεύθυνση http://hamsoft.ca/pages/mmsstv.php. Για τις πρώτες δοκιμές καταφύγαμε σε μια πονηριά. Αντί να εκπέμψουμε το σήμα SSTV με ραδιοκύματα, το στείλαμε στα ηχεία μας. Ταυτόχρονα, ρυθμίσαμε το MMSSTV για να χρησιμοποιήσει σαν είσοδο το μικρόφωνο. Αν και το μικρόφωνο “έπιανε” όλους τους θορύβους του περιβάλλοντος, το αποτέλεσμα ήταν ικανοποιητικότατο. Έτσι, εφόσον είχαμε πειστεί ότι οι παράξενοι ήχοι αντιστοιχούσαν πράγματι σε μια εκπομπή SSTV, προχωρήσαμε σε μια πιο ρεαλιστική δοκιμή.

Για την ηλεκτρομαγνητική εκπομπή του σήματος χρησιμοποιήσαμε το Raspberry Pi, τo RPiTX κι ένα μικρό καλώδιο σε ρόλο κεραίας. Κατά την εκτέλεση του RPiTX επιλέξαμε τη συχνότητα των 100MHz και δώσαμε την παράμετρο –l, για να πετύχουμε τη διαρκή εκπομπή της εικόνας. Έχοντας ξεμπερδέψει πλέον με τον πομπό, στραφήκαμε στο δέκτη. Για τη λήψη αξιοποιήσαμε την τεχνική Software-Defined Radio κι έναν μικρό δέκτη DVB από την Terratec. Αφού συνδέσαμε το δέκτη στο σύστημα, το πρώτο πράγμα που κάναμε ήταν να αντικαταστήσουμε τον “επίσημο” driver που εγκαταστάθηκε αυτόματα. Για το σκοπό αυτό κατεβάσαμε και εγκαταστήσαμε το πρόγραμμα Zadig. Αμέσως μετά, κατεβάσαμε κι εγκαταστήσαμε το πρόγραμμα SDR#. Από το περιβάλλον εργασίας του Zadig επιλέξαμε τον τηλεοπτικό μας δέκτη, στην περίπτωσή μας ήταν το “Bulk-In, Interface (Interface 0)”, και πατήσαμε το κουμπί “Replace Driver”. Όταν ολοκληρώθηκε η διαδικασία αντικατάστασης τρέξαμε το SDR# και ως συσκευή εισόδου επιλέξαμε το “USB-RLT”. Έτσι, ο δέκτης τέθηκε σε λειτουργία κι εμείς ρυθμίσαμε το SDR# για λήψη στη συχνότητα του πομπού μας (στα 100MHz). Αμέσως μόλις συντονιστήκαμε άρχισαν να ακούγονται τα “κελαϊδίσματα” του Raspberry Pi. Σε αυτή τη φάση ανοίξαμε το MMSSTV κι επιλέξαμε σαν είσοδο το μικρόφωνο. Για μία ακόμα φορά, τα είχαμε καταφέρει! Βέβαια, όπως και στην πρώτη δοκιμή, οι θόρυβοι του δωματίου αλλοίωναν το σήμα που λάμβανε το μικρόφωνο και κατ’ επέκταση αλλοίωναν το περιεχόμενο της εκπομπής μας. Αυτό το πρόβλημα θα μπορούσε να λυθεί οριστικά με τη βοήθεια άλλων προγραμμάτων, που θα τροφοδοτούσαν την έξοδο του SDR στην είσοδο του αποκωδικοποιητή, χωρίς τη μεσολάβηση των ηχείων και του μικροφώνου. Εμείς κάναμε κάτι πολύ πιο απλό: Πήραμε ένα καλώδιο mini-jack σε mini-jack και “γεφυρώσαμε” το line-out με το line-in. Στη συνέχεια, από το περιβάλλον του MMSSTV επιλέξαμε σαν είσοδο το line-in. Με αυτό το κολπάκι, το ηχητικό σήμα που λάμβανε το SDR# (το σήμα SSTV) έφτανε στον αποκωδικοποιητή αναλλοίωτο ;)

Το περιβάλλον εργασίας του SDR# και ειδικά το πάνελ ρυθμίσεων που εμφανίζεται στ' αριστερά, μοιάζει πολύ περίπλοκο. Αν το μελετήσετε με ψυχραιμία, πάντως, θα διαπιστώσετε ότι όλες οι ρυθμίσεις είναι απλές και κατανοητές. Το υπόλοιπο περιβάλλον θα φανεί αδιάφορο σε όσους δεν έχουν εντρυφήσει στο θέμα, αλλά είναι σίγουρα εντυπωσιακό :D

Το περιβάλλον εργασίας του SDR# και ειδικά το πάνελ ρυθμίσεων που εμφανίζεται στ’ αριστερά, μοιάζει πολύ περίπλοκο. Αν το μελετήσετε με ψυχραιμία, πάντως, θα διαπιστώσετε ότι όλες οι ρυθμίσεις είναι απλές και κατανοητές. Το υπόλοιπο περιβάλλον θα φανεί αδιάφορο σε όσους δεν έχουν εντρυφήσει στο θέμα, αλλά είναι σίγουρα εντυπωσιακό :D

Παίζοντας με το Raspberry Pi και τις εκπομπές SSTV, αρχίσαμε να σκεφτόμαστε διάφορα παράξενα projects. Ποια τρελή ιδέα γυροφέρνει άραγε στη σκέψη σας; Όποια κι αν είναι, μη διστάσετε να τη μοιραστείτε μαζί μας και, πού ξέρετε, ίσως στο μέλλον να την υλοποιήσουμε.

Μετά από αρκετές δοκιμές και μικρορυθμίσεις στο SDR#, το MMSSTV κατάφερε να εμφανίσει την εικόνα που εξέπεμπε το Raspberry Pi: το λογότυπο του αγαπημένου μας περιοδικού.

Μετά από αρκετές δοκιμές και μικρορυθμίσεις στο SDR#, το MMSSTV κατάφερε να εμφανίσει την εικόνα που εξέπεμπε το Raspberry Pi: το λογότυπο του αγαπημένου μας περιοδικού.

4 Responses to “SSTV …ή αλλιώς άκου να δεις!”

  1. f0xsig0 | 10/02/2016 at 00:05

    Ευχαριστούμε για το άρθρο σου φίλε μου.
    χαρά μας να βλέπουμε θέματα που συνδυάζουν και ραδιοκύματα, SDR, DSP, data acquisition,κλπ.
    καλή η αναφορά σου για τους ραδιοερασιτέχνες ,τους hackers μιας άλλης εποχής και όχι μόνο. (έτσι να μην ξεχνάμε και το hobby) :).

    • multiPetros | 10/02/2016 at 13:15

      Σ’ ευχαριστούμε πολύ f0xsig0 για τα καλά σου λόγια, συνεχίζουμε ακάθεκτοι για το καλύτερο!

  2. aandreatos | 13/03/2016 at 10:57

    Αγαπητέ Πέτρο
    Πολύ ενδιαφέρον άθρο! αλλά:

    Όταν τρέχω την εντολή rpitx [με οποιεςδήποτε παραμέτρους], πχ:
    sudo rpitx -m RF -i a.ft -f 14230
    sudo ./rpitx -m RF -i a.ft -f 14230
    παίρνω το μήνυμα σφάλματος:

    pi@raspberrypi ~/rpitx $
    rpitx Version 0.1 compiled Mar 11 2016 (F5OEO Evariste) running on Master PLL = 1000000000
    Model Pi B
    Model Pi 1
    Wheezy
    Using local mbox device file with major 249.
    ioctl_set_msg failed:-1
    ioctl_set_msg failed:-1
    mmap error -1

    Τι προτείνεις; /
    Α.Ανδρεάτος

    • multiPetros | 13/03/2016 at 13:25

      Πολύ παράξενο,
      για δοκίμασε να τρέξεις το script εγκατάστασης του rpitx με δικαιώματα root

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων