Skip to main content

Super Groupe A1

Nom des participants:

Antoine, François, Jean, Yves, Guerrien

Antoine, , Pierre Graziani

Basile, Jules, Massimo Cortinovis

Sassi, M'hamed Ben Halima

Les quatre personnes citées ci-dessus suivent le cursus CMI-Physique (Cursus Master en Ingénierie, spécialité Physique). Nous avons la chance d'avoir une UE "Projet Fablab", grâce à laquelle nous pouvons apprendre et comprendre les éléments qui composent les fablabs de l'UPMC. Enfin, nous devons réaliser un projet d'ici la fin de l'année. Nous espérons pouvoir faire un ballon qui analyse l'air dans l'atmosphère parisien.

Voici donc la documentation de notre UE ! Bonne lecture ! En espérant que ça vous plaise !

Journal de bord:

Découverte du Fablab

Séance 1 - 30/01/2024 : Découverte des Falblabs
Séance 1 - 30/01/2024

C'est notre 1ère séance de l'UE [1] projet fablab ! L'objectif de cette UE sera de nous introduire les outils du Fablab puis de nous laisser réaliser notre propre projet. La séance s'est décomposée en deux grandes parties : une présentation générale de l'histoire des Fablab, de ce que nous allons faire dans l'UE. Puis nous avons fait un tour du lieu et des outils qui le composent.

L'idée de recréer le "technicien du garage" nous a beaucoup plus, et les outils à notre disposition nous permettent de réaliser presque tout, laissant libre cours à notre esprit créatif. Nous sommes motivé quant à la suite de cet enseignement, et impatient d'en découvrir les retours sur investissement !

Le fablab de Sorbonne UPMC se décompose en 5 grandes parties :

  • La salle de "brainstorming" (ou tempête de cerveau), où nous pouvons faire des recherches, mettre nos idées à plats, revoir la théorie... Des ordinateurs avec accès à internet, des livres ainsi que des tableaux et des feutres sont mis à disposition. On peut aussi y trouver des composants électroniques et des outils bricolages dans des rangements spécifiques.
  • Une salle d'impression 3D, où nous pouvons imprimer des objets en volume selon le patron numérique réalisé sur un logiciel ou repris sur internet. On peut y imprimer des mécanismes en une fois, sans post-montage (image 3).
  • Une salle de découpage laser ou à jet d'eau sous pression permettant la création de pièces dans tous types de matériaux (bois, métal...) (image 1 et 2).
  • Une salle où nous pouvons graver des circuits imprimer à l'aide de lasers ou de fraiseuses accompagnée d'un espace soudure.
  • Une salle de menuiserie possédant toutes les machines nécessaires pour travailler le bois.


Nous vous mettons quelques photos d'objets créés au fablab que nous avons prises durant la 2ème partie du cours (la visite).

Éléments de la salle de découpage.     Image d'un assemblage de planche découpé formant un petit cerf.

                     Image 1 : Morceaux de bois découpés                              Image 2 : Patron de cerf découpé puis assemblé


WhatsApp Image 2024-01-30 at 11.38.40.jpeg

Image 3 : Objets imprimé en 3D 

[1] : Unité d'Enseignement

Séance 2 - 06/02/2024 : Découverte des logiciels du Fablab
Séance 2 - 06/02/2024

Notre seconde séance c'est décomposé en deux axes majeurs.

Nous avons dans un premier temps découvert et essayé différents logiciels de design 2D avec Inkscape et 3D avec OpenScad et FreeCad. Monsieur Vincent nous entrecoupait son cours d'exercices d'applications sur ces logiciels.

La particularité d'OpenScad est que l'interface est textuelle ! C'était très différent de ce que l'on a déjà fait auparavant ou fait sur Inkscape ou FreeCad. Ils sont tous les 3 libres d'accès (téléchargements gratuits) et leurs codes sources est publié. Ce sont des outils transparents, avec lesquels nous sommes assurés de notre droit d'auteur : des logiciels "propriétaires", peut-être plus efficaces en termes d'interfaces, pourraient extraire certains de nos modèles.

Pour prendre en main les logiciels nous avons réalisé pendant la séance quelques formes géométriques respectant plusieurs contraintes qui nous avait été données. 

Par exemple, un carré dont les 4 coins contiennent des cercles sur Inkscape.

     image.png

Figure réalisée sur Inkscape

Ou un cube pour lequel on a soustrait 3 cylindres sur OpenScad.

cube.png

Forme réalisée sur OpenScad

code cube.png

Code utilisé pour réaliser ce cube

Nous avons également réalisé la même figure sur FreeCad. Sur ce logiciel, l'interface était moins intuitive que sur OpenScad, bien qu'elle n'était pas textuelle !

 

Puis, dans un second temps, Clara, une Fablab Manager, diplômée du diplôme supérieur des responsable fablab, nous a montré comment utiliser les logiciels associés aux découpeuses lasers et imprimantes 3D et a fait une démonstration du fonctionnement des premières en découpant et gravant un petit morceau de bois. En ce qui concerne les découpeuses lasers, on peut par exemple faire plusieurs teintes de gravures (en gris) et découper par là même ! Elle nous a montré que les découpeuses sont bien plus rapides que les imprimantes 3D ainsi que les conditions d'utilisation.

Séance 3 - 13/02/2024 : Découverte Arduino
Séance 3 -13/02/2024

Dans un premier temps, nous avons été introduis l'Arduino ! C'est une carte en circuit intégré complexe, réduit, composé d'un microcontrôleur. Avec une carte Arduino, nous pouvons programmer des actions à l'infini ! En effet, il n'y a plus besoin de souder un circuit pour réaliser chaque tâches que l'on veut : une carte Arduino peut être programmée et reprogrammé pour réaliser des actions complètements différentes (dans la limites des capteurs et actionneurs reliées à celle ci)


Nous avons premièrement réalisé un programme blink, lequel est ci dessous.

