Archives par étiquette : raspberry pi

GPIO – Servos moteurs, joypad et WiFi

IMG_5494

Nous allons voir dans cet article comment réaliser une station de pilotage à distance pour commander des servos moteurs, à l’aide d’un Raspberry Pi, d’un joypad et d’un lien WiFi. Dans cet exemple j’uitiliserai un eeePC 901 pour la station de pilotage, mais il est tout à fait possible d’utiliser un deuxième Raspberry Pi.

Voici un schéma global :

pi joystick servoLa construction de ce dispositif se fait en trois étapes :

  1. Contrôle des servos moteurs par le Pi
  2. Utilisation du joypad
  3. Envoi des commandes à distance par wifi

Liste du matériel utilisé dans cet article

 

1 – Contrôle des servos moteurs par le Pi

Pour piloter plusieurs servos moteurs avec un Pi, nous n’avons d’autre choix que de passer par une carte contrôleur. Le site Adafruit propose justement un circuit permettant de contrôler jusqu’à 16 servos moteurs en utilisant le bus I²C (disponible sur le GPIO du Pi comme expliqué dans cet article GPIO – Entrée en matière).

imageVous pouvez acheter ce circuit directement sur le site d’Adafruit : Adafruit 16-Channel 12-bit PWM/Servo Driver – I2C interface – PCA9685

imageVous devrez sortir votre fer et souder les broches sur le circuit imprimé 🙂 Un bornier est prévu pour connecter une source d’alimentation. J’utilise un bloc coupleur de pile avec 4 piles AA pour fournir une tension de 6V, parfait pour alimenter mes servos moteurs.

Côté servos, je dispose de deux gros FUTABA S3010 et d’un minuscule FUTABA S3114.

Le branchement de la carte sur le Pi peut se faire simplement à l’aide de wire jumpers. Il suffit de connecter l’alimentation (3,3V et la masse/ground) ainsi que les broches SCL et SDA comme sur le schéma ci-dessous :

branchement_16cUne fois les branchements effectués, il convient d’activer le support de l’I²C sur le Raspberry Pi. Ceci se fait en deux étapes :

1 – Editez le fichier /etc/modules et ajoutez les deux lignes suivantes :

i2c-bcm2708
i2c-dev

