====== Raspberry Pi ======
Le Raspberry Pi est un micro-ordinateur conçu par [[https://www.raspberrypi.org/about/|la Fondation Raspberry Pi]].
===== Choix de l'OS =====
On peut trouver les [[https://www.raspberrypi.org/downloads/|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 [[https://wiki.debian.org/RaspberryPi3|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 [[https://ubuntu-mate.org/raspberry-pi/|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'[[http://blog.hypriot.com/|Hypriot]], dans la partie [[http://blog.hypriot.com/downloads/|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]] ([[https://minibianpi.wordpress.com/|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 [[https://paste.k3a.me/view/449a6f1c|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 ([[http://unix.stackexchange.com/questions/144029/command-to-determine-ports-of-a-device-like-dev-ttyusb0|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 : [[http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/|hintshop.ludvig.co.nz]] et [[https://www.domoticz.com/wiki/PersistentUSBDevices|domoticz.com]] )