ICN mode d'emploi Raspberry Pi

De Informatique et Création Numérique
(Différences entre les versions)
Aller à : Navigation, rechercher
(Page créée avec « = Configuration du système embarqué = Pour contrôler certains projets vous utiliserez un ordinateur miniature Raspberry Pi 3. Cet ordinateur doit être configuré comm... »)

Version du 24 février 2017 à 23:47

Sommaire

Configuration du système embarqué

Pour contrôler certains projets vous utiliserez un ordinateur miniature Raspberry Pi 3. Cet ordinateur doit être configuré comme un point d'accès WiFi pour permettre une connexion à partir d'un téléphone intelligent.

Il existe au moins deux méthode de se connecter sur la Raspberry PI 3 pour la configurer. La première méthode est la méthode "grand public" en utilisant la carte graphique intégrée sur la Raspberry et en lui connectant écran, clavier et souris. La seconde méthode est plus spartiate et traditionnellement utilisée dans le monde des systèmes embarqués : la connexion par liaison série.

Connexion en mode "grand public"

Dans le cadre de l'ICN vous utiliserez la méthode grand public avec un adaptateur HDMI/SVGA, un clavier USB et une souris USB. Si le système de la Raspberry Pi est non encore configuré, vous devez simplement indiquer que vous utilisez un clavier français et que vous souhaitez démarrer en mode graphique.

Mise à jour de la distribution

La distribution Raspbian vient avec le système de démarrage systemd. Ce système n'est pas forcément adapté à l'usage que nous souhaitons faire de la Raspberry : utilisation en tant que système embarqué et manipulation en mode texte. Il est assez simple de supprimer, en tant qu'administrateur, le paquetage systemd ainsi que deux autres paquetages qui tentent de gérer automatiquement la configuration réseau dhcpcd5 et openresolv :

apt-get purge dhcpcd5 openresolv 
apt-get purge systemd 

Attention pour que la seconde commande fonctionne, il faut que la Raspberry Pi puisse récupérer des paquetages, donc soit connectée au réseau. En salle pupitre 113, vous pouvez connecter votre Raspberry sur une prise réseau libre ou en prenant celle d'un PC non utilisé. Dans le fichier /etc/network/interface vous pouvez écrire la configuration ci-dessous :

auto eth0
iface eth0 inet dhcp

Enfin pour que la Raspberry accède aux dépôts de paquetage sur Internet, il faut lui indiquer d'utiliser le serveurs mandataire Web du lycée :

export http_proxy=http://mars:3128

Il est normal que la suppression de systemd retourne une erreur, il faudra relancer la Raspberry pour l'enlever définitivement. Après le redémarrage de la Raspberry enlevez définitivement systemd en tapant à nouveau la commande :

apt-get purge systemd 

Connexion sur la Raspberry par ssh

Maintenant que la Raspberry est configurée sur le réseau, il est intéressant de pouvoir s'y connecter en utilisant la commande ssh. En effet quand la Raspberry Pi sera intégré dans le projet, il sera difficile de la brancher sur un écran, un clavier et une souris.

Pour activer le serveur ssh sur la Raspberry, utilisez les commandes suivantes :

update-rc.d ssh enable
invoke-rc.d ssh start 

Vous pouvez alors vous connecter sur la Raspberry avec la commande :

ssh pi@IP

@IP est l'adresse IP affectée à la Raspberry Pi que vous pouvez trouver en tapant :

ip address show dev eth0

Si le message d'erreur à la connexion vous énerve, il vous suffit de rajouter un # devant l'appel de fonction check_hash à l'avant-dernière ligne du fichier /etc/profile.d/sshpasswd.sh.

Configuration en point d'accès

Pour que votre Raspberry Pi 3 devienne un point d'accès, installez le paquetage hostapd :

 apt-get install hostapd

Copiez le fichier de configuration de hostapd qui se trouve dans le répertoire /usr/share/doc/hostapd/examples/ dans le répertoire /etc/hostapd :

 cp /usr/share/doc/hostapd/examples/hostapd.conf.gz /etc/hostapd
 gunzip /etc/hostapd/hostapd.conf.gz

