Κατά τη διάρκεια πειραμάτων και αναζητήσεων στα ψηφιακά ραδιοερασιτεχνικά, ανακάλυψα ένα ωραίο project στο διαδίκτυο από τον
που περιγράφει έναν προσαρμογέα για D-Star, DMR, Fusion και άλλα ψηφιακά πρότυπα βασισμένο σε έναν μικροελεγκτή Arduino Due και μια μικρή πλακέτα πάνω του. Αυτή η πλακέτα ονομάζεται Multimode Voice Modem ή MMDVM. Αυτό έχει γίνει αρκετά δημοφιλές επειδή το υλικό και λογισμικό είναι Open Source.
Το σχέδιο και κάποια τεκμηρίωση μπορούν να βρεθούν στο αντίστοιχο Yahoo Group. Το κύκλωμα στο οποίο αναφερόμαστε, είναι η έκδοση 1 και τα υλικά που χρειάζονται μπορούν να αγοραστούν από ένα κατάστημα ηλεκτρονικών στη Γερμανία για το οποίο υπάρχει προσυμπληρώμενη λίστα με όλα τα υλικά, έτοιμη για αγορά. Αν κάποιος επιθυμεί να αγοράσει τη λίστα αυτή από το συγκεκριμένο κατάστημα μπορεί να δει εδώ. Όλα τα υλικά μαζί με την πλακέτα και τα μεταφορικά κόστισαν περίπου 23 ευρώ. Φυσικά χρειαζόμαστε και το Arduino Due το οποίο κόστισε 16 ευρώ από το Banggood (φυσικά είναι ένας κλώνος και όχι το γνήσιο).
Έτσι, όλα τα υλικά κοστίζουν περίπου 40€ για ένα εμφανίσιμο ψηφιακό προσαρμογέα φωνής για το DMR, Dstar κτλ. Δεδομένου ότι το κύκλωμα είναι λίγο πιο περίπλοκο από ένα απλό κύκλωμα με τρανζίστορ θα γίνει χρήση κάποιου λογισμικού που επιτρέπει το σχεδιασμό του κυκλώματος σε ένα breadboard. Οπότε και έγινε η χρήση του προγράμματος Blackboard. Αυτό το λογισμικό είναι διαθέσιμο ως Open Source από εδώ και είναι γραμμένο σε Java και εκτελείται σε όλα τα γνωστά λειτουργικά συστήματα.
Το λογισμικό επιτρέπει τον βασικό σχεδιασμό του κυκλώματος με βασικά εξαρτήματα χωρίς να ληφθούν υπόψιν οι τιμές τους. Όλα τα υλικά μπήκαν μαζί σε μια πλακέτα διπλής όψης διάτρητη που είναι ελαφρώς μεγαλύτερη από το Arduino Due στο οποίο και θα τοποθετηθεί. Στην πλακέτα αυτή χρησιμοποιούνται και οι δύο όψεις για την υλοποίηση των πιστών. Οι πίστες της πάνω όψης διαγράφονται με κόκκινο χρώμα και της κάτω όψης με μπλε χρώμα. Υπάρχουν μερικές περιοχές όπου οι κάτω πίστες ταυτίζονται με τις πάνω. Για να γίνει η απεικόνιση του κυκλώματος θα κάνουμε χρήση του προγράμματος Blackboard επειδή επιτρέπει την απόκρυψη μιας από τις δύο όψεις ώστε να ξεχωρίζει η άλλη. Το αρχείο του προγράμματος μπορείτε να το κατεβάσετε από εδώ.
Αφού υλοποιηθεί η πλακέτα του mmdvm και τοποθετηθεί πάνω στο Arduino Due θα πρέπει να προγραμματιστεί. Για να το προγραμματίσουμε, θα πρέπει να κατεβάσουμε το firmware από εδώ.
Για να γίνει ο προγραμματισμός του Arduino Due θα πρέπει να κατεβάσουμε το Arduino IDE στον υπολογιστή μας. Όταν προγραμμάτισα το δικό μου Arduino, χρησιμοποίησα την έκδοση του IDE 1.6.7. Εφόσον βάλουμε στον υπολογιστή μας το IDE και συνδέσουμε το Arduino από την Programming Port σε μια θύρα USB, μεταβαίνουμε στο μενού Tools -> Board -> Boards Manager και εγκαθιστούμε το Arduino SAM Boards. Στην δική μου περίπτωση, χρησιμοποίησα την έκδοση 1.6.6 όπως φαίνεται και στην εικόνα.
Στη συνέχεια θα πρέπει εφόσον κλείσουμε το IDE ,να κάνουμε τις απαραίτητες αλλαγές όπως αναφέρει εδώ. Για τις εκδόσεις που ανέφερα πιο πάνω ότι χρησιμοποίησα, τροποποίησα το αρχείο C:\Users\[USERNAME]\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.6\platform.txt ως εξής.
Βρίσκουμε τη γραμμή
## Combine gc-sections, archives, and objects
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" -mcpu={build.mcu} -mthumb {compiler.c.elf.flags} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--entry=Reset_Handler -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--start-group "{build.path}/core/syscalls_sam3.c.o" {object_files} "{build.variant.path}/{build.variant_system_lib}" "{build.path}/{archive_file}" -Wl,--end-group -lm –gcc
και αντικαθιστούμε με
## Combine gc-sections, archives, and objects
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" -mcpu={build.mcu} -mthumb {compiler.c.elf.flags} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--entry=Reset_Handler -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--start-group "{build.path}/core/syscalls_sam3.c.o" {object_files} "{build.variant.path}/{build.variant_system_lib}" "{build.system.path}/CMSIS/CMSIS/Lib/ARM/arm_cortexM3l_math.lib" "{build.path}/{archive_file}" -Wl,--end-group -lm -gcc
Στη συνέχεια ανοίγουμε το IDE και ανοίγουμε το Firmware που κατεβάσαμε πιο πριν. Μεταβαίνουμε μέσα από το IDE στο αρχείο Config.h και το διορθώνουμε ως εξής
#if !defined(CONFIG_H)
#define CONFIG_H
// Allow for the use of high quality external clock oscillators
// The number is the frequency of the oscillator in Hertz.
//
// The frequency of the TCXO must be an integer multiple of 48000.
// Frequencies such as 12.0 Mhz (48000 * 250) and 14.4 Mhz (48000 * 300) are suitable.
// Frequencies such as 10.0 Mhz (48000 * 208.333) or 20 Mhz (48000 * 416.666) are not suitable.
//
// For 12 MHz
// #define EXTERNAL_OSC 12000000
// For 12.288 MHz
// #define EXTERNAL_OSC 12288000
// For 14.4 MHz
// #define EXTERNAL_OSC 14400000
// For 19.2 MHz
// #define EXTERNAL_OSC 19200000// Allow the use of the COS line to lockout the modem
// #define USE_COS_AS_LOCKOUT
// Use pins to output the current mode
// #define ARDUINO_MODE_PINS// For the original Arduino Due pin layout
// #define ARDUINO_DUE_PAPA// For the ZUM V1.0 and V1.0.1 boards pin layout
#define ARDUINO_DUE_ZUM_V10// For the SQ6POG board
// #define STM32F1_POG// For the SP8NTH board
// #define ARDUINO_DUE_NTH// For ST Nucleo-64 STM32F446RE board
// #define STM32F4_NUCLEO_MORPHO_HEADER
// #define STM32F4_NUCLEO_ARDUINO_HEADER// Use separate mode pins to switch external filters/bandwidth for example
// #define STM32F4_NUCLEO_MODE_PINS// To use wider C4FSK filters for DMR, System Fusion and P25 on transmit
// #define WIDE_C4FSK_FILTERS_TX
// To use wider C4FSK filters for DMR, System Fusion and P25 on receive
// #define WIDE_C4FSK_FILTERS_RX// Pass RSSI information to the host
#define SEND_RSSI_DATA// Use the modem as a serial repeater for Nextion displays
// #define SERIAL_REPEATER
#endif
Αν ο πομποδέκτης δεν υποστηρίζει RSSI, βάζουμε // μπροστά από τη γραμμή #define SEND_RSSI_DATA ώστε να γίνει σχόλιο.
Πλέον είμαστε έτοιμοι να κάνουμε Upload το firmware στο Arduino. Μόλις τελειώσει το Compile και το Upload χωρίς σφάλματα, όπως στην εικόνα που ακολουθεί, είμαστε έτοιμοι να συνεχίσουμε.
Τελειώνοντας με τον προγραμματισμό του Arduino, θα πρέπει να γίνει η σύνδεση με τον ηλεκτρονικό υπολογιστή ή ένα Raspberry ώστε να επικοινωνήσει με το λογισμικό MMDVM Host. Εδώ θα περιγράψουμε τη διαδικασία για Raspberry Pi 3. Αρχικά θα πρέπει να κατεβάσουμε το λειτουργικό Raspbian Jessie Lite ή και τη Full έκδοση που περιέχει και το γραφικό περιβάλλον από εδώ. Στον ίδιο σύνδεσμο υπάρχουν και οι οδηγίες για το πώς να εγκατασταθεί στο Raspberry Pi. Θα πρέπει να γίνει μια εξοικείωση με τη γραμμή εντολών καθώς και στην περίπτωση της Lite έκδοσης αλλά και της Full θα δουλεύουμε από γραμμή εντολών. Εγώ θα χρησιμοποιήσω την Lite έκδοση καθώς το γραφικό περιβάλλον δεν με εξυπηρετεί πουθενά, αλλά αντιθέτως μου φορτώνει το raspberry με περιττό λογισμικό.
Εφόσον τελειώσουμε την εγκατάσταση του Jessie θα ενημερώσουμε το λειτουργικό μας. Οπότε εκτελούμε. Όσοι επέλεξαν την Full έκδοση θα πρέπει να ανοίξουν το Τερματικό.
# sudo apt-get update
# sudo apt-get upgrade
Στο επόμενο βήμα θα εγκαταστήσουμε το απαραίτητο λογισμικό.
# sudo apt-get install git screen
Καθώς και το MMDVMHost
# cd /opt
# sudo git clone https://github.com/g4klx/MMDVMHost.git
# cd /opt/MMDVMHost
# sudo make
Στο σημείο αυτό θα πρέπει να συνδέσουμε το Arduino Due μαζί με το MMDVM στο Raspberry σε μια USB θύρα. Αφού το συνδέσουμε βλέπουμε το πορτοκαλί led να ανάβει και προχωράμε για να δούμε με ποια διαδρομή προσαρτήθηκε στο Jessie εκτελώντας
# sudo dmesg | grep tty
Από το αποτέλεσμα που βλέπουμε καταλαβαίνουμε ότι το Arduino είναι το /dev/ttyACM0. Κρατάμε τη διαδρομή αυτή και πάμε να ρυθμίσουμε το MMDVM Host εκτελώντας
# sudo nano /opt/MMDVMHost/MMDVM.ini
Στο αρχείο βλέπουμε όλες τις ρυθμίσεις του MMDVM Host. Πιο κάτω βλέπουμε τις ρυθμίσεις που έχω βάλει στο δικό μου.
Να σημειωθεί οτι στην ενότητα Modem, στην τιμή Port, βάζουμε τη διαδρομή που προσαρτήθηκε το mmdvm όπως τη βρήκαμε από την εντολή πιο πάνω. Επίσης στην ενότητα DMR Network χρησιμοποιώ τον Ελληνικό master server. Προσέχουμε το συγκεκριμένο αρχείο να είναι σωστά γραμμένο και με τα στοιχεία που αντιστοιχούν στον καθένα μας (callsign, DMR id κτλ) ώστε να μην δημιουργούνται προβλήματα. ΜΗΝ αντιγράφετε ολόκληρο το αρχείο που ακολουθεί καθώς αλλάζει συνεχώς όσο βγαίνουν νέες εκδόσεις. Το παρακάτω που ακολουθεί είναι απλώς ένα δείγμα.
[General]
Callsign=SV6NOB
Timeout=600 # Transmitter timeout in seconds. Default is: 120s
Duplex=0 # Is this station Simplex or Duplex. Hotspot is Simplex, Repeater is Duplex. Default is: 1
# ModeHang=10 # Time to stay in mode after receiption. If set overrides RFModemHang and NetModemHang
RFModeHang=10 # Time to stay in mode after RF-receiption Default is: 10s
NetModeHang=3 # Time to stay in mode after Network-receiption Default is: 3s
Display=None # If a screen of LCD is on the device (None or name)
Daemon=0 # Run in background[Info]
RXFrequency=434925000 # Receiver frequency in Hz Used by DVMega, reported to DMR-Master. Default is: 0Hz
TXFrequency=434925000 # Transmitter frequency in Hz. Used by DVMega, reported to DMR-Master. Default is: 0Hz
Power=1 # Power in Watts, for informational use only. Keep below 99 for BrandMeister
Latitude=39.364760 # if set, reported to DMR-Master, causes recognition as repeater in BrandMeister
Longitude=20.253125 # if set, reported to DMR-Master, causes recognition as repeater in BrandMeister
Height=0 # if set, reported to DMR-Master, causes recognition as repeater in BrandMeister
Location=Ioannina
Description=SV6NOB Homebrew MMDVM Hotspot - GM350 Motorola Radio, Homebrew MMDVM modem, Arduino DUE & Ubuntu server OS
URL=www.mariosv.gr[Log]
# Logging levels, 0=No logging
DisplayLevel=1 # log Debug to console. Default is: 1
FileLevel=5 # log Debug to file. Default is: 1
FilePath=.
FileRoot=MMDVM
[CW Id]
Enable=1 # Enable the CW Id
Time=15 # How often to ID in minutes[DMR Id Lookup]
File=/opt/MMDVMHost/DMRIds.dat
Time=24[Modem]
Port=/dev/ttyACM0
#Port=\\.\COM3
TXInvert=0
RXInvert=0
PTTInvert=0
TXDelay=100
DMRDelay=0
RXLevel=90
TXLevel=60
# CWIdTXLevel=50
# D-StarTXLevel=50
# DMRTXLevel=50
# YSFTXLevel=50
# P25TXLevel=50RSSIMappingFile=/opt/MMDVMHost/RSSI-GM350_3.dat
SamplesDir=.
Debug=0[UMP]
Enable=0
# Port=\\.\COM4
Port=/dev/ttyACM1[D-Star]
Enable=0 # Enable D-Star repeater mode. Default is: 1
Module=C
SelfOnly=0 # If set, only own ID can operate. Default is: 0[DMR]
Enable=1 # Enable DMR repeater mode. Default is: 1
Beacons=1 # Enable transmission of DMR-Beacons, used for DMR-Roaming
Id=2026008 # DMR ID of this station (repeater)
ColorCode=1 # Color Code to use for DMR repeater access. Default is: 2
SelfOnly=0 # If set, only own ID can operate. Default is: 0
# Prefixes=234,235 # These prefixes are whitelisted for operation. Default is: 0
LookupFile=DMRIds.dat
CallHang=2 # Time to answer in same Talk Group. Default is: 3
TXHang=2 # Time that TX stays on transmission after DMR-over. Default is: 3
#Blacklist=
#DstIdBlackListSlot1RF= # comma separated list TGs to block on RF Slot1
#DstIdBlackListSlot2RF= # comma separated list TGs to block on RF Slot2
#DstIdWhiteListSlot1RF= # comma separated list TGs to allow on RF Slot1
#DstIdWhiteListSlot2RF= # comma separated list TGs to allow on RF Slot2
#DstIdBlackListSlot1NET= # comma separated list TGs to block on NET Slot1
#DstIdBlackListSlot2NET= # comma separated list TGs to block on NET Slot2
#DstIdWhiteListSlot1NET= # comma separated list TGs to allow on NET Slot1
#DstIdWhiteListSlot2NET= # comma separated list TGs to allow on NET Slot2
[System Fusion]
Enable=0 # Enable Fusion repeater mode. Default is: 1[D-Star Network]
Enable=0 # Enable D-Star network connection. Requires ircDDBGateway. Default is: 1
GatewayAddress=127.0.0.1
GatewayPort=20010 # UDP port ircDDBGateway is listening on.
LocalPort=20011 # UDP port MMDVMHost is listening on.
Debug=0[DMR Network]
Enable=1 # Enable DMR network connection. Default is: 1
Address=master.dv4gr.eu
Port=62031 # Port DMRMaster is listening on
# Local=3350 # Local UDP port if needed else random
Password=p2ssw1rd # Access password of DMR Master
RSSI=0 # Enable RSSI measure. Defaukt is: 0
Slot1=1 # Enable Slot 1 Do not enable for DVMega. Default is: 1
Slot2=1 # Enable Slot 2. Default is: 1
Debug=0 # Default is: 0[System Fusion Network]
Enable=0 # Enable Fusion network connection
LocalAddress=127.0.0.1
LocalPort=3200
GwyAddress=127.0.0.1
GwyPort=4200
Debug=0[TFT Serial]
Port=/dev/ttyAMA0
Brightness=50[HD44780]
Rows=2
Columns=16
# For basic HD44780 displays (4-bit connection)
# rs, strb, d0, d1, d2, d3
Pins=11,10,0,1,2,3
# Device address for I2C
I2CAddress=0x20
# PWM backlight
PWM=0
PWMPin=21
PWMBright=100
PWMDim=16
DisplayClock=1
UTC=0
[Nextion]
#Port=/dev/ttyAMA0
Brightness=50
DisplayClock=1
UTC=0
IdleBrightness=20[OLED]
Type=3
Brightness=0
Invert=0
Για έξοδο από το editor πατάμε Ctr+x μετά y για αποθήκευση, n για έξοδο χωρίς αλλαγές και στη συνέχεια Enter.
Στη συνέχεια θα κάνουμε μια πρώτη δοκιμή πριν το calibration του mmdvm.
# sudo /opt/MMDVMHost/MMDVMHost /opt/MMDVMHost/MMDVM.ini
Στο σημείο αυτό θα δούμε στο Arduino τα LED να αναβοσβήνουν και στην οθόνη μας θα βλέπουμε το εξής log
Και στο σημείο αυτό μπορούμε να επισκεφτούμε το Brandmeister και στην επιλογή Hotspots μπορούμε να αναζητήσουμε το callsign μας και να εμφανιστεί. Για να σταματήσουμε τη δοκιμή, στο τερματικό πατάμε Ctrl+C.
Στο επόμενο βήμα θα συνδέσουμε τον πομποδέκτη στο MMDVM. Στην δική μου περίπτωση θα χρησιμοποιήσω έναν Motorola GM350 UHF. Επισημαίνεται πως δεν κάνουν όλοι οι πομποδέκτες με είσοδο/έξοδο 9600 για τη χρήση αυτή. Στη λίστα αυτή υπάρχουν κάποια μοντέλα που έχουν δοκιμαστεί για το συγκεκριμένο πρότυπο. Η συνδεσμολογία για το GM 350 είναι η εξής.
Update 14/09/2017:
Εσωτερικά, στον πομποδέκτη motorola GM350, θα πρέπει να γίνει η εξής γέφυρα όπως φαίνεται στην εικόνα που ακολουθεί.
Δείτε και το σχέδιο εδώ
Το γεφύρωμα αυτό, συνοδεύεται με κάποιες ρυθμίσεις στο codeplug του πομποδέκτη GM350, τις οποίες παραθέτω από δικό μου backup που μπορείτε να κατεβάσετε από εδώ. Φυσικά θα χρειαστεί να αλλάξετε τις συχνότητες σε ότι εσείς επιθυμείτε.
Update 24/09/2018:
Αν το hotspot παρουσιάζει κενά στη λήψη, ακολουθήστε την παρακάτω τροποποίηση στο εσωτερικό του πομποδέκτη Motorola GM350
Εφόσον συνδέσαμε τον πομποδέκτη, θα κάνουμε τη διαδικασία του Calibration εκτελώντας
# cd /opt
# sudo git clone https://github.com/G4KLX/MMDVMCal
# cd /opt/MMDVMCal/
# sudo make
Στο σημείο αυτό θα ξεκινήσουμε το πρόγραμμα του Calibration τονίζοντας ότι ο πομποδέκτης θα πρέπει να έχει συνδεδεμένο ένα dummy load στην έξοδο που να καλύπτει την ισχύ του πομπού, ώστε κατά τη διάρκεια της εκπομπής να μην δημιουργήσουμε πρόβλημα στον πομπό. Η διαδικασία αυτή απαιτεί Spectrum Analyzer αλλά μπορούμε να το αντικαταστήσουμε με ένα RTL SDR και το SDRSharp με εξασθενιτή στην κεραία του.
# sudo /opt/MMDVMCal/MMDVMCal /dev/ttyACM0
Με το πλήκτρο h μπορούμε να εμφανίσουμε τη βοήθεια
H/h Display help
I Toggle transmit inversion
i Toggle receive inversion
P/p Toggle PTT inversion
Q/q Quit
R Increase receive level
r Decrease receive level
T Increase transmit level
t Decrease transmit level
D DMR Deviation Mode (Adjust for 2.75Khz Deviation)
d Return to Dstar Mode
V/v Display version of MMDVMCal
<space> Toggle transmit
Για να ξεκινήσει η εκπομπή πατάμε το πλήκτρο space και βλέπουμε ότι στο MMDVM ανάβει το κόκκινο LED. Ο πομπός πλέον εκπέμπει ένα ήχο 1200Hz τον οποίο μπορούμε να ακούσουμε με ένα αναλογικό δέκτη στην ίδια συχνότητα. Με το πλήκτρο t μπορούμε να μειώσουμε το LF gain και με το πλήκτρο T το αυξάνουμε. Στη δοκιμή που έκανα έβαλα το gain στο 50 και στη συνέχεια πείραξα το trimmer της εκπομπής (δίπλα από το ΠΡΑΣΙΝΟ led) ώστε το φέρον να πάψει να είναι ορατό και να έχει διαμοιραστεί στις πλευρικές όπως φαίνεται στην εικόνα. Αν δεν μπορούμε να το φέρουμε με το trimmer, μπορούμε να αυξήσουμε ή να μειώσουμε το LF gain και να πειράξουμε πάλι το trimmer ώστε να το πετύχουμε όσο το δυνατόν καλύτερα. Την τιμή στην οποία θα αφήσουμε το LF gain θα πρέπει στη συνέχεια να την βάλουμε στο αρχείο ρυθμίσεων του MMDVM Host /opt/MMDVMHost/MMDVM.ini στην ενότητα Modem στην τιμή TXLevel.
Για να ρυθμίσουμε τη λήψη, μπορούμε απλά να ορίσουμε στο αρχείο /opt/MMDVMHost/MMDVM.ini στην ενότητα Modem την τιμή στο RXLevel αρχικά στο 50 και στη συνέχεια να ξεκινήσουμε το MMDVM Host. Για να το ξεκινήσουμε, εκτελούμε
# sudo /opt/MMDVMHost/MMDVMHost /opt/MMDVMHost/MMDVM.ini
Πατώντας με τον DMR πομποδέκτη μας με χαμηλή ισχύ, αρχικά θα δούμε το πράσινο LED να ανάβει και θα πρέπει να ακούμε τον εαυτό μας στο Hoseline του Brandmeister. Αν όχι, πειράζουμε το trimmer της λήψης (δίπλα από το ΚΟΚΚΙΝΟ led) μέχρι να μπορούμε να ακούμε τον εαυτό μας χωρίς προβλήματα. Αν οι στροφές του trimmer δεν επαρκούν, αλλάζουμε την τιμή του RXLevel από 50 που ορίσαμε αρχικά και επαναλαμβάνουμε τη δοκιμή με το trimmer μέχρι να τελειοποιήσουμε τη λήψη και να ακουγόμαστε στο hoseline απροβλημάτιστα.
Στο σημείο αυτό αν έχει γίνει σωστά το calibration, θα μπορούμε να μιλάμε και να ακούμε πλέον από τον DMR πομποδέκτη μας μέσω του hotspot ή repeater μας.
Στη συνέχεια, για να ξεκινάει το MMDVM Host όταν ανοίγει το Raspberry χωρίς να χρειάζεται να κάνουμε εμείς κάτι, θα πρέπει να δημιουργήσουμε την υπηρεσία και να την ορίσουμε να ξεκινάει κατά την εκκίνηση. Οπότε εκτελέσουμε
# sudo nano /lib/systemd/system/mmdvmhost.service
Και μέσα στο αρχείο βάζουμε
[Unit]
Description=MMDVM Host Service
After=syslog.target network.target[Service]
User=root
WorkingDirectory=/opt/MMDVMHost
ExecStart=/usr/bin/screen -S MMDVMHost -D -m /opt/MMDVMHost/MMDVMHost /opt/MMDVMHost/MMDVM.ini
ExecStop=/usr/bin/screen -S MMDVMHost -X quit
[Install]
WantedBy=multi-user.target
Βγαίνουμε από το αρχείο και ορίζουμε δικαιώματα εκτελώντας
# sudo chmod 755 /lib/systemd/system/mmdvmhost.service
Ορίζουμε το symbolic link εκτελώντας
# sudo ln -s /lib/systemd/system/mmdvmhost.service /etc/systemd/system/mmdvmhost.service
Στην συνέχεια ορίζουμε να ξεκινάει 60 δευτερόλεπτα μετά την εκκίνηση εκτελώντας
# sudo nano /lib/systemd/system/mmdvmhost.timer
Και μέσα στο αρχείο βάζουμε
[Timer]
OnStartupSec=60[Install]
WantedBy=multi-user.target
Βγαίνουμε από το αρχείο και ορίζουμε δικαιώματα εκτελώντας
# sudo chmod 755 /lib/systemd/system/mmdvmhost.timer
Ορίζουμε το symbolic link εκτελώντας
# sudo ln -s /lib/systemd/system/mmdvmhost.timer /etc/systemd/system/mmdvmhost.timer
Στο επόμενο βήμα προσθέτουμε την υπηρεσία και την ορίζουμε να ξεκινάει 60 δευτερόλεπτα μετά την εκκίνηση του Raspberry.
# sudo systemctl daemon-reload
# sudo systemctl enable mmdvmhost.timer
# sudo reboot
Μετά την επαννεκίνηση, το MMDVM Host θα πρέπει να ξεκινήσει μόνο του μετά από 60 δευτερόλεπτα. Για να φέρουμε στο προσκήνιο και να δούμε το log του MMDVM Host, εκτελούμε
# sudo screen -r MMDVMHost
Και για να βγούμε από το log, πατάμε Ctrl+a και μετά d.
Για να σταματήσουμε χειροκίνητα το MMDVM Host εκτελούμε
# sudo systemctl stop mmdvmhost.service
Για να το εκκινήσουμε πάλι
# sudo systemctl start mmdvmhost.service
Και για επανεκκίνησή του
# sudo systemctl restart mmdvmhost.service
Μια πρώτη δοκιμή με τους συναδέλφους SV6DBG και SV7LWW
Και η τελική μορφή
Καλή επιτυχία σε όποιον συνάδελφο κάνει το βήμα για την υλοποίηση του οδηγού. Είναι μια εμπειρία που σίγουρα θα αρέσει σε όποιον το προσπαθήσει. Σίγουρα δεν είναι απλό, θα απαιτηθούν αρκετές ώρες εργασίας, αλλά το αποτέλεσμα αξίζει καθώς θα έχουμε στα χέρια μας μια κατασκευή 100% δική μας.
73, de SV6NOB
Παραπομπές
https://www.florian-wolters.de/
https://github.com/mpue/blackboard
https://github.com/g4klx/MMDVM
https://github.com/g4klx/MMDVMCal
https://bm.pd0zry.nl/index.php/Homebrew/MMDVM
https://www.raspberrypi.org/products/raspberry-pi-3-model-b/
https://www.raspberrypi.org/blog/raspbian-jessie-is-here/
Η λίστα με τα υλικά για την πλακέτα
C2 680pF
C3 470pF
C4 470pF
C9 470pF
C8 47µF
C10 470pF
C11 470pF
C13 2.2nF
C14 470pF
C18 2.2nF
C19 4.7µF
C20 4.7µF
C22 680pF
C23 47µF
D1 green
D2 red
D3 yellow
Q1 IRL 530N
Q2 2N7000
R1 1.5k
R2 1.5k
R3 1.5k
R5 330
R6 330
R7 500k
R8 47k
R9 1M
R12 47k
R13 47k
R14 47k
R15 47k
R16 47k
R17 47k
R18 100k
R19 10k
R20 100k
R21 10k
R27 47k
R28 47k
R11 10k
R23 10k
U1 MCP6002
U2 MCP6002
U3 LF 33CV
Περι αναδημοσίευσης:
Μπορεί ελεύθερα να αναδημοσιευτεί το παρόν κείμενο ολόκληρο ή τμηματικά, με την προϋπόθεση ύπαρξης συνδέσμου "link" προς την παρούσα ιστοσελίδα και αναφέροντας την προέλευσή του.