2 – Editez ensuite le fichier /etc/modprobe.d/raspi-blacklist.conf et commentez les deux lignes suivantes (en ajoutant # au début de ces deux lignes) :

# blacklist spi-bcm2708
# blacklist i2c-bcm2708

Pour finir, installez l’outil i2c-tools et redémarrez le Pi :

apt-get install i2c-tools
shutdown -r now

Pour vérifer que la carte est bien reconnue par le Pi, lancez la commande suivante :

i2cdetect -y 1 # pour la révision 2 du Pi

ou

i2cdetect -y 0 # pour la première version du Pi

Vous devriez obtenir ce résultat :

root@raspberrypi:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --

Bien ! Nous allons maintenant écrire le programme en Python qui va nous permettre de piloter ces servos moteurs. Python est installé par défaut sur Raspbian, il ne manque que certains paquets :

apt-get install python-dev python-rpi.gpio python-smbus

Adafruit propose une librairie Python qui permet de dialoguer facilement avec les différents composants distribués par son site. Nous n’allons pas nous en priver 🙂 Pour télécharger la dernière version disponible de cette librairie, il suffit d’en récupérer les sources sur le dépôt GIT :

git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git

La partie qui nous intéresse ici se trouve dans le répertoire Adafruit-Raspberry-Pi-Python-Code/Adafruit_PWM_Servo_Driver.

Dans un premier temps, voici un petit script qui permet de tester les servos test_servo.py :

#!/usr/bin/python

from Adafruit_PWM_Servo_Driver import PWM
import sys

pwm = PWM(0x40, debug=True)
pwm.setPWMFreq(60)

pwm.setPWM(int(sys.argv[1]), 0, int(sys.argv[2]))

Pensez à rendre ce script exécutable grâce à la commande chmod 755 test_servo.py

Ce script prend deux paramètres :

  • l’id du port contrôlant un servo de 0 à 15
  • une valeur, généralement entre 150 et 600 qui détermine la position que doit prendre le servo

Exemples pour commander le servo branché sur le premier port (ayant pour id 0) :

./test_servo.py 0 480
./test_servo.py 0 240

Et voilà, si tout s’est bien passé, vous devriez pouvoir piloter vos servos de cette manière. Nous verrons plus loin dans cet article comment les piloter avec un joypad et à distance 🙂

Note : Je ne sais absolument pas pourquoi le troisième paramètre de la fonction setPWM() doit être entre 150 et 600… De même, je ne sais pas à quoi correspond le deuxième paramètre attendu par cette fonction. Si quelqu’un connaît la réponse, merci de nous expliquer cela en commentaire de cet article 🙂

2 – Utilisation du joypad

26-127-505-02Je dispose d’un magnifique joypad USB, modèle Saitek P990 munis de deux mini-joysticks ou « chapeaux chinois ». Nous allons utiliser ces deux joysticks pour piloter nos servos.

Un joystick qu’est ce que c’est ? En fait, c’est simplement un potentiomètre dont la valeur (la résistance) est interprétée et traduite en nombre. Sur ce modèle de joypad, les valeurs sont échantillonnées de 0 à 1023 (soit 1024 valeurs possibles). Pour obtenir deux axes, il y a deux potentiomètres par joystick. Avec deux joysticks, nous avons donc de quoi piloter indépendamment 4 servos 🙂

La librairie Python evdev permet d’interagir facilement avec les événements déclenchés par des périphériques USB. Pour l’installer :

apt-get install python-pip python-dev
pip install evdev

Avant d’écrire un script Python qui sache interpréter les actions de ces joysticks, vous devez connaître l’identifiant « event » attribué par le système au moment où vous branchez votre joypad USB.

lsusb
Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 005: ID 05e3:0505 Genesys Logic, Inc.
Bus 002 Device 003: ID 06a3:040b Saitek PLC P990 Dual Analog Pad
Bus 005 Device 002: ID 0b05:b700 ASUSTek Computer, Inc. Broadcom Bluetooth 2.1
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 006: ID 11b0:6148 ATECH FLASH TECHNOLOGY
Bus 001 Device 007: ID 05af:3062 Jing-Mold Enterprise Co., Ltd Cordless Keyboard
Bus 001 Device 008: ID 046d:c016 Logitech, Inc. Optical Wheel Mouse

Mon joypad est bien reconnu par le système avec la dénomination : « Saitek PLC P990 Dual Analog Pad« .

cat /proc/bus/input/devices

Cherchez la référence à votre joypad et repérez l’identifiant « event », ici nous avons l’identifiant « event6« .

[...]

I: Bus=0003 Vendor=06a3 Product=040b Version=0100
N: Name="Saitek P990 Dual Analog Pad"
P: Phys=usb-0000:00:1d.0-2/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/input/input15
U: Uniq=
H: Handlers=event6 js0
B: PROP=0
B: EV=1b
B: KEY=3fff 0 0 0 0 0 0 0 0 0
B: ABS=30027
B: MSC=10

[...]

A chaque fois que l’on va presser un bouton sur le joypad, ou actionner un de ses joysticks, un événement sera déclenché. Il s’agit donc de surveiller en permanence les événements déclenchés et d’agir en fonction. Voici maintenant un petit script Python qui permet de tester votre joypad et d’identifier les différents événements liés à chaque joystick et chaque bouton : test_joypad.py

#!/usr/bin/python

from evdev import InputDevice, categorize, ecodes
from time import sleep
from datetime import date
import os, sys, socket

dev = InputDevice('/dev/input/event6') # reprendre le même identifiant "event"
print(dev)

for event in dev.read_loop(): # boucle qui surveille l'arrivée d'un événement
  e_code=event.code
  e_type=event.type
  e_value=event.value
  print(str(e_type)+' - '+str(e_code)+' - '+str(e_value))

A chaque fois que vous toucherez quelque chose sur votre joypad, ce script affichera trois variables, e_code, e_type et e_value :

./test_joystick.py
device /dev/input/event6, name "Saitek P990 Dual Analog Pad", phys "usb-0000:00:1d.0-2/input0"
3 - 0 - 508
3 - 0 - 412
3 - 0 - 347
3 - 0 - 391
3 - 0 - 457
3 - 0 - 511
3 - 1 - 602
3 - 1 - 701
3 - 1 - 771
3 - 1 - 659
3 - 1 - 561
3 - 1 - 511

Voilà ce que j’obtiens en actionnant le joystick gauche de mon joypad, identifié par l’e_code 3. Dans l’axes des X, j’obtiens un e_type 0, et un e_type 1 pour l’axe des Y. Lorsque je relâche le joystick en position centrale, les valeurs sont proches de 512 (valeur médiane entre 0 et 1023). Ces caractéristiques sont propres à ce modèle de joypad, mais le principe de fonctionnement est le même pour tous 🙂 Ce petit script vous permettra de noter l’e_code et l’e_type de chaque bouton et joystick que vous voulez utiliser.

Pour ma part, j’ai trois servos à piloter, et je dispose de deux joysticks avec chacun deux axes. J’utiliserai l’axe X du joystick gauche (e_code 3, e_type 0) pour piloter le servo 1. L’axe Y du joystick gauche (e_code 3, e_type 1) pour piloter le servo 2. Et enfin l’axe X joystick droit (e_code 3, e_type 5) pour piloter le servo 3 🙂

A partir de là, vous pouvez facilement imaginer associer le servo 1 au roulis d’un avion, le servo 2 au tangage et le servo 3 au lacet par exemple 🙂

La dernière étape consiste à envoyer les commandes du joypad, branché sur la station de pilotage, au Raspberry Pi qui répercutera les ordres sur ses servos 🙂

3 – Envoi des commandes à distance par wifi

Nous avons d’un côté un script Python qui tourne sur un Raspberry Pi qui a pour rôle de piloter des servos. De l’autre, nous avons un eeePC (ou autre machine…), qui exécute un second script Python dont le but est d’interpréter les commandes envoyées par un joypad. Il s’agit maintenant de faire communiquer ces deux scripts entre eux, ce que nous pouvons facilement faire grâce aux sockets 🙂

Sans trop rentrer dans les détails, il s’agit d’ouvrir une socket au niveau du script qui s’exécute sur le Pi afin qu’il soit à l’écoute de messages envoyés par le script côté « station de pilotage ». Le script côté « station de pilotage » se connecte à cette socket en passant par le réseau IP (via WiFi), et envoie les commandes déclenchées par le joypad.

Côté Raspberry Pi :

#!/usr/bin/python

from Adafruit_PWM_Servo_Driver import PWM
import sys, os, socket

listen_address = ('0.0.0.0', 12800) # écoute sur toutes les interface sur le port 12800

srv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # protocole UDP
srv_socket.bind(listen_address)
print "server enabled"

pwm = PWM(0x40, debug=True) # initialisation de la carte contrôleur
pwm.setPWMFreq(60)

while True:
  query, clt_address = srv_socket.recvfrom(1024) # écoute les message
  order=query.split('_') # on découpe les messages reçus
  servo=order[0]
  pos=order[1]
  print str(query)+' - '+str(servo)+' - '+str(pos) # on affiche les infos
  pwm.setPWM(int(servo), 0, int(pos)) # on envoie la commande au servo
sys.exit(0)

Côté Station de pilotage :

#!/usr/bin/python

from evdev import InputDevice, categorize, ecodes
from time import sleep
from datetime import date
import os, sys, socket

now = date.today()
print(now)

clt_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # protocole UDP
srv_address = ('192.168.101.27', 12800) # on vise l'adresse IP du Pi sur le port 12800

dev = InputDevice('/dev/input/event6') # initialisation du joypad
print(dev)

def convertAxis (value, axis_max): # fonction qui convertie les valeurs des joystick
  facteur=axis_max/490
  new_value=int(round((value/facteur)+150, 0))
  return new_value

for event in dev.read_loop(): # pour chaque événement détecté
  e_code=event.code
  e_type=event.type
  e_value=event.value
  print(str(e_type)+' - '+str(e_code)+' - '+str(e_value))
  if e_type == 3:
    if e_code == 0: # à destination du servo 1
      servo_pos=str(convertAxis (e_value, 1024))
      clt_socket.sendto("0_"+servo_pos, srv_address)
    elif e_code == 1: # à destination du servo 2
      servo_pos=str(convertAxis (e_value, 1024))
      clt_socket.sendto("1_"+servo_pos, srv_address)
    elif e_code == 5: # à destination du servo 3
      servo_pos=str(convertAxis (e_value, 512))
      clt_socket.sendto("2_"+servo_pos, srv_address)

Conclusions

En déclinant ce principe, vous pouvez piloter de nombreux servos moteurs à distance et commencer à envisager la construction systèmes complexes comme des robots ou des drones 🙂

En parlant de drone, ces articles relatifs au GPIO me serviront à construire un drone avion, comme expliqué ici : Raspberry Pi BOA Drone 🙂

Cependant, certaines zones d’ombre persistes, notamment sur le pilotage de servos. L’utilisation de la lib distribuée par Adafruit évite de se poser de question, cela fonctionne immédiatement. La contre partie, c’est qu’on ne comprend pas forcément tout ce qui se passe. Aussi, j’invite les lecteurs de ce blog à intervenir en commentaire de cet article afin d’apporter des informations complémentaires, des idées ou simplement des remarques 🙂

Merci à vous 🙂

GPIO – Entrée en matière

Grâce à son port GPIO (General Purpose Input/Output), le Raspberry Pi peut interagir avec le monde réel en communiquant avec des capteurs, des moteurs, et un tas d’autres composants électroniques (sondes de température, LEDs, capteurs gyroscopiques, boussoles, GPS, servos moteurs, récepteurs IR/RF…). De la petite commande relais pour piloter vos guirlandes de Noël, au robot, en passant par la station météo et le drone, les possibilités sont sans limites, ou presque 🙂

pi_gpio

Le matériel de base

Qui dit GPIO, dit composants électroniques 🙂 Il va de soit que des compétences en électronique de base sont requises. De plus, il convient de s’équiper d’un minimum de matériel afin de pouvoir tester et réaliser de petits circuits.

imageVoici, selon moi, le stricte minimum du matériel à acheter avant de démarrer :

Le port GPIO

Le port GPIO du Pi comporte 26 broches qui peuvent être utilisées de manières différentes. Le schéma ci-dessous (publié par le site eLinux) montre le rôle de chaque broches ainsi que les protocoles qu’elles supportent.

GPIOsOn distingue 7 types de broches et usages qu’on peut en faire :

Ces différents « bus » et « protocoles » permettent d’interfacer le Pi avec d’autres cartes, modules ou composants électroniques.

Les exemples d’utilisation les plus simples des broches de type GPIO sont l’allumage et l’extinction d’une LED, l’interaction avec un bouton/interrupteur, le contrôle de relais, etc,…

L’I²C, le SPI, l’UART et le PWM permettent quant à eux de communiquer avec des microcontrôleurs pour réaliser des opérations plus complexes telles que le contrôle de servos moteurs, la lecture de mesures prises par des capteurs etc,…

Alimentation des broches

Avant toute chose il est important de préciser les broches du port GPIO sont alimentées en 3,3V. Seules les deux broches d’arrivée de courant (en rouge) fournissent une tension de 5V.

Ce qui veut dire qu’en mode ouput (sortie) la tension fournie par une broche est de 3,3V et délivrera un courant de 50mA max. Vous devrez donc vous assurer que les composants que vous reliez à ces broches supportent se type de courant. En mode input (entrée), une broche ne tolérera qu’une tension maximum de 3,3V ! Vous devrez donc toujours faire attention à vos branchements pour éviter d’endommager votre Raspberry Pi 🙂 

En outre, il est préférable d’utiliser une source d’alimentation tierce pour les composants et modules électroniques que vous souhaitez ajouter dans votre circuit. En effet, le Raspberry Pi n’est pas suffisamment robuste pour alimenter correctement et sans danger des circuits électroniques. Pour allumer une LED pas de problème, mais pour faire tourner un moteur, prévoyez une source d’alimentation dédiée.

Dans l’absolue, et pour des raisons évidentes de sécurité, je conseille d’utiliser des piles plutôt que de travailler directement sur le secteur (d’où le coupleur de pile dans la liste du matériel de base) 😉

Prendre la main sur le port GPIO

WiringPi est un outil qui permet de contrôler les différentes broches du port GPIO. Pour installer WiringPi :

git clone git://git.drogon.net/wiringPi
cd ./wiringPi
./build

A partir de là, vous pouvez obtenir l’état de toutes les broches grâce à la commande :

gpio readall

Ce qui devrait vous afficher un tableau de ce type :

readallChaque ligne du tableau représente une broche du port GPIO et vous indique sont mode IN/OUT (entrée/sortie) et sont état/valeur 0/1 (low/high). La colonne GPIO représente le numéro de la broche tel que décrit sur le schéma en haut de cet article. La colonne wiringPi représente le numéro de broche que vous devez utiliser en utilisant la commande gpio.

De manière très simplifiée, si vous voulez allumer une LED, vous devez mettre la broche en mode sortie/output. En mettant l’état de la broche à 1/up, la LED s’allumera. Si vous voulez savoir si un bouton/interrupteur est ouvert ou fermé, vous devez mettre la broche en mode entrée/input. Si vous lisez la valeur 0/down, alors l’interrupteur est ouvert. Si vous lisez la valeur 1/up, alors l’interrupteur est fermé 🙂 Dans la pratique c’est un tout petit peu plus complexe, mais il s’agit là de comprendre le principe.

Pour chaque broche, vous pouvez changer le mode entrée/sortie ou in/out grâce à la commande (<pin> étant le numéro de la broche ciblée) :

gpio mode <pin> in
gpio mode <pin> out

En mode entrée/read vous pouvez lire l’état d’une broche avec la commande :

gpio read <pin>

En mode sortie/write, vous pouvez changer l’état d’une grâce à la commande :

gpio write <pin> 0
gpio write <pin> 1

Pour plus d’information sur la commande gpio : http://wiringpi.com/the-gpio-utility/

Quelques exemples de montages simples

En cherchant un peu sur le web vous trouverez une multitude de tutos qui expliquent comment faire de petits montages simples. Inutile de plagier la terre entière en recopiant ici ces tutos, je préfère vous donner directement quelques liens :

1 – Raspberry Pi BOA Drone

Pi-BOA-Drone_small_45C’est avec un grand plaisir que j’attaque ce nouveau projet : un drone avion longue distance, piloté par un Raspberry Pi, baptisé Pi BOA Drone 🙂 L’objectif (impossible ? ambitieux ?) de ce projet est d’effectuer un vol de 400 kms (entre Lille et Metz) en parfaite autonomie (auto-pilote) !

Les avions et la robotique m’ont toujours passionné, et le mariage de ces deux mondes avec l’avènement des drones, tant au niveau militaire que « domestique », m’a donné envie de realiser mon propre drone. Il y a quelques années, cela relevait du fantasme, les composants et matérieux étaient chers et il n’existait pas de « système » suffisamment compact et accessible pour pouvoir l’intégrer à dans « object volant » sans se ruiner. L’arrivée du Raspberry Pi a changé la donne 😉

Les drones actuels

parrot_ar_droneUn des premiers drones a avoir été présenté au grand public est l’AR Drone de Parrot. Vendu en France à partir de 2010 pour près de 350€, il est, je pense, à l’origine de nombreux autres projets volants de la famille des multicopters/multirotors.

Soyons clair, il s’agit en fait d’un « hélicoptère » télécommandé amélioré. Je vais être vache, mais prenez un petit hélicoptère comme le Silverlit Sky Unicorn vendu une trentaine d’euros, ajoutez y une mini caméra, et vous obtenez le même résultat : Un objet volant télécommandé capable de faire du vol stationnaire tout en capturant une vidéo. Même si la technologie embarquée dans l’AR Drone est beaucoup plus complexe (gestion des rotors, capteurs, etc,…), le résultat est sensiblement le même… En disant cela, je ne cherche pas à dénigrer quoi que ce soit, j’essaie simplement de démystifier le sujet pour montrer qu’un drone n’est qu’un ensemble de systèmes simples 🙂

IMG_5459J’ai ce petit hélicoptère (le Silverlit Sky Unicorn) depuis plusieurs mois, et je dois dire que je m’amuse beaucoup avec 😀 Il m’a énormément inspiré pour ce projet de drone. Si vous vous lancez dans l’aventure, je vous conseille de vous acheter ce genre de jouet très abordable ne serait ce que pour vous familiariser avec la chose et vous rendre compte des problématiques liées au vol d’un objet 🙂

Revenons à l’AR Drone et à son système électronique embarqué. La première génération de la bête est pilotée par un processeur ARM9 qui fait tourner un OS Linux avec 128 Mo de RAM, le tout étant télécommandé via un lien WiFi. Cela ne vous rappelle rien ? Le tableau ci-dessous vous mettra sur la voix :

Système embarqué
AR Drone v1
Raspberry Pi
Modèle B 512
Processeur ARM9 468 MHz ARM11 700 MHz
RAM 128 Mo 512 Mo
Connectique USB, WiFi USB, Ethernet, GPIO
OS Linux Linux

Tout à fait ! C’est un système très semblable au Raspberry Pi qui fait voler l’AR Drone 🙂 Ce constat permet de valider l’hypothèse qu’il est possible de faire voler quelque chose grace à un Pi 🙂

Les drones multirotors

hexaphoto2Quand on dit « drone », on pense souvent aux drones de la famille des multicopters/multirotors, c’est à dire un « hélicoptère » à plusieurs rotors.  En cherchant sur le web, vous trouverez une multitude de sites/blogs qui expliquent comment créer un drone multirotors. Il existe même des systèmes « prêts à l’emploi », et des circuits dédiés au pilotage des différents rotors (qui est une opération relativement complexe). De plus en plus de sites spécialisés vendent tout le matériel nécessaire pour que vous puissiez monter vous même votre drone tri/quadri/hexa/octocopter. Celon les configurations et les matériaux, comptez plusieurs centaines d’euros tout de même.

L’intérêt de ce type de drone est qu’ils peuvent faire du vol stationnaire, ce qui est idéal pour les prises de vues aériennes. Plusieurs entreprises exploitent déjà ce créneau, comme la société Nord Drone Services dont je salue l’initiative 🙂

En revanche, ces drones consomment beaucoup d’énergie rien que pour se maintenir en l’air. Même si certains modèles permettent d’embarquer plusieurs kg de matériel, c’est au détriment de l’autonomie qui dépasse rarement les 20 minutes.

openpilot_logoJ’attire votre attention sur le projet OpenPilot qui propose une plateforme opensource pour la réalisation de ce type de drone. La communauté autour de ce projet est très active et le site est une mine d’information pour quiconque s’intéresse au sujet 🙂

Les drones avions

MQ-1_Predator_UAV_DronePersonnellement, je suis fasciné par les drones utilisés par les militaires depuis quelques années. Ces bijoux de technologies (qui sont en fait de gros avions télécommandés beaucoup plus simple à faire voler qu’un quadricoptère) ont le gros avantage d’avoir des ailes ! S’appuyer sur des ailes pour rester en l’air est beaucoup moins énergivore et permet d’emporter de plus lourdes charges. Il suffit d’assurer une propulsion suffisante pour assurer la portance nécessaire et ainsi maintenir l’avion en vol.

HarfangEn effet, l’objectif du projet Pi BOA Drone, est de parcourir de longues distances, l’autonomie, et par conséquent la gestion de l’energie, est donc une question cruciale. C’est pourquoi je m’oriente plutôt vers un drone avion. En terme de design, j’aime beaucoup les empennages bi-poutre comme pour le drone Harfang d’EADS.

D’où un premier croquis du drone que j’image réaliser :

Pi-BOA-Drone_small

Pi BOA Drone

Qui dit drone, dit moteurs, servos moteurs, capteurs, accéléromètres, gyroscopes, gps,… c’est à dire beaucoup de composants électroniques avec lesquels il va falloir communiquer. Heureusement pour nous, le Raspberry Pi est doté d’un port GPIO (General Purpose Input/Output) 🙂

pi_gpioCet articles servant d’introduction au projet, je ne vais pas détailler ici le fonctionnement de ces pines. Sachez toutefois que le port GPIO du Pi supporte plusieurs types d’interfaces. Pour plus de détails, consulter cette page : http://elinux.org/RPi_Low-level_peripherals

Electronique

Contrairement aux projets Pi TimeLapse, Pi CarJukeBox et Pi HomeDashScreen, nous aurons ici besoins de compétences en électronique. Mes connaissances dans ce domaine sont, pour le moment, très limitées. Pour comprendre comment les choses fonctionnent, je me base sur des livres que j’ai acheté pour l’occasion, ainsi que sur ce que je trouve sur le web.

C’est pourquoi, je lance un appel à l’aide 🙂 Tous ceux qui sont intéressés par le projet et qui ont des compétences en électroniques sont invités à intervenir pour apporter des explications/informations/astuces ou corriger d’éventuelles erreurs 🙂

Aéronautique

Puisqu’il s’agit d’un avion, il va également falloir comprendre les notions de bases de l’aéronautique pour nous permettre de réaliser le corps et les ailes du drone ainsi que son système de propulsion.

Pire que l’électronique, mes connaissances dans ce domaine sont proches du néant 🙁 J’en appelle donc aux passionnés de modélismes et autres professionnels de l’aéronautique et vous encourage à intervenir sur les différents articles 🙂

Démarrage du projet

A l’heure d’aujourd’hui, je n’ai aucune certitude quant à la faisabilité du projet, et je n’ai qu’une vague idée de la manière dont il faut procéder 🙂 Même pour la configuration de l’avion, son design, le nombre de moteurs, ses caractéristiques et sa taille, rien n’est encore fixé, tout est à l’étude 🙂

Ce dont je suis certain, c’est que ce projet sera très instructif et passionnant 🙂

Compte tenu de la quantité de choses à comprendre pour la réalisation d’un drone de ce type piloté par un Pi, je vais aborder les différentes problématiques les unes après les autres. Tout ce qui touchera à l’utilisation du port GPIO, fera l’objet d’un article dédié publié dans la catégorie GPIO du menu principal de ce blog.

Une fois que nous aurons tous les éléments pour contrôler les différents composants, je poursuivrai cet article en expliquant de manière très didactique comment réaliser le drone et le piloter. Comme pour les autres projets, je tâcherai d’établir une liste complète du matériel à acheter ainsi qu’une estimation du prix total. Nous aborderons également les problématiques juridiques liées au pilotage d’un drone sur le territoire français.

A suivre 🙂

Note sur la réglementation relative aux UAV en France

Il est clair que les contraintes administratives et autres règlementations sont ultra restrictives quant au vol des drones et autres UAV en France. Dans tous les cas, je n’ai pas l’intention de faire quelque chose d’illégale, je ferai le nécessaire pour être en règle. S’il savère qu’il est impossible d’obtenir une autorisation pour faire voler mon drone en France, alors je me limiterai à des vols sur propriétés privées, voire dans mon salon si il le faut -_-. Il est certain que je ne vais pas m’arrêter de réfléchir à la conception d’un drone simplement parce que « c’est interdit »… D’ailleurs ce n’est pas « interdit », c’est simplement réglementé ! Il s’agit de se conformer à la réglementation 🙂

Pour le moment, je suis plus concentré sur le challenge technique, je n’en suis pas encore à faire voler quelque chose :)

