Projet IMA3 P4, 2016/2017, TD1 : Différence entre versions

De Wiki de Projets IMA
(Partie électronique)
(Partie électronique)
Ligne 46 : Ligne 46 :
  
 
[[Fichier:TdjerabaSeance1.png]]
 
[[Fichier:TdjerabaSeance1.png]]
 +
 +
* CLK_BRD : fréquence de la Nanoboard
 +
* CLKGEN : générateur de fréquence
 +
* DIGITAL_IO : valeur à comparer avec le compteur, permet de faire varier les rapports cycliques et donc finalement l'angle
 +
* HA5 : sortie du FPGA (pin5).
  
  

Version du 11 juin 2017 à 08:26

Projet IMA3-SC 2016/2017 : Caméra connectée

Cahier des charges

Description du système

Le système envisagé est une caméra de bureau connectée. Cette caméra aura deux modes de fonctionnement :

  • actif : le flux vidéo est transmis en direct sur l'application web. Un pilotage de la caméra est envisagé, deux servomoteurs permettraient d'orienter la caméra selon deux axes depuis l'application web.
  • passif/sécurité : le flux vidéo n'est plus transmis, mais une fonction de détection de mouvement est activée qui permet le retour au mode actif en notifiant la détection sur l'application web.

Une LED sera ajoutée pour signaler le mode de fonctionnement en cours.

Le matériel

Une caméra (voir si des pilotes sont nécessaires)

Deux servomoteurs

Un support reliant les moteurs à la caméra

Une LED

Séance 1

Partie électronique

La première étape dans la réalisation de notre projet fut le contrôle des servomoteurs. Pour cela, nous avons commencé par analyser le signal type envoyé aux servomoteurs afin de pouvoir reproduire celui-ci à partir d'un FPGA.

Afin de capter ce signal, nous avons commandé le servomoteur à l'aide d'une Arduino. Puis nous avons relié le pin de sortie de l'Arduino à un oscilloscope.

Montage
Montage

On remarque que la période ne change pas (20ms), cependant, l'intervalle de temps ΔT durant lequel le signal reste à l'état haut (5V) change par rapport à la commande d'angle du moteur.

ΔT =

  • 0.6ms pour 0°
  • 1.5ms pour 90°

On a ensuite cherché à recréer le signal avec la NanoBoard, commandé via Altium. Afin de créer un rapport cyclique dans le signal de commande du moteur, nous avons décidé d'utiliser le principe de la MLI intersective (PWM en anglais).

La MLI consiste à restreindre la durée ΔT via la comparaison entre un mot de 8 bits (donné par l'utilisateur), et un autre mot de 8 bits, sortant d'un compteur relié à une horloge interne de la NanoBoard.

TdjerabaSeance1.png

  • CLK_BRD : fréquence de la Nanoboard
  • CLKGEN : générateur de fréquence
  • DIGITAL_IO : valeur à comparer avec le compteur, permet de faire varier les rapports cycliques et donc finalement l'angle
  • HA5 : sortie du FPGA (pin5).


La prochaine séance consistera à fixer le pas du moteur, et à adapter la fréquence et la taille des mots du circuit Altium en conséquence.

Partie informatique

La partie informatique se découpe grossièrement en deux parties :

  • Une partie réseau et développement web
  • Une partie acquisition et analyse d'image et communication Raspberry/Arduino

Réseau et développement web

L'objectif de cette première séance était de rechercher les fonctions HTML, qui nous permettrait d'afficher en streaming les images de notre caméra, mais aussi de contrôler la direction de celle ci. Il sera également donné à l'utilisateur la possibilité de mettre en pause la vidéo, sans pour autant interrompre le flux de données.

Pour l'instant il n'est pas encore possible d'afficher en streaming notre vidéo. HTML offre un large choix de méthodes permettant d'afficher du contenu vidéo, celles ci dépendant de la source mais aussi du type d'action souhaité. Notre affichage devra donc être adapté au format envoyé par la caméra.


Nos boutons ne sont pas encore reliés aux moteurs contrôlant la caméra, mais une future implantation de cette fonctionnalité est prévue.

Voici un aperçu de ce à quoi pourrait ressembler notre interface :

Acquisition et communication

Lors de cette séance, le gros du travail effectué a été réalisé sur Raspberry.
Il a d'abord fallu réinstaller raspibian, puisque la version installée de base sur la carte était assez modifiée par rapport à l'originale. (Programmes et bibliothèques nombreuses à manquer).
Grâce à l'utilitaire NOOB pré-installé sur la carte cela a été facilement réalisé.

Ensuite, il a fallu rechercher un programme ou une bibliothèque permettant l'acquisition des images.
Notre caméra étant une PiCaméra, il a d'abord semblé logique de choisir la bibliothèque PiCamera, que nous aurions pu utiliser en Python.
Mais après des recherches plus approfondies, le choix de Motion s'est imposé, puisque ses nombreuses fonctionnalités correspondent à nos attentes. (stream et détection de mouvement par cadran)

Cependant il s'est avéré que la dernière version de Motion ne permet pas d'utiliser la PiCamera, qui n'est pas recconue comme /dev/video0. Il a donc fallu rechercher une solution pour contourner le problème.
L'utilitaire motion-mmal permet d'utiliser motion avec la PiCamera, il a donc été installé sur le Raspberry.
Ensuite il a fallu modifier le fichier de configuration de motion-mmal pour l'adapter à nos besoins. (/etc/motion.conf pour motion-mmal et non /etc/motion/motion.conf pour la version d'origine de motion)
Nous avons pu obtenir en fin de séance un stream accessible sur le réseau local à l'addresse locale du raspberry, sur le port 8081.

