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
Vous rencontrez des difficultés de mise en oeuvre, vous pouvez en faire part en commentaires ci-dessous.