Base de connaissances Šikula Robotik

Connectivité de la BeagleBoneBlack

Cet article est le deuxième d'une série à propos de la BeagleBoneBlack par l'association Šikula Robotik. Dans le précédent articles, nous avons vu comment installer une distribution Linux sur la BBB et ce qu'il se passe pendant le démarrage. Nous allons maintenant connecter la BBB au réseau, d'abord via un traditionnel port Ethernet, puis via une connexion Ethernet-sur-USB. Les connexions sans fil sortent du cadre de cet article.

Lien Ethernet traditionnel

Pour commencer, branchons un câble au port Ethernet de la carte. Il se comporte exactecmement comme une carte réseau classique d'un ordinateur, nous pouvons donc demander au routeur une adresse IP dynamique avec le protocole DHCP habituel (“dhcpcd eth0”).

En passant les détails, cette command va démarrer un démon-client DHCP qui va demander au routeur une adresse IP et configurer l'adresse IP, le masque de réseau, la passerelle, les adresses des serveurs DNS, etc. selon la réponse reçue. Évidemment sur un réseau sans serveur DHCP, les commandes traditionnelles de réseau (ifconfig, route, ip...) doivent être utilisées.

Lorsque la configuration est faite, nous devons vérifier que les serveurs web peuvent être interrogés (“ping fsl.com”). Si ce n'est pas le cas, vous devrez enquêter. Toutefois comme cette partie suit exactement la même procédure qu'avec un Linux sur un ordinateur, il y a plein de ressources sur le Net. Sur notre carte, ça fonctionne bien.

Port Ethernet de la BBB et le câble venant du routeur

Super, mais ce serait encore mieux si la requête DHCP était faite automatiquement lorsque la câble est branché. C'est là qu'intervient le service ifplugd. Ce service va demander une IP chaque fois que l'insèretion d'un câble Ethernet est detectée.

Puisque le paquet vient déjà avec une configuration pour l'interface eth0, la seule chose que nous avons à faire est de demander au gestionnaire de paquets d'installer le programme (“pacman -S ifplugd”) et activer le service (“systemctl enable ifplugd@eth0.service”).

C'est déjà prêt et ce sera fonctionnel au prochain démarrage.

Réseau sur USB

En plus de l'Ethernet, il pourrait être utile de se connecter via USB. Un accès à la console est intéressant, mais un lien réseau est encore plus fantastique.

La BeagleBoneBlack dispose du matériel nécessaire pour faire de l'USB-OTG, qui permet à la carte de se comporter comme un périphérique USB. Nous allons utiliser cette capacité pour faire apparaître la carte comme un périphérique usb-net et établir une connexion IP grâce à la fonctionnalité gadget USB du noyau Linux.

Les gadgets USB sont des pilote du noyau qui permettent à un système Linux équipé du matériel approprié de se comporter comme un périphérique USB. Une API spécifique permet aux développeurs d'écrire de tels drivers. heureusement, il existe des pilotes tout prêts dans les sources de Linux. Ces drivers permettent à la carte d'être vue comme un lien série, un périphérique HID, une webcam, etc. Dans notre cas, le gadget USB nommé g_ether transformera la BBB en périphérique Ethernet-sur-USB.

La BBB sera vue comme un périphérique Ethernet-sur-USB

Il faut noter qu'un seul gadget peut être chargé à la fois. Lorsque le noyau est configuré avant la compilation, nous pouvons choisir dans un menu lequel nous voulons compiler dans le noyau. Une autre solution est de compiler plusieurs d'entre eux sous la forme de modules. Cette alternative est utilisée dans le noyau de ArchLinuxARM, comme dans beaucoup d'autres noyaux de distributions.

