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.
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