BE 2016-2017 : Différence entre versions

De Wiki de bureau d'études PeiP
(Logiciels à utiliser)
 
(54 révisions intermédiaires par 13 utilisateurs non affichées)
Ligne 7 : Ligne 7 :
 
[[Fichier:terrain2.png|500px|thumb|center|Schéma du terrain]]
 
[[Fichier:terrain2.png|500px|thumb|center|Schéma du terrain]]
  
Une manche est décomposée en plusieurs étapes.
+
Une manche est décomposée en plusieurs étapes :
 
* Le robot ramasseur est invité à sortir de son garage pour aller positionner la balle au centre du terrain. Cette invitation peut se faire après un but ou manuellement en début de partie. Quand la balle est correctement placée le robot ramasseur se gare et prévient les robots joueurs que le jeu peut démarrer.
 
* Le robot ramasseur est invité à sortir de son garage pour aller positionner la balle au centre du terrain. Cette invitation peut se faire après un but ou manuellement en début de partie. Quand la balle est correctement placée le robot ramasseur se gare et prévient les robots joueurs que le jeu peut démarrer.
 
* Les deux robots joueurs sortent de leur garage et vont chercher la balle en la repérant par leurs capteurs infrarouges. Si un robot capture la balle il demande au but adverse d'allumer sa balise infrarouge. Il essaye alors d'envoyer la balle dans le but. Au moment du tir, il permet au but d'éteindre sa balise.
 
* Les deux robots joueurs sortent de leur garage et vont chercher la balle en la repérant par leurs capteurs infrarouges. Si un robot capture la balle il demande au but adverse d'allumer sa balise infrarouge. Il essaye alors d'envoyer la balle dans le but. Au moment du tir, il permet au but d'éteindre sa balise.
Ligne 28 : Ligne 28 :
 
* Vous pouvez partir d'un des robots construits lors de la saison précédente. Ces robots ne sont pas forcément totalement fonctionnels mais les parties déjà réalisées peuvent vous faire gagner du temps que vous pourrez consacrer à la programmation du robot.
 
* Vous pouvez partir d'un des robots construits lors de la saison précédente. Ces robots ne sont pas forcément totalement fonctionnels mais les parties déjà réalisées peuvent vous faire gagner du temps que vous pourrez consacrer à la programmation du robot.
 
* Vous pouvez construire un robot à partir d'un des deux chassis proposés, utiliser un Arduino Mega et concevoir un bouclier pour cet Arduino comportant des emplacements pour les divers composants nécessaires (contrôleur moteur, détecteur ultrason, détecteur de lignes, etc).
 
* Vous pouvez construire un robot à partir d'un des deux chassis proposés, utiliser un Arduino Mega et concevoir un bouclier pour cet Arduino comportant des emplacements pour les divers composants nécessaires (contrôleur moteur, détecteur ultrason, détecteur de lignes, etc).
* Vous pouvez aussi fabriquer votre propre chassis avec deux plaques de plexiglass et y intégrer deux moto-réducteurs et leurs roues ainsi qu'une roue folle. Pour le micro-contrôleur vous pouvez aussi vous passer de l'Arduino Mega et concevoir votre propre circuit intégré à base de micro-contrôleur ATMega328p et de contrôleur moteurs TB6612FNG. Même les détecteurs de lignes peuvent être construits à partir de composants électroniques de base. Seul le sonar ultrason est trop complexe pour être conçu à partir des composants de base.
+
* Vous pouvez aussi fabriquer votre propre chassis avec deux plaques de plexiglass et y intégrer deux moto-réducteurs et leurs roues ainsi qu'une roue folle. Pour le micro-contrôleur vous pouvez aussi vous passer de l'Arduino Mega et concevoir votre propre circuit intégré à base de micro-contrôleur ATMega328p et d'un contrôleur moteurs TB6612FNG. Même les détecteurs de lignes peuvent être construits à partir de composants électroniques de base. Seul le sonar ultrason est trop complexe pour être conçu à partir des composants de base.
 
* Si vous aimez les défis vous pouvez aussi construire un robot avec un moto-réducteur de meilleure qualité et avec une carte électronique réalisée uniquement avec des composants électroniques de surface.
 
* Si vous aimez les défis vous pouvez aussi construire un robot avec un moto-réducteur de meilleure qualité et avec une carte électronique réalisée uniquement avec des composants électroniques de surface.
  
Les montages photographiques ci-dessous présente les éléments permettant de construire un robot sans trop souffrir et les composants de base pour construire un robot plus optimisé et personnalisé.
+
Les montages photographiques ci-dessous présentent les éléments permettant de construire un robot sans trop souffrir et les composants de base pour construire un robot plus optimisé et personnalisé.
  
 
[[Fichier:robot-kit.jpg|300px|thumb|left|Chassis, Arduino Mega, détecteur couleur, sonar, contrôleur moteurs, phototransistor, modem ZigBee, détecteur de ligne]]
 
[[Fichier:robot-kit.jpg|300px|thumb|left|Chassis, Arduino Mega, détecteur couleur, sonar, contrôleur moteurs, phototransistor, modem ZigBee, détecteur de ligne]]
Ligne 37 : Ligne 37 :
 
<br style="clear: both;"/>
 
<br style="clear: both;"/>
  
