Outils pour utilisateurs

Outils du site


informatique:raspberry_pi

Raspberry Pi

Le Raspberry Pi est un micro-ordinateur conçu par la Fondation Raspberry Pi.

Choix de l'OS

On peut trouver les systèmes d'exploitations officiellement supportés sur le site de la fondation. J'utilise beaucoup Raspbian (basée sur Debian).

Debian

Une version (non supportée officiellement en septembre 2017) de Debian Stretch est disponible.

$ wget https://people.debian.org/~stapelberg/raspberrypi3/2017-03-22/2017-03-22-raspberry-pi-3-stretch-PREVIEW.img
 
# ddrescue -D --force 2017-03-22-raspberry-pi-3-stretch-PREVIEW.img /dev/sdb
GNU ddrescue 1.22
     ipos:  417857 kB, non-trimmed:        0 B,  current rate:  16580 kB/s
     opos:  417857 kB, non-scraped:        0 B,  average rate:  16714 kB/s
non-tried:  582142 kB,  bad-sector:        0 B,    error rate:       0 B/s
  rescued:  417857 kB,   bad areas:        0,        run time:         25s
pct rescued:   41.78%, read errors:        0,  remaining time:         35s
                              time since last successful read:          0s
Copying non-tried blocks... Pass 1 (forwards)

Ça n'a pas booté lors de mon essais…

Raspbian

Tous les détails sur la page de Raspbian.

Ubuntu Mate

On peut trouver Ubuntu Mate pour Raspberry Pi sur leur site. J'ai téléchargé la dernière LTS en torrent. Ils proposent d'utiliser ddrescue à la place de dd. Pour l'installer :

$ sudo aptitude install gddrescue xz-utils

Il faut utiliser unxz pour décompresser l'image téléchargée :

$ unxz ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img.xz

L'image est assez grande (~8Go). Il faut donc choisir une carte SD de 16Go. Comme toujours, on vérifie l'emplacement de la carte SD avec lsblk avant de copier l'image dessus.

$ lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 149,1G  0 disk 
├─sda1   8:1    0 145,2G  0 part /
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0   3,9G  0 part [SWAP]
sdb      8:16   1  16G    0 disk 
└─sdb1   8:17   1  16G    0 part /media/ordi/blabla
 
$ sudo ddrescue -D --force ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img /dev/sdb
[sudo] Mot de passe de salon : 
GNU ddrescue 1.19
Press Ctrl-C to interrupt
rescued:     8053 MB,  errsize:       0 B,  current rate:    9830 kB/s
   ipos:     8052 MB,   errors:       0,    average rate:   10582 kB/s
   opos:     8052 MB, run time:   12.68 m,  successful read:       0 s ago
Finished    

HypriotOS

HypriotOS est une distribution basée sur Raspbian, optimisée pour l'utilisation de Docker. Elle est disponible sur le site d'Hypriot, dans la partie downloads. On suit la même procédure que pour l'Ubuntu Mate :

$ lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 149,1G  0 disk 
├─sda1   8:1    0 145,2G  0 part /
└─sda5   8:5    0   3,9G  0 part [SWAP]
sdb      8:16   1   7,4G  0 disk 
 
$ sudo ddrescue -D --force Téléchargements/hypriotos-rpi-v0.8.0.img /dev/sdb
GNU ddrescue 1.19
Press Ctrl-C to interrupt
rescued:     1363 MB,  errsize:       0 B,  current rate:    8126 kB/s
   ipos:     1363 MB,   errors:       0,    average rate:    8519 kB/s
   opos:     1363 MB, run time:    2.66 m,  successful read:       0 s ago
Finished     

MINIBIAN

Minibian (site) est une distribution basée sur Debian Jessie dont l'objectif est d'être très légère et de ne pas embarquer de logiciels superflus.

Trucs et astuces

Redémarrer le wifi automatiquement

Voici un script trouvé sur k3a.me qui permet de vérifier si le wifi est toujours fonctionnel et si ce n'est pas le cas, de le redémarrer.

Pas encore testé!

Port série

Repérer et récupérer des informations sur le port série

On débranche/rebranche et on lance la commande suivante :

$ dmesg | grep tty
(...)
[  852.021751] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
[ 1009.732832] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device

