Hello World : allumer une lumière

dsc_0017

Comme deuxième étape, il me semble naturel de forger un « Bonjour le monde » traditionnel puisqu’il s’agit d’un nouvel environnement. Mon choix s’est arrêté à essayer d’allumer une lumière avec le Raspberry Pi. Opération qu’il me semble relativement simple à accomplir. Effectuer cet exploit permettra de comprendre le principe des branchements sur un breadboard, d’introduire le principe des GPIO, de manipuler du code Python exécuté sur le Pi pour interagir avec un composant sur le breadboard (la lumière).

Objectifs

  • Allumer une lumière sur un breadboard depuis un script Python exécuté sur le Raspberry Pi.

Équipements

  • Lumière DEL rouge (5mm 1.85-2.5v @20mA)
  • 1 résistance 220 ohm (5%)
  • 2 jumper wires (male – femelle)
  • Demi breadboard

dsc_0007

Le breadboard est une plaquette où il est possible de brancher des composantes électroniques sans avoir à souder. Idéal pour le prototypage. Cette plaque se diviser en deux fonctionnalités : des rangées pour le courant (+, -) [rangées A et D sur le schéma] et une grille pour les composantes [colonnes B et C sur le schéma].

basic_breadboard_layout

La zone pour le courant est organisée de façon horizontale. C’est-à-dire que si un des « trous » de la rangée du ground (-) reçoit effectivement du ground, toute la rangée sera alimentée. Ainsi, les composants, qui vont se trouver plus dans la partie centrale de la plaque, pourront se brancher vers la rangée du ground en question pour s’alimenter.

La grille utilisable pour les composants [colonnes B et C sur le schéma] est organisée de façon verticale. Les deux zones sont par contre indépendantes l’une de l’autre. L’idée est donc d’installer un composant sur la grille et de faire les connexions nécessaires avec la source de courant et les pins GPIO requises. Il est nécessaire de bien lire la documentation d’un composant pour comprendre comment le branchement doit s’effectuer.

Pour effectuer ses branchements, on utilise des câbles (jumper wires) qui permettent de s’insérer sans difficulté dans la plaque. C’est de cette façon qu’on relie des pins GPIO avec un composant brancher sur le breadboard.

Premier branchement

Dans un premier temps, il faut apporter le ground sur le breadboard en utilisant un câble qui part d’une pin GPIO GRN (ground) vers un trou sur la bande négative de la plaquette. Il peut s’agir de n’importe lequel trou ! Aussitôt qu’un trou est alimenté, la ligne complète est alimentée. Idéalement, on utilise un câble noir.

dsc_0010

La première difficulté se trouve à figurer quelle-est la pin sur le Raspberry Pi qui correspond au ground. Il n’y a pas de miracle, il suffit de consulter le plan officiel.

image

On peut donc voir qu’il y a plusieurs pins qui octroi du ground. Pour ma part, j’ai choisi la 3e pin du haut puisqu’elle était bien placée selon mon organisation. Maintenant, la bande négative est alimentée ! Au niveau conceptuel du moins puisque le Pi n’est pas encore alimenté.

Branchement de la lumière

On ajoute à présent la lumière sur la plaque. Peu importe l’endroit. La lumière est formée de deux connexions (une petite patte et une patte plus longue). La petite patte doit être reliée à la bande négative et l’autre vers une pin GPIO numérotée qui pourra être interfacé plus tard avec Python.

Attention ! Il faut protéger notre équipement avec une résistance entre la petite patte de la lumière et le ground. C’est pourquoi on utilise un résistor pour relier la petite patte à la bande négative plutôt qu’un câble directement.

dsc_0012

Une fois ce branchement effectué, on fait une connexion entre la grande patte et une pin GPIO libre numérotée. Dans mon cas, il s’agit de la pin #18 qui se trouve à être la 6e pin du haut.

dsc_0015

Premier script Python