Par ailleurs, l’idée du projet est bien de faire un drone « home made » et « from scratch ». Ce n’est pas tant de faire voler un drone qui m’intéresse (je pourrais en acheter un…), mais plutôt la partie « ingénierie ». Construire un drone autonome fait appelle à des technos et des compétences très variées, c’est cela qui m’intéresse. C’est comme pour les Légos, une fois que c’est construit, ça n’a plus vraiment d’intérêt ;)

Pour terminer, cela me parait évident de ne pas passer au dessus des zones habitées ni au dessus des aérodromes ^^ Il y a un minimum de bon sens à avoir, et il faut prévoir un itinéraire sans danger. J’ajouterai que dans tous les cas, je ne vais pas lancer mon drone et espérer qu’il arrive à bon port… Je le suivrai de près en voiture avec tout le matériel nécessaire pour le localiser en temps réel :)

Maintenant que ces questions législatives et oh combien barbantes ont été abordées, je vous propose d’en revenir aux problématiques techniques :)

Comment alimenter votre Raspberry Pi avec une batterie (MàJ)

En parcourant le web au sujet du Raspberry Pi et en observant les statistiques de fréquentation de ce blog www.magdiblog.fr, je me rends compte que le sujet le plus recherché porte sur le fonctionnement du Pi sur batterie.

