Tournicayou (Photogrammétrie)
Construction d'un appareil photogrammétrique dans le cadre de l'UE Atelier Fablab LU3SV062
Informations
- Étudiants :
- Zoé ALBENGA (zoealbenga@outlook.com)
- Lucas Gorini
- Encadrants :
- Responsables de l'UE : Fabrice Minoletti et Pierre Théry
- Responsable du projet : Pierre Théry
- Parcours : SV/ST : UE_FabLab : LU3ST062
- Date : S6
Contexte
Objectifs
Notre objectif de réalisation pour cette UE est la d'un socle pour la photogrammétrie. Celui-ci aurait comme application dans un premier temps la réalisation "d'image en 3D" pour certaines pierres ponces, puis à usage plus large par la suite.
Matériel
- Carte Arduino
Construction
Étape 1 :
Étape 2 :
Étape 3 :
Étape 4 :
Étape 5 :
Étape 6 :
Étape 7 :
Journal de bord
30/01/26
1ère Séance : Sujet Photogrammétrie (Schéma) + Découverte de ARDUINO
- Premières réflexions réalisation sur la de ce support à photogrammétrie.
- Réalisation de plusieurs dessins "idées" (voir photos).
- Première manipulation avec le logiciel ARDUINO, premier codage. Bien difficile....