Code Blink
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(2, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  delay(200);                      // wait for a second
  digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(300);                      // wait for a second
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  delay(200);
  digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  delay(200);
  digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(300);                      // wait for a second
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);
  digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(300);                      // wait for a second
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  delay(200);
  digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(300);                      // wait for a second
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  delay(200);
  digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);
  digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  delay(200);
  digitalWrite(2, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  digitalWrite(2, LOW);   // turn the LED off by making the voltage LOW
  delay(5000);
}

Blink_morse.ino (fichier du code)

 

Le 2ème exemple de code pour Arduino était avec un capteur d'humidité et de température. Voici le code ci-dessous (code que l'on retrouve sur le site du vendeur)

Code Capteur température et humidité
#include <Arduino.h>
#include <Wire.h>
#include "SHT31.h"


SHT31 sht31 = SHT31();


void setup() {  
  Serial.begin(9600);
  while(!Serial);
  Serial.println("begin...");  
  sht31.begin();  
}


void loop() {
  float temp = sht31.getTemperature();
  float hum = sht31.getHumidity();
  Serial.print("Temp = "); 
  Serial.print(temp);
  Serial.println(" C"); //The unit for  Celsius because original arduino don't support speical symbols
  Serial.print("Hum = "); 
  Serial.print(hum);
  Serial.println("%"); 
  Serial.println();
  delay(1000);
}

Arduino_Capteur.ino (fichier du code)

Ces codes peut être écrit dans l'application Arduino IDE 2.3.2, libre de droit.

Il suffit alors de brancher le capteur sur la carte et d'envoyer ce code sur la carte Arduino pour faire fonctionner le système. Les cartes Arduino sont très faciles d'utilisation et le fait que les codes sont souvent déjà fourni avec les composants utilisés nous permet de construire et d'utiliser des composants électroniques sans connaissances en codage.

 

En deuxième partie, nous avons continuer notre recherche de projet. Maintenant que nous connaissons tout les objets et machines à notre disposition, nous avons une idée plus claires de ce qui était à notre porté. Nous ne nous sommes pas encore décidé mais avons déjà quelques pistes concrètes. 

Voici notre 1ère planche de brainstorming.

WhatsApp Image 2024-02-13 at 11.59.13.jpeg

 

Mise en place du projet

Séance 4 - 27/02/2024 : Début du projet
Séance 4 -27/02/2024

Ceci est la première séance de réalisation de notre projet.

Nous avons au départ hésité entre un thermostat intelligent, un détecteur de qualité d'acoustique d'une pièce, et un détecteur de gaz pour donner la qualité de l'air. C'est finalement ce dernier projet que nous allons réaliser. Nous pensions aussi décliner notre projet en un ballon, qui analyserait les gaz en altitudes, ou tout simplement un capteur d'incendie / de viabilité de l'air dans une pièce (plus d'aération, etc).

Nous pensons y avancer par étapes :

  • Tester les capteurs (particules fines, HCHO, et autres)
  • Monter un 1er prototype, puis le tester
  • Augmenter l'autonomie de notre projet (batterie externe, stockage de l'information)
  • Concevoir un ballon qui puisse monter à une certaine altitude avec tout le matériel (ajouter un altimètre)
  • Tester un Prototype, l'améliorer....
  • Présenter notre projet 

 

Voici le site informatif du capteur principal, le détecteur de particule/poussière (Laser PM25 Sensor) : https://wiki.seeedstudio.com/Grove-Laser_PM2.5_Sensor-HM3301/#software

Voici le site informatif du capteur secondaire, le détecteur de gaz (Grove - HCHO Sensor) : Grove - HCHO Sensor | Seeed Studio Wiki

Voici un lien qui nous a aidé à installer la bibliothèque qui permet à l'Arduino de communiquer avec ce capteur : https://wiki.seeedstudio.com/How_to_install_Arduino_Library/

Voici le code basique pour faire fonctionner le capteur Laser PM25 Sensor. Actuellement, il nous renvoie des valeurs matricielles, mais seulement une est importante : "particulate matter PM2.5".

Nous comptons l'améliorer afin qu'il renvoie un graphique de l'évolution des concentrations en gaz en fonction du temps (puis en fonction de l'altitude si on réussi à aller au bout du projet).

Code capteur Laser PM25 Sensor
#include <Seeed_HM330X.h>

#ifdef  ARDUINO_SAMD_VARIANT_COMPLIANCE
    #define SERIAL_OUTPUT SerialUSB
#else
    #define SERIAL_OUTPUT Serial
#endif

HM330X sensor;
uint8_t buf[30];


const char* str[] = {"sensor num: ", "PM1.0 concentration(CF=1,Standard particulate matter,unit:ug/m3): ",
                     "PM2.5 concentration(CF=1,Standard particulate matter,unit:ug/m3): ",
                     "PM10 concentration(CF=1,Standard particulate matter,unit:ug/m3): ",
                     "PM1.0 concentration(Atmospheric environment,unit:ug/m3): ",
                     "PM2.5 concentration(Atmospheric environment,unit:ug/m3): ",
                     "PM10 concentration(Atmospheric environment,unit:ug/m3): ",
                    };

HM330XErrorCode print_result(const char* str, uint16_t value) {
    if (NULL == str) {
        return ERROR_PARAM;
    }
    SERIAL_OUTPUT.print(str);
    SERIAL_OUTPUT.println(value);
    return NO_ERROR;
}

/*parse buf with 29 uint8_t-data*/
HM330XErrorCode parse_result(uint8_t* data) {
    uint16_t value = 0;
    if (NULL == data) {
        return ERROR_PARAM;
    }
    for (int i = 1; i < 8; i++) {
        value = (uint16_t) data[i * 2] << 8 | data[i * 2 + 1];
        print_result(str[i - 1], value);

    }

    return NO_ERROR;
}