imageEn effet, et c’est également mon avis, ces mini-ordinateurs ne sont pas faits pour rester sur un bureau. La question de l’alimention du Pi pour qu’il puisse fonctionner en parfaite autonomie revient donc souvent.

Je vous propose ici de faire un tour d’horizon des informations et tests que j’ai pu rassembler et effectuer au cours de mes diverses expérimentations, dans le but, je l’espère, de vous permettre de mener à bien vos projets 🙂

Les besoins du Raspberry Pi

Comme précisé par la FAQ du site raspberrypi.org, le Pi a besoin d’une alimentation en courant continue de 5V la plus propre possible. En effet, le Pi n’est pas protégé contre les piques et les chutes de tension qui pourraient lui causer des dommages, c’est pourquoi il faut veiller à la qualité de l’alimentation que vous utilisez.

En pratique, votre Pi « fonctionnera » avec une alimentation comprise entre 4,5V et 5,7V. J’ai notamment pu constater que la plupart des transfos ou « chargeurs » vendus dans le commerce affichant une tension de sortie de 5V, fournissent souvent un peu plus, environ 5,5V. Rien de très grave pour votre Pi 🙂

La tenstion du courant d’alimentation est une chose, mais le plus important est l’intensité (en ampère) du courant nécessaire au fonctionnement du Pi.

