# Atelier Fablab Géosciences (LU3ST062)

L'Atelier Fablab propose à des équipes de 2 ou 3 étudiants de développer une approche de modélisation analogique et numérique autour d'un problème de Sciences de la Terre.
Le but est de mettre au point, améliorer et utiliser des maquettes (non-dimensionnées) puis des modèles analogiques (dimensionnés) pour mettre en évidence un processus ou évaluer un paramètre critique. La discussion porte ensuite sur le passage des conclusions aux échelles géologiques.
Concrètement la réalisation des montages passe par l'utilisation des ressources du Fablab (impression 3D, conception assistée par ordinateur ... ) et d'outils d'interfaçage (Arduino, MATLAB ... ) pour l'extraction de données des expériences.

# Rover Martien

#### **<span style="text-decoration: underline;">Construction et programmation d'un modèle de rover martien dans le cadre de l'UE Atelier Fablab LU3SV062</span>**

  
**Responsables de l'UE**: Fabrice MINOLETTI, Pierre THERY  
**Responsable du projet** : Nicolas Rividi (nicolas.rividi@sorbonne-universite.fr)  
**Étudiants** : -Raphaël Forasté (raphael.foraste@etu.sorbonne-universite.fr)   
 -Alexandre Manzanares (alexandre.manzanares@etu.sorbonne-universite.fr)

##### <span style="color: rgb(0, 0, 0);">**<span style="text-decoration: underline;">Problématique du projet/Contexte:</span>**</span>

- Pourquoi fabriquer des rovers planétaires ?

Des sondes ont été envoyées sur Mars dès les années 70 avec les sondes Viking cependant, bien que ces sondes nous aient permis d'obtenir des informations cruciales concernant les systèmes spatiaux elles présentent tout de même une limitation majeure qu'est leur immobilité. Les rovers, utilisés pour la première fois lors de la mission pathfinder en 1997, sont des véhicules tout terrain capable d'être contrôlés à distance pour explorer d'autres astres et permettent donc d'obtenir plus d'informations sur de plus grands espaces en une seule mission. De plus leur mobilité leur permet de se déplacer vers des points d'intérêt précis détectés grâce à leurs caméras intégrées.

##### <span style="text-decoration: underline;">**Objectifs du projet:**</span>

Le projet principal vise à réaliser un modèle miniature de rover martien pour la fête des sciences afin de présenter au public les fonctionnalités de ces appareils et leurs objectifs.

Le rover est construit à partir d'un modèle trouvé sur le site howtomechatronics : [https://howtomechatronics.com/projects/diy-mars-perseverance-rover-replica-with-arduino/](https://howtomechatronics.com/projects/diy-mars-perseverance-rover-replica-with-arduino/))

Nous avons eu pour projet de rajouter à ce modèle un bras mécanique portant plusieurs fonctionnalités simulants les véritables fonctions du rover perseverance. Voici la liste des capteurs envisagés avec une \* indiquant ceux que nous avons fini par choisir :  
\- Baromètre\*  
\- Thermomètre\*  
\- Sonar (Ultrasonic sensor)\*  
\- Camera + Mire\*  
\- Pointeur laser\* --&gt; Pour simuler le fonctionnement d'un spectrophotomètre   
\- Système radio (Émetteur + récepteur)\*  
\- Anémomètre   
\- Accéléromètre   
\- Bras   
\- Microphone  
\- Compteur Geiger

<details id="bkmrk-mat%C3%A9riel-manquant%3A-m"><summary>Matériel nécessaire:</summary>

**<span style="text-decoration: underline;">Matériel manquant:  
  