Lorsqu'ils sont construits en tant que modules, les pilotes ne sont pas inclus dans l'image binaire du noyau. Ils deviennent des fichiers binaires auxilliaires (l'extension .ko est utilisée pour “kernel objects”) qui peuvent être chargés dynamiquement dans le noyau en fonctionnement. Ces fichiers doivent être présents dans le système de fichiers de la cible pour être utilisés. Dans le cas de nos gadgets, ils sont placés dans /usr/lib/modules/<kernel-version>/kernel/drivers/usb/gadget/.

Par exemple, nous pouvons charger g_serial avec la commande “modprobe g_serial” (certains paramètres peuvent être fournis, mais ceux par défaut fonctionnent). Cela crée un nœud /dev/ttyGS0 sur la carte. Sur l'ordinateur, une périphérique USB-série est détecté et un nœud /dev/ttyACM0 est créé. Nous pouvons maintenant ouvrir ces nœuds avec un terminal série comme "screen" et échanger des données comme sur une liaison série classique dans Linux.

    Sur cible:

            screen /dev/ttyGS0

    Sur PC:

            screen /dev/ttyACM0

    Rappel : Pour quitter screen, il faut utiliser la séquence "Ctrl-A k y"

Dans notre cas, nous voulons charger le module g_ether, mais le gadget g_serial est déjà chargé désormais. Puisque l'insertion de modules n'est pas permanent, nous pourrions simplement redémarrer le robot, mais nous perdrions tout autre configuration temporaire. Une meilleure solution consiste à décharger le module avec la commande “modprobe -r g_serial”.

Nous pouvons maintenant harger le module g_ether (“modprobe g_ether”) et lister toutes les interfaces réseau (“ifconfig -a”). L'interface réseau usb0 est présente comme attendu.

Pour rendre cette interface permanent, le module doit être chargé à chaque démarrage. Un dossier spécial est présent dans ArchLinuxARM pour cela. Nous avons juste à créer un fichier /etc/modules-load.d/g_ether.conf avec ce contenu:

    # Charger g_ether.ko au démarrage
    g_ether

Après redémarrage, l'interface usb0 est présente.

Adresse IP automatique sur usb-net

Même si nous pouvons configurer l'adresse IP manuellement, il serait plus pratique si c'était automatique. De plus, cela permettait de travailler sans avoir besoin de la liaison série de débug la plupart du temps.

Pour commencer, nous installons un serveur DHCP grâce au gestionnaire de paquets (“pacman -S dhcp”). Puis nous éditons sa configuration dans le fichier /etc/dhcpd.conf, qui se passe d'explication:

    # dhcpd.conf

    default-lease-time 600;
    max-lease-time 7200;

    subnet 192.168.2.0 netmask 255.255.255.0 {
        range 192.168.2.10 192.168.2.20;
    }

L'étape suivante est d'activer le service au démarrage (“systemctl enable dhcpd4.service”), mais ce n'est toujours pas suffisant. L'interface usb0 doit avoir une IP statique pour que le serveur DHCP embarqué puisse savoir quelle interface est liée au sous-réseau.

Nous allons donc affecter une IP statique dans /etc/conf.d/network@usb0

    address=192.168.2.1
    netmask=24
    broadcast=192.168.2.255

puis créer un service /etc/systemd/system/network@.service

    [Unit]
    Description=Network connectivity (%i)
    Wants=network.target
    Before=network.target
    BindsTo=sys-subsystem-net-devices-%i.device
    After=sys-subsystem-net-devices-%i.device

    [Service]
    Type=oneshot
    RemainAfterExit=yes
    EnvironmentFile=/etc/conf.d/network@%i

    ExecStart=/usr/bin/ip link set dev %i up
    ExecStart=/usr/bin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev %i

    ExecStop=/usr/bin/ip addr flush dev %i
    ExecStop=/usr/bin/ip link set dev %i down

    [Install]
    WantedBy=multi-user.target

et finalement activer ce service (“systemctl enable network@usb0.service ”)

La BBB peut désormais être redémarrée. L'ordinateur de développement va voir une interface Ethernet interface, essayer de s'y connecter et obtenir une adresse IP dans ce mini réseau.

Le réseau ovre les horizons

Une connexion réseau à la BBB est bien plus intéressant qu'une liaison série. Bien sûr, il est possible d'avoir accès à un shell en se connectant via SSH (le serveur est lancé par défaut dans ArchLinuxARM), mais ce n'est pas la seule option.

En fait, nous pouvons faire à peu près tout ce qu'un réseau permet: héberger un serveur web, naviguer sur le Net, jouer à des jeux en ligne, vérifier ses curriels, chatter, accéder aux données d'un NAS... Regardons deux usage que nous avons dans le robot.

Le premier est d'avoir accès aux fichiers. grâce au serveur SSH, nous pouvons copier des fichier de la cible au PC ou du PC à la cible. La syntaxe est “scp <source> <destination>” comme le classique “cp” exepté que la source ou la destination peuvent être une adresse SSH de la forme “user@ip:path” (par exemple “scp start_robot.sh sikula@192.168.2.1:/usr/local/bin/”). Le système de fichier peut aussi être atteint par SFTP (attention, SFTP est à travers SSH alors que FTPS est le protocole FTP+SSL) avec Filezilla par exemple.

Une autre utilisation que nous avons est de récolter des données en live. Pendant qu'il tarvaille le robot envoit une grande quantité de données qu'il collecte, comme sa position estimée, la vitesse de ses roues, la valeur de ses capteurs, etc. La plupart de ces données sont perdues quelques millisecondes plus tard pour cause d'obsolescence. Sur le PC de développement, nous pouvons recevoir ces données et les traiter de la manière que l'on veut (souvent en live) pour éviter de stocker des gigaoctets de données brutes sur la carte seulement pour le debuggage. Dans l'autre sens, nous pouvons envoyer des données au robot, pour le contrôler ou changer ses paramètres sans reprogrammer.

Prochain article

C'est la fin du deuxième article. Le prochain traitera la compilation, la compilation croisée et la compilation distribuée.