chargeur_5V2APour le modèle B, le site raspberrypi.org préconise une alimentation d’au moins 700mA (contre 300~400mA pour le modèle A). Pour les débutants, il faut voir cela comme la « quantité » de courant que doit fournir l’alimentation pour répondre aux besoins du Pi. Ce qui veut dire qu’il vous faudra une alimentation capable de fournir au moins 700mA pour que votre Pi (modèle B) puisse fonctionner correctement. Une alimentation de 900mA conviendra tout à fait, et disposera de 200mA de marge à distribuer à d’éventuels périphériques USB par exemple.


A savoir que ce « besoin » en courant de 700mA varie en fonction de l’utilisation du Pi, et des périphériques qui y sont connectés. Par exemple, sous Raspbian, quand le Pi modèle B ne fait rien (en idle donc), sa consommation est de l’ordre de 400~450 mA. Si on demande au processeur de travailler, il va consommer plus, avec des piques jusqu’à 600~650mA. Si on ajoute une webcam USB par exemple, on peut facilemement dépasser les 900mA. C’est d’ailleurs pour cette raison qu’il est souvent conseillé d’utiliser un hub USB disposant de sa propre alimentation afin de fournir suffisamment de courant à l’ensemble des périphériques connectés.

chargue_voiture_5VDans la pratique, j’ai constaté qu’une alimentation délivrant 1A (soit 1000mA) permet de couvrir tous les besoins, y compris avec deux périphériques USB énergivores tels qu’une webcam et une clé 3G par exemple.

Note : Certains chargeurs USB n’affichent pas directement l’intensité du courant qu’ils peuvent fournir. A la place, ils affichent la puissance max, en Watt qu’ils peuvent délivrer. La puissance (en W) est le produit de la tension (en V) et de l’intensité (en A) : P = U x I. Un transformateur 5V affichant une puissance de 12W, pourra donc fournir un courrant de 12/5 = 2,4 A.

Deux façons de brancher l’alimentation sur votre Pi

Vous pouvez, en effet, brancher l’alimentation de votre Pi de deux manières. Soit en utilisant la prise micro-USB spécialement prévue à cet effet, soit directement sur le port GPIO en branchant le + sur la pin 2 et le – sur la pin 6.

