août 10

CM4 PI NAS nvme

But faire un NAS  :
Partie matérielle : avec la carte Raspberry Pi Compute Module 4 IO Board , une carte CM4 , une carte extension Pci-e vers 4xpci-e , et quattre disque nvme de 1To ( avec adaptateur nvme / Pci-e )

Partie Logicielle : surement avec openmediavault , ou autre pas encode décidé /

 

carte Raspberry Pi Compute Module 4 IO Board
La carte d’extension PCI-e vers 4 x PCI-e
4 Disque nvme de 1To , avec Radiateur et Adaptateur nvme/PCI-e
Impression 3D support pour les disques
Montage des disques avec la carte extension PCI-e
pour le test ( et si j’intègre l’alimentation dans le boitier )
Dans la version finale les disque seront  en position Horizontale , et le bloc d’aliemtation sera un bloc externe de 12v.

 

Catégorie : Non classé | Commentaires fermés sur CM4 PI NAS nvme
janvier 4

Plateforme Dev avec Pi4 8Go – SSD 500 Go dual screen ( 15.6″ ou 17.3″ )

But :

Faire une plateforme de dev ( Electronique , arduino , esp8266 ) a partir d’un raspberry pi 4 , disque SSD et double écran .plutôt que dédier un PC portable
le boitier du 1er écran  contiendras :
– un raspberry PI 4 8Go

– un SSD de 500 Go

– un module Buck down permettant de générer le 5V pour le Pi , Le SSD , les Hub USB

– un module buck down permettant de générer le 12V pour les 2 cartes controleur HDMI

– 2 cartes contrôleur HDMI / lvds pour gérer les 2 écrans

– 2 Hub USB 4 ports , un USB3.0 et un USB 2.0

– les 2 écrans ( qui sont des dalles de récuperation sur des pc portables HS ) seront relies ensemble avec une charnière qui permettra au 2eme écran de se se replier sur le 1er écran.

– le bloc d’alimentation sera externe ( pareil bloc de récupération d’un portable HS 19v 5A

– un clavier / souris Raspberry Pi

Préparation Logicielle :

    • modification de la sequence de boot sur le raspberry pi 4
    • création de l‘image Debian 64 bits depuis un poste linux (*****)
      scripts a modifier pour les dernières versions du bootloader ( raspberrypi-bootloader_1.20200723-1_arm64.deb au 2020/08/04 )  et du kernel ( bcm2711-kernel-5.4.51.20200728.tar.xz au 2020/08/04 ) ,
      dans stage2.sh modifier l’utilisateur debian par votre nom d’utilisateur dans mon cas : thierryadduser thierry
      usermod -aG sudo,video,audio,cdrom thierry
      pour l’instant ne pas activer l’option deskop (dans stage2.sh)
      • avant de démonter l’image fichiers a modifier :
        fichier /boot/config.txt:
        enable_uart=1
        dtparam=audio=on
        start_x=1
        gpu_mem=128
        [pi4]
        dtoverlay=vc4-fkms-v3d
        max_framebuffers=2
        arm_64bit=1
        # differentiate from Pi3 64-bit kernels
        kernel=kernel8-p4.imgfichier /boot/cmdline.txt :
        dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline rootwait usb-storage.quirks=13fdc:3960:u ipv6.disable=1
        j’avais des pb avec l’adaptateur USB3/SATA , j’ai du rajouter usb-storage.quirks=13fdc:3960:u  dans le cmdline.txtfichier /etc/fstab :
        proc /proc proc defaults 0 0
        /dev/sda1 /boot vfat defaults 0 2
        /dev/sda2 / ext4 defaults,noatime 0 1
    • transfert de l’image sur le SDD ( ici mon sdd est /dev/sdg a adapter selon votre config) :
      sudo dd if=debian-rpi64.img of=/dev/sdg bs=1024k status=progress
    • brancher le SSD sur le Pi4 avec pour l’instant un moniteur hdmi / clavier / souris
    • si le Boot fonctionne on peux continuer sinon on recommence depuis le début .
    • on vas maintenant installer l’interface graphique ( une seule ):
      apt install task-xfce-desktop -y # For XFCE
      apt install task-gnome-desktop -y # For GNOME
      apt install task-kde-desktop-y # For KDE Plasma
      apt install task-mate-desktop -y # For MATE  <== celle que j’ai choisi
      apt install task-lxde-desktop -y # For LXDE
      apt install task-lxqt-desktop -y # For LXQT
    • et on reboote le système , normalement l’interface graphique se lance .
    • encore quelques petites configurations ajout de logiciels
      on lance un terminal :
      sudo apt-get install devscripts build-essential lintian git
      sudo mkdir /opt/Softs
      sudo chown -R thierry: /opt/Softs
      cd /opt/Softs
    • on vas récupérer sur https://github.com/RPi-Distro ce que l’on vas avoir besoin ; raspberrypi-sys-mods , raspi-config ,pi-bluetooth
      git clone https://github.com/RPi-Distro/raspberrypi-sys-mods.git
      git clone https://github.com/RPi-Distro/raspi-config.git
      git clone https://github.com/RPi-Distro/pi-bluetooth.git
    • on compile :
      cd pi-bluetooth
      debuild -us -uc
      cd ..
      cd raspi-config
      debuild -us -uc
      cd ..
      cd raspberrypi-sys-mods
      debuild -us -uc
      cd ..
    • on verifie que tout est compilé : ls -al *.deb
      pi-bluetooth_0.1.13_all.deb raspberrypi-sys-mods_20200729_arm64.deb raspi-config_20200727_all.deb
    • on installe : sudo dpkg -i *.deb
      si on as un message d’erreur de dépendance on lance sudo apt -f install , et tout devrais s’installer correctement
    • on installe la partie bluetooth :
      sudo apt-get install bluetooth bluez blueman

La partie logicielle est pratiquement  terminé , reste encore a installer kicad , arduino , codium et tous les gadgets nécessaire

Partie Matérielle

  • un clavier / Souris Officiel Raspberry Pi
  • Un raspberry Pi 4 8 Go
  • Un SSD 500Go + adaptateur USB/SATA
  • un hub USB 2.0 4 ports
  • un hub USB 3.0 4 ports
  • 2 modules alim Buck down
  • 2 dalles écrans 17″ de recupérations (modele LP173WD1 )
  • 2 cartes contrôleurs HDMI
  • 2 câbles HDMI / micro HDMI

 

***** => il existe maintenant une image 64bit de raspberry pi OS , https://downloads.raspberrypi.org/ raspios_arm64 ( version complète avec bureau ) et raspios_lite_arm64

 

 

Catégorie : Uncategorized | Commentaires fermés sur Plateforme Dev avec Pi4 8Go – SSD 500 Go dual screen ( 15.6″ ou 17.3″ )
mars 23

RadioPi

But: transformer un vieux poste radio a lampes HS des années 60/70 récupéré en vide grenier en poste mp3 avec un raspberry Pi.

Au niveau Matériel :
– un vieux poste radio a lampes HS des années 60/70
– un Raspberry Pi
– un ampli 2.1 20W
– 3 HP 5W
– un Afficheur 128×128 pixels
– deux encodeurs rotatifs
– un disque dur SSD avec adaptateur USB
– horloge RTC en I2C
– bande de led RGB
– deux alimentations 220v/5V  ( une pour la partie Audio , l’autre pour la partie « numérique » 5A) et conneteur alimentation et interrupteur M/A
– un ventilateur 5V avec grille
– un disque dur SSD ( dans mon cas un 120Go)

ou trouvez les divers éléments :
1 x Raspberry Pi
2 x 3-inch-Full-Range-Speaker-4ohm-5W
1 x 4-Pouces Haut-Parleur-4-Ohm-15-W graves
1x Ampli 2.1 20W 5V
2 x Encodeur rotatif
1 x Horloge I2C 
2 x alimentation 220v -5v 3A
2 x câble USB
1 x câble réseau
1 x ventilateur 5v+1 x grille 60mm
1 x interrupteur + 1 x connecteur alimentation

 

Au niveau logiciel :
– Raspbian lite dernière version
– daemon mpd
– python3
– scripts divers ( gestion des encodeurs rotatif en émulation clavier UP,DOWN,LEFT,RIGHT,ENTER,PLAUY/PAUSE).

 

Photos de la transformation :

bon j’avoue en étant électronicien / informaticien , je déteste la partie « mécanique » ( boitier et autre ) , c’est donc mon beau-frère qui s’occupe de cette partie en plus ayant son Fablab perso il a tous les outils nécessaire

pour remplacer la lampe de « l’Œil magique » un afficheur 1.44” SPI  de 128×128 pixels qui permettra d’afficher divers menu et aussi la pochette de la piste en cours a base de st7735 / ili9163

 

câblage des GPIO ( provisoire)

Name Usage Board Usage Name
3.3V RTC.VCC 01 | | 02 LED.VCC 5V
GPIO02 RTC.SDA 03 | | 04 LCD.VCC 5V
GPIO03 RTC.SCL 05 | | 06 GND
GPIO04 07 | | 08 U_TXD GPIO14
GND RTC.GND 09 | | 10 U_RXD GPIO15
GPIO17 ENC1.B 11 | | 12 SPI1_CE0 GPIO18
GPIO27 ENC1.A 13 | | 14 LCD.GND GND
GPIO22 ENC1.SW 15 | | 16 LCD.LED GPIO23
3.3V 17 | | 18 LCD.A0 GPIO24
GPIO10 LCD.SDA 19 | | 20 GND
GPIO09 21 | | 22 LCD.RST GPIO25
GPIO11 LCD.SCK 23 | | 24 LCD.CS GPIO08
GND ENC1.GND 25 | | 26 GPIO07
ID_SD0 * 27 | | 28 * ID_SC1
GPIO05 ENC2.A 29 | | 30 FAN.GND GND
GPIO06 ENC2.B 31 | | 32 FAN.PWM GPIO12
GPIO13 ENC2.SW 33 | | 34 LED.GND GND
GPIO19 SPI1_MISO 35 | | 36 GPIO16
GPIO26 37 | | 38 LED.DI GPIO20
GND ENC2.GND 39 | | 40 SPI1_SCLK GPIO21

installation logicielle , j’ai décidé de me passer de carte SD sur le Raspberry et booter directement sur le SSD ( voir  article frambroise 314 )

j’ai fait 3 partions sur le hdd (/dev/sda1 vfat 100M , /dev/sda2 ext4 8Go , /dev/sda3  ext4 le reste du disque pour stockage des fichiers audios )
mon /etc/fstab

proc            /proc           proc    defaults          0       0
PARTUUID=0c9f0562-01  /boot           vfat    defaults          0       2
PARTUUID=0c9f0562-02  /               ext4    defaults,noatime  0       1
PARTUUID=0c9f0562-03  /var/lib/mpd    ext4    defaults,noatime  0       1

une fois raspbian lite installé et le raspberry pi en route on commence a installer les paquets nécessaire :

sudo apt install python3-pygame python-pygame python-spidev python3-spidev
sudo apt install mpd python-pip python3-pip
sudo apt install evtest telnet samba lame flac faad vorbis-tools 
sudo apt install mc alsa-utils libmpdclient-dev cython

pip install python-uinput
pip install python-mpd2
pip3 install python-mpd2

fichier a créer / modifier

  • /etc/modprobe.d/fbtft.conf
options fbtft_device name=fb_ili9163 gpios=reset:25,dc:24,led:23 speed=40000000 rotate=90 bgr=1 custom=1 fps=60
  • /etc/modules-load.d/fbtft.conf
spi-bcm2835
fbtft_device
  • /etc/modules-load.d/RotaryKey.conf
uinput

logiciels a installer /compiler , je met tous dans /opt/scripts

cd /opt
mkdir scripts
cd /opt/scripts
  • Automatic library-wide shuffle for mpd ( gestion playlist aléatoire )
git clone https://github.com/joshkunz/ashuffle.git
cd ashuffle/
make
sudo make install
  • mpd Album Art
git clone https://github.com/jameh/mpd-album-art.git
cd mpd-album-art
sudo python3 setup.py install
  • gestion du clavier virtuel depuis les 2 encodeurs rotatifs
    • /opt/scripts/RadioKey.py ( script pour gerer le « clavier ») pour l’instant un seul encodeur géré UP,DOWN,ENTER
      #!/usr/bin/env python
      import RPi.GPIO as GPIO
      import uinput
      from time import sleep
      
      # version PCB
      pin_a1 = 37 #GPIO  13
      pin_b1 = 35 #GPIO  19
      pin_sw1= 33 #GPIO  26
      pin_a2 = 36 #GPIO  16
      pin_b2 = 38 #GPIO  20
      pin_sw2= 40 #GPIO  21
      
      GPIO.setmode(GPIO.BOARD)
      GPIO.setup(pin_a1,  GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_b1,  GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_sw1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_a2,  GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_b2,  GPIO.IN, pull_up_down=GPIO.PUD_UP)
      GPIO.setup(pin_sw2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
      
      device = uinput.Device([uinput.KEY_UP, uinput.KEY_DOWN,uinput.KEY_ENTER,uinput.KEY_PLAYPAUSE,uinput.KEY_LEFT,uinput.KEY_RIGHT])
      seq_a1 = seq_b1 = seq_sw1=0
      seq_a2 = seq_b2 = seq_sw2=0
      
      def on_Sw(pin):
          sw = GPIO.input(pin_sw2)
          if sw == 0:
              device.emit_click(uinput.KEY_ENTER)
          sw = GPIO.input(pin_sw1)
          if sw == 0:
              device.emit_click(uinput.KEY_PLAYPAUSE)
      
      def on_edge1(pin):
          global seq_a1, seq_b1
          a1 = GPIO.input(pin_a1)
          b1 = GPIO.input(pin_b1)
          seq_a1 = ((seq_a1 << 1) | a1) & 0b1111
          seq_b1 = ((seq_b1 << 1) | b1) & 0b1111
          if seq_a1 == 0b0011 and seq_b1 == 0b1001:
              device.emit_click(uinput.KEY_UP)
          elif seq_a1 == 0b1001 and seq_b1 == 0b0011:
              device.emit_click(uinput.KEY_DOWN)
      
      def on_edge2(pin):
          global seq_a2, seq_b2
          a2 = GPIO.input(pin_a2)
          b2 = GPIO.input(pin_b2)
          seq_a2 = ((seq_a2 << 1) | a2) & 0b1111
          seq_b2 = ((seq_b2 << 1) | b2) & 0b1111
          if seq_a2 == 0b0011 and seq_b2 == 0b1001:
              device.emit_click(uinput.KEY_LEFT)
          elif seq_a2 == 0b1001 and seq_b2 == 0b0011:
              device.emit_click(uinput.KEY_RIGHT)
      
      GPIO.add_event_detect(pin_a1,  GPIO.BOTH, callback=on_edge1)
      GPIO.add_event_detect(pin_b1,  GPIO.BOTH, callback=on_edge1)
      GPIO.add_event_detect(pin_a2,  GPIO.BOTH, callback=on_edge2)
      GPIO.add_event_detect(pin_b2,  GPIO.BOTH, callback=on_edge2)
      GPIO.add_event_detect(pin_sw1, GPIO.BOTH, callback=on_Sw)
      GPIO.add_event_detect(pin_sw2, GPIO.BOTH, callback=on_Sw)
      
      try:
          while True:
              sleep(300)
      except KeyboardInterrupt:
          GPIO.cleanup()
      

       

    • Service RadioKey ( deamon clavier ) : /etc/systemd/system/RadioKey.service
      [Unit]
      Description=Python start + foreground + keyboard input.
      Requires=multi-user.target
      After=multi-user.target rc-local.service
      AllowIsolate=yes
      
      [Service]
      Type=simple
      ExecStart=/usr/bin/python /opt/scripts/RadioKey.py
      
      [Install]
      WantedBy=multi-user.target
    • activation du service
      systemctl daemon-reload
      service RadioKey start
      
    • test du clavier virtuel
  • script au démarrage qui affiche l’IP du pi sur l’afficheur 128×128 ( /opt/scripts/ip.py) pendant 10 secondes
    #!/usr/bin/env python
    import os
    import sys
    import time
    import pygame
    import socket
    
    def get_ip_address():
     ip_address = '';
     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     try:
         s.connect(("8.8.8.8",80))
         ip_address = s.getsockname()[0]
         s.close()
         return ip_address
     except socket.error, msg:
         return "0.0.0.0"
    os.environ["SDL_FBDEV"] = "/dev/fb1"
    os.environ['SDL_VIDEODRIVER']="fbcon"
    mapMask= pygame.image.load("/home/pi/mask.png")
    
    def displaytext(text,size,line,color,clearscreen):
        if clearscreen:
            screen.fill((255,0,0))
    
        font = pygame.font.Font(None,size)
        text = font.render(text,0,color)
        rotated = pygame.transform.rotate(text,0)
        textpos = rotated.get_rect()
        textpos.centerx = 64
        textpos.centery = 64
        screen.blit(rotated,textpos)
    
    def main():
        global screen
        pygame.init()
        pygame.mouse.set_visible(0)
        size = width,height = 128,128
        screen = pygame.display.set_mode(size)
        str=get_ip_address() 
        displaytext( str,26,1,(255,255,255),True)
        screen.blit(mapMask, (0,0))
        pygame.display.flip()
        time.sleep(10)
        pygame.quit()
        exit()
    if __name__ == '__main__':
        main()
    
  • interface web pour playlist (https://www.ympd.org/ )
    cd /opt/scripts
    wget https://www.ympd.org/downloads/ympd-1.2.3-armhf.tar.bz2
    tar -xvf ympd-1.2.3-armhf.tar.bz2
    sudo ./ympd --webport 80
  • partage dossier réseau ( /etc/samba/smb.conf )
    #======================= Global Settings =======================
    [global]
       workgroup = WORKGROUP
       dns proxy = no
       log file = /var/log/samba/log.%m
       max log size = 1000
       syslog = 0
       panic action = /usr/share/samba/panic-action %d
       server role = standalone server
       passdb backend = tdbsam
       obey pam restrictions = yes
       unix password sync = yes
       passwd program = /usr/bin/passwd %u
       passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
       pam password change = yes
       map to guest = bad user
       usershare allow guests = yes
    
    #======================= Share Definitions =======================
    [home]
       browseable = yes
       create mask = 0700
       directory mask = 0700
       guest ok = yes
       path = /home/pi
       force user =  pi
       force group = pi
       read only = No
    
    [scripts]
       browseable = yes
       create mask = 0700
       directory mask = 0700
       guest ok = yes
       path = /opt/scripts
       force user =  pi
       force group = pi
       read only = No
    
    [Media]
       browseable = yes
       create mask = 0700
       directory mask = 0700
       guest ok = yes
       path = /var/lib/mpd/
       force user =  mpd
       force group = audio
       read only = No
    
    

     

  • gestion de led RGB ws2812 , pour cela on va activer le 2eme port SPI ( raspberry pi 3
    dans /boot/config.txt ajouter/modifier

    spidev.bufsiz=32768
    dtoverlay=spi1-1cs
    

    ensuite on vas ajouter py-spidev et  ws2812-spi

    sudo apt install python-spidev python3-spidev
    
    cd /opt/scripts
    git clone https://github.com/doceme/py-spidev.git
    cd py-spidev
    make
    make install
    
    cd /opt/scripts
    git clone https://github.com/joosteto/ws2812-spi.git
    cd ws2812-spi
    

    en fonction du Pi utilisé il faut modifier le fichier ws2812.py , dans def write2812_numpy4(spi,data): commenter toutes les lignes spi.xfer  et de-commenter celle ci : spi.xfer(tx.tolist(), int(4/.55e-6))
    ensuite

    sudo python setup.py install

    on vas tester le bandeau :

    cd /opt/scripts
    nano loop.py

    dans mon cas il y auras 20 led RGB ws2812 donc :

    import spidev
    import ws2812
    import time
    import getopt
    
    def test_loop(spi, nLED=8, intensity=20):
        stepTime=0.1
        iStep=0
        while True:
            d=[[0,0,0]]*nLED
            d[iStep%nLED]=[intensity]*3
            ws2812.write2812(spi, d)
            iStep=(iStep+1)%nLED
            time.sleep(stepTime)
    
    if __name__=="__main__":
        spi = spidev.SpiDev()
        spi.open(1,0)
    
        test_loop(spi, nLED=20)
    

    puis python loop.py

  • (en cours de dev …….)  gestion du bandeau lumineux en fonction de la musique ( basé sur https://github.com/nvbn/soundlights)
    cd /opt/scripts
    git clone https://github.com/nvbn/soundlights.git
    ./autogen.sh
    ./configure
    make
    sudo make install
    création du fichier de config : nano /opt/scripts/config.led :
    [general]
    mode = normal
    framerate = 60
    bars = 20
    
    [input]
    method = fifo
    source = /tmp/mpd.fifo
    
    [output]
    method =raw
    channels = stereo
    bit_format = 8bit
    
    [eq]
    1=2
    2=2
    3=1
    4=1
    5=0.5
    

    fichier /opt/scripts/soundlights.py

    import sys
    import time
    import spidev
    import ws2812
    
    COLORS_COUNT = 255
    nLED=20
    spi = spidev.SpiDev() 
    spi.open(1,0)
    d=[(0,0,0)]*nLED
    ws2812.write2812(spi, d)
    
    def _get_spaced_colors(n):
        max_value = 4144959
        interval = int(max_value / n)
        colors = [hex(i)[2:].zfill(6) for i in range(0, max_value, interval)]
        return [ (int(i[:2], 16), int(i[2:4], 16), int(i[4:], 16)) for i in colors]
    
    def _handle_stdin(colors,d):
        while True:
            try:
                ws2812.write2812(spi, colors)
            except Exception as e:
                print e
    
    if __name__ == '__main__':
        _handle_stdin(_get_spaced_colors(COLORS_COUNT),d)
    

    puis on teste en lançant :

    cava -p config.led | python soundlights.py

     

  • version alpha partie affichage covertArt piste en cours et passer piste suivante/précédente
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    import pygame
    import math
    import os
    import time
    import sys
    import mpd_album_art
    from mpd import (MPDClient, CommandError)
    
    # ecran TFT en /dev/fb1
    os.putenv("SDL_VIDEODRIVER", "fbcon")
    os.environ["SDL_FBDEV"] = "/dev/fb1"
    
    # pour daemon mpd
    HOST = 'localhost'
    PORT = '6600'
    CON_ID = {'host':HOST, 'port':PORT}
    def mpdConnect(client, con_id):
        try:
            client.connect(**con_id)
        except:
            return False
        return True
    
    #maj covertArt
    def update_folder(client,pygame,window):
        status = client.status()
        now_playing = client.currentsong()
        print ('file    : ' + now_playing.get('file'))
    # chercher coverart et lien vers "/home/pi/.covers/current"
        grabber = mpd_album_art.Grabber(
            save_dir="/home/pi/.covers", 
            library_dir="/var/lib/mpd/music"
            )
        grabber.get_local_art(now_playing)
    # maj affichage
        mapImg = pygame.image.load("/home/pi/.covers/current")
        mapImg = pygame.transform.scale(mapImg, (128, 128))
        mapMask= pygame.image.load("/home/pi/mask.png") # masque pour faire la forme de "l’œil magique"
        window.blit(mapImg, (0,0)) #<<will not blit
        window.blit(mapMask, (0,0))
        pygame.display.update() # solution: you forgot this...
    
    def main():
    # on se connecte au daemon mpd
        client = MPDClient()
        if mpdConnect(client, CON_ID):
            print('Got connected!')
        else:
            print('fail to connect MPD server.')
            sys.exit(1)
        elapsed=0.00
    # init pygame /  afficheur
        pygame.display.init()
        pygame.mouse.set_visible(0)
        window = pygame.display.set_mode((128, 128))
        pygame.event.clear()
        window.fill((0,0,0))
    # affiche coverArt piste en cours
        update_folder(client,pygame,window)
        while True:
            status = client.status()
    #  test si temp_lecture < temp_lecture precedent pour detecter nouvelle piste
            if (elapsed < float(status.get('elapsed', 0))): # non , meme piste rien a faire
                elapsed=float(status.get('elapsed', 0))
            else:                                           # oui , nouvelle piste raz temp_lecture et maj covertArt
                elapsed=float(status.get('elapsed', 0))
    #            print ( status.get('elapsed', 0))
                now_playing = client.currentsong()
                update_folder(client,pygame,window)
                #print ('file    : ' + now_playing.get('file'))
            time.sleep(1)
    
    	# check si piste 
            event = pygame.event.poll() #wait()
    # regarde si evemnent clavier (encodeur rotatif)
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_RETURN: # pour l'instant arret soft , a terme play/pause
                    pygame.quit()
                    client.disconnect()
                    sys.exit(0)
                if event.key==pygame.K_UP: # piste suivante
                    client.next()
                    pygame.event.clear()
    		#time.sleep(1)
                    elapsed=0
                    update_folder(client,pygame,window)
                if event.key==pygame.K_DOWN: # piste precedente
                    client.previous()
                    pygame.event.clear()
    		#time.sleep(1)
                    elapsed=0
                    update_folder(client,pygame,window)
    
    if __name__ == "__main__":
        main()
    

     

pour l’instant partie « mécanique » finis à 90¨% , et partie Electronique / dev finis a 70%

lorsque le soft seras terminé a 100% , je mettrais dispo les sources de tous les fichiers/scripts utilisés

la suite bientôt ……..

Articles qui m’on servis pour développer
https://github.com/petervflocke/rotaryencoder_rpi
https://www.instructables.com/id/PWM-Regulated-Fan-Based-on-CPU-Temperature-for-Ras/
https://www.pihomeserver.fr/2014/03/08/raspberry-pi-home-server-ajouter-une-horloge-rtc-ds1307-sur-le-bus-i2c/
http://blog.gegg.us/2017/01/setting-up-a-gpio-button-keyboard-on-a-raspberry-pi/
https://blog.oddbit.com/2019/01/19/pipower-a-raspberry-pi-ups/https://github.com/joshkunz/ashuffle
https://github.com/joosteto/ws2812-spi
https://github.com/nvbn/soundlights

 

Catégorie : Hardware, Software | Commentaires fermés sur RadioPi
décembre 25

Serveur Domoticz pour TD/TP en BTS SN

But: monter un serveur Domoticz avec des modules sonoff a base de esp8266 pour faire des TD / TP en BTS SN ( ancien BTS Electronique ).
le Raspberry communique avec les modules sonoff avec un réseau wifi séparé du réseau local.
Matériel nécessaire :
– Un Raspberry PI 3 ( ou un autre avec dongle wifi ) avec carte SD de 8Go ( actuellement ~3.5Go utilisé )
– Un écran 7″ officiel tactile pour le Raspberry pi ( optionnel )
– plusieurs modules « SonOff » pour la partie purement Domotique ( attention présence de tension secteur 220v )

le tuto est découpée en plusieurs parties a suivre dans l’ordre
-Installation du Raspberry PI
-Début du paramétrage
-Installation de Node-Red
-Installation de Webmin
-Hotspot Wifi et DHCP
-Serveur Web nginx
-Installation phpmyadmin depuis les sources
-Configuration de Samba
-Installation de eZServerMonitor
-l’ecran 7″ tactile officiel du Rapsberry pi
-Test divers
-Mise à jour de domoticz par tache cron ( Optionel )
-Sauvegarde des bases de données SQL

Partie 1 ) Installation du Raspberry PI
On récupère l’image « raspbian lite » sur https://www.raspberrypi.org/downloads/raspbian/
Une fois l’image récupérée on va la copier sur la carte SD , avec Win32diskimage ou autre logiciel
On accède a la partition FAT32 de la carte SD et on crée un fichier texte que l’on appelle ssh , cela activera le serveur ssh du Pi au démarrage
On met la carte SD dans le Raspberry et on démarre le système , si l’écran est branché on peux suivre le processus , sinon attendre environ 5mn
On Scanne son réseau avec un utilitaire ( dans mon cas Angry Ip Scanner => http://angryip.org/ ) pour trouver l’adresse du PI
on se connecte en SSH ( utilisateur: pi , mot de passe: raspberry )

Dans le reste du Tuto lorsqu’il y a des lignes de commandes, celles commençant par $ sont lancées avec l’utilisateur pi et celles commençant par # par l’utilisateur root ( ne pas taper $ ou # lors des commandes ). et lorsque dans les lignes de commandes si en fin de ligne il y a \ cela veux dire que la commande continue sur la ligne suivante il faut tous taper sur une seule ligne et de pas mettre le \ .
quand je dis on edite le fichier x , cela veux dire : sudo nano x

 

on vas changer locale , timezone , key, wifi

$sudo raspi-config

on vas changer le mot de passe du compte root => « Domotic »

$sudo passwd root

Mise a jour kernel & firmware

$sudo rpi-update

Une fois a jour on reboot et on enlève l’ancien firmware (4.14.34 dans mon cas ) , faire ls -al /lib/modules pour voir les versions installées . on peux meme enlever celui qui ne se termine pas pas v7+

$sudo rm -fr /lib/modules/4.14.34*

on met a jour les paquets

$sudo apt-get clean 
$sudo apt-get autoclean 
$sudo apt-get update
$sudo apt-get upgrade -y
$sudo apt-get dist-upgrade -y
$sudo reboot

on commence a installer tous ce que l’on a besoin on paramétreras ça plus tard

sudo apt-get install cmake make gcc g++ git libcurl4-openssl-dev libusb-dev python3-dev libcurl4-openssl-dev libssl1.0-dev \
 python-rpi.gpio f2fs-tools mosquitto-clients mosquitto dnsmasq hostapd ntp nginx php7.0-fpm php-apcu php7.0-mysql php7.0-curl \
 php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache php7.0-pspell php7.0-recode php7.0-sqlite3 \
 php7.0-tidy php7.0-xmlrpc php7.0-xsl php7.0-mbstring php-gettext mariadb-server samba perl libnet-ssleay-perl openssl nscd \
 libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python x11-xserver-utils xinit xserver-xorg matchbox-window-manager \
 unclutter firefox-esr-l10n-fr firefox-esr xdotool libboost-dev libboost-thread-dev libboost-system-dev libudev-dev xterm \
 automysqlbackup resolvconf avahi-utils avahi-daemon

un petit reboot et on vas commencer le paramétrage

 

Partie 2 ) Début du paramétrage

on vas autoriser tous les utilisateur a lancer le serveur graphique

$sudo dpkg-reconfigure xserver-xorg-legacy

on vas sécuriser les bases SQL ( Domotic en mdp , supprimer les bases test , autoriser le remote …)
Remove anonymous users? => Y
Disallow root login remotely? => N
Remove test database and access to it? => Y

$sudo mysql_secure_installation
$echo "update mysql.user set plugin = 'mysql_native_password' where user='root';" | sudo mysql -u root -p  

maintenant on vas installer  Domoticz. Plus besoin d’installer les sources et de compiler

$sudo curl -L install.domoticz.com | bash

en réseau local pas besoin de IPV6 , on vas le desactiver  , editer /etc/sysctl.conf et ajouter a la fin :

# désactivation de ipv6 pour toutes les interfaces
net.ipv6.conf.all.disable_ipv6 = 1
# désactivation de l’auto configuration pour toutes les interfaces
net.ipv6.conf.all.autoconf = 0
# désactivation de ipv6 pour les nouvelles interfaces (ex:si ajout de carte réseau)
net.ipv6.conf.default.disable_ipv6 = 1
# désactivation de l’auto configuration pour les nouvelles interfaces
net.ipv6.conf.default.autoconf = 0

on actualise

$sudo sysctl -p

Partie 3 ) Installation de Node-Red 

$cd
$bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
$sudo systemctl enable nodered.service
$sudo service nodered restart

Partie 4 ) Installation de Webmin

$cd /tmp
$sudo wget http://prdownloads.sourceforge.net/webadmin/webmin_1.881_all.deb
$sudo dpkg -i webmin_1.881_all.deb

on editer /etc/webmin/miniserv.conf , et changer ssl=1 en ssl=0

$sudo service webmin restart

se connecter sur la page de webmin http://ip_du_pi:1000 ( user: root , mdp : Domotic)
passer webmin en Francais : menu webmin , Configuration de Webmin , langue
télécharger le module de gestion de nginx sur https://www.justindhoffman.com/sites/justindhoffman.com/files/nginx-0.10.wbm_.gz
ajouter le module dans webmin : menu webmin , Configuration de Webmin , modules webmin ,

Partie 5 ) Hotspot Wifi et DHCP

$sudo nano /etc/dhcpcd.conf

ajouter a la fin: le PI chercheras un dhcp sur son interface filaire , mais pour la partie wifi c’est lui qui serat serveur DHCP

denyinterfaces wlan0

on attaque la partie hotspot en éditant  /etc/hostapd/hostapd.conf
si vous voulez changer le code wifi ou le ssid c’est le moment

driver=nl80211
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
beacon_int=100
auth_algs=1
wpa_key_mgmt=WPA-PSK
ssid=Domo-Jules
channel=6
hw_mode=g
wpa_passphrase=Domoticz_Jules
interface=wlan0
wpa=2
wpa_pairwise=TKIP
country_code=FR

le PI vas aussi servir de serveur DNS pour le reseau Wifi , on edite  /etc/hosts

127.0.0.1       localhost
127.0.1.1       raspberrypi

192.168.254.1    domo.home www.domo.home
192.168.254.1    sql.domo.home www.sql.domo.home
192.168.254.1    webmin.domo.home www.webmin.domo.home
192.168.254.1    nofuss.domo.home www.nofuss.domo.home
192.168.254.1    node.domo.home www.node.domo.home
192.168.254.1    status.domo.homewww.status.domo.home
192.168.254.1    system.domo.home www.system.domo.home

config serveur dhcp sur wlan0 bloc adr de 192.168.254.10 -> 192.168.254.200 . On vas forcer l’ip de wlan0 ,  on édite  /etc/network/interfaces
et ajouter :

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.254.1
    netmask 255.255.255.0
    network 192.168.254.0
    broadcast 192.168.254.255

partie serveur dhcp

$sudo rm /etc/dnsmasq.conf
$sudo nano /etc/dnsmasq.conf
interface=wlan0      # Use interface wlan0
#no-resolv
no-poll

listen-address=192.168.254.1 # Explicitly specify the address to listen on
bind-interfaces      # Bind to the interface to make sure we aren't sending things elsewhere
server=8.8.8.8       # Forward DNS requests to Google DNS
server=192.168.254.1 # 
domain-needed        # Don't forward short names
bogus-priv           # Never forward addresses in the non-routed address spaces.
addn-hosts=/etc/dnsmasq_static_hosts.conf

# Assign IP addresses between 192.168.254.10 and 192.168.254.200 with a 12 hour lease time
dhcp-range=192.168.254.10,192.168.254.200,12h

# force appariel adr mac b4:7c:9c:fe:11:50 => IP 192.168.254.201
dhcp-host=b4:7c:9c:fe:11:50,192.168.254.201

Editez /etc/default/hostapd , ajouter :

DAEMON_CONF="/etc/hostapd/hostapd.conf"

dans /etc/sysctl.conf ajouter

net.ipv4.ip_forward=1

le Pi vas servir de serveur ntp (time) pour les modules domotiques sonoff , on édite /etc/ntp.conf et on ajoute

restrict 192.168.254.0 mask 255.255.255.0
broadcast 192.168.254.255
broadcast 224.0.1.1
$sudo service hostapd start  
$sudo service dnsmasq start  

 

Partie 6 ) Serveur Web nginx

Au lieu d’utiliser Apache en serveur Web on vas utiliser nginx ( moins gourmand en mémoire) , ne gérant pas l’activation / désactivation des sites virtuels comme apache on vas creer un fichier nginx_modsite et le rendre executable

$sudo nano /usr/bin/nginx_modsite
$chmod +x /usr/bin/nginx_modsite

contenu de nginx_modsite

#!/bin/bash

##
#  File