Codage avec Arduino, led clignotant SOS en morse.
06/02/26
2ème Séance : Retour sur le support (Schémas) + Mise en place des différentes étapes
- Reprise de la structure du support de photogrammétrie --> bras tournant autour du support
- Mise en place des différentes étapes :
- Moteur + programmation
- Moule à Tarte
- Arduino + caméras + affichage ordi à voir ?
- Soutiens-gorge : support caméra + LED
- Bonus : écran + angles + focus caméras
13/02/2026
3ème Séance : Gratuit Freecad + Arduino
FREECAD
Apprentissage des fonctions de base du logiciel Freecad. Plusieurs essais infructueux de la conception de la pièce crantée permettant le support du moteur autour de l'objet à photographier.
Vidéos youtube visionnées pour le modèle Freecad :
- https://www.youtube.com/watch?v=3wPDnRFfgEg
- https://www.youtube.com/@cadgab/playlistshttps://www.youtube.com/@cadgab/playlists
LE COULOMMIERS EST TERMINÉ (18/02) - CoteCôte Mauvaise
Pour créer le coulommiers, qui fait office d'engrenage interne permettant le déplacement du bras, il faut créer deux corps différents sur FreeCad. Les corps sont créés sur le module Part design
- Un cercle de 600 mm de diamètre et 200 mm de haut
- Un engrenage à développer de Dp = 495 mm, M = 2,5 mm, z = 198 et 200 mm de haut
Une fois les deux corps formés, il faut utiliser une booléenne pour former le rouage final grâce au module Part
Attention : Les valeurs inscrites sont les valeurs erronées
ARDUINO
Familiarisation réalisation avec le logiciel Arduino et d'un premier montage :
- Matériels :
- Arduino Uno + câble USB de liaison Arduino/Ordinateur
- Câbles de connexion
- Moteur pas à pas 28 BYJ-48
- Schéma de connexion :
- Code :
- Ce code permet au moteur de réaliser une rotation dans le sens des aiguilles d'une montre, attendre 1
seconde (seconde(s), puis de faire une rotation dans le sens contraire des aiguilles d'une montre, puis de nouveau attendre 1 s.
- Ce code permet au moteur de réaliser une rotation dans le sens des aiguilles d'une montre, attendre 1
#include <Stepper.h>
double stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11); // Pin inversion to make the library work
void setup() {
myStepper.setSpeed(10);
Serial.begin(9600);
}
void loop() {
// 1 rotation counterclockwise:
Serial.println("counterclockwise");
myStepper.step(stepsPerRevolution);
delay(1000);
// 1 rotation clockwise:
Serial.println("clockwise");
myStepper.step(-stepsPerRevolution);
delay(1000);
}
Une librairie Stepper.h existe.
-
- Succès de ce premier montage et code associé. Manipulation du code nous permettant d'obtenir une rotation dans le sens des aiguilles d'une montre avec arrêt de 1 s. (suppression de la première partie de la void loop)
- Rapidement
essaiesessayez dechangementchanger de vitesse = ÉCHEC --> comprendre pourquoi à la prochaine séance.
--> Prochaine étape : Réaliser le montage avec ajout d'un potentiomètre permettant de contrôler la vitesse de rotation ainsi que le sens (--> potentiomètre vers la droite= sens des aiguilles d'une montre ; potentiomètre à gauche = sens inverse )
20/02/2026
4ème Séance : Gratuit ecad + Arduino
Partie Freecad :
Modélisation du rouage pour le moteur pas à pas, et reprise de dimension du coulommiers. Pour calculer le nombre de dents de chaque rouage, externe (Moteur) comme interne (Coulommiers) nous avons suivi l'équation suivante :
Dp/M = z
Dp => Le diamètre primitif ; M => Module du rouage ; z => Nombre de dents
Pour que deux engrenages puissent fonctionner ensemble il faut respecter 3 conditions :
- Ils doivent avoir un module égal
- Ils doivent avoir un angle de pression égal (par convention 20°)
- Leur diamètre primitif doit être tangent
Pour le dernier point, la distance entre le centre des rouages Dr = ((z 1 +z 2 )*M)/2
Pour le coulommiers :
La modélisation comporte deux corps.
- Un cercle de 300 mm de diamètre et 100 mm de haut
- Un engrenage à développé de Dp = 250 mm, M = 2,5 mm, z = 100 et 100 mm de haut
Pour former le rouage interne, il faut faire la différence des deux corps grâce à la booléenne dans le module Part . (cf https://www.youtube.com/watch?v=3wPDnRFfgEg)
Pour le rouage externe ce dernier doit être fixé sur la "tige" du moteur faisant 19 mm de long. Il faut creuser un cylindre de 5mm de diamètre au centre du rouage avec une corde de 3mm afin de respecter l'aspect de la tige.
La modélisation comporte deux corps.
- Un cylindre de 5mm de diamètre coupé d'une corde de 3mm et faisant 19mm de haut
- Un engrenage externe de Dp = 45 mm, M = 2,5 mm, z = 18 et 19 mm de haut
Impression 3D des pièces pour essais ultérieurs.
ARDUINO
Retour sur le montage réalisation et la du circuit de la semaine dernière = ÉCHEC. Nous n'avons pas trouvé la raison pour laquelle la réussite de la semaine passée n'était plus réalisable. (Changement de moteur, vérification et retour sur les explications du code, changement de code, vérification du fonctionnement de la carte Arduino uno...)
Réalisation d'un autre montage avec le moteur Servo :
- Matériels :
- Arduino Uno + câble USB de liaison Arduino/Ordinateur
- Câbles de connexion
- Microservo à moteur pas à pas SG90
- Schéma de connexion :
- Code :
- Ce code permet au moteur de réaliser une rotation dans le sens des aiguilles d'une montre, attendre 1
seconde (seconde(s), puis de faire une rotation dans le sens contraire des aiguilles d'une montre, puis de nouveau attendre 1 s.
- Ce code permet au moteur de réaliser une rotation dans le sens des aiguilles d'une montre, attendre 1
#include <Servo.h> // on ajoute la bibliothèque servo
Servo servoMoteur; //On crée un objet servo appelé servoMoteur
void setup(){
Serial.begin(9600);
//On associe le servo à la broche 2
servoMoteur.attach(2);
servoMoteur.write(0); // on initialise le servo sur l'angle 0
}
void loop(){
// tour de 0 à 180º
for (int i = 0; i <= 180; i++){
servoMoteur.write(i);
Serial.print("Angle: ");
Serial.println(i);
delay(30);
}
// tour de 180 a 0º
for (int i = 179; i > 0; i--){
servoMoteur.write(i);
Serial.print("Angle: ");
Serial.println(i);
delay(30);
}
}Après plusieurs échecs, et des changements de codes, succès de la manipulation. Notre moteur se déplace de l'angle 0 à l'angle 90, puis à celui 180 avant de revenir à 0 et de recommencer sa boucle. Après chaque déplacement celui-ci fait une pause de 1 s. Notre moteur avance degré par degré.
--> Prochaine étape :
- Modification de notre code pour réaliser un mouvement de 20° en 20° avec 1 s de délai entre chaque déplacement.
27/02/2026
Objectif de la séance : Finaliser le code arduino pour le moteur, tester les pièces 3D, conception du bras
Nous avons commencé la réalisation des plans quant à la partie qui tourne autour du coulommiers. Trois partiessoirées :
- Le support même du moteur, permettant sa fixation par vis.
- La partie centrale, dotée d'une roue permettant au socle tournant d'avancer sur les coulommiers.
- Le support bras, avec des fentes permettant l'insertion du bras photo et des emplacement pour piles et carte arduino.
L'idée est de créer deux pièces s'assemblant comme un puzzle. La première composée du socle moteur et de la partie centrale. L'autre du socle bras.


ARDUINO
Une partie dudes coulommiers dentés et le rouage du moteur sont désormais imprimés ! Aujourd'hui on a pu testétester le gros moteur de 12 V, qui sera notre moteur final, avec donc le rouage modélisé par Lucas.
J'ai cramé la batterie brique de 12 V ... Surement un problème dans mon montage.
Réalisation d'un autre montage avec le moteur NEMA 17, moteur pas à pas de 12 V :
- Matériels :
- Arduino Uno + câble USB de liaison Arduino/Ordinateur
- Câbles de connexion
- Moteur Shield
- Moteur
Shield - NEMA 17
moteurpas à pas
- Schéma de connexion :
- Code :
- Ce code permet au moteur de réaliser une rotation dans le sens des aiguilles d'une montre, attendre 1
seconde (seconde(s), puis de faire une rotation dans le sens contraire des aiguilles d'une montre, puis de nouveau attendre 1 s.
- Ce code permet au moteur de réaliser une rotation dans le sens des aiguilles d'une montre, attendre 1
#include <AFMotor_R4.h>
const int stepsPerRevolution = 200; // nombre de pas du moteur
AF_Stepper motor(stepsPerRevolution, 2);
void setup() {
Serial.begin(9600);
motor.setSpeed(10); // vitesse en RPM
}
void loop() {
// Calcul du nombre de pas pour 20°
int stepsFor20Degrees = stepsPerRevolution / 18;
// Rotation sens horaire (aiguilles d'une montre)
motor.step(stepsFor20Degrees, FORWARD, SINGLE);
delay(1000); // arrêt de 1 seconde
}
-
- Ce code fonctionne plutôt très bien, il réalise donc une rotation dans le sens des aiguilles d'une montre ; fait
20 °20° puis fait une pause pour la photo.
- Ce code fonctionne plutôt très bien, il réalise donc une rotation dans le sens des aiguilles d'une montre ; fait
#include <AFMotor_R4.h>
const int stepsPerRevolution = 200; // nombre de pas du moteur
AF_Stepper motor(stepsPerRevolution, 2);
void setup() {
Serial.begin(9600);
motor.setSpeed(10); // vitesse en RPM
}
void loop() {
int stepsFor20Degrees = stepsPerRevolution / 18; // 20° ≈ 11 pas
// Un tour complet = 360° = 18 segments de 20°
for(int i = 0; i < 18; i++) {
motor.step(stepsFor20Degrees, FORWARD, SINGLE); // avance 20°
delay(2000); // pause de 2 secondes
}
// Pause longue à la fin du tour
delay(10000); // pause de 10 secondes
}
Ce 2ème code est très probablement mieux mais manque de fluidité de mouvement : il ne réalise pas forcément tout le temps
20 °20° degré mais parfois moins et de manière saccadé. Il réalise donc 11 pas pour faire les20 °20° demandés ; pause de2 secondes ; puis reprends pour faire un tour complet de 20 par 20 ; pause de 10 s.Ce code rend le moteur extrêmement bruyant en plus du mouvement saccadé.
06/03/2026
Conception du socle moteur sur Freecad. Les mesures sont encore à vérifier. Le socle est composé d'un assemblage Freecad de deux pièces. La première correspond au support même du moteur, et dispose de 4 trous de fixation permettant par vis et un cinquième plus grand permettant au bras du moteur de passer. (Le moteur est fixé par la surface où se situe le bras). L'autre pièce est un rectangle permettant l'insertion d'une roue à billes, servant au roulement du support moteur sur les coulommiers. Cette pièce possède un trou permettant le passage d'une tige maintenant la roue en place. La conception de cette tige en 3D est réalisée, mais reste à voir pour sa conception (Impression 3D, métal, autre ?). Le rectangle possède un creux en forme de puzzle servant à l'insertion du socle du bras, devant encore être modélisé.
Fichier STL de la pièce décrite :
13/03/2026
Lucas : J'ai limé pendant deux heures le bloc, puis début de la conception des plan pour la pièce arrière.
ARDUINO
Aujourd'hui j'ai revu le code pour notre moteur afin que celui-ci réalise 20° sur le coulommiers et non par rapport à l'axe du moteur.
Réalisation d'un autre montage avec le moteur NEMA 17, moteur pas à pas de 12 V :
- Matériels :
- Arduino Uno + câble USB de liaison Arduino/Ordinateur
- Câbles de connexion
- Moteur Shield
- Moteur NEMA 17 pas à pas
- Schéma de connexion :
- Code :
CePetitecodepartiepermetcalculau moteur depour réaliser le code et essayer de trouver unerotationfaçondupour que le moteursurestleuntourmouvementinterneplusdu coulommiers,fluide etdoncplusjesaccadéfaireetle même mouvement que la derniere fois : rotation dans le sens des aiguille d'une montre ; parcourir pas qui corresponde à donc ° ; arret de 2 /3 s pour le temps d'une photobruyant.
coulommiers = 100 dents ; rouage = 18 dents ; moteur pas à pas = 200 pas / tour
100/18=5.55 tours --> le bébé rouage effectuera donc 5.5 tour pour réaliser un tour complet du tour interne du coulommiers.
200 x 5.55 = 1 111 pas --> le moteur lui devra donc réaliser 1111 pas pour faire 360 ° donc un tour complet du coulommiers.
1111 x 20/360 = 61.7 pas --> le moteur devra réalisé environ 62 pas pour réaliser 20 ° sur le coulommiers.
62 pas x 18 positions = 1 116 pas # 1 111 pas ! => possibilité d'alternance entre 62 et 61 pas pour obtenir pile 360 °
-
- Pour éviter que le moteur soit saccadé on peut voir pour augmenter la vitesse de déplacement/ ou la diminuer.
#include <AFMotor_R4.h>
const int stepsPerRevolution = 200; // pas moteur
const int stepsFor20Degrees = 62; // calcul avec engrenage
AF_Stepper motor(stepsPerRevolution, 2);
void setup() {
Serial.begin(9600);
motor.setSpeed(10); // vitesse RPM
}
void loop() {
// 360° / 20° = 18 positions
for(int i = 0; i < 18; i++) {
motor.step(stepsFor20Degrees, FORWARD, SINGLE);
Serial.print("Position : ");
Serial.println(i + 1);
delay(2000); // pause entre chaque mouvement
}
Serial.println("Tour complet terminé");
delay(10000);
}
-
- 1er code testé : FONCTIONNEL !
- Test d'un autre code avec une alternance de 61 et 62 pas pour avoir pile 360° et voir si celui ci est plus fluide ou non.
#include <AFMotor_R4.h>
const int stepsPerRevolution = 200;
AF_Stepper motor(stepsPerRevolution, 2);
int positionIndex = 0;
// Séquence corrigée pour obtenir exactement 360°
int stepSequence[18] = {
62,62,62,62,62,62,
62,62,62,
61,
62,62,62,62,62,
62,62,
61
};
void setup() {
Serial.begin(9600);
motor.setSpeed(10);
Serial.println("Systeme de rotation initialise");
}
void loop() {
int steps = stepSequence[positionIndex];
motor.step(steps, FORWARD, INTERLEAVE);
Serial.print("Position : ");
Serial.println(positionIndex + 1);
positionIndex++;
delay(2000); // pause de 2 s entre chaque mouvement
if(positionIndex >= 18)
{
positionIndex = 0;
Serial.println("Tour complet termine");
delay(10000); // pause de 10 s après le tour complet
}
}
Toujours un problème de fluidité, voir pour améliorer le 1er code ou le 2ème.
Test de différentes vitesse : 5 et 30 plus ou moins OK, toujours saccadé et bruyant --> voir microstep ?
Recherche pour les caméras : Arducam Shield Mini 5MP Plus :
- Montage possible : (photo à mettre)
- Carte SD nécessaire ?
- Dans ce montage, le module caméra 5MP serait utilisé avec une carte Arduino UNO pour capturer des images à intervalles réguliers. Sans carte microSD, les photos ne peuvent pas être stockées directement sur le système embarqué.
- À la place, les données de l’image au format JPEG seraient envoyées via la liaison série (USB) vers un ordinateur. L’Arduino déclenche une prise de vue, transmet les données binaires correspondantes, puis attend 30 secondes avant de recommencer (pour notre projet).
- Comme l’Arduino Uno possède une mémoire limitée, il est nécessaire de réduire la résolution des images afin d’assurer un fonctionnement stable. --> utilisation d'une autre carte ?
- Les images reçues sur l’ordinateur peuvent ensuite être reconstruites et visualisées à l’aide d’un programme externe, par exemple en Python.
--> Prochaine séance : Test de 25 - 5 ° pour améliorer la fluidité + CAMÉRAS ! redemander les bibliothèques.