pi_microusb pi_gpio_alim

 L’alimentation sur batterie

Comme nous l’avons vu précédemment, il faut utiliser une batterie qui fournisse une tension de 5V, et qui soit capable de délivrer au moins 700mA.

Plusieurs possibilités s’offrent à nous. Ci-dessous en détails, les principales alternatives des bonnes vieilles piles AA aux batteries au plomb en passant par les batteries au Lithium.

Les piles AA

Vous pouvez utiliser de simples piles AA de 1,5V. Il vous en faudra 4, que vous pouvez placer dans un support à pile comme ce boîtier coupleur 4 piles R6 AA
.

support_4AApileLes boîtiers équipés d’un interrupteur permettent d’allumer et d’éteindre le Pi facilement. En outre, l’utilisation de piles/accus rechargeables permet de rentabiliser l’achat d’un petit chargeur de piles. Pour mes tests j’utilise 4 accumulateurs (rechargeables) Energizer d’une capacité de 2300mAh fournissant une tension de 1,2V. La tension totale est donc de 4×1,2V soit 4,8V.

L’inconvénient avec ces piles ou accumulateurs, c’est que la tension chute rapidement en dessous de 4,5V, ce qui devient insuffisant pour faire fonctionner le Pi. Selon l’usage que vous en faites, et les périphériques USB que vous utilisez, vous pouvez tenir entre 2 et 3 heures avec 4 piles/accumulateurs de ce type. Comptez tout de même autour de 20€ pour les 4 piles/accumulateurs et environ 25€ pour un chargeur. Soit prêt de 50€ pour 2 à 3 heures d’autonomie en comptant le boitier coupleur. C’est de loin la solution la plus onéreuse !

Les batteries Lithium-ion ou Lithium-polymère


Il s’agit des batteries vendues comme batteries de secours pour smartphones, tablettes et autres appareils mobiles. L’utilisation du 5V étant un standard pour tous ces périphériques, la plupart de ces batteries conviendront pour votre Pi.

Il faut cependant faire attention à l’intensité maximum que la batterie pourra fournir ; pour la plupart, elles sont capables de délivrer 1A. Le gros avantage de ce type de batterie est que vous pouvez les charger grâce à un câble USB (souvent fournis), ce qui vous évitera d’acheter un chargeur séparément. Autre point fort de ces batteries, elles disposent de prises USB standards, qui permettront l’utilisation d’un câble micro-USB pour les brancher sur le Pi. De quoi faire un montage propre 🙂 Sachez toutefois que ces batteries sont très sensibles aux variations de température. Trop chaud ou trop froid, leur capacité chutera drastiquement. Leur usage en extérieur est donc délicat…

Enfin, ces batteries sont très abordables. On peut trouver des modèles d’une capacité de 5,2 Ah (de quoi tenir environ 6 heures selon l’utilisation) pour moins de 15€ (frais de port compris), comme cette Romoss 5200mAh sur Amazon
. J’ai utilisé cette batterie pour le prototypage du projet Pi CarJukeBox que vous pouvez consultez ici : Proptotype jukebox embarqué

Pour le projet Pi TimeLapse, qui nécessite beaucoup plus d’autonomie, j’ai opté pour le modèle TeckNet PowerBank 9000mAh, qui offre plus de 12 heures de fonctionnement à votre Pi !

IMG_4503

Vous trouverez plus de détails sur l’utilisation de cette batterie en lisant cet article : Pi TimeLapse – L’alimentation – 1/2

De plus en plus de modèles sont disponibles, de qualité, capacité et prix très variables. Veillez donc à choisir une batterie dont le rapport capacité/prix est le plus intéressant, tout en prêtant attention à la réputation de la marque et aux avis des autres utilisateurs.

Un mot sur la capacité des batteries : La capacité d’une batterie s’exprime en Ah (ampères heure). Une batterie ayant une capacité de 5Ah pourra, en théorie, fournir 5A pendant 1 heure. Ceci n’est pas à prendre au pied de la lettre. En effet, si la batterie en question ne peut fournir qu’un courant d’ 1A maximum, alors on doit interpréter les 5Ah comme étant la capacité à fournir 1A pendant 5 heures. Il ne s’agit là que d’une approximation grossière,  mais qui sert de base de calcul. Dans la pratique, soyez pessimiste quand à la capacité réelle de votre batterie, et prévoyez plus gros que prévu si vous le pouvez. Comme expliqué par Nico en commentaire de cet article, une batterie affichant 5Ah ne fournira que 4Ah en réalité. S’agissant en général de batteries 3,7V couplées à un élévateur de tension pour atteindre 5V, on observe en effet un écart de 20% à 40% entre la valeur théorique et la valeur utile, selon la qualité et le rendement des composants de la batterie.

On trouve depuis peu de très petites batteries Lithium-polymère à des prix presque abordables. Le gros avantage de ce type de batterie est leur poids. C’est un excellent choix pour ceux qui souhaitent réaliser un drone, ou un dispositif très compact. Evidemment, cela se fait au détriment de la capacité et du prix… Même si les batteries Li-po se démocratisent, comptez tout de même 4 fois le prix d’une Li-ion à capacité égale…

Les batteries au plomb

batterie_plombLes batteries au plomb sont lourdes, très lourdes ! Mais, elles ne sont pas chères, elles se rechargent très facilement (pas besoin d’électronique complexe pour gérer la charge), et vous pouvez en trouver de toutes les capacités ; de quelques centaines de mAh à plus de 150 Ah pour les batteries de camion ! Et surtout, c’est presque increuvable, elles résistent au froid, au chaud, et durent des années sans trop perdre de leur capacité. Si le poids et l’encombrement ne sont pas un problème pour vous, une batterie au plomb peut être un excellent choix !


Pour le projet Pi TimeLapse, j’ai utilisé une batterie plomb rechargeable de 12V avec une capacité de 12 Ah. Je n’ai pas trouvé de batteries plomb en 5V, mais uniquement en 24V, 12V ou 6V. L’utilisation d’un petit convertisseur de tension tel que le KEMO M015N, permet de palier ce problème. Dans ce cas, prenez en compte la consommation du convertisseur de tension ainsi que les pertes occasionnées par la chute de tension.

Ce type de batterie peut notamment être utilisée sur les installations à panneaux solaires, ce qui est très pratique pour les stations météos, systèmes embarqués sur bateaux, en camping, etc…

