Différences entre les versions de « Ressources::RaspberryPi »
(55 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | == | + | =Notes d'introduction= |
− | === | + | ===Objectif de cette page=== |
− | * | + | Cette page a pour objectif de rassembler différentes "recettes" techniques propres à l'utilisation d'un Raspberry Pi. Elle constitue un support pour les cours et formations relatifs aux Raspberry Pi donnés notamment à l'ERG (Ecole de Recherche Graphique, Bruxelles) et à iMAL (Center for digital cultures and technology). Si beaucoup de ces recettes peuvent convenir à d'autres appareils et d'autres systèmes d'exploitation, cette page se focalise sur des manipulations précises liées à une version précise d'un appareil précis (qui utilise un système d'exploitation précis), en l'occurence l'appareil et le système d'exploitation énoncés ci-dessous. |
− | === | + | |
− | * | + | ===Spécificités techniques=== |
− | * | + | Les recettes présentes sur cette page sont liées au Raspberry Pi 3B, 3B+ ou 4B avec le système d'exploitation Raspbian Buster. |
− | + | ||
− | + | =Configurer le Raspberry Pi= | |
− | + | ==Préparer la carte SD== | |
+ | * Télécharger la dernière version de Raspbian ici: [https://www.raspberrypi.org/downloads/raspbian/] | ||
+ | ===Flasher la carte en utilisant l'outil Etcher avec Linux, Mac OS ou Windows=== | ||
+ | * Télécharger Etcher ici: [https://etcher.io/] | ||
+ | * Lancer Etcher | ||
+ | * Insérer la carte SD dans l'ordinateur (ou dans un lecteur de carte externe) | ||
+ | * Sélectionner l'image disque de Raspbian téléchargée | ||
+ | * Sélectionner le disque à flasher | ||
+ | * Cliquer sur "Flash" | ||
+ | |||
+ | ===Flasher la carte en utilisant l'outil dd avec Linux ou Mac OS=== | ||
+ | * Décompresser le fichier zip contenant l'image de Raspbian à flasher sur la carte. Le fichier résultant doit avoir l'extension .img. | ||
+ | * Ouvrir le terminal de l'ordinateur | ||
+ | * Identifier les lecteurs de disques connectés à l'ordinateur | ||
+ | <syntaxhighlight lang="bash">lsblk</syntaxhighlight> | ||
+ | * Insérer la carte sd et lancer à nouveau la commande lsblk. Un élément supplémentaire devrait apparaitre, il s'agit de la carte sd, dont la référence est affichée (exemple: /dev/mmcblk0) | ||
+ | * Insérer la commande suivante en prenant soin de remplacer l'adresse de l'image de Raspbian (après if=) et l'adresse de la carte sd (après of=). | ||
+ | <syntaxhighlight lang="bash">dd bs=4M if=2018-04-18-raspbian-stretch.img of=/dev/mmcblk0 status=progress conv=fsync</syntaxhighlight> | ||
+ | |||
+ | ==Configurer le Raspberry Pi pour une connexion distante== | ||
+ | Il est tout à fait possible d'utiliser le Raspberry PI en le branchant à un écran, un clavier et une souris mais la possibilité d'y accéder à distance via un autre ordinateur faisant office de terminal se révèle plus intéressant dans une majorité d'usages. Pour que cet accès soit possible, il faut que l'ordinateur serveur (le Raspberry) et l'ordinateur client (le terminal, donc un autre ordinateur Mac ou PC) soient connectés entre eux; soit par un réseau local (via WIFI ou ethernet) soit par un cable ethernet qui relie directement les deux appareils. Pour éviter de devoir assigner une adresse IP fixe au Raspberry PI et de devoir retenir une adresse, il est possible d'assigner un nom au Raspberry par lequel il sera connu au sein du réseau. Pour que la reconnaissance du nom fonctionne, il faut que le paquet avahi-daemon soit installé sur le Raspberry (c'est le cas par défaut pour les versions les plus récentes de Raspbian). Et que "bonjour" (Windows) ou avahi-daemon (Linux) soit installé sur l'ordinateur. Enfin, pour pouvoir se connecter au Raspberry PI à partir d'un ordinateur fonctionnant avec Windows, il faut installer l'émulateur de terminal et client SSH Putty: [https://putty.org/] | ||
+ | |||
+ | ===Autoriser l'accès distant SSH=== | ||
+ | Avant de mettre la carte SD dans le Raspberry, il faut que le système d'exploitation accepte une connexion distante via le protocole SSH (qui est le protocole que nous utiliserons pour accèder au Raspberry via un autre ordinateur). Pour cela, il faut ajouter un fichier vide nommé <pre>ssh</pre> sur la carte SD, à la racine de la partition BOOT. | ||
+ | |||
+ | ===Configurer l'accès à un réseau wifi avant de démarrer le Raspberry PI=== | ||
+ | Si nous voulons qu'au démarrage, le Raspberry PI se connecte automatiquement à un réseau WIFI particulier (et devienne du coup accessible à n'importe quel appareil connecté au même réseau WIFI), il faut ajouter dans la partition BOOT un fichier nommé <code>wpa_supplicant.conf</code>, contenant les informations de connexion au réseau: | ||
+ | |||
+ | <pre> | ||
+ | ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev | ||
+ | update_config=1 | ||
+ | country=BE | ||
network={ | network={ | ||
ssid="réseau wifi" | ssid="réseau wifi" | ||
− | + | psk="mot de passe wifi" | |
+ | key_mgmt=WPA-PSK | ||
} | } | ||
+ | </pre> | ||
+ | |||
+ | Ce fichier sera déplacé au démarrage du Raspberry dans le répertoire <code>/etc/wpa_supplicant/</code>. | ||
+ | |||
+ | ===Modifier le nom du Raspberry PI=== | ||
+ | Il s'agit du nom qui sera utilisé sur le réseau local auquel le Raspberry PI se connectera. Par défaut il s'agit de <code>raspberrypi</code>. Pour pouvoir le modifier avant le démarrage, il faut accéder au système de fichier de Raspbian installé sur la carte SD, sur la partition <code>rootfs</code>. Le problème c'est que cette partition est formatée dans un format propre à Linux; ext4. Il est donc très facile de le faire via un ordinateur fonctionnant avec Linux mais impossible avec Mac OS ou Windows sans installer de programme supplémentaire. Dans ce cas, il faut démarrer une première fois le Raspberry, y accéder via le programme terminal sous Mac OS ou Putty sous Windows en utilisant le nom par défaut: raspberrypi, modifier le nom et redémarrer. Sinon, via Linux, il suffit de modifier ce nom dans deux fichiers de la partition <code>rootfs</code>. | ||
+ | |||
+ | ====Avec Linux, dans la partition rootfs de la carte SD (avant de démarrer le RPI)==== | ||
+ | Les deux fichiers à modifier sont /etc/hostname et /etc/hosts. Pour les modifier via le terminal: | ||
+ | * Ouvrir le terminal | ||
+ | * Naviguer jusqu'au dossier "etc" de la partition root de la carte SD | ||
+ | <syntaxhighlight lang="bash">cd /media/utilisateur/root/etc/</syntaxhighlight> | ||
+ | * Modifier le fichier "hosts" en tapant | ||
+ | <syntaxhighlight lang="bash">sudo nano hosts</syntaxhighlight> | ||
+ | * Modifier le nom du raspberry à la fin du fichier, donc remplacer | ||
+ | <pre>127.0.1.1 raspberrypi</pre> | ||
+ | par | ||
+ | <pre>127.0.1.1 lenomdevotreraspberry</pre> | ||
+ | * Sauvegarder et quitter (Ctrl + x) | ||
+ | * Modifier le fichier "hostname" en tapant | ||
+ | <syntaxhighlight lang="bash">sudo nano hostname</syntaxhighlight> | ||
+ | * Modifier le nom du raspberry à la fin du fichier, donc remplacer | ||
+ | <pre>raspberrypi</pre> | ||
+ | par | ||
+ | <pre>lenomdevotreraspberry</pre> | ||
+ | * Sauvegarder et quitter (Ctrl + x) | ||
+ | |||
+ | ====Avec Mac OS ou Windows, en se connectant une première fois au RPI via SSH==== | ||
+ | * Sur Mac OS, ouvrir le programme Terminal et taper | ||
+ | <syntaxhighlight lang="bash">ssh pi@raspberrypi.local</syntaxhighlight> | ||
+ | * Sur Windows, ouvrir PUTTY et entrer comme nom d'hôte <code>raspberrypi</code>. Cliquer sur "ouvrir". Lorsque le nom d'utilisateur est demandé, entrer "pi". | ||
+ | * Lorsque le mot de passe est demandé, entrer "raspberry". | ||
+ | * Si le système demande une confirmation avant de faire la connexion, confirmer en entrant "y". | ||
+ | * Une fois connecté, se déplacer dans le dossier "/etc". | ||
+ | * Modifier le fichier "hosts" en tapant | ||
+ | <syntaxhighlight lang="bash">sudo nano hosts</syntaxhighlight> | ||
+ | * Modifier le nom du raspberry à la fin du fichier, donc remplacer | ||
+ | <pre>127.0.1.1 raspberrypi</pre> | ||
+ | par | ||
+ | <pre>127.0.1.1 lenomdevotreraspberry</pre> | ||
+ | * Sauvegarder et quitter (Ctrl + x) | ||
+ | * Modifier le fichier "hostname" en tapant | ||
+ | <syntaxhighlight lang="bash">sudo nano hostname</syntaxhighlight> | ||
+ | * Modifier le nom du raspberry à la fin du fichier, donc remplacer | ||
+ | <pre>raspberrypi</pre> | ||
+ | par | ||
+ | <pre>lenomdevotreraspberry</pre> | ||
+ | * Sauvegarder et quitter (Ctrl + x) | ||
+ | * Redémarrer le Raspberry PI | ||
+ | <syntaxhighlight lang="bash">sudo reboot now</syntaxhighlight> | ||
+ | |||
+ | ==Mettre à jour les logiciels== | ||
+ | * Dans le terminal, taper | ||
+ | <syntaxhighlight lang="bash">sudo apt-get update</syntaxhighlight> | ||
+ | La commande met à jour la base de données locale des logiciels disponibles en téléchargeant les bases de données de paquets dont les adresses se trouvent dans le fichier <code>/etc/apt/sources.list et les fichiers contenus dans /etc/apt/sources.list.d</code> | ||
+ | * Taper ensuite | ||
+ | <syntaxhighlight lang="bash">sudo apt-get upgrade</syntaxhighlight> | ||
+ | pour mettre à jour tous les logiciels installés sur le raspberry. | ||
+ | * Taper enfin | ||
+ | <syntaxhighlight lang="bash">sudo apt-get dist-upgrade</syntaxhighlight> | ||
+ | pour mettre à jour la version de Raspbian si nécessaire. | ||
+ | |||
+ | ==Changer le mot de passe de l'utilisateur [facultatif]== | ||
+ | L'utilisateur par défaut se nomme "pi". Pour changer son mot de passe, taper dans le terminal la commande | ||
+ | <syntaxhighlight lang="bash">passwd</syntaxhighlight> | ||
+ | et suivre les instructions. | ||
+ | |||
+ | ==Installer et configurer Samba [facultatif]== | ||
+ | Samba va permettre de partager les dossiers du raspberry sur le réseau pour pouvoir y accéder via le navigateur de fichiers de votre ordinateur. | ||
+ | |||
+ | * Dans le terminal, taper | ||
+ | <syntaxhighlight lang="bash">sudo apt-get install samba samba-common-bin</syntaxhighlight> | ||
+ | * Ouvrir le fichier de configuration de samba en tapant | ||
+ | <syntaxhighlight lang="bash">sudo nano /etc/samba/smb.conf</syntaxhighlight> | ||
+ | * Modifier la ligne | ||
+ | <pre>wins support = no</pre> | ||
+ | en | ||
+ | <pre>wins support = yes</pre> | ||
+ | * Ajouter les lignes suivantes à la fin du fichier | ||
+ | <pre> | ||
+ | [pihome] | ||
+ | comment=home pi | ||
+ | path=/home/pi | ||
+ | browseable=Yes | ||
+ | writeable=Yes | ||
+ | only guest=no | ||
+ | create mask=0775 | ||
+ | directory mask=0775 | ||
+ | public=no | ||
+ | </pre> | ||
+ | * Sauver le fichier et quitter (ctrl+x) | ||
+ | * Ajouter l'utilisateur pi comme utilisateur samba | ||
+ | <syntaxhighlight lang="bash">sudo smbpasswd -a pi</syntaxhighlight> | ||
+ | |||
+ | ==Installer et configurer un bureau à distance [facultatif]== | ||
+ | ===Installer le serveur du bureau à distance sur le raspberry=== | ||
+ | * Installer "tightvncserver": | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo apt-get install tightvncserver | ||
+ | </syntaxhighlight> | ||
+ | * Lancer "tightvncserver" | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | tightvncserver | ||
+ | </syntaxhighlight> | ||
+ | Entrer un mot de passe demandé. Le bureau distant a normalement été créé à l'adresse :1, :0 étant l'adresse du bureau par défaut sur le raspberry. | ||
+ | * Pour éteindre le bureau par défaut, taper | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | service lightdm stop | ||
+ | </syntaxhighlight> | ||
+ | * Pour éteindre un bureau créé aevec tightvncserver, taper | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | vncserver -kill :1 | ||
+ | </syntaxhighlight> | ||
+ | où :1 est l'adresse du bureau que vous désirez arrêter. | ||
+ | ===(Linux) Se connecter via l'ordinateur client=== | ||
+ | * Chercher l'application (ou installer via <code>apt-get</code> si nécessaire) "remote desktop viewer" (Vinagre pour Gnome, krdc pour KDE) | ||
+ | * Ouvrir l'application et dans le champs "host" taper l'adresse du raspberry suivie de l'adresse de l'écran (exemple: <code>lenomdevotreraspberry.local:1</code>). Spécifier "VNC" comme protocole de connexion et cliquer sur "connect". | ||
+ | ===(Mac OS) Se connecter via l'ordinateur client=== | ||
+ | * Dans le menu du Finder, cliquer sur "Aller " puis "Se connecter au serveur", puis entrer l'adresse du raspberry précédée de "vnc://", par exemple: <code>vnc://lenomdevotreraspberry.local:1</code> | ||
+ | ===(Windows) Se connecter via l'ordinateur client=== | ||
+ | * Télécharger "tightvnc" à l'adresse http://www.tightvnc.com/download.php et l'installer. | ||
+ | * Ouvrir l'application et dans le champs "host" taper l'adresse du raspberry suivie de l'adresse de l'écran (exemple: <code>lenomdevotreraspberry.local:1</code>). Cliquer sur "connect". | ||
+ | |||
+ | =Lire une vidéo= | ||
+ | Le lecteur vidéo par défaut installé sur Raspbian se nomme omxplayer. Il peut être exécuté à distance, sans nécessairement de session de bureau active sur le raspberry. | ||
+ | Pour lire une vidéo, taper dans le terminal: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | omxplayer --loop --no-osd lefichier.mp4 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | =Créer des scripts bash et automatiser leur exécution= | ||
+ | ==Créer un script de base qui s'exécutera à chaque démarrage du raspberry== | ||
+ | Le script bash que nous allons réaliser envoie du texte dans un fichier à chaque exécution. | ||
+ | ===Insérer du texte dans un fichier=== | ||
+ | * Créer un fichier "messages" qui contiendra le texte | ||
+ | <syntaxhighlight lang="bash">touch messages</syntaxhighlight> | ||
+ | * Tester l'envoi de texte dans le fichier | ||
+ | <syntaxhighlight lang="bash">echo "test" >> messages</syntaxhighlight> | ||
+ | * Afficher le contenu du fichier | ||
+ | <syntaxhighlight lang="bash">cat messages</syntaxhighlight> | ||
+ | |||
+ | ===Créer un fichier contenant la commande d'insertion du texte=== | ||
+ | * Créer un nouveau fichier | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | nano hello.sh | ||
+ | </syntaxhighlight> | ||
+ | * Y insérer l'entête qui indique le programme qui doit l'interpréter et la commande | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | #!/bin/bash | ||
+ | |||
+ | echo "hello" >> /home/pi/messages | ||
+ | exit 0 | ||
+ | </syntaxhighlight> | ||
+ | * Sauver et quitter le fichier (ctrl + x) | ||
+ | * Rendre le fichier exécutable | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | chmod +x hello.sh | ||
+ | </syntaxhighlight> | ||
+ | * Tester son exécution | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | ./hello.sh | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===Exécuter le script créé à chaque démarrage du raspberry=== | ||
+ | * Il s'agit de modifier le fichier "/etc/rc.local" pour y ajouter l'adresse du script juste avant la ligne "exit 0" | ||
+ | <syntaxhighlight lang="bash">sudo nano /etc/rc.local</syntaxhighlight> | ||
+ | * La fin du fichier doit ressembler à ceci: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | /home/pi/hello.sh & | ||
+ | |||
+ | exit 0 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Créer un script d'envoi d'email qui s'exécutera à chaque connexion au wifi== | ||
+ | Le script bash que nous allons réaliser envoie un email à chaque exécution. | ||
+ | ===Installer et configurer les outils nécessaires=== | ||
+ | * Installer les paquets nécessaires | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo apt-get install mailutils mpack ssmtp | ||
+ | </syntaxhighlight> | ||
+ | * Configurer ssmtp avec les informations de connexion à un serveur smtp | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo nano /etc/ssmtp/ssmtp.conf | ||
+ | </syntaxhighlight> | ||
+ | Exemple de configuration pour envoyer les mails à partir d'une adresse gmail | ||
+ | <pre> | ||
+ | root=utilisateur@gmail.com | ||
+ | mailhub=smtp.gmail.com:587 | ||
+ | hostname=lionel | ||
+ | AuthUser=utilisateur@gmail.com | ||
+ | AuthPass=motdepasse | ||
+ | FromLineOverride=YES | ||
+ | UseTLS=YES | ||
+ | UseSTARTTLS=YES | ||
+ | </pre> | ||
+ | * Pour les adresses gmail, il est possible de devoir effectuer des étapes supplémentaires; voir ici: https://support.google.com/mail/answer/78754?hl=en | ||
+ | ===Envoyer un mail via une ligne de commande=== | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | echo "Contenu du mail" | mail -s "Titre du mail" destinataire@gmail.com | ||
+ | </syntaxhighlight> | ||
+ | ===Créer un fichier contenant la commande d'envoi d'un email=== | ||
+ | * Créer un nouveau fichier | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | nano email.sh | ||
+ | </syntaxhighlight> | ||
+ | * Y insérer la commande l'entête qui indique le programme qui doit l'interpréter et la commande d'envoi d'email | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | #!/bin/bash | ||
+ | |||
+ | echo "Contenu du mail" | mail -s "Titre du mail" destinataire@gmail.com | ||
+ | exit 0 | ||
+ | </syntaxhighlight> | ||
+ | * Sauver et quitter le fichier (ctrl + x) | ||
+ | * Rendre le fichier exécutable | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | chmod +x email.sh | ||
+ | </syntaxhighlight> | ||
+ | * Tester son exécution | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | ./email.sh | ||
+ | </syntaxhighlight> | ||
+ | ===Exécuter le script créé à chaque connexion au réseau wifi=== | ||
+ | Puisque notre script a besoin de la connexion pour fonctionner, il faut qu'il s'exécute au moment où cette connexion est disponnible et non directement au démarrage du raspberry. | ||
+ | * Copier le script dans le répertoire "/etc/network/if-up.d" | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo mv email.sh /etc/network/if-up.d/email | ||
+ | </syntaxhighlight> | ||
+ | * Modifier le script pour qu'il n'envoie pas de mail si une autre interface réseau que le wifi se connecte et pour qu'il attende quelques secondes après l'activation du wifi (pour l'obtention d'une adresse ip) avant d'envoyer un email. | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | #!/bin/bash | ||
+ | |||
+ | if [ "$IFACE" != "wlan0" ];then | ||
+ | exit 0 | ||
+ | fi | ||
+ | |||
+ | sleep 10 | ||
+ | echo "Contenu du mail" | mail -s "Titre du mail" destinataire@gmail.com | ||
+ | |||
+ | exit 0 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Planifier l'exécution d'un script avec crontab== | ||
+ | Crontab permet l'exécution planifiée d'un script, c'est à dire programmer l'exécution d'un script pour qu'elle ait lieu toutes les x minutes/x heures/x jours du mois/x mois/x jours de la semaine. | ||
+ | * Pour éditer le crontab de l'utilisateur courant (pi), il faut taper la commande: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | crontab -e | ||
+ | </syntaxhighlight> | ||
+ | * Chaque ligne de ce fichier correspond à une commande planifiée. Par exemple, pour exécuter toutes les 5 minutes notre script /home/pi/hello.sh, il faut ajouter la ligne | ||
+ | <pre>5 * * * * /home/pi/hello.sh</pre> | ||
+ | à la fin du fichier. Les règles pour écrire la planification sont indiquées au début du fichier crontab. | ||
+ | * Sauver et quitter (ctrl+x) | ||
+ | |||
+ | ==Convertir un script en démon avec systemd== | ||
+ | * Créer un script (ici un script python) qui tournera en boucle | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | nano /home/pi/daemon.py | ||
+ | </syntaxhighlight> | ||
+ | par exemple: | ||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | from time import sleep | ||
+ | |||
+ | try: | ||
+ | while True: | ||
+ | with open("test.txt", "a") as myfile: | ||
+ | myfile.write("patatras ") | ||
+ | time.sleep(5) | ||
+ | except KeyboardInterrupt: | ||
+ | print "goodbye!" | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | * Créer un nouveau fichier de configuration de systemd | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo nano /lib/systemd/system/daemon.service | ||
+ | </syntaxhighlight> | ||
+ | <pre> | ||
+ | [Unit] | ||
+ | Description=Test script | ||
+ | After=multi-user.target | ||
+ | |||
+ | [Service] | ||
+ | Type=idle | ||
+ | ExecStart=/usr/bin/python /home/pi/daemon.py | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | </pre> | ||
+ | * Changer les droits d'accès de ce fichier | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo chmod 644 /lib/systemd/system/daemon.service | ||
+ | </syntaxhighlight> | ||
+ | * Mettre à jour systemd avec ce nouveau fichier | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo systemctl daemon-reload | ||
+ | sudo systemctl enable daemon.service | ||
+ | </syntaxhighlight> | ||
+ | * Redémarrer le raspberry | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo reboot now | ||
+ | </syntaxhighlight> | ||
+ | =Convertir son raspberry en point d'accès wifi= | ||
+ | Le but est ici de transformer le raspberry pi en un point d'accès wifi accessible sur n'importe quel matériel (smartphone, tablette ou ordinateur), de partager la connexion Internet branchée sur le Raspberry et d'afficher son propre contenu dans le navigateur web de l'appareil connecté. Pour cela, il faut dédier l'interface wifi du Raspberry à la diffusion du réseau. Si l'on veut partager une connexion Internet aux appareils connectés à ce réseau, il faut utiliser une autre interface; soit une clé wifi supplémentaire, soit le port ethernet du Raspberry. | ||
+ | |||
+ | ==Installer et configurer hostapd et dnsmasq== | ||
+ | * Installer "hostapd et dnsmasq", le premier servira à configurer le point d'accès wifi et le second servira à distribuer des adresses ip (via dhcp): | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo apt-get install dnsmasq hostapd | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * Éteindre les deux services installés (pour modifier leur configuration) | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo systemctl stop dnsmasq | ||
+ | sudo systemctl stop hostapd | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * Configurer l'interface wlan0 pour lui attribuer une ip fixe et l'empêcher de se connecter à un réseau wifi via wpa_supplicant | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo nano /etc/dhcpcd.conf | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * Ajouter dans le fichier: | ||
+ | <pre> | ||
+ | interface wlan0 | ||
+ | static ip_address=10.10.0.1/24 | ||
+ | nohook wpa_supplicant | ||
+ | </pre> | ||
+ | |||
+ | Où l'adresse ip 10.10.0.1 correspond à l'adresse ip de l'interface qui agira comme serveur dhcp | ||
+ | |||
+ | * Sauvegarder le fichier de configuration par défaut de dnsmasq | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * Créer un nouveau fichier de configuration de dnsmask | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo nano /etc/dnsmasq.conf | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * Y insérer les lignes suivantes: | ||
+ | <pre> | ||
+ | interface=wlan0 | ||
+ | dhcp-range=10.10.0.2,10.10.0.20,255.255.255.0,24h | ||
+ | </pre> | ||
+ | Où l'on spécifie que l'interface wifi embarquée sur le Raspberry pourra distribuer des adresses ip à ses clients dans l'intervale entre 10.10.0.2 et 10.10.0.20 | ||
+ | |||
+ | * Créer un fichier de configuration, "/etc/hostapd/hostapd.conf" pour le point d'accès wifi | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo nano /etc/hostapd/hostapd.conf | ||
+ | </syntaxhighlight> | ||
+ | et y insérer le contenu suivant (en adaptant le nom du point d'accès et le mot de passe): | ||
+ | <pre> | ||
+ | interface=wlan0 | ||
+ | driver=nl80211 | ||
+ | ssid=leNomDuPointDAcces | ||
+ | hw_mode=g | ||
+ | channel=7 | ||
+ | wmm_enabled=0 | ||
+ | macaddr_acl=0 | ||
+ | auth_algs=1 | ||
+ | ignore_broadcast_ssid=0 | ||
+ | wpa=2 | ||
+ | wpa_passphrase=LeMotDePasse | ||
+ | wpa_key_mgmt=WPA-PSK | ||
+ | wpa_pairwise=TKIP | ||
+ | rsn_pairwise=CCMP | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | * Indiquer à hostapd le fichier de configuration créé. Ouvrir le fichier "/etc/default/hostapd" | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo nano /etc/default/hostapd | ||
+ | </syntaxhighlight> | ||
+ | Modifier la ligne <code>#DAEMON_CONF=""</code> par <code>DAEMON_CONF="/etc/hostapd/hostapd.conf"</code>. | ||
+ | * Démarrer hostapd et dnsmasq | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo service hostapd start | ||
+ | sudo service dnsmasq start | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Partager la connexion Internet entre deux interfaces réseau== | ||
+ | Pour que les appareils clients puissent accéder à Internet via le point d'accès créé, il faut qu'une interface réseau soit connectée à Internet et partage sa connexion avec l'interface wlan0 (qui sert au point d'accès wifi). Pour cela, on utilise un système de traductions d'adresses; le NAT (Network Address Translation). Concrètement, lorsque le client enverra une requête vers le raspberry sur l'interface wlan0, cette dernière transmettra cette requête sur wlan1 qui l'enverra à l'adresse désignée sur Internet en utilisant sa propre adresse IP. L'appareil à cette adresse enverra sa réponse sur wlan1 qui la retransmettra sur wlan0. | ||
+ | |||
+ | * Modifier le fichier /etc/systcl.conf pour permettre le port forwarding entre les interfaces | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo nano /etc/sysctl.conf | ||
+ | </syntaxhighlight> | ||
+ | Dans ce fichier, enlever le # devant la ligne <pre>net.ipv4.ip_forward=1</pre> | ||
+ | |||
+ | * Puis exécuter la commande suivante | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward" | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Installer et configurer nginx== | ||
+ | * Pour installer nginx, taper | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo apt-get install nginx | ||
+ | </syntaxhighlight> | ||
+ | * Pour modifier la page html par défaut de nginx, créer un fichier index.html à la racine du serveur | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | nano /var/www/html/index.html | ||
+ | </syntaxhighlight> | ||
+ | * Sauver et quitter (ctrl+x) | ||
+ | |||
+ | =Exemples de scripts python= | ||
+ | ==Variables et input== | ||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | name = raw_input("merci de m'indiquer votre prénom ") | ||
+ | print "bonjour %s" % name | ||
+ | nb = int(raw_input("merci de m'indiquer un chiffre ")) | ||
+ | if nb > 5: | ||
+ | print "%d c'est quand même beaucoup %s" % (nb, name) | ||
+ | else: | ||
+ | print "%d c'est pas grand chose %s" % (nb, name) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Import d'un fichier texte et boucle sur liste== | ||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | with open("data.txt", "r") as myfile: | ||
+ | data = myfile.read().replace("\n", "") | ||
+ | |||
+ | for i, letter in enumerate(data): | ||
+ | print i, letter | ||
+ | </syntaxhighlight> | ||
+ | ==Capture d'images avec la raspicam== | ||
+ | <syntaxhighlight lang="python"> | ||
+ | #!/usr/bin/python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | import picamera | ||
+ | from time import sleep | ||
+ | |||
+ | camera = picamera.PiCamera() | ||
+ | i = 0 | ||
+ | try: | ||
+ | while True: | ||
+ | camera.capture("image%s.jpg"%i) | ||
+ | i+=1 | ||
+ | sleep(5) | ||
+ | except KeyboardInterrupt: | ||
+ | print "goodbye!" | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | =Le Raspberry et les ports GPIO= | ||
+ | |||
+ | ==Voir le schéma des ports GPIO== | ||
+ | L'utilitaire gpio permet de voir le schéma des ports sur la raspberry PI, ce qui permet d'identifier les numéros des ports à utiliser, chaque pin ayant un identifiant physique, un numéro de port gpio s'il s'agit d'un port gpio et un numéro "wiring pi". Qui permet de s'y adresser lorsqu'on utilise cette bibliothèque. | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | gpio readall | ||
+ | </syntaxhighlight> | ||
+ | Le résultat de la commande permet de voir que le pin physique 11 correspond au port GPIO17 et au port Wiring PI 0. | ||
+ | |||
+ | ==Contrôler un servo moteur== | ||
+ | Un servo moteur peut se positionner à un angle donné (entre 0 et 180°) en fonction de la durée d'un signal électrique qu'il reçoit. Pour envoyer ce signal, il faut que le Raspberry PI utilise la méthode PWM (Pulse Width Modulation) qui permet précisément d'envoyer un certain pourcentage de signal ON (pourcentage appelé rapport cyclique - duty cycle en anglais) sur une période dont la durée est déterminée par une fréquence. Par exemple, pour une fréquence de 50HZ (qui indique le nombre de périodes sur une seconde), un rapport cyclique de 50% indique que toutes les 1/100 de secondes, le signal sera ON puis OFF alternativement. Si le rapport cyclique est de 10%, tous les 1/50 de secondes, le signal sera à ON pendant 1/50/100*10 (2ms) puis à OFF pendant 1/50/100*90 (18ms). | ||
+ | |||
+ | ===Brancher le servo au RPI=== | ||
+ | Les trois fils du servo doivent être branchés respectivement à un port +5v (fil rouge), à la terre (fil noir) et à un port GPIO (fil blanc ou jaune selon le servo moteur). | ||
+ | |||
+ | ===Définir l'angle du servo moteur avec Python=== | ||
+ | <syntaxhighlight lang="python"> | ||
+ | import RPi.GPIO as GPIO | ||
+ | from time import sleep | ||
+ | |||
+ | GPIO.setmode(GPIO.BOARD) | ||
+ | GPIO.setup(03, GPIO.OUT) | ||
+ | pwm=GPIO.PWM(03, 50) | ||
+ | pwm.start(0) | ||
+ | |||
+ | def SetAngle(angle): | ||
+ | duty = angle / 18 + 2 | ||
+ | GPIO.output(03, True) | ||
+ | pwm.ChangeDutyCycle(duty) | ||
+ | sleep(1) | ||
+ | GPIO.output(03, False) | ||
+ | pwm.ChangeDutyCycle(0) | ||
+ | |||
+ | |||
+ | SetAngle(90) | ||
+ | |||
+ | pwm.stop() | ||
+ | |||
+ | GPIO.cleanup() | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Contrôler une prise Chacon DIO== | ||
+ | ===Brancher un émetteur RF433MHZ au RPI=== | ||
+ | [[Fichier:Rf433-raspberry.jpeg]] | ||
+ | Pour notre exemple, nous utilisons la pin physique 11, GPIO17, Wiring PI 0. | ||
+ | |||
+ | ===Compiler le programme C++ de contrôle de la prise=== | ||
+ | Nous allons utiliser le programme développé par Idleman [http://blog.idleman.fr/raspberry-pi-10-commander-le-raspberry-pi-par-radio/ voir le post du blog], et précisément une version allégée, téléchargeable ici: [http://curlybraces.be/ressources/chacon_send.zip] que nous allons compiler: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ -o chacon_send chacon_send.cpp -lwiringPi | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | On obtient le fichier exécutable "chacon_send" qui va nous permettre d'allumer et d'éteindre une prise chacon. | ||
+ | |||
+ | ===Configurer une prise Chacon avec le programme compilé=== | ||
+ | Les messages envoyés aux prises doivent tous comporter un code unique, mot de passe qui permet de prendre le contrôle de la prise, un identifiant allant de 1 à 3 qui permet de choisir une prise à contrôler si plusieurs prises sont accessibles par le signal, et un message "on" ou "off". Pour définir le mot de passe et l'identifiant de la prise, il faut envoyer à la prise une commande "on" et une commande "off" directement après le branchement contenant ces informations. | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo ./chacon_send 0 12325261 1 on | ||
+ | sudo ./chacon_send 0 12325261 1 off | ||
+ | </syntaxhighlight> | ||
− | + | Où 0 est le numéro du port Wiring PI, 1234561 le code de la prise que l'on définit et 1 l'identifiant de la prise. | |
− | |||
− | |||
− | |||
− |
Version actuelle datée du 23 juillet 2019 à 20:30
Notes d'introduction
Objectif de cette page
Cette page a pour objectif de rassembler différentes "recettes" techniques propres à l'utilisation d'un Raspberry Pi. Elle constitue un support pour les cours et formations relatifs aux Raspberry Pi donnés notamment à l'ERG (Ecole de Recherche Graphique, Bruxelles) et à iMAL (Center for digital cultures and technology). Si beaucoup de ces recettes peuvent convenir à d'autres appareils et d'autres systèmes d'exploitation, cette page se focalise sur des manipulations précises liées à une version précise d'un appareil précis (qui utilise un système d'exploitation précis), en l'occurence l'appareil et le système d'exploitation énoncés ci-dessous.
Spécificités techniques
Les recettes présentes sur cette page sont liées au Raspberry Pi 3B, 3B+ ou 4B avec le système d'exploitation Raspbian Buster.
Configurer le Raspberry Pi
Préparer la carte SD
- Télécharger la dernière version de Raspbian ici: [1]
Flasher la carte en utilisant l'outil Etcher avec Linux, Mac OS ou Windows
- Télécharger Etcher ici: [2]
- Lancer Etcher
- Insérer la carte SD dans l'ordinateur (ou dans un lecteur de carte externe)
- Sélectionner l'image disque de Raspbian téléchargée
- Sélectionner le disque à flasher
- Cliquer sur "Flash"
Flasher la carte en utilisant l'outil dd avec Linux ou Mac OS
- Décompresser le fichier zip contenant l'image de Raspbian à flasher sur la carte. Le fichier résultant doit avoir l'extension .img.
- Ouvrir le terminal de l'ordinateur
- Identifier les lecteurs de disques connectés à l'ordinateur
lsblk
- Insérer la carte sd et lancer à nouveau la commande lsblk. Un élément supplémentaire devrait apparaitre, il s'agit de la carte sd, dont la référence est affichée (exemple: /dev/mmcblk0)
- Insérer la commande suivante en prenant soin de remplacer l'adresse de l'image de Raspbian (après if=) et l'adresse de la carte sd (après of=).
dd bs=4M if=2018-04-18-raspbian-stretch.img of=/dev/mmcblk0 status=progress conv=fsync
Configurer le Raspberry Pi pour une connexion distante
Il est tout à fait possible d'utiliser le Raspberry PI en le branchant à un écran, un clavier et une souris mais la possibilité d'y accéder à distance via un autre ordinateur faisant office de terminal se révèle plus intéressant dans une majorité d'usages. Pour que cet accès soit possible, il faut que l'ordinateur serveur (le Raspberry) et l'ordinateur client (le terminal, donc un autre ordinateur Mac ou PC) soient connectés entre eux; soit par un réseau local (via WIFI ou ethernet) soit par un cable ethernet qui relie directement les deux appareils. Pour éviter de devoir assigner une adresse IP fixe au Raspberry PI et de devoir retenir une adresse, il est possible d'assigner un nom au Raspberry par lequel il sera connu au sein du réseau. Pour que la reconnaissance du nom fonctionne, il faut que le paquet avahi-daemon soit installé sur le Raspberry (c'est le cas par défaut pour les versions les plus récentes de Raspbian). Et que "bonjour" (Windows) ou avahi-daemon (Linux) soit installé sur l'ordinateur. Enfin, pour pouvoir se connecter au Raspberry PI à partir d'un ordinateur fonctionnant avec Windows, il faut installer l'émulateur de terminal et client SSH Putty: [3]
Autoriser l'accès distant SSH
Avant de mettre la carte SD dans le Raspberry, il faut que le système d'exploitation accepte une connexion distante via le protocole SSH (qui est le protocole que nous utiliserons pour accèder au Raspberry via un autre ordinateur). Pour cela, il faut ajouter un fichier vide nommé
ssh
sur la carte SD, à la racine de la partition BOOT.
Configurer l'accès à un réseau wifi avant de démarrer le Raspberry PI
Si nous voulons qu'au démarrage, le Raspberry PI se connecte automatiquement à un réseau WIFI particulier (et devienne du coup accessible à n'importe quel appareil connecté au même réseau WIFI), il faut ajouter dans la partition BOOT un fichier nommé wpa_supplicant.conf
, contenant les informations de connexion au réseau:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=BE network={ ssid="réseau wifi" psk="mot de passe wifi" key_mgmt=WPA-PSK }
Ce fichier sera déplacé au démarrage du Raspberry dans le répertoire /etc/wpa_supplicant/
.
Modifier le nom du Raspberry PI
Il s'agit du nom qui sera utilisé sur le réseau local auquel le Raspberry PI se connectera. Par défaut il s'agit de raspberrypi
. Pour pouvoir le modifier avant le démarrage, il faut accéder au système de fichier de Raspbian installé sur la carte SD, sur la partition rootfs
. Le problème c'est que cette partition est formatée dans un format propre à Linux; ext4. Il est donc très facile de le faire via un ordinateur fonctionnant avec Linux mais impossible avec Mac OS ou Windows sans installer de programme supplémentaire. Dans ce cas, il faut démarrer une première fois le Raspberry, y accéder via le programme terminal sous Mac OS ou Putty sous Windows en utilisant le nom par défaut: raspberrypi, modifier le nom et redémarrer. Sinon, via Linux, il suffit de modifier ce nom dans deux fichiers de la partition rootfs
.
Avec Linux, dans la partition rootfs de la carte SD (avant de démarrer le RPI)
Les deux fichiers à modifier sont /etc/hostname et /etc/hosts. Pour les modifier via le terminal:
- Ouvrir le terminal
- Naviguer jusqu'au dossier "etc" de la partition root de la carte SD
cd /media/utilisateur/root/etc/
- Modifier le fichier "hosts" en tapant
sudo nano hosts
- Modifier le nom du raspberry à la fin du fichier, donc remplacer
127.0.1.1 raspberrypi
par
127.0.1.1 lenomdevotreraspberry
- Sauvegarder et quitter (Ctrl + x)
- Modifier le fichier "hostname" en tapant
sudo nano hostname
- Modifier le nom du raspberry à la fin du fichier, donc remplacer
raspberrypi
par
lenomdevotreraspberry
- Sauvegarder et quitter (Ctrl + x)
Avec Mac OS ou Windows, en se connectant une première fois au RPI via SSH
- Sur Mac OS, ouvrir le programme Terminal et taper
ssh pi@raspberrypi.local
- Sur Windows, ouvrir PUTTY et entrer comme nom d'hôte
raspberrypi
. Cliquer sur "ouvrir". Lorsque le nom d'utilisateur est demandé, entrer "pi". - Lorsque le mot de passe est demandé, entrer "raspberry".
- Si le système demande une confirmation avant de faire la connexion, confirmer en entrant "y".
- Une fois connecté, se déplacer dans le dossier "/etc".
- Modifier le fichier "hosts" en tapant
sudo nano hosts
- Modifier le nom du raspberry à la fin du fichier, donc remplacer
127.0.1.1 raspberrypi
par
127.0.1.1 lenomdevotreraspberry
- Sauvegarder et quitter (Ctrl + x)
- Modifier le fichier "hostname" en tapant
sudo nano hostname
- Modifier le nom du raspberry à la fin du fichier, donc remplacer
raspberrypi
par
lenomdevotreraspberry
- Sauvegarder et quitter (Ctrl + x)
- Redémarrer le Raspberry PI
sudo reboot now
Mettre à jour les logiciels
- Dans le terminal, taper
sudo apt-get update
La commande met à jour la base de données locale des logiciels disponibles en téléchargeant les bases de données de paquets dont les adresses se trouvent dans le fichier /etc/apt/sources.list et les fichiers contenus dans /etc/apt/sources.list.d
- Taper ensuite
sudo apt-get upgrade
pour mettre à jour tous les logiciels installés sur le raspberry.
- Taper enfin
sudo apt-get dist-upgrade
pour mettre à jour la version de Raspbian si nécessaire.
Changer le mot de passe de l'utilisateur [facultatif]
L'utilisateur par défaut se nomme "pi". Pour changer son mot de passe, taper dans le terminal la commande
passwd
et suivre les instructions.
Installer et configurer Samba [facultatif]
Samba va permettre de partager les dossiers du raspberry sur le réseau pour pouvoir y accéder via le navigateur de fichiers de votre ordinateur.
- Dans le terminal, taper
sudo apt-get install samba samba-common-bin
- Ouvrir le fichier de configuration de samba en tapant
sudo nano /etc/samba/smb.conf
- Modifier la ligne
wins support = no
en
wins support = yes
- Ajouter les lignes suivantes à la fin du fichier
[pihome] comment=home pi path=/home/pi browseable=Yes writeable=Yes only guest=no create mask=0775 directory mask=0775 public=no
- Sauver le fichier et quitter (ctrl+x)
- Ajouter l'utilisateur pi comme utilisateur samba
sudo smbpasswd -a pi
Installer et configurer un bureau à distance [facultatif]
Installer le serveur du bureau à distance sur le raspberry
- Installer "tightvncserver":
sudo apt-get install tightvncserver
- Lancer "tightvncserver"
tightvncserver
Entrer un mot de passe demandé. Le bureau distant a normalement été créé à l'adresse :1, :0 étant l'adresse du bureau par défaut sur le raspberry.
- Pour éteindre le bureau par défaut, taper
service lightdm stop
- Pour éteindre un bureau créé aevec tightvncserver, taper
vncserver -kill :1
où :1 est l'adresse du bureau que vous désirez arrêter.
(Linux) Se connecter via l'ordinateur client
- Chercher l'application (ou installer via
apt-get
si nécessaire) "remote desktop viewer" (Vinagre pour Gnome, krdc pour KDE) - Ouvrir l'application et dans le champs "host" taper l'adresse du raspberry suivie de l'adresse de l'écran (exemple:
lenomdevotreraspberry.local:1
). Spécifier "VNC" comme protocole de connexion et cliquer sur "connect".
(Mac OS) Se connecter via l'ordinateur client
- Dans le menu du Finder, cliquer sur "Aller " puis "Se connecter au serveur", puis entrer l'adresse du raspberry précédée de "vnc://", par exemple:
vnc://lenomdevotreraspberry.local:1
(Windows) Se connecter via l'ordinateur client
- Télécharger "tightvnc" à l'adresse http://www.tightvnc.com/download.php et l'installer.
- Ouvrir l'application et dans le champs "host" taper l'adresse du raspberry suivie de l'adresse de l'écran (exemple:
lenomdevotreraspberry.local:1
). Cliquer sur "connect".
Lire une vidéo
Le lecteur vidéo par défaut installé sur Raspbian se nomme omxplayer. Il peut être exécuté à distance, sans nécessairement de session de bureau active sur le raspberry. Pour lire une vidéo, taper dans le terminal:
omxplayer --loop --no-osd lefichier.mp4
Créer des scripts bash et automatiser leur exécution
Créer un script de base qui s'exécutera à chaque démarrage du raspberry
Le script bash que nous allons réaliser envoie du texte dans un fichier à chaque exécution.
Insérer du texte dans un fichier
- Créer un fichier "messages" qui contiendra le texte
touch messages
- Tester l'envoi de texte dans le fichier
echo "test" >> messages
- Afficher le contenu du fichier
cat messages
Créer un fichier contenant la commande d'insertion du texte
- Créer un nouveau fichier
nano hello.sh
- Y insérer l'entête qui indique le programme qui doit l'interpréter et la commande
#!/bin/bash
echo "hello" >> /home/pi/messages
exit 0
- Sauver et quitter le fichier (ctrl + x)
- Rendre le fichier exécutable
chmod +x hello.sh
- Tester son exécution
./hello.sh
Exécuter le script créé à chaque démarrage du raspberry
- Il s'agit de modifier le fichier "/etc/rc.local" pour y ajouter l'adresse du script juste avant la ligne "exit 0"
sudo nano /etc/rc.local
- La fin du fichier doit ressembler à ceci:
/home/pi/hello.sh &
exit 0
Créer un script d'envoi d'email qui s'exécutera à chaque connexion au wifi
Le script bash que nous allons réaliser envoie un email à chaque exécution.
Installer et configurer les outils nécessaires
- Installer les paquets nécessaires
sudo apt-get install mailutils mpack ssmtp
- Configurer ssmtp avec les informations de connexion à un serveur smtp
sudo nano /etc/ssmtp/ssmtp.conf
Exemple de configuration pour envoyer les mails à partir d'une adresse gmail
root=utilisateur@gmail.com mailhub=smtp.gmail.com:587 hostname=lionel AuthUser=utilisateur@gmail.com AuthPass=motdepasse FromLineOverride=YES UseTLS=YES UseSTARTTLS=YES
- Pour les adresses gmail, il est possible de devoir effectuer des étapes supplémentaires; voir ici: https://support.google.com/mail/answer/78754?hl=en
Envoyer un mail via une ligne de commande
echo "Contenu du mail" | mail -s "Titre du mail" destinataire@gmail.com
Créer un fichier contenant la commande d'envoi d'un email
- Créer un nouveau fichier
nano email.sh
- Y insérer la commande l'entête qui indique le programme qui doit l'interpréter et la commande d'envoi d'email
#!/bin/bash
echo "Contenu du mail" | mail -s "Titre du mail" destinataire@gmail.com
exit 0
- Sauver et quitter le fichier (ctrl + x)
- Rendre le fichier exécutable
chmod +x email.sh
- Tester son exécution
./email.sh
Exécuter le script créé à chaque connexion au réseau wifi
Puisque notre script a besoin de la connexion pour fonctionner, il faut qu'il s'exécute au moment où cette connexion est disponnible et non directement au démarrage du raspberry.
- Copier le script dans le répertoire "/etc/network/if-up.d"
sudo mv email.sh /etc/network/if-up.d/email
- Modifier le script pour qu'il n'envoie pas de mail si une autre interface réseau que le wifi se connecte et pour qu'il attende quelques secondes après l'activation du wifi (pour l'obtention d'une adresse ip) avant d'envoyer un email.
#!/bin/bash
if [ "$IFACE" != "wlan0" ];then
exit 0
fi
sleep 10
echo "Contenu du mail" | mail -s "Titre du mail" destinataire@gmail.com
exit 0
Planifier l'exécution d'un script avec crontab
Crontab permet l'exécution planifiée d'un script, c'est à dire programmer l'exécution d'un script pour qu'elle ait lieu toutes les x minutes/x heures/x jours du mois/x mois/x jours de la semaine.
- Pour éditer le crontab de l'utilisateur courant (pi), il faut taper la commande:
crontab -e
- Chaque ligne de ce fichier correspond à une commande planifiée. Par exemple, pour exécuter toutes les 5 minutes notre script /home/pi/hello.sh, il faut ajouter la ligne
5 * * * * /home/pi/hello.sh
à la fin du fichier. Les règles pour écrire la planification sont indiquées au début du fichier crontab.
- Sauver et quitter (ctrl+x)
Convertir un script en démon avec systemd
- Créer un script (ici un script python) qui tournera en boucle
nano /home/pi/daemon.py
par exemple:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from time import sleep
try:
while True:
with open("test.txt", "a") as myfile:
myfile.write("patatras ")
time.sleep(5)
except KeyboardInterrupt:
print "goodbye!"
- Créer un nouveau fichier de configuration de systemd
sudo nano /lib/systemd/system/daemon.service
[Unit] Description=Test script After=multi-user.target [Service] Type=idle ExecStart=/usr/bin/python /home/pi/daemon.py [Install] WantedBy=multi-user.target
- Changer les droits d'accès de ce fichier
sudo chmod 644 /lib/systemd/system/daemon.service
- Mettre à jour systemd avec ce nouveau fichier
sudo systemctl daemon-reload
sudo systemctl enable daemon.service
- Redémarrer le raspberry
sudo reboot now
Convertir son raspberry en point d'accès wifi
Le but est ici de transformer le raspberry pi en un point d'accès wifi accessible sur n'importe quel matériel (smartphone, tablette ou ordinateur), de partager la connexion Internet branchée sur le Raspberry et d'afficher son propre contenu dans le navigateur web de l'appareil connecté. Pour cela, il faut dédier l'interface wifi du Raspberry à la diffusion du réseau. Si l'on veut partager une connexion Internet aux appareils connectés à ce réseau, il faut utiliser une autre interface; soit une clé wifi supplémentaire, soit le port ethernet du Raspberry.
Installer et configurer hostapd et dnsmasq
- Installer "hostapd et dnsmasq", le premier servira à configurer le point d'accès wifi et le second servira à distribuer des adresses ip (via dhcp):
sudo apt-get install dnsmasq hostapd
- Éteindre les deux services installés (pour modifier leur configuration)
sudo systemctl stop dnsmasq
sudo systemctl stop hostapd
- Configurer l'interface wlan0 pour lui attribuer une ip fixe et l'empêcher de se connecter à un réseau wifi via wpa_supplicant
sudo nano /etc/dhcpcd.conf
- Ajouter dans le fichier:
interface wlan0 static ip_address=10.10.0.1/24 nohook wpa_supplicant
Où l'adresse ip 10.10.0.1 correspond à l'adresse ip de l'interface qui agira comme serveur dhcp
- Sauvegarder le fichier de configuration par défaut de dnsmasq
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
- Créer un nouveau fichier de configuration de dnsmask
sudo nano /etc/dnsmasq.conf
- Y insérer les lignes suivantes:
interface=wlan0 dhcp-range=10.10.0.2,10.10.0.20,255.255.255.0,24h
Où l'on spécifie que l'interface wifi embarquée sur le Raspberry pourra distribuer des adresses ip à ses clients dans l'intervale entre 10.10.0.2 et 10.10.0.20
- Créer un fichier de configuration, "/etc/hostapd/hostapd.conf" pour le point d'accès wifi
sudo nano /etc/hostapd/hostapd.conf
et y insérer le contenu suivant (en adaptant le nom du point d'accès et le mot de passe):
interface=wlan0 driver=nl80211 ssid=leNomDuPointDAcces hw_mode=g channel=7 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=LeMotDePasse wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
- Indiquer à hostapd le fichier de configuration créé. Ouvrir le fichier "/etc/default/hostapd"
sudo nano /etc/default/hostapd
Modifier la ligne #DAEMON_CONF=""
par DAEMON_CONF="/etc/hostapd/hostapd.conf"
.
- Démarrer hostapd et dnsmasq
sudo service hostapd start
sudo service dnsmasq start
Partager la connexion Internet entre deux interfaces réseau
Pour que les appareils clients puissent accéder à Internet via le point d'accès créé, il faut qu'une interface réseau soit connectée à Internet et partage sa connexion avec l'interface wlan0 (qui sert au point d'accès wifi). Pour cela, on utilise un système de traductions d'adresses; le NAT (Network Address Translation). Concrètement, lorsque le client enverra une requête vers le raspberry sur l'interface wlan0, cette dernière transmettra cette requête sur wlan1 qui l'enverra à l'adresse désignée sur Internet en utilisant sa propre adresse IP. L'appareil à cette adresse enverra sa réponse sur wlan1 qui la retransmettra sur wlan0.
- Modifier le fichier /etc/systcl.conf pour permettre le port forwarding entre les interfaces
sudo nano /etc/sysctl.conf
Dans ce fichier, enlever le # devant la ligne
net.ipv4.ip_forward=1
- Puis exécuter la commande suivante
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
Installer et configurer nginx
- Pour installer nginx, taper
sudo apt-get install nginx
- Pour modifier la page html par défaut de nginx, créer un fichier index.html à la racine du serveur
nano /var/www/html/index.html
- Sauver et quitter (ctrl+x)
Exemples de scripts python
Variables et input
#!/usr/bin/python
# -*- coding: utf-8 -*-
name = raw_input("merci de m'indiquer votre prénom ")
print "bonjour %s" % name
nb = int(raw_input("merci de m'indiquer un chiffre "))
if nb > 5:
print "%d c'est quand même beaucoup %s" % (nb, name)
else:
print "%d c'est pas grand chose %s" % (nb, name)
Import d'un fichier texte et boucle sur liste
#!/usr/bin/python
# -*- coding: utf-8 -*-
with open("data.txt", "r") as myfile:
data = myfile.read().replace("\n", "")
for i, letter in enumerate(data):
print i, letter
Capture d'images avec la raspicam
#!/usr/bin/python
# -*- coding: utf-8 -*-
import picamera
from time import sleep
camera = picamera.PiCamera()
i = 0
try:
while True:
camera.capture("image%s.jpg"%i)
i+=1
sleep(5)
except KeyboardInterrupt:
print "goodbye!"
Le Raspberry et les ports GPIO
Voir le schéma des ports GPIO
L'utilitaire gpio permet de voir le schéma des ports sur la raspberry PI, ce qui permet d'identifier les numéros des ports à utiliser, chaque pin ayant un identifiant physique, un numéro de port gpio s'il s'agit d'un port gpio et un numéro "wiring pi". Qui permet de s'y adresser lorsqu'on utilise cette bibliothèque.
gpio readall
Le résultat de la commande permet de voir que le pin physique 11 correspond au port GPIO17 et au port Wiring PI 0.
Contrôler un servo moteur
Un servo moteur peut se positionner à un angle donné (entre 0 et 180°) en fonction de la durée d'un signal électrique qu'il reçoit. Pour envoyer ce signal, il faut que le Raspberry PI utilise la méthode PWM (Pulse Width Modulation) qui permet précisément d'envoyer un certain pourcentage de signal ON (pourcentage appelé rapport cyclique - duty cycle en anglais) sur une période dont la durée est déterminée par une fréquence. Par exemple, pour une fréquence de 50HZ (qui indique le nombre de périodes sur une seconde), un rapport cyclique de 50% indique que toutes les 1/100 de secondes, le signal sera ON puis OFF alternativement. Si le rapport cyclique est de 10%, tous les 1/50 de secondes, le signal sera à ON pendant 1/50/100*10 (2ms) puis à OFF pendant 1/50/100*90 (18ms).
Brancher le servo au RPI
Les trois fils du servo doivent être branchés respectivement à un port +5v (fil rouge), à la terre (fil noir) et à un port GPIO (fil blanc ou jaune selon le servo moteur).
Définir l'angle du servo moteur avec Python
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
GPIO.setup(03, GPIO.OUT)
pwm=GPIO.PWM(03, 50)
pwm.start(0)
def SetAngle(angle):
duty = angle / 18 + 2
GPIO.output(03, True)
pwm.ChangeDutyCycle(duty)
sleep(1)
GPIO.output(03, False)
pwm.ChangeDutyCycle(0)
SetAngle(90)
pwm.stop()
GPIO.cleanup()
Contrôler une prise Chacon DIO
Brancher un émetteur RF433MHZ au RPI
Pour notre exemple, nous utilisons la pin physique 11, GPIO17, Wiring PI 0.
Compiler le programme C++ de contrôle de la prise
Nous allons utiliser le programme développé par Idleman voir le post du blog, et précisément une version allégée, téléchargeable ici: [4] que nous allons compiler:
g++ -o chacon_send chacon_send.cpp -lwiringPi
On obtient le fichier exécutable "chacon_send" qui va nous permettre d'allumer et d'éteindre une prise chacon.
Configurer une prise Chacon avec le programme compilé
Les messages envoyés aux prises doivent tous comporter un code unique, mot de passe qui permet de prendre le contrôle de la prise, un identifiant allant de 1 à 3 qui permet de choisir une prise à contrôler si plusieurs prises sont accessibles par le signal, et un message "on" ou "off". Pour définir le mot de passe et l'identifiant de la prise, il faut envoyer à la prise une commande "on" et une commande "off" directement après le branchement contenant ces informations.
sudo ./chacon_send 0 12325261 1 on
sudo ./chacon_send 0 12325261 1 off
Où 0 est le numéro du port Wiring PI, 1234561 le code de la prise que l'on définit et 1 l'identifiant de la prise.