Une autre possibilité consiste à utiliser ce script (source (stackexchange.com)) :

$ nano find-uart-device.sh
 
$ cat find-uart-device.sh
#!/bin/bash
 
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && continue
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && continue
        echo "/dev/$devname - $ID_SERIAL"
    )
done
 
$ chmod +x find-uart-device.sh
 
$ ./find-uart-device.sh
/dev/ttyACM0 - 3D_Robotics_PX4_FMU_v2.x_0

On peut également utiliser lsusb :

$ lsusb 
(...) 
Bus 001 Device 006: ID 26ac:0011  
(...)
 
$ lsusb -v | more
(...)
Bus 001 Device 008: ID 26ac:0011  
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            2 Communications
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x26ac 
  idProduct          0x0011 
  bcdDevice            1.01
  iManufacturer           1 3D Robotics
  iProduct                2 PX4 FMU v2.x
  iSerial                 3 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           62
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          4 Bulk
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      1 AT-commands (v.25ter)
      iInterface              0 
      CDC Header:
        bcdCDC               1.10
      CDC ACM:
        bmCapabilities       0x06
          sends break
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval              10
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)
(...)

Un autre moyen de récupérer des informations, udevadm :

$ udevadm info -a -n /dev/ttyACM0 
(...)
  looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/tty/ttyACM0':
    KERNEL=="ttyACM0"
    SUBSYSTEM=="tty"
    DRIVER==""
(...)
  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2':
    KERNELS=="1-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="1.2"
    ATTRS{idVendor}=="26ac"
    ATTRS{speed}=="12"
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="8"
    ATTRS{configuration}=="Bulk"
    ATTRS{bMaxPower}=="500mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0101"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="15"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="3D Robotics"
    ATTRS{removable}=="removable"
    ATTRS{idProduct}=="0011"
    ATTRS{bDeviceClass}=="02"
    ATTRS{product}=="PX4 FMU v2.x"
 
  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="02"
    ATTRS{devpath}=="1"
    ATTRS{idVendor}=="0424"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="2"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="2mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="5"
    ATTRS{bcdDevice}=="0200"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="113"
    ATTRS{ltm_capable}=="no"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="9514"
    ATTRS{bDeviceClass}=="09"
 
  looking at parent device '/devices/platform/soc/3f980000.usb/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{devpath}=="0"
    ATTRS{idVendor}=="1d6b"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{authorized_default}=="1"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="1"
    ATTRS{interface_authorized_default}=="1"
    ATTRS{bcdDevice}=="0404"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="3f980000.usb"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="25"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Linux 4.4.13-v7+ dwc_otg_hcd"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0002"
    ATTRS{bDeviceClass}=="09"
    ATTRS{product}=="DWC OTG Controller"
 
  looking at parent device '/devices/platform/soc/3f980000.usb':
    KERNELS=="3f980000.usb"
    SUBSYSTEMS=="platform"
    DRIVERS=="dwc_otg"
    ATTRS{hnp}=="HstNegScs = 0x0"
    ATTRS{srp}=="SesReqScs = 0x1"
    ATTRS{regvalue}=="invalid offset"
    ATTRS{hsic_connect}=="HSIC Connect = 0x1"
    ATTRS{guid}=="GUID = 0x2708a000"
    ATTRS{mode}=="Mode = 0x1"
    ATTRS{srpcapable}=="SRPCapable = 0x1"
    ATTRS{regdump}=="Register Dump"
    ATTRS{gpvndctl}=="GPVNDCTL = 0x00000000"
    ATTRS{ggpio}=="GGPIO = 0x00000000"
    ATTRS{hprt0}=="HPRT0 = 0x00001005"
    ATTRS{wr_reg_test}=="Time to write GNPTXFSIZ reg 10000000 times: 370 msecs (37 jiffies)"
    ATTRS{driver_override}=="(null)"
    ATTRS{hcd_frrem}=="HCD Dump Frame Remaining"
    ATTRS{mode_ch_tim_en}=="Mode Change Ready Timer Enable = 0x0"
    ATTRS{gnptxfsiz}=="GNPTXFSIZ = 0x01000306"
    ATTRS{remote_wakeup}=="Remote Wakeup Sig = 0 Enabled = 0 LPM Remote Wakeup = 0"
    ATTRS{busconnected}=="Bus Connected = 0x1"
    ATTRS{hcddump}=="HCD Dump"
    ATTRS{gotgctl}=="GOTGCTL = 0x001c0001"
    ATTRS{spramdump}=="SPRAM Dump"
    ATTRS{grxfsiz}=="GRXFSIZ = 0x00000306"
    ATTRS{gsnpsid}=="GSNPSID = 0x4f54280a"
    ATTRS{gusbcfg}=="GUSBCFG = 0x20001700"
    ATTRS{hptxfsiz}=="HPTXFSIZ = 0x02000406"
    ATTRS{devspeed}=="Device Speed = 0x0"
    ATTRS{fr_interval}=="Frame Interval = 0x1d4c"
    ATTRS{rem_wakeup_pwrdn}==""
    ATTRS{bussuspend}=="Bus Suspend = 0x0"
    ATTRS{buspower}=="Bus Power = 0x1"
    ATTRS{hnpcapable}=="HNPCapable = 0x1"
    ATTRS{rd_reg_test}=="Time to read GNPTXFSIZ reg 10000000 times: 920 msecs (92 jiffies)"
    ATTRS{enumspeed}=="Device Enumeration Speed = 0x1"
    ATTRS{inv_sel_hsic}=="Invert Select HSIC = 0x0"
    ATTRS{regoffset}=="0xffffffff"
 
  looking at parent device '/devices/platform/soc':
    KERNELS=="soc"
    SUBSYSTEMS=="platform"
    DRIVERS==""
    ATTRS{driver_override}=="(null)"
 
  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""
 
