Retour à Astuces

Un Mini HotSpot D-Star avec Afficheur

DPP_0001Je me suis lancé sur une configuration Raspberry + DVAP en y ajoutant un afficheur et des boutons poussoirs que j’ai trouvé chez Go Tronic

Le Raspberry utilise une clef wifi pour l’accès à un réseau dont voici pour l’installation:

sudo nano /etc/network/interfaces

1er Cas: si vous avez qu’1 seul réseau Wifi

remplacer:

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

par:

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-scan-ssid 1
wpa-ap-scan 1
wpa-key-mgmt WPA-PSK
wpa-proto RSN WPA
wpa-pairwise CCMP TKIP
wpa-group CCMP TKIP
wpa-ssid "My Secret SSID"
wpa-psk "My SSID PSK"

puis pour vérifier la connexion faire:

sudo ifdown wlan0
sudo ifup wlan0

2eme cas: Si vous souhaitez enregistrer plusieurs réseaux Wifi, dans ce cas, voici la procédure:

sudo nano /etc/network/interfaces

remplacer:

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

par:

allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
pre-up wpa_supplicant -Dwext -i wlan0 -c /etc/wpa_supplicant.conf -B

puis il faut créer le fichier de configuration

sudo nano /etc/wpa_supplicant.conf

Y ajouter les lignes suivantes:

ctrl_interface=/var/run/wpa_supplicant
#ap_scan=2

network={
       ssid="Nom du 1er reseau"
       scan_ssid=1
       proto=WPA RSN
       key_mgmt=WPA-PSK
       pairwise=CCMP TKIP
       group=CCMP TKIP
       psk="Mot de Passe du 1er reseau"
}

network={
       ssid="Nom du 2eme Reseau"
       scan_ssid=1
       proto=WPA RSN
       key_mgmt=WPA-PSK
       pairwise=CCMP TKIP
       group=CCMP TKIP
       psk="Mot de Passe du 2eme Reseau"
}

Pour l’installation des logiciels pour la gestion de l’afficheur:

Attention avec les derniers firmwares, vous devez activer l’I2C avec raspi-config

Menu Avanced Options
Menu I2C
Would you like the ARM I2C interface to be enabled?  => Oui
Would you like the I2C kernel module to be loaded by default?  => Oui
sudo nano /etc/modules

Ajouter si ce n’est pas présent:

i2c-bcm2708
i2c-dev

puis faire:

sudo apt-get install python-smbus
sudo apt-get install i2c-tools

sudo apt-get install git
git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git

Ces 2 dernières lignes sont peut être nécessaires pour le bon fonctionnement:

sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio

Utilisant le logiciel G4KLX pour le HotSpot, j’ai développé un petit programme en Python pour la gestion de l’afficheur.

Celui ci affiche l’état de la connexion du HotSpot et le dernier indicatif qui a appelé.
Un appui simultané sur les Boutons Poussoirs « Select » et « Right » permet de faire un halt
Un appui simultané sur les Boutons Poussoirs « Select » et « Left » permet de faire un reboot
Un appui sur le Bouton Poussoir « Up » affiche l’adresse ou les adresses IP du Raspberry
Un appui sur le Bouton Poussoir « Down » redémarre IrcddbGateway

Pour l’installation du programme:

mkdir /home/pi/votreindicatif
cd Adafruit-Raspberry-Pi-Python-Code
cd Adafruit_CharLCDPlate
cp *.* /home/pi/votreindicatif/

ensuite vous devez installer le programme HotSpot.py dans le répertoire /home/pi/votreindicatif/:

cd /home/pi/votreindicatif/
wget http://www.f4gen.fr/G4KLX/HotSpot.py

puis, il faut le rendre exécutable avec la commande:

chmod +x HotSpot.py

si vous souhaitez qu’il se lance au démarrage du Raspberry:
Editer le fichier rc.local:

sudo nano /etc/rc.local

Ajouter avant la commande Exit 0:

/home/pi/votreindicatif/HotSpot.py &

Vous pouvez bien-sur adapter le programme en fonction de votre configuration, DVAP, Modem GMSK etc…

Voici le Programme HotSpot.py:

#!/usr/bin/python

from time import sleep
from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
import os
import re
import commands

# Fonction permettant le centrage du texte sur l'afficheur
def centertxt(x):
    nb = 16-len(x)
    nb2=int(nb/2)
    nb1=nb2+(nb%2)
    espace=" "
    x=espace*nb1 + x + espace*nb2
    return x

# Initialize the LCD plate.  Should auto-detect correct I2C bus.  If not,
# pass '0' for early 256 MB Model B boards or '1' for all later versions
lcd = Adafruit_CharLCDPlate()

