Bron: F5UII
After the article on the configuration and installation of a Nextion screen on a MMDVM repeater, let’s see together how to integrate a small OLED display on MMDVM.
This type of display is known by the reference SSD1306, it measures 27 millimeters for a display definition of 128 x 64. There are two variants of the SSD1306 display, one running on SPI bus and the other on I2C. I chose the I2C bus model, recognizable by these SCA and SCL pins. It is monochrome but also exists in a yellow and blue two-color version. Only the lines on the top of the display are yellow. This is the model I use.
OLED SSD1306 display
Software prerequisites
You are connected to Raspberry Pi.
First of all, we will validate the SPI and I2C buses of the Raspberry Pi, thanks to the configuration menu.
|
1
|
sudo raspi–config
|
We now install software packages to manage these buses.
|
1
|
sudo apt–get install build–essential git–core libi2c–dev i2c–tools lm–sensors
|
In order for the modules to start we must indicated them in the modules file
|
1
|
sudo nano /etc/modules
|
You must have these two lines
|
1
2
|
i2c–dev
spidev
|

(Exit with Ctrl-X and Yes to save)
We restart the Raspberry Pi
|
1
|
sudo reboot
|
After reconnecting, we must find the ports i2c and spi
|
1
|
ls /dev/i2c*
|
|
1
|
ls /dev/spi*
|

Connecting the Display
The SSD1306 is an I2C bus version. The connection is made as shown below.
Detection Test
We will check that the wiring is correct and that the screen is detected on the I2C bus.
Start the following command.
|
1
|
i2cdetect –y 1
|

Equipment 3c appears. This is the SSD1306 screen.
Installing the OLED Display Communication Library
If you did not install git on your Raspberry Pi, I suggest you run this command.
|
1
|
sudo apt–get install git
|
Download now the ArduiPi_OLED library (directly on github).
|
1
|
git clone https://github.com/hallard/ArduiPi_OLED
|
then run the software compilation
|
1
2
|
cd ArduiPi_OLED
sudo make
|

Recompiling MMDVMHost
Let’s update MMDVMHost with these few instructions. The compilation will take several minutes.
|
1
2
3
|
cd /opt/MMDVMHost/
make clean
sudo make –f Makefile.Pi.OLED
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
pi@raspberrypi:/opt/MMDVMHost $ <strong>sudo make clean</strong>
rm –f MMDVMHost *.o *.d *.bak *~ GitVersion.h
pi@raspberrypi:/opt/MMDVMHost $ <strong>sudo make –f Makefile.Pi.OLED</strong>
echo “const char *gitversion = \”24358357e890a928f0053bcedd748123d7a6b9c2\”;” > GitVersion.h
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o AMBEFEC.o AMBEFEC.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o BCH.o BCH.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o BPTC19696.o BPTC19696.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Conf.o Conf.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o CRC.o CRC.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Display.o Display.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRControl.o DMRControl.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRCSBK.o DMRCSBK.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRData.o DMRData.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRDataHeader.o DMRDataHeader.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMREMB.o DMREMB.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMREmbeddedData.o DMREmbeddedData.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRFullLC.o DMRFullLC.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRLookup.o DMRLookup.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRLC.o DMRLC.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRNetwork.o DMRNetwork.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRShortLC.o DMRShortLC.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRSlot.o DMRSlot.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRSlotType.o DMRSlotType.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRAccessControl.o DMRAccessControl.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DMRTrellis.o DMRTrellis.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DStarControl.o DStarControl.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DStarHeader.o DStarHeader.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DStarNetwork.o DStarNetwork.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o DStarSlowData.o DStarSlowData.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Golay2087.o Golay2087.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Golay24128.o Golay24128.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Hamming.o Hamming.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o OLED.o OLED.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o LCDproc.o LCDproc.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Log.o Log.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o MMDVMHost.o MMDVMHost.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Modem.o Modem.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o ModemSerialPort.o ModemSerialPort.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Mutex.o Mutex.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Nextion.o Nextion.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o NullDisplay.o NullDisplay.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o P25Audio.o P25Audio.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o P25Control.o P25Control.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o P25Data.o P25Data.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o P25LowSpeedData.o P25LowSpeedData.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o P25Network.o P25Network.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o P25NID.o P25NID.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o P25Utils.o P25Utils.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o QR1676.o QR1676.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o RS129.o RS129.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o RS241213.o RS241213.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o RSSIInterpolator.o RSSIInterpolator.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o SerialController.o SerialController.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o SerialPort.o SerialPort.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o SHA256.o SHA256.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o StopWatch.o StopWatch.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Sync.o Sync.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o TFTSerial.o TFTSerial.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Thread.o Thread.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Timer.o Timer.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o UDPSocket.o UDPSocket.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o UMP.o UMP.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o Utils.o Utils.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o YSFControl.o YSFControl.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o YSFConvolution.o YSFConvolution.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o YSFFICH.o YSFFICH.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o YSFNetwork.o YSFNetwork.cpp
g++ –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –c –o YSFPayload.o YSFPayload.cpp
g++ AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o OLED.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o –g –O3 –Wall –std=c++0x –pthread –DOLED –I/usr/local/include –lArduiPi_OLED –lpthread –o MMDVMHost
pi@raspberrypi:/opt/MMDVMHost $ sudo reboot
|
Updating the MMDVMHost Configuration File
Here is the final step. Now, in the [General] section of the MMDVM.ini file, we have installed an OLED screen
|
1
|
sudo nano /opt/MMDVMHost/MMDVM.ini
|
|
1
2
3
4
5
6
7
8
9
10
11
|
[General]
Callsign=F5ZKS
Timeout=600
Duplex=1
# ModeHang=10
RFModeHang=10
NetModeHang=3
#Display=Nextion
Display=<strong>OLED</strong>
#Display=None
Daemon=0
|
It refers to the OLED section that we do not have to change
|
1
2
3
4
|
[OLED]
Type=3
Brightness=0
Invert=0
|
Finally, we need to restart the Raspberry Pi
|
1
|
sudo reboot
|
Result
The display SSD1306 lights up. It is waiting for traffic