Des dispositifs mécaniques, comme une pince, peuvent être réalisés en utilisant des servo-moteurs et des pièces en plexiglas ou en MDF découpés à l'aide de la découpeuse laser du [http://www.fabricarium.fr/mediawiki-1.23.5/index.php?title=Accueil Fabricarium].
+
Des dispositifs mécaniques, comme une pince, peuvent être réalisés en utilisant des servo-moteurs et des pièces en plexiglas ou en contreplaqué découpées à l'aide de la découpeuse laser du [http://www.fabricarium.fr/mediawiki-1.23.5/index.php?title=Accueil Fabricarium]. Certaines formes plus complexes peuvent éventuellement être réalisées à l'aide des imprimantes 3D du [http://www.fabricarium.fr/mediawiki-1.23.5/index.php?title=Accueil Fabricarium].
 
Pour les fixations vous avez de la visserie (vis, écrous, entretoises).
 
Pour les fixations vous avez de la visserie (vis, écrous, entretoises).
 +
De nombreux objets sont déjà disponibles sur Internet comme, par exemple, ce [http://www.thingiverse.com/thing:2433 bras robotique].
  
 
<gallery style="margin: 0 auto;">
 
<gallery style="margin: 0 auto;">
Ligne 54 : Ligne 55 :
 
* d'un afficheur 7 segments pour le score.
 
* d'un afficheur 7 segments pour le score.
  
Consultez les bureau d'études de 2014/2015 pour comprendre comment réaliser une balise infrarouge avec un micro-contrôleur. Cette année la fonctionnalité de clignotement de la balise à basse fréquence n'est pas nécessaire. Par contre il vous est demandé de gérer un afficheur 7 segments et un bouclier de communication par radio. Le micro-contrôleur de l'an passé, l'ATtiny85, ne sera pas suffisant pour gérer toutes les fonctionnalités du but de cette année. Vous utiliserez donc un Arduino Uno.
+
Consultez les bureaux d'études de 2014/2015 pour comprendre comment réaliser une balise infrarouge avec un micro-contrôleur. Cette année la fonctionnalité de clignotement de la balise à basse fréquence n'est pas nécessaire. Par contre il vous est demandé de gérer un afficheur 7 segments et un bouclier de communication par radio. Le micro-contrôleur de l'an passé, l'ATtiny85, ne sera pas suffisant pour gérer toutes les fonctionnalités du but de cette année. Vous utiliserez donc un Arduino Uno.
  
 
<gallery style="margin: 0 auto;">
 
<gallery style="margin: 0 auto;">
Ligne 75 : Ligne 76 :
 
Pour la découpe laser de nombreux utilisateurs utilisent [https://inkscape.org/fr/ inkscape].
 
Pour la découpe laser de nombreux utilisateurs utilisent [https://inkscape.org/fr/ inkscape].
  
Pour la conception 3D solidwork est très utilisé. Vous pouvez tenter [http://www.freecadweb.org/?lang=fr_FR freeCAD] si vous cherchez un logiciel plus libre.
+
Pour la conception 3D solidwork est très utilisé. Vous pouvez tenter [http://www.freecadweb.org/?lang=fr_FR freeCAD] si vous cherchez un logiciel plus libre. Une solution en ligne existe : [https://www.onshape.com/ onshape].
  
 
Pour le développement avec les plateformes Arduino, utilisez l'environnement du même nom. Si la programmation C++ vous fait peur, n'hésitez pas à ajouter l'outil [http://sourceforge.net/projects/ardublock/ ardublock] à cet environnement.
 
Pour le développement avec les plateformes Arduino, utilisez l'environnement du même nom. Si la programmation C++ vous fait peur, n'hésitez pas à ajouter l'outil [http://sourceforge.net/projects/ardublock/ ardublock] à cet environnement.
Ligne 94 : Ligne 95 :
 
Fichier:robot_bouclier_pcb.png|Bouclier : circuit imprimé
 
Fichier:robot_bouclier_pcb.png|Bouclier : circuit imprimé
 
</gallery>
 
</gallery>
 +
 +
= Configuration du système embarqué =
 +
 +
Pour contrôler les robots télécommandés 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 série ==
 +
 +
Vous êtes de futurs ingénieurs, la méthode "liaison série" est à votre portée et vous pourrez l'employer pour d'autres dispositifs. Vous allez commencer par récupérer la dernière version de la distribution Linux pour Raspberry Pi. Comme nous n'avons pas besoin de l'interface graphique, il est préférable de choisir la distribution "Raspbian Jessie Lite" plus légère en terme d'espace disque. La configuration décrite ci-après a été effectuée sur la version du 2017-01-11.
 +
 +
Une fois l'archive zippée de la distribution récupérée vous pouvez l'installer sur la carte SD après l'avoir décompressée en utilisant la commande <code>dd</code> :
 +
dd if=2017-01-11-raspbian-jessie-lite.img of=/dev/sdb
 +
Le nom du périphérique <code>/dev/sdb</code> peut varier suivant votre machine, vous pouvez lister les noms des périphériques blocs avec la commande <code>lsblk</code>. Exécutez cette commande avant et après l'insertion de votre carte SD et vous aurez le nom utilisé par votre système.
 +
 +
Avant de démarrer la Raspberry Pi 3 sur cette carte SD, vous devez modifier quelques paramètres de démarrage. En effet sur les dernières version de la distribution raspbian, la connexion série a été laissée de coté. Plusieurs explications à cela : la Raspberry vise plus le marché du jouet grand public que celui du système embarqué, de plus la Raspberry Pi 3 intégre maintenant une interface bluetooth disponible via le port série principal. Il est cependant possible d'utiliser le second port série désigné sous le nom de périphérique <code>/dev/serial0</code>. Montez la première partition de votre carte SD Raspian Lite avec la commande
 +
mount /dev/sdb1 /mnt
 +
puis examinez les fichiers <code>cmdline.txt</code> et <code>config.txt</code>. Attention le nom de la partition n'est pas forcément <code>/dev/sdb1</code>, utilisez <code>lsblk</code> pour déterminer le nom de la première partition de votre carte SD sur votre machine. Vérifiez que l'option <code>console=serial0,115200</code> est bien présente dans la ligne du fichier <code>cmdline.txt</code> et ajoutez <code>enable_uart=1</code> à la fin du fichier <code>config.txt</code>. N'oubliez pas de libérer votre carte SD par la commande
 +
umount /mnt
 +
 +
Vous pouvez ensuite insérer la carte SD dans la Raspberry Pi. Utilisez le câble USB/série pour connecter votre Raspberry à votre PC. Il faut enficher les câbles noir, blanc et vert du câble USB/série [https://www.adafruit.com/product/954] sur les entrées/sorties correspondantes de la Raspberry [https://pinout.xyz/]. Le câble noir doit être sur la broche 6, le câble blanc sur la broche 8 et le câble vert sur la broche 10. Alimentez votre Raspberry Pi et lancez la commande suivante sur votre PC
 +
minicom -o -8 -b 115200 -D /dev/ttyUSB0
 +
Vous devez obtenir, in fine, l'invite de connexion de la Raspberry
 +
Raspbian GNU/Linux 8 raspberrypi ttyS0
 +
 
 +
raspberrypi login:
 +
Vous pouvez vous connecter avec l'identifiant <code>pi</code> et le mot de passe <code>raspberry</code>. Pour passer administrateur utilisez la commande <code>sudo su</code>.
 +
 +
== Mise à jour de la distribution ==
 +
 +
La distribution Raspbian vient avec le système de démarrage <code>systemd</code>. 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 <code>systemd</code> ainsi que deux autres paquetages qui tentent de gérer automatiquement la configuration réseau <code>dhcpcd5</code> et <code>openresolv</code> :
 +
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 E304, vous pouvez connecter votre Raspberry sur la seconde interface réseau d'une Zabeth. Dans le fichier <code>/etc/network/interface</code> vous pouvez écrire la configuration ci-dessous :
 +
auto eth0
 +
iface eth0 inet static
 +
  address 172.26.79.1XX
 +
  netmask 255.255.240.0
 +
  gateway 172.26.79.254
 +
avec <code>XX</code> le numéro de votre Zabeth. Il faut aussi mettre une adresse de serveur de noms dans le fichier <code>/etc/resolv.conf</code> :
 +
nameserver 193.48.57.34
 +
Enfin pour que la Raspberry accède aux dépôts de paquetage sur Internet, il faut lui indiquer d'utiliser les serveurs mandataires Web de l'école :
 +
export http_proxy=http://proxy.polytech-lille.fr:3128
 +
Il est normal que la suppression de <code>systemd</code> retourne une erreur, il faudra relancer la Raspberry pour l'enlever définitivement. Avant cela modifiez le fichier <code>/etc/inittab</code> et remplacez la ligne
 +
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
 +
par la ligne
 +
T0:23:respawn:/sbin/getty -L serial0 115200 vt100
 +
Après le redémarrage de la Raspberry enlevez définitivement <code>systemd</code> en tapant à nouveau la commande
 +
apt-get purge systemd
 +
 +
== Connexion sur la Raspberry par <code>ssh</code> ==
 +
 +
La connexion sur la Raspberry par série a ses limites : le terminal texte est assez mal géré et à terme la connexion série sera dédié à la communication avec le micro-contrôleur. Maintenant que la Raspberry est configurée sur le réseau, il est souhaitable de s'y connecter en utilisant la commande <code>ssh</code>.
 +
 +
Pour activer le serveur <code>ssh</code> 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@172.26.79.1XX
 +
Si le message d'erreur à la connexion vous énerve, il vous suffit de rajouter un <code>#</code> devant l'appel de fonction <code>check_hash</code> à l'avant-dernière ligne du fichier <code>/etc/profile.d/sshpasswd.sh</code>.
 +
 +
== Configuration en point d'accès ==
 +
 +
Pour que votre Raspberry Pi 3 devienne un point d'accès, installez le paquetage <code>hostapd</code> :
 +
  apt-get install hostapd
 +
 +
Copiez le fichier de configuration de <code>hostapd</code> qui se trouve dans le répertoire <code>/usr/share/doc/hostapd/examples/</code> dans le répertoire <code>/etc/hostapd</code> :
 +
  cp /usr/share/doc/hostapd/examples/hostapd.conf.gz /etc/hostapd
 +
  gunzip /etc/hostapd/hostapd.conf.gz
 +
Examinez le fichier <code>/etc/hostapd/hostapd.conf</code> à la recherche des mots-clefs suivants :
 +
* <code>ssid</code>, indiquez votre nom de réseau WiFi ;
 +
* <code>country_code</code>, mettez le code de la France <code>FR</code> ;
 +
* <code>channel</code>, faites en sorte que les Raspberry n'écoutent pas toutes sur le même canal ;
 +
* <code>wpa</code>, activez l'option (mettre à 1) ;
 +
* <code>wpa_passphrase</code>, donnez le mot de passe de votre réseau (au moins 8 caractères) ;
 +
* <code>wpa_key_mgmt</code>, à configurer à la valeur <code>WPA-PSK</code>.
 +
 +
Enfin dans le fichier <code>/etc/default/hostapd</code>, 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 <code>isc-dhcp-server</code> :
 +
  apt-get install isc-dhcp-server
 +
 +
Tout d'abord choisir un réseau IPv4, par exemple <code>192.168.100.0/24</code> et affecter à la Raspberry une adresse de ce réseau, par exemple <code>192.168.100.1</code>. Pour cela ajoutez le bloc ci-dessous à la fin du fichier <code>/etc/network/interfaces</code> :
 +
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 <code>/etc/dhcp/dhcpd.conf</code>. Les directives à modifier sont les suivantes :
 +
* <code>option domain-name</code>, spécifiez un nom de domaine de votre choix (<code>monrobot.org</code> par exemple) ;
 +
* <code>option domain-name-servers</code>, spécifiez l'adresse <code>192.168.100.1</code> comme serveur DNS ;
 +
* <code>authoritative</code>, 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 <code>/var/log/daemon.log</code> et l'obtention d'une adresse IP doit se lire dans le fichier <code>/var/log/syslog</code>.
 +
 +
== 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 <code>bind9</code> :
 +
  apt-get install bind9
 +
 +
Ajoutez un bloc dans le fichier de configuration <code>/etc/bind/named.conf</code> :
 +
zone "monrobot.org"  {
 +
  type master;
 +
  file "/etc/bind/db.monrobot";
 +
};
 +
 +
Créez le fichier <code>/etc/bind/db.monrobot</code> 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 <code>/etc/resolv.conf</code> 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 <code>apache2</code> et <code>php5</code> :
 +
apt-get install apache2 php5
 +
 +
Un premier test consiste à donner <code>robot</code> dans la barre d'adresses du navigateur Web de votre téléphone. La page de test du serveur Web <code>apache2</code> 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 <code>/var/www/html</code>. Voila un exemple de page PHP, nommez la <code>index.php</code> et supprimez le fichier <code>index.html</code> :
 +
<?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 <code>system('super halt')</code>. 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 <code>www-data</code> sous lequel tourne le serveur <code>apache2</code> n'a pas le privilège de lancer la commande <code>halt</code>. Nous allons donc utiliser l'utilitaire <code>super</code> pour autoriser le serveur Web à lancer la commande :
 +
  apt-get install super
 +
Ajoutez ensuite la ligne ci-dessous à la fin fichier de configuration de <code>super</code> qui se nomme <code>/etc/super.tab</code> :
 +
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 <code>libwebsockets-dev</code> :
 +
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 <code>/etc/rc.local</code>. 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]].
  
 
= Répartition des tâches =
 
= Répartition des tâches =
Ligne 116 : Ligne 334 :
  
 
Un robot ramasseur de balle est constitué comme suit :
 
Un robot ramasseur de balle est constitué comme suit :
* un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Mega2560 ;
+
* un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Mega2560 ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;
 
* un détecteur ultrason pour éviter les collisions ;
 
* un détecteur ultrason pour éviter les collisions ;
 
* trois détecteurs de ligne pour suivre efficacement les lignes au sol ;
 
* trois détecteurs de ligne pour suivre efficacement les lignes au sol ;
Ligne 135 : Ligne 353 :
 
Pour détecter la balle infrarouge plusieurs phototransistors installés dans des caches réduisant leur angle de détection sont nécessaires. A vous de trouver la meilleure répartition sur le châssis pour les détecteurs. Vous pouvez aussi utiliser un plateau rotatif réalisé avec un servo-moteur pour augmenter le champ de vision.
 
Pour détecter la balle infrarouge plusieurs phototransistors installés dans des caches réduisant leur angle de détection sont nécessaires. A vous de trouver la meilleure répartition sur le châssis pour les détecteurs. Vous pouvez aussi utiliser un plateau rotatif réalisé avec un servo-moteur pour augmenter le champ de vision.
  
Les éléments de la pince sont à réaliser par impression 3D ou découpe laser de plexiglas.
+
Les éléments de la pince sont à réaliser par impression 3D ou découpe laser de plexiglas ou de bois.
  
 
== Robot compétiteur ==
 
== Robot compétiteur ==
  
 
Un robot compétiteur est constitué comme suit :
 
Un robot compétiteur est constitué comme suit :
* un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Mega2560 ;
+
* un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Mega2560 ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;
 
* un détecteur ultrason pour ne pas rentrer dans les obstacles ;
 
* un détecteur ultrason pour ne pas rentrer dans les obstacles ;
 
* trois détecteurs de ligne pour suivre efficacement les lignes au sol ;
 
* trois détecteurs de ligne pour suivre efficacement les lignes au sol ;
Ligne 159 : Ligne 377 :
  
 
Les éléments de la pince sont à réaliser par impression 3D ou découpe laser de plexiglas ou bois. Quand la pince se referme elle doit occulter la balle pour que le robot puisse détecter la balise du but.
 
Les éléments de la pince sont à réaliser par impression 3D ou découpe laser de plexiglas ou bois. Quand la pince se referme elle doit occulter la balle pour que le robot puisse détecter la balise du but.
 +
 +
== Robot télécommandé ==
 +
 +
Un robot télécommandé est un robot compétiteur dirigé par un humain. Il est donc constitué des composants d'un robot compétiteur moins les phototransistors. En effet la balle est repérée par l'opérateur humain au travers d'une caméra. Le contrôle du robot se fait via une Raspberry Pi dotée d'une interface WiFi transformée en point d'accès et hébergeant un site Web. L'opérateur contrôle le robot en utilisant un smartphone connecté sur le point d'accès.
 +
 +
Un robot télécommandé ne peut avancer que sur réception du message du robot ramasseur de balle.
 +
 +
L'opérateur peut diriger le robot à sa guise dans le terrain mais le robot interdit toute sortie de ce terrain. L'opérateur peut capturer la balle avec la pince et la lancer dans le but adverse. La procédure d'activation de la balise du but adverse n'est donc jamais déclenchée contrairement à ce qui se passe avec un robot compétiteur.
 +
 +
La pince doit être réalisée comme pour un robot compétiteur. La contrainte d'occulter les signaux IR de la balle n'est pas utile ici.
  
 
== Réalisations des binômes ==
 
== Réalisations des binômes ==
Ligne 166 : Ligne 394 :
 
|-
 
|-
 
| Binôme 1
 
| Binôme 1
| Prénom1 Nom1 / Prénom2 Nom2
+
| Tristan Grut / Pol Mulon
| Type de robot
+
| Robot télécommandé
 
| [[Binome2016-1|Binôme 1 2016/2017]]
 
| [[Binome2016-1|Binôme 1 2016/2017]]
 
|-
 
|-
 
| Binôme 2
 
| Binôme 2
| Prénom1 Nom1 / Prénom2 Nom2
+
| Hugo Leurent / Etienne Mandeville
| Type de robot
+
| Robot télécommandé
 
| [[Binome2016-2|Binôme 2 2016/2017]]
 
| [[Binome2016-2|Binôme 2 2016/2017]]
 
|-
 
|-
 
| Binôme 3
 
| Binôme 3
| Prénom1 Nom1 / Prénom2 Nom2
+
| Stephen Andriambolisoa / Florent Borel
| Type de robot
+
| Robot compétiteur
 
| [[Binome2016-3|Binôme 3 2016/2017]]
 
| [[Binome2016-3|Binôme 3 2016/2017]]
 
|-
 
|-
 
| Binôme 4
 
| Binôme 4
| Prénom1 Nom1 / Prénom2 Nom2
+
| Morelle-Deloffre Quentin / Danjou Corentin
| Type de robot
+
| Robot télécommandé
 
| [[Binome2016-4|Binôme 4 2016/2017]]
 
| [[Binome2016-4|Binôme 4 2016/2017]]
 
|-
 
|-
 
| Binôme 5
 
| Binôme 5
| Prénom1 Nom1 / Prénom2 Nom2
+
| Copil Léandre / Samain Victor
| Type de robot
+
| Robot Ramasseur de balle
 
| [[Binome2016-5|Binôme 5 2016/2017]]
 
| [[Binome2016-5|Binôme 5 2016/2017]]
 
|-
 
|-
 
| Binôme 6
 
| Binôme 6
| Prénom1 Nom1 / Prénom2 Nom2
+
| Alban Lefay / Quentin Lecroart
| Type de robot
+
| robot competiteur
 
| [[Binome2016-6|Binôme 6 2016/2017]]
 
| [[Binome2016-6|Binôme 6 2016/2017]]
 
|-
 
|-
 
| Binôme 7
 
| Binôme 7
| Prénom1 Nom1 / Prénom2 Nom2
+
| Julie Claude / Rémi Foucault
| Type de robot
+
| Robot compétiteur
 
| [[Binome2016-7|Binôme 7 2016/2017]]
 
| [[Binome2016-7|Binôme 7 2016/2017]]
 
|-
 
|-
 
| Binôme 8
 
| Binôme 8
| Prénom1 Nom1 / Prénom2 Nom2
+
| Khinache Souheib / Naessens Thomas
| Type de robot
+
| Robot Télécommandé
 
| [[Binome2016-8|Binôme 8 2016/2017]]
 
| [[Binome2016-8|Binôme 8 2016/2017]]
 
|-
 
|-
 
| Binôme 9
 
| Binôme 9
| Prénom1 Nom1 / Prénom2 Nom2
+
| David Bastin
| Type de robot
+
| Robot compétiteur
 
| [[Binome2016-9|Binôme 9 2016/2017]]
 
| [[Binome2016-9|Binôme 9 2016/2017]]
|-
 
| Binôme 10
 
| Prénom1 Nom1 / Prénom2 Nom2
 
| Type de robot
 
| [[Binome2016-10|Binôme 10 2016/2017]]
 
|-
 
| Binôme 11
 
| Prénom1 Nom1 / Prénom2 Nom2
 
| Type de robot
 
| [[Binome2016-11|Binôme 11 2016/2017]]
 
 
|-
 
|-
 
|}
 
|}

Version actuelle datée du 21 mai 2017 à 15:47

Objectif à atteindre

Comme pour les saisons précédentes vous devez concevoir des robots pour concourir dans un jeu de balle.

Le terrain peut être marqué comme sur le schéma ci-dessous. Durant une manche les joueurs ne peuvent pas sortir du cadre principal. Les bords du terrain sont inclinés pour que la balle revienne vers la zone de jeu. Les lignes permettent de marquer le centre du terrain et les zones de garage des robots. Les robots devront pouvoir distinguer deux types de lignes, peu importe les couleurs.

Schéma du terrain

Une manche est décomposée en plusieurs étapes :

  • Le robot ramasseur est invité à sortir de son garage pour aller positionner la balle au centre du terrain. Cette invitation peut se faire après un but ou manuellement en début de partie. Quand la balle est correctement placée le robot ramasseur se gare et prévient les robots joueurs que le jeu peut démarrer.
  • Les deux robots joueurs sortent de leur garage et vont chercher la balle en la repérant par leurs capteurs infrarouges. Si un robot capture la balle il demande au but adverse d'allumer sa balise infrarouge. Il essaye alors d'envoyer la balle dans le but. Au moment du tir, il permet au but d'éteindre sa balise.
  • Soit le tir est raté et les robots continuent à tenter d'attraper la balle.
  • Soit le tir est réussi et le but concerné le confirme, les robots joueurs vont se garer et le robot ramasseur entre en action. Les buts sont chargés d'afficher le score. Pour qu'un but soit marqué, il suffit que la balle rentre dans le but. Le sol du but est en pente pour que la balle ressorte automatiquement.

Une partie est constituée de plusieurs manches.

Matériel à votre disposition pour les robots

Votre robot doit pouvoir réaliser les actions suivantes :

  • avancer et reculer le tout en tournant éventuellement ;
  • repérer une ligne au sol ;
  • détecter des signaux infra-rouges pulsés ;
  • détecter des obstacles sur son chemin ;
  • communiquer avec les autres acteurs (robots et buts) ;
  • capturer et déplacer une balle.

Nous vous imposons de construire ce robot à base de micro-contrôleur ATMega. Par contre nous vous laissons le choix de la variante. Les possibilités sont classées de la plus simple à la plus complexe.

  • Vous pouvez partir d'un des robots construits lors de la saison précédente. Ces robots ne sont pas forcément totalement fonctionnels mais les parties déjà réalisées peuvent vous faire gagner du temps que vous pourrez consacrer à la programmation du robot.
  • Vous pouvez construire un robot à partir d'un des deux chassis proposés, utiliser un Arduino Mega et concevoir un bouclier pour cet Arduino comportant des emplacements pour les divers composants nécessaires (contrôleur moteur, détecteur ultrason, détecteur de lignes, etc).
  • Vous pouvez aussi fabriquer votre propre chassis avec deux plaques de plexiglass et y intégrer deux moto-réducteurs et leurs roues ainsi qu'une roue folle. Pour le micro-contrôleur vous pouvez aussi vous passer de l'Arduino Mega et concevoir votre propre circuit intégré à base de micro-contrôleur ATMega328p et d'un contrôleur moteurs TB6612FNG. Même les détecteurs de lignes peuvent être construits à partir de composants électroniques de base. Seul le sonar ultrason est trop complexe pour être conçu à partir des composants de base.
  • Si vous aimez les défis vous pouvez aussi construire un robot avec un moto-réducteur de meilleure qualité et avec une carte électronique réalisée uniquement avec des composants électroniques de surface.

Les montages photographiques ci-dessous présentent les éléments permettant de construire un robot sans trop souffrir et les composants de base pour construire un robot plus optimisé et personnalisé.

Chassis, Arduino Mega, détecteur couleur, sonar, contrôleur moteurs, phototransistor, modem ZigBee, détecteur de ligne
Moto-réducteurs et roues, micro-contrôleurs ATMega328p et quartz, contrôleur de moteurs TB6612FNG, interrupteur optique QRE1113


Des dispositifs mécaniques, comme une pince, peuvent être réalisés en utilisant des servo-moteurs et des pièces en plexiglas ou en contreplaqué découpées à l'aide de la découpeuse laser du Fabricarium. Certaines formes plus complexes peuvent éventuellement être réalisées à l'aide des imprimantes 3D du Fabricarium. Pour les fixations vous avez de la visserie (vis, écrous, entretoises). De nombreux objets sont déjà disponibles sur Internet comme, par exemple, ce bras robotique.

Matériel à votre disposition pour les buts

Les buts sont constitués :

  • d'une cage de but à réaliser, par exemple, en plexiglas avec la découpeuse laser ;
  • d'une balise infrarouge pouvant être activée à la demande ;
  • d'un détecteur de passage de la balle (par phototransistor par exemple) ;
  • d'un afficheur 7 segments pour le score.

Consultez les bureaux d'études de 2014/2015 pour comprendre comment réaliser une balise infrarouge avec un micro-contrôleur. Cette année la fonctionnalité de clignotement de la balise à basse fréquence n'est pas nécessaire. Par contre il vous est demandé de gérer un afficheur 7 segments et un bouclier de communication par radio. Le micro-contrôleur de l'an passé, l'ATtiny85, ne sera pas suffisant pour gérer toutes les fonctionnalités du but de cette année. Vous utiliserez donc un Arduino Uno.

Logiciels à utiliser

Pour concevoir un schéma propre du câblage de votre robot vous pouvez utiliser fritzing. Tous les composants de votre robot ne sont pas modélisés dans fritzing. Voici une liste de composants supplémentaires mis au points par des élèves IMA de la promotion 2017 (Julie Debock, Hugo Vandenbunder et Sylvain Verdonck) et revus par les encadrants du bureau d'études :

Pour la conception de circuits imprimés nous vous recommandons le logiciel eagle ou le précédent.

Pour la découpe laser de nombreux utilisateurs utilisent inkscape.

Pour la conception 3D solidwork est très utilisé. Vous pouvez tenter freeCAD si vous cherchez un logiciel plus libre. Une solution en ligne existe : onshape.

Pour le développement avec les plateformes Arduino, utilisez l'environnement du même nom. Si la programmation C++ vous fait peur, n'hésitez pas à ajouter l'outil ardublock à cet environnement.

Pour vous aider dans la conception des circuits imprimés nous vous proposons des circuits modélisés avec fritzing que vous pourrez adapter à vos robots. Ces circuits ont été ébauchés par les élèves IMA sus-cités et lourdement modifiés par les encadrants du bureau d'études.

Un premier circuit vous donne un exemple de circuit pour les capteurs de l'avant du robot : Fichier:Robot capteur.zip.

Un second circuit de type bouclier Arduino permet d'éviter tous les câbles entre l'Arduino et les contrôleurs de moteurs : Fichier:Robot bouclier.zip. Ce circuit est prévu pour 4 moteurs, les binômes avec des chassis bi-moteurs devront le simplifier.

Configuration du système embarqué

Pour contrôler les robots télécommandés 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 série

Vous êtes de futurs ingénieurs, la méthode "liaison série" est à votre portée et vous pourrez l'employer pour d'autres dispositifs. Vous allez commencer par récupérer la dernière version de la distribution Linux pour Raspberry Pi. Comme nous n'avons pas besoin de l'interface graphique, il est préférable de choisir la distribution "Raspbian Jessie Lite" plus légère en terme d'espace disque. La configuration décrite ci-après a été effectuée sur la version du 2017-01-11.

Une fois l'archive zippée de la distribution récupérée vous pouvez l'installer sur la carte SD après l'avoir décompressée en utilisant la commande dd :

dd if=2017-01-11-raspbian-jessie-lite.img of=/dev/sdb

Le nom du périphérique /dev/sdb peut varier suivant votre machine, vous pouvez lister les noms des périphériques blocs avec la commande lsblk. Exécutez cette commande avant et après l'insertion de votre carte SD et vous aurez le nom utilisé par votre système.

Avant de démarrer la Raspberry Pi 3 sur cette carte SD, vous devez modifier quelques paramètres de démarrage. En effet sur les dernières version de la distribution raspbian, la connexion série a été laissée de coté. Plusieurs explications à cela : la Raspberry vise plus le marché du jouet grand public que celui du système embarqué, de plus la Raspberry Pi 3 intégre maintenant une interface bluetooth disponible via le port série principal. Il est cependant possible d'utiliser le second port série désigné sous le nom de périphérique /dev/serial0. Montez la première partition de votre carte SD Raspian Lite avec la commande

mount /dev/sdb1 /mnt

puis examinez les fichiers cmdline.txt et config.txt. Attention le nom de la partition n'est pas forcément /dev/sdb1, utilisez lsblk pour déterminer le nom de la première partition de votre carte SD sur votre machine. Vérifiez que l'option console=serial0,115200 est bien présente dans la ligne du fichier cmdline.txt et ajoutez enable_uart=1 à la fin du fichier config.txt. N'oubliez pas de libérer votre carte SD par la commande

umount /mnt

Vous pouvez ensuite insérer la carte SD dans la Raspberry Pi. Utilisez le câble USB/série pour connecter votre Raspberry à votre PC. Il faut enficher les câbles noir, blanc et vert du câble USB/série [1] sur les entrées/sorties correspondantes de la Raspberry [2]. Le câble noir doit être sur la broche 6, le câble blanc sur la broche 8 et le câble vert sur la broche 10. Alimentez votre Raspberry Pi et lancez la commande suivante sur votre PC

minicom -o -8 -b 115200 -D /dev/ttyUSB0

Vous devez obtenir, in fine, l'invite de connexion de la Raspberry

Raspbian GNU/Linux 8 raspberrypi ttyS0
 
raspberrypi login:

Vous pouvez vous connecter avec l'identifiant pi et le mot de passe raspberry. Pour passer administrateur utilisez la commande sudo su.

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 E304, vous pouvez connecter votre Raspberry sur la seconde interface réseau d'une Zabeth. Dans le fichier /etc/network/interface vous pouvez écrire la configuration ci-dessous :

auto eth0
iface eth0 inet static
  address 172.26.79.1XX
  netmask 255.255.240.0
  gateway 172.26.79.254

avec XX le numéro de votre Zabeth. Il faut aussi mettre une adresse de serveur de noms dans le fichier /etc/resolv.conf :

nameserver 193.48.57.34

Enfin pour que la Raspberry accède aux dépôts de paquetage sur Internet, il faut lui indiquer d'utiliser les serveurs mandataires Web de l'école :

export http_proxy=http://proxy.polytech-lille.fr:3128

Il est normal que la suppression de systemd retourne une erreur, il faudra relancer la Raspberry pour l'enlever définitivement. Avant cela modifiez le fichier /etc/inittab et remplacez la ligne

#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100

par la ligne

T0:23:respawn:/sbin/getty -L serial0 115200 vt100

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

La connexion sur la Raspberry par série a ses limites : le terminal texte est assez mal géré et à terme la connexion série sera dédié à la communication avec le micro-contrôleur. Maintenant que la Raspberry est configurée sur le réseau, il est souhaitable de s'y connecter en utilisant la commande ssh.

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@172.26.79.1XX

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.

Répartition des tâches

Nous n'imposons pas de répartition rigide des tâches. Pour qu'une démonstration puisse se faire en fin de bureau d'étude il faut au moins deux robots joueurs, deux cages de buts et un robot ramasseur. Bien entendu plusieurs parties peuvent avoir lieu en même temps.

Fonctionnement de la cage de but

Deux événements peuvent faire agir la cage de but :

  • une balle pénètre dans la cage ;
  • un message est envoyé à la cage par un robot.

Pour détecter une balle entrant dans la cage, le plus simple est d'y fixer un phototransistor infrarouge avec un cache adapté pour ne détecter la balle que lorsqu'elle se trouve dans la cage.

Lorsque que la balle est détectée il faut incrémenter le score (ce score est initialisé à zéro lors de la réinitialisation de l'Arduino). Il faut ensuite envoyer un message aux robots pour que les robots joueurs aillent se garer et que le robot ramasseur se mette en action. Le format des messages est a déterminer globalement, doit y figurer un champ destination qui permet de cibler un acteur précis et aussi un champ données pour préciser le message.

Quand un message est envoyé spécifiquement à la cage, c'est à dire qu'elle reconnait son identifiant dans le champs destination, elle doit activer ou arrêter sa balise infrarouge. Mettons que la balise est activée si la donnée est 1 et arrêtée si la donnée est 0.

Le câblage peut se faire en utilisant des plaques à essai ou en concevant un circuit imprimé avec le logiciel eagle.

Robot ramasseur de balle

Un robot ramasseur de balle est constitué comme suit :

  • un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Mega2560 ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;
  • un détecteur ultrason pour éviter les collisions ;
  • trois détecteurs de ligne pour suivre efficacement les lignes au sol ;
  • des phototransistors infrarouges pour repérer la balle infrarouge ;
  • un système de pince basé sur un servo-moteur pour capturer la balle ;
  • un bouclier XBee pour communiquer avec les autres acteurs.

Le robot ramasseur de balle peut être activé soit manuellement par un bouton, soit sur réception d'un message lui étant destiné.

Une fois activé le robot se promène en changeant de direction jusqu'à ce qu'il détecte la balle infrarouge. Il se dirige alors vers la balle et la capture avec sa pince.

Le robot se remet à se promener comme précédemment et s'arrête lorsqu'il détecte une ligne de la croix centrale. Il remonte cette ligne dans un sens et il analyse la prochaine intersection avec ses trois capteurs. S'il ne se trouve pas au centre du terrain il se retourne pour remonter la ligne dans l'autre sens. Une fois au centre du terrain, il lâche la balle et va se garer.

Il ne lui reste alors plus qu'à envoyer un message aux robots joueurs pour qu'ils jouent une manche.

Pour détecter les lignes les capteurs doivent être séparés de l'épaisseur des lignes au sol. Ainsi quand le capteur du milieu perdra la ligne, un des deux autres capteurs devrait l'apercevoir. De cette façon le robot saura par quel coté il perd la ligne et pourra tourner en sens inverse pour la retrouver sur le capteur central. Vous pouvez utiliser le temps entre deux pertes de ligne pour avoir une idée de la courbure de la ligne et lancer le robot dans une trajectoire courbe plutôt que rectiligne.

Pour détecter la balle infrarouge plusieurs phototransistors installés dans des caches réduisant leur angle de détection sont nécessaires. A vous de trouver la meilleure répartition sur le châssis pour les détecteurs. Vous pouvez aussi utiliser un plateau rotatif réalisé avec un servo-moteur pour augmenter le champ de vision.

Les éléments de la pince sont à réaliser par impression 3D ou découpe laser de plexiglas ou de bois.

Robot compétiteur

Un robot compétiteur est constitué comme suit :

  • un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Mega2560 ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;
  • un détecteur ultrason pour ne pas rentrer dans les obstacles ;
  • trois détecteurs de ligne pour suivre efficacement les lignes au sol ;
  • des phototransistors infrarouges pour repérer la balle infrarouge et les buts ;
  • un système de pince basé sur un servo-moteur pour capturer la balle ;
  • un système d'éjection de la balle pour tirer ;
  • un bouclier XBee pour communiquer avec les autres acteurs.

Un robot compétiteur est activé par un message du robot ramasseur de balle. Il sort alors de son garage pour rentrer sur le terrain.

Une fois sur le terrain le robot s'y promène en changeant de direction lorsqu'il arrive en limite du terrain jusqu'à ce qu'il détecte la balle infrarouge. Il se dirige alors vers la balle et tente de la capturer avec sa pince. Il demande alors au but adverse d'activer sa balise IR.

Le robot tourne jusqu'à trouver le but adverse et tire pour envoyer la balle dans le but. Après avoir tiré, il demande au but adverse d'arrêter sa balise IR.

Si le robot reçoit un message signalant qu'un but a été marqué, il va se garer. Pour cela il parcourt le terrain jusqu'à trouver une ligne de l'aire de jeu. Il suit cette ligne jusqu'à trouver l'intersection qui correspond à son garage.

Pour détecter la balle infrarouge plusieurs phototransistors installés dans des caches réduisant leur angle de détection sont nécessaires. A vous de trouver la meilleure répartition sur le châssis pour les détecteurs. Vous pouvez aussi utiliser un plateau rotatif réalisé avec un servo-moteur pour augmenter le champ de vision.

Les éléments de la pince sont à réaliser par impression 3D ou découpe laser de plexiglas ou bois. Quand la pince se referme elle doit occulter la balle pour que le robot puisse détecter la balise du but.

Robot télécommandé

Un robot télécommandé est un robot compétiteur dirigé par un humain. Il est donc constitué des composants d'un robot compétiteur moins les phototransistors. En effet la balle est repérée par l'opérateur humain au travers d'une caméra. Le contrôle du robot se fait via une Raspberry Pi dotée d'une interface WiFi transformée en point d'accès et hébergeant un site Web. L'opérateur contrôle le robot en utilisant un smartphone connecté sur le point d'accès.

Un robot télécommandé ne peut avancer que sur réception du message du robot ramasseur de balle.

L'opérateur peut diriger le robot à sa guise dans le terrain mais le robot interdit toute sortie de ce terrain. L'opérateur peut capturer la balle avec la pince et la lancer dans le but adverse. La procédure d'activation de la balise du but adverse n'est donc jamais déclenchée contrairement à ce qui se passe avec un robot compétiteur.

La pince doit être réalisée comme pour un robot compétiteur. La contrainte d'occulter les signaux IR de la balle n'est pas utile ici.

Réalisations des binômes

Numéro Elèves Tâches Page
Binôme 1 Tristan Grut / Pol Mulon Robot télécommandé Binôme 1 2016/2017
Binôme 2 Hugo Leurent / Etienne Mandeville Robot télécommandé Binôme 2 2016/2017
Binôme 3 Stephen Andriambolisoa / Florent Borel Robot compétiteur Binôme 3 2016/2017
Binôme 4 Morelle-Deloffre Quentin / Danjou Corentin Robot télécommandé Binôme 4 2016/2017
Binôme 5 Copil Léandre / Samain Victor Robot Ramasseur de balle Binôme 5 2016/2017
Binôme 6 Alban Lefay / Quentin Lecroart robot competiteur Binôme 6 2016/2017
Binôme 7 Julie Claude / Rémi Foucault Robot compétiteur Binôme 7 2016/2017
Binôme 8 Khinache Souheib / Naessens Thomas Robot Télécommandé Binôme 8 2016/2017
Binôme 9 David Bastin Robot compétiteur Binôme 9 2016/2017