BE 2018-2019
Sommaire
Objectif à atteindre
Le thème de la saison 9 est toujours la réalisation de robots communicant sur le modèle proies et prédateurs.
Les prédateurs doivent repérer et rattraper des proies. Pour toute la partie identification et poursuite, une interaction par signal infra-rouge modulé est préconisée. Les proies émettent un signal propre à leur condition et sont ainsi identifiées par les prédateurs. Les prédateurs possèdent un système de réception infra-rouge directionnel permettant de s'orienter dans la phase de poursuite. Les prédateurs émettent aussi un signal infra-rouge permettant ainsi aux proies de savoir qu'elles sont prises en chasse. Pour simuler la capture de la proie, la conception d'un système de communication à très faible distance est laissé à la sagacité des élèves.
Les proies comme les prédateurs peuvent être autonomes ou télécommandés. Pour le mode de télécommande deux solutions sont envisagées : utilisation d'une télécommande infra-rouge ou utilisation d'un téléphone intelligent. Pour la dernière solution, il est nécessaire d'embarquer une Raspberry Pi 3 sur le robot.
La taille du robot n'est pas fixé. Vous pouvez envisager des robots miniatures d'une dizaine de centimètres de coté.
Matériel à votre disposition pour les robots
Votre robot doit pouvoir réaliser les actions suivantes :
- avancer et reculer le tout en tournant éventuellement ;
- émettre des signaux infra-rouges pulsés ;
- décoder des signaux infra-rouges pulsés ;
- détecter des obstacles sur son chemin.
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 des saisons précédentes. 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, LED infra-rouge, récepteur infra-rouge TSOP, etc).
- Vous pouvez aussi fabriquer votre propre chassis avec deux plaques de plexiglass produites par la découpeuse laser ou avec une structure imprimée en 3D. Il ne reste plus qu'à intégrer à ce chassis 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. 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é ou avec une carte électronique réalisée uniquement avec des composants électroniques de surface. Vous pouvez même construire un robot miniature.
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é.
Des robots miniatures peuvent être réalisés en utilisant des servo-moteurs continus 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. Il est possible d'imprimer des pneus avec du PLA flexible. Pour les fixations vous avez de la visserie (vis, écrous, entretoises).
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 :
- détecteur ultrason : Fichier:UltrasonicSensor HCSR04.zip
- contrôleur de moteurs : Fichier:MotorDriver Pololu md08a.zip
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 des élèves IMA et retouchés par les encadrants du bureau d'études.
Un premier 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. Après téléchargement, prenez soin de modifier le suffixe .zip
en .fzz
.
Un second circuit permet de se passer totalement d'un Arduino : Fichier:RobotPCB.zip. Le coeur de la carte est un micro-contrôleur ATMega328p comme sur l'Arduino. La plupart des capteurs et actionneurs nécessaires à vos robots sont présents sur la carte. Après téléchargement, prenez soin de modifier le suffixe .zip
en .fzz
.
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/interfaces
vous pouvez écrire la configuration ci-dessous :
auto eth0 iface eth0 inet dhcp
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 FranceFR
; -
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 valeurWPA-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'adresse192.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 php7
:
apt-get install apache2 php7
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 ou Fichier:Webserialv2.zip suivant la version de votre bibliothèque libwebsockets
). 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.
Penser à placer le fichier jquery.js stocké sur Fichier:Jquery.zip dans votre dossier /var/www/html
pour assurer le bon fonctionnement de la page web.
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 un robot proie et un robot prédateur.
Robot proie
Un robot proie est constitué comme suit :
- un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Uno ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;
- des détecteurs ultrason pour éviter les collisions ;
- un récepteur infra-rouge TSOP pour décoder les signaux infra-rouges modulés ;
- un émetteur infra-rouge pour émettre un signal signalant le robot comme une proie ;
- un dispositif récepteur à courte distance pour simuler la capture par un prédateur, vous pouvez partir sur l'idée d'un capteur à effet Hall.
Dans son mode autonome, le robot se promène dans la pièce en évitant les obstacles de façon tranquille et prévisible. Quand il repère un prédateur à son signal infra-rouge, la proie se déplace plus vivement avec de brusques changements de direction. Quand le détecteur à courte distance indique que le robot proie est à portée du prédateur, il s'arrête. Faire clignoter des LED rouges serait assez à propos.
Vous pouvez ajouter un mode télécommande au robot. La modification la plus simple consiste à recevoir des ordres d'une télécommande infra-rouge. Le robot pourrait ainsi recevoir des ordres pour accélèrer ou décélérer, pour tourner tranquillement ou brusquement.
Pour aller plus loin vous pouvez équiper votre robot d'une Raspberry PI 3 communiquant avec la carte de contrôle en série. Le robot peut alors être téléguidé par un téléphone.
Robot prédateur
Un robot prédateur est constitué comme suit :
- un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Uno ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;
- un détecteur ultrason pour ne pas rentrer dans les obstacles ;
- des récepteurs infra-rouges TSOP pour décoder les signaux infra-rouges modulés ;
- un émetteur infra-rouge pour émettre un signal signalant le robot comme un prédateur ;
- un dispositif émetteur à courte distance pour simuler la capture d'une proie, par exemple un électro-aimant.
Dans son mode autonome, le robot tourne en rond à la recherche d'une proie. Dès qu'il en repère une, il se précipite vers elle en se calant sur son signal infra-rouge. Quand le prédateur pense être à porté de la proie, il active la communication à faible portée. Cette activation est temporaire pour donner une chance à la proie de s'échapper.
Vous pouvez ajouter un mode télécommande au robot. La modification la plus simple consiste à recevoir des ordres d'une télécommande infra-rouge. Le robot pourrait ainsi recevoir des ordres de direction, de vitesse et d'activation de la communication "capture".
Pour aller plus loin vous pouvez équiper votre robot d'une Raspberry PI 3 communiquant avec la carte de contrôle en série. Le robot peut alors être téléguidé par un téléphone.
Réalisations des binômes
Numéro | Elèves | Type de robot | Page |
---|---|---|---|
Binôme 1 | N'diaye Lefebvre | Prédateur | Binôme 1 2018/2019 |
Binôme 2 | Clabaux Buisine | Prédateur | Binôme 2 2018/2019 |
Binôme 3 | Rodriguez Quentin Guillerm Quentin | Proie | Binôme 3 2018/2019 |
Binôme 4 | Binôme 4 2018/2019 | ||
Binôme 5 | Binôme 5 2018/2019 | ||
Binôme 6 | Binôme 6 2018/2019 | ||
Monôme 7 : Andrei Florea | Binôme 7 2018/2019 | ||
Binôme 8 | Binôme 8 2018/2019 | ||
Binôme 9 | Binôme 9 2018/2019 | ||
Binôme 10 | Binôme 10 2018/2019 |