Examinez le fichier /etc/hostapd/hostapd.conf à la recherche des mots-clefs suivants :

  • ssid, indiquez votre nom de réseau WiFi ;
  • country_code, mettez le code de la France FR ;
  • channel, faites en sorte que les Raspberry n'écoutent pas toutes sur le même canal ;
  • wpa, activez l'option (mettre à 1) ;
  • wpa_passphrase, donnez le mot de passe de votre réseau (au moins 8 caractères) ;
  • wpa_key_mgmt, à configurer à la valeur WPA-PSK.

Enfin dans le fichier /etc/default/hostapd, définissez le chemin du fichier de configuration :

DAEMON_CONF=/etc/hostapd/hostapd.conf

Relancez le service par la commande :

service hostapd restart

Vous pouvez vérifier avec votre téléphone que votre réseau WiFi est bien visible.

Configuration IP des clients WiFi

Pour que les clients WiFi puissent obtenir une adresse IP et autres coordonnées réseau, installez le paquetage isc-dhcp-server :

 apt-get install isc-dhcp-server

Tout d'abord choisir un réseau IPv4, par exemple 192.168.100.0/24 et affecter à la Raspberry une adresse de ce réseau, par exemple 192.168.100.1. Pour cela ajoutez le bloc ci-dessous à la fin du fichier /etc/network/interfaces :

auto wlan0
iface wlan0 inet static
  address 192.168.100.1
  netmask 255.255.255.0

Il est alors possible de configurer le serveur DHCP au travers de son fichier de configuration /etc/dhcp/dhcpd.conf. Les directives à modifier sont les suivantes :

  • option domain-name, spécifiez un nom de domaine de votre choix (monrobot.org par exemple) ;
  • option domain-name-servers, spécifiez l'adresse 192.168.100.1 comme serveur DNS ;
  • authoritative, déclarez votre serveur DHCP comme légitime.

Il faut aussi ajouter un bloc réseau comme celui-ci :

subnet 192.168.100.0 netmask 255.255.255.0 {
  range 192.168.100.100 192.168.100.200;
  option routers 192.168.100.1;
}

Relancez le service par la commande :

service isc-dhcp-server restart

Vous devez maintenant pouvoir connecter votre téléphone sur votre réseau WiFi. La bonne connexion au réseau WiFi doit se voir dans le fichier de contrôle /var/log/daemon.log et l'obtention d'une adresse IP doit se lire dans le fichier /var/log/syslog.

Ajout d'un nom réseau pour la Raspberry Pi

A ce point votre téléphone peut contacter la Raspberry par son adresse IP. Pour pouvoir faire de même avec un nom significatif installez le paquetage bind9 :

 apt-get install bind9

Ajoutez un bloc dans le fichier de configuration /etc/bind/named.conf :

zone "monrobot.org"  {
  type master;
  file "/etc/bind/db.monrobot";
};

Créez le fichier /etc/bind/db.monrobot avec un contenu de ce type :

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                             2         ; Serial
                        604800         ; Refresh
                         86400         ; Retry
                       2419200         ; Expire
                        604800 )       ; Negative Cache TTL
@       IN      NS      localhost.
robot   IN      A       192.168.100.1

Enfin ajoutez en tête du fichier /etc/resolv.conf la ligne

domain monrobot.org

Vous pouvez vérifier le bon fonctionnement du résolveur de nom en tapant

 host -t any robot 192.168.100.1

Installation d'un serveur Web

La commande du robot doit se faire via une interface Web. Il faut donc installer un serveur Web sur la Raspberry Pi avec un système de page dynamiques pour exécuter du code sur la Raspberry. Il suffit pour cela d'installer les paquetages apache2 et php5 :

apt-get install apache2 php5

Un premier test consiste à donner robot dans la barre d'adresses du navigateur Web de votre téléphone. La page de test du serveur Web apache2 doit s'afficher.

Vous pouvez aussi écrire une petite page permettant d'effectuer une action comme l'arrêt de la Raspberry Pi. Cette page est à mettre dans le répertoire /var/www/html. Voila un exemple de page PHP, nommez la index.php et supprimez le fichier index.html :