Het moet ons van ’t hart: De implementatie van de Yaesu System Fusion technologie gaat niet zonder slag of stoot. Al sinds de eerste testen in 2016 liepen we tegen een flinke hoeveelheid problemen aan die zowel hard- als software gerelateerd waren. Aan de hardwarezijde bleken eindversterkers snel defect te raken door een gebrekkige PCB koeling van onze DR-1X repeaters. Dit hebben we in eigen beheer
Niets bleek minder waar helaas: om ons onbekende redenen begon PI1NOS verschijnselen te vertonen die we niet goed konden verklaren en steeds vaker bleken voor te komen. De repeater werd namelijk zonder aanwijsbare reden uit de “Hobbyscoop Room” gedisconnect en was daarmee grote dagdelen zwevend, zonder verbinding naar de andere deelsystemen en gebruikers. Dit kon weliswaar door gebruikers weer aangekoppeld worden maar het is wel een groot obstakel gebleken in het logische gebruik van de repeater. Nog vreemder: PI1AMS met identieke setup en instellingen vertoonde dit probleem niet. Dat was zoeken naar een speld in een hooiberg.
De oplossing werd bekend: De introductie van de portofoon Yaesu FT-70D zorgde ervoor dat een eerste portofoon beschikbaar was die al functies van Yaesu System Fusion 2 ondersteunt. Onze lopende Wires-X software 1.12 ondersteunde dit echter niet. Gebleken is dat telkens bij het in de lucht komen van een FT-70D (en daar zijn er al de nodige van gesignaleerd op PI1NOS) de repeater uit de room werd ‘gemeden’ vanwege de incompatibiliteit. Yaesu geeft zelf aan dat de nieuwe Wires-X software V1.22 de gerezen problemen ondervangt doordat hier al de nodige Fusion 2 functies zijn geimplementeerd (al is ons niet exact duidelijk welke, mogelijk beperkt dit zich tot de protocolstack en niet tot extra functies). Het belabberde was echter dat V1.22 weer een nieuw probleem naar boven bracht: De Wires-X bediening van PI1NOS via de gebruikerstransceivers werkte niet meer!
