Le Raspberry Pi est un micro-ordinateur conçu par la Fondation Raspberry Pi.
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).
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…
Tous les détails sur la page de Raspbian.
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 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 (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.
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é!
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
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 )