</span>**-[Motor drivers ×6](https://fr.aliexpress.com/item/4000336403231.html?af=2049356_1&cv=40506960&cn=46tf46en9mn2pxjbkln8rybgtvlyj1bh&dp=v5_46tf46en9mn2pxjbkln8rybgtvlyj1bh&utm_source=epn&utm_medium=cpa&utm_campaign=2049356_1&utm_content=40506960&product_id=4000336403231&afref=&aff_fcid=489b9fa6819e4d36bc10baa2b010e45e-1778908271295-06372-_omNKGGd&aff_fsk=_omNKGGd&aff_platform=api-new-link-generate&sk=_omNKGGd&aff_trace_key=489b9fa6819e4d36bc10baa2b010e45e-1778908271295-06372-_omNKGGd&terminal_id=bee90da53fde452a850b58c33765b385&afSmartRedirect=y)   
-[Bornier 1cm ×4](https://www.mouser.fr/ProductDetail/Phoenix-Contact/1729128?qs=GFUSqQMLmmnCBVBY3dts9w%3D%3D&mgh=1&vip=1&utm_id=18188302969&utm_source=google&utm_medium=cpc&utm_marketing_tactic=emeacorp&gad_source=1&gad_campaignid=18193091258&gclid=Cj0KCQjwiJvQBhCYARIsAMjts3JaYqNon9CLmtl3492hkhV_Y3GDuXq3pXYf4MmPZBJ3s4XEI76NxX0aAgu9EALw_wcB)  
-[Cable double (10m)](https://www.inovatlantic-led.fr/accessoires-mono/589-3629-cable-2-fils-12-24-48v-18awg.html?gad_source=1&gad_campaignid=23136520925&gclid=Cj0KCQjwiJvQBhCYARIsAMjts3I54b5BKsbAHbfvmjLBc6g2UCIwhoOXkNEYYr7xSwciv3M5spzuteEaAkVREALw_wcB)  
-[Cable triple (10m)\*](https://www.inovatlantic-led.fr/electricite-230v/497-3664-cable-electrique-3-fils-230v-au-metre.html?gad_source=1&gad_campaignid=23507946947&gclid=Cj0KCQjwiJvQBhCYARIsAMjts3KlNWq4JWQMg0NlsekwpfipGgBg1XkcyYjtA9ihouY-jq-LA7swaqkaAun0EALw_wcB)

**<span style="text-decoration: underline;">Matériel obtenu:</span>**

- Chassis + Labo intégré:

-V<span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; white-space-collapse: preserve;">is m6 à tête hexagonale, longueur 8cm  
-<span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; white-space-collapse: preserve;">Tiges finetées de 5cm  
[-T-slot corner brackets de 2cm (×14)](https://amzn.to/3aK2Dzz)  
[-Vis et écrous M3](https://amzn.to/2SXCzMM)  
-2 émetteurs et 2 récepteurs RF433MHz   
-[DRV8871 DC Motor Driver](https://amzn.to/358jKtt)  
-[A4988 Stepper Driver ](https://amzn.to/37S7ufj)  
-[DC-DC Buck Converter](https://amzn.to/38FNL6U)  
-[3S LiPo Battery](https://amzn.to/3fjPVua)  
-[FPV Camera and Video Transmitter](https://fr.aliexpress.com/item/32684177175.html?af=2049356_1&cv=40506960&cn=42taeffo77zaboxrx1nwdn2ptdel3rri&dp=v5_42taeffo77zaboxrx1nwdn2ptdel3rri&utm_source=epn&utm_medium=cpa&utm_campaign=2049356_1&utm_content=40506960&product_id=32684177175&afref=&aff_fcid=0f4fcec9b28d4764a1a38b05e3c76e99-1770988452720-06266-_oCokwnf&aff_fsk=_oCokwnf&aff_platform=api-new-link-generate&sk=_oCokwnf&aff_trace_key=0f4fcec9b28d4764a1a38b05e3c76e99-1770988452720-06266-_oCokwnf&terminal_id=8d132f120f904952afa7354c8c829667&afSmartRedirect=y)  
-FPV Receiver  
-Arduino Uno  
-Arduino Mega   
-Bread board  
-Laser KY-008  
-Capteur de température et d'humidité: DHT11  
-Sonar URM09  
-Tubes en Aluminium (20mm)  
-Rod End Joint (8mm)  
-Bearings 608RS (8x22x7mm) x8  
-Bearing 625RS (5x16x5mm) x5  
-Boulons M3  
-Servo horns x4  
-Moteurs pas-à-pas Nema-17   
-XT-60 Connector  
-Profilés en Aluminium T-slot (20x20mm) x8 (3 barres de 35cm, 4 barres de 40cm et une barre de 53.5cm)  
-PCB personnalisée</span></span>

- <span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; white-space-collapse: preserve;"><span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; white-space-collapse: preserve;">Bras robot:  
    -5 moteurs continus GM3506</span></span><span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; white-space-collapse: preserve;"><span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; white-space-collapse: preserve;">  
    -2 tubes en aluminium de 1,5cm de diamètre et 18cm de long</span></span>

</details>##### **<span style="text-decoration: underline;">Processus:  
</span>**

1. **Réalisation du rover**  
    -Impression armature 3D  
    -Assemblage de l'armature  
    -Mise en place de l'éclairage  
    -Insertion de la Caméra
2. **Réalisation du laboratoire**  
    -Mise en place du capteur de température et d'humidité  
    -Mise en place du pointeur laser  
    -Mise en place du capteur de distance (Sonar)
3. **Communication radio**
4. **Gestion d'une interface** permettant d'obtenir les infos du labo (Une bread board déguisée avec boutons)

##### <span style="text-decoration: underline;">**Journal de bord:**</span> <span style="text-decoration: underline;">  
</span>

**30 janvier 2026 :**

- Recherche de capteurs adaptés pour le labo du rover.
- Choix du capteur de température/humidité dht11 et du laser KY-008.  
      
    [![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/19cimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/19cimage.png)
    
     Capteur DHT11 Laser KY-008

**6 février 2026 :**

- Découverte d'Arduino.
- Création d'un programme permettant d'allumer le laser et le capteur d'humidité.

<details id="bkmrk-code-permettant-de-f"><summary>Code permettant de faire fonctionner DHT11 + KY-008 avec un intervalle de 10 secondes</summary>

```
// Code for blinking a laser module using Arduino
// Author: Oyvind N. Dahl
// Website: https://www.build-electronic-circuits.com/
// Capteur de temperature et d'humidite DHT11
// https://tutoduino.fr/
// Copyleft 2020
 
#include "DHT.h"
 
// Definit la broche de l'Arduino sur laquelle la 
// broche DATA du capteur est reliee 
#define DHTPIN 2
 
// Definit le type de capteur utilise
#define DHTTYPE DHT11
 
// Declare un objet de type DHT
// Il faut passer en parametre du constructeur 
// de l'objet la broche et le type de capteur

DHT dht(DHTPIN, DHTTYPE);
void setup() {
  pinMode(3, OUTPUT);
Serial.begin(9600);

  // Initialise la capteur DHT11
  dht.begin();
  // Recupere la temperature et l'humidite du capteur et l'affiche
  // sur le moniteur serie
  Serial.println("Temperature = " + String(dht.readTemperature())+" °C");
  Serial.println("Humidite = " + String(dht.readHumidity())+" %");
 
  // Attend 10 secondes avant de reboucler
}

void loop() {
  digitalWrite(3, HIGH);
  delay(1000);

  digitalWrite(3, LOW);
  delay(1000);
}
```

</details>- Choix du sonar: Sonar URM09.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/Pywimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/Pywimage.png)

**13 février 2026 :**

- Création d'un programme pour arrêter les capteurs lorsque le sonar s'approche d'un obstacle ou lorsqu'un bouton est pressé.

<details id="bkmrk-code-permettant-d%27ac"><summary>Code permettant d'activer le laser et le capteur d'humidité si distance captée &lt; 30 cm</summary>

```
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

#define MAX_RANG 520
#define ADC_SOLUTION 1023.0

int sensityPin = A0;

float dist_t, sensity_t;

void setup() {
  pinMode(3, OUTPUT);     // Laser
  Serial.begin(9600);
  dht.begin();
}

void loop() {

  // Lecture du capteur de distance
  sensity_t = analogRead(sensityPin);
  dist_t = sensity_t * MAX_RANG / ADC_SOLUTION;

  Serial.print("Distance: ");
  Serial.print(dist_t, 0);
  Serial.println(" cm");

  // Condition sur la distance
  if (dist_t < 30) {

    // 🔴 Stop laser
    digitalWrite(3, LOW);
    Serial.println("Laser et capteur DHT DESACTIVES");

  } else {

    // 🟢 Active laser
    digitalWrite(3, HIGH);

    // Lecture température et humidité
    float temperature = dht.readTemperature();
    float humidite = dht.readHumidity();

    Serial.println("Laser et capteur DHT ACTIVES");
    Serial.print("Temperature = ");
    Serial.print(temperature);
    Serial.println(" °C");

    Serial.print("Humidite = ");
    Serial.print(humidite);
    Serial.println(" %");
  }

  delay(1000);
}
```

</details><details id="bkmrk-code-pour-tous-activ"><summary>Code pour tous activer avec un bouton</summary>

```
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

#define MAX_RANG 520
#define ADC_SOLUTION 1023.0

int sensityPin = A0;
int laserPin = 3;
int buttonPin = 4;

bool systemeActif = false;
bool lastButtonState = HIGH;

float dist_t, sensity_t;

void setup() {
  pinMode(laserPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);   // Bouton avec résistance interne
  Serial.begin(9600);
  dht.begin();
}

void loop() {

  // Lecture du bouton
  bool buttonState = digitalRead(buttonPin);

  // Détection d'appui (front descendant)
  if (buttonState == LOW && lastButtonState == HIGH) {
    systemeActif = !systemeActif;   // Inversion de l'état
    delay(200); // Anti-rebond simple
  }

  lastButtonState = buttonState;

  if (systemeActif) {

    digitalWrite(laserPin, HIGH);  // Active le laser

    // Lecture distance
    sensity_t = analogRead(sensityPin);
    dist_t = sensity_t * MAX_RANG / ADC_SOLUTION;

    Serial.print("Distance: ");
    Serial.print(dist_t, 0);
    Serial.println(" cm");

    // Lecture température et humidité
    Serial.print("Temperature = ");
    Serial.print(dht.readTemperature());
    Serial.println(" °C");

    Serial.print("Humidite = ");
    Serial.print(dht.readHumidity());
    Serial.println(" %");

  } else {

    digitalWrite(laserPin, LOW);  // Désactive le laser
    Serial.println("Systeme DESACTIVE");
  }

  delay(1000);
}
```

</details>[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/lh3image.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/lh3image.png)  
Schéma TinkerCad représentant les branchements nécessaire au fonctionnement du code ci-dessus:

- Récupération de profilés en aluminium.

**20 février 2026:**

- Récupération des tubes en aluminium.
- Formation au Fablab la semaine suivante afin de pouvoir utiliser la découpeuse jet d'eau.

**27 février 2026:**

- Découpe des profilés en aluminium de sorte à obtenir 3 barres de 35cm, 4 barres de 40cm et une barre de 53.5cm.

**6 mars 2026:**

- Montage du chassis du rover.

**13 mars 2026:**

- Suite du montage du chassis du rover.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/1sIimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/1sIimage.png)

**20 mars 2026 :**

- Conception du bras robotique:  
    Taille : 50cm de longueur  
    --&gt; 5 moteurs pas-à-pas (Stepper motor) reliés à une boite à engrenage pour diminuer la vitesse de rotation du moteur et ainsi augmenter la précision (Boite à engrenage de type Harmonic drive ou train épicyloïdal).  
      
    Première articulation reliée au rover via une zone de fixation et contient un moteur permettant mouvements dans z (verticaux) + un moteur permettant mouvements dans x (horizontaux).  
    Deuxième articulation reliée à la première via un tube en aluminium de 1,5 cm de diamètre et est composé d'un moteur permettant mouvements dans z (verticaux)  
    Troisième articulation reliée à la deuxième via le même type de tube que précédemment et est composé d'un moteur permettant de réaliser mouvements dans z (verticaux) et un autre moteur permettant mouvements dans y (circulaire dans le plan).  
      
    Schéma représentant le concept du bras robotisé:

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/FAwimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/FAwimage.png)

**<span style="color: rgb(0, 0, 0);">27 Mars 2026 : </span>**

- <span style="color: rgb(0, 0, 0);">Tentative de finalisation du chassi</span>

Assemblage des différents supports pour les 6 roues, insertion des 6 moteurs.  
Problème de visserie (Besoin de 2 tiges finetées de 5cm) pour relier les 2 supports de roues au chassi.

[![20260403_170725.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/20260403-170725.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/20260403-170725.jpg)

**15 mai 2026 :**

- Révision de la conception du bras robot: Utilisation de 5 moteurs continus GM3506 et des engrenages de type cycloidal drive qui seront imprimés en 3D suivant le modèle dans [ce lien Howtomechatronics:](https://howtomechatronics.com/how-it-works/harmonic-vs-cycloidal-drive-designing-3d-printing-testing/)  
    [![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/r8Simage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/r8Simage.png)
- Conception des boitiers moteurs et des jonctions permettant le lien boitier/tube sur FreeCad:   
    [![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/GDWimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/GDWimage.png)
    
     Pièce de jonction Boitier moteur
- Inventaire des pièces électroniques manquantes.

**22 mai 2026 :**

- Impression et assemblage de certaines des pièces du chassis, du bras et de la caméra
- Ajustements du modèle du boitier et de la pièce de jonction:   
    [![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/2Qnimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/2Qnimage.png)
    
    [![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/dROimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/dROimage.png)
    
    Pièce de jonction (Fichier .stl: [Jonction articulation V2.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1858)) Boitier moteur (Fichier .stl: [Boitier moteur.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1859))
- Récupération du code pour le déplacement du rover à partir de la page [HowToMechatronics](https://howtomechatronics.com/projects/diy-mars-perseverance-rover-replica-with-arduino/) :

<details id="bkmrk-code-de-d%C3%A9placement-"><summary>Code de déplacement du rover</summary>

```
/*
 
Mars Rover - Arduino Code
by Dejan, www.HowToMechatronics.com
Libraries:
ServoEasing: https://github.com/ArminJo/ServoEasing
IBusBM: https://github.com/bmellink/IBusBM
AccelStepper:http://www.airspayce.com/mikem/arduino/AccelStepper/index.html*/

#include <Servo.h>
#include <ServoEasing.h>
#include <IBusBM.h>
#include <AccelStepper.h>

#define motorW1_IN1 6
#define motorW1_IN2 7
#define motorW2_IN1 4
#define motorW2_IN2 5
#define motorW3_IN1 2
#define motorW3_IN2 3
#define motorW4_IN1 13
#define motorW4_IN2 10
#define motorW5_IN1 8
#define motorW5_IN2 9
#define motorW6_IN1 11
#define motorW6_IN2 12

ServoEasing servoW1;
ServoEasing servoW3;
ServoEasing servoW4;
ServoEasing servoW6;
ServoEasing servoCamTilt;

AccelStepper camPanStepper(1, 46, 45);  //(Type:driver, STEP, DIR) - Stepper1

IBusBM IBus;
IBusBM IBusSensor;

int angle = 0;   // servo position in degrees
int ch0, ch1, ch2, ch3, ch6 = 0;
int servo1Angle = 90;
int servo3Angle = 90;
int servo4Angle = 90;
int servo6Angle = 90;
int s = 0; // rover speed
int r = 0; // turning radius
int m1, m2, m3, m4, m5, m6;
int camTilt = 90;
int camPan = 0;
float speed1, speed2, speed3 = 0;
float speed1PWM, speed2PWM, speed3PWM = 0;
float thetaInnerFront, thetaInnerBack, thetaOuterFront, thetaOuterBack = 0;


float d1 = 271; // distance in mm
float d2 = 278;
float d3 = 301;
float d4 = 304;


void setup() {

  /*
     Use this if you need to change the frequency of the PWM signals
    TCCR4B = TCCR4B & B11111000 | B00000101;     // D6,D7,D8 PWM frequency of 30.64 Hz
    TCCR2B = TCCR2B & B11111000 | B00000111;   // D9, D10 PWM frequency of 30.64 Hz
    TCCR1B = TCCR1B & B11111000 | B00000101;   // D11, D12  PWM frequency of 30.64 Hz
    TCCR5B = TCCR5B & B11111000 | B00000101; // D4, D13 PWM frequency of 30.64 Hz
    TCCR3B = TCCR3B & B11111000 | B00000101;    // D2, D3, D5 PWM frequency of 30.64 Hz
  */

  Serial.begin(115200);
  IBus.begin(Serial1, IBUSBM_NOTIMER); // Servo iBUS
  IBusSensor.begin(Serial2, IBUSBM_NOTIMER); // Sensor iBUS

  IBusSensor.addSensor(IBUSS_INTV); // add voltage sensor

  servoW1.attach(22);
  servoW3.attach(23);
  servoW4.attach(24);
  servoW6.attach(25);
  servoCamTilt.attach(26);

  servoW1.write(90);
  servoW3.write(90);
  servoW4.write(90);
  servoW6.write(90);
  servoCamTilt.write(90);

  servoW1.setSpeed(550);
  servoW3.setSpeed(550);
  servoW4.setSpeed(550);
  servoW6.setSpeed(550);
  servoCamTilt.setSpeed(200);

  camPanStepper.setMaxSpeed(1000);
  camPan = 0;
  camTilt = 90;
// DC Motors
  // Motor Wheel 1 - Left Front
  digitalWrite(motorW1_IN1, LOW);   // PWM value
  digitalWrite(motorW1_IN2, LOW); // Forward
  // Motor Wheel 2 - Left Middle
  digitalWrite(motorW2_IN1, LOW);
  digitalWrite(motorW2_IN2, LOW);
  // Motor Wheel 3 - Left Back
  digitalWrite(motorW3_IN1, LOW);
  digitalWrite(motorW3_IN2, LOW);
  // right side motors move in opposite direction
  // Motor Wheel 4 - Right Front
  digitalWrite(motorW4_IN1, LOW);
  digitalWrite(motorW4_IN2, LOW);
  // Motor Wheel 5 - Right Middle
  digitalWrite(motorW5_IN1, LOW);
  digitalWrite(motorW5_IN2, LOW);
  // Motor Wheel 6 - Right Back
  digitalWrite(motorW6_IN1, LOW);
  digitalWrite(motorW6_IN2, LOW);


}

void loop() {
  // Reading the data comming from the RC Transmitter
  IBus.loop();
  ch0 = IBus.readChannel(0);
  ch1 = IBus.readChannel(1);
  ch2 = IBus.readChannel(2);
  ch3 = IBus.readChannel(3);
  ch6 = IBus.readChannel(6);

  // Convertign the incoming data
  // Steering right
  if (ch0 > 1515) {
    r = map(ch0, 1515, 2000, 1400, 600); // turining radius from 1400mm to 600mm
  }
  // Steering left
  else if (ch0 < 1485) {
    r = map(ch0, 1485, 1000, 1400, 600); // turining radius from 600mm to 1400mm
  }
  // Rover speed in % from 0 to 100
  s = map(ch2, 1000, 2000, 0, 100); // rover speed from 0% to 100%

  // Camera head steering
  if (ch1 < 1485 ) {
    if (camTilt >= 35) {
      camTilt--;
delay(20);
    }
  }
  if (ch1 > 1515 ) {
    if (camTilt <= 165) {
      camTilt++;
      delay(20);
    }
  }
  servoCamTilt.startEaseTo(camTilt); // Camera tilt

  if (ch3 >= 1000 && ch3 < 1485) {
    camPan = map(ch3, 1000, 1485, 400, 0);
  }
  else if (ch3 > 1515 && ch3 <= 2000) {
    camPan = map(ch3, 1515, 2000, 0, -400);
  }
  else {
    camPan = 0;
  }
  camPanStepper.setSpeed(camPan);    // Camera pan
  camPanStepper.run();


  calculateMotorsSpeed();
  calculateServoAngle();

  // Steer right
  if (ch0 > 1515) {
    // Servo motors
    // Outer wheels
    servoW1.startEaseTo(97 + thetaInnerFront); // front wheel steer right
    servoW3.startEaseTo(97 - thetaInnerBack); // back wheel steer left for overall steering to the right of the rover
    // Inner wheels
    servoW4.startEaseTo(94 + thetaOuterFront);
    servoW6.startEaseTo(96 - thetaOuterBack);

    // DC Motors
    if (ch6 < 1500) { // Move forward
      // Motor Wheel 1 - Left Front
      analogWrite(motorW1_IN1, speed1PWM);   // Outer wheels running at speed1 - max speed
      digitalWrite(motorW1_IN2, LOW);
      // Motor Wheel 2 - Left Middle
      analogWrite(motorW2_IN1, speed1PWM);
      digitalWrite(motorW2_IN2, LOW);
      // Motor Wheel 3 - Left Back
      analogWrite(motorW3_IN1, speed1PWM);
      digitalWrite(motorW3_IN2, LOW);
      // right side motors move in opposite direction
      // Motor Wheel 4 - Right Front
digitalWrite(motorW4_IN1, LOW);
      analogWrite(motorW4_IN2, speed2PWM); // Inner front wheel running at speed2 - lower speed
      // Motor Wheel 5 - Right Middle
      digitalWrite(motorW5_IN1, LOW);
      analogWrite(motorW5_IN2, speed3PWM); // Inner middle wheel running at speed3 - lowest speed
      // Motor Wheel 6 - Right Back
      digitalWrite(motorW6_IN1, LOW);
      analogWrite(motorW6_IN2, speed2PWM); // Inner back wheel running at speed2 - lower speed
    }
    else if (ch6 > 1500) {
      // Motor Wheel 1 - Left Front
      digitalWrite(motorW1_IN1, LOW);   // Outer wheels running at speed1 - max speed
      analogWrite(motorW1_IN2, speed1PWM);
      // Motor Wheel 2 - Left Middle
      digitalWrite(motorW2_IN1, LOW);
      analogWrite(motorW2_IN2, speed1PWM);
      // Motor Wheel 3 - Left Back
      digitalWrite(motorW3_IN1, LOW);
      analogWrite(motorW3_IN2, speed1PWM);
      // right side motors move in opposite direction
      // Motor Wheel 4 - Right Front
      analogWrite(motorW4_IN1, speed2PWM);
      digitalWrite(motorW4_IN2, LOW); // Inner front wheel running at speed2 - lower speed
      // Motor Wheel 5 - Right Middle
      analogWrite(motorW5_IN1, speed3PWM);
digitalWrite(motorW5_IN2, LOW); // Inner middle wheel running at speed3 - lowest speed
      // Motor Wheel 6 - Right Back
      analogWrite(motorW6_IN1, speed2PWM);
      digitalWrite(motorW6_IN2, LOW); // Inner back wheel running at speed2 - lower speed
    }
  }

  // Steer left
  else if (ch0 < 1485) {
    // Servo motors
    servoW1.startEaseTo(97 - thetaOuterFront);
    servoW3.startEaseTo(97 + thetaOuterBack);
    servoW4.startEaseTo(94 - thetaInnerFront);
    servoW6.startEaseTo(96 + thetaInnerBack);

    // DC Motors
    if (ch6 < 1500) { // Move forward
      // Motor Wheel 1 - Left Front
      analogWrite(motorW1_IN1, speed2PWM);   // PWM value
      digitalWrite(motorW1_IN2, LOW); // Forward
      // Motor Wheel 2 - Left Middle
      analogWrite(motorW2_IN1, speed3PWM);
      digitalWrite(motorW2_IN2, LOW);
      // Motor Wheel 3 - Left Back
      analogWrite(motorW3_IN1, speed2PWM);
      digitalWrite(motorW3_IN2, LOW);
// Motor Wheel 4 - Right Front
      // right side motors move in opposite direction
      digitalWrite(motorW4_IN1, LOW);
      analogWrite(motorW4_IN2, speed1PWM);
      // Motor Wheel 5 - Right Middle
      digitalWrite(motorW5_IN1, LOW);
      analogWrite(motorW5_IN2, speed1PWM);
      // Motor Wheel 6 - Right Back
      digitalWrite(motorW6_IN1, LOW);
      analogWrite(motorW6_IN2, speed1PWM);
    }
    else if (ch6 > 1500) { // Move backward
      // Motor Wheel 1 - Left Front
      digitalWrite(motorW1_IN1, LOW);   // PWM value
      analogWrite(motorW1_IN2, speed2PWM); // Forward
      // Motor Wheel 2 - Left Middle
      digitalWrite(motorW2_IN1, LOW);
      analogWrite(motorW2_IN2, speed3PWM);
      // Motor Wheel 3 - Left Back
      digitalWrite(motorW3_IN1, LOW);
      analogWrite(motorW3_IN2, speed2PWM);
      // Motor Wheel 4 - Right Front
      // right side motors move in opposite direction
      analogWrite(motorW4_IN1, speed1PWM);
      digitalWrite(motorW4_IN2, LOW);
      // Motor Wheel 5 - Right Middle
      analogWrite(motorW5_IN1, speed1PWM);
      digitalWrite(motorW5_IN2, LOW);
      // Motor Wheel 6 - Right Back
      analogWrite(motorW6_IN1, speed1PWM);
      digitalWrite(motorW6_IN2, LOW);
    }
  }

  // Move straight
  else {
    servoW1.startEaseTo(97);
    servoW3.startEaseTo(97);
    servoW4.startEaseTo(94);
    servoW6.startEaseTo(96);

    // DC Motors
    if (ch6 < 1500) {
      // Motor Wheel 1 - Left Front
      analogWrite(motorW1_IN1, speed1PWM);  // all wheels move at the same speed
      digitalWrite(motorW1_IN2, LOW); // Forward
      // Motor Wheel 2 - Left Middle
      analogWrite(motorW2_IN1, speed1PWM);
      digitalWrite(motorW2_IN2, LOW);
// Motor Wheel 3 - Left Back
      analogWrite(motorW3_IN1, speed1PWM);
      digitalWrite(motorW3_IN2, LOW);
      // right side motors move in opposite direction
      // Motor Wheel 4 - Right Front
      digitalWrite(motorW4_IN1, LOW);
      analogWrite(motorW4_IN2, speed1PWM);
      // Motor Wheel 5 - Right Middle
      digitalWrite(motorW5_IN1, LOW);
      analogWrite(motorW5_IN2, speed1PWM);
      // Motor Wheel 6 - Right Back
      digitalWrite(motorW6_IN1, LOW);
      analogWrite(motorW6_IN2, speed1PWM);
    }
    else if (ch6 > 1500) {
      // Motor Wheel 1 - Left Front
      digitalWrite(motorW1_IN1, LOW);  // all wheels move at the same speed
      analogWrite(motorW1_IN2, speed1PWM); // Forward
      // Motor Wheel 2 - Left Middle
      digitalWrite(motorW2_IN1, LOW);
      analogWrite(motorW2_IN2, speed1PWM);
      // Motor Wheel 3 - Left Back
      digitalWrite(motorW3_IN1, LOW);
      analogWrite(motorW3_IN2, speed1PWM);
      // right side motors move in opposite direction
      // Motor Wheel 4 - Right Front
      analogWrite(motorW4_IN1, speed1PWM);
      digitalWrite(motorW4_IN2, LOW);
      // Motor Wheel 5 - Right Middle
      analogWrite(motorW5_IN1, speed1PWM);
      digitalWrite(motorW5_IN2, LOW);
      // Motor Wheel 6 - Right Back
      analogWrite(motorW6_IN1, speed1PWM);
      digitalWrite(motorW6_IN2, LOW);
    }
  }
  // Monitor the battery voltage
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.00 / 1023.00) * 3.02; // Convert the reading values from 5v to suitable 12V
  // Send battery voltage value to transmitter
  IBusSensor.loop();
  IBusSensor.setSensorMeasurement(1, voltage * 100);
}

void calculateMotorsSpeed() {
  // if no steering, all wheels speed is the same - straight move
  if (ch0 > 1485 && ch0 < 1515) {
    speed1 = speed2 = speed3 = s;
  }
  // when steering, wheels speed depend on the turning radius value
else {
    // Outer wheels, furthest wheels from turning point, have max speed
    // Due to the rover geometry, all three outer wheels should rotate almost with the same speed. They differe only 1% so we asume they are the same.
    speed1 = s;
    // Inner front and back wheels are closer to the turing point and have lower speeds compared to the outer speeds
    speed2 = s * sqrt(pow(d3, 2) + pow((r - d1), 2)) / (r + d4);
    // Inner middle wheel is closest to the turning point, has the lowest speed
    speed3 = s * (r - d4) / (r + d4);
  }

  // speed value from 0 to 100% to PWM value from 0 to 255
  speed1PWM = map(round(speed1), 0, 100, 0, 255);
  speed2PWM = map(round(speed2), 0, 100, 0, 255);
  speed3PWM = map(round(speed3), 0, 100, 0, 255);
}

void calculateServoAngle() {
  // Calculate the angle for each servo for the input turning radius "r"
  thetaInnerFront = round((atan((d3 / (r + d1)))) * 180 / PI);
  thetaInnerBack = round((atan((d2 / (r + d1)))) * 180 / PI);
  thetaOuterFront = round((atan((d3 / (r - d1)))) * 180 / PI);
  thetaOuterBack = round((atan((d2 / (r - d1)))) * 180 / PI);

}
```

</details>- Le drame: Rupture de l'articulation reliant le châssis à toute la partie gauche du rover après une chute juste avant le rangement.  
    --&gt; Besoin de réimprimer toute la partie gauche.  
    [![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/D3qimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/D3qimage.png)

 **<span style="text-decoration: underline;">Résultat final:</span>**

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/6Ecimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/6Ecimage.png)

- **Architecture globale:**  
    Malgré l'incident du 22/05/2026, le châssis du Rover devrait être entièrement finalisé, les 6 roues sont en place et articulées entre elles et avec le châssis. Les 4 servos sont correctement insérés au dessus des 4 roues les plus distales et chacune des 6 roues est associée avec son moteur.  
    Certaines pièces permettant l'insertion de la caméra ont été assemblées.  
    La conception du bras robotisé est terminé, les boitiers permettant insertion du moteur + jonction aux différentes articulations ont été modélisés.
- **Electronique:**  
    Les montages Arduino permettant de mettre en fonctionnement les différents capteurs, le laser ainsi que le sonar sont réalisés et fonctionnels.  
    Le PCB a été obtenu.
- **Programmation:**  
    Le code concernant les éléments du laboratoires ainsi que le sonar ont été écris.  
    Le code permettant le mouvement du rover a été extrait.

##### **<span style="text-decoration: underline;">Difficultés rencontrées:</span>**

Le projet était extrêmement intéressant et enrichissant à réaliser, cependant cela n'empêche pas l'apparition de nombreux pépins tout du long.

- La majeur partie de ces problèmes provenaient de notre manque d'expérience avec les différents outils que nous avons du utiliser, il s'agissait de problèmes du type: erreur de codage dans Arduino, problèmes de librairies etc.. ces problèmes furent en général assez facile à corriger.
- D'autres problèmes ont été assez persistants tout le long du projet.   
    On y retrouve par exemple les problèmes qui vont avec l'imprimerie 3D comme par exemple la nécessité de retirer du matériau de support qui pouvait prendre beaucoup de temps selon les pièces ou encore le besoin de limer certaines pièces afin que celles-ci puissent s'emboiter correctement ensemble et avec les autres pièces du rover.  
    On a aussi du faire face à des problèmes de commandes, n'étant pas des experts dans le domaine il était assez difficiles de savoir quoi commander et en quelle quantité et bien que la page [HowToMechatronics](https://howtomechatronics.com/projects/diy-mars-perseverance-rover-replica-with-arduino/) fournissent de nombreuses informations sur le sujet, il manquait parfois des informations concernant la visserie notamment. De plus les produits reçus étaient généralement très mal étiquetés ou bien étiquetés dans une langue étrangère ce qui ne facilitait pas la tache d'inventaire.
- Et enfin certains problèmes plus ponctuels ont constitués une perte de temps considérable.  
    -Le 8 avril, nous avons passé 4h à imprimer des pièces qui ont toutes fini par échouer en raison de la chaleur dans la salle où les impressions avaient lieu. Cela a causé une grande perte de temps.  
    -La chute du 22 mai qui a nécessité de réimprimer et réassembler toute la partie gauche du châssis.

##### **<span style="text-decoration: underline;">Poster:</span>**

##### **<span style="text-decoration: underline;">Pour le futur:</span>**

A tout ceux qui prendront la relève avant les prochaines fêtes de la Science, voilà ce qu'il reste à faire concernant le projet:

- Terminer l'assemblage du rover (Ajouter les parties esthétiques et assembler le support de la caméra au chassis)
- Assembler l'Arduino mega avec la PCB et réaliser les différents branchements avec les moteurs et les servos
- Faire fonctionner la caméra FPV via un système radio qui sera relié à une autre Arduino
- Insérer le mini labo sur le rover via une 3ème Arduino
- Mettre en place le bras robot   
    -Impression  
    -Assemblage  
    -Programmation des moteurs continus
- Rendre tous ça contrôlable à distance avec la télécommande.
- Programmer une interface simple sur python montrant toutes les données recueillies par le rover (Capteurs, Photos etc...)
- Ajouter un décalage de 30 secondes entre la saisie d'une action sur la télécommande et la réalisation de cette action par le rover pour simuler la distance.
- Ajouter d'autres capteurs au mini labo si vous avez du temps (Microphone, Baromètre avec données simulées pour correspondre à la pression martienne etc...)

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/FJuimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/FJuimage.png)

# Dual-Sandbox

#### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Informations</span></span>

- **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Contact :</span></span>**
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Fatih Yalcin (muhammed\_fatih.yalcin@etu.sorbonne-universite.fr)</span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Judith Chevrel (judith.chevrel@etu.sorbonne-universite.fr)</span></span>
- **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Cursus :</span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> L3 Licences de la Terre (LU3ST062)</span></span>
- **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Encadrants : </span></span>**
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Responsables de l'UE : Fabrice Minoletti et Pierre Théry</span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Responsable du projet : Pierre Théry</span></span>
- **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Dates du projet :</span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> 30 janvier 2026 - mai 2026</span></span>

#### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Contexte</span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Quand on observe une coupe géologique, on observe la conséquence de mouvements tectoniques. Pour mieux comprendre comment ces mouvements tectoniques donnent naissance aux figures géologiques enregistrées, on peut créer des modèles qui reproduisent ces mouvements tectoniques sur des temps beaucoup plus courts.</span></span>

#### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Objectifs</span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Nous voulons créer un bac à sable pour observer les plissements tectoniques dans le cadre de manipulations pédagogiques. Plus précisément, il s'agit de créer un bac à sable qui permette d'exercer des forces de compressions ou d'extension de deux côtés. (Les bacs à sable précédents n'exerçaient de force que dans un seul sens)</span></span>

#### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Matériel</span></span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Plexiglas (épaisseur)</span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Verre (épaisseur)</span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Bois plaqué (épaisseur</span></span>

#### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Machines et composants utilisées</span></span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Une carte Arduino UNO</span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">![Arduino.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/arduino.png)</span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">2 \* Moteurs DC : [DO 319.3860.3B.00 / 3124](https://www.galaxus.fr/fr/s4/product/doga-do31938603b003124-moteur-electrique-13062304) (24V, 3A) **||** <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">1 \* Transformateur [NDR-120-24](https://www.meanwell.com/webapp/product/search.aspx?prod=NDR-120) <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**||**</span></span> 1 \* Clavier 16 touches Arduino</span></span></span></span> ![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/ecBimage.png) ![Transfor NDR.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/transfor-ndr.jpg) ![Keypad_image.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/keypad-image.jpg)
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">2 \* transistor [IRLZ44NPBF](https://docs.rs-online.com/de24/0900766b807913d7.pdf) 55V 47A <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**||** <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">2 \* diode [1N4148](https://asset.conrad.com/media10/add/160267/c1/-/en/000162280DS01/datasheet-162280-diotec-ultra-fast-si-diode-1n4148-sod-27-75-v-150-ma.pdf)</span></span> </span></span><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**||** 1 \* écran [LCD I2C 1602](https://handsontec.com/dataspecs/module/I2C_1602_LCD.pdf)<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> </span></span><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**||** 2 \* résistance 220Ω et 2 \* 100k<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ω</span></span></span></span></span></span></span></span> **![MOSFET.webp](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/mosfet.webp) ![Diode 1N4148.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/diode-1n4148.png) ![LCD_I2C.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/lcd-i2c.jpg) ![Résistance_220.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/resistance-220.jpg) ![R_100k_bis.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/r-100k-bis.jpg)** </span></span></span></span></span></span></span></span>

#### **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Matériel à acheter</span></span>**

- **2 \* TRM2-1000/SS ([lien HPC](https://shop.hpceurope.com/fr/produit.asp?prid=3758) - module 2)**
- **<span class="a-size-large product-title-word-break" id="bkmrk-dollatek-5pcs-4x4-un">2 \* SSG2-16-304L ([lien HPC](https://shop.hpceurope.com/fr/produit.asp?prid=226&mtm_campaign=LaGamme&mtm_kwd=Engrenage%20droit%20inox) - engrenage à 16 dents, module 2,0)</span>**

#### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Construction de la boîte</span></span>

À venir...

#### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Programmation et électronique</span></span>

Pour modifier la vitesse des moteurs DC, il est possible d'utiliser la modulation de largeur d'impulsion (**PWM**, ou Pulse Width Modulation). Quand un signal d'entrée alterne rapidement entre une tension nulle et une tension non nulle, la tension de sortie correspondra au rapport entre le temps à la tension non nulle et le temps à la tension nulle.

- ![PWM-50.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/pwm-50.png)(d'après [Vincent Vanneste](https://www.vincent-vanneste.fr/views/arduino/co/PWM.html))
- La tension de sortie correspond à 2,5 V. Si un moteur DC est alimenté par cette tension variable, sa vitesse sera la moitié de la vitesse "normale". (si le moteur est juste branché sur une tension 5V continue)

Cet effet est contrôlé via une carte Arduino UNO.

- pour l'Arduino, la rapport de tension est traduit par un rapport cyclique compris entre 0 (tension nulle) et 255 (tension continue).
- L'Arduino UNO est connectée à un clavier à 16 touches qui permet d'entrer des valeurs de vitesse pour chacun des deux moteurs. Ces valeurs de vitesse, qui correspondent à des rapports cycliques, sont affichées sur un écran
- Si des modifications du fonctionnement et du code sont nécessaires par la suite, elles pourront être facilement implémentées, ce qui est un des avantages de l'utilisation d'Arduino.

**Fonctionnement** :

- L'utilisateur choisit un des deux moteurs : **C** ou **D** en appuyant sur la touche correspondante.
- [![LCD_saisie.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/lcd-saisie.jpeg) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/lcd-saisie.jpeg)[![LCD_ok.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/lcd-ok.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/lcd-ok.jpeg)
    - écran de saisie pour **D** après validation compatible via **\#**
- Si ce qui validé par **\#** n'est pas un rapport cyclique compatible (c'est à dire qu'il est supérieur à 255 ou que la chaîne de caractères contient des lettres), il s'affiche le message "**Incompatible**", et on revient à l'écran de saisie)
- [![LCD_incompatible.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/txDlcd-incompatible.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/txDlcd-incompatible.jpeg)
- La touche **\*** permet de revenir à l'écran de saisie avant validation par **\#**. (ex : L'utilisatrice veut rentrer la vitesse **200**, mais commence à écrire **22**. Elle utilise donc la touche **\*** pour recommencer la saisie depuis le début.)
- Une fois une vitesse compatible validée, le moteur tourne à cette vitesse. En l'état des choses, le moteur ne tourne que dans un seul sens. Il sera nécessaire d'implémenter une manière de sélectionner un sens pour la continuation du projet.

**Montage** :

![Schema_Circuit_Complet.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/schema-circuit-complet.png)(Montage de PWM repris de [LOCODUINO](https://www.locoduino.org/spip.php?article120))

- Le transistor MOSFET permet de transmettre le signal de PWM émis par l'Arduino (dans un circuit à 5V) au circuit à 24 qui comprend le moteur.
- La résistance 100 k<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ω</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> empêche le transistor de fermer le circuit 24V tant qu'il n'y a pas de signal PWM. La résistance 220 <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ω empêche le courant qui traverse l'Arduino d'être trop important. (d'après [LOCODUINO](https://www.locoduino.org/spip.php?article120))</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

**Code** :

- Il faut d'abord récupérer l'adresse de l'écran LCD I2C. Le code suivant, d'après [cet article d'Arun Rawat](https://controllerstech.com/i2c-lcd1602-arduino-tutorial/), permet d'afficher cette adresse dans le Serial Monitor. ```c
    #include <Wire.h>
    
    void setup() {
      Wire.begin();
      Serial.begin(9600);
      Serial.println("Recherche des appareils I2C...");
      for (byte i = 1; i < 127; i++) {
        Wire.beginTransmission(i);
        if (Wire.endTransmission() == 0) {
          Serial.print("Appareil I2C trouvé à l'adresse 0x");
          Serial.println(i, HEX);
        }
      }
    }
    
    void loop() {}
    ```
- Ensuite, on peut télécharger le code suivant sur l'arduino UNO, en installant préalablement les bibliothèques **LiquidCrystal I2C** (de **Frank de Brabander**) et **Keypad** (de **Mark Stankey** et **Alexander Brevig**)
- ```c
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <Keypad.h>
    
    // Remplacez 0x3F avec l'adresse de votre écran (code dans la fenêtre suivante)
    LiquidCrystal_I2C lcd(0x3F, 16, 2);
    
    const int ROW_NUM = 4; //four rows
    const int COLUMN_NUM = 4; //three columns
    
    char keys[ROW_NUM][COLUMN_NUM] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    
    byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connection aux pins des lignes du keypad
    byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connection aux pins des colonnes du keypad
    
    int motC = 11;
    int motD = 10;
    
    Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
    String input_vitesse; // la vitesse est représentée par le rapport cyclique (entre 0 et 255)
    int vitesseC = 0;
    int vitesseD = 0;
    bool clavier = true; // régit si l'on peut ou non modifier le rapport cyclique
    
    
    void setup() {
      lcd.init();          // Initialise l'écran LCD
      lcd.backlight();     // Allume la lumière
      lcd.setCursor(0, 0); // Première ligne
      lcd.print("C : ");
      lcd.print("0 ");
      lcd.setCursor(0, 1); // Deuxième ligne
      lcd.print("D : ");
      lcd.print("0");
    
      Serial.begin(9600);
      input_vitesse.reserve(2); // au maximum, 3 caractères peuvent être stockés par cette variable
    }
    
    void reset(int ligne){ // fonction qui réinitialise la saisie de la vitesse
      lcd.setCursor(4, ligne); 
      lcd.print("            ");
      lcd.setCursor(4, ligne);
    }
    
    int vitesse_setup(int ligne){ // fonction qui permet de sélectionner une vitesse / intensité
      int vitesse;
    
      while (clavier){
        char key = keypad.getKey();
    
        if (key){
          Serial.println(key);
    
          if(key == '*') {
            input_vitesse = ""; // réinitialise le paramètre vitesse
            reset(ligne);
          } 
          else if(key == '#') {
            Serial.println(input_vitesse);
            if((input_vitesse.indexOf("D") < 0) && (input_vitesse.indexOf("C") < 0) && (input_vitesse.toInt() < 256)) {
              Serial.println("Rapport cyclique compatible !");
              clavier = false; // on sort de la boucle -> la pwm peut être appliquée à la vitesse indiquée
              vitesse = input_vitesse.toInt();
              input_vitesse = ""; // input_vitesse est réinitialisé
              lcd.print(" :)"); // les raports cycliques confirmés sont affichés avec un smiley :)
              return vitesse;
            
            } 
            else {
              Serial.println("Rapport cyclique non compatible.");
              lcd.setCursor(4, ligne);
              lcd.print("Incompatible"); // affiche 'Icompatible' pendant 0,45 s
              delay(450);
              input_vitesse = "";
              reset(ligne);
            }
            
          } 
          else {
            input_vitesse += key; // ajoute un chiffre à la vitesse 
            lcd.print(key);
          }
        }
      }
    }
    
    void loop(){
      char key = keypad.getKey();
    
      if (key){
        if (key == 'C'){
          lcd.setCursor(4, 0);
          lcd.print("            ");
          lcd.setCursor(4, 0);
          clavier = true;
          vitesseC = vitesse_setup(0); 
          Serial.println(vitesseC);
    
        } else if (key == 'D'){
          lcd.setCursor(4, 1);
          lcd.print("            ");
          lcd.setCursor(4, 1);
          clavier = true;
          vitesseD = vitesse_setup(1);
          Serial.println(vitesseD);
        }
        analogWrite(motC, vitesseC); // change la vitesse du moteur C
        analogWrite(motD, vitesseD); // change la vitesse du moteur D
      }
    }
    ```
- (le code pour le Keypad est adapté d'un [code de mot de passe de ArduinoGetStarted](https://arduinogetstarted.com/tutorials/arduino-keypad))

#### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Journal de Bord</span></span>

<details id="bkmrk-journal-de-bord-30%2F0"><summary>Journal de bord</summary>

##### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">30/01/2026</span></span>

**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">1. Choix du matériel</span></span>**

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Nous avons choisi les dimensions de la boîte du bac à sable à partir des plaques de plexiglas disponibles. Les moteurs que nous allons utiliser nous ont également été déjà fournis par notre responsable.</span></span>

##### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">06/02/2026</span></span>

**1. Étude des chantiers à venir**

Nous avons identifié les différents chantiers sur lesquels travailler :

- Contrôle du moteur DC (par PWM, via Arduino ; des transformateurs seront nécessaires car la carte Arduino ne peut pas travailler avec les tensions de 24 V assignées au moteur DC)
- Fixation du moteur : il faut décider du mode de fixation du moteur (probablement une sorte de cadre qui le maintiendrait)
- Étanchéité (éviter que des grains de sable restent bloqués contre le verre, derrière les plaques de bois) : peut-être une pièce flexible en caoutchouc comme ce qu'on trouve sur les pelles de balayettes

**2. Travail sur la PWM avec Arduino**

Essai de PWM avec un moteur DC 5V en utilisant un potentiomètre 50k. Le montage ne marchait pas, cela peut être dû à un mauvais branchement ou à un potentiomètre défaillant.

##### 13/02/2026

Le but de cette séance est de comprendre pourquoi le montage de la dernière fois n'a pas fonctionné. Révision via un tutoriel Arduino.

- Le potentiomètre fonctionne bien (vérifié par un [programme Arduino](https://arduinogetstarted.com/tutorials/arduino-potentiometer) qui permet de lire les variations de tension induites par le potentiomètre)
- ![Construction1_pwm.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/construction1-pwm.png)
    - Branchement qui fonctionne théoriquement (via tinkercad.com) : les variations de voltages induisent bien des variations de rotations par minutes (sans surcharge pour la carte UNO)
    - Le branchement ne fonctionne pas dans la réalité (peut-être à cause de la résistance, qui ne laisse pas assez de courant passer)

[Une piste pour contrôler le moteur en utilisant un Motor Shield ](https://docs.arduino.cc/tutorials/motor-shield-rev3/msr3-controlling-dc-motor/)

##### 20/02/2026

- Utilisation du Motor Shield Rev3 pour contrôler le moteur DC 5V : montage beaucoup plus simple que sans shield. ([la piste mentionnée précédemment](https://docs.arduino.cc/tutorials/motor-shield-rev3/msr3-controlling-dc-motor/) a été fructueuse) 
    - Montage avec contrôle de la vitesse via potentiomètre
- Prochaine étape : adapter le montage pour le moteur DC 24V, 3A (6A au démarrage) 
    - Nous avons un transistor IRF520, mais qui ne tiendrait pas le courant du moteur.
    - À la place, nous pensons utiliser un transistor IRLZ44NPBF 55V 47A (s'il fonctionne avec PWM)
    - Les transformateurs NDR-120-24 ([guide usager](https://www.meanwell.com/Upload/PDF/NDR%20DIN%20rail.pdf)) à disposition vont nous servir à réduire la tension du secteur à un niveau utilisable pour le moteur. Nous allons étudier leurs branchements la prochaine fois.

##### 27/02/2026

- Pour le transistor [IRLZ44NPBF 55V 47A](https://www.mouser.fr/datasheet/3/70/1/Infineon_IRLZ44N_DataSheet_v01_01_EN.pdf), le délai entre deux activation est de minimum 136 ns (addition des temps d'activation, de lancement, de désactivation et de fall time). La fréquence PWM de base d'Arduino est de 490 Hz, ce qui correspond à une période d'environ 2 ms : on devrait pouvoir utiliser ce transistor pour faire de la PWM avec Arduino.
- [Guide sur l'utilisation de la PWM avec un transistor MOSFET IRF540N](https://www.locoduino.org/spip.php?article120) (qui a des paramètres assez proches de l'IRLZ44NPBF que nous pensons utiliser) 
    - Nous allons avoir besoin d'une diiode pour rediriger le courant du moteur quel que soit le transistor utilisé
    - Dans les autres parties du guide, il est détaillé comment augmenter la fréquence de PWM d'Arduino, et comment adapter le circuit pour ces changement on/off beaucoup plus rapides. Ces ajustements pourraient nous intéresser pour réduire la chauffe du moteur (et le bruit émis)
- Nous avons revisité la PWM avec un moteur DC et une alimentation extérieure sans Motor Shield.

##### 13/03/2026

- Pour notre projet et des futures Sandbox, il serait utile de pouvoir directement indiquer une vitesse plutôt que d'utiliser un potentiomètre : nous faisons donc des recherches pour contrôler un input de l'utilisateur. Pistes possibles : 
    - LCD display et des bouton pression pour contrôler la vitesse et le sens de rotation du moteur. 
        - Mais il resterait la question de la synchronisation entre moteurs, pour qu'ils soient lancés en même temps.
    - LCD display et Keypad ?

##### 20/03/2026

- Nous avons revisité les montages des Sandbox précédent. Nous avons décidé d'utiliser ARDUINO pour contrôler les variations de vitesse du moteur : nous n'utiliserons donc pas les servoamplificateurs des montages précédents. 
    - On va séparer l’alimentation de l’Arduino de celle des moteurs pour éviter que l’Arduino reçoive trop de tension ou de courant, et aussi pour réduire le nombre d’outils nécessaires. On peut abaisser la tension avec un Buck Converter, mais on ne peut pas réduire le courant fourni par l’alimentation du moteur. L’Arduino supporte seulement quelques centaines de mA, tandis que le moteur peut consommer jusqu’à 6A, ce qui ne sera pas fourni par l’Arduino, mais directement par l’alimentation 24V. On va utiliser un adaptateur simple branché sur le secteur, qui fournira 5V et le courant nécessaire pour alimenter l’Arduino.
- Pour le contrôle final du montage, nous avons pensé au système suivant : 
    - chaque moteur est associé à un keypad/potentiomètre (qui détermine la vitesse de déplacement) et à un interrupteur à 3 positions (marche avant - arrêt - marche arrière). Une fois chacun des deux moteurs "configurés", on utilise un interrupteur à 2 positions pour lancer ou arrêter la manipe. Il devrait aussi être possible de changer la "configuration" de chaque moteur en cours de manipe.
- Prochaine séance : construire un montage Arduino avec le MOSFET et lire la tension aux bornes. (tester de la PWM avec Keypad et potentiomètre)

##### <span style="color: rgb(0, 0, 0);">27/03/2026</span>

- Le plan pour le découpage des blocs de plexiglas a été réalisé. Nous avons utilisé le logiciel Inkscape. Les dimensions des blocs ainsi que l’emplacement des trous pour le passage des vis sont indiqués sur ce même plan afin de l’envoyer au découpage.
    
    <span style="color: rgb(0, 0, 0);">  
      
      
      
    (PHOTO DE PLAN ICI)  
      
      
      
    (LÉGENDE ET EXPLICATIONS POUR LE PLAN)</span>
- <span style="color: rgb(0, 0, 0);">Nous avons réalisé un montage comprenant un transistor (mais pas encore le transistor MOSFET final) pour tester de la PWM dans un circuit avec ce genre d'élément, même avec seulement un seul circuit à une seul tension.![Circuit LED transistor.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/HvVcircuit-led-transistor.png)</span>```c
    int pwmPin = 3;
    int rapportCyclique = 255;
    
    void setup() {
    }
    
    void loop() {
    
      while (rapportCyclique > 5) {
        analogWrite(pwmPin, rapportCyclique);
        delay(1000);
        rapportCyclique = rapportCyclique - 10;
      }
    }
    ```
    
    <span style="color: rgb(0, 0, 0);">Le code commence avec une intensité de la LED maximale, et diminue le rapport cyclique (le temps relatif où la broche passe à une tension non nulle) progressivement : l'intensité de la LED diminue progressivement aussi.</span>

##### <span style="color: rgb(0, 0, 0);">03/04/2026</span>

- <span style="color: rgb(0, 0, 0);">Nous avons tous les composants nécessaires ; nous avons construit un circuit qui incorpore ces composants, mais sans différence de tension, et où une LED remplace le moteur DC.![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/cCyimage.png)</span>```c
    #include <Keypad.h>
    
    const int ROW_NUM = 4; //four rows
    const int COLUMN_NUM = 4; //three columns
    
    char keys[ROW_NUM][COLUMN_NUM] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    
    byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
    byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
    int pwmPin = 11;
    
    Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
    String input_vitesse; // la vitesse est représentée par le rapport cyclique (entre 0 et 255)
    int vitesse = -1;
    bool clavier = true; // régit si l'on peut ou non modifier le rapport cyclique
    
    void setup(){
      Serial.begin(9600);
      input_vitesse.reserve(2); // au maximum, 3 caractères peuvent être stockés par cette variable
    }
    
    void loop(){
      char key = keypad.getKey();
    
      if (key){
        Serial.println(key);
    
        if (clavier){
          if(key == '*') {
            input_vitesse = ""; // reinitialise le paramètre vitesse
          } 
          else if(key == '#') {
            Serial.println(input_vitesse);
            if(input_vitesse.toInt() < 256) {
              Serial.println("Rapport cyclique compatible !");
              vitesse = input_vitesse.toInt();
              clavier = false; // on sort de la boucle -> la pwm peut être appliquée à la vitesse indiquée
            
            } 
            else {
              Serial.println("Rapport cyclique non compatible.");
              input_vitesse = "";
            }
    
            input_vitesse = ""; // input_vitesse est réinitialisé
          } 
          else {
            input_vitesse += key; // ajoute un chiffre à la vitesse
          }
        }
        if (key == 'D'){
          clavier = true; // Si la touche D est pressée, l'utilisateur peut indiquer un nouveau rapport cyclique
        }
      }
      
      analogWrite(pwmPin, vitesse);
    }
    ```
    
    L'utilisateur peut sélectionner un rapport cyclique entre 0 et 255 via le Keypad. Cette sélection est confirmée via la touche #, et réinitialisée via la touche \*. La touche D permet de sélectionner un nouveau rapport cyclique. Selon le rapport cyclique choisi, l'intensité de la LED varie.
- Il serait intéressant de pouvoir contrôler 2 vitesse avec un seul Keypad (réflexion en cours).

##### <span style="color: rgb(0, 0, 0);">10/04/2026</span>

- <span style="color: rgb(0, 0, 0);">Nous avons construit un circuit avec un code qui permet de contrôler l'intensité de 2 LEDs en même temps grâce au même Keypad. L'utilisateur appuie sur la touche C pour choisir l'intensité de la LED rouge, et sur la touche D pour choisir l'intensité de la LED verte. Le fonctionnement interne du choix de la vitesse se fait sur le même principe que lors de la séance précédente.</span>[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/4oVimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/4oVimage.png)
    
    ```c
    #include <Keypad.h>
    
    const int ROW_NUM = 4; //four rows
    const int COLUMN_NUM = 4; //three columns
    
    char keys[ROW_NUM][COLUMN_NUM] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    
    byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
    byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
    
    int ledC = 11;
    int ledD = 10;
    
    Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
    String input_vitesse; // la vitesse est représentée par le rapport cyclique (entre 0 et 255)
    int vitesseC = 0;
    int vitesseD = 0;
    bool clavier = true; // régit si l'on peut ou non modifier le rapport cyclique
    
    // faire une fonction qui permette de sélectionner un moteur (ex : A ou B) puis de choisir sa vitesse.
    
    void setup(){
      Serial.begin(9600);
      input_vitesse.reserve(2); // au maximum, 3 caractères peuvent être stockés par cette variable
    }
    
    int vitesse_setup(){ // fonction qui permet de sélectionner une vitesse / intensité
      int vitesse;
    
      while (clavier){
        char key = keypad.getKey();
    
        if (key){
          Serial.println(key);
    
          if(key == '*') {
            input_vitesse = ""; // réinitialise le paramètre vitesse
          } 
          else if(key == '#') {
            Serial.println(input_vitesse);
            if(input_vitesse.toInt() < 256) {
              Serial.println("Rapport cyclique compatible !");
              clavier = false; // on sort de la boucle -> la pwm peut être appliquée à la vitesse indiquée
              vitesse = input_vitesse.toInt();
              input_vitesse = ""; // input_vitesse est réinitialisé
              return vitesse;
            
            } 
            else {
              Serial.println("Rapport cyclique non compatible.");
              input_vitesse = "";
            }
            
          } 
          else {
            input_vitesse += key; // ajoute un chiffre à la vitesse
          }
        }
      }
    }
    
    void loop(){
      char key = keypad.getKey();
    
      if (key){
        if (key == 'C'){
          clavier = true;
          vitesseC = vitesse_setup(); 
          Serial.println(vitesseC);
    
        } else if (key == 'D'){
          clavier = true;
          vitesseD = vitesse_setup();
          Serial.println(vitesseD);
        }
        analogWrite(ledC, vitesseC); // change l'intensité de la ledC
        analogWrite(ledD, vitesseD); // change l'intensité de la ledD
      }
    }
    ```

##### 17/04/2026

- Nous avons pu utiliser la découpe laser pour ajuster les plaques de plexiglas aux dimensions choisies.
- Le circuit électronique ARDUINO / Moteur DC est finalisé ; nous avons juste besoin d'une pièce pour relier les fils au moteur.

##### 24/04/2026

- Nous avons pu construire le circuit avec un moteur, et nous avons pu entraîner des changements de vitesse via la PWM induite par le Keypad. Sous un rapport cyclique de 80, le moteur ne tournait pas (pas assez de courant ?)
- Nous allons explorer l'idée d'utiliser un écran LCD pour pouvoir suivre les changements de vitesse demandées plus facilement.

##### 22/05/2026

- Test d'un programme utilisant un écran LCD pour afficher les rapports cycliques des deux moteurs. Lorsque le rapport saisi est incompatible, un smiley ":)" s'affiche à côté. Lorsque le rapport saisi est incompatible, "Incompatible" est affiché pendant 450 ms, avant que la saisie de la vitesse correspondante ne soit réinitialisée.
- [![LCD_tout_va_bien.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/lcd-tout-va-bien.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/lcd-tout-va-bien.jpeg)[ ![LCD_incompatible.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/txDlcd-incompatible.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/txDlcd-incompatible.jpeg)[ ![LCD_saisie.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/lcd-saisie.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/lcd-saisie.jpeg)
- Deux rapports compatibles :) Après saisie = 800, par ex. Avant saisie de nouveau rapport
- Le branchage est le suivant :[![Circuit_LED_et_LCD.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E0dcircuit-led-et-lcd.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E0dcircuit-led-et-lcd.png)
- Le code précédent a été complété pour permettre l'affichage avec l'écran LCD :
    
    ```c
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <Keypad.h>
    
    // Remplacez 0x3F avec l'adresse de votre écran (code dans la fenêtre suivante)
    LiquidCrystal_I2C lcd(0x3F, 16, 2);
    
    const int ROW_NUM = 4; //four rows
    const int COLUMN_NUM = 4; //three columns
    
    char keys[ROW_NUM][COLUMN_NUM] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    
    byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connection aux pins des lignes du keypad
    byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connection aux pins des colonnes du keypad
    
    int ledC = 11;
    int ledD = 10;
    
    Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
    String input_vitesse; // la vitesse est représentée par le rapport cyclique (entre 0 et 255)
    int vitesseC = 0;
    int vitesseD = 0;
    bool clavier = true; // régit si l'on peut ou non modifier le rapport cyclique
    
    
    void setup() {
      lcd.init();          // Initialise l'écran LCD
      lcd.backlight();     // Allume la lumière
      lcd.setCursor(0, 0); // Première ligne
      lcd.print("C : ");
      lcd.print("0 ");
      lcd.setCursor(0, 1); // Deuxième ligne
      lcd.print("D : ");
      lcd.print("0");
    
      Serial.begin(9600);
      input_vitesse.reserve(2); // au maximum, 3 caractères peuvent être stockés par cette variable
    }
    
    void reset(int ligne){ // fonction qui réinitialise la saisie de la vitesse
      lcd.setCursor(4, ligne); 
      lcd.print("            ");
      lcd.setCursor(4, ligne);
    }
    
    int vitesse_setup(int ligne){ // fonction qui permet de sélectionner une vitesse / intensité
      int vitesse;
    
      while (clavier){
        char key = keypad.getKey();
    
        if (key){
          Serial.println(key);
    
          if(key == '*') {
            input_vitesse = ""; // réinitialise le paramètre vitesse
            reset(ligne);
          } 
          else if(key == '#') {
            Serial.println(input_vitesse);
            if((input_vitesse.indexOf("D") < 0) && (input_vitesse.indexOf("C") < 0) && (input_vitesse.toInt() < 256)) {
              Serial.println("Rapport cyclique compatible !");
              clavier = false; // on sort de la boucle -> la pwm peut être appliquée à la vitesse indiquée
              vitesse = input_vitesse.toInt();
              input_vitesse = ""; // input_vitesse est réinitialisé
              lcd.print(" :)"); // les raports cycliques confirmés sont affichés avec un smiley :)
              return vitesse;
            
            } 
            else {
              Serial.println("Rapport cyclique non compatible.");
              lcd.setCursor(4, ligne);
              lcd.print("Incompatible"); // affiche 'Icompatible' pendant 0,45 s
              delay(450);
              input_vitesse = "";
              reset(ligne);
            }
            
          } 
          else {
            input_vitesse += key; // ajoute un chiffre à la vitesse 
            lcd.print(key);
          }
        }
      }
    }
    
    void loop(){
      char key = keypad.getKey();
    
      if (key){
        if (key == 'C'){
          lcd.setCursor(4, 0);
          lcd.print("            ");
          lcd.setCursor(4, 0);
          clavier = true;
          vitesseC = vitesse_setup(0); 
          Serial.println(vitesseC);
    
        } else if (key == 'D'){
          lcd.setCursor(4, 1);
          lcd.print("            ");
          lcd.setCursor(4, 1);
          clavier = true;
          vitesseD = vitesse_setup(1);
          Serial.println(vitesseD);
        }
        analogWrite(ledC, vitesseC); // change l'intensité de la ledC
        analogWrite(ledD, vitesseD); // change l'intensité de la ledD
      }
    }
    ```
- Code pour obtenir l'adresse de l'écran LCD I2C d'après [cet article d'Arun Rawat](https://controllerstech.com/i2c-lcd1602-arduino-tutorial/).
    
    ```c
    #include <Wire.h>
    
    void setup() {
      Wire.begin();
      Serial.begin(9600);
      Serial.println("Scanning for I2C devices...");
      for (byte i = 1; i < 127; i++) {
        Wire.beginTransmission(i);
        if (Wire.endTransmission() == 0) {
          Serial.print("I2C device found at address 0x");
          Serial.println(i, HEX);
        }
      }
    }
    
    void loop() {}
    ```
- Nous avons obtenu la pièce permettant de relier les fils au moteur.
- La boîte est toujours en cours de construction.

</details>

# Tournicayou

### *<span dir="auto"><span dir="auto"><span dir="auto"><span dir="auto"><span dir="auto"><span dir="auto"><span dir="auto"><span dir="auto"><span dir="auto"><span dir="auto"><span dir="auto"><span dir="auto">Construction d'un appareil photogrammétrique dans le cadre de l'UE Atelier Fablab LU3SV062</span></span></span></span></span></span></span></span></span></span></span></span>*

#### <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Informations</span></span></span></span></span></span></span></span></span></span></span>

- **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Étudiants :</span></span></span></span></span></span></span></span></span></span></span></span>**
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Zoé Albenga</span></span></span></span></span></span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Lucas Gorini</span></span></span></span></span></span></span></span></span></span></span></span>
- **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Encadrants : </span></span></span></span></span></span></span></span></span></span>**
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Responsables de l'UE : Fabrice Minoletti et Pierre Théry</span></span></span></span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Responsable du projet : Pierre Théry</span></span></span></span></span></span></span></span></span></span>
- **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Parcours :</span></span></span></span></span></span></span></span></span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> SV/ST : UE\_FabLab : LU3ST062 </span></span></span></span></span></span></span></span></span></span>
- **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Date</span></span></span></span></span></span></span></span></span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> : S6</span></span></span></span></span></span></span></span></span></span>

<div aria-label="Options de section de page" class="pointer-container" id="bkmrk-%C2%A0" refs="pointer@pointer" tabindex="-1"><div class="pointer flex-container-row items-center justify-space-between p-s anim "><div class="flex-container-row items-center gap-s" refs="pointer@mode-section"><button class="text-button icon px-xs" title="Mode Lien Permanent, Cliquer pour afficher la balise d'inclusion"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button><div class="input-group"> <button class="button outline icon" title="Copier le lien" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div></div></div></div>
#### <span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Objectifs</span></span></span></span></span></span></span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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.</span></span></span></span></span></span></span></span></span></span>

#### <span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Construction</span></span></span></span></span></span></span></span></span></span></span></span>

<p class="callout success"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Étape 1 : *S'approprier Arduino ainsi que le projet avec la modélisation de notre appareil à photogrammétrie.*</span></span></span></span></span></span></span></span></span></span>**</span></span></span></span></span></span></span></span></span></span></p>

<p class="callout success"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**Étape 2 :** *Réflexion/Réalisation des premières* </span></span></span></span></span></span></span></span></span></span>*<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">pièces par </span></span></span></span></span></span></span></span></span></span><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">modélisation 3D ainsi qu'un travail de recherche sur le code du moteur pas à pas.</span></span></span></span></span></span></span></span></span></span>*</p>

<p class="callout success"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**Étape 3 :** *Modification et ajustement des pièces du projet et réalisation du code pour la (les) caméra(s).*</span></span></span></span></span></span></span></span></span></span></p>

<p class="callout info"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**Étape 4 :** *Assemblage de toutes les pièces modélisées ainsi que des deux codes, afin de réaliser les premiers tests.*</span></span></span></span></span></span></span></span></span></span></p>

<p class="callout warning"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**Étape 5 :** *Réaliser les premiers tests avec un objet à prendre en photo avec un logiciel de photogrammétrie permettant la réalisation de l'objet en 3D.*</span></span></span></span></span></span></span></span></span></span></p>

<p class="callout warning"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**Étape 6 :** *Paramétrer une application permettant la réalisation des photos.*</span></span></span></span></span></span></span></span></span></span></p>

##### <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**Étape 7 :** *C'est déjà un beau projet*</span></span></span></span></span></span></span></span></span></span>

#### <span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Matériel</span></span></span></span></span></span></span></span></span></span></span></span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Carte Arduino Uno</span></span></span></span></span></span></span></span>
- Module caméra ArduCam mini 5MP Plus OV5642
- Moteur NEMA
- Motor shield (--&gt; branchement pour le moteur et la caméra)
- Câblages
- Logiciel de modélisation 3D

#### <span style="text-decoration: underline;">Résultats </span>

Lors de ce dernier semestre de licence nous avons eu la chance travailler sur un projet sur la photogrammétrie, le but étant de réaliser le maximum d'étapes prédéfinies (pas obligatoirement la fin du projet).

#### <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Journal de bord</span></span></span></span></span></span></span></span></span></span></span>

<details id="bkmrk-journal-de-bord-30%2F0"><summary>30/01/26 \_ Premières manipulations</summary>

##### <span style="text-decoration: underline; background-color: rgb(194, 224, 244);">*<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">1ère Séance : Sujet Photogrammétrie (Schéma) + Découverte de ARDUINO</span></span></span></span></span></span>*</span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Premières réflexions réalisation sur la de ce support à photogrammétrie.</span></span></span></span></span></span></span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Réalisation de plusieurs dessins "idées" (voir photos).</span></span></span></span></span></span></span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Première manipulation avec le logiciel ARDUINO, premier codage. Bien difficile....</span></span></span></span></span></span></span></span>[![1er essai ARDUINO.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/1er-essai-arduino.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/1er-essai-arduino.png)</span></span></span></span>

<div aria-label="Options de section de page" class="pointer-container" id="bkmrk-%C2%A0-3" refs="pointer@pointer" tabindex="-1"><div class="pointer flex-container-row items-center justify-space-between p-s anim is-page-editable"><div class="flex-container-row items-center gap-s" refs="pointer@mode-section"><button class="text-button icon px-xs" title="Mode lien permanent, appuyez pour afficher la balise d'inclusion"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button><div class="input-group"> <button class="button outline icon" title="Copier le lien" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>***<sub><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Codage avec Arduino, led clignotant SOS en morse.</span></span></span></span></span></span></span></span></sub>***

[![20260130_153722.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260130-153722.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260130-153722.jpg)

[![001.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/001.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/001.jpg)

</details><details id="bkmrk-06%2F02%2F26-2%C3%A8me-s%C3%A9ance"><summary>06/02/26\_Mise en place du plan d'attaque pour le projet</summary>

##### <span style="text-decoration: underline; background-color: rgb(194, 224, 244);">*<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">2ème Séance : Retour sur le support (Schémas) + Mise en place des différentes étapes</span></span></span></span></span></span></span></span></span></span>*</span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Reprise de la structure du support de photogrammétrie --&gt; bras tournant autour du support !! et plus un plateau tournant =&gt; permet de faire la photogrammétrie sur des objets plus léger</span></span></span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Mise en place des différentes étapes :</span></span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Moteur + programmation</span></span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Moule à Tarte</span></span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Arduino + caméras + affichage ordi à voir ?</span></span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Bras : support caméra + LED</span></span></span></span></span></span></span></span>
        - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Bonus : écran + angles + focus caméras</span></span></span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[![20260206_153746.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260206-153746.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260206-153746.jpg)[![20260206_153733.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260206-153733.jpg)\*](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260206-153733.jpg)</span></span></span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[![20260206_160857.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260206-160857.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260206-160857.jpg)</span></span></span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[![20260206_163746.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260206-163746.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260206-163746.jpg)</span></span></span></span></span></span></span></span>

</details><details id="bkmrk-13%2F02%2F2026-apprentis"><summary>13/02/2026\_1ères modélisation 3D et manipulation Arduino pour le moteur</summary>

##### <span style="text-decoration: underline; background-color: rgb(194, 224, 244);">*<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">3ème Séance : Gratuit Gratuit Fre</span></span></span></span></span></span></span></span></span></span><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">ecad + </span></span></span></span></span></span></span></span></span></span><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Arduino</span></span></span></span></span></span></span></span></span></span>*</span>

**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">FREECAD</span></span></span></span></span></span>**

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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.</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Vidéos youtube visionnées pour le modèle Freecad : </span></span></span></span></span></span>

- [<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">https://www.youtube.com/watch?v=3wPDnRFfgEg</span></span></span></span></span></span>](https://www.youtube.com/watch?v=3wPDnRFfgEg)
- [<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">https://www.youtube.com/@cadgab/playlistshttps://www.youtube.com/@cadgab/playlists</span></span></span></span></span></span></span></span></span></span>](https://www.youtube.com/@cadgab/playlistshttps://www.youtube.com/@cadgab/playlists)

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">LE COULOMMIERS EST TERMINÉ (18/02) - Côte Mauvaise</span></span></span></span></span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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 </span></span></span></span></span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Part design</span></span></span></span></span></span>**</span></span></span></span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Un cercle de 600 mm de diamètre et 200 mm de haut</span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Un engrenage à développer de Dp = 495 mm, M = 2,5 mm, z = 198 et 200 mm de haut</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Une fois les deux corps formés, il faut utiliser une booléenne pour former le rouage final grâce au module </span></span></span></span></span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Part</span></span></span></span></span></span>**

<p class="callout warning">**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Attention : Les valeurs inscrites sont les valeurs erronées et le fichiers FCStd a été réduit en hauteur</span></span></span></span></span></span>**</p>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Fichiers STL et FCStd de la pièce décrite : </span></span></span></span></span></span></span></span></span></span></span></span></span></span>

[Coulommiers-Support.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1842)

[Coulomier final.FCStd](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1841)

<span style="text-decoration: underline;">**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">ARDUINO</span></span></span></span></span></span>**</span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Familiarisation réalisation avec le logiciel Arduino et d'un premier montage :</span></span></span></span></span></span>

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Matériels :</span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Arduino Uno + câble USB de liaison Arduino/Ordinateur</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Câbles de connexion</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Moteur pas à pas 28 BYJ-48</span></span></span></span></span></span>

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Schéma de connexion :</span></span></span></span></span></span></span>

[![Moteur pas à pas de montage 28BYJ-48.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/montage-step-motor-28byj-48.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/montage-step-motor-28byj-48.png)

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Code : </span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ce code permet au moteur de réaliser une rotation dans le sens des aiguilles d'une montre, attendre 1 seconde(s), puis de faire une rotation dans le sens contraire des aiguilles d'une montre, puis de nouveau attendre 1 s.</span></span></span></span></span></span>

```
#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); 
}
```

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> Une librairie Stepper.h existe.</span></span></span></span></span></span>

- - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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) </span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Rapidement essayez de changer de vitesse = ÉCHEC --&gt; comprendre pourquoi à la prochaine séance.</span></span></span></span></span></span>

<p class="callout success"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">--&gt; Prochaine étape : Réaliser le montage avec ajout d'un potentiomètre permettant de contrôler la vitesse de rotation ainsi que le sens (--&gt; potentiomètre vers la droite= sens des aiguilles d'une montre ; potentiomètre à gauche = sens inverse )</span></span></span></span></span></span></p>

</details><details id="bkmrk-20%2F02%2F2026-%C2%A0"><summary>20/02/2026\_ Réalisation du Coulommiers et 1ères ébauches code moteur</summary>

##### <span style="text-decoration: underline; background-color: rgb(194, 224, 244);">*<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">4ème Séance : Gratuit </span></span></span></span></span></span></span></span></span></span><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">ecad + </span></span></span></span></span></span></span></span></span></span><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Arduino</span></span></span></span></span></span></span></span></span></span>*</span>

<span style="text-decoration: underline;">**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Partie Freecad : </span></span></span></span></span></span>**</span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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 :</span></span></span></span></span></span>

**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Dp/M = z</span></span></span></span></span></span>**

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Dp =&gt; Le diamètre primitif ; M =&gt; Module du rouage ; z =&gt; Nombre de dents</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Pour que deux engrenages puissent fonctionner ensemble </span></span></span></span></span></span>**<span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">il faut respecter 3 conditions :</span></span></span></span></span></span></span>**

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ils doivent avoir un module égal</span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ils doivent avoir un angle de pression égal (par convention 20°)</span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Leur diamètre primitif doit être tangent</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Pour le dernier point, la distance entre le centre des rouages </span></span></span></span></span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">​​Dr = </span></span></span></span></span></span>** **<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">((z </span></span></span></span></span></span><sub><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">1</span></span></span></span></span></span></sub><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> +z </span></span></span></span></span></span><sub><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">2</span></span></span></span></span></span></sub><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> )\*M)/2</span></span></span></span></span></span>**

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Pour le coulommiers :</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">La modélisation comporte deux corps.</span></span></span></span></span></span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Un cercle de 300 mm de diamètre et 100 mm de haut</span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Un engrenage à développé de Dp = 250 mm, M = 2,5 mm, z = 100 et 100 mm de haut</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Pour former le rouage interne, il faut faire la différence des deux corps grâce à la booléenne dans le module </span></span></span></span></span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Part</span></span></span></span></span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> . (cf </span></span></span></span></span></span>[<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">https://www.youtube.com/watch?v=3wPDnRFfgEg)</span></span></span></span></span></span>](https://www.youtube.com/watch?v=3wPDnRFfgEg))

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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.</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">La modélisation comporte deux corps.</span></span></span></span></span></span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Un cylindre de 5mm de diamètre coupé d'une corde de 3mm et faisant 19mm de haut</span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Un engrenage externe de Dp = 45 mm, M = 2,5 mm, z = 18 et 19 mm de haut</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Impression 3D des pièces pour essais ultérieurs.</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Fichiers STL et FCStd de la pièce décrite : </span></span></span></span></span></span></span></span></span></span></span></span></span></span>

<span style="text-decoration: underline;">**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">ARDUINO</span></span></span></span></span></span>**</span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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...)</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Réalisation d'un autre montage avec le moteur Servo :</span></span></span></span></span></span>

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Matériels :</span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Arduino Uno + câble USB de liaison Arduino/Ordinateur</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Câbles de connexion</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Microservo à moteur pas à pas SG90</span></span></span></span></span></span>

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Schéma de connexion :</span></span></span></span></span></span></span>

[![montage-servo.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/montage-servo.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/montage-servo.png)

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Code : </span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ce code permet au moteur de réaliser une rotation dans le sens des aiguilles d'une montre, attendre 1 seconde(s), puis de faire une rotation dans le sens contraire des aiguilles d'une montre, puis de nouveau attendre 1 s.</span></span></span></span></span></span>

<p class="callout info"><span style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ligatures: none; mso-fareast-language: FR;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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é.</span></span></span></p>

<p class="callout success"><span style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ligatures: none; mso-fareast-language: FR;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">--&gt; Prochaine étape : </span></span></span><span style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-ligatures: none; mso-fareast-language: FR;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Modification de notre code pour réaliser un mouvement de 20° en 20° avec 1 s de délai entre chaque déplacement.</span></span></span></p>

</details><details id="bkmrk-27%2F02%2F2026-objectif-"><summary>27/02/2026\_Support moteur et 1er test moteur NEMA (pas à pas)</summary>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span style="background-color: rgb(191, 237, 210);">**Objectif**</span> de la séance : </span></span></span></span></span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Finaliser le code arduino pour le moteur, tester les pièces 3D, conception du bras</span></span></span></span></span></span>**

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Nous avons commencé la réalisation des plans quant à la partie qui tourne autour du coulommiers. Trois soirées :</span></span></span></span></span></span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Le support même du moteur, permettant sa fixation par vis.</span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">La partie centrale, dotée d'une roue permettant au socle tournant d'avancer sur les coulommiers.</span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Le support bras, avec des fentes permettant l'insertion du bras photo et des emplacement pour piles et carte arduino.</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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.</span></span></span></span></span></span>[![Plan Fablab socle BM 3.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/fablab-plan-socle-bm-3.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/fablab-plan-socle-bm-3.jpeg)[![Plan Fablab socle BM 2.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/fablab-plan-socle-bm-2.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/fablab-plan-socle-bm-2.jpeg)[![Plan Fablab socle BM 1.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/fablab-plan-socle-bm-1.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/fablab-plan-socle-bm-1.jpeg)

<span style="text-decoration: underline;">**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">ARDUINO</span></span></span></span></span></span>**</span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Une partie des </span></span></span></span><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">coulommiers dentés et le rouage du moteur sont désormais imprimés ! Aujourd'hui sur un pu tester le gros moteur de 12 V, qui sera notre moteur final, avec donc le rouage modélisé par Lucas. </span></span></span></span></span></span></span></span>

<p class="callout danger"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">J'ai cramé la batterie brique de 12 V... Surement un problème dans mon montage.</span></span></span></span></span></span></span></span></p>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Réalisation d'un autre montage avec le moteur NEMA 17, moteur pas à pas de 12 V :</span></span></span></span></span></span>

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Matériels :</span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Arduino Uno + câble USB de liaison Arduino/Ordinateur</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Câbles de connexion</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Moteur Shield</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Moteur NEMA 17 pas à pas</span></span></span></span>

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Schéma de connexion :</span></span></span></span></span></span></span>

[![Capture d'écran 2026-03-20 102959.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/bn5capture-decran-2026-03-20-102959.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/bn5capture-decran-2026-03-20-102959.jpg)

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Code : </span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ce code permet au moteur de réaliser une rotation dans le sens des aiguilles d'une montre, attendre 1 seconde(s), puis de faire une rotation dans le sens contraire des aiguilles d'une montre, puis de nouveau attendre 1 s.</span></span></span></span></span></span>

```
#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

}
```

- - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ce code fonctionne plutôt très bien, il réalise donc une rotation dans le sens des aiguilles d'une montre ; fait 20° puis fait une pause pour la photo.</span></span></span></span>

```
#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
}
```

<p class="callout info"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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° degré mais parfois moins et de manière saccadé. Il réalise donc 11 pas pour faire les 20° demandées ; pause de 2 secondes ; puis reprends pour faire un tour complet de 20 par 20 ; pause de 10 s.</span></span></span></span></p>

<p class="callout info"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Ce code rend le moteur extrêmement bruyant en plus du mouvement saccadé.</span></span></span></span></p>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[![20260227_155241.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260227-155241.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260227-155241.jpg)[![20260227_134741.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260227-134741.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260227-134741.jpg)</span></span></span></span>

</details><details id="bkmrk-06%2F03%2F2026-conceptio"><summary>06/03/2026\_Conception du socle moteur</summary>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">**<span dir="auto">Partie conception 3D : <span style="color: rgb(224, 62, 45);">Le socle moteur</span></span>**</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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 <span style="color: rgb(224, 62, 45);">?)(Au final Pierre a arrangé une vis pour la faire maintenir la roue).</span> Le rectangle possède un creux en forme de puzzle servant à l'insertion du socle du bras, devant encore être modélisé. </span></span></span></span></span></span>

<span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Fichiers STL et FCStd de la pièce décrite : </span></span></span></span></span></span></span></span>

<span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[Assemblage socle moteur + Tige-Assembly.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1844)</span></span></span></span></span></span></span></span>

<span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[Assemblage socle moteur + Tige.FCStd](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1843)</span></span></span></span></span></span></span></span>

</details><details id="bkmrk-13%2F03%2F2026-j%27ai-lim%C3%A9"><summary>13/03/2026\_Modélisation de pièce soutien bras, fluidification du code moteur et recherches caméras</summary>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Lucas : J'ai limé pendant deux heures le bloc, puis début de la conception des plan pour la pièce arrière.</span></span></span></span></span></span>

**<span dir="auto">Partie conception 3D : <span style="color: rgb(224, 62, 45);">Création de la pièce arrière  
  
</span></span>**<span dir="auto" style="color: rgb(0, 0, 0);">La pièce arrière a pour but de maintenir la machine autour du coulommiers et de servir de contre-poids au moteur. Celle-ci est composée de deux parties principales, formant une pièce unique : </span>

1. <span dir="auto" style="color: rgb(0, 0, 0);">La partie la plus importante est le gros boîtier principal. Celui-ci fait <span style="background-color: rgb(241, 196, 15);">...</span> de large,<span style="background-color: rgb(241, 196, 15);"> ... </span>de haut et<span style="background-color: rgb(241, 196, 15);"> ...</span> de long. À l'intérieur une grande cavité est laissée pour permettre de tenir les différents composants électriques. L'avant de la pièce possède la pièce de puzzle complémentaire au support moteur, le rond de à un diamètre de 15,5mm. À partir du haut, au bout de<span style="background-color: rgb(241, 196, 15);"> ...</span>mm, la face avant recule de 4mm pour que permettre à un roulement à billes de rouler sur le bord du coulommiers. Sur la partie basse, deux roues sont placés sur un arc de cercle fictif de 735mm de diamètre. Cet arc a le même foyer que le coulommiers, les roues ainsi inclinées d'un angle de 6,60° à partir de l'axe central de la pièce </span><span dir="auto" style="color: rgb(0, 0, 0);">servent à la pièce à tourner plus facilement. </span>
2. <span dir="auto" style="color: rgb(0, 0, 0);">La deuxième partie est sur la partie haute de la pièce. Il s'agit d'un socle ayant à l'avant de trous de 8,25mm de rayon permettant l'encoche du bras photographique.</span>

<span dir="auto" style="color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Fichier STL et FCStd de la pièce décrite : </span></span></span></span></span></span></span>

<span dir="auto" style="color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[Pièce arrière.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1840)</span></span></span></span></span></span></span>

<span dir="auto" style="color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[Pièce arrière.FCStd](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1839)</span></span></span></span></span></span></span>

<span style="text-decoration: underline;">**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">ARDUINO</span></span></span></span></span></span>**</span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Aujourd'hui j'ai revu le code pour notre moteur afin que celui-ci réalise 20° sur les coulommiers et non par rapport à l'axe du moteur.</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Réalisation d'un autre montage avec le moteur NEMA 17, moteur pas à pas de 12 V :</span></span></span></span></span></span>

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Matériels :</span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Arduino Uno + câble USB de liaison Arduino/Ordinateur</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Câbles de connexion</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Moteur Shield</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Moteur NEMA 17 pas à pas</span></span></span></span>

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Schéma de connexion :</span></span></span></span></span></span></span>

[![Capture d'écran 2026-03-20 102959.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/bn5capture-decran-2026-03-20-102959.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/bn5capture-decran-2026-03-20-102959.jpg)

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Code : </span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Petite partie calcule pour réaliser le code et essayer de trouver une façon pour que le moteur soit un mouvement plus fluide et plus saccadé et bruyant.</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">coulommiers = 100 bosses ; rouage = 18 bosses ; moteur pas à pas = 200 pas / tour</span></span></span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">100/18=5.55 tours </span></span>*<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">--&gt; le bébé rouage effectuera donc 5.5 tour pour réaliser un tour complet du tour interne du coulommiers.</span></span>*</span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">200 x 5.55 = 1 111 pas </span></span>*<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">--&gt; le moteur lui devra donc réaliser 1111 pas pour faire 360° donc un tour complet du coulommiers.</span></span>*</span></span></span></span>

<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">1111 x 20/360 = 61.7 pas </span></span>*<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">--&gt; le moteur devra réalisé environ 62 pas pour réaliser 20° sur le coulommiers. </span></span>*</span></span></span></span>

<p class="callout warning"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">*<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">62 pas x 18 positions = 1 116 pas # 1 111 pas ! =&gt; possibilité d'alternance entre 62 et 61 pas pour obtenir pile 360° </span></span></span></span></span></span>*</span></span></span></span></p>

- - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Pour éviter que le moteur soit saccadé on peut voir pour augmenter la vitesse de déplacement/ ou la diminuer.</span></span></span></span></span></span>

```
#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);
}
```

- - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">1er code testé : FONCTIONNEL !</span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Testez 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.</span></span>

```
#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
  }
}
```

<p class="callout info"><span dir="auto" style="vertical-align: inherit; color: rgb(35, 111, 161);"><span dir="auto" style="vertical-align: inherit;">Toujours un problème de fluidité, voir pour améliorer le 1er code ou le 2ème. </span></span></p>

<p class="callout info"><span dir="auto" style="vertical-align: inherit; color: rgb(35, 111, 161);"><span dir="auto" style="vertical-align: inherit;">Test de différentes vitesses : 5 et 30 plus ou moins OK, toujours saccadé et bruyant --&gt; voir microstep ?</span></span></p>

*<span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Recherche pour les caméras : </span></span><span dir="auto">**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Arducam Shield Mini 5MP Plus</span></span>**<span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> :</span></span></span></span>*

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Montage possible :</span></span>

<span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[![ArduinoConnection--300x300  Cablage caméra.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/arduinoconnection-300x300-cablage-camera.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/arduinoconnection-300x300-cablage-camera.jpg)</span></span></span></span></span></span></span>

- - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Carte SD nécessaire ? </span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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é.</span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">À la place, les données de l'image au format JPEG seront 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).</span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">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. --&gt; utilisation d'une autre carte ?</span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Les images reçues sur l'ordinateur peuvent ensuite être reconstruites et visualisées à l'aide d'un programme externe, par exemple en Python.</span></span>

<p class="callout success"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span style="color: rgb(22, 145, 121);">**Prochaine séance --&gt;**</span> Test de 25 - 5° pour améliorer la fluidité + CAMÉRAS ! redemander les bibliothèques.</span></span></p>

</details><details id="bkmrk-20%2F03%2F2026-on-gal%C3%A8re"><summary>20/03/2026\_Retour des recherches sur les caméras et conception du bras</summary>

**<span style="background-color: rgb(248, 202, 198);">On galère avec les caméras....</span>**

**<span dir="auto">Partie conception 3D : <span style="color: rgb(224, 62, 45);">Création du bras photographique</span></span>**

Ce bras s'encoche dans la partie haute de la pièce arrière. Il est conçu en une pièce unique (<span style="color: rgb(224, 62, 45);">dû à la limitation de taille d'impression de l'imprimante 3D, la pièce a été scindé en deux pour les tests<span style="color: rgb(0, 0, 0);">) en trois parties. </span></span>

1. <span style="color: rgb(224, 62, 45);"><span style="color: rgb(0, 0, 0);">La partie basale est composée de deux tubes permettant l'insertion à la pièce arrière. Les encoches étant de 8,25mm de rayon, le tubes ont un rayon de 7,25mm.</span></span>
2. <span style="color: rgb(224, 62, 45);"><span style="color: rgb(0, 0, 0);">Le bras incurvé, arc de cercle de 692 mm de diamètre. Il forme un angle de <span style="color: rgb(241, 196, 15);">72,70°</span>. Afin d'alléger la structure, mais aussi de limiter l'utilisation de plastique, des triangles équilatéraux d'une arête de 34,1738mm sont disposés de façon alterne. Cinq triangles avec la pointe distal au support central, quatre avec une pointe qui lui</span></span><span style="color: rgb(224, 62, 45);"><span style="color: rgb(0, 0, 0);"> est proximal.</span></span>
3. <span style="color: #000000;">Deux nouvelles encoches à 19,96° et 59,39° de 7mm de diamètre permettront l'insertion des <span style="caret-color: rgb(0, 0, 0);">caméras.</span></span>

<p class="callout warning">**<span style="color: rgb(230, 126, 35);"><span style="caret-color: rgb(0, 0, 0);">Le bras a due être sectionné pour l'impression !</span></span>**</p>

<span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Fichiers STL et FCStd de la pièce décrite : </span></span></span></span></span></span></span></span>

<span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[Bras.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1838)</span></span></span></span></span></span></span></span>

<span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[Bras.FCStd](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1837)</span></span></span></span></span></span></span></span>

</details><details id="bkmrk-le-bras-du-tournicay"><summary>27/03/2026\_Comprendre la caméra...</summary>

Le bras du Tournicayou est imprimé !

<p class="callout warning align-center">**!!!! Comprendre les caméras !!!!**</p>

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Matériels :</span></span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Arduino Uno + câble USB de liaison Arduino/Ordinateur</span></span></span></span></span></span>
    - <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Câbles de connexion</span></span></span></span></span></span>
    - Module caméra Mini 5MP Plus OV5642

- <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Schéma de connexion :</span></span></span></span></span></span></span>

<span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[![ArduinoConnection--300x300  Cablage caméra.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/arduinoconnection-300x300-cablage-camera.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/arduinoconnection-300x300-cablage-camera.jpg)</span></span></span></span></span></span></span>

- <span dir="auto"><span style="text-decoration: underline;">Code </span>: </span>
    - <span dir="auto">Essais avec énormément de codes différents, beaucoup de difficultés pour ce qui est de comprendre l'utilisation des différentes fonctions lié à la caméra.</span>

<details><summary>Super code pour notre caméra de l'enfer</summary>

```
#include <Wire.h>
#include <SPI.h>
#include <ArduCAM.h>
#include "memorysaver.h"

#if !(defined OV5642_MINI_5MP_PLUS)
  #error Please select the hardware platform and camera module in memorysaver.h
#endif

#define BMPIMAGEOFFSET 66

const int CS = 7;
bool is_header = false;
int mode = 0;
uint8_t start_capture = 0;

ArduCAM myCAM(OV5642, CS);

uint8_t read_fifo_burst(ArduCAM myCAM);

void setup() {
  uint8_t vid, pid;
  uint8_t temp;

  Wire.begin();
  Serial.begin(921600);

  Serial.println(F("ACK CMD ArduCAM Start! END"));

  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);

  SPI.begin();

  // Reset caméra
  myCAM.write_reg(0x07, 0x80);
  delay(100);
  myCAM.write_reg(0x07, 0x00);
  delay(100);

  // Test SPI
  while (1) {
    myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
    temp = myCAM.read_reg(ARDUCHIP_TEST1);
    if (temp != 0x55) {
      Serial.println(F("ACK CMD SPI interface Error! END"));
      delay(1000);
    } else {
      Serial.println(F("ACK CMD SPI interface OK. END"));
      break;
    }
  }

  // Vérif caméra
  while (1) {
    myCAM.wrSensorReg16_8(0xff, 0x01);
    myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
    myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);

    if ((vid != 0x56) || (pid != 0x42)) {
      Serial.println(F("ACK CMD Can't find OV5642 module! END"));
      delay(1000);
    } else {
      Serial.println(F("ACK CMD OV5642 detected. END"));
      break;
    }
  }

  myCAM.set_format(JPEG);
  myCAM.InitCAM();
  myCAM.OV5642_set_JPEG_size(OV5642_320x240);

  delay(1000);

  myCAM.clear_fifo_flag();
}

void loop() {
  uint8_t temp;

  if (Serial.available()) {
    temp = Serial.read();

    switch (temp) {

      case 0x10:
        mode = 1;
        start_capture = 1;
        Serial.println(F("ACK CMD CAM start single shoot. END"));
        break;

      case 0x11:
        myCAM.set_format(JPEG);
        myCAM.InitCAM();
        break;

      default:
        break;
    }
  }

  if (mode == 1) {
    if (start_capture == 1) {
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      myCAM.start_capture();
      start_capture = 0;
    }

    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
      Serial.println(F("ACK CMD CAM Capture Done. END"));
      read_fifo_burst(myCAM);
      myCAM.clear_fifo_flag();
    }
  }
}

// --- Version corrigée pour Host App ---
uint8_t read_fifo_burst(ArduCAM myCAM) {
  uint8_t temp = 0, temp_last = 0;
  uint32_t length = myCAM.read_fifo_length();

  if (length == 0 || length >= MAX_FIFO_SIZE) {
    Serial.println(F("ACK CMD Size error. END"));
    return 0;
  }

  myCAM.CS_LOW();
  myCAM.set_fifo_burst();

  temp = SPI.transfer(0x00);
  length--;

  while (length--) {
    temp_last = temp;
    temp = SPI.transfer(0x00);

    if (is_header) {
      Serial.write(temp);   // flux JPEG pur
    } else if ((temp == 0xD8) && (temp_last == 0xFF)) {
      is_header = true;
      Serial.write(temp_last);
      Serial.write(temp);  // début JPEG
    }

    if ((temp == 0xD9) && (temp_last == 0xFF)) break;  // fin JPEG
  }

  myCAM.CS_HIGH();
  is_header = false;

  return 1;
}
```

</details>- - <span dir="auto">Voici ci-dessus le dernier code utilisé pour obtenir des photos et qui est lié avec l'ArduCam Host App.</span>
    - <span dir="auto">Dernier test plutôt positifs avec l'ArduCam Host App mais toujours pas un succès...</span>

<p class="callout info">**<span dir="auto" style="color: rgb(35, 111, 161);">D'après le logiciel on arrive à prendre des photos (ArduCam Host App --&gt; photo ci-dessous)</span>**</p>

<p class="callout warning"><span dir="auto"><span style="color: rgb(230, 126, 35);">**Où sont les photos !?**</span> C'est le plus gros des problèmes, réussir à retrouver les photos et savoir si celle-ci se sont réellement enregistrées ou non, ou si plus généralement on arrive vraiment à prendre des photos.</span></p>

<p class="callout success"><span dir="auto">**<span style="color: rgb(22, 145, 121);">Pour la prochaine séance --&gt;</span>** résoudre le problème : où sont les photos ?!?</span></p>

<span dir="auto">[![Capture d'écran 2026-03-27 163719.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/capture-decran-2026-03-27-163719.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/capture-decran-2026-03-27-163719.png)</span>

</details><details id="bkmrk-03%2F04%2F2026-objectif-"><summary>03/04/2026\_Où sont les photos et révision du Coulommiers</summary>

<p class="callout success"><span style="color: rgb(22, 145, 121);">**<span style="text-decoration: underline;">Objectif </span>: se débarrasser du problème CAMÉRA ! Où sont les photos sur l'ordinateur ? Les photos sont-elles prises ?**</span></p>

[https://www.arducam.com/camera-modules/5mp-ov5642/](https://www.arducam.com/camera-modules/5mp-ov5642/)

Fab a du fil à retordre

Le code photo fonctionne, il est possible de prendre des photos !!!!!! On sait où elles sont !

<p class="callout danger"><span style="text-decoration: underline;"><span style="color: rgb(224, 62, 45); text-decoration: underline;">**Nos différents problèmes avec les photos maintenant qu'on sait où elles sont :**</span></span></p>

- Au bout d'un certain nombre de photos, il n'est plus possible d'en prendre (D'après Claude c'est un problème de FIFO où Host App/Arduino essaye de lire la photo avant qu'elle ne soit prise).
- Il faut trouver un moyen d'automatiser les photos pour un tour complet de coulommiers.
- Reste à savoir si fonctionne avec deux caméras.

**<span dir="auto">Partie conception 3D : <span style="color: rgb(224, 62, 45);">Révision du coulommiers</span></span>**

<span dir="auto" style="color: rgb(0, 0, 0);">La première version du coulommiers avait un léger problème de dimension. Notamment avec ses 20 centimètres de haut. En réalité, le coulommiers ne nécessite que 4 centimètres de haut. Autre problème auquel faire face... 60 centimètre de diamètre sort du plateau d'impression de l'imprimante 3D. </span>

<span dir="auto" style="color: rgb(0, 0, 0);">Ainsi le nouveau coulommiers ne fait "que" 4 centimètre de haut, est monté sur un un plateau support de 5 millimètres de diamètre permettant le roulement de la pièce arrière. La structure montante du coulommiers est creuse, permettant d'user de moins de plastique. Le coulommiers a été modélisé en quart, avec des pièces mâles femelle basales permettant un montage en puzzle. Ces structures sont ainsi disposées pour limiter un maximum au support moteur de rouler sur des failles. Cependant la partie mâle dépasse toujours du support d'impression. </span>

<span dir="auto" style="color: rgb(0, 0, 0);">La pièce est encore à revoir. Durant cette révision, le plateau support sera retravaillé afin de limiter au mieux l'usage de plastique.</span>

<span dir="auto" style="color: rgb(0, 0, 0);"><span style="color: #000000;"><span style="caret-color: rgb(0, 0, 0);"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Fichiers STL et FCStd de la pièce décrite : </span></span></span></span></span></span></span></span></span>

<span dir="auto" style="color: rgb(0, 0, 0);">[Coulommiers rerererererererevisité-Cut.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1836)</span>

<span dir="auto" style="color: rgb(0, 0, 0);">[Coulommiers rerererererererevisité.FCStd](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1835)</span>

<span dir="auto" style="color: rgb(0, 0, 0);">[![04 blabla.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/04-blabla.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/04-blabla.png)</span>

</details><details id="bkmrk-10%2F04%2F2026-photos-mu"><summary>10/04/2026\_ Caméra OK = Réflexion sur la suite</summary>

<p class="callout success align-center"><span style="color: rgb(22, 145, 121);">**<span style="text-decoration: underline;">*!!!! Rappel important !!!!* </span>: Nous avons désormais des photos et on sait où on peut les retrouver !**</span></p>

<p class="callout info">**<span style="color: rgb(35, 111, 161);">Les différents problèmes de la dernière fois qu'on a réussi à régler :</span>**</p>

- En reprenant le code de la dernière fois pour faire les photos, ce n'était pas possible de faire des photos multiples. On a donc chercher un autre code, que l'on a par la suite légèrement modifier afin de prendre plusieurs photos a la suite. Grâce à ce code on a donc pu prendre plusieurs photos d'affiler sans problème de FIFO mais également d'un sens à automatiser pour réaliser un tour complet du Coulommiers. On peut régler le nombre de photos que l'on veut réaliser et le temps d'attente donc entre chacun d'entre elles.

<details><summary>Code super méga ultra trop long pour caméra</summary>

```
// ArduCAM Mini demo (C)2017 Lee
// Web: http://www.ArduCAM.com
// This program is a demo of how to use most of the functions
// of the library with ArduCAM Mini camera, and can run on any Arduino platform.
// This demo was made for ArduCAM_Mini_5MP_Plus.
// It needs to be used in combination with PC software.
// It can test OV5642 functions.
//

// This program requires the ArduCAM V4.0.0 (or later) library and ArduCAM_Mini_5MP_Plus
// and use Arduino IDE 1.6.8 compiler or above
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
//This demo can only work on OV5642_MINI_5MP_Plus  platform.
//#if !(defined OV5642_MINI_5MP_PLUS)
//  #error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
//#endif
#define BMPIMAGEOFFSET 66
const char bmp_header[BMPIMAGEOFFSET] PROGMEM =
{
  0x42, 0x4D, 0x36, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x28, 0x00,
  0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
  0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
  0x00, 0x00
};
// set pin 7 as the slave select for the digital pot:
const int CS = 7;
bool is_header = false;
int mode = 0;
uint8_t start_capture = 0;
 ArduCAM myCAM( OV5642, CS );  
 // === MULTI PHOTO ===
unsigned long lastCapture = 0;
const int interval = 3000; // délai entre photos (ms)
const int nbPhotos = 20;    // nombre de photos
int compteur = 0;
bool multiShot = false;
uint8_t read_fifo_burst(ArduCAM myCAM);
void setup() {
// put your setup code here, to run once:
uint8_t vid, pid;
uint8_t temp;
#if defined(__SAM3X8E__)
  Wire1.begin();
  Serial.begin(115200);
#else
  Wire.begin();
  Serial.begin(921600);
#endif
Serial.println(F("ACK CMD ArduCAM Start! END"));
// set the CS as an output:
pinMode(CS, OUTPUT);
digitalWrite(CS, HIGH);
// initialize SPI:
SPI.begin();
 //Reset the CPLD
myCAM.write_reg(0x07, 0x80);
delay(100);
myCAM.write_reg(0x07, 0x00);
delay(100); 
while(1){
  //Check if the ArduCAM SPI bus is OK
  myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
  temp = myCAM.read_reg(ARDUCHIP_TEST1);
  if (temp != 0x55){
    Serial.println(F("ACK CMD SPI interface Error! END"));
    delay(1000);continue;
  }else{
    Serial.println(F("ACK CMD SPI interface OK. END"));break;
  }
}
  while(1){
    //Check if the camera module type is OV5642
    myCAM.wrSensorReg16_8(0xff, 0x01);
    myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
    myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);
    if((vid != 0x56) || (pid != 0x42)){
      Serial.println(F("ACK CMD Can't find OV5642 module! END"));
      delay(1000);continue;
    }
    else{
      Serial.println(F("ACK CMD OV5642 detected. END"));break;
    } 
  }
//Change to JPEG capture mode and initialize the OV5642 module
myCAM.set_format(JPEG);
myCAM.InitCAM();

  myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);   //VSYNC is active HIGH
  myCAM.OV5642_set_JPEG_size(OV5642_320x240);
delay(1000);
myCAM.clear_fifo_flag();
myCAM.write_reg(ARDUCHIP_FRAMES,0x00);
}
void loop() {
// put your main code here, to run repeatedly:

uint8_t temp = 0xff, temp_last = 0;
bool is_header = false;
if (Serial.available())
{
  temp = Serial.read();
  switch (temp)
  {
    case 0:
      myCAM.OV5642_set_JPEG_size(OV5642_320x240);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_320x240 END"));
    temp = 0xff;
    break;
    case 1:
      myCAM.OV5642_set_JPEG_size(OV5642_640x480);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_640x480 END"));
    temp = 0xff;
    break;
    case 2: 
      myCAM.OV5642_set_JPEG_size(OV5642_1024x768);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_1024x768 END"));
    temp = 0xff;
    break;
    case 3:
    temp = 0xff;
      myCAM.OV5642_set_JPEG_size(OV5642_1280x960);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_1280x960 END"));
    break;
    case 4:
    temp = 0xff;
      myCAM.OV5642_set_JPEG_size(OV5642_1600x1200);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_1600x1200 END"));
    break;
    case 5:
    temp = 0xff;
      myCAM.OV5642_set_JPEG_size(OV5642_2048x1536);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_2048x1536 END"));
    break;
    case 6:
    temp = 0xff;
      myCAM.OV5642_set_JPEG_size(OV5642_2592x1944);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_2592x1944 END"));
    break;
    case 0x10:
    mode = 1;
    temp = 0xff;
    start_capture = 1;
    Serial.println(F("ACK CMD CAM start single shoot. END"));
    break;
    case 0x11: 
    temp = 0xff;
    myCAM.set_format(JPEG);
    myCAM.InitCAM();
    #if !(defined (OV2640_MINI_2MP))
    myCAM.set_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
    #endif
    break;
    case 0x20:
    mode = 2;
    temp = 0xff;
    start_capture = 2;
    Serial.println(F("ACK CMD CAM start video streaming. END"));
    break;
    case 0x30:
    mode = 3;
    temp = 0xff;
    start_capture = 3;
    Serial.println(F("ACK CMD CAM start single shoot. END"));
    break;
    case 0x31:
    temp = 0xff;
    myCAM.set_format(BMP);
    myCAM.InitCAM();     
    myCAM.clear_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
    myCAM.wrSensorReg16_8(0x3818, 0x81);
    myCAM.wrSensorReg16_8(0x3621, 0xA7);
    break;
    case 0x40:
    myCAM.OV5642_set_Light_Mode(Advanced_AWB);temp = 0xff;
     Serial.println(F("ACK CMD Set to Advanced_AWB END"));break;
    case 0x41:
    myCAM.OV5642_set_Light_Mode(Simple_AWB);temp = 0xff;
     Serial.println(F("ACK CMD Set to Simple_AWB END"));break;
     case 0x42:
    myCAM.OV5642_set_Light_Mode(Manual_day);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_day END"));break;
     case 0x43:
    myCAM.OV5642_set_Light_Mode(Manual_A);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_A END"));break;
     case 0x44:
    myCAM.OV5642_set_Light_Mode(Manual_cwf);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_cwf END"));break;
     case 0x45:
    myCAM.OV5642_set_Light_Mode(Manual_cloudy);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_cloudy END"));break;
      case 0x50:
    myCAM.OV5642_set_Color_Saturation(Saturation4);temp = 0xff;
     Serial.println(F("ACK CMD Set to Saturation+4 END"));break;
   case 0x51:
      myCAM.OV5642_set_Color_Saturation(Saturation3);temp = 0xff;
     Serial.println(F("ACK CMD Set to Saturation+3 END"));break;
   case 0x52:
    myCAM.OV5642_set_Color_Saturation(Saturation2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+2 END"));break;
  case 0x53:
    myCAM.OV5642_set_Color_Saturation(Saturation1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+1 END"));break;
   case 0x54:
    myCAM.OV5642_set_Color_Saturation(Saturation0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+0 END"));break;
   case 0x55:
    myCAM.OV5642_set_Color_Saturation(Saturation_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-1 END"));break;
   case 0x56:
    myCAM.OV5642_set_Color_Saturation(Saturation_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-2"));break;
    case 0x57:
    myCAM.OV5642_set_Color_Saturation(Saturation_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-3 END"));break;
   case 0x58:
  myCAM.OV5642_set_Light_Mode(Saturation_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-4 END"));break; 
   case 0x60:
  myCAM.OV5642_set_Brightness(Brightness4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+4 END"));break;
  case 0x61:
  myCAM.OV5642_set_Brightness(Brightness3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+3 END"));break; 
  case 0x62:
  myCAM.OV5642_set_Brightness(Brightness2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+2 END"));break; 
   case 0x63:
  myCAM.OV5642_set_Brightness(Brightness1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+1 END"));break; 
   case 0x64:
  myCAM.OV5642_set_Brightness(Brightness0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+0 END"));break; 
    case 0x65:
  myCAM.OV5642_set_Brightness(Brightness_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-1 END"));break; 
     case 0x66:
  myCAM.OV5642_set_Brightness(Brightness_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-2 END"));break; 
    case 0x67:
  myCAM.OV5642_set_Brightness(Brightness_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-3 END"));break; 
    case 0x68:
  myCAM.OV5642_set_Brightness(Brightness_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-4 END"));break;
case 0x70:
  myCAM.OV5642_set_Contrast(Contrast4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+4 END"));break;
  case 0x71:
  myCAM.OV5642_set_Contrast(Contrast3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+3 END"));break; 
  case 0x72:
  myCAM.OV5642_set_Contrast(Contrast2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+2 END"));break; 
   case 0x73:
  myCAM.OV5642_set_Contrast(Contrast1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+1 END"));break; 
   case 0x74:
  myCAM.OV5642_set_Contrast(Contrast0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+0 END"));break; 
    case 0x75:
  myCAM.OV5642_set_Contrast(Contrast_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-1 END"));break; 
     case 0x76:
  myCAM.OV5642_set_Contrast(Contrast_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-2 END"));break; 
    case 0x77:
  myCAM.OV5642_set_Contrast(Contrast_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-3 END"));break; 
    case 0x78:
  myCAM.OV5642_set_Contrast(Contrast_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-4 END"));break;
   case 0x80: 
    myCAM.OV5642_set_hue(degree_180);temp = 0xff;
     Serial.println(F("ACK CMD Set to -180 degree END"));break;   
   case 0x81: 
   myCAM.OV5642_set_hue(degree_150);temp = 0xff;
     Serial.println(F("ACK CMD Set to -150 degree END"));break;  
   case 0x82: 
   myCAM.OV5642_set_hue(degree_120);temp = 0xff;
     Serial.println(F("ACK CMD Set to -120 degree END"));break;  
   case 0x83: 
   myCAM.OV5642_set_hue(degree_90);temp = 0xff;
     Serial.println(F("ACK CMD Set to -90 degree END"));break;   
    case 0x84: 
   myCAM.OV5642_set_hue(degree_60);temp = 0xff;
     Serial.println(F("ACK CMD Set to -60 degree END"));break;   
    case 0x85: 
   myCAM.OV5642_set_hue(degree_30);temp = 0xff;
     Serial.println(F("ACK CMD Set to -30 degree END"));break;  
     case 0x86: 
   myCAM.OV5642_set_hue(degree_0);temp = 0xff;
     Serial.println(F("ACK CMD Set to 0 degree END"));break; 
   case 0x87: 
   myCAM.OV5642_set_hue(degree30);temp = 0xff;
     Serial.println(F("ACK CMD Set to 30 degree END"));break;
   case 0x88: 
   myCAM.OV5642_set_hue(degree60);temp = 0xff;
     Serial.println(F("ACK CMD Set to 60 degree END"));break;
    case 0x89: 
   myCAM.OV5642_set_hue(degree90);temp = 0xff;
     Serial.println(F("ACK CMD Set to 90 degree END"));break;
     case 0x8a: 
   myCAM.OV5642_set_hue(degree120);temp = 0xff;
     Serial.println(F("ACK CMD Set to 120 degree END"));break ; 
   case 0x8b: 
   myCAM.OV5642_set_hue(degree150);temp = 0xff;
     Serial.println(F("ACK CMD Set to 150 degree END"));break ;
   case 0x90: 
   myCAM.OV5642_set_Special_effects(Normal);temp = 0xff;
     Serial.println(F("ACK CMD Set to Normal END"));break ;
      case 0x91: 
   myCAM.OV5642_set_Special_effects(BW);temp = 0xff;
     Serial.println(F("ACK CMD Set to BW END"));break ;
    case 0x92: 
   myCAM.OV5642_set_Special_effects(Bluish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Bluish END"));break ;
      case 0x93: 
   myCAM.OV5642_set_Special_effects(Sepia);temp = 0xff;
     Serial.println(F("ACK CMD Set to Sepia END"));break ;
    case 0x94: 
   myCAM.OV5642_set_Special_effects(Reddish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Reddish END"));break ;
   case 0x95: 
   myCAM.OV5642_set_Special_effects(Greenish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Greenish END"));break ;
   case 0x96: 
   myCAM.OV5642_set_Special_effects(Negative);temp = 0xff;
     Serial.println(F("ACK CMD Set to Negative END"));break ;
   case 0xA0: 
   myCAM.OV5642_set_Exposure_level(Exposure_17_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.7EV"));break ;  
     case 0xA1: 
   myCAM.OV5642_set_Exposure_level(Exposure_13_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.3EV END"));break ;
      case 0xA2: 
   myCAM.OV5642_set_Exposure_level(Exposure_10_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.0EV END"));break ; 
    case 0xA3: 
   myCAM.OV5642_set_Exposure_level(Exposure_07_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -0.7EV END"));break ;
     case 0xA4: 
   myCAM.OV5642_set_Exposure_level(Exposure_03_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -0.3EV END"));break ;
   case 0xA5: 
   myCAM.OV5642_set_Exposure_level(Exposure_default);temp = 0xff;
     Serial.println(F("ACK CMD Set to -Exposure_default END"));break ;
    case 0xA6: 
   myCAM.OV5642_set_Exposure_level(Exposure07_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 0.7EV END"));break ;  
   case 0xA7: 
   myCAM.OV5642_set_Exposure_level(Exposure10_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.0EV END"));break ;
    case 0xA8: 
   myCAM.OV5642_set_Exposure_level(Exposure13_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.3EV END"));break ; 
    case 0xA9: 
   myCAM.OV5642_set_Exposure_level(Exposure17_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.7EV END"));break ; 
   case 0xB0: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness default END"));break ; 
    case 0xB1: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness1);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));break ; 
    case 0xB2: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness2);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));break ; 
      case 0xB3: 
   myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));break ; 
     case 0xB4: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness1);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));break ;
     case 0xB5: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness2);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));break ; 
     case 0xB6: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness3);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));break ;
     case 0xB7: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness4);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));break ;
    case 0xB8: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness5);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));break ;  
    case 0xC0: 
     myCAM.OV5642_set_Mirror_Flip(MIRROR);temp = 0xff;
     Serial.println(F("ACK CMD Set to MIRROR END"));break ;  
    case 0xC1: 
     myCAM.OV5642_set_Mirror_Flip(FLIP);temp = 0xff;
     Serial.println(F("ACK CMD Set to FLIP END"));break ; 
    case 0xC2: 
     myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);temp = 0xff;
     Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));break ;
    case 0xC3: 
     myCAM.OV5642_set_Mirror_Flip(Normal);temp = 0xff;
     Serial.println(F("ACK CMD Set to Normal END"));break ;
     case 0xD0: 
     myCAM.OV5642_set_Compress_quality(high_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to high quality END"));break ;
      case 0xD1: 
     myCAM.OV5642_set_Compress_quality(default_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to default quality END"));break ;
      case 0xD2: 
     myCAM.OV5642_set_Compress_quality(low_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to low quality END"));break ;

      case 0xE0: 
     myCAM.OV5642_Test_Pattern(Color_bar);temp = 0xff;
     Serial.println(F("ACK CMD Set to Color bar END"));break ;
      case 0xE1: 
     myCAM.OV5642_Test_Pattern(Color_square);temp = 0xff;
     Serial.println(F("ACK CMD Set to Color square END"));break ;
      case 0xE2: 
     myCAM.OV5642_Test_Pattern(BW_square);temp = 0xff;
     Serial.println(F("ACK CMD Set to BW square END"));break ;
     case 0xE3: 
     myCAM.OV5642_Test_Pattern(DLI);temp = 0xff;
     Serial.println(F("ACK CMD Set to DLI END"));break ;
      default:
      break;
  }
}
if (mode == 1)
{
  // Lancement du mode multi-photo
  if (start_capture == 1)
  {
    compteur = 0;
    multiShot = true;
    lastCapture = millis();
    start_capture = 0;
  }

  // Boucle de capture avec délai
  if (multiShot)
  {
    if (millis() - lastCapture >= interval)
    {
      lastCapture = millis();

      // Capture
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      myCAM.start_capture();

      // Attendre fin capture
      while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK));

      Serial.println(F("ACK CMD CAM Capture Done. END"));

      // Envoi vers Host App
      read_fifo_burst(myCAM);

      myCAM.clear_fifo_flag();

      compteur++;

      if (compteur >= nbPhotos)
      {
        multiShot = false;
        Serial.println(F("ACK CMD Multi capture finished. END"));
      }
    }
  }
}
else if (mode == 2)
{
  while (1)
  {
    temp = Serial.read();
    if (temp == 0x21)
    {
      start_capture = 0;
      mode = 0;
      Serial.println(F("ACK CMD CAM stop video streaming. END"));
      break;
    }
    switch(temp){
       case 0x40:
    myCAM.OV5642_set_Light_Mode(Advanced_AWB);temp = 0xff;
     Serial.println(F("ACK CMD Set to Advanced_AWB END"));break;
    case 0x41:
    myCAM.OV5642_set_Light_Mode(Simple_AWB);temp = 0xff;
     Serial.println(F("ACK CMD Set to Simple_AWB END"));break;
     case 0x42:
    myCAM.OV5642_set_Light_Mode(Manual_day);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_day END"));break;
     case 0x43:
    myCAM.OV5642_set_Light_Mode(Manual_A);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_A END"));break;
     case 0x44:
    myCAM.OV5642_set_Light_Mode(Manual_cwf);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_cwf END"));break;
     case 0x45:
    myCAM.OV5642_set_Light_Mode(Manual_cloudy);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_cloudy END"));break;
      case 0x50:
    myCAM.OV5642_set_Color_Saturation(Saturation4);temp = 0xff;
     Serial.println(F("ACK CMD Set to Saturation+4 END"));break;
   case 0x51:
      myCAM.OV5642_set_Color_Saturation(Saturation3);temp = 0xff;
     Serial.println(F("ACK CMD Set to Saturation+3 END"));break;
   case 0x52:
    myCAM.OV5642_set_Color_Saturation(Saturation2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+2 END"));break;
  case 0x53:
    myCAM.OV5642_set_Color_Saturation(Saturation1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+1 END"));break;
   case 0x54:
    myCAM.OV5642_set_Color_Saturation(Saturation0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+0 END"));break;
   case 0x55:
    myCAM.OV5642_set_Color_Saturation(Saturation_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-1 END"));break;
   case 0x56:
    myCAM.OV5642_set_Color_Saturation(Saturation_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-2 END"));break;
    case 0x57:
    myCAM.OV5642_set_Color_Saturation(Saturation_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-3 END"));break;
   case 0x58:
  myCAM.OV5642_set_Light_Mode(Saturation_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-4 END"));break; 
   case 0x60:
  myCAM.OV5642_set_Brightness(Brightness4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+4 END"));break;
  case 0x61:
  myCAM.OV5642_set_Brightness(Brightness3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+3 END"));break; 
  case 0x62:
  myCAM.OV5642_set_Brightness(Brightness2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+2 END"));break; 
   case 0x63:
  myCAM.OV5642_set_Brightness(Brightness1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+1 END"));break; 
   case 0x64:
  myCAM.OV5642_set_Brightness(Brightness0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+0 END"));break; 
    case 0x65:
  myCAM.OV5642_set_Brightness(Brightness_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-1 END"));break; 
     case 0x66:
  myCAM.OV5642_set_Brightness(Brightness_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-2 END"));break; 
    case 0x67:
  myCAM.OV5642_set_Brightness(Brightness_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-3 END"));break; 
    case 0x68:
  myCAM.OV5642_set_Brightness(Brightness_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-4 END"));break;
case 0x70:
  myCAM.OV5642_set_Contrast(Contrast4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+4 END"));break;
  case 0x71:
  myCAM.OV5642_set_Contrast(Contrast3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+3 END"));break; 
  case 0x72:
  myCAM.OV5642_set_Contrast(Contrast2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+2 END"));break; 
   case 0x73:
  myCAM.OV5642_set_Contrast(Contrast1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+1 END"));break; 
   case 0x74:
  myCAM.OV5642_set_Contrast(Contrast0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+0 END"));break; 
    case 0x75:
  myCAM.OV5642_set_Contrast(Contrast_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-1 END"));break; 
     case 0x76:
  myCAM.OV5642_set_Contrast(Contrast_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-2 END"));break; 
    case 0x77:
  myCAM.OV5642_set_Contrast(Contrast_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-3 END"));break; 
    case 0x78:
  myCAM.OV5642_set_Contrast(Contrast_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-4 END"));break;
   case 0x80: 
    myCAM.OV5642_set_hue(degree_180);temp = 0xff;
     Serial.println(F("ACK CMD Set to -180 degree END"));break;   
   case 0x81: 
   myCAM.OV5642_set_hue(degree_150);temp = 0xff;
     Serial.println(F("ACK CMD Set to -150 degree END"));break;  
   case 0x82: 
   myCAM.OV5642_set_hue(degree_120);temp = 0xff;
     Serial.println(F("ACK CMD Set to -120 degree END"));break;  
   case 0x83: 
   myCAM.OV5642_set_hue(degree_90);temp = 0xff;
     Serial.println(F("ACK CMD Set to -90 degree END"));break;   
    case 0x84: 
   myCAM.OV5642_set_hue(degree_60);temp = 0xff;
     Serial.println(F("ACK CMD Set to -60 degree END"));break;   
    case 0x85: 
   myCAM.OV5642_set_hue(degree_30);temp = 0xff;
     Serial.println(F("ACK CMD Set to -30 degree END"));break;  
     case 0x86: 
   myCAM.OV5642_set_hue(degree_0);temp = 0xff;
     Serial.println(F("ACK CMD Set to 0 degree END"));break; 
   case 0x87: 
   myCAM.OV5642_set_hue(degree30);temp = 0xff;
     Serial.println(F("ACK CMD Set to 30 degree END"));break;
   case 0x88: 
   myCAM.OV5642_set_hue(degree60);temp = 0xff;
     Serial.println(F("ACK CMD Set to 60 degree END"));break;
    case 0x89: 
   myCAM.OV5642_set_hue(degree90);temp = 0xff;
     Serial.println(F("ACK CMD Set to 90 degree END"));break;
     case 0x8a: 
   myCAM.OV5642_set_hue(degree120);temp = 0xff;
     Serial.println(F("ACK CMD Set to 120 degree END"));break ; 
   case 0x8b: 
   myCAM.OV5642_set_hue(degree150);temp = 0xff;
     Serial.println(F("ACK CMD Set to 150 degree END"));break ;
  case 0x90: 
   myCAM.OV5642_set_Special_effects(Normal);temp = 0xff;
     Serial.println(F("ACK CMD Set to Normal END"));break ;
      case 0x91: 
   myCAM.OV5642_set_Special_effects(BW);temp = 0xff;
     Serial.println(F("ACK CMD Set to BW END"));break ;
    case 0x92: 
   myCAM.OV5642_set_Special_effects(Bluish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Bluish END"));break ;
      case 0x93: 
   myCAM.OV5642_set_Special_effects(Sepia);temp = 0xff;
     Serial.println(F("ACK CMD Set to Sepia END"));break ;
    case 0x94: 
   myCAM.OV5642_set_Special_effects(Reddish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Reddish END"));break ;
   case 0x95: 
   myCAM.OV5642_set_Special_effects(Greenish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Greenish END"));break ;
   case 0x96: 
   myCAM.OV5642_set_Special_effects(Negative);temp = 0xff;
     Serial.println(F("ACK CMD Set to Negative END"));break ;
   case 0xA0: 
   myCAM.OV5642_set_Exposure_level(Exposure_17_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.7EV END"));break ;  
     case 0xA1: 
   myCAM.OV5642_set_Exposure_level(Exposure_13_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.3EV END"));break ;
      case 0xA2: 
   myCAM.OV5642_set_Exposure_level(Exposure_10_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.0EV END"));break ; 
    case 0xA3: 
   myCAM.OV5642_set_Exposure_level(Exposure_07_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -0.7EV END"));break ;
     case 0xA4: 
   myCAM.OV5642_set_Exposure_level(Exposure_03_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -0.3EV END"));break ;
   case 0xA5: 
   myCAM.OV5642_set_Exposure_level(Exposure_default);temp = 0xff;
     Serial.println(F("ACK CMD Set to -Exposure_default END"));break ;
    case 0xA6: 
   myCAM.OV5642_set_Exposure_level(Exposure07_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 0.7EV END"));break ;  
   case 0xA7: 
   myCAM.OV5642_set_Exposure_level(Exposure10_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.0EV END"));break ;
    case 0xA8: 
   myCAM.OV5642_set_Exposure_level(Exposure13_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.3EV END"));break ; 
    case 0xA9: 
   myCAM.OV5642_set_Exposure_level(Exposure17_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.7EV END"));break ; 
   case 0xB0: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness default END"));break ; 
    case 0xB1: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness1);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));break ; 
    case 0xB2: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness2);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));break ; 
      case 0xB3: 
   myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));break ; 
     case 0xB4: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness1);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));break ;
     case 0xB5: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness2);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));break ; 
     case 0xB6: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness3);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));break ;
     case 0xB7: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness4);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));break ;
    case 0xB8: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness5);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));break ;  
    case 0xC0: 
     myCAM.OV5642_set_Mirror_Flip(MIRROR);temp = 0xff;
     Serial.println(F("ACK CMD Set to MIRROR END"));break ;  
    case 0xC1: 
     myCAM.OV5642_set_Mirror_Flip(FLIP);temp = 0xff;
     Serial.println(F("ACK CMD Set to FLIP END"));break ; 
    case 0xC2: 
     myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);temp = 0xff;
     Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));break ;
    case 0xC3: 
     myCAM.OV5642_set_Mirror_Flip(Normal);temp = 0xff;
     Serial.println(F("ACK CMD Set to Normal END"));break ;
     case 0xD0: 
     myCAM.OV5642_set_Compress_quality(high_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to high quality END"));break ;
      case 0xD1: 
     myCAM.OV5642_set_Compress_quality(default_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to default quality END"));break ;
      case 0xD2: 
     myCAM.OV5642_set_Compress_quality(low_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to low quality END"));break ;

      case 0xE0: 
     myCAM.OV5642_Test_Pattern(Color_bar);temp = 0xff;
     Serial.println(F("ACK CMD Set to Color bar END"));break ;
      case 0xE1: 
     myCAM.OV5642_Test_Pattern(Color_square);temp = 0xff;
     Serial.println(F("ACK CMD Set to Color square END"));break ;
      case 0xE2: 
     myCAM.OV5642_Test_Pattern(BW_square);temp = 0xff;
     Serial.println(F("ACK CMD Set to BW square END"));break ;
     case 0xE3: 
     myCAM.OV5642_Test_Pattern(DLI);temp = 0xff;
     Serial.println(F("ACK CMD Set to DLI END"));break ;
      
      }
    if (start_capture == 2)
    {
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK))
    {
      uint32_t length = 0;
      length = myCAM.read_fifo_length();
      if ((length >= MAX_FIFO_SIZE) | (length == 0))
      {
        myCAM.clear_fifo_flag();
        start_capture = 2;
        continue;
      }
      myCAM.CS_LOW();
      myCAM.set_fifo_burst();//Set fifo burst mode
      temp =  SPI.transfer(0x00);
      length --;
      while ( length-- )
      {
        temp_last = temp;
        temp =  SPI.transfer(0x00);
        if (is_header == true)
        {
          Serial.write(temp);
        }
        else if ((temp == 0xD8) & (temp_last == 0xFF))
        {
          is_header = true;
          Serial.println(F("ACK IMG END"));
          Serial.write(temp_last);
          Serial.write(temp);
        }
        if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
        break;
        delayMicroseconds(4);
      }
      myCAM.CS_HIGH();
      myCAM.clear_fifo_flag();
      start_capture = 2;
      is_header = false;
    }
  }
}
else if (mode == 3)
{
  if (start_capture == 3)
  {
    //Flush the FIFO
    myCAM.flush_fifo();
    myCAM.clear_fifo_flag();
    //Start capture
    myCAM.start_capture();
    start_capture = 0;
  }
  if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK))
  {
    Serial.println(F("ACK CMD CAM Capture Done. END"));delay(50);
    uint8_t temp, temp_last;
    uint32_t length = 0;
    length = myCAM.read_fifo_length();
    if (length >= MAX_FIFO_SIZE ) 
    {
      Serial.println(F("ACK CMD Over size. END"));
      myCAM.clear_fifo_flag();
      return;
    }
    if (length == 0 ) //0 kb
    {
      Serial.println(F("ACK CMD Size is 0. END"));
      myCAM.clear_fifo_flag();
      return;
    }
    myCAM.CS_LOW();
    myCAM.set_fifo_burst();//Set fifo burst mode
    
    Serial.write(0xFF);
    Serial.write(0xAA);
    for (temp = 0; temp < BMPIMAGEOFFSET; temp++)
    {
      Serial.write(pgm_read_byte(&bmp_header[temp]));
    }
    //SPI.transfer(0x00);
    char VH, VL;
    int i = 0, j = 0;
    for (i = 0; i < 240; i++)
    {
      for (j = 0; j < 320; j++)
      {
        VH = SPI.transfer(0x00);;
        VL = SPI.transfer(0x00);;
        Serial.write(VL);
        delayMicroseconds(12);
        Serial.write(VH);
        delayMicroseconds(12);
      }
    }
    Serial.write(0xBB);
    Serial.write(0xCC);
    myCAM.CS_HIGH();
    //Clear the capture done flag
    myCAM.clear_fifo_flag();
  }
}
}
uint8_t read_fifo_burst(ArduCAM myCAM)
{
  uint8_t temp = 0, temp_last = 0;
  uint32_t length = 0;
  length = myCAM.read_fifo_length();
  Serial.println(length, DEC);
  if (length >= MAX_FIFO_SIZE) //512 kb
  {
    Serial.println(F("ACK CMD Over size. END"));
    return 0;
  }
  if (length == 0 ) //0 kb
  {
    Serial.println(F("ACK CMD Size is 0. END"));
    return 0;
  }
  myCAM.CS_LOW();
  myCAM.set_fifo_burst();//Set fifo burst mode
  temp =  SPI.transfer(0x00);
  length --;
  while ( length-- )
  {
    temp_last = temp;
    temp =  SPI.transfer(0x00);
    if (is_header == true)
    {
      Serial.write(temp);
    }
    else if ((temp == 0xD8) & (temp_last == 0xFF))
    {
      is_header = true;
      Serial.println(F("ACK IMG END"));
      Serial.write(temp_last);
      Serial.write(temp);
    }
    if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
    break;
    delayMicroseconds(15);
  }
  myCAM.CS_HIGH();
  is_header = false;
  return 1;

}

```

</details><p class="callout warning"><span style="color: rgb(0, 0, 0);"><span style="text-decoration: underline;">**LES SOUCIS :**</span> </span></p>

- <span style="color: rgb(0, 0, 0);">On ne sait pas si c'est toujours possible d'avoir <span style="text-decoration: underline;">deux caméras </span>pour le bras. </span>
- <span style="color: rgb(0, 0, 0);">Il va falloir combiner le <span style="text-decoration: underline;">code du moteur avec le code de la caméra</span> en réfléchissant au problème suivant : une ou deux Arduino ? Comment faire avec le Shield motor ? Est ce que la caméra acceptera l'alimentation en 12 V nécessaire pour le moteur ? (Parce que pas de possibilité de changer de Shield motor --&gt; seul compatible avec le 12 V pour le moteur NEMA) Arduino maitre/esclave ? </span>
- <span style="color: rgb(0, 0, 0);">Il faut revoir le mouvement du moteur sur le Coulommiers terminé pour être sur de ses différents déplacement et degré de rotation : seulement une partie pour le moment. </span>
- <span style="color: rgb(0, 0, 0);">Faire premier test de montage des différentes pièces de notre Tournicayou</span>

<p class="callout success"><span style="color: rgb(0, 0, 0);"><span style="color: rgb(22, 145, 121);">**Pour la prochaine séance --&gt;** </span>Test d'ajouts de pin sur le Shield moteur pour brancher donc le motor NEMA et la caméra dessus avec les pin analytiques + Imprimer un Coulommiers entier pour pouvoir réaliser les tests moteurs sur tout le tour du Coulommiers et par la suite combiner code moteur et code caméra !</span></p>

</details><details id="bkmrk-17%2F04%2F2026-on-re-tes"><summary>17/04/2026\_Premier montage pour test moteur</summary>

<p class="callout info"><span style="color: rgb(35, 111, 161);">**Notre joli coulommiers est arrivé, il est tout beau et tout coloré !** (Photo ci-joint)</span></p>

<p class="callout warning"><span style="color: rgb(230, 126, 35);">**Nos pitits problèmes de la séance : 1er vrai test montage de notre <span style="text-decoration: underline;">"Tounicayou"</span>**</span></p>

<span style="text-decoration: underline;">**Nécessité de re modélisation de certaines pièces**</span>

Aujourd'hui nous avons essayé de monter les différentes pièces toutes ensembles. Plusieurs problèmes se sont alors présentés à nous:

- Les puzzles (Coulommiers) ont des marges d'erreurs sur estimées. Il faudrait à l'avenir les repenser afin de faciliter le montage. Toutes les complémentarités sont à revoir, nonobstant, celle entre le socle moteur et la pièce arrière est primordiale.
- La pièce arrière avait été pensée pour avoir une roue permettant de faire encoche avec le coulommiers, permettant alors de maintenir le tout sans branlements. Il faudrait donc, soit retirer la buté, soit redesigner la pièce dans son ensemble.
- Le support moteur est à retravailler. Imaginé au départ comme nécessitant une pièce complémentaire pour être stable, il devra dorénavant obtenir une stabilité autonome. L'idée sera d'ajouter des butes sur le bord distal au foyer du coulommiers. Plusieurs modèle de butes seront testés.
- Le coulommiers en lui même ne sera pas modifié, mais des explications supplémentaires quant à sa conception peuvent être ajoutées. Le principe du coulommiers est de permettre une rotation d'un bras photographique autour du support -substituant la rotation du support lui même-. Les dents sont sur la surface interne du coulommiers **Pourquoi ? --&gt;** Pour permettre un ancrage par le rouage et une autre encoche à la surface opposée. L'idée de rouage sur sur le coté haut du coulommiers a été proposée. Elle ne nous semble que peu adéquate au projet. En effet, elle poserait plus de problèmes, nécessitant deux encoche, et un rouage circulaire à la Citroën. IMPOSSIBLE.

[![20260417_133720.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260417-133720.jpg) *Le coulommiers tout coloré et Lucas* ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260417-133720.jpg)*[![20260417_153747(0).jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260417-1537470.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260417-1537470.jpg)*

[![20260417_154904.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/20260417-154904.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/20260417-154904.jpg)

</details><details id="bkmrk-02%2F05%2F2026-pour-le-m"><summary>02/05/2026\_Modification de la pièce moteur</summary>

Pour le moteur baroque, 3 idées sont pour l'instant modélisées. Un plaque (à poncer), deux encoches, un méga anneau. En plus de cela, le support a également été repensé avec l'ajout d'une encoche permettant l'insertion du bras photo sur celui-ci. Cette structure n'est là que pour l'idée d'améliorer le projet dans le futur, pour l'instant le bras si insérant n'a pas été conçu.

A noter donc, cette encoche fait :

- 20 mm de large
- 29 mm de long
- 10 mm de haut
- L'encoche fait 25 mm de long
- L'encoche fait 8 mm de diamètre, son foyer est centré par rapport aux côtés droit et gauche. Cependant le foyer ce trouve à 3.25 mm du haut. L'encoche est circulaire, du fait que ce soit plus simple à designer

[Barroque motor.FCStd](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1834) - Plaque

[Barroque motor.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1845) - Plaque

[Barroque motor - 2 coins.FCStd](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1846)

[Barroque motor - 2 coins.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1847)

[Barroque motor - anneau.FCStd](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1848)

[Barroque motor - anneau.stl](https://wiki.fablab.sorbonne-universite.fr/BookStack/attachments/1849)

</details><details id="bkmrk-22%2F05%2F2026-objectif-"><summary>22/05/2026</summary>

Objectif sur le montage du **Tournicayou** pour les tests moteur

Modification de la pièce support moteur pendant environ 3h, amélioration du wiki en parallèle. Dernière heure modification de la pièce support du bras pour faire nos tests, si on y arrive.

<span style="text-decoration: underline;">Réalisation du montage final pour la partie programmation !</span>

[![bn5capture-decran-2026-03-20-102959.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/bn5capture-decran-2026-03-20-102959.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/bn5capture-decran-2026-03-20-102959.png)

</details>##### <span style="text-decoration: underline;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">Les liens utiles :</span></span></span></span></span></span></span></span></span></span></span>

- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[https://github.com/ArduCAM/Arducam\_mini](https://github.com/ArduCAM/Arducam_mini)</span></span></span></span></span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[https://github.com/ArduCAM/Arduino ](https://github.com/ArduCAM/Arduino)</span></span></span></span></span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">[https://www.youtube.com/watch?v=FlfrkJ08pnQ](https://www.youtube.com/watch?v=FlfrkJ08pnQ)</span></span></span></span></span></span></span></span></span></span>
- <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"> [https://github.com/ArduCAM/Arduino/issues/528](https://github.com/ArduCAM/Arduino/issues/528)</span></span></span></span></span></span></span></span></span></span>

# Projet PEEP-River

#### <span style="color: rgb(22, 145, 121);">**Informations :**</span>

- - **Contacts des étudiantes :** **Sibylle PAULSEN : <sibylle.paulsen@etu.sorbonne-universite.fr>**
        
        **Alice VACUS : [alice.vacus@etu.sorbonne-universite.fr](mailto:alice.vacus@sorbonne-universite.fr)**
    - **Cursus : L3 Sciences de la Terre/sciences de la vie ; <span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;"><span dir="auto" style="vertical-align: inherit;">UE\_FabLab ; LU3ST062 </span></span></span></span>**
    - **Encadrants :****Responsable du Projet : Pauline DELORME**
        
        **Responsable de l’UE : Fabrice MINOLETTI et Pierre THERY**

#### **<span style="color: rgb(230, 126, 35);">Contexte : </span>**

<span style="color: rgb(0, 0, 0);">**Dans le cadre de l'UE FabLab, nous travaillons à** </span><span style="color: rgb(0, 0, 0);">**réaliser un projet avec la chercheuse Pauline Delorme sur l'étude de l'érosion de berges de rivière** </span>


#### **<span style="color: rgb(186, 55, 42);"><span style="color: rgb(230, 126, 35);">Problématique :</span> </span>**

**Comment concevoir et prototyper un dispositif électronique autonome capable de mesurer et de transmettre en temps réel le recul d'une berge (érosion) ou l'accumulation de sédiments, afin d'étudier la dynamique d'un cours d'eau au cours du temps ?**

#### **<span style="color: rgb(230, 126, 35);">Objectifs : </span>**


**L’objectif de ce projet est de fabriquer un capteur PEEP capable de quantifier l’érosion des berges des rivières au cours du temps**

#### **<span style="color: rgb(230, 126, 35);">Les tâches et étapes :</span>**

- **Lire la bibliographie**
- **Concevoir le montage électronique**
- **Penser l'enveloppe 3D**
- **Réaliser des tests (imperméabilité, seuil de luminosité détecté)**

#### <span style="color: rgb(230, 126, 35);">**Répartition du travail :**</span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)

Remplissage du Wiki, expérience (fixation des valeurs seuil de la LDR), Codage

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)

Remplissage du wiki, expérience (fixation des valeurs seuil de la LDR), prototype de conception barrette 3D, Montage électronique, schéma tinkercad


#### **<span style="color: rgb(230, 126, 35);">Réflexions de dépa</span><span style="color: rgb(230, 126, 35);">rt sur les différents montages que l'on imagine : </span>**


<p class="callout info">**PR = photo résistance** </p>

#### **<span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)</span>**

**<span style="text-decoration: underline;">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)Montage 1 :</span>** Gérer le moniteur - Lecture d’intensité

**<span style="text-decoration: underline;">Matériel :</span>** Une PR + une résistance reliée à Arduino (utilisation du serial monitor)

**<span style="text-decoration: underline;">But :</span>** Mesure d’intensité de la lumière :

**Intensité d'entrée 1 = forte - Intensité d'entrée 2 = moins forte**

**<span style="text-decoration: underline;">Résultat :</span>** Selon l'intensité lumineuse 1 ou 2 il y a une mesure du voltage (V out) par Arduino différente et avec le Serial Monitor on obtient une valeur d’intensité de sortie différente.

**[![IMG_2162.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/img-2162.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/img-2162.jpg)**

**<span style="text-decoration: underline;">Montage 2 </span>:** Compteur intelligent

**<span style="text-decoration: underline;">Matériel :</span>** 2 PR (+résistances) en parallèles reliées à Arduino + une diode

**<span style="text-decoration: underline;">But :</span>** Création d'un montage plus complexe avec plusieurs photo résistances pour mimer l'effet de l'érosion. On souhaite montrer que si la PR 2 reçoit de la lumière et pas la PR 1 la donnée n'est pas fiable

**Si diode s’allume = donnée reçue**

**<span style="text-decoration: underline;">Attentes </span>:**

**- Si lumière sur PR 2 =** diode ne s'allume pas

**- Si lumière sur PR 1 =** diode s’allume

**- Si lumière sur PR 2 et Photo résistance 1 =** diode s’allume

**[![IMG_2161.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/img-2161.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/img-2161.jpg)**

**<span style="text-decoration: underline;">Montage 3 : </span>**Mesure de référence de l’intensité ambiante

**<span style="text-decoration: underline;">Matériel :</span>**<span style="text-decoration: underline;"> </span>2 PR (+résistances) en parallèles reliées à Arduino + une diode + une PR de ref

**-&gt; Ajout de la PR de ref qui est la mesure de luminosité ambiante de référence sous l’eau.**

**<span style="text-decoration: underline;">But : </span>**Elle permet de fixer une valeur seuil qui définit la luminosité sous l’eau pour pouvoir analyser les données par la suite :

\- permet de savoir si c’est la nuit ou le jour

- permet de savoir que faible luminosité est due à une mauvaise météo

### **<span style="color: rgb(230, 126, 35);">Séance 1 (30 Janv) : </span>**


**[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)Compréhension approfondie du projet avec notre responsable de projet et découverte de ARDUINO et premier montage.**

<p class="callout info">**La photorésistance (LDR) fonctionne en diminuant sa résistance électrique proportionnellement à l'intensité lumineuse qu'elle reçoit : + de lumière - de résistance = plus le courant circule // - de lumière = = de résistance = courant limité.**</p>

<details id="bkmrk-1er-montage-avec-une"><summary>1er montage avec une PR LDR</summary>

**Montage électronique basé sur une carte ARDUINO, intégrant une photorésistance (LDR) et une photodiode. L’objectif est que la photodiode s’allume lorsque la main est placée sur la LDR.**

### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)</span>**

**<span id="bkmrk--10" style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-style: normal; font-variant: normal; text-decoration: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; overflow: hidden; width: 602px; height: 464px;">![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/embedded-image-vrb112pt.png)</span></span>**

**Lors de notre premier essai, nous avions défini un seuil de détection trop bas dans le code Arduino, ce qui faisait que la photodiode restait constamment allumée, même sans occultation.**

**Nous avons corrigé cela en augmentant ce seuil. Cet ajustement pose désormais une question clé pour l'optimisation de notre capteur PEEP : Quel seuil optimal définir pour les photorésistances de notre capteur afin d'assurer une bonne détection de la lumière dans l'eau ?**

</details><p class="callout warning">**Quel seuil optimal définir pour les photorésistances de notre capteur afin d'assurer une bonne détection de la lumière dans l'eau ?**</p>





### **<span style="color: rgb(230, 126, 35);">Séance 2 (6 Fev) : </span>**

#### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)</span>**

- **Séance lecteur intelligent :** nous nous sommes lors de cette séance familiarisé avec le Serial Monitor.
- **Expérience :**  lire les données de notre LDR.

<details id="bkmrk-d%C3%A9tails-de-l%27exp%C3%A9rie"><summary>Détails de l'expérience</summary>

**Arduino uno : 0V =&gt; 0 CAN ; 5V =&gt; 1023 CAN <span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Montage :</span><span id="bkmrk--15" style="border: none; display: inline-block; overflow: hidden; width: 467px; height: 306px;">![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/embedded-image-7x2hoqtw.png)</span><span style="border: none; display: inline-block; overflow: hidden; width: 467px; height: 306px;">Utilisation du Serial Monitor pour lire les données de la LDR.</span>**

</details><p class="callout info">**Pour avoir les valeurs lu par analogRead() il faut ouvrir le Serial Monitor**</p>





### **<span style="color: rgb(230, 126, 35);">Séance 3 (13 Fev) : </span>**

<p class="callout info">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Les</span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> LDRs </span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">sont branchés en</span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> </span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">analog in (A0,A1,...) : </span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">LDR donne une tension variable entre 0 et 5V. Les broches analogiques lisent ces tensions avec </span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">analogRead() </span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">et renvoient une valeur </span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">de 0 à 1023.</span>**</p>

<p class="callout info">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Les broches digitales ne lient que HIGH (1) ou LOW (0) : on branche les diodes dessus</span>**</p>

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Matériel utilisé</span>**

**<span style="font-family: 'Aptos Display',sans-serif; mso-fareast-font-family: 'Aptos Display'; mso-bidi-font-family: 'Aptos Display'; mso-bidi-font-weight: bold;"><span style="mso-list: Ignore;">-<span style="font-style: normal; font-variant: normal; font-size-adjust: none; font-language-override: normal; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"> </span></span></span>**<span style="font-family: 'Aptos Display',sans-serif; mso-fareast-font-family: 'Aptos Display'; mso-bidi-font-family: 'Aptos Display'; mso-bidi-font-weight: bold;"><span style="mso-list: Ignore;"><span style="font-style: normal; font-variant: normal; font-size-adjust: none; font-language-override: normal; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"> </span></span></span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Une carte Arduino.</span>

<span style="font-family: 'Aptos Display',sans-serif; mso-fareast-font-family: 'Aptos Display'; mso-bidi-font-family: 'Aptos Display'; mso-bidi-font-weight: bold;"><span style="mso-list: Ignore;">-<span style="font-style: normal; font-variant: normal; font-size-adjust: none; font-language-override: normal; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"> </span></span></span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Deux LED (diodes lumineuses) : LED 1 et LED 2.</span>

<span style="font-family: 'Aptos Display',sans-serif; mso-fareast-font-family: 'Aptos Display'; mso-bidi-font-family: 'Aptos Display'; mso-bidi-font-weight: bold;"><span style="mso-list: Ignore;">-<span style="font-style: normal; font-variant: normal; font-size-adjust: none; font-language-override: normal; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"> </span></span></span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Deux photorésistances (LDR) : LDR 1 et LDR 2.</span>

<span style="font-family: 'Aptos Display',sans-serif; mso-fareast-font-family: 'Aptos Display'; mso-bidi-font-family: 'Aptos Display'; mso-bidi-font-weight: bold;"><span style="mso-list: Ignore;">-<span style="font-style: normal; font-variant: normal; font-size-adjust: none; font-language-override: normal; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"> </span></span></span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Des résistances pour les LDR et les LED (100 <span class="BxUVEf ILfuVd" lang="fr"><span class="hgKElc pOOWX">Ω </span></span>).</span>

#### **<span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)</span>**

**[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)**

- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Première expérience : </span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Nous avons essayé de programmer le montage pour que la LED 1 s’allume quand on cache la LDR 1, et que la LED 2 s’allume uniquement quand on cache en même temps la LDR 1 et la LDR 2.</span>

<details id="bkmrk-d%C3%A9tails-de-l%27exp%C3%A9rie-1"><summary>Détails de l'expérience 1</summary>

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Objectif du programme au départ</span>**

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Au début, nous voulions créer un comportement « combiné » avec les deux LDR :</span>**

- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Quand on cache seulement la LDR 1, la LED 1 doit s’allumer.</span>**
- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Quand on cache la LDR 1 ET la LDR 2 en même temps (main sur les deux), c’est la LED 2 qui doit s’allumer.</span>**
- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Quand on cache seulement la LDR 2 sans cacher la LDR1, les diodes ne s'allument pas.</span>**

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Autrement dit, la LED 2 devait dépendre d’une condition plus complexe, utilisant les deux capteurs ensemble (une sorte de « si LDR1 est cachée ET LDR2 est cachée alors allumer LED2 »).</span>**

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Problèmes rencontrés</span>**

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Nous n’avons pas réussi à faire fonctionner cette logique comme prévu.  
Les difficultés venaient probablement de :</span>**

- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">La condition combinée avec les deux LDR en même temps.</span>**
- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">La structure des conditions dans le code (ordre des if, else if, etc.).</span>**

</details><p class="callout info">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Nous n'avons pas réussis la 1ère expérience, on l'a donc simplifié </span>**</p>

- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Deuxième expérience :</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> Nous avons simplifié le programme pour que, quand on cache la LDR 1, la LED 1 s’allume, et quand on cache la LDR 2, la LED 2 s’allume. </span>

<details id="bkmrk-d%C3%A9tails-de-l%27exp%C3%A9rie-2"><summary>Détails de l'expérience 2</summary>

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Modification du programme :</span>**

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Vous avez choisi une logique beaucoup plus simple et directe :</span>**

- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Quand on cache la LDR 1, la LED 1 s’allume.</span>**
- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Quand on cache la LDR 2, la LED 2 s’allume.</span>**

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Chaque photorésistance contrôle donc maintenant « sa » LED, indépendamment de l’autre capteur.</span>**


#### **<span style="color: rgb(230, 126, 35);"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"><span style="font-family: 'Aptos Display', sans-serif; color: rgb(0, 0, 0);">C[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)ode : </span></span></span>**

 **[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/TfXimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/TfXimage.png)**

**[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/7YIimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/7YIimage.png)**

### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)</span>**

**<span style="font-family: 'Aptos Display', sans-serif; color: rgb(0, 0, 0);">Montage :</span>**

**[![WhatsApp Image 2026-02-18 at 15.15.47.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/whatsapp-image-2026-02-18-at-15-15-47.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/whatsapp-image-2026-02-18-at-15-15-47.jpeg)**

#### <span style="color: rgb(230, 126, 35);"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"><span style="font-family: 'Aptos Display', sans-serif; color: rgb(0, 0, 0);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)</span></span></span>

**[![WhatsApp Image 2026-02-18 at 17.00.20.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/whatsapp-image-2026-02-18-at-17-00-20.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/whatsapp-image-2026-02-18-at-17-00-20.jpeg)**

**[![Montage expérience 2 séance 3 fablab.JPG](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/montage-experience-2-seance-3-fablab.JPG)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/montage-experience-2-seance-3-fablab.JPG)**

**![]()![]()**

</details><p class="callout danger">**Nous n'avons pas réussis à faire marcher notre 2ème expérience.**</p>

### **<span style="color: rgb(230, 126, 35);">Séance 4 (20 Fev) : </span>**

<p class="callout info">**<span style="color: rgb(0, 0, 0);">Résistances en fonction de la couleur des diodes : Vert = 10 k<span style="font-size: 11.0pt; line-height: 107%; font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: FR; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">Ω</span> ; Rouge = 1k<span style="font-size: 11.0pt; line-height: 107%; font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: FR; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">Ω</span> ; Bleu = 220 <span style="font-size: 11.0pt; line-height: 107%; font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: FR; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">Ω</span> </span>**</p>

**Objectif du montage 1 :** Ajouter un transistor NPN au circuit avec une seule LDR et une seule LED

<details id="bkmrk-d%C3%A9tail-de-l%27exp%C3%A9rien-1"><summary>Détail de l'expérience 1</summary>

### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)</span>**

**"Pour résoudre le problème de la séance précédente : la deuxième LED ne s'allume pas, nous avons ajouté au circuit un transistor NPN**

**[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/GIkimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/GIkimage.png)**

**Base (3): Borne de commande du transistor**

**Collectionneur (2): Terminal où le courant entre**

**Émetteur (1): Terminal où sort le courant**

<span style="text-decoration: underline;">**Circuit réalisé :** </span>

Lorsque la lumière éclaire la LDR, sa résistance chute, ce qui fait monter la tension au point VX selon le principe du diviseur de tension. Dès que cette tension atteint un seuil d'environ 0,6 V, il y a détection de lumière à la LDR 1 et un courant rentre dans la base du transistor NPN pour le rendre "passant". Le transistor agit alors comme un interrupteur fermé qui laisse circuler le courant du collecteur vers l'émetteur, ce qui allume la diode.

**[![BQ5image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/bq5image.png)<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"><span style="font-family: 'Aptos Display', sans-serif; color: rgb(0, 0, 0);"> </span></span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/bq5image.png)**

#### **[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)**

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"><span style="font-family: 'Aptos Display', sans-serif; color: rgb(0, 0, 0);">Code :</span></span>[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/kVMimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/kVMimage.png)**

**[<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"><span style="font-family: 'Aptos Display', sans-serif; color: rgb(0, 0, 0);"> Montage :</span></span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/bq5image.png)**

### <span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)</span>

**[![photo montage transitor 1.JPG](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/photo-montage-transitor-1.JPG)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/photo-montage-transitor-1.JPG)**

**[![Montage transisto avec doigt.JPG](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/montage-transisto-avec-doigt.JPG)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/montage-transisto-avec-doigt.JPG)[![Montage transistor sans doigt.JPG](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/montage-transistor-sans-doigt.JPG)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/montage-transistor-sans-doigt.JPG)**


</details>**Objectif du montage 2 :** Réaliser le montage de <span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">comportement « combiné » avec deux LDR, deux LED et deux transistors.</span>

### **<span style="color: rgb(230, 126, 35);">Séance 5 (27 Fev) : </span>**

**Objectif du début de séance : Refaire pas à pas le montage 2 de la séance dernière pour le réussir.**

<span style="color: rgb(53, 152, 219);">**Etape 1** :</span> on a refait l'expérience 1 de la semaine dernière

<span style="color: rgb(53, 152, 219);">**Etape 2 :** </span>On duplique le circuit en ajoutant une deuxième LED et sa résistance, une deuxième LDR et sa résistance, un second transistor. Pour vérifier que tout marche bien on fait blink les deux LED.

<p class="callout info">Il faut deux transistors dans le circuit.</p>

<details id="bkmrk-d%C3%A9tails-exp%C3%A9rience-2"><summary>Détails de l'expérience 2</summary>

#### **[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)**

<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"><span style="font-family: 'Aptos Display', sans-serif; color: rgb(0, 0, 0);">**Code :**</span></span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/sViimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/sViimage.png)

### <span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)</span>

<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"><span style="font-family: 'Aptos Display', sans-serif; color: rgb(0, 0, 0);">**Montage :**</span></span>

[![WhatsApp Image 2026-02-27 at 15.17.09.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/whatsapp-image-2026-02-27-at-15-17-09.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/whatsapp-image-2026-02-27-at-15-17-09.jpeg)[![WhatsApp Image 2026-02-27 at 15.17.10.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/scaled-1680-/whatsapp-image-2026-02-27-at-15-17-10.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-02/whatsapp-image-2026-02-27-at-15-17-10.jpeg)

</details><span style="color: rgb(53, 152, 219);">**Etape 3** : </span>On code sur Arduino de façon à faire le montage de <span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">comportement « combiné » des deux LDR avec deux transistors.</span>

<details id="bkmrk-d%C3%A9tail-de-l%27exp%C3%A9rien-3"><summary>Détail de l'expérience 3</summary>

#### **[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)**

</details>**Nouvel objectif :**  (EXP 3) Se rapprocher du but final de montage dans le tube

= enlever les LED et transistors et prendre les informations de la LDR directement.

<details id="bkmrk-d%C3%A9tail-de-l%27exp%C3%A9rien"><summary>Détail de l'expérience 4</summary>

### <span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)</span>

[![IMG_2300.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/scaled-1680-/img-2300.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-03/img-2300.jpg)

</details>### **<span style="color: rgb(230, 126, 35);">Séance 6 (13 Mars) : </span>**

<p class="callout info">Il faut des résistances de 10<span style="color: rgb(0, 0, 0);"><span style="font-size: 11.0pt; line-height: 107%; font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: FR; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">Ω avec les transistors</span></span></p>

<p class="callout warning">Problématique : Le nombre de capteurs LDRs dépasse le nombre d'entrées analogiques disponibles sur le microcontrôleur. Pour lire individuellement chaque capteur sans multiplier les câbles et les entrées, nous avons mis en place une stratégie de lecture alternée. </p>

<p class="callout success">Nous avons structuré les capteurs en deux groupes distincts, sur deux bordes différentes. Chaque broche analogique de l'Arduino est reliée à deux LDRs (la LDR A du groupe 1 et la LDR A du groupe 2).</p>

Pour éviter que les deux capteurs n'envoient leur signal simultanément sur la même broche, l'alimentation est envoyée sélectivement. Le but étant pour cela d’utiliser les transistors en tant que interrupteur. Pour visualiser l'expérience nous avons ajouté des LEDs.

<details id="bkmrk-d%C3%A9tail-de-l%27exp%C3%A9rien-4"><summary>Détail de l'expérience</summary>

### <span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)</span>

 ![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/embedded-image-t4g8vxwu.jpeg) ![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/embedded-image-b4aata1n.jpeg)

</details>### **<span style="color: rgb(230, 126, 35);">Séance 7 (20 Mars) : </span>**

**1. Horodatage des données (RTC)**

L'objectif est de passer d'une simple lecture de valeurs à un suivi environnemental exploitable. L'ajout d'une horloge RTC permet désormais d'associer chaque mesure d'érosion à une date et une heure précises.

- <p class="callout warning">Contrainte technique : Le module RTC utilise le protocole de communication I2C, ce qui mobilise impérativement les broches A4 (SDA) et A5 (SCL) de l'Arduino. </p>
- <p class="callout warning">Impact sur le design : Ces broches ne sont plus disponibles pour la lecture analogique des LDR, ce qui confirme l'importance de notre stratégie de multiplexage sur les autres broches analogiques restantes.  
    </p>

**2. Correction Transistors**

Lors des tests précédents, les transistors ne jouaient pas leur rôle d'interrupteurs électroniques.

<p class="callout success">Le circuit a été revu pour s'assurer que le courant passe vraiment dans transistors. Ils servent désormais de verrous pour n'alimenter qu'une seule "borde" à la fois.</p>

**3. Nouvelle architecture des bordes**

Le système est désormais segmenté en trois unités fonctionnelles :

- <span style="text-decoration: underline;">Borde de Référence </span>: Regroupe les éléments centraux (Module RTC, LDR de référence pour calibrer la luminosité ambiante, transistor)
- <span style="text-decoration: underline;">Borde 1 &amp; 2 :</span> Unités de mesure déportées comprenant chacune une LDR de mesure, sa résistance et son transistor de pilotage.

<details id="bkmrk-d%C3%A9tail-de-l%27exp%C3%A9rien-5"><summary>Détail de l'expérience</summary>

### <span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)</span>

<span style="font-weight: normal;"><span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 160px; height: 214px;">![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/embedded-image-92j7cbvl.jpeg) </span></span>

[![download.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/FNqdownload.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/FNqdownload.jpg)

</details><details id="bkmrk-code-utilis%C3%A9-explica"><summary>Code utilisé</summary>

#### **[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)**

<span style="text-decoration: underline;">Explication du code : </span>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E7oimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E7oimage.png)

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">LDR de référence (A0)</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : sert à détecter si on est en condition « jour » ou « nuit »</span>

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Module RTC DS1307</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : connexions I2C (SDA, SCL)</span>

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">La valeur du seuil :</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> est choisi en fonction de nos observations. </span>

**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Seuil 1</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : est ici un placeholder qui simule, dans cette version initiale, le seuil dynamique qui sera issu de la LDR de référence dans la version aboutie du programme.</span>

<div style="color: #dae3e3; background-color: #1f272a; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr1 = A1;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr2 = A2;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> plaque1 = </span><span style="color: #7fcbcd;">2</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> plaque2 = </span><span style="color: #7fcbcd;">3</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> plaqueref = </span><span style="color: #7fcbcd;">4</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrREF = A0;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> seuil1 = </span><span style="color: #7fcbcd;">300</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> seuil = </span><span style="color: #7fcbcd;">300</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;Wire.h&gt;</span></div><div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;I2C\_RTC.h&gt;</span></div><div><span style="color: #0ca1a6;">static</span><span style="color: #dae3e3;"> DS1307 RTC;</span></div>  
  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">setup</span><span style="color: #dae3e3;">() {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">115200</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #7f8c8d;"> // vérification au démarrage (une seule fois)</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!Serial);</span><span style="color: #7f8c8d;"> // Empêche le programme de commencer si le matériel est mal connecté dès le départ </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">();</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">();</span></div>  
<div><span style="color: #7f8c8d;"> // --- Boucle tant que la RTC n'est PAS détectée ---</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">())</span></div><div><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ RTC non détectée — vérifiez les connexions !"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">1000</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #7f8c8d;"> // --------------------------------------------------</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"✅ RTC détectée !"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">startClock</span><span style="color: #dae3e3;">();</span></div>  
<div><span style="color: #7f8c8d;"> // --- RÉGLAGE DE L’HEURE (UNE SEULE FOIS) ---</span></div><div><span style="color: #7f8c8d;"> // RTC.setDateTime(\_\_DATE\_\_, \_\_TIME\_\_);</span></div><div><span style="color: #7f8c8d;"> // -------------------------------------------</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #7f8c8d;"> // --- CONFIGURATION DES CAPTEURS ---</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr1, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr2, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;"> (ldrREF,INPUT);</span></div><div><span style="color: #7f8c8d;"> // --- CONFIGURATION DES SORTIES (mettre au cas ou même si pas necessaire normalement)</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(plaque1,OUTPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(plaque2, OUTPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(plaqueref, OUTPUT);</span></div><div><span style="color: #7f8c8d;"> // --- ÉTAT INITIAL ---</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaqueref, HIGH);</span></div><div><span style="color: #dae3e3;">}</span></div>  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">loop</span><span style="color: #dae3e3;">() {</span></div><div><span style="color: #7f8c8d;"> // --- Boucle tant que la RTC EST détectée ---</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()){</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">getDateTimeString</span><span style="color: #dae3e3;">());</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">", Unix Time: "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">getEpoch</span><span style="color: #dae3e3;">());</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">10000</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #7f8c8d;"> // Si on sort de la boucle, c’est que la RTC a été débranchée</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ RTC déconnectée !"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">10000</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #7f8c8d;"> // CODE POUR LA LDR DE REF</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()){</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurREF = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurREF &lt; seuil){</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"NUIT"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A0= "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurREF);</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, HIGH);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"JOUR"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A1= "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurREF);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeur1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr1);</span></div><div><span style="color: #dae3e3;"> </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeur1 &lt; seuil1){</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"ldr 1 caché"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A1= "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur1);</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"ldr 1 ON "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A1= "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur1);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeur2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr2);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A2= "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur2);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span></div>  
<div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">5000</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;">}</span></div><div><span style="color: #dae3e3;">}</span></div><div><span style="color: #dae3e3;">}</span></div></div></details>### **<span style="color: rgb(230, 126, 35);">Séance 8 (27 Mars) : </span>**

**1. Test de validation du prototype existant**

La séance a débuté par un test de confirmation sur le montage de la semaine précédente (RTC + 2 Bordes + Transistors).

**2. Évolution du Code**

<details id="bkmrk-explication-du-code-"><summary>Explication du code</summary>

<span style="color: rgb(0, 0, 0);">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Utilisation de switch/case : </span>**</span>

<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Plutôt qu'une succession de **IF** imbriqués, le code repose sur une machine à états finis. Six états sont définis dans un enum :</span>

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Verif\_RTC :</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> vérification de la RTC et lecture de la LDR de référence </span>

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">NUIT :</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> état passif, on relit simplement la LDR de référence </span>

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Test\_Bord\_1</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : test du premier bord avec LDR 1 </span>

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Test\_Bord\_2</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : test du second bord avec LDR 2 </span>

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Erreur\_FATALE</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : sécurité en cas de perte prolongée de la RTC </span>

<span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Default </span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">: filet de sécurité si l'état devient incohérent</span>

<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">On change d’état via <span style="color: rgb(186, 55, 42);">**etatActuel.**</span></span>

<span style="color: rgb(0, 0, 0);">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">La sécurité : </span>**</span>

- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"><span style="color: rgb(0, 0, 0);">Compteur d’erreurs RTC</span> :</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> A chaque déconnexion, on ajoute 1 à la variable **<span style="color: #c00000;">erreursRTC. </span>**<span style="color: black; mso-themecolor: text1;">Lorsqu’on atteint 10 erreurs soit le </span>**<span style="color: #c00000;">MAX\_ERREURS = 10, </span>**<span style="color: black; mso-themecolor: text1;">le système bascule en </span>**<span style="color: #c00000;">Erreur\_FATALE.<span style="mso-spacerun: yes;"> </span></span>**<span style="color: black; mso-themecolor: text1;">= On force l’extinction des plaques pour pas vider la batterie. </span></span>
- **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; color: black; mso-themecolor: text1;">Récupération automatique : </span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; color: black; mso-themecolor: text1;">si la RTC revient en ligne pendant l'état </span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; color: #c00000;">Erreur\_FATALE</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; color: black; mso-themecolor: text1;">, le compteur est remis à zéro et le système redémarre normalement.</span>
- <span style="color: rgb(0, 0, 0);">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">État default</span>**</span><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : si on obtiens une valeur incohérente dans la variable d'état, on retourne automatiquement à **<span style="color: #c00000;">Verif\_RTC</span>**<span style="color: #c00000;"> </span>après avoir coupé les plaques.</span>

</details><details id="bkmrk-le-code-%C2%A0nous-avons-"><summary>Le code</summary>

 Nous avons mal utilisez le <span style="color: #c586c0;">switch/case <span style="color: rgb(0, 0, 0);">en modifiant la variable etat Actuel directement dans nos cases, nous restions donc bloqué dans le 1er case</span></span>

<div style="color: #dae3e3; background-color: #1f272a; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;">  
<div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;Wire.h&gt;</span><span style="color: #dae3e3;"> </span><span style="color: #7f8c8d;">// Appel du protocole de communication </span></div>  
<div><span style="color: #7f8c8d;">// Appel de la bibliothèque RTC</span></div>  
<div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;I2C\_RTC.h&gt;</span></div>  
<div><span style="color: #0ca1a6;">static</span><span style="color: #dae3e3;"> DS1307 RTC;</span><span style="color: #7f8c8d;"> // déclaration du modèle de RTC</span></div>  
<div><span style="color: #7f8c8d;">// --- Variables de Pins ---</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr1 = A1;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr2 = A0;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> plaque1 = </span><span style="color: #7fcbcd;">2</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> plaque2 = </span><span style="color: #7fcbcd;">3</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> plaqueref = </span><span style="color: #7fcbcd;">4</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrREF = A2;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> seuil1 = </span><span style="color: #7fcbcd;">300</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> seuil = </span><span style="color: #7fcbcd;">300</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> rythme = </span><span style="color: #7fcbcd;">30000</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">enum</span><span style="color: #dae3e3;"> {"Verif\_RTC", "NUIT", "Test\_Bord\_1", "Test\_Bord\_2", "Test\_LDR\_REF", "Erreur\_FATALE" } etatActuel = </span><span style="color: #7fcbcd;">"Verif\_RTC"</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // Compteur de déconnexions</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> MAX\_ERREURS = </span><span style="color: #7fcbcd;">10</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // Seuil avant blocage de sécurité</span></div>  
  
  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">setup</span><span style="color: #dae3e3;">() {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">115200</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #7f8c8d;"> // vérification au démarrage (une seule fois)</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!Serial);</span><span style="color: #7f8c8d;"> // Empêche le programme de commencer si le matériel est mal connecté dès le départ </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">();</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">();</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // --- Boucle tant que la RTC n'est PAS détectée ---</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">())</span></div>  
<div><span style="color: #dae3e3;"> {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ RTC non détectée — vérifiez les connexions !"</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #7f8c8d;"> // --------------------------------------------------</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"✅ RTC détectée !"</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">startClock</span><span style="color: #dae3e3;">();</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // --- RÉGLAGE DE L’HEURE (UNE SEULE FOIS) ---</span></div>  
<div><span style="color: #7f8c8d;"> // RTC.setDateTime(\_\_DATE\_\_, \_\_TIME\_\_);</span></div>  
<div><span style="color: #7f8c8d;"> // -------------------------------------------</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // --- CONFIGURATION DES CAPTEURS ---</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr1, INPUT);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr2, INPUT);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldrREF,INPUT);</span></div>  
<div><span style="color: #7f8c8d;"> // --- CONFIGURATION DES SORTIES (mettre au cas ou même si pas necessaire normalement)</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(plaque1,OUTPUT);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(plaque2, OUTPUT);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(plaqueref, OUTPUT);</span></div>  
<div><span style="color: #7f8c8d;"> // --- ÉTAT INITIAL ---</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaqueref, HIGH);</span></div>  
  
  
<div><span style="color: #dae3e3;">}</span></div>  
  
  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">loop</span><span style="color: #dae3e3;">() {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">switch</span><span style="color: #dae3e3;"> (etatActuel){</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">"Verif\_RTC"</span><span style="color: #dae3e3;"> :</span></div>  
<div><span style="color: #7f8c8d;"> // verification de la RTC</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()){</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">getDateTimeString</span><span style="color: #dae3e3;">());</span><span style="color: #7f8c8d;"> //lecture du temps de manière lisible : String</span></div>  
<div><span style="color: #7f8c8d;"> //Serial.print (",Unix Time: ");</span></div>  
<div><span style="color: #7f8c8d;"> //Serial.println (RTC.getEpoch()); // lecture pour la machine : Unix Timestamp</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // vérification de la LDR de réference</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurREF = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurREF &lt; seuil){</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = NUIT;</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"NUIT"</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurREF);</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Test\_Bord\_1; </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"JOUR"</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurREF);</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div>  
<div><span style="color: #dae3e3;"> erreursRTC++;</span><span style="color: #7f8c8d;"> // On incrémente le compteur d'erreur</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ RTC absente ! Tentative : "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(erreursRTC);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (erreursRTC &gt;= MAX\_ERREURS) {</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Erreur\_FATALE;</span><span style="color: #7f8c8d;"> // On coupe tout !</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> //important pour pas glisser dans l'action suivante sans vérifer celle la </span></div>  
  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> NUIT : </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;"> (</span><span style="color: #7fcbcd;">"NUIT | A2= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurREF = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurREF);</span><span style="color: #7f8c8d;"> // ou Serial.println(analogRead(ldrREF)); ?</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span><span style="color: #7f8c8d;"> // on revérifie la RTC et LDR REF</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;"> ;</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Test\_Bord\_1 : </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeur1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr1);</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeur1 &lt; seuil1){</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"LDR 1 caché | A1= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur1);</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span><span style="color: #7f8c8d;"> // vérification de la RTC et de la LDR REF </span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"LDR 1 ON | A1= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur1);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Test\_Bord\_2;</span></div>  
<div><span style="color: #7f8c8d;"> // on test la bord 2 après avoir éteintla bord 1 car lumière</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Test\_Bord\_2 : </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeur2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr2);</span></div>  
<div><span style="color: #dae3e3;"> </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeur2 &lt; seuil1){</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"LDR 2 caché | A0= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur2);</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span><span style="color: #7f8c8d;"> // vérification de la RTC et de la LDR REF </span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"LDR 2 ON | A0= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur2);</span></div>  
<div><span style="color: #7f8c8d;"> // fin du cycle , on étaint et on recommence </span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span><span style="color: #7f8c8d;"> // on test la bord 2 après avoir éteintla bord 1 car lumière</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Erreur\_FATALE : </span></div>  
<div><span style="color: #7f8c8d;"> // Boucle de sécurité = on force extinction des plaques</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"❌ ERREUR CRITIQUE : RTC perdue. Système stoppé."</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #7f8c8d;"> // On vérifie quand même si la RTC revient toutes les 10 secondes</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"✅ RTC retrouvée ! Redémarrage..."</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;"> (rythme);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">default</span><span style="color: #dae3e3;"> :</span></div>  
<div><span style="color: #7f8c8d;"> // je ne sais pas ce qui ce passe donc je recommence </span></div>  
<div><span style="color: #7f8c8d;"> // SI ON ARRIVE ICI, C'EST QUE L'ÉTAT EST INCONNU OU INCOHÉRENT</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ État inconnu ! Retour à la sécurité."</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span></div><div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span><span style="color: #7f8c8d;"> // On réinitialise pour débloquer</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;">}</span></div>  
<div><span style="color: #dae3e3;">}</span></div>  
<div><span style="color: #dae3e3;">}</span></div></div></details><p class="callout danger">**Le code ne marche pas** </p>

**=&gt;** Nous en avons déduit qu'il n'était pas possible de changer la variable **<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"><span style="color: rgb(186, 55, 42);">etatActuel </span></span>**<span style="font-family: 'Aptos Display', sans-serif; color: rgb(0, 0, 0);">n'était pas modifiabledirectement dans les cases, car nous restons bloqués dans le 1er case. </span>

<details id="bkmrk-les-erreurs-du-code-"><summary>Les erreurs du code et les corrections</summary>

<table border="0" cellpadding="0" cellspacing="3" class="MsoNormalTable" style="width: 100%;"><thead><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes;"><td style="padding: 0.75pt; width: 1.60311%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">\#</span>**

</td><td style="padding: 0.75pt; width: 48.239%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Problème</span>**

</td><td style="padding: 0.75pt; width: 50.2793%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Conséquence</span>**

</td></tr></thead><tbody><tr style="mso-yfti-irow: 1;"><td style="padding: 0.75pt; width: 1.60311%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">1</span>

</td><td style="padding: 0.75pt; width: 48.239%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Guillemets dans l'enum</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : enum {"Verif\_RTC", "NUIT", ...}</span>

</td><td style="padding: 0.75pt; width: 50.2793%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Les états deviennent des chaînes de caractères au lieu d'identifiants → ne compile pas</span>

</td></tr><tr style="mso-yfti-irow: 2;"><td style="padding: 0.75pt; width: 1.60311%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">2</span>

</td><td style="padding: 0.75pt; width: 48.239%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Guillemets dans les cases</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : case "Verif\_RTC" :</span>

</td><td style="padding: 0.75pt; width: 50.2793%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Le switch ne peut pas comparer des chaînes → transitions impossibles</span>

</td></tr><tr style="mso-yfti-irow: 3;"><td style="padding: 0.75pt; width: 1.60311%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">3</span>

</td><td style="padding: 0.75pt; width: 48.239%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Variables déclarées sans { } dans les case</span>**

</td><td style="padding: 0.75pt; width: 50.2793%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Erreur de compilation *"crosses initialization"*</span>

</td></tr><tr style="mso-yfti-irow: 4;"><td style="padding: 0.75pt; width: 1.60311%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">4</span>

</td><td style="padding: 0.75pt; width: 48.239%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Accolade } manquante</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> dans le else de Test\_Bord\_2</span>

</td><td style="padding: 0.75pt; width: 50.2793%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Les cas suivants (Erreur\_FATALE, default) deviennent imbriqués et invisibles pour le switch</span>

</td></tr><tr style="mso-yfti-irow: 5;"><td style="padding: 0.75pt; width: 1.60311%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">5</span>

</td><td style="padding: 0.75pt; width: 48.239%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Accolade } en trop</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> à la fin du fichier</span>

</td><td style="padding: 0.75pt; width: 50.2793%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Structure du programme cassée</span>

</td></tr><tr style="mso-yfti-irow: 6;"><td style="padding: 0.75pt; width: 1.60311%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">6</span>

</td><td style="padding: 0.75pt; width: 48.239%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">enum incohérent</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> : contient Test\_LDR\_REF (inutilisé) mais pas Erreur\_FATALE (utilisé)</span>

</td><td style="padding: 0.75pt; width: 50.2793%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Le compilateur ne reconnaît pas Erreur\_FATALE</span>

</td></tr><tr style="mso-yfti-irow: 7; mso-yfti-lastrow: yes;"><td style="padding: 0.75pt; width: 1.60311%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">7</span>

</td><td style="padding: 0.75pt; width: 48.239%;">**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Variable valeurREF redéclarée</span>**<span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;"> dans plusieurs cases sans isolation</span>

</td><td style="padding: 0.75pt; width: 50.2793%;"><span style="font-family: 'Aptos Display',sans-serif; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin;">Conflit de noms</span>

</td></tr></tbody></table>

<p class="callout success">Code corriger ! **MAIS PAS TESTE** </p>

<div style="color: #dae3e3; background-color: #1f272a; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;Wire.h&gt;</span><span style="color: #dae3e3;"> </span><span style="color: #7f8c8d;">// Protocole de communication I2C</span></div>  
<div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;I2C\_RTC.h&gt;</span><span style="color: #dae3e3;"> </span><span style="color: #7f8c8d;">// Bibliothèque RTC</span></div>  
<div><span style="color: #0ca1a6;">static</span><span style="color: #dae3e3;"> DS1307 RTC;</span><span style="color: #7f8c8d;"> // Déclaration du modèle de RTC</span></div>  
  
  
<div><span style="color: #7f8c8d;">// --- Variables de Pins ---</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr1 = A1;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr2 = A0;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> plaque1 = </span><span style="color: #7fcbcd;">2</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> plaque2 = </span><span style="color: #7fcbcd;">3</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> plaqueref = </span><span style="color: #7fcbcd;">4</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrREF = A2;</span></div>  
  
  
<div><span style="color: #7f8c8d;">// --- Seuils ---</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> seuil = </span><span style="color: #7fcbcd;">300</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // Seuil jour/nuit pour la LDR de référence</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> seuil1 = </span><span style="color: #7fcbcd;">300</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // Seuil pour les LDR de bord (à terme dérivé de ldrREF)</span></div>  
  
  
<div><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> rythme = </span><span style="color: #7fcbcd;">30000</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // 30 secondes</span></div>  
  
  
<div><span style="color: #0ca1a6;">enum</span><span style="color: #dae3e3;"> Etat {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Verif\_RTC</span><span style="color: #dae3e3;">,</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">NUIT</span><span style="color: #dae3e3;">,</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Test\_Bord\_1</span><span style="color: #dae3e3;">,</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Test\_Bord\_2</span><span style="color: #dae3e3;">,</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Erreur\_FATALE</span></div>  
<div><span style="color: #dae3e3;">};</span></div>  
<div><span style="color: #dae3e3;">Etat etatActuel = Verif\_RTC;</span></div>  
  
  
<div><span style="color: #7f8c8d;">// --- Gestion de la sécurité ---</span></div>  
<div><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> MAX\_ERREURS = </span><span style="color: #7fcbcd;">10</span><span style="color: #dae3e3;">;</span></div>  
  
  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">setup</span><span style="color: #dae3e3;">() {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">115200</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!Serial);</span><span style="color: #7f8c8d;"> // Attend que la liaison série soit prête</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">();</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">();</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // Boucle tant que la RTC n'est PAS détectée</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ RTC non détectée — vérifiez les connexions !"</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"✅ RTC détectée !"</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">startClock</span><span style="color: #dae3e3;">();</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // --- RÉGLAGE DE L'HEURE (UNE SEULE FOIS) ---</span></div>  
<div><span style="color: #7f8c8d;"> // RTC.setDateTime(\_\_DATE\_\_, \_\_TIME\_\_);</span></div>  
<div><span style="color: #7f8c8d;"> // -------------------------------------------</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // --- Configuration des entrées ---</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr1, INPUT);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr2, INPUT);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldrREF, INPUT);</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // --- Configuration des sorties ---</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(plaque1, OUTPUT);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(plaque2, OUTPUT);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(plaqueref, OUTPUT);</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // --- État initial ---</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaqueref, HIGH);</span></div>  
<div><span style="color: #dae3e3;">}</span></div>  
  
  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">loop</span><span style="color: #dae3e3;">() {</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">switch</span><span style="color: #dae3e3;"> (etatActuel) {</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // ============================================================</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Verif\_RTC : {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">getDateTimeString</span><span style="color: #dae3e3;">());</span></div>  
<div><span style="color: #7f8c8d;"> // Serial.print(",Unix Time: ");</span></div>  
<div><span style="color: #7f8c8d;"> // Serial.println(RTC.getEpoch());</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // Vérification de la LDR de référence</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurREF = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurREF &lt; seuil) {</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = NUIT;</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"NUIT | A2= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurREF);</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Test\_Bord\_1;</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"JOUR | A2= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurREF);</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div>  
<div><span style="color: #dae3e3;"> erreursRTC++;</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ RTC absente ! Tentative : "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(erreursRTC);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (erreursRTC &gt;= MAX\_ERREURS) {</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Erreur\_FATALE;</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // ============================================================</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> NUIT : {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurREF = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"NUIT | A2= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurREF);</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span><span style="color: #7f8c8d;"> // On revérifie la RTC et la LDR REF</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // ============================================================</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Test\_Bord\_1 : {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeur1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr1);</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeur1 &lt; seuil1) {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"LDR 1 caché | A1= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur1);</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"LDR 1 ON | A1= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur1);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span><span style="color: #7f8c8d;"> // On éteint avant de passer à l'autre bord</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Test\_Bord\_2;</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #7f8c8d;"> // ============================================================</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Test\_Bord\_2 : {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeur2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr2);</span></div>  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeur2 &lt; seuil1) {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"LDR 2 caché | A0= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur2);</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"LDR 2 ON | A0= "</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeur2);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span><span style="color: #7f8c8d;"> // Fin de cycle, on éteint</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // ============================================================</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Erreur\_FATALE : {</span></div>  
<div><span style="color: #7f8c8d;"> // Sécurité : on force l'extinction des plaques</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"❌ ERREUR CRITIQUE : RTC perdue. Système stoppé."</span><span style="color: #dae3e3;">);</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // On vérifie si la RTC revient</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"✅ RTC retrouvée ! Redémarrage..."</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
  
<div><span style="color: #7f8c8d;"> // ============================================================</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">default</span><span style="color: #dae3e3;"> : {</span></div>  
<div><span style="color: #7f8c8d;"> // Si on arrive ici, c'est que l'état est inconnu </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ État inconnu ! Retour à la sécurité."</span><span style="color: #dae3e3;">);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque1, LOW);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(plaque2, LOW);</span></div>  
<div><span style="color: #dae3e3;"> etatActuel = Verif\_RTC;</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;">}</span></div></div></details>### <span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)</span>

**3. Début de la conception mécanique : La barrette de support**

Nous avons lancé la création du support physique qui sera glissé dans le tube en acrylique.

<span style="text-decoration: underline;">Outil :</span> OpenSCAD (conception 3D par programmation)

Objectif : Créer une "barrette" rigide permettant de placer le montage électronique gravé afin de le faire coulisser dans le tube et le récupérer facilement.

<p class="callout warning"><span style="text-decoration: underline;">Contraintes de design : </span>La barrette doit épouser la forme courbe du tube (diamètre interne). Il faut prévoir des passages pour le câblage en dessous et créer des barrières opaques entre les LDR pour éviter qu’une lumière entrante ne fausse les détection de lumières des LDR qui sont encore dans le substrats.</p>

<details id="bkmrk-1er-prototype"><summary>1er prototype</summary>

### <span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)</span>

<span id="bkmrk--39" style="font-weight: normal;"><span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 383px; height: 460px;">[![image (1).png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/image-1.png)<span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 383px; height: 460px;">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/mZ2image.png)</span>](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/image-1.png)</span></span>

<span style="font-weight: normal;"><span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 383px; height: 460px;"><span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 383px; height: 460px;"><span id="bkmrk--40" style="font-weight: normal;"><span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 383px; height: 460px;">[![image (2).png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/image-2.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/image-2.png)</span></span></span></span></span>

</details>

### **<span style="color: rgb(230, 126, 35);">Séance 9 (3 Avril) :</span>**



### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)</span>**

**[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)1er objectif de la séance :** Étude de la sensibilité de la LDR selon le milieu et l'intensité

- Caractériser la sensibilité du capteur LDR
- Identifier les valeurs extrêmes
- Analyser l'impact de l'indice de turbidité de l'eau sur la transmission du flux lumineux.

<details id="bkmrk-code-utilis%C3%A9-code-qu"><summary>Code utilisé</summary>

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)<span style="text-decoration: underline;"><span style="color: rgb(0, 0, 0); text-decoration: underline;">Code qui nous permet juste de lire la LDR : </span></span>

<div style="color: #dae3e3; background-color: #1f272a; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">setup</span><span style="color: #dae3e3;">() {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">9600</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(A0,INPUT);</span></div><div><span style="color: #dae3e3;">}</span></div>  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">loop</span><span style="color: #dae3e3;">() {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrvalue = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(A0);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"LDR = "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(ldrvalue);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">10000</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;">}</span></div></div></details><details id="bkmrk-mat%C3%A9riel-ldr-%28photor"><summary>Matériel</summary>

- LDR (Photorésistance) + résistance
- Carte Arduino et breadbord
- 2 béchers
- Potence
- les différentes eaux
- flash lumineux
- Code simple (lecture analogique) via microcontrôleur.

</details><details id="bkmrk-protocole-l%27exp%C3%A9rien"><summary>Protocole</summary>

### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)</span>**

L'expérience consiste à relever l'intensité captée dans 6 milieux ou conditions différents :

1. Référence Obscurité : LDR cachée (étalonnage du point 0 %).
2. Air libre : Sans obstacle.
3. Air libre + Bécher : Pour isoler l'impact du verre seul.
4. Eau transparente : Milieu liquide limpide.
5. Eau trouble niv 1 : Eau avec légère turbidité.
6. Eau trouble niv 2 : Eau avec une turbidité un peu plus forte.
7. Eau trouble niv 3 : Forte concentration de particules.

-&gt; L’opacité a été réalisée avec de la terre

**Standardisation des mesures :**

Chaque test est effectué avec la lumière ambiante uniquement, puis avec un flash lumineux. La distance entre la source (flash) et la LDR est maintenue identique pour tous les essais.

Pour chaque condition, 10 mesures sont réalisées (intervalle de 10 secondes entre chaque relevé) afin de calculer une moyenne.

[![IMG_2653.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/img-2653.jpg) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/img-2653.jpg)[![IMG_2655.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/img-2655.jpg) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/img-2655.jpg)[![IMG_2656.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/img-2656.jpg) ](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/img-2656.jpg)[![IMG_2662.jpg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/img-2662.jpg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/img-2662.jpg)

</details>**2e objectif de la séance :** Réaliser un schéma plus complet et précis de la carte électronique vue de dessous et de dessus.

### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)</span>[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)**

[![WhatsApp Image 2026-05-28 at 16.29.57.jpeg](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/obNwhatsapp-image-2026-05-28-at-16-29-57.jpeg)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/obNwhatsapp-image-2026-05-28-at-16-29-57.jpeg)



### **<span style="color: rgb(230, 126, 35);">Séance 10 (10 Avril) :</span>**

**1er objectif :** Mettre en forme les résultats des expériences de la séance précédente sous forme d'histogrammes

<details id="bkmrk-r%C3%A9sultats-des-exp%C3%A9ri"><summary>Résultats des expériences de mesure d'intensité par la LDR</summary>

### **<span style="color: rgb(230, 126, 35);">![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)</span>**

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/ozWimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/ozWimage.png)

Nous avons ensuite réalisé un diagramme du % de chute d'intensité lumineuse en fonction des différents milieux.

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/scaled-1680-/EkMimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/EkMimage.png)

</details>**2e objectif :** Apprendre à utiliser <span style="text-decoration: underline;">tinkercad</span> pour réaliser des schéma précis

<details id="bkmrk-sch%C3%A9ma-tinkercad"><summary>Schéma tinkercad</summary>

### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)</span>**

<span id="bkmrk--52" style="font-weight: normal;"><span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 242px; height: 201px;">![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/embedded-image-mmyls4sz.png)</span></span>

![](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-04/embedded-image-b15cdpy5.png)

</details>**3eme objectif :** Amélioration du code

<p class="callout info">Nouvelle approche de la FONCTION SWITCH/CASE</p>

<span style="color: rgb(185, 106, 217);">**Explication du code :** </span>

- <span style="color: rgb(0, 0, 0);">On vérifie la RTC a chaque boucle </span>

<span style="color: rgb(0, 0, 0);">À chaque cycle, on lit toutes les LDR de référence d'un coup selon celle qui capte de la lumière ou non on choisit directement le case dans lequel on va aller </span>

<details id="bkmrk-code-switch%2Fcase-nou"><summary>CODE Switch/Case nouvelle approche</summary>

### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)</span>**

<div style="color: #dae3e3; background-color: #1f272a; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div>  
</div><div>  
</div><div>  
</div><div>  
</div><div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;Wire.h&gt;</span><span style="color: #dae3e3;"> </span><span style="color: #7f8c8d;">// Appel du protocole de communication </span></div><div><span style="color: #7f8c8d;">// Appel de la bibliothèque RTC</span></div><div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;I2C\_RTC.h&gt;</span></div><div><span style="color: #0ca1a6;">static</span><span style="color: #dae3e3;"> DS1307 RTC;</span><span style="color: #7f8c8d;"> // déclaration du modèle de RTC</span></div>  
<div><span style="color: #7f8c8d;">// A4 = SDA et A5 = SCL ==&gt; RTC </span></div>  
<div><span style="color: #7f8c8d;">// --- Variables de Pins ---</span></div><div><span style="color: #7f8c8d;">// --LDR - BORD 1 --</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr1\_B1 = A0;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr2\_B1 = A1;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr3\_B1 = A2;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr4\_B1 = A3;</span></div>  
<div><span style="color: #7f8c8d;">// --LDR - BORD 2 --</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr1\_B2 = A0;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr2\_B2 = A1;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr3\_B2 = A2;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr4\_B2 = A3;</span></div>  
<div><span style="color: #7f8c8d;">// -- LDR - BORD REF --</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrREF0 = A0;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrREF1 = A1;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrREF2 = A2;</span></div>  
<div><span style="color: #7f8c8d;">// -- BORD / TRANSISTORS -- </span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">bord1</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">2</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">bord2</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">3</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">bordREF</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">4</span></div>  
<div><span style="color: #7f8c8d;">//-- SEUIL-- </span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">seuilREF</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">200</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">seuil</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">400</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">rythme</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">10000</span></div>  
<div><span style="color: #7f8c8d;">//================================================</span></div><div><span style="color: #7f8c8d;">// --- ETATs DE CASE--- </span></div><div><span style="color: #7f8c8d;">//================================================</span></div><div><span style="color: #0ca1a6;">enum</span><span style="color: #dae3e3;"> Etat {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">NUIT</span><span style="color: #dae3e3;">, </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Test\_Bord\_1</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Test\_Bord\_2</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Test\_Bord\_REF</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Pas\_Erosion</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Erreur\_FATALE</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;">};</span></div><div><span style="color: #dae3e3;">Etat etatActuel = Test\_Bord\_REF;</span></div>  
<div><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // Compteur de déconnexions</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> MAX\_ERREURS = </span><span style="color: #7fcbcd;">10</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // Seuil avant blocage de sécurité</span></div><div><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> nbDetectes = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // le nbr de LDRs détectées pour évaluer l'évolution de l'érosion de la berge /// ON COMPTE REF1 ET REF2</span></div>  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">setup</span><span style="color: #dae3e3;">() {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">115200</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #7f8c8d;"> // vérification au démarrage (une seule fois)</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!Serial);</span><span style="color: #7f8c8d;"> // Empêche le programme de commencer si le matériel est mal connecté dès le départ </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">();</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">();</span></div>  
<div><span style="color: #7f8c8d;"> // --- Boucle tant que la RTC n'est PAS détectée ---</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ RTC non détectée — vérifiez les connexions !"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #7f8c8d;"> // --------------------------------------------------</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"✅ RTC détectée !"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">startClock</span><span style="color: #dae3e3;">();</span></div>  
<div><span style="color: #7f8c8d;"> // --- RÉGLAGE DE L’HEURE (UNE SEULE FOIS) ---</span></div><div><span style="color: #7f8c8d;"> // RTC.setDateTime(\_\_DATE\_\_, \_\_TIME\_\_);</span></div><div><span style="color: #7f8c8d;"> // -------------------------------------------</span></div>  
<div><span style="color: #7f8c8d;"> // --- CONFIGURATION DES CAPTEURS --</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #7f8c8d;"> // Pas besoin de mettre les INPUT (mais préférable)</span></div>  
<div><span style="color: #7f8c8d;"> // --BORD 1-- </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr1\_B1, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr2\_B1, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr3\_B1, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr4\_B1, INPUT);</span></div><div><span style="color: #7f8c8d;"> // --BORD 2--</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr1\_B2, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr2\_B2, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr3\_B2, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr4\_B2, INPUT);</span></div>  
<div><span style="color: #7f8c8d;"> // --BORD REF-- </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldrREF0,INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldrREF1,INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldrREF2,INPUT);</span></div>  
<div><span style="color: #7f8c8d;">// --- CONFIGURATION DES SORTIES (mettre au cas ou même si pas necessaire normalement)</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(bord1, OUTPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(bord2, OUTPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(bordREF, OUTPUT);</span></div><div><span style="color: #7f8c8d;">// --- ÉTAT INITIAL ---</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord1, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord2, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, HIGH);</span></div><div><span style="color: #dae3e3;">}</span></div>  
  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">loop</span><span style="color: #dae3e3;">() {</span></div><div><span style="color: #7f8c8d;"> // ==============================================</span></div><div><span style="color: #7f8c8d;"> // Détermination de L'ETAT en vérifiant les LDR DE REF </span></div><div><span style="color: #7f8c8d;"> // ==============================================</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (!</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div><div><span style="color: #dae3e3;"> erreursRTC++;</span><span style="color: #7f8c8d;"> // On incrémente le compteur d'erreur</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"RTC deconnectee !"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;"> (rythme);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (erreursRTC &gt;= MAX\_ERREURS) {</span></div><div><span style="color: #dae3e3;"> etatActuel = Erreur\_FATALE;</span><span style="color: #7f8c8d;"> // On coupe tout ! pour pas vider la baterie </span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">getDateTimeString</span><span style="color: #dae3e3;">());</span><span style="color: #7f8c8d;"> //lecture du temps de manière lisible : String</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">getEpoch</span><span style="color: #dae3e3;">());</span><span style="color: #7f8c8d;"> // lecture pour la machine</span></div><div><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #dae3e3;"> nbDetectes = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #7f8c8d;"> //----Vérification de la LDR de REF0 =&gt; donne le SEUIL-----</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> REF0 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF0);</span></div><div><span style="color: #dae3e3;"> </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (REF0 &lt; seuil){</span></div><div><span style="color: #dae3e3;"> etatActuel = NUIT;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"NUIT"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"JOUR REF0 "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(REF0);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> REF2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF2);</span></div><div><span style="color: #dae3e3;"> </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (REF2 &gt; seuil){</span></div><div><span style="color: #dae3e3;"> etatActuel = Test\_Bord\_2;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"JOUR REF2 "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(REF2);</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> REF1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF1);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;">(REF1 &gt; seuil){</span></div><div><span style="color: #dae3e3;"> etatActuel = Test\_Bord\_1;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"JOUR REF1"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(REF1);</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span></div><div><span style="color: #dae3e3;"> etatActuel = Pas\_Erosion ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"pas d'érosion"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;"> (rythme);</span></div><div><span style="color: #dae3e3;"> } </span></div>  
<div><span style="color: #7f8c8d;"> // ==================================================</span></div><div><span style="color: #7f8c8d;"> // Execution de Switch/Case</span></div><div><span style="color: #7f8c8d;"> // ==================================================</span></div>  
<div><span style="color: #c586c0;">switch</span><span style="color: #dae3e3;"> (etatActuel){</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> NUIT:{</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">" | NUIT - LDRs Détectés: "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(nbDetectes);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Test\_Bord\_1:{</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"bord 1 allumé"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord1, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr1\_B1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr1\_B1);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr1\_B1 &lt; seuil){</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A0= "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> //LDR1 PAS ERODE</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurldr1\_B1);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A0= erodé "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> //LDR1 ERODE +1</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurldr1\_B1);</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr2\_B1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr2\_B1);</span></div><div><span style="color: #7f8c8d;"> /\*Serial.print("A1= ");</span></div><div><span style="color: #7f8c8d;"> Serial.println(valeur2);\*/</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr2\_B1&lt; seuil){ </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"ldr 2 caché "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> //LDR2 PAS ERODE </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span><span style="color: #7f8c8d;"> // LDR2 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr3\_B1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr3\_B1);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr3\_B1 &lt; seuil){</span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 3 caché "); LDR3 PAS ERODE </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span><span style="color: #7f8c8d;"> // LDR3 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr4\_B1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr4\_B1);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr4\_B1 &lt; seuil){</span><span style="color: #7f8c8d;"> // LDR4 PAS ERODE</span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 4 caché ");</span></div><div><span style="color: #dae3e3;"> }</span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span><span style="color: #7f8c8d;"> // LDR4 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> } }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">" | LDRs Détectés: "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(nbDetectes);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord1, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, HIGH);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Test\_Bord\_2:{</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"bord 2 allumé"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord2, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr1\_B2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr1\_B2);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr1\_B2 &lt; seuil){</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A0= "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> // LDR1 PAS ERODE</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurldr1\_B2);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A0 - B2 = erodé "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> // LDR1 ERODE +1</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurldr1\_B2);</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr2\_B2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr2\_B2);</span></div><div><span style="color: #7f8c8d;"> /\*Serial.print("A1= ");</span></div><div><span style="color: #7f8c8d;"> Serial.println(valeur2);\*/</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr2\_B2&lt; seuil){ </span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 2 caché "); LDR2 PAS ERODE </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span><span style="color: #7f8c8d;"> // LDR2 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr3\_B2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr3\_B2);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr3\_B2 &lt; seuil){</span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 3 caché "); LDR3 PAS ERODE </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span><span style="color: #7f8c8d;"> // LDR3 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr4\_B2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr4\_B2);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr4\_B2 &lt; seuil){</span><span style="color: #7f8c8d;"> // LDR4 PAS ERODE</span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 4 caché ");</span></div><div><span style="color: #dae3e3;"> }</span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span><span style="color: #7f8c8d;"> // LDR4 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> } }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">" | LDRs Détectés: "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(nbDetectes);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord2, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, HIGH);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Pas\_Erosion:{ </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">" | PAS d'EROSION - LDRs Détectés: "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(nbDetectes);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Erreur\_FATALE : { </span></div><div><span style="color: #7f8c8d;"> // Boucle de sécurité = on force extinction des plaques</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord1, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord2, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, LOW);</span></div><div><span style="color: #7f8c8d;"> // eteindre la caret sd</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"❌ ERREUR CRITIQUE : RTC perdue. Système stoppé."</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #7f8c8d;"> // On vérifie quand même si la RTC revient toutes les 10 secondes</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"✅ RTC retrouvée ! Redémarrage..."</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;"> (rythme);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;">}</span></div>  
<div><span style="color: #dae3e3;">}</span></div></div></details><p class="callout success"><span id="bkmrk-azote-%3D-atm-protectr" style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Azote = atm protectrice ( peut être à mettre dans le tube) </span></p>

<details id="bkmrk-r%C3%A8gle-code-%E2%87%92-on-util"><summary>Règle CODE</summary>

<span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">⇒ On utilise const int dans notre code → occupe 2 octets en RAM (int = 2 octets sur Uno)</span>

- <span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">\#define seuil = 435 : Ça ne crée </span><span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">aucune variable en mémoire ça</span><span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> occupe 0 octet en RAM</span>

<span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Sur un Uno qui n'a que </span><span style="font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2048 octets de RAM</span><span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, ça peut compter. Donc pour des constantes simples comme des seuils, </span><span style="font-size: 11pt; font-family: 'Roboto Mono',monospace; color: #188038; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">\#define</span><span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> est souvent utilisé sur Arduino.</span>

<span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Sur Arduino → </span><span style="font-size: 11pt; font-family: 'Roboto Mono',monospace; color: #188038; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">\#define</span><span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> pour les constantes numériques simples (seuils, pins) → économise la RAM</span>

<span style="font-size: 11pt; font-family: Arial,sans-serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Attention syntaxe de CODE : </span><span style="color: rgb(0, 0, 0);"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">// "ldr1 moins B1"</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">const</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">int</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ldr1</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">-</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">B1 </span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> A0</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">plutot</span> ldr1\_B1 </span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> A0</span><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">;</span></span>

</details>### **<span style="color: rgb(230, 126, 35);">Séance 11 (17 Avril) :</span>**

### **<span style="color: rgb(230, 126, 35);">[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/E4Eimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/E4Eimage.png)</span>**

**1 er objectif :** Amélioration du code : enregistrement de l'heure et des données sur la carte SD

<details id="bkmrk-le-code-%23include-%3Cwi"><summary>Le CODE</summary>

<div style="color: #dae3e3; background-color: #1f272a; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;Wire.h&gt;</span><span style="color: #dae3e3;"> </span><span style="color: #7f8c8d;">// Appel du protocole de communication </span></div><div><span style="color: #7f8c8d;">// Appel de la bibliothèque RTC</span></div><div><span style="color: #c586c0;">\#include</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">&lt;I2C\_RTC.h&gt;</span></div><div><span style="color: #0ca1a6;">static</span><span style="color: #dae3e3;"> DS1307 RTC;</span><span style="color: #7f8c8d;"> // déclaration du modèle de RTC</span></div>  
<div><span style="color: #7f8c8d;">// A4 = SDA et A5 = SCL ==&gt; RTC </span></div>  
<div><span style="color: #7f8c8d;">// ----- Carte SD ----</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">SD\_CS\_PIN</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">10</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">NOM\_FICHIER</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">"log.txt"</span></div><div><span style="color: #dae3e3;">File fichier;</span></div><div><span style="color: #7f8c8d;">// --- Variables de Pins ---</span></div><div><span style="color: #7f8c8d;">// --LDR - BORD 1 --</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr1\_B1 = A0;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr2\_B1 = A1;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr3\_B1 = A2;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr4\_B1 = A3;</span></div>  
<div><span style="color: #7f8c8d;">// --LDR - BORD 2 --</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr1\_B2 = A0;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr2\_B2 = A1;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr3\_B2 = A2;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldr4\_B2 = A3;</span></div>  
<div><span style="color: #7f8c8d;">// -- LDR - BORD REF --</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrREF0 = A0;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrREF1 = A1;</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> ldrREF2 = A2;</span></div>  
<div><span style="color: #7f8c8d;">// -- BORD / TRANSISTORS -- </span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">bord1</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">2</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">bord2</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">3</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">bordREF</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">4</span></div>  
<div><span style="color: #7f8c8d;">//-- SEUIL-- </span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">seuilREF</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">200</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">seuil</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">400</span></div><div><span style="color: #c586c0;">\#define</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">rythme</span><span style="color: #dae3e3;"> </span><span style="color: #7fcbcd;">10000</span></div>  
<div><span style="color: #7f8c8d;">//================================================</span></div><div><span style="color: #7f8c8d;">// --- ETATs DE CASE--- </span></div><div><span style="color: #7f8c8d;">//================================================</span></div><div><span style="color: #0ca1a6;">enum</span><span style="color: #dae3e3;"> Etat {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">NUIT</span><span style="color: #dae3e3;">, </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Test\_Bord\_1</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Test\_Bord\_2</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Test\_Bord\_REF</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Pas\_Erosion</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Erreur\_FATALE</span><span style="color: #dae3e3;">,</span></div><div><span style="color: #dae3e3;">};</span></div><div><span style="color: #dae3e3;">Etat etatActuel = Test\_Bord\_REF;</span></div>  
<div><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // Compteur de déconnexions</span></div><div><span style="color: #0ca1a6;">const</span><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> MAX\_ERREURS = </span><span style="color: #7fcbcd;">10</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // Seuil avant blocage de sécurité</span></div><div><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> nbDetectes = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // le nbr de LDRs détectées pour évaluer l'évolution de l'érosion de la berge /// ON COMPTE REF1 ET REF2</span></div><div><span style="color: #0ca1a6;">bool</span><span style="color: #dae3e3;"> sdOK = </span><span style="color: #7fcbcd;">false</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> // pour savoir si la carte sd est utilisable ou pas </span></div>  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">enregistrementdedonne</span><span style="color: #dae3e3;"> (){</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (!sdOK) </span><span style="color: #c586c0;">return</span><span style="color: #dae3e3;">;</span><span style="color: #7f8c8d;"> //si pas de sd on n'écrit rien</span></div><div><span style="color: #dae3e3;"> fichier = </span><span style="color: #f39c12;">SD</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">open</span><span style="color: #dae3e3;">(NOM\_FICHIER, FILE\_WRITE);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (fichier) {</span></div><div><span style="color: #7f8c8d;"> // Format CSV : date;etat;nbDetectes</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(timestamp);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">";"</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(etatTxt);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">";"</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(nb);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">close</span><span style="color: #dae3e3;">();</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"Erreur : impossible d'ecrire dans le fichier."</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;">}</span></div><div><span style="color: #7f8c8d;">// --------------------------------------------------------</span></div><div><span style="color: #7f8c8d;">// c'est la fonction arrêt propre appelé dans erreur fatale </span></div><div><span style="color: #7f8c8d;">// ----------------------------------------------------------</span></div><div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">arretPropre</span><span style="color: #dae3e3;">() {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"Arret demande - finalisation du fichier..."</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (sdOK) {</span></div><div><span style="color: #dae3e3;"> fichier = </span><span style="color: #f39c12;">SD</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">open</span><span style="color: #dae3e3;">(NOM\_FICHIER, FILE\_WRITE);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (fichier) {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"=== Fin du log : "</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">getDateTimeString</span><span style="color: #dae3e3;">());</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"RTC indisponible"</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">close</span><span style="color: #dae3e3;">();</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"Fichier ferme correctement. Systeme arrete."</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;">}</span></div>  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">setup</span><span style="color: #dae3e3;">() {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">115200</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #7f8c8d;"> // vérification au démarrage (une seule fois)</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!Serial);</span><span style="color: #7f8c8d;"> // Empêche le programme de commencer si le matériel est mal connecté dès le départ </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">();</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">();</span></div>  
<div><span style="color: #7f8c8d;"> // --- Boucle tant que la RTC n'est PAS détectée ---</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">while</span><span style="color: #dae3e3;"> (!</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"⚠️ RTC non détectée — vérifiez les connexions !"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;">(rythme);</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #7f8c8d;"> // --------------------------------------------------</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"✅ RTC détectée !"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">startClock</span><span style="color: #dae3e3;">();</span></div>  
<div><span style="color: #7f8c8d;"> // --- RÉGLAGE DE L’HEURE (UNE SEULE FOIS) ---</span></div><div><span style="color: #7f8c8d;"> // RTC.setDateTime(\_\_DATE\_\_, \_\_TIME\_\_);</span></div><div><span style="color: #7f8c8d;"> // -------------------------------------------</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"Initialisation SD... "</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (!</span><span style="color: #f39c12;">SD</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">begin</span><span style="color: #dae3e3;">(SD\_CS\_PIN)) {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"ECHEC ! On continue SANS enregistrement."</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> sdOK = </span><span style="color: #7fcbcd;">false</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"OK."</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> sdOK = </span><span style="color: #7fcbcd;">true</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #dae3e3;"> fichier = </span><span style="color: #f39c12;">SD</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">open</span><span style="color: #dae3e3;">(NOM\_FICHIER, FILE\_WRITE);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (fichier) {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"=== Debut du log ==="</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"date;etat;nbDetectes"</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">fichier</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">close</span><span style="color: #dae3e3;">();</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #7f8c8d;"> // --- CONFIGURATION DES CAPTEURS --</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #7f8c8d;"> // Pas besoin de mettre les INPUT (mais préférable)</span></div>  
<div><span style="color: #7f8c8d;"> // --BORD 1-- </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr1\_B1, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr2\_B1, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr3\_B1, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr4\_B1, INPUT);</span></div><div><span style="color: #7f8c8d;"> // --BORD 2--</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr1\_B2, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr2\_B2, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr3\_B2, INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldr4\_B2, INPUT);</span></div>  
<div><span style="color: #7f8c8d;"> // --BORD REF-- </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldrREF0,INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldrREF1,INPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(ldrREF2,INPUT);</span></div>  
<div><span style="color: #7f8c8d;">// --- CONFIGURATION DES SORTIES (mettre au cas ou même si pas necessaire normalement)</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(bord1, OUTPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(bord2, OUTPUT);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">pinMode</span><span style="color: #dae3e3;">(bordREF, OUTPUT);</span></div><div><span style="color: #7f8c8d;">// --- ÉTAT INITIAL ---</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord1, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord2, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">F</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"Tapez 'S' dans le moniteur serie pour arreter proprement."</span><span style="color: #dae3e3;">));</span></div><div><span style="color: #dae3e3;">}</span></div>  
  
<div><span style="color: #0ca1a6;">void</span><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">loop</span><span style="color: #dae3e3;">() {</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">available</span><span style="color: #dae3e3;">()) {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">char</span><span style="color: #dae3e3;"> c = </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">read</span><span style="color: #dae3e3;">();</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (c == </span><span style="color: #dae3e3;">'S'</span><span style="color: #dae3e3;"> || c == </span><span style="color: #dae3e3;">'s'</span><span style="color: #dae3e3;">) {</span></div><div><span style="color: #dae3e3;"> etatActuel = Erreur\_FATALE;</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> }</span></div>  
<div><span style="color: #dae3e3;"> String timestamp = </span><span style="color: #7fcbcd;">""</span><span style="color: #dae3e3;">; </span></div>  
<div><span style="color: #7f8c8d;"> // ==============================================</span></div><div><span style="color: #7f8c8d;"> // Détermination de L'ETAT en vérifiant les LDR DE REF </span></div><div><span style="color: #7f8c8d;"> // ==============================================</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (!</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()){</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (!</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div><div><span style="color: #dae3e3;"> erreursRTC++;</span><span style="color: #7f8c8d;"> // On incrémente le compteur d'erreur</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"RTC deconnectee !"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;"> (rythme);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (erreursRTC &gt;= MAX\_ERREURS) {</span></div><div><span style="color: #dae3e3;"> etatActuel = Erreur\_FATALE;</span><span style="color: #7f8c8d;"> // On coupe tout ! pour pas vider la baterie </span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">getDateTimeString</span><span style="color: #dae3e3;">());</span><span style="color: #7f8c8d;"> //lecture du temps de manière lisible : String</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">getEpoch</span><span style="color: #dae3e3;">());</span><span style="color: #7f8c8d;"> // lecture pour la machine</span></div><div><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #dae3e3;"> nbDetectes = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #7f8c8d;"> //----Vérification de la LDR de REF0 =&gt; donne le SEUIL-----</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> REF0 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF0);</span></div><div><span style="color: #dae3e3;"> </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (REF0 &lt; seuil){</span></div><div><span style="color: #dae3e3;"> etatActuel = NUIT;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"NUIT"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"JOUR REF0 "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(REF0);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> REF2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF2);</span></div><div><span style="color: #dae3e3;"> </span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (REF2 &gt; seuil){</span></div><div><span style="color: #dae3e3;"> etatActuel = Test\_Bord\_2;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"JOUR REF2 "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(REF2);</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> REF1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldrREF1);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;">(REF1 &gt; seuil){</span></div><div><span style="color: #dae3e3;"> etatActuel = Test\_Bord\_1;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"JOUR REF1"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(REF1);</span></div>  
<div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span></div><div><span style="color: #dae3e3;"> etatActuel = Pas\_Erosion ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"pas d'érosion"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> </span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;"> (rythme);</span></div><div><span style="color: #dae3e3;"> } </span></div>  
<div><span style="color: #7f8c8d;"> // ==================================================</span></div><div><span style="color: #7f8c8d;"> // Execution de Switch/Case</span></div><div><span style="color: #7f8c8d;"> // ==================================================</span></div>  
<div><span style="color: #c586c0;">switch</span><span style="color: #dae3e3;"> (etatActuel){</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> NUIT:{</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">" | NUIT - LDRs Détectés: "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(nbDetectes);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Test\_Bord\_1:{</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"bord 1 allumé"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord1, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr1\_B1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr1\_B1);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr1\_B1 &lt; seuil){</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A0= "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> //LDR1 PAS ERODE</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurldr1\_B1);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A0= erodé "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> //LDR1 ERODE +1</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurldr1\_B1);</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr2\_B1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr2\_B1);</span></div><div><span style="color: #7f8c8d;"> /\*Serial.print("A1= ");</span></div><div><span style="color: #7f8c8d;"> Serial.println(valeur2);\*/</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr2\_B1&lt; seuil){ </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"ldr 2 caché "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> //LDR2 PAS ERODE </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span><span style="color: #7f8c8d;"> // LDR2 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr3\_B1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr3\_B1);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr3\_B1 &lt; seuil){</span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 3 caché "); LDR3 PAS ERODE </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span><span style="color: #7f8c8d;"> // LDR3 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr4\_B1 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr4\_B1);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr4\_B1 &lt; seuil){</span><span style="color: #7f8c8d;"> // LDR4 PAS ERODE</span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 4 caché ");</span></div><div><span style="color: #dae3e3;"> }</span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span><span style="color: #7f8c8d;"> // LDR4 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> } }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">" | LDRs Détectés: "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(nbDetectes);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord1, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, HIGH);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Test\_Bord\_2:{</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"bord 2 allumé"</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord2, HIGH);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr1\_B2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr1\_B2);</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr1\_B2 &lt; seuil){</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A0= "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> // LDR1 PAS ERODE</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurldr1\_B2);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"A0 - B2 = erodé "</span><span style="color: #dae3e3;">);</span><span style="color: #7f8c8d;"> // LDR1 ERODE +1</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(valeurldr1\_B2);</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr2\_B2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;">(ldr2\_B2);</span></div><div><span style="color: #7f8c8d;"> /\*Serial.print("A1= ");</span></div><div><span style="color: #7f8c8d;"> Serial.println(valeur2);\*/</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr2\_B2&lt; seuil){ </span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 2 caché "); LDR2 PAS ERODE </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span><span style="color: #7f8c8d;"> // LDR2 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr3\_B2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr3\_B2);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr3\_B2 &lt; seuil){</span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 3 caché "); LDR3 PAS ERODE </span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;"> {</span><span style="color: #7f8c8d;"> // LDR3 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #0ca1a6;">int</span><span style="color: #dae3e3;"> valeurldr4\_B2 = </span><span style="color: #f39c12;">analogRead</span><span style="color: #dae3e3;"> (ldr4\_B2);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (valeurldr4\_B2 &lt; seuil){</span><span style="color: #7f8c8d;"> // LDR4 PAS ERODE</span></div><div><span style="color: #7f8c8d;"> //Serial.print("ldr 4 caché ");</span></div><div><span style="color: #dae3e3;"> }</span><span style="color: #c586c0;">else</span><span style="color: #dae3e3;">{</span><span style="color: #7f8c8d;"> // LDR4 ERODE +1</span></div><div><span style="color: #dae3e3;"> nbDetectes++ ;</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> } }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">" | LDRs Détectés: "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(nbDetectes);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord2, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, HIGH);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Pas\_Erosion:{ </span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">print</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">" | PAS d'EROSION - LDRs Détectés: "</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(nbDetectes);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">case</span><span style="color: #dae3e3;"> Erreur\_FATALE : { </span></div><div><span style="color: #7f8c8d;"> // Boucle de sécurité = on force extinction des plaques</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord1, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bord2, LOW);</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">digitalWrite</span><span style="color: #dae3e3;">(bordREF, LOW);</span></div><div><span style="color: #7f8c8d;"> // eteindre la caret sd</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"❌ ERREUR CRITIQUE : RTC perdue. Système stoppé."</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #7f8c8d;"> // On vérifie quand même si la RTC revient toutes les 10 secondes</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #c586c0;">if</span><span style="color: #dae3e3;"> (</span><span style="color: #f39c12;">RTC</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">isConnected</span><span style="color: #dae3e3;">()) {</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">Serial</span><span style="color: #dae3e3;">.</span><span style="color: #f39c12;">println</span><span style="color: #dae3e3;">(</span><span style="color: #7fcbcd;">"✅ RTC retrouvée ! Redémarrage..."</span><span style="color: #dae3e3;">);</span></div><div><span style="color: #dae3e3;"> erreursRTC = </span><span style="color: #7fcbcd;">0</span><span style="color: #dae3e3;">;</span></div><div><span style="color: #dae3e3;"> }</span></div><div><span style="color: #dae3e3;"> </span><span style="color: #f39c12;">delay</span><span style="color: #dae3e3;"> (rythme);</span></div><div><span style="color: #dae3e3;"> } </span><span style="color: #c586c0;">break</span><span style="color: #dae3e3;">;</span></div>  
<div><span style="color: #dae3e3;">}</span></div>  
<div><span style="color: #dae3e3;">}</span></div>  
</div></details><p class="callout info">Le code pas encore testé </p>

### **[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/CSyimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/CSyimage.png)**

**2e objectif :** Faire la barette sur tinkercad

[![image.png](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/scaled-1680-/ltjimage.png)](https://wiki.fablab.sorbonne-universite.fr/BookStack/uploads/images/gallery/2026-05/ltjimage.png)

Lien d'accès https://www.tinkercad.com/things/bg5KvYUesNw-modelisation-du-circuit?sharecode=Q8lX\_LgqGzzxe0RfGgDLXN3qSim1PLlqWWHRYsVJsXc