Maintenant, on peut brancher l’alimentation du Pi et se connecter pour créer un premier script Python. L’idée de ce script est de simplement allumer la lumière pendant quelques secondes et de l’éteindre en envoyant ou non du signal vers notre pin GPIO sélectionnée (dans mon cas #18). Il suffit de créer un nouveau fichier (led.py) et de l’éditer.

import RPi.GPIO as GPIO, time
GPIO.setmode(GPIO.BCM)
GPIO.setwarning(False)
GPIO.setup(18, GPIO.OUT)

GPIO.output(18, True)
time.sleep(3)
GPIO.output(18, False)

Une fois terminée, on lance le script avec la commande python led.py et la lumière s’allume pour 3 secondes ! Maintenant, l’explication du code …

La première ligne (import RPi.GPIO ...) indique simplement à Python d’inclure les bibliothèques indiquées. Dans notre cas, une bibliothèque qui permet la manipulation des pins GPIO et une qui permet des manipulations du temps (nécessaire pour sleep).

La ligne GPIO.setmode(BCM) indique la façon dont nous allons identifier les pins dans le code. Il existe deux façons : BOARD et BCM. BOARD signifie simplement que les pins utilisées seront identifiées selon le numéro de la pin qui symbolise son emplacement (dans notre cas, il s’agit de l’emplacement numéro 12). BCM signifie que les pins seront identifiées suivant les nombres « Broadcom SOC channel ». Ces nombres correspondent simplement au numéro des pins GPIO (dans notre cas, la pin #18). L’image précédente de la carte qui montre l’organisation des pins illustre bien les deux types de numéros.

La ligne suivante GPIO.setwarning(False) permet simplement de ne pas afficher les avertissements dans la console. La ligne GPIO.setup(18, GPIO.OUT) prépare simplement la pin #18 (identifiée suivant BCM) pour recevoir un signal.

L’instruction GPIO.output(18, True) permet d’envoyer un signal vers une pin préparée en sortie. time.sleep(3) permet simplement de mettre le script en attente pendant 3 secondes et finalement GPIO.output(18, False) arrête l’envoi du signal vers la pin #18.

Références :

Installation de Raspbian

dsc_0003

La première étape du projet consiste à installer le système d’exploitation Raspbian sur la carte SD qui sera utilisé pour le Raspberry Pi. Ce système d’exploitation est basé sur la distribution Debian. La carte SD joue alors le rôle du « disque de démarrage ». Une fois la distribution installée, il faut configurer le système de façon à avoir un accès SSH. De plus, cet accès doit être possible depuis une connexion par Ethernet entre le Raspberry Pi et un ordinateur pour simplifier au maximum l’interactivité.

Objectifs

  • Installer Raspbian sur une carte SD ;
  • Sécurisation des comptes de Raspbian ;
  • Configuration de Raspbian pour permettre la connexion SSH lorsque le Raspberry Pi est connecté avec l’ordinateur par un câble Ethernet.

Téléchargement de Raspbian

Sans surprise, la première étape consiste à télécharger le système d’exploitation. Pour se faire, il suffit de se rendre sur la page https://www.raspberrypi.org/downloads/raspbian/ puis de choisir la dernière version disponible (dans mon cas, 2016-05-27). Il existe deux versions disponibles : FULL et LITE.

capture-decran-2016-09-06-a-13-34-22

La version complète (FULL) inclut plusieurs utilitaires de base ainsi que l’interface graphique. La version plus légère (LITE) n’a pratiquement aucun utilitaire de base et n’a surtout pas d’interfaces graphiques. Il est recommandé de prendre la version LITE puisque le système d’exploitation doit idéalement être le plus minimal possible pour accroitre au maximum les performances.

Installation sur la carte SD

Une fois Raspbian téléchargé, décompresser le fichier pour en extraire l’image (.img). Le site officiel offre un guide d’installation pour les différentes plateformes. Pour l’installation sous Mac OS, il faut ouvrir le terminal et exécuter certaines commandes pour bruler l’image sur la carte SD.

diskutil list

La commande précédente affiche tous les disques de l’ordinateur. Il faut identifier la carte SD (le disque et non la partition) parmi les disques affichés. Dans mon cas, il s’agit de disk2. Il faut ensuite démonter le disque identifié en vue de son formatage avec la commande suivante.

diskutil unmountDisk /dev/disk2

La prochaine commande permet de copier les données vers la carte SD.

sudo dd bs=1m if=/path/to/raspbian-jessie-lite.img of=/dev/rdisk2

Une fois la commande terminée, la dernière commande permet d’éjecter la carte SD en toute sécurité.

sudo diskutil eject /dev/rdisk2

Configuration initiale de Raspbian

Dans un premier temps, il faut retirer la carte SD de l’ordinateur pour l’insérer à l’endroit prévu sur le Raspberry Pi. Il n‘y a qu’un sens possible.

dsc_0006

Il faut ensuite connecter le câble réseau et l’alimentation. Le Raspberry Pi démarre. Le Pi est branché par Ethernet pour faciliter son accès par SSH. De cette façon, il n’est pas nécessaire de brancher un clavier et un moniteur. Ultérieurement, le développement Python s’effectuera à distance suivant cette même technique.

Pour se faire, l’ordinateur Mac auquel le Pi est branché par Ethernet doit effectuer un partage Internet via Ethernet. Ce dernier est connecté sur Internet par le sans-fil. Lors de ce type de configuration, le Mac créé un réseau entre le Pi et lui-même. La commande ifconfig permet de consulter les différentes configurations réseau du poste et on peut apercevoir bridge100 comme interface supplémentaire avec les informations suivantes :

bridge100:          
flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> ...
     options=3<RXCSUM,TXCSUM>
     ether aa:20:66:11:85:64                                 
inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
     inet6 fe80::a820:66ff:fe11:8564%bridge100 prefixlen 64
     Configuration:
          id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
          maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
          root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
          ipfilter disabled flags 0x2
     member: en0 flags=3<LEARNING,DISCOVER>
             ifmaxaddr 0 port 4 priority 0 path cost 0
     nd6 options=1<PERFORMNUD>
     media: autoselect
     status: active

On note donc que le sous-réseau est 192.168.2.x. Il ne reste plus qu’à déterminer l’adresse IP assignée automatiquement au Raspberry Pi qui devrait être près du .2. On peut faire une série de ping. Dans mon cas, le Pi répond à l’adresse 192.168.2.2.

Une fois l’adresse en possession, il est possible de lancer une connexion SSH sur le Pi en utilisant l’utilisateur par défaut : pi.

ssh pi@192.168.2.2

L’invite de commandes demande alors d’entrer le mot de passe. Par défaut, il s’agit de raspberry.

Configuration des comptes

La première manipulation sur le système d’exploitation est de modifier les utilisateurs pour remplacer les accès par défaut connu de tous. Dans un premier temps, je crée un nouvel utilisateur dtucker qui sera mon compte principal.

sudo adduser dtucker
Adding user `dtucker' ...
Adding new group `dtucker' (1001) ...
Adding new user `dtucker' (1001) with group `dtucker' ...
Creating home directory `/home/dtucker' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for dtucker
Enter the new value, or press ENTER for the default
     Full Name []: David Tucker
     Room Number []:
     Work Phone []:
     Home Phone []:
     Other []:
Is the information correct? [Y/n] Y

On ajoute également le nouvel utilisateur dans les privilèges de sudo avec la commande sudo visudo. Il suffit d’ajouter une ligne identique à celle de root pour le nouvel utilisateur.

# User privilege specification
root        ALL=(ALL:ALL) ALL
dtucker     ALL=(ALL:ALL) ALL

On quitte ensuite la session de l’utilisateur par défaut pi (exit) pour s’authentifier avec le nouveau complet. Une fois authentifié avec le nouveau compte, on supprime le compte par défaut avec la commande sudo deluser --remove-home pi. Finalement, pour activer le compte root, il suffit de lui attribuer un mot de passe au besoin avec la commande sudo passwd root.

Références :