PiRadio

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

Αυτό το project έχει και hardware, και software κομμάτι. Ας ξεκινήσουμε με το hardware.

Hardware

Raspberry Pi

Ένα raspberry που μου έχει μείνει στα αζήτητα, από τότε που αντικαταστάθηκε από ένα 2ης γενιάς. Για την ακρίβεια, είναι

pi@raspberrypi:~ $ cat /sys/firmware/devicetree/base/model
Raspberry Pi Model B Rev 2

Κι επειδή το Raspberry μου έχει μόνο ethernet connectivity, του έχω βάλει πάνω κι ένα wifi dongle.

LCD Display

Μια lcd οθόνη 16×2 1602A που πήρα από το internet. Για την ακρίβεια, αγόρασα δύο οθόνες, αφού η πρώτη που πήρα δεν είχε i2c interface, οπότε από τη μια θα ήταν μεγάλη σπατάλη gpio να την οδηγήσω, και από την άλλη, είμαι παντελώς ανίκανος να κάνω τόσες πολλές κολλήσεις τόσο κοντά η μια στην άλλη χωρίς να γίνουν όλα αχταρμάς. Παράτησα λοιπόν την πρώτη οθόνη, και πήρα μία με i2c, την συνέδεσα στα i2c pins του Pi, και όλα καλά.

Ενισχυτής και ηχείο

Ενισχυτή πήρα από το internet, έναν μονοκάναλο, 2,5W, ενώ το ηχείο κατασχέθηκε από το ρολόι-ραδιόφωνο της εισαγωγής. Αρχικά σκεφτόμουν να πάρω το ηχητικό σήμα με ένα 3.5mm jack από την έξοδο του Pi, αλλά τελικά επέλεξα να κολλήσω απευθείας συνδέσεις από την βάση του jack προς τον ενισχυτή.

GPIO Array

Για το project χρειάζεται να έχουμε αλληλεπίδραση με το raspberry, χωρίς να κάνουμε login. Κατά συνέπεια χρειαζόμαστε διακόπτες. Κι επειδή δεν κατάφερα να βρω σαφείς πληροφορίες για το αν το μοντέλο που έχω έχει pull up/down αντιστάσεις ή όχι, έφτιαξα ένα κυκλωματάκι με 4 διακόπτες σε pull-up configuration, και τους συνέδεσα στα σχετικά GPIOs του Pi.

Software

OS

Raspberry Pi OS, καμία έκπληξη εδώ.

I2C / LCD Library

Αν και ίσως να είχε ενδιαφέρον να κάτσω να γράψω έναν driver για την οθόνη, είπα να το αφήσω για αργότερα. Πήρα έναν έτοιμο που βρήκα στο internet, από τον Denis Pleic. Αυτό που έκανα, ήταν να γράψω τη λογική για το τι θα δείχνει η οθόνη σε κάθε δεδομένη στιγμή.

Media player

Όχι δεν υπάρχει περίπτωση, ποτέ, να κάτσω να μάθω πως δουλεύει (και πως γράφεται) ένας media player. Χρησιμοποιούμε τον mplayer, όπως έρχεται από το repo του λειτουργικού.

Clock/Player script

Ο κώδικας που ενώνει όλα τα προαναφερθέντα σε μια οντότητα είναι γραμμένος σε python, και σε γενικές γραμμές κάνει τα εξής

  • αρχικοποιεί τα GPIO και δηλώνει callback functions για αυτά που είναι συνδεδεμένα με τους διακόπτες.
  • ξεκινάει μια ατέρμονη λούπα που συνεχώς ανανεώνει το περιεχόμενο της οθόνης.
  • περιμένει να πατηθεί κάποιος διακόπτης.

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

Σαν κλείσιμο θα παραθέσω μερικές φωτογραφίες-ντοκουμέντα που αποδεικνύουν πέραν πάσης αμφιβολίας ότι είμαι μόνο για τον ψηφιακό κόσμο (και αν). Φήμες ότι το αποτέλεσμα έχει το παρατσούκλι το ραδιοφωνάκι του Φρανκενστάιν ελέγχονται ως αναληθείς.

Αφού έτσι κι αλλιώς μόνο Kids radio ακούμε, ας το βάλουμε σε ένα PJ Masks lunchbox, να το δώσουμε στα παιδιά. Βέβαια το ταπεράκι ήταν ιδιαίτερα αντίθετο στις προθέσεις μου, όπως φαίνεται από την ποιότητα της οπής του ηχείου.

Με τις τρύπες για τους διακόπτες είχα φυσικά το ίδιο πρόβλημα, αλλά αυτό κατέληξε κάπως καλύτερα (αν εξαιρέσει κανείς το τεράστιο σπάσιμο στον δεύτερο διακόπτη)

Και φυσικά το ίδιο πρόβλημα και με την τρύπα για την οθόνη. Η κόλλα σιλικόνης να είναι καλά, και όλα έμειναν στις θέσεις τους στο τέλος.

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

Και κάπου εδώ τελειώνει το αφιέρωμα στο ραδιοφωνάκι, που μπορεί να είναι ασχημόπαπο, αλλά πολύ χάρηκα που έπαιξε. Απλά στο version 2.0 θα βάλω άλλον να κάνει τα χειρωνατικά κομμάτια!

Ο κώδικας που τρέχει το σύστημα είναι διαθέσιμος στο github!