L'objectif pour la séance prochaine sera de faire communiquer l'arduino et le raspberry Pi.

--Thubert 23 mars 2017 à 22:40 (CET)

Séance 2

Partie électronique

Cette séance à été principalement dédié à la réalisation des circuits pour la mise en place des fonctionnalités prévues, a savoir:

- déplacer la caméra grâce à deux servomoteurs, par l'intermédiaire d'un site internet.

- donner un position précise à la caméra, afin de pouvoir éventuellement gérer (si le temps le permet) le suivi d'un objet ou d'une personne.


TdjerabaSeance22.PNG

Comme on l'a vu précédemment, il est possible, via la transmission d'une info en 8 bits, de faire bouger la caméra (chaque mot de 8bits correspondant à une durée d’impulsion donc à un un angle précis).

Afin de faire tourner la caméra, nous avons décidé d'incrémenter le mot de 8 en question autour de celui correspondant à l'angle 0°. La fréquence de sortie de la NanoBoard étant de 100Mhz: les mots sont les suivants: - 45° = 1100 0110 - 0° = 1011 0011 - -45° = 1001 1110

Pour cela, nous avons utilisé un compteur afin d'incrémenter le mot de 8 bits qui sera comparé avec celui issue du générateur de fréquence.

la commande du compteur se fait via l'entrée CE(Clock Enable), lors ce que CE est à 1, le compteur incrémente sa valeur à chaque signal d'horloge. Une fois mis à 0, ce dernier garde en mémoire la valeur du dernier mot compté.

Partie informatique

Réseau et développement web

Durant cette séance notre interface web a été réorganisée afin d'optimiser le contrôle de la caméra. En effet dans notre version précédente les boutons étaient placés autour de la vidéo, ce qui ne permettait pas de cliquer de l'un à l'autre très rapidement. Ils ont donc été rassemblés sur la droite de l'écran, afin de répondre à ce soucis de dynamisme.

Acquisition et communication

L'objectif au niveau de l'acquisition de l'image et du contrôle des servos a été de mettre au point un système de suivi de mouvement. Nous avons donc cherché à exploiter l'outil Motion, qui propose une fonctionnalité de tracking. Nous avons donc commencé par configurer Motion, pour activer le tracking, et adapter les options pour qu'elles correspondent à nous servos. Une fois cela fait, il a fallu récupérer l'information sur le mouvement à effectuer, fournie par Motion via la liaison série du raspberry Pi. Mais nous nous sommes heurtés à plusieurs difficultés:

  • D'une part, il a été difficile de déchiffrer les données fournies par Motion via la liaison série, de part le peu de documentation à ce sujet
  • D'autre part, il a fallu faire un choix entre le contrôle des servos via l'interface web, ou de manière autonome, puisque deux programmes différents ne peuvent utiliser une même

liaison série. Nous avons choisi de nous consacrer exclusivement au contrôle via l'interface web. L'objectif de la prochaine séance sera de contrôler les servos via la liaison série.

Séance 3

Partie électronique

Cette séance à été consacré à la finalisation du montage nous permettant de faire de tourner les servomoteurs dans un sens et dans l'autre.

Nous avons d’abord modifié le montage afin de permettre le comptage et le décomptage du mot de 8bits en entré de notre PWM. Le compteur à aussi été conçu de tel manière à arrêter de compter une fois atteint les mots de 8bits correspondant aux angles de -45° et 45°. Dans ces cas là, le circuit fait en sorte de mettre à 0 la commande CE. Enfin, nous avons aussi prévu initialisation du compteur à une valeur bien précise, laquelle correspond à l'angle 0° (1011 0011).

TdjerabaSeance3.PNG

Au cours de cette séance, nous avons rencontré un grand nombre de problèmes liés à la rotation du servomoteur:

- La rotation ne marche pas correctement: celle-ci est fonctionnelle dans un sens mais pas dans l'autre.

- La rotation est "haché".

- Le comptage est sensé s’arrêter à certaines valeurs précise, afin d’arrêter la rotation du servomoteur aux angles -45° et 45°, mais rien ne se produit.

- De la même manière, la mise à 0 du compteur ne fonctionne pas.

Après avoir effectué un certain nombre de mesures, nous sommes arrivés à la conclusion que les problèmes sont lié au réglage de la fréquence. A l'issue de la séance, aucune solution n'a été trouvée.

Partie informatique

Séance supplémentaire 1

Partie électronique

Partie informatique

Conclusion