Note sur les convertisseurs de tension : Pour passer d’une tension de 12V à 5V par exemple, vous devez utiliser un convertisseur ou régulateur de tension. Le KEMO M015N permet d’ajuster la tension de sortie, c’est pratique pour les tests, mais ce n’est pas très précis, sensible à la chaleur, et c’est relativement cher. Si vous connaissez précisemment la tension d’entrée et la tension de sortie dont vous avez besoin, préférez ce type de circuit S7V7F5, ou ce type de module U/SBEC utilisé en modélisme.

Pour les très longues durées

S’il s’agit de faire fonctionner votre Pi pendant quelques heures, une batterie Li-ion entre 5Ah et 9Ah sera parfaite. En revanche, si vous avez besoin que votre système soit fonctionnel plusieurs jours, semaines ou mois, cela devient vite problématique. Vous pouvez tout à fait acheter 200 batteries Li-ion de 10Ah, si vous parvenez à convaincre votre banquier et que vous disposez de plusieurs m3 pour les stocker… Dans le cas contraire il va falloir ruser 😉

Oubliez les panneaux solaires…

panneauJe suis tout à fait conscient que je risque d’en froisser certains, mais sous nos latitudes les panneaux solaires « portatifs » ne vous permettront pas de faire tourner votre Pi toute l’année…

Prennons un exemple : En moyenne, les chargeurs solaires portatifs permettent un courant de charge de 250mA, 500mA, voire 1,4A (7W) pour les plus onéreux. Ces valeurs sont bien sûr théoriques, et pour une exposition au soleil idéale… Je n’ai pas pu tester moi même ce type de chargeur solaire, mais d’après les infos que l’on peut trouver sur le web, il est très rare de dépasser les 200mA de charge,… Nous sommes loins des 700mA requis pour faire fonctionner le Pi.

Certains chargeurs solaires ont des batteries Li-ion ou Li-po intégrées de capacités variables. Dans ce cas, le Pi pourra fonctionner sur la batterie qui est elle même rechargée par le panneau solaire. Cependant,  le Pi vide la batterie beaucoup plus vite qu’elle ne se recharge. Pire, dans certains cas, il n’est pas possible d’utiliser la batterie en même temps qu’elle se charge…

Bref,… Je suis convaincu que d’ici quelques années nous pourrons exploiter l’énergie solaire de manière plus efficace et que les batteries se chargeront plus vite, mais pour le moment, cette technologie ne permet pas de faire fonctionner un Pi sur la durée.

Note : Bien évidemment, si vous avez plusieurs m² de panneaux solaires sur le toît de votre maison, vous pourrez certainement produire suffisamment d’électricité pour recharger des batteries qui alimenteront le Pi pendant la nuit,… Disons que cela fonctionnera au moins l’été…

Régulez plutôt l’alimentation de votre système !

La question que  vous devez vous poser est : « Est-ce que mon système doit fonctionner sans interruption 24h/24 7j/7 ? ». Si la réponse est NON, alors vous pouvez considérablement augmenter l’autonomie de votre système en régulant son alimentation !

Si vous avez construit une station météo, alors vous pouvez récolter les données météorologiques entre 1 et 6 fois par heure ou par jour. Si vous voulez surveillez votre maison de campagne pendant 10 mois dans l’année, vous pouvez vous contenter d’une photo par jour ou même par semaine. Si votre projet est un système automatique pour gérer l’ouverture de votre velux en cas de forte chaleur, vous pouvez vous contenter d’allumer le Pi qu’au délà d’une certaine température…

En réfléchissant bien, il est rare de devoir faire fronctionner votre système non-stop.

Voici un exemple de montage qui vous permettra de faire fonctionner votre Pi à intervalles réguliers pendant la durée de votre choix. Il s’agit en fait du même type de montage que pour l’Alimentation du Pi dans la voiture 2/3 mais dans une configuration différente.

Le matériel nécessaire

Le  montage

UntitledIl vous suffit de régler la minuterie programmable Velleman VM188 selon vos besoins 🙂

A savoir : Sous Raspbian, le Pi a besoin d’environ 40 secondes pour booter, et 20 secondes pour s’éteindre correctement (halt). Il faut donc compter 1 minute en plus du temps nécessaire à votre opération. Dans la pratique, 2 minutes de fonctionnement sont un minimum.

En respectant cela, vous pourrez par exemple prendre une photo de votre maison de vacances tous les jours pendant environ 10 mois 🙂 L’ajout d’un petit panneau solaire portatif devient ici pertinent, et permettra d’étendre énormément l’autonomie de votre système, puisque ce dernier ne consommera de la batterie que 2 minutes par jours 🙂

Sélection de batteries et chargeurs pour alimenter votre Pi

On en parle sur ces forums

Solutions alternatives pour alimenter votre Pi

12 – En résumé

IMG_5413Ce dashscreen est accroché au mur de mon séjour depuis presque un an maintenant, et je m’en sers tous les jours 🙂 L’affichage de l’heure et de la date en fait une horloge pratique et très lisible depuis toute la pièce. L’affichage de la météo est également une information utile au quotidien. Quant à la Terre et la Lune, je reconnais que l’utilité est moindre, mais je trouve cela vraiment chouette :). Si ce n’est pas votre truc, vous pouvez facilement remplacer ces images par des photos, pour ajouter une fonction « cadre photo numérique » intégrée à votre dashscreen 😉

Les autres modules, ping, TeamSpeak, bande passante et VPN me sont utiles pour surveiller ce qui se passe sur mon réseau et être alerté des pannes et autres problèmes qui peuvent survenir.

Juste au dessus du module graphique de la bande passante, j’ai intégré un graphique du nombre de visite quotidienne de ce blog 🙂 J’utilise GAPI pour récupérer les statistiques de Google Analytics, puis JSAPI (Google Charts) pour créer le graphique.

Pour les modules, le principe est toujours le même :

  1. une <div> avec un id dans le fichier index.php
  2. une feuille de style style.css pour positionner la div en question et gérer la mise en forme des données affichées
  3. une fonction javascript dans le fichier javascript.js qui lance une requête AJAX à intervalle régulier
  4. une ligne dans le fichier ajax.php pour appeler la bonne fonction PHP
  5. une fonction PHP dans le fichier inc.php pour générer le code HTML pour les images à afficher

Télécharger les sources

Vous pouvez télécharger toutes les sources ici : PiHomeDashScreen

Note : Vous devrez adapter le code à vos besoins.

Etendre le projet ?

Il sera vraiment intéressant de répertorier tous les modules créer sur ce principe par tous les utilisateurs qui se lance dans la réalisation d’un dashscreen. Nous pourrions mettre en place un « dépôt » pour stocker et partager tous les modules existants 🙂 Si cela intéresse du monde, n’hésitez pas à foncer 🙂