$ udevadm info -a -n /dev/ttyACM0 | grep idVendor
    ATTRS{idVendor}=="26ac"
    ATTRS{idVendor}=="0424"
    ATTRS{idVendor}=="1d6b"
 
$ udevadm info -a -n /dev/ttyACM0 | grep idProduct
    ATTRS{idProduct}=="0011"
    ATTRS{idProduct}=="9514"
    ATTRS{idProduct}=="0002"
 
$ udevadm info -a -n /dev/ttyACM0 | grep serial
    ATTRS{serial}=="0"
    ATTRS{serial}=="3f980000.usb"
 
$ udevadm info -a -n /dev/ttyACM0 | grep manufacturer
    ATTRS{manufacturer}=="3D Robotics"
    ATTRS{manufacturer}=="Linux 4.4.13-v7+ dwc_otg_hcd"
 
$ udevadm info -a -n /dev/ttyACM0 | grep product
    ATTRS{product}=="PX4 FMU v2.x"
    ATTRS{product}=="DWC OTG Controller"

Ou encore, en regardant dans les logs :

$ sudo cat /var/log/messages | grep SerialNumber
(...)
Aug 16 14:10:22 raspberrypi kernel: [ 1060.450258] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Aug 16 14:10:22 raspberrypi kernel: [ 1060.450296] usb 1-1.2: SerialNumber: 0

Fixer le chemin d'accès vers du matériel en série

Pour fixer le chemin d'accès vers du matériel en série, on doit créer une règle udev. Le plus compliqué est de retrouver les informations nécessaires dans les différentes commandes saisies précédemment.

$ sudo nano /etc/udev/rules.d/99-usb-serial.rules
 
$ sudo cat /etc/udev/rules.d/99-usb-serial.rules 
SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0011", SYMLINK+="autopilot"
 
#on recharge les règles udev
$ sudo udevadm control --reload
 
#matériel débranché :
$ ls -al /dev/a*
crw------- 1 root root 10, 235 aoû 16 13:50 /dev/autofs
 
#matériel branché :
$ ls -alh /dev/a*
crw------- 1 root root 10, 235 aoû 16 14:40 /dev/autofs
lrwxrwxrwx 1 root root       7 aoû 16 14:43 /dev/autopilot -> ttyACM0

Finalement, pour être compatible avec différents autopilot du même fabricant (différentes versions du même produit), j'ai retiré la notion d'idProduct dans la règle udev.

$ sudo cat /etc/udev/rules.d/99-usb-serial.rules 
SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", SYMLINK+="autopilot"

( sources : hintshop.ludvig.co.nz et domoticz.com )

informatique/raspberry_pi.txt · Dernière modification : 2020/08/09 13:03 de 127.0.0.1