Caméra panoramique
Tom, Anissa, Romain
Objectif
Mettre en place une caméra sur un support orientable, de manière à pouvoir :
- Stabiliser la direction de prise de vue (compenser le mouvement de rotation de la nacelle)
- Choisir la direction de la vue (pilotage en temps réel par onde radio ou bien mouvement préprogrammé)
Il sera ainsi possible, par une série de prises de vues à différents angles, de réaliser des photos panoramiques.
Tâches à réaliser
Analyse fonctionnelle
Il faut un appareil qui résiste au froid et qui ne consomme pas trop énergie. Il faut aussi qui ne pèse pas trop lourd.
Il faut aussi que le moteur puisse être contrôlé a distance avec une boussole (nord, sud, est, ouest).
Mise en œuvre de capteurs
- Compas HMC5883L
Centrale inertielle
Le Nord magnétique ne coïncide pas tout à fait avec le Nord géographique, pour cela, il faut connaitre la déclinaison magnétique, qui dépend de la latitude et de la longitude du lieu et également de la date. On peut utiliser un calculateur en ligne :
Mise en œuvre de moteurs
Besoin : il faut une motorisation capable de décrire un angle de 360° au moins, avec une précision de l’ordre de 5° (suffisant pour faire une photo panoramique)
Moteur pas à pas
Il faut un moteur le plus petit possible, car le système de caméra panoramique doit être très léger. Nous avons récupéré un moteur dans un vieux lecteur DVD d’ordinateur.
On a mesuré les résistance aux bornes des ports du moteur pas à pas, on en a déduit que le port numéro 3 (celui au centre) était le com.
Avantage : contrôle au pas près, assez précis, pas de limite d’angle
Problème, le guidage en rotation est assuré aux deux extrémités de la vis, et si on coupe le bâti (pour pouvoir fixer la caméra sur la vis) on perd la liaison : la vis n’est plus guidée correctement et le moteur devient inutilisable !
Malgré d’autres recherches, nous n’avons pas trouvé de petit moteur pas à pas …
Moteur CC
Une solution en apparence simple, mais il est difficile de trouver un tout petit moteur.
Nous avons fait des essais, mais l’inconvénient, c’est que ce type de moteur tourne très vite et es difficile à contrôler en position …
Servomoteur
Les servomoteurs sont des système avec moteur, réducteur et mesure d’angle.
Les servomoteurs « classiques » sont limités en amplitude angulaire (180° maximum environ). Il faut donc utiliser un servomoteur à rotation continue.
Avantages : facile à piloter, couple résiduel quand on coupe l’alimentation, pas de limite d’angle.
Conception et assemblage
Support pour la caméra
Programmation
Pour que la caméra se positionne dans la position souhaitée, il faut mesurer son orientation absolue (par rapport au champ magnétique Terrestre), et élaborer une loi de commande.
Programme Arduino
/* * Controle caméra manoramique * * avec : * - HMC5883L Compas numérique 3 axes * - servomoteur à rotation continue */ #include <Servo.h> #include <Wire.h> #include <HMC5883L.h> Servo myservo; const int mid = 1320; // Temps haut du signal PPM pour avoir une vitesse nulle const int max_vit = 60; // Ecart maxi (en ms) de temps haut pour piloter le moteur HMC5883L compas; int pos_cons = 180; // Pour correcteur PID : const float kP = 1; const float kI = 0.001; float cum_e = 0; // écart cumulé unsigned long t = 0; // instant "actuel" unsigned long _t = 0; // instant précédent void setup() { Serial.begin(9600); pinMode(8, OUTPUT); digitalWrite(8, HIGH); myservo.attach(9); myservo.writeMicroseconds(mid); // Servomoteur en position arrêt while (!compas.begin()) { Serial.println("Aucun HMC5883L trouve !"); delay(500); } // Plage de mesure : 0.88 Gauss (intensité du champ magnétique Terrestre ~ 0.5 Gauss) compas.setRange(HMC5883L_RANGE_0_88GA); // Mode de mesure : continue compas.setMeasurementMode(HMC5883L_CONTINOUS); // Fréquence de rafraichissement des données : 30Hz compas.setDataRate(HMC5883L_DATARATE_30HZ); // Nombre d'échantillons par mesure compas.setSamples(HMC5883L_SAMPLES_8); // Offset de calibration compas.setOffset(-14, -126); //-524:496:-596:343:-14:-126 } void loop() { // Acquisition consigne de position angulaire if(Serial.available()>0) { pos_cons = Serial.parseInt(); } // Acquisition de la position angulaire de la caméra int orientation = 0; for (int i = 0; i<10 ; i++){ orientation += get_pos(); delay(5); } orientation /= 10; // Affichage de la position angulaire / consigne de position Serial.print("Orientation = "); Serial.print(orientation); Serial.print("\t/\t"); Serial.print(pos_cons); // Calcul de l'écart angulaire à combler int ecart = orientation - pos_cons; if (ecart > 180) ecart -= 360; else if (ecart < -180) ecart += 360; // Calcul de la "vitesse" t = millis(); cum_e += float(ecart) * float(t - _t); _t = t; int vit = int(float(ecart)*kP + cum_e * kI); if (vit > max_vit) vit = max_vit; else if (vit < -max_vit) vit = -max_vit; myservo.writeMicroseconds(mid+vit); Serial.print("\t("); Serial.print(ecart); Serial.print(" ; "); Serial.print(vit); Serial.println(")"); delay(10); } //////////////////////////////////////////////////////////////////////// int get_pos(){ Vector v = compas.readNormalize(); // Calcul de l'angle d'orientation float orientation = atan2(v.YAxis, v.XAxis); // Correction pour orientation < 0deg et pour orientation > 360deg if (orientation < 0) { orientation += 2 * PI; } if (orientation > 2 * PI) { orientation -= 2 * PI; } // Conversion en degrés return int(orientation * 180/M_PI); }
Analyse des performances
http://translate.google.com/translate?hl=fr&sl=auto&tl=fr&u=http%3A%2F%2Fwww.jarzebski.pl%2Farduino%2Fczujniki-i-sensory%2F3-osiowy-magnetometr-hmc5883l.html
Répartition des tâches
A compléter !
date |
Tom | Anissa | Romain |
21/01/19 | |||
28/01/19 | arduino montage | arduino montage | arduino montage |
04/02/19 | arduino programme | arduino programme | arduino programme |
04/03/19 | arduino programme | arduino programme | Cablage moteur |
11/03/19 | arduino programme+soudage | arduino programme+soudage | arduino programme+soudage |
23/03/19 | compas | compas | compas |