<?php
if(array_key_exists('stop',$_POST)){ 
  system('super halt');
  die('halting ...');
  }
?>
<!DOCTYPE html>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Contrôle Web</title>
 </head>
 <body>
  <form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="submit" name="stop" value="Arrêter"/>
  </form>
 </body>
</html>

Notez l'appel de fonction system('super halt'). Pour que cet appel ait l'effet désiré, c'est à dire l'arrêt propre de la Raspberry Pi, il faut que le serveur Web puisse déclencher cet arrêt. De base, ce n'est pas possible pour une raison de droits : l'utilisateur www-data sous lequel tourne le serveur apache2 n'a pas le privilège de lancer la commande halt. Nous allons donc utiliser l'utilitaire super pour autoriser le serveur Web à lancer la commande :

 apt-get install super

Ajoutez ensuite la ligne ci-dessous à la fin fichier de configuration de super qui se nomme /etc/super.tab :

halt    /sbin/halt      uid=root        www-data

Voila, vous devriez pouvoir arrêter votre Raspberry Pi en cliquant sur le bouton "Arrêter" de votre page Web.

Communication série

Votre Raspberry Pi va probablement devoir communiquer avec un micro-contrôleur. Le plus simple est d'établir une communication série. Par contre les pages Web dynamiques peuvent difficilement utiliser le port série étant donné leur durée de vie, c'est à dire d'exécution, limitée. La solution propre pour permettre à des pages Web d'utiliser un port série est de passer par un serveur websocket. Ce type de processus est lancé au démarrage de la machine et accapare le port série. L'intérêt est que le serveur websocket est facilement contactable par un programma javascript tournant sur le navigateur.

Sur votre Raspberry, vous devez installer le paquetage libwebsockets-dev :

apt-get install libwebsockets-dev

Récupérez ensuite le programme C stocké sur ce Wiki Fichier:Webserial.zip. Décompressez-le et compilez-le avec la commande :

 gcc -Wall webserial.c -o webserial -lwebsockets

Vous pouvez faire en sorte que ce programme soit lancé dès le démarrage de la Raspberry Pi en modifiant le fichier /etc/rc.local. Pensez à préciser le chemin complet du programme et à suffixer par un & pour que le programme soit lancé en tâche de fond.

Avec notre serveur websocket nous pouvons implanter des protocoles simples. L'exemple qui suit permet d'allumer et d'éteindre des LEDs connectées à un Arduino et à savoir quels boutons sont pressés. Pour les LEDs, le numéro de la LED à gérer est donné par les 7 bits de poids faible et le bit de poids fort permet de savoir s'il faut l'allumer ou l'éteindre. Pour les boutons, un octet est envoyé par l'Arduino dont chaque bit indique si le bouton est appuyé ou non.

Le programme de l'Arduino est très court :

#define LED1       8
#define Bouton1    2
#define Bouton2    3

void setup(void){
Serial.begin(9600);
for(int i=0;i<6;i++) pinMode(LED1+i,OUTPUT);
pinMode(Bouton1,INPUT);
pinMode(Bouton2,INPUT);
digitalWrite(Bouton1,HIGH);
digitalWrite(Bouton2,HIGH);
for(int i=0;i<6;i++){
    digitalWrite(LED1+i,HIGH);
    delay(200);
    digitalWrite(LED1+i,LOW);
    }
}

void loop(void){
if(Serial.available()>0){
  unsigned char actions=Serial.read();
  int led=LED1+actions&0x7f;
  if((actions&0x80)==0) digitalWrite(led,HIGH); else digitalWrite(led,LOW);
}
unsigned char capteurs=0;
if(digitalRead(Bouton1)==LOW) capteurs |= 0x01;
if(digitalRead(Bouton2)==LOW) capteurs |= 0x02;
Serial.write(capteurs);
delay(100);
}

La page Web qui dialogue avec le serveur websocket encore plus courte est disponible sur ce Wiki Fichier:Jsserial.zip.

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils