- Contenu
- Angèle Jollivet
Angèle Jollivet¶
1er jour - 09/06¶
Reprise du projet "Thermo-Bibli" - Réparation
- Etat du prototype actuel : Certains sertissages se sont défaits ou abimés, notamment sur le capteur n°5, ce qui pourrait peut-être expliquer l'anomalie "Dysfonctionnement 5ème capteur" de février 2023 ?
Branchements 5ème capteur : 
Branchements batterie : 
-> Remplacement des sertissages abimés
Après réparation des câbles, j'ai continué à fouiller pour trouver la documentation du projet, j'ai notamment trouvé le wiki au nom de "Thermo-Fablab" qui contient un tutoriel entier sur l'installation et l'utilisation de l'appareil par Nicolas Schmauch en 2024
La page du projet Thermo-Fablab
Le tutoriel
Dans l'idée de regrouper toutes les informations disponibles sur le projet j'ai également retrouvé la page Réécriture Thermo-Bibli
Après avoir suivi le tutoriel, les capteurs semblent de rien détecter, ou en tout cas ne renvoient rien à l'ordinateur et le système nous indique dans le terminal qu'il passe immédiatement en veille.
Après vérification des tensions sur le circuit, tout semble correctement branché, certaines étapes du tutoriel ont peut-être été mal réalisées.
2ème jour - 10/06¶
Participation au projet Robot Go-West¶
Recherches¶
- Les capteurs 2 et 8 branchés dans la terre détectent l'activité électrochimique des microorganismes qui décomposent la matière organique autour des racines des plantes, est-ce pertinent à notre recherche ? Les fréquences que ces deux capteurs détectent sont assez décalées par rapport à ceux plantés dans la tige qui détectent des valeurs relativement homogènes.
- Les Monsteras actuellement utilisées pour prélever les échantillons sont des plantes phototropes, mais pas héliotropes. Les plantes héliotropes ont un organe, le pulvinus/coussinet foliaire qui est acteur de l'orientation des feuilles de la plante vers le soleil. Certaines plantes ont cet organe, principalement la famille des Fabaceae (haricots, soja...) mais aussi certaines plantes à fleurs comme les marguerites ou le coton.
Aujourd'hui notre problématique est de distinguer les signaux produits par la plante du bruit environnant, notamment en séparant le cycle jour/nuit. Cependant puisque nos monsteras sont des plantes plutôt passives dans leur rapport au soleil, peut-être pourrait-on capter des signaux électrochimiques plus pertinents et indicateurs de l'ensoleillement de la plante si nous récoltions l'activité d'un pulvinus ?
Articles sur l'héliotropisme :
https://fr.wikipedia.org/wiki/H%C3%A9liotropisme_(botanique)
https://www.rts.ch/education/sciences-et-environnement/animaux-et-plantes/2010/question/quelle-est-la-difference-entre-l-heliotropisme-et-le-phototropisme-quels-sont-les-phenomenes-cellulaires-impliques-dans-l-heliotropisme-qu-il-affecte-la-fleur-ou-les-feuilles-27671325.html
https://www.ebsco.com/research-starters/anatomy-and-physiology/heliotropism
Articles sur le coussinet foliaire (pulvinus) :
https://www.mdpi.com/1422-0067/25/9/4582
https://www.mdpi.com/1422-0067/23/18/10240
https://sci-hub.fr/10.1002/tcr.20102
Article sur la mesure des réactions mécaniques et électriques du mimosa pudica (famille des Fabacae)
Objectif: Réaliser un code afin d'analyser les données des 8 différents capteurs¶
Langages : Python (numpy) et R
Capteurs :
Capteurs aériens 1 : 4, 5, 7
Capteurs aériens 2 : 1, 3, 6
Capteurs souterrains : 2, 8
-> Abandon de l'objectif car plus pertinent avec l'avancée du projet
Nouvel objectif : réaliser un programme python pour appliquer différents types de filtres à nos données¶
from scipy import signal
import numpy as np
def notch_filter(input_signal, fs=250.0, f0=50.0, Q=1.0):
# un filtre coupe bande (bandstop filter) très étroit
b, a = signal.iirnotch(f0, Q, fs)
return signal.filtfilt(b, a, input_signal)
def highpass_filter(input_signal, fs=250.0, freq_de_coupure=1.0, ordre=5):
b, a = signal.butter(ordre, freq_de_coupure, 'highpass', fs=fs)
return signal.filtfilt(b, a, input_signal)
def lowpass_filter(input_signal, fs=250.0, freq_de_coupure=50.0, ordre=5):
b, a = signal.butter(ordre, freq_de_coupure, 'lowpass', fs=fs)
return signal.filtfilt(b, a, input_signal)
def bandpass_filter(input_signal, fs=250.0, freqs_de_coupure=(1.0, 50.0), ordre=5):
b, a = signal.butter(ordre, freqs_de_coupure, 'bandpass', fs=fs)
return signal.filtfilt(b, a, input_signal)
def bandstop_filter(input_signal, fs=250.0, freqs_de_coupure=(49.0, 51.0), ordre=5):
b, a = signal.butter(ordre, freqs_de_coupure, 'bandstop', fs=fs)
return signal.filtfilt(b, a, input_signal)
# Transformée de Fourier / Fast Fourier Transform
def fft(signal):
Fe = 250000 #freq d'échantillonage
tstep = 1 / Fe #interval de temps
N = len(signal) #nombre d'échantillon
print("nombre de mesures : " + str(N) , "temps de l'enregistrement : " + str(tstep*N/1000) + " s")
Fs = 500
fstep = Fs/N #interval des freq
freq = np.linspace(0, (N-1) * fstep, N)
x = np.fft.fft(signal)
return freq, abs(x)
Documentation sur les 5 fonctions et leurs paramètres à faire !!!!!!!!!!!!!!!!!
3ème jour - 11/06¶
Conférence IMS (Anton Gradišek)¶
- Installer des nids à abeilles solitaires autour du campus ?
Réparation imprimante résine¶
- Remplacement du film + test impression -> Echec de l'impression, résine n'adhère pas au support
Selle de vélo DIY¶
4ème jour - 12/06¶
Participation au projet Robot Go-West¶
Traitement statistiques des données obtenues par les 8 capteurs¶
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score, silhouette_samples
import umap
import os
import random
from tqdm import tqdm
def fft(signal, Fe=250):
'''
signal = le signal temporel qu'on veut analyser.
Fe = fréquence d'échantillonnage (en Hz),
Fe = 250 Hz signifie qu'on enregistre 250 valeurs par seconde.
Donc le pas de temps vaut 1/Fe = 0.004s
'''
N = signal.shape[-1] # On prend le tableau sumpy et on garde que la donnée en position -1
freq = np.fft.fftfreq(N, 1/Fe) #np.fft.fftfreq(nombre_points, pas_de_temps)
x = np.abs(np.fft.fft(signal, axis=-1)) # on fait le module/abs
return freq, x
wd = 'c:/Users/angel/OneDrive/Bureau/Stage_Cohabit/07_mai_2026/'
random.seed(123)
# Select a small subset
file_list = [[], []]
for class_,folder in enumerate(os.listdir(path=wd)):
print(folder)
for file in tqdm(os.listdir(os.path.join(wd, folder)), desc = 'Chargement des fichiers'):
if file.endswith('.npy'):
filpath=os.path.join(wd, folder,file)
file_list[class_].append(filpath)
print(len(file_list[class_]))
print(len(file_list[0]), len(file_list[1]))
rand_ID = [random.randint(0, len(file_list[1])-1) for _ in range(300)]
file_list[0]=[file_list[0][i] for i in rand_ID]
file_list[1]=[file_list[1][i] for i in rand_ID]
print(f"Number of classes: {len(file_list)}")
print(f"Number of samples: {len(file_list[0])} and {len(file_list[1])}")
fe= [250, 200, 150, 100, 50]
results_silhouette = []
for D in tqdm(fe):
for i in range(8):
df_day = np.array([np.load(val)[0][i][:] for val in file_list[0]])
df_night = np.array([np.load(val)[0][i][:] for val in file_list[1]])
day_fft= fft(df_day, Fe=D)
day_fft = day_fft[1]
night_fft = fft(df_night, Fe=D)
night_fft = night_fft[1]
df_fft = np.vstack([day_fft,night_fft]) # Il faut concatener mais avec numpy pas panda
# Performing UMAP
reducer = umap.UMAP(metric='euclidean')
labels = np.array(['day'] * len(day_fft) + ['night'] * len(night_fft))
scaled_df_fft = StandardScaler().fit_transform(df_fft)
embedding = reducer.fit_transform(scaled_df_fft)
sil_score = silhouette_score(embedding,labels,metric='euclidean')
print(f"Fe={D}, capteur={i}, silhouette = {sil_score:0.4f}")
results_silhouette.append({"Fe": D,"Capteur": i+1,"silhouette": round(sil_score,4)})
print(results_silhouette)
5ème jour - 15/06¶
Participation au projet Robot Go-West¶
Compte rendu du traitement statistiques dans un document csv
try:
with open('sil_csv.csv', 'w', newline='', encoding='utf-8') as fichier:
t = csv.writer(fichier, delimiter=',')
t.writerow(['C1', 'C2', 'C3','C4','C5','C6','C7','C8'])
Fe = [250,200,150,100,50]
for i in range(len(Fe)):
t.writerow([Fe[i]])
t.writerow([results_silhouette[i]["silhouette"],
results_silhouette[i+1]["silhouette"],
results_silhouette[i+2]["silhouette"],
results_silhouette[i+3]["silhouette"],
results_silhouette[i+4]["silhouette"],
results_silhouette[i+5]["silhouette"],
results_silhouette[i+6]["silhouette"],
results_silhouette[i+7]["silhouette"]])
except:
print("Erreur dans l'écriture ou ouverture/création du fichier csv.")
try:
with open('sil_csv.csv', 'w', newline='', encoding='utf-8') as fichier:
t = csv.writer(fichier, delimiter=',')
t.writerow(['C1', 'C2', 'C3','C4','C5','C6','C7','C8'])
Fe = [250,200,150,100,50]
for i in range(len(Fe)):
t.writerow([Fe[i]])
t.writerow([results_silhouette[i]["silhouette"],
results_silhouette[i+1]["silhouette"],
results_silhouette[i+2]["silhouette"],
results_silhouette[i+3]["silhouette"],
results_silhouette[i+4]["silhouette"],
results_silhouette[i+5]["silhouette"],
results_silhouette[i+6]["silhouette"],
results_silhouette[i+7]["silhouette"]])
except:
print("Erreur dans l'écriture ou ouverture/création du fichier csv.")
Assistance réparation téléphone¶
6ème jour - 16/06¶
Projet gamelle télescopique¶
- "Gamelle orthopédique"
- Trépied télescopiques pour gamelles d'animaux (grands animaux ou animaux vieillissant et/ou avec de l'arthrose ou des douleurs cervicales qui ont du mal à se pencher jusqu'au sol pour manger)
Conception de l'objet et des différentes pièces à imprimer¶
< Mettre image des plans >
7ème jour - 17/06¶
Projet gamelle télescopique¶
Création des pièces sur Inskape¶
Comment utiliser la laser Trotec Speedy 300 ?¶
Lien tutoriel : https://projets.cohabit.fr/redmine/projects/documentation-machines/wiki/Trotec_speedy_300
Impressions résine bactéries¶
- Problèmes lors des cycles wash et cure de la machine, prélavage à la main ?
8ème jour - 18/06¶
Projet gamelle télescopique¶
- Correction des plans sur Inskape
- Découpe des planches pour la découpe laser
Projet Spirob¶
Prise en main de Freecad¶
- Lien tutoriel : https://tube.aquilenet.fr/w/p/1kRD5Ef5AVYJz3qydiStDN?playlistPosition=1
- Lien OrcaSlicer : https://github.com/OrcaSlicer/OrcaSlicer
Comment slicer sur Orcaslicer ? -> Ecrire le step by step
Recherche Spirobs¶
https://www.lemonde.fr/sciences/article/2025/02/07/spirobs-le-bras-robotise-inspire-des-pieuvres-dote-d-une-dexterite-inedite_6535917_1650684.html
https://www.sciencedirect.com/science/article/pii/S2666998624006033
Papier officiel
Tentative de recréation
https://fab.cba.mit.edu/classes/863.25/people/JyoPari/posts/final_spirobs.html
9ème jour - 19/06¶
Projet gamelle télescopique¶
- Plans structure : plans-laser-gamelle.svg
- Plan support coulissant : support.svg
Documentation Laser ML-W1070 : https://projets.cohabit.fr/redmine/projects/documentation-machines/wiki/ML-W1070#Faire-sa-premi%C3%A8re-gravure-avec-la-ML-W1070
Découpe des pièces et début d'assemblage avec de la colle à bois
Projet Clim Ecolo¶
Lien vidéo inspiration : https://www.youtube.com/watch?v=MaCHwbR2Zbs
10ème jour - 22/06¶
Projet Clim Ecolo¶
- Impression de la pompe à eau
- Impression ventilateur + support : https://www.thingiverse.com/thing:6021015/apps
- Assemblage pompe
11ème jour - 23/06¶
Projet clim écolo¶
- Impression des parties manquantes du ventilateur : supports_ventilo.gcode.3mf
Pompe péristaltique :
fichiers 3mf :
- pompe_couvercle.3mf
- pompe_rouage.3mf
fichiers stl :
- pompe_rouage.stl
- pompe_couvercle.stl
vectoriel carton :
- carton_alveole_V2.svg
12ème jour - 24/01¶
Projet clim écolo¶
Pompe péristaltique :
- Support pompe stl : support_pompe_1.stl
- Cache pompe stl : cache_pompe.stl
13/14ème jour - 25/01 et 26/01¶
Projet clim écolo¶
Bac support électronique :
- Modelisation 3D Freecad
15ème jour - 29/06¶
Impressions Résine - Protocole¶
1. Après impression, faire baigner la pièce dans un mélange eau savon pendant ~24h (ne PAS utiliser la machine pour Wash !!)
2. Rincer la pièce à l'eau chaude pour bien faire partir tous les résidus de savon
3. Sécher la pièce (à l'abri du soleil, avec un ventilateur ou un chiffon ou en laissant egoutter)
4. Cure dans la machine par sessions de 30min. (généralement ~1h30 total soit 3 cycles)
Projet clim écolo - Documentation¶
Avec Arthaud Delvau, nous avons pour projet de créer un climatiseur écologique d'après une vidéo (https://www.youtube.com/watch?v=MaCHwbR2Zbs).
Ce climatiseur se repose sur le principe adiabatique, donc sur l'évaporation de l'eau qui libère du froid.
Notre climatiseur se compose de 5 parties :
- Un ventilateur actionné par un moteur brushless
- Un support pour ce ventilateur
- Une pompe péristaltique avec un tuyau en silicone actionnée par un moteur DC
- Un bac de récupération d'eau
- Un tampon en carton
- Un bac pour la centralisation des composants électriques et de la batterie.
Nous en sommes actuellement à la réalisation du premier prototype