====== 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]] )