Nous pourrions également proposer une appli en ligne avec tous ces modules pour que le Pi n’est qu’à pointer sur une URL pour afficher une page web avec différentes options et modules activés/désactivés 😉

Remerciements

J’aimerai remercier toutes les personnes qui sont intervenues en commentaire ou sur forum, ou qui m’ont contacté directement par mail. Merci pour l’intérêt que vous portez à ce projet, ainsi que pour vos questions, remarques et astuces qui ont contribué à améliorer le projet. Merci également pour les erreurs qui m’ont été remontées avec beaucoup d’indulgence 😉

Le matériel

Un Pi et un écran suffisent pour réaliser ce projet. Vous pouvez choisir le type et la taille d’écran que vous souhaitez. Vous pouvez brancher votre Pi sur votre télé pour avoir un affichage en grand dans votre salon, ou utiliser un tout petit écran de 7″ à 10″ pour vous créer un réveil high-tech (l’idée m’a été soufflée sur un forum 🙂 ). Vous pouvez également étendre les fonctionnalités de ce dashscreen en ajoutant du son, ou un écran tactil pour interagir avec les informations affichées.

Technos et logiciels utilisés

  • Linux, Raspbian
  • script bash
  • Apache
  • PHP5
  • HTML & CSS
  • JavaScript
  • netcat
  • Xplanet
  • imagemagick

Sommaire

Forums de discussion

10 – Module 7 – VPN

J’utilise un petit serveur VPN PPTP pour que mes amis et moi puissions facilement échanger des fichiers ou jouer ensemble en réseau 🙂 C’est très facile à mettre en place aussi bien coté serveur en installant le paquet pptpd, que coté client car c’est nativement supporté par Windows.

Ce module me permet d’afficher la liste des personnes qui sont connectées à mon serveur VPN PPTP.

jarvis_screenshot_VPNJe ne détail pas dans cet article comment installer et configurer PPTPD. Voici un tutoriel qui vous aidera à mettre en place ce type de VPN : https://help.ubuntu.com/community/PPTPServer

Le serveur pptpd étant installé sur ma gateway, il faut procéder de la même manière que pour le module graphique de la bande passante pour transférer les données sur le Pi en utilisant netcat. La seule chose de nouveau ici est la commande last qui permet de récuppérer les informations de connexion des clients du VPN.

Transférer les données vers le Pi

Côté Pi (serveur netcat) :

#!/bin/bash

### BEGIN INIT INFO
# Provides:          nc_vpn_srv
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: vpn for Jarvis
# Description:       Enable service provided by daemon.
### END INIT INFO

dst_port=12346
dst_dir=/home/jarvis/vpn
dst_file=vpn_oberon.log

nc_vpn()
{
  while [ "true" ]
  do
    nc -q 1 -u -l 12346 > $dst_dir/$dst_file < /dev/null
    sleep 5
  done
}

case "$1" in
        stop)
                echo " Stoping vpn for Jarvis..."
                killall vpn
                killall nc
                ;;
        start)
                echo " Starting vpn for Jarvis..."
                nc_vpn&
                exit 0
                ;;
        *)
                exit 1
                ;;
esac

exit 0

Côté gateway (client netcat) :

#! /bin/bash

### BEGIN INIT INFO
# Provides:          nc_vpn_clt
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: vpn for Jarvis
# Description:       Enable service provided by daemon.
### END INIT INFO

src_port=8889
dst_port=12346
dst_host=10.0.0.1

nc_vpn()
{
        while [ "true" ]
        do
                last | grep ppp | grep "logged in" | nc -q 1 -p $src_port -u $dst_host $dst_port
                sleep 5
        done
}

case "$1" in
        stop)
                echo " Stoping vpn for Jarvis..."
                killall vpn
                killall nc
                ;;
        start)
                echo " Starting vpn for Jarvis..."
                nc_vpn&
                exit 0
                ;;
        *)
                exit 1
                ;;
esac

exit 0

Excécutez ces scripts au démarrage du système en les placants dans le répertoire /etc/init.d puis exécutant la commande suivante :

update-rc.d nom_du_script.sh defaults

index.php

Une simple <div> suffit car nous voulons simplement afficher une liste d’utilisateurs :

<div id="vpn"></div>

style.css

Un petit peu de mise en forme pour faire joli 🙂

/* vpn */

div#vpn
{
  left              : 550px;
  bottom            : 10px;
  position          : absolute;
  overflow          : hidden;
  background-color  : rgba(0, 0, 0, 1);
  color : #FFF;
}

td.vpn
{
  text-align        : left;
  font-size         : 30px;
  padding           : 5px;
}

img.vpn
{
  width : 20px;
  height : 20px;
}

javascript.js

Une simple requête AJAX permet de récupérer les données à afficher.

/* VPN */

var vpn_timeout;

function vpn ()
{
  $.ajax({
    async : false,
    type: "GET",
    url: "./ajax.php",
    data: "block=vpn",
    success: function(html){
      $("#vpn").html(html);
    }
  });

  vpn_timeout = setTimeout("vpn()", 5000);
}

ajax.php

Rien de particulier pour ce module :

  /////////////////////////////////////////////////
  //  VPN PPTPD
  /////////////////////////////////////////////////

  if($block == 'vpn'){
    echo vpn();
  }

inc.php

Deux fonctions sont nécessaires pour ce module :

  • vpn_parseData() : parse le fichier envoyé à travers netcat
  • vpn() : créé un tableau HTML avec les noms des utilisateurs connectés
  /////////////////////////////////////////////////
  //  VPN PPTPD
  /////////////////////////////////////////////////

  function vpn () {

    $datas = vpn_parseData ("/home/jarvis/vpn/vpn_oberon.log");

    $html  = '';

    if(sizeof($datas) > 0){
      $html .= '<table cellspacing="0px">';
      foreach($datas as $data){
        $html .= '<tr>';
        $html .= '<td valign="middle"><img class="vpn" src="pict/vpn.png"></td><td class="vpn">'.$data[0].'</td>';
        $html .= '</tr>';
      }
      $html .= '</table>';
    }

    return $html;
  }

  function vpn_parseData ($stat_file) {
    $datas = array();
    if(filemtime($stat_file) < time()-10){return $datas;}
    $stats = fopen($stat_file, 'r');
    while (($line = fgets($stats)) !== false) {
      $explode_line = str_word_count($line, 1, "0123456789.");
      $datas[]  = $explode_line;
    }
    fclose($stats);
    return $datas;
  }

Et voilà pour ce dernier module qui s’avère très simple 🙂