# Fichiers de Config
dvapnode="/home/opendv/dstarrepeater/dstarrepeater_1"
links="/var/log/opendv/Links.log"
headers="/var/log/opendv/Headers.log"

#Effacement du contenu de Headers.log
fichier = open(headers,"w")
fichier.close()

# Recherche de l'Indicatif HotSpot
chaine = "callsign="
fichier = open(dvapnode,"r")
for ligne in fichier:
    if chaine in ligne:
        index = ligne.find(chaine)+9
        indicatif=ligne[index:index+8]
fichier.close()

# Clear display and show greeting, pause 1 sec
lcd.clear()
lcd.message(" HotSpot D-Star\n    " + indicatif)
sleep(10)

# Poll buttons, display message & set backlight accordingly
#btn = ((lcd.LEFT  , 'Red Red Wine'              , lcd.RED),
#       (lcd.UP    , 'Sita sings\nthe blues'     , lcd.BLUE),
#       (lcd.DOWN  , 'I see fields\nof green'    , lcd.GREEN),
#       (lcd.RIGHT , 'Purple mountain\nmajesties', lcd.VIOLET),
#       (lcd.SELECT, ''                          , lcd.ON))

while True:

#sudo halt avec les boutons SELECT et RIGHT
        if lcd.buttonPressed(lcd.SELECT) and lcd.buttonPressed(lcd.RIGHT):
           lcd.clear()
           lcd.message("Shutdown")
           sleep(.2)
           lcd.message(".")
           sleep(.2)
           lcd.message(".")
           sleep(.2)
           lcd.message(".")
           sleep(.2)
           lcd.message("\n         Bye")
           sleep(.2)
           lcd.message(" Bye")
           sleep(.2)
           os.system("sudo halt")
           break

#sudo reboot avec les boutons SELECT et LEFT
        if lcd.buttonPressed(lcd.SELECT) and lcd.buttonPressed(lcd.LEFT):
           lcd.clear()
           lcd.message("Reboot")
           sleep(.2)
           lcd.message(".")
           sleep(.2)
           lcd.message(".")
           sleep(.2)
           lcd.message(".")
           os.system("sudo reboot")
           break

#sudo restart ircddbgateway avec le bouton DOWN
        if lcd.buttonPressed(lcd.DOWN):
           lcd.clear()
           lcd.message("Restarting\nIrcddbgateway")
           sleep(.2)
           lcd.message(".")
           sleep(.2)
           lcd.message(".")
           sleep(.2)
           lcd.message(".")
           os.system("sudo /etc/init.d/ircddbgateway restart")

#recherche connexion reflecteur
        chaine1 = "Refl: "
        chaine2 = "Remote: "
        reflecteur=""
        fichier = open(links,"r")
        for ligne in fichier:
            if chaine1 in ligne:
               index = ligne.find(chaine1)+6
               reflecteur=ligne[index:index+8]
            if chaine2 in ligne:
               index = ligne.find(chaine2)+8
               reflecteur=ligne[index:index+8]

        fichier.close()
        LCDligne1=centertxt("Unlinked")
        if reflecteur:         
           protocol=ligne[21:24]
           if protocol=="DEx":
              LCDligne1="DExtra: "
           elif protocol=="DCS":
              LCDligne1="DCS: "
           elif protocol=="DPl":
              LCDligne1="DPlus: "             
           elif protocol=="CCS":
              LCDligne1="CCS: "
           LCDligne1 += reflecteur.strip()    
           LCDligne1 = centertxt(LCDligne1)       

#recherche indicatif du dernier appelant
        indicatif=""
        if os.path.getsize(headers):
           fichier = open(headers,"r")
           lignes = fichier.readlines()
           fichier.close()
           last_ligne = lignes[-1].rstrip("\n\r")
           index = last_ligne.find("My: ")+4
           indicatif=last_ligne[index:index+13]
        LCDligne2="                "
        if indicatif:
           LCDligne2=centertxt(indicatif)

# Affichage des adresses IP
        if lcd.buttonPressed(lcd.UP):
           adresseip1="no network"
           adresseip2=""
           found_ips = []
           ips = re.findall( r'r:[0-9]+(?:\.[0-9]+){3}', commands.getoutput("/sbin/ifconfig"))
           for ip in ips:
               if ip.startswith("r:255") or ip.startswith("r:127") or ip.endswith("255"):
                  continue
               found_ips.append(ip)
           if len(found_ips)>0:
              adresseip1=found_ips[0][2:]
           if len(found_ips)>1:
              adresseip2=found_ips[1][2:]
           LCDligne1=centertxt(adresseip1)
           LCDligne2=centertxt(adresseip2)

# Affichage 
        lcd.home()
        lcd.message(LCDligne1 + "\n" + LCDligne2)

#Pause
        sleep(.5)