HM330XErrorCode parse_result_value(uint8_t* data) {
    if (NULL == data) {
        return ERROR_PARAM;
    }
    for (int i = 0; i < 28; i++) {
        SERIAL_OUTPUT.print(data[i], HEX);
        SERIAL_OUTPUT.print("  ");
        if ((0 == (i) % 5) || (0 == i)) {
            SERIAL_OUTPUT.println("");
        }
    }
    uint8_t sum = 0;
    for (int i = 0; i < 28; i++) {
        sum += data[i];
    }
    if (sum != data[28]) {
        SERIAL_OUTPUT.println("wrong checkSum!!");
    }
    SERIAL_OUTPUT.println("");
    return NO_ERROR;
}


/*30s*/
void setup() {
    SERIAL_OUTPUT.begin(115200);
    delay(100);
    SERIAL_OUTPUT.println("Serial start");
    if (sensor.init()) {
        SERIAL_OUTPUT.println("HM330X init failed!!");
        while (1);
    }

}


void loop() {
    if (sensor.read_sensor_value(buf, 29)) {
        SERIAL_OUTPUT.println("HM330X read result failed!!");
    }
    parse_result_value(buf);
    parse_result(buf);
    SERIAL_OUTPUT.println("");
    delay(5000);
}

Seeed_PM2_5_sensor_HM3301-master.zip

Notre première étape a consister à allumer une LED lorsque le tôt de particules détectées dépassait un certain cap. Nous avons définis ce cap par une valeurs légèrement inférieure à celle affichée lorsqu'une allumette était soufflée juste à côté du capteur. Soit :

Code du seuil de déclenchement de la LED

 

void setup() {
    pinMode(2, OUTPUT);
}

void loop() {
    if("PM2.5 concentration(CF=1,Standard particulate matter,unit:ug/m3): ">=920)
    {
      digitalWrite(2, HIGH);
      
    }
}

On pensait aussi à faire clignoter la LED lorsque les détecteurs captaient un niveau trop important de gaz.

Nous nous sommes alors familiarisé avec les élément du 1er capteur, il est maintenant temps de nous familiariser avec le 2ème (le HCHO Sensor de grove). Cependant, nous laisserons ces parties pour la prochaine séance.

LED Allumée

Séance 5 - 05/03/2024 : Un projet satisfaisant
Séance 5 -05/03/2024

Lors de cette séance, nous nous sommes séparés en 2 groupes : un qui s'occupait du codage de l'Arduino et des différents capteurs, et un autre du cahier des charges de notre éventuel ballon.

Caractérisation du détecteur HCHO

Ce capteur détecte plusieurs composés volatils organiques, dont le HCHO. La famille des composés organiques volatils est très vaste : on en trouve en facilement dans l'atmosphère, mais la plupart ont des effets avérés sur la santé. Ils se caractérisent par un point d'ébullition très bas, et s'évaporent (ou se subliment) facilement. Le HCHO, autrement dit le formaldéhyde, est un bactéricide en petite quantité, mais peut devenir dangereux pour la santé si sa concentration dans l'air augmente. On peut en trouver dans différentes industrie, mais aussi dans un intérieur pas suffisamment aéré : c'est un des problèmes majeures de pollution d'intérieurs (nocive à partir de 1 ppm).

Nous pensions tester le capteur au fablab de chimie, en faisant varier les concentration de COV quelconques : si la valeur d'HCHO qu'il nous renvoie varie en faisant varier la concentrations des COV, alors on devra prendre ce module comme un détecteur de COV et non juste de HCHO.

Voici le wiki du capteur HCHO : Grove - HCHO Sensor | Seeed Studio Wiki

 

Nous avons rajouté un capteur : le détecteur de flammes de Gotronics.

Alors, pour ce module, nous avons bien ris ! Il détecte bien la présence d'une flamme grâce aux infrarouges qu'elle émet, cependant, il détecte aussi le Soleil comme une flamme ! Nous devons augmenter la sensibilité du capteur, afin que notre seuil différencie une flamme du Soleil lui-même (s'ils renvoient des valeurs différentes...).

On remarque que plus le capteur reçoit d'infrarouges, plus la valeurs qu'il renvoie est petite.

Voici le PDF explicatif du module détecteur de flamme (et d'autres) de Gotronics à la page 7 : gotronic.fr

 

Ecran : Grove - 16*2 LCD, par seed studio

Nous n'avons pour l'instant que pris ce module dans notre boîte. Nous nous laisserons le temps de la prochaine séance pour l'étudier. On compte afficher les valeur de notre "super capteur" sur cette écran en temps réel.

 

Détecteur CO, et autres : Grove - Gas sensor(MQ3)

Pour ce module, il y a besoin de vapeur d'alcool pour l'étalonnage. Nous ne pensons donc pas le garder...

WhatsApp Image 2024-03-12 at 09.39.13.jpeg

On a pour projet de tester chaque capteur avec un gaz que lui seul peut détecter, ce que nous ferons surement à la prochaine séance.

Voici une photographie légendée de notre montage

non légendé.jpeg

 

En parallèle, on a fais quelques recherches sur le ballon s'il se réalise :

  • Il est composé de fuseaux, une documentation approfondie est requise.
  • La différence de poids entre l'air chaud plus léger à l'intérieur du ballon et l'air froid à l'extérieur
Séance 6 - 12/03/2024 : Fin des tests de nos capteurs
Séance 6 -12/03/2024

Au début de cette séance, on étudie le Multichannel gas sensor :

En ne faisant qu'exécuter le code test, on s'est heurté à un problème : la DEL s'allumait bel et bien en fonction du capteur, mais aucune valeur ne s'affichait dans le "print Monitor" de l'application Arduino. En effet, ce capteur est habituellement utilisé avec un autre module, qui réalise certaines fonctions du codage à la place de celui-ci : sur le code, il manquait la fonction "serial.print();" car il doit être couplé à un écran, et que les valeurs devaient s'afficher sur celui-ci et non le Serial Monitor.

Seeed_Arduino_MultiGas-master.zip

 

Notre code se résume à la somme des codes de références avec quelques modifications (les bons output et input, quelques modifications pour afficher les valeurs sur le serial moniteur, avec une petite mise en page) et à l'ajout de seuils (pour faire bipper le buzzer et clignoter la DEL au dessus ou en dessous d'une certaine valeur)

Voici ce qu'il nous renvoie :
WhatsApp Image 2024-03-12 at 10.50.14.jpeg

 

Code du programme
#include <ChainableLED.h>
int m = 0;
float flamme;
int val ;
boolean up = true;
int analog = A3;
int buttonpin = 3;
int f = 0;
#define NUM_LEDS  5
int n = 0;
ChainableLED leds(7, 8, NUM_LEDS);
float hue = 0.32;
void setup(){

  leds.init();

Serial.begin(9600);
int n=0;
int f=0;
}

void loop()
{ flamme = analogRead(analog);
Serial.print("température = ");
Serial.println(flamme); // Affiche la température via le moniteur série
Serial.println("");
val = digitalRead (buttonpin) ;

  for (byte i=0; i<NUM_LEDS; i++)
    leds.setColorHSL(i, hue, 1.0, 0.5);
    
 
    
  if (flamme >= 50){   
   f=0;
   }
if (flamme < 50 && flamme >= 35){  
   f=1;
   }
if (flamme < 35 && flamme >= 20){  
   f=2;
   }
if (flamme < 20){  
   f=3;
   }

 if (f > n){
    n = f;
    }
if (n == 0){
  hue = 0.32;
  }
if (n == 1){
  hue = 0.17;
  }
if (n == 2){
  hue = 0.05;
  }
if (n == 3){
  hue = 0.00;
  }
Serial.println(n);
Serial.println(f);
if (flamme >= 50){
 m = m + 1;
}
if (m > 100){
 n = 0;
 f = 0;
 m = 0;
}
}

 

 

 

Quant à notre idée d'affichage sur un écran comme ceci

Affichage qualité de l'air

Cette idée est tombée à l'eau car on peut seulement afficher des dessins et non des fonctions qui s'actualisent en temps réel. Pour faire ça, on devrait recoder chaque pixel de l'écran, ou alors retrouver quelqu'un qui l'a fait. On décide alors de ne pas prendre l'écran (Grove - 16*2 LCD, par seed studio).

Séance 7 - 19/93/2024 : La vie en rouge, vert, bleu.
Séance 7 -12/03/2024 

Nous avons décidé de ne plus ajouter de composant. Nos composants sont : 

  • Laser PM2Sensor
  • Buzzer
  • Détecteur de flammes
  • Multichannel gas sensor
  • DEL RVB
  • HCHO Sensor

Les 3 cas où on utiliserait notre capteur :

  1. Détecteur incendie.
  2. Détecteur qualité d'air.
  3. (Ballon, détecteur qualité air de Paris en altitude.)

Objectifs de la séance : brancher une DEL RGB pour montrer la qualité de l'air / dangerosité de l'endroit. Pour certaine valeurs renvoyés par nos capteurs, on veut qu'elle s'illumine en rouge, orange, jaune, ou vert en fonction du niveau de dangerosité.

Problème : les outputs de la DEL étaient les mêmes que celles de du buzzer et du détecteur de flammes. Le code de la DEL n'était donc pas compatible avec les reste de notre code. Nous avons changé les output du détecteur de flammes et du buzzer respectivement des digital 7 et 8 aux digital 3 et 4.

La DEL est codé en hue, chaque code correspond à une couleur. On a trouvé : 

  • Vert : 0.32 hue
  • Jaune : 0.17 hue
  • Orange : 0.05 hue
  • Rouge : 0.00 hue

ChainableLED.zip

On doit coder pour chaque seuil d'un capteur atteint, une couleur qui s'approche du rouge, pour décrire la qualité de l'air.

Seuil du détecteur de flammes (valeurs décroissantes quand il y a plus de flammes). On choisi : x>50 (vert) - 50>x>35 (jaune) - 35>x>20 (orange) - 20>x (rouge)

Code flamme seuils exemple
#include <ChainableLED.h>        /*initialisation de nos valeurs*/
int m = 0;
float flamme;
int val ;
boolean up = true;
int analog = A3;
int buttonpin = 3;
int f = 0;
#define NUM_LEDS  5
int n = 0;
ChainableLED leds(7, 8, NUM_LEDS);
float hue = 0.32;
void setup(){

  leds.init();

Serial.begin(9600);
int n=0;
int f=0;
}

void loop()              
{ flamme = analogRead(analog);
Serial.print("température = ");
Serial.println(flamme); // Affiche la température via le moniteur série
Serial.println("");
val = digitalRead (buttonpin) ;

  for (byte i=0; i<NUM_LEDS; i++)
    leds.setColorHSL(i, hue, 1.0, 0.5);
    
 
    
  if (flamme >= 50){       /*mise en place de nos seuils*/
   f=0;
   }
if (flamme < 50 && flamme >= 35){  
   f=1;
   }
if (flamme < 35 && flamme >= 20){  
   f=2;
   }
if (flamme < 20){  
   f=3;
   }

 if (f > n){
    n = f;
    }
if (n == 0){
  hue = 0.32;
  }
if (n == 1){
  hue = 0.17;
  }
if (n == 2){
  hue = 0.05;
  }
if (n == 3){
  hue = 0.00;
  }
Serial.println(n);
Serial.println(f);
if (flamme >= 50){
 m = m + 1;
}
if (m > 100){
 n = 0;
 f = 0;
 m = 0;
}
}

 

On réalise le même système de seuil pour les autres capteurs, soit 3 autres fois. Ces opérations prendront du temps et nous utiliserons plusieurs heures pour le faire.

Séance 8 - 26/03/2024 : Finalisation
Séance 8 -26/03/2024 

 

Voici donc notre code final :

Code final complet pas propre
int Led = 13 ; // Déclaration de la 13 sur la broche 13
int buttonpin = 3; // Déclaration de l'entrée digitale sur 3
int analog = A3; // Déclaration de l'entrée analogique sur A3
float flamme; // Lecture de la valeur analogique (Flamme)
#include <math.h>
#include <ChainableLED.h>
#define NUM_LEDS  5
ChainableLED leds(7, 8, NUM_LEDS);
int vale = 0;
#define Vc 4.95;
int f = 0;
int n = 0;
int m = 0;
int o = 0;
int pm = 0;
int hcho = 0;
int p = 0;
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int q = 0;
int co = 0;

boolean up = true;
float hue = 0.32;
int speakerPin = 4; // Définition du buzzer sur la broche 8 (Buzzer)
#include "Seeed_HM330X.h"
#define R0 52.84
#ifdef  ARDUINO_SAMD_VARIANT_COMPLIANCE
#define SERIAL_OUTPUT SerialUSB
#else
#define SERIAL_OUTPUT Serial
#endif
#include <Multichannel_Gas_GMXXX.h>
#include <Wire.h>
GAS_GMXXX<TwoWire> gas;

int PM25=0;
int PM252=0;

HM330X sensor;
u8 buf[30];


const char *str[]={"PM1.0 ug/m3 : ",
                   "PM2.5 ug/m3 : ",
                   "PM10 ug/m3 : ",
                   "PM1.0 ug/m3 : ",
                   "PM2.5 ug/m3 : ",
                   "PM10 ug/m3 : ",
};

HM330XErrorCode print_result(const char* str,u16 value)
{
    if(NULL==str)
        return ERROR_PARAM;
    
    SERIAL_OUTPUT.println(value);
    return NO_ERROR;
}

/*parse buf with 29 u8-data*/
HM330XErrorCode parse_result(u8 *data)
{
    u16 value=0;
    if(NULL==data)
        return ERROR_PARAM;
    for(int i=1;i<8;i++)
    {
        value = (u16)data[i*2]<<8|data[i*2+1];
        print_result(str[i-1],value);
        if (i==3) {PM25=value;}
        if (i==5) {PM252=value;}

    }

    return NO_ERROR;
}

HM330XErrorCode parse_result_value(u8 *data)
{
    if(NULL==data)
        return ERROR_PARAM;
    for(int i=0;i<28;i++)
    {
        SERIAL_OUTPUT.print(data[i],HEX);
        SERIAL_OUTPUT.print("  ");
        if((0==(i)%5)||(0==i))
        {
            SERIAL_OUTPUT.println(" ");
        }
    }
    u8 sum=0;
    for(int i=0;i<28;i++)
    {
        sum+=data[i];
    }
    if(sum!=data[28])
    {
        SERIAL_OUTPUT.println("wrong checkSum!!!!");
    }
    SERIAL_OUTPUT.println(" ");
    SERIAL_OUTPUT.println(" ");
    return NO_ERROR;
    
}


/*30s*/
void setup()
{
    SERIAL_OUTPUT.begin(115200);
    delay(100);
    SERIAL_OUTPUT.println("Serial start");
    if (sensor.init()) {
        SERIAL_OUTPUT.println("HM330X init failed!!");
        while (1);
    }
    pinMode(2, OUTPUT);
pinMode (speakerPin, OUTPUT);
pinMode (Led, OUTPUT) ; // Définition de Led en tant que sortie
pinMode (buttonpin, INPUT) ; // Définition de buttonpin en tant qu'entrée
pinMode (analog, INPUT) ; // Définition de analog en tant qu'entrée
Serial.begin(9600);
  gas.begin(Wire, 0x08); // use the hardware I2C
  Serial.begin(115200);
 leds.init();
}



void loop()
{
    if (sensor.read_sensor_value(buf, 29)) {
        SERIAL_OUTPUT.println("HM330X read result failed!!");
    }
for (byte i=0; i<NUM_LEDS; i++)
    leds.setColorHSL(i, hue, 1.0, 0.5);

    parse_result_value(buf);
    parse_result(buf);
    SERIAL_OUTPUT.println("");
    SERIAL_OUTPUT.print("PM2.5, particulated matter = ");
    SERIAL_OUTPUT.println(PM25);
    SERIAL_OUTPUT.println("");
    SERIAL_OUTPUT.print("PM2.5, atmospheric environment= ");
    SERIAL_OUTPUT.println(PM252);
    SERIAL_OUTPUT.println("");
    delay(1000);


flamme = analogRead(analog);
SERIAL_OUTPUT.print("température = ");
Serial.println(flamme); // Affiche la température via le moniteur série
SERIAL_OUTPUT.println("");
vale = digitalRead (buttonpin) ;

    int sensorValue=analogRead(A0);
    double Rs=(1023.0/sensorValue)-1;
    Serial.print("Rs = ");
    Serial.println(Rs);
    SERIAL_OUTPUT.println("");
    double ppm=pow(10.0,((log10(Rs/R0)-0.0827)/(-0.4807)));
    Serial.print("HCHO ppm = ");
    Serial.println(ppm);
    SERIAL_OUTPUT.println("");
    
         

  // GM102B NO2 sensor
  val1 = gas.getGM102B();
  if (val1 > 999){ val1 = 999;}
  Serial.print(val1);
  Serial.println(" NO2 ppm");
  // GM302B C2H5CH sensor
  val2 = gas.getGM302B();
  if (val2 > 999){ val2 = 999;}
  Serial.print(val2);
  Serial.println(" C2H5CH ppm");
  // GM502B VOC sensor
  val3 = gas.getGM502B();
  if (val3 > 999){ val3 = 999;}
  Serial.print(val3);
  Serial.println(" VOC ppm");
  // GM702B CO sensor
  val4 = gas.getGM702B();
  if (val4 > 999){ val4 = 999;}
  Serial.print(val4);
  Serial.println(" CO ppm");
  Serial.println();
  if (flamme >= 50){   
   f=0;
   }
if (flamme < 50 && flamme >= 35){  
   f=1;
   }
if (flamme < 35 && flamme >= 20){  
   f=2;
   }
if (flamme < 20){  
   f=3;
   }

 if (f > n){
    n = f;
    }
if (n == 0){
  hue = 0.32;
  }
if (n == 1){
  hue = 0.17;
  }
if (n == 2){
  hue = 0.05;
  }
if (n == 3){
  hue = 0.00;
  }
if (flamme >= 50){
 m = m + 1;
}
if (m > 12){
 n = 0;
 f = 0;
 m = 0;
}
if (PM25 <= 500){   
   pm=0;
   }
if (PM25 > 500 && PM25 <= 900){  
   pm=1;
   }
if (PM25 > 900 && PM25 <= 1200){  
   pm=2;
   }
if (PM25 > 1200){  
   pm=3;
   }

 if (pm > n){
    n = pm;
    }


if (PM25 <= 1200){
 o = o + 1;
}
if (o > 12){
 n = 0;
 pm = 0;
 o = 0;
}

  if (ppm <= 5){   
   hcho=0;
   }
if (ppm > 5 && ppm <= 50){  
   hcho=1;
   }
if (ppm > 50 && ppm <= 100){  
   hcho=2;
   }
if (ppm > 100){  
   hcho=3;
   }

 if (hcho > n){
    n = hcho;
    }
if (ppm <= 100){
 p = p + 1;
}
if (p > 12){
 n = 0;
 hcho = 0;
 p = 0;
}
  if (val4 <= 500){   
   co=0;
   }
if (val4 > 500 && val4 <= 600){  
   co=1;
   }
if (val4 > 600 && val4 <= 700){  
   co=2;
   }
if (val4 > 700){  
   co=3;
   }

 if (co > n){
    n = co;
    }
if (val4 <= 500){
 q = q + 1;
}
if (q > 12){
 n = 0;
 co = 0;
 q = 0;
}
if (n == 2){
   analogWrite (speakerPin, 255); // Signal haut sur broche 8
         delay (250); 
         analogWrite (speakerPin, 0); // Signal bas sur broche 8
         delay (500);}
else {analogWrite (speakerPin, 0);}
if (n == 3){
   analogWrite (speakerPin, 255); // Signal haut sur broche 8
         delay (250); 
         analogWrite (speakerPin, 0); // Signal bas sur broche 8
         delay (125);}
else {analogWrite (speakerPin, 0);}
SERIAL_OUTPUT.println("");
SERIAL_OUTPUT.println(n);
SERIAL_OUTPUT.println(pm);
SERIAL_OUTPUT.println(f);
SERIAL_OUTPUT.println(co);
SERIAL_OUTPUT.println(hcho);
SERIAL_OUTPUT.println("");
}

 

On doit encore réduire et annoter notre code pour le rendre utilisable et compréhensible. On voudrait y ajouter plus de commentaires, et le rendre plus lisible encore.

Nous sommes alors passé aux réflexions sur la planche. On pense à tout fixer sur une planche et mieux présenter notre montage.

Voici les dimensions de chaque composants :

Breadboard 8*6*1 cm ; Laser PM2Sensor 8*4*2 cm ; Arduino 7,5*5,5 cm ; Buzzer 2*1,5 cm ; Détecteur de flammes 3,6*1,5 cm ; Multichannel gas sensor 4*2 cm ; DEL RVB 4,5*2 cm ; HCHO Sensor 2*2,5cm.

On a aussi conçu un support en PLA de notre montage.

Support en impression 3D

support PFL.scad

$fn=100;


/* Panche rectangulaire */

module crp (){
    cube ([20,24,2.5]);
}

module HCHO (){
    cube ([2.2,2.7,0.5]);
}

module LED (){
    cube ([4.7,2.7,1.1]);
}

module multi (){
    cube ([2.4,4.5,0.4]);
}

module flam (){
    cube ([4.0,1.7,0.5]);
}

module buz (){
    cube ([2.2,1.7,0.4]);
}

module ard (){
    cube ([7.7,6.3,1.6]);
}

module PM (){
    cube ([8.6,4.2,0.6]);
}

module brd (){
    cube ([8.4,6.2,1.1]);
}

module coupe(){
    cube([2.,25.2,2.7]);
}

        
module trous (){    
    difference(){
        crp();
        translate([-0.1,-0.1,-0.1])
        coupe();
        
        translate([2.8,1.3,2.1])
            HCHO();

        translate([8.3,20.4,1.5])
            LED();

        translate([16.5,1.3,2.2])
            multi();       

        translate([16.01,7.2,2.1])
            flam();     

        translate([2.5,7.2,2.2])
            buz();        

        translate([7.0,8.1,1])
            ard();
        
        translate([6.6,15.1,2.0])
            PM();

        translate([6.7,1.2,1.5])
            brd();     
    }  
}



module crenaux(){
    translate([19.8,8.41,2.1])
    cube([0.2,0.5,0.4]);
    translate([19.8,7.19,2.1])
    cube([0.2,0.5,0.4]);
}



module enRectangle(){
    crenaux();
    trous();
}



/* Planche en T */

module crp (){
    cube ([20,24,2.5]);
}

module HCHO (){
    cube ([2.2,2.7,0.5]);
}

module LED (){
    cube ([4.7,2.7,1.1]);
}

module multi (){
    cube ([2.4,4.5,0.4]);
}

module flam (){
    cube ([4.0,1.7,0.5]);
}

module buz (){
    cube ([2.2,1.7,0.4]);
}

module ard (){
    cube ([7.7,6.3,1.6]);
}

module PM (){
    cube ([8.6,4.2,0.6]);
}

module brd (){
    cube ([8.4,6.2,1.1]);
}

module coupe(){
    cube([2.,25.2,2.7]);
}

module T1(){
    cube([3,19,2.7]);
}

module T2(){
    cube([3,19,2.7]);
}
        
module trous2(){    
    difference(){
        crp();
        
        translate([-0.1,-0.1,-0.1])
        coupe();
        
        translate([1.89,10,-0.1,])
        T1();
        
        translate([17.1,10,-0.1,])
        T2();
        
        translate([2.8,1.3,2.1])
            HCHO();

        translate([8.3,20.4,1.5])
            LED();

        translate([16.5,1.3,2.2])
            multi();       

        translate([16.01,7.2,2.1])
            flam();     

        translate([2.5,7.2,2.2])
            buz();        

        translate([7.0,8.1,1])
            ard();
        
        translate([6.6,15.1,2.0])
            PM();

        translate([6.7,1.2,1.5])
            brd();     
    }  
}



module crenaux(){
    translate([19.8,8.41,2.1])
    cube([0.2,0.5,0.4]);
    translate([19.8,7.19,2.1])
    cube([0.2,0.5,0.4]);
}


module enT(){
    crenaux();
    trous2();
}


// ON PEUT AFFICHER UN DES DEUX ICI EN CHANGEANT CELUI QU'ON OCCULTE

enT();


//enRectangle();

image.png

Support, photoOn a dû découper le support à la scie à métaux pour l'emplacement du cable de l'arduino, et lîmer la breadboard sur les côtés : 

Breadboard lîmée

On veut coller les capteurs sur le support, on teste en 1er lieu avec du scotch double face.

On décide d'abandonner cette idée puisqu'on ne la trouve pas assez efficace.

 

On teste aussi la possibilité de faire un support en bois. On se rappelle des mesures de des vis de chaque capteurs.

  • 2.5mm : HCHO Sensor ; multichannel gas sensor V2.0 ; Buzzer actif ; DEL RGB
  • 3mm : Arduino ; Laser PM2.5 Sensor ; Détecteur de flammes

La breadboard quant à elle a un sticker en dessous qui permet de la coller.

A FAIRE

Support en découpe laser

 

Voici donc notre rendu final :

Produit final

Séance 9 - 16/04/2024 : Résumé
Séance 9 -16/04/2024 

 

Sur cette séance nous avons fais le support en bois et vissé notre détecteur dessus, mais j'aimerais consacrer cette rubrique à un résumé de notre travail. J'y enlève toutes nos idées irréalisées et y laisse seulement ce qu'on a fait.

Voici les composants qu'on utilise et leurs surfaces :

  • Breadboard 8*6*1 cm
  • Laser PM2Sensor 8*4*2 cm
  • Arduino 7,5*5,5 cm
  • Buzzer 2*1,5 cm
  • Détecteur de flammes 3,6*1,5 cm
  • Multichannel gas sensor 4*2 cm
  • DEL RVB 4,5*2 cm
  • HCHO Sensor 2*2,5cm

Voici le code implémenté à l'arduino et les bibliothèques nécessaires :

A FAIRE

Code complet + bibliothèques
Code

 Code final

Voici le wiki des composants ; leurs bibliothèques :

HCHO Sensor Grove - HCHO Sensor | Seeed Studio Wiki

Laser PM2.5 Sensor Grove - Laser PM2.5 Sensor (HM3301) | Seeed Studio Wiki ; Seeed_PM2_5_sensor_HM3301-master.zip

Buzzer Actif pj-1780.pdf (gotronic.fr)

Détecteur de flammes pj2-35218-1765.pdf (gotronic.fr)

Multichannel gas sensor Grove - Multichannel Gas Sensor | Seeed Studio Wiki ; Seeed_Arduino_MultiGas-master.zip

DEL RVB  Grove - Multichannel Gas Sensor | Seeed Studio Wiki ; ChainableLED.zip

Voici le fichier de découpe de la planche en bois :

A FAIRE

Fichier inkscape + tailles des vis selon les composants

 Photo fichier + fichier

 

Ecrous et boulons de 2.5mm : HCHO Sensor ; multichannel gas sensor V2.0 ; Buzzer actif ; DEL RGB

Ecrous et boulons de 3mm : Arduino ; Laser PM2.5 Sensor ; Détecteur de flammes

Nous avons grandement aimé ce projet. Toutefois, le C++ est un système de codage assez compliqué sans bien plus de cours avant. Ce fut l'activité la plus chronophage de notre projet. Nous aurions préféré avoir bien plus de temps sur la réalisation de notre projet : nous n’avons fait que 2 objectifs sur 6.

Cependant, les apprentissages qu’on retire de cette UE ont énormément de valeurs. Son seul défaut est qu’elle n’est pas assez longue !

Projets individuels

Projets individuels : Planche et impression 3D
Projets individuels

Les projets individuels sont de 2 types : une gravure/découpe laser sur une planche de 30*30cm, et une impression 3D de 15*15*15cm^3.

Le fichier que la découpeuse laser lis est une image vectorielle

Ainsi, chaque personne de ce groupe documentera ses projets personnels

Antoine Graziani : Ode à l'artiste qu'on aime

IMPRESSION 3D :

Mon projet d'impression 3D j'ai utilisé OpenScad, j'ai utilisé le code suivant pour créer un sablier, une forme qui me plaît particulièrement : 

$fn=100;
union() {
//boules
translate([0, 0, 10])
    sphere(r = 10);
translate([0, 0, 40])
    sphere(r = 10);

//cylindres de transition
translate([0, 0, 15])
    cylinder(h = 10, r1 = 8.657, r2 = 2);
translate([0, 0, 25])
    cylinder(h = 10, r1 = 2, r2 = 8.657);
    
//plateau haut et bas
translate([-15, -15])
    cube([30, 30, 2]);
translate([-15, -15, 50])
    cube([30, 30, 2]);
    
//poteaux
translate([-10,-10])
    cylinder(50, 1.5, 1.5);
translate([10,-10])
    cylinder(50, 1.5, 1.5);
translate([10,10])
    cylinder(50, 1.5, 1.5);
translate([-10,10])
    cylinder(50, 1.5, 1.5);
} 

Voici le lien scad : Sablier.scad

image.png

DECOUPE LASER :

Pour le projet de découpe laser, j'ai reproduis et fusionné les logos/pochette d'album de deux de mes groupes de musique préférés sur Inkscape :

GOJIRA :

image.png

 Avenged Sevenflod :

image.png

voilà le résultat :

image0 (2).jpeg

 

 

 

Antoine Guerrien : La procrastination à son paroxysme

 

 

 

Basile Cortinovis :

Projet 3D :

J'ai décidé d'utiliser le logiciel OpenScad pour mon projet. Je l'ai trouvé plus intuitif et plus simple à prendre en main que FreeScad. 

Je voulais modéliser quelque chose d'organique et ai choisi de modéliser une pieuvre pour sa symétrie ce qui m'a grandement facilité la tâche.

Mon code a été le suivant : 

$fn=100;

module htt(){
    difference(){
        translate([0,0,1.005])
            sphere(0.51);
        translate([-1.0,-1.0,0])
            cube([2.0, 2.0, 1.0]);
    }
}

htt();

module bst(){
    minkowski(){
        cylinder(01.0,0.25,0.5);
        sphere(0.01);
    }
    translate([0,0,0.025])
       sphere(0.26);       
}

bst();



module sgm2(){
translate([0, 0, 0])
   rotate_extrude(angle=120, convexity=10)
       translate([0.6, 0]) circle(0.075);
}


module tcl2(){
    rotate([90,150,90]){
        translate([-1.0,0.2,0]){
            sgm2();
            translate([-0.575,01.0526,0]){
                rotate([0,0,180]){
                    sgm2();
                }
            }
            rotate([180,180,0]){
            translate([-1.0, 0, 0])
                    rotate_extrude(angle=50, convexity=10)
                        translate([0.4, 0]) circle(0.075);
            }
            translate([-1.175,1.0526,0])
                sphere(0.075);
            
        }
    }
}


module tcl8(){
    tcl2();
    rotate([0,0,45])
        tcl2();
    rotate([0,0,90])
        tcl2();
    rotate([0,0,135])
        tcl2();
    rotate([0,0,180])
        tcl2();
}

tcl8();
mirror([1,0,0]) tcl8();



module aa(){
    sphere(0.075);
    cylinder(0.2,0.075,0.075);
    translate([0,0,0.2])
        sphere(0.075);
}

module bb(){
    difference(){
        aa();
    translate([0.05,-0.1,-0.11])
        cube(4);
    }
}

module eye0(){
    bb();
    translate([0.05,0,0.1]){
        resize([0.055,0.055,0.15]) sphere(1);
    }
}

module eye(){
    translate([0.45,-0.2,0.9])
        eye0();
    translate([0.45,0.2,0.9])
        eye0();
}

eye();

Le rendu est le suivant : 

Capture d’écran 2024-03-02 à 15.11.19.png

Et voici le fichier .scad :

pieuvre.scad

Mon code peut être séparé en trois parties.

La première sert à former le corps et est constituée des modules htt(); et bst();.

La seconde partie sert à former les tentacules et est constituée des modules sgm2();, tcl2(); et tcl8();.

La troisième partie sert à former les yeux et est constituée des modules aa();, bb();, eye0(); et eye();.

Les tentacules étant trop fins, l'impression s'est mal réalisée et un des tentacules s'est cassé lors du décollage du modèle de l'imprimante. Pour résoudre ce problème, il faudrait soit placer manuellement des supports entre les tentacules pour qu'ils se supportent entre eux ou agrandir les tentacules. 

 

Projet 2D :

Le logiciel Inkscape nous a ici été imposé.

J'ai décidé de décalquer la scène suivante du célèbre film d'animation Totoro de Miyasaki.

My_Neighbour_Totoro_(1988).webp

Voici le fichier obtenu après le décalquage.

ttr.svg

J'ai ensuite utilisé une découpeuse laser XXX pour graver le résultat sur du bois. Le résultat obtenue est le suivant.

gravure totoro.png

 

 

Ben Halima Sassi : Le japonisme renouvelé

Pour ma planche, je vous joins l'image vectorielle. Je compte utiliser l'entièreté de la planche. J'espère tellement que ma gravure ressortiras comme je l'espère.

Voici ci-dessous mon image vectorielle, ca m'a pris énormément de temps et je ne pense pas pouvoir en sacrifier autant pour l'impression 3D :

WhatsApp Image 2024-02-18 at 21.06.38.jpeg

PFL Planche 30.30.svg

Voici l'image qui m'a inspiré :

image.png

C'est ma petite sœur qui l'a trouvé sur Pinterest. Ca a été posé par l'utilisatrice mi_novaissantos.

 

J'ai réalisé un test sur une planche poubelle, et le résultat ne m'a pas déplu!

WhatsApp Image 2024-02-29 at 16.43.51 (1).jpegWhatsApp Image 2024-02-29 at 16.43.50.jpeg

Prototype 1

Cependant, la planche n'apparaît pas comme je voulais qu'elle le fasse : je m'attendais à une teinte grise moins prononcé pour l'intérieur de la branche, et pourtant elle est ressortie blanche comme un sou neuf. Je ne sais pas encore si je m'arrêterai sur ce résultat.

 

Et pour l'impression 3D je veux faire un champignon Mario en pixel. Je me suis inspiré de ces images :

image.png

image.png

D'après nicepng.com

 J'aimerais bien que mon champignon soit creux et que son chapeau puisse s'ouvrir (ou plutôt se retirer) : un petit rangement de bureau ! 

Avec cette envie, plusieurs contraintes viennent :

  • il faut faire la tête et le chapeau sur 2 fichiers différents,
  • il faut faire une sorte je jeu entre le chapeau et la tête,
  • ferai-je en sorte que le rangement aie un loquet? des charnières..? (je ne pense pas mais au cas où) 

 

 

J'espère que ce projet vous a emporté autant que nous !

J'aimerais exprimer un grand merci aux autres groupes qui nous ont donné beaucoup d'inspiration pour la documentation.