F5UII – Station radioamateur française

Installation d’un écran OLED sur un relais MMDVM

Après l’article consacré à la configuration et installation d’un écran Nextion sur un relais MMDVM , voyons ensemble à présent comment se réalise l’intégration d’un petit afficheur OLED sur MMDVM.

Ce type d’afficheur est connu sous la référence SSD1306, il mesure 27 millimètres pour une définition de 128 x 64. Il existe deux variantes de l’écran SSD1306, une fonctionnant sur bus SPI et l’autre en I2C. J’ai choisi le modèle à bus I2C, reconnaissable à ces pins SCA et SCL. Il est monochrome mais existe également en une version bicolore jaune et bleu. Seul les lignes du haut de l’afficheur sont jaunes. C’est ce modèle que j’utilise.

Ecran OLED SSD1306

Prérequis logiciel

Vous êtes connecté au Raspberry Pi.

Tout d’abord, nos allons valider les bus SPI et I2C du Raspberry Pi, grâce au menu de configuration.

sudo raspi-config

 

Nous installons à présent les packages logiciels pour gérer ces bus.

sudo apt-get install build-essential git-core libi2c-dev i2c-tools lm-sensors

Pour que les modules démarrent nous devons les voir apparaitre dans le fichier modules

sudo nano /etc/modules

Vous devez avoir ces deux lignes

i2c-dev
spidev

(Sortir avec Ctrl-X et Yes pour sauvegarder)

Nous redémarrons le Raspberry Pi

sudo reboot

Après reconnexion, nous devons trouver les ports i2c et spi

ls /dev/i2c*
ls /dev/spi*

Raccordement de l’écran

L’écran SSD1306 est une version avec bus I2C. Le raccordement se réalise comme indiqué ci-dessous.

Test de détection

Nous allons vérifier que le câblage est correct et que l’écran est bien détecté sur le bus I2C.

Lancer la commande suivante.

i2cdetect -y 1

 

Un équipement 3c apparait. Il s’agit bien de l’écran SSD1306.

Installation de la bibliothèque de communication de l’écran OLED

Si vous n’auriez pas installé git sur votre Raspberry Pi, je vous propose de lancer cette commande.

sudo apt-get install git

Télécharger à présent la bibliothèque ArduiPi_OLED (directement sur github).

git clone https://github.com/hallard/ArduiPi_OLED

puis lancer la compilation du logiciel

cd ArduiPi_OLED
sudo make

Recompilation de MMDVMHost

Mettons à jour MMDVMHost avec ces quelques instructions. La compilation prendra plusieurs minutes.

cd /opt/MMDVMHost/
make clean
sudo make -f Makefile.Pi.OLED
pi@raspberrypi:/opt/MMDVMHost $ sudo make clean
rm -f MMDVMHost *.o *.d *.bak *~ GitVersion.h
pi@raspberrypi:/opt/MMDVMHost $ sudo make -f Makefile.Pi.OLED
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

Mise à jour du fichier de configuration MMDVMHost

Nous voilà à la dernière étape. Précisons à présent dans la section [General] du fichier MMDVM.ini que nous avons installé un écran OLED

sudo nano /opt/MMDVMHost/MMDVM.ini
[General]
Callsign=F5ZKS
Timeout=600
Duplex=1
# ModeHang=10
RFModeHang=10
NetModeHang=3
#Display=Nextion
Display=OLED
#Display=None
Daemon=0

Il fait référence à la section OLED que nous n’avons pas à modifier

[OLED]
Type=3
Brightness=0
Invert=0

Procédons finalement au redémarrer du Raspberry Pi

sudo reboot

Résultat

L’afficheur SSD1306 s’allume. Il est en attente de trafic

Ecran SSD1306 I2C raccordé sur Raspberry Pi, et piloté par MMDVMHost

Sur le groupe de discussion TG2, WA4BPS est affiché, il est retransmis sur le Time Slot 2 en DMR

 

Vous rencontrez des difficultés de mise en oeuvre, vous pouvez en faire part en commentaires ci-dessous.