Alimenter & déposer
La bobine stocke le filament. L’extrudeur l’entraîne vers la buse chaude, qui dépose un cordon fin selon une trajectoire.
🖨️ NSI MAKER / ATELIER 01
Comment transformer quelques lignes de code en un véritable objet imprimé en 3D ?
Des variables, une boucle… et bientôt un objet entre tes mains. Construis pas à pas ton premier projet maker.
Entrer dans l’atelier ↓Terminale · Du chapitre S01 à l’objet réel
Trois tiges pour manipuler des piles, des disques pour le tri de crêpes, une file pour organiser des travaux. Explorer la passerelle piles & files →
01 / DÉCOUVRIR
Notre Bambu Lab P1S utilise le procédé FDM/FFF : elle dépose du filament thermoplastique ramolli par la chaleur, qui se solidifie en refroidissant.
La bobine stocke le filament. L’extrudeur l’entraîne vers la buse chaude, qui dépose un cordon fin selon une trajectoire.
Le plateau soutient la pièce. Chaque couche repose sur les précédentes. Le volume nominal est de 256 × 256 × 256 mm ; l’espace réellement utilisable dépend de la préparation.
L’enceinte est fermée. Le nivellement automatique mesure les écarts du plateau pour les compenser ; un capteur détecte la fin du filament. Ces aides ne remplacent pas la vérification humaine.
Une imprimante 3D ne « crée » pas un objet en une fois. Elle le construit couche après couche.
02 / ALIMENTER
P1S = imprimante. AMS = gestion de plusieurs bobines. L’AMS à quatre emplacements peut alimenter l’imprimante et changer automatiquement de filament pour des impressions multicolores ou des changements de matériaux compatibles.
Plusieurs AMS peuvent être combinés dans certaines configurations avec les accessoires adaptés. Ici, quatre bobines suffisent à comprendre le principe.
Température, adhérence entre couches et propriétés comptent. Vérifie aussi la compatibilité du filament avec l’AMS. Un changement de couleur peut produire des purges : plus de couleurs peut signifier plus de déchets.
03 / RELIER
Clique sur une étape pour suivre le voyage.
Le slicer (« trancheur ») découpe virtuellement le modèle en couches et prépare les instructions de déplacement et de dépôt destinées à l’imprimante.
04 / COMPRENDRE LES FORMATS
| Fichier | Contient | Modifiable facilement ? | Utilité |
|---|---|---|---|
| .py | Programme Python | Oui | Calcul et génération |
| .scad | Modèle paramétrique OpenSCAD | Oui | Modélisation |
| .stl | Maillage triangulaire de la surface | Peu | Échange / impression |
| .3mf | Modèle / projet enrichi | Selon logiciel | Préparation / impression |
Le .py calcule les dimensions et génère une description. Le .scad décrit la géométrie avec des paramètres. Le .3mf peut conserver des objets, des unités, des couleurs, des matériaux ou des paramètres de projet : cela dépend du logiciel et du workflow, pas seulement de l’extension.
Un STL contient essentiellement la géométrie. Il ne conserve pas le programme paramétrique qui l’a créée et ne définit pas explicitement les unités : vérifie l’échelle à l’importation.
05 / PRÉPARER
MANIPULATION / UN MINI SLICER
Simulation pédagogique d’un bloc de 10 mm à 0,2 mm par couche. Aucun véritable tranchage n’est effectué.
Le STL décrit la forme. Bambu Studio décide comment cette forme sera imprimée.
06 / MODÉLISER
OpenSCAD est un logiciel gratuit et open source de modélisation 3D par le code. Dans cet atelier, nos dimensions sont en millimètres. Crée un fichier, saisis le code et lance l’aperçu (F5).
cube([30, 30, 10]);Un pavé de 30 × 30 × 10 mm : les trois valeurs sont les dimensions selon x, y et z.
difference() conserve la première forme, puis lui soustrait les suivantes. Un cylindre retiré d’un autre crée un trou. Ces schémas sont simplifiés : le navigateur n’exécute pas OpenSCAD.
07 / EXPÉRIMENTER
Modifie les trois paramètres. Observe la forme et le code évoluer ensemble.
Le cylindre soustrait commence à z = −1 et mesure epaisseur + 2 : il dépasse donc de 1 mm de chaque côté. Cela évite les faces exactement confondues et garantit un trou traversant.
08 / LE DÉCLIC
Python peut fabriquer automatiquement le fichier OpenSCAD.
diametre = 50
epaisseur = 6
trou = 10
code_scad = f'''
difference() {{
cylinder(h={epaisseur}, d={diametre});
translate([0, 0, -1])
cylinder(h={epaisseur + 2}, d={trou});
}}
'''
with open("disque.scad", "w", encoding="utf-8") as fichier:
fichier.write(code_scad)f'''…''' insère leurs valeurs. Les doubles accolades {{ et }} produisent des accolades littérales dans le code OpenSCAD.with open écrit puis ferme disque.scad dans le dossier de travail (un fichier du même nom serait remplacé).Enregistre ce programme dans disque.py et exécute-le avec Python 3 sur le poste de travail. Ici, les visualisations tournent en JavaScript ; elles n’exécutent pas Python.
09 / PROGRAMMER
Complète ce programme pour produire hanoi.scad. Les disques doivent rester séparés.
nb_disques = 5
diametre_min = 30
pas = 8
epaisseur = 6
trou = 10
espacement = 10
for i in range(nb_disques):
diametre = diametre_min + i * pas
# TODO : calculer la position du disque
# TODO : générer son code OpenSCADUn déplacement constant de 30 mm suffirait-il lorsque les disques deviennent plus grands ? Dessine leurs centres et leurs bords.
Une solution simple utilise le diamètre maximal comme pas de placement. Chaque disque est exporté séparément : la rangée entière peut dépasser le plateau de la P1S.
Ouvre hanoi.scad pour voir l’ensemble. Pour imprimer, rends et exporte chaque disque_1.scad, etc., puis arrange les STL sur un ou plusieurs plateaux dans Bambu Studio.
10 / GÉNÉRALISER
Un modèle est paramétrique lorsque sa géométrie dépend de paramètres modifiables sans reconstruire manuellement l’objet.
Remplace seulement nb_disques = 5 par nb_disques = 8. Pourquoi est-ce plus intéressant que de dessiner huit disques à la main ? Quels tests faut-il refaire ?
La boucle reproduit la même règle, limite les oublis et permet de régénérer toutes les pièces. Il faut cependant vérifier le diamètre maximal, le placement, la hauteur des tiges et le volume d’impression. Automatiser n’efface pas les contraintes physiques.
11 / AUTOMATISER
Python → .scad → OpenSCAD → rendu (F6) → Fichier / Exporter / STL.
Python → .scad → OpenSCAD en ligne de commande → .stl.
import subprocess
try:
subprocess.run([
"openscad",
"-o",
"hanoi.stl",
"hanoi.scad"
], check=True)
except FileNotFoundError:
print("OpenSCAD n'est pas accessible depuis la ligne de commande.")
except subprocess.CalledProcessError as erreur:
print("L'export a échoué : vérifier le fichier SCAD.", erreur)Python ne fabrique pas lui-même le maillage. Il lance OpenSCAD, qui calcule le rendu et l’export. OpenSCAD doit être installé ; le nom de la commande ou le chemin de l’exécutable dépend de l’installation. Demande le chemin configuré sur les PC de l’établissement. check=True signale un code de sortie en erreur.
Le fichier source doit exister dans le dossier de travail ; on peut aussi employer des chemins explicites. L’option -o choisit la sortie, et l’extension choisit le format : .stl ou .3mf, notamment. Un 3MF exporté par OpenSCAD n’est pas automatiquement un projet Bambu Studio configuré.
Le STL de la rangée complète peut être trop large. Préfère les exports des disques séparés, puis organise les plateaux dans Bambu Studio.
12 / PASSER AU RÉEL
Dans Bambu Studio, vérifie l’échelle, sélectionne le profil adapté, organise les pièces, tranche et inspecte l’aperçu. L’enseignant valide les réglages et autorise l’impression. L’envoi dépend du réseau et de la configuration de l’établissement.
13 / À TOI DE FABRIQUER
Conçois un jeu fonctionnel, destiné à notre P1S.
Le modèle dépend de nb_disques, diametre_min, pas, epaisseur et diametre_trou. Aucun redessin manuel quand ces valeurs changent.
Le nom trou des premiers exemples devient diametre_trou dans ton projet.
Espace les tiges en fonction du plus grand disque. Prévois une hauteur utile supérieure à la pile de tous les disques et réfléchis à l’assemblage des tiges sur la base.
Un trou exactement égal au diamètre théorique de la tige risque de mal s’emboîter après impression. Il n’existe pas une tolérance universelle : teste plusieurs jeux avant la fabrication finale.
↗ Relier ce jeu au chapitre S01 : piles, files et tri de crêpes
Déplace toute la pile vers une autre tige, un disque à la fois, sans jamais poser un grand disque sur un plus petit. Extension NSI : écris la résolution récursive ; le minimum est 2ⁿ − 1 déplacements pour n disques.
PASSERELLE TERMINALE / S01 · STRUCTURES DE DONNÉES
Les disques que tu programmes deviennent le matériel de ton cours.
Dans le chapitre S01, une pile suit l’ordre LIFO (dernier entré, premier sorti) ; une file suit l’ordre FIFO (premier entré, premier sorti). L’impression fabrique les pièces ; les structures de données organisent les valeurs et les actions de notre programme.
| Dans tes documents S01 | Dans l’atelier Maker |
|---|---|
| Cours, §3–4, p. 4–5 ; activités 2 à 5 | Suivre un sommet de pile et une sortie de file, opération par opération. |
| Cours, §5, p. 5–7 ; activités 7–8 ; exercices 4–5 | Distinguer le type abstrait de son implémentation avec list ou deque. |
| Exercice 6, p. 2–4 | Réutiliser les disques pour hauteur_pile, max_pile, retourner et le tri de crêpes. |
Les corrigés ont servi à préparer cette passerelle ; ils ne sont pas ajoutés aux téléchargements élèves.
Nous fixons une convention pour tous les exemples ci-dessous : sommet de pile à droite ; sortie de file à gauche. Une autre orientation de dessin est possible : c’est l’ordre des opérations qui définit LIFO ou FIFO.
| Type abstrait S01 | Implémentation choisie | Effet |
|---|---|---|
push(P, x) / empiler(P, x) | P.append(x) | Ajouter au sommet |
pop(P) / depiler(P) | P.pop() | Retirer et renvoyer le sommet |
enqueue(F, x) | F.append(x) | Ajouter à l’entrée |
dequeue(F) | F.popleft() | Retirer et renvoyer le plus ancien |
estVide(S) / taille(S) | len(S) == 0 / len(S) | Tester / compter sans retirer |
On choisit une liste Python pour une pile et collections.deque pour une file, comme dans les activités 7 et 8. Les noms abstraits ne sont pas tous des fonctions Python prédéfinies. Avant de retirer un élément, il faut vérifier que la structure n’est pas vide.
Un entier représente le rang d’un disque : 1 est le plus petit. On peut seulement retirer le sommet d’une tige. Hanoï ajoute une contrainte : aucun grand disque sur un plus petit. Cette contrainte n’appartient pas à la définition générale d’une pile.
Transfère les cinq disques de A vers C.
A = [5, 4, 3, 2, 1] # sommet à droite
B = []
C = []def deplacer(source, destination):
if source is destination or not source:
return False
if destination and source[-1] > destination[-1]:
return False
disque = source.pop()
destination.append(disque)
return TrueAprès A → B puis A → C, quel est le sommet de A ? Pourquoi le mouvement C → B est-il interdit ? Justifie avec les valeurs, puis teste.
Modélisons des travaux validés qui attendent leur tour : le plus ancien sort le premier. C’est une simulation FIFO choisie pour le cours, pas une description du fonctionnement interne de Bambu Studio ou de l’AMS. Aucun bouton ne commande l’imprimante.
← Sortie : le plus ancien Entrée : le plus récent ←
La file est vide : estVide(F) vaut True.
from collections import deque
F = deque()from collections import deque
F = deque()
F.append("test") # enqueue(F, "test")
F.append("disques")
if F: # pas de retrait sur une file vide
prochain = F.popleft() # dequeue(F) renvoie "test"Ajoute « Test de tolérance », puis « Disques », puis « Base ». Prédis le premier travail retiré et la taille restante. Que changerait pop() à la place de popleft() ?
Retire les disques des tiges et pose-les sur la table. Dans cet exercice, les entiers représentent les diamètres : on retourne un bloc de disques du sommet. On peut poser un grand sur un petit pendant le tri : les règles de Hanoï ne s’appliquent plus.
Exemple de la fiche, p. 4 : [5, 9, 3, 6], du bas vers le sommet.
Trouve le plus grand disque, puis amène-le en bas en deux retournements.
hauteur_pile(P) : compter avec une pile auxiliaire puis restaurer P. La hauteur abstraite est un nombre de disques ; la hauteur physique vaut ce nombre × l’épaisseur.max_pile(P, i) : chercher la position du maximum parmi les i disques du sommet, en comptant le sommet comme position 1, puis restaurer P.retourner(P, j) : inverser les j disques du sommet avec deux piles auxiliaires, comme demandé dans la fiche.tri_crepes(P) : placer le plus grand disque restant au sommet, puis le retourner jusqu’au bas de la partie non triée.hauteur_pile et max_pile doivent préserver la pile. retourner et tri_crepes doivent la modifier. Pour ces exercices, respecte l’interface fournie : un tri direct avec sort() ne répond pas au problème.
Pour fabriquer l’exemple, choisis par exemple diametre_mm = 10 * valeur : 5 devient 50 mm. Cette conversion garde l’ordre des tailles. Ici, la simulation reprend les valeurs du document ; les diamètres réels restent des paramètres de fabrication.
Une trace de trois déplacements de Hanoï ; une trace d’enfilements/défilements avec la valeur retirée ; les tests de hauteur_pile, max_pile et retourner ; puis une photo des disques utilisés pour vérifier le tri de crêpes. Compare toujours l’état avant et après.
En prolongement, DFS itératif utilise une pile de cases à explorer ; BFS utilise une file. Pour un labyrinthe où chaque déplacement a le même coût, BFS trouve un chemin avec un nombre minimal de déplacements. DFS ne garantit pas ce minimum. Dans les deux cas, marque les cases déjà découvertes pour éviter les cycles. La matrice produit les murs imprimés ; la pile ou la file organise l’exploration.
1. On empile 34, 76, 43. Que renvoie un dépilement ?
2. On enfile 67, 34, 78. Que renvoie un défilement ?
3. retourner([5, 9, 3, 6], 3) donne quoi, sommet à droite ?
1. 43 (LIFO). 2. 67 (FIFO). 3. [5, 6, 3, 9] : les trois éléments du sommet ont été inversés, le disque du bas n’a pas bougé.
14 / CONFRONTER AU RÉEL
Crée une barrette avec quatre trous de diamètres tige + 0,1 ; + 0,2 ; + 0,3 ; + 0,4 mm. Ce sont des écarts de diamètre à expérimenter, pas des recommandations universelles.
diametre_tige = 8;
jeux = [0.1, 0.2, 0.3, 0.4];
difference() {
cube([60, 20, 4]);
for (i = [0:3])
translate([9 + i * 14, 10, -1])
cylinder(h=6, d=diametre_tige + jeux[i], $fn=80);
}Pour cette barrette d’exemple, conserve la tige de 8 mm ; si tu changes son diamètre, adapte aussi les distances et les marges. Repère les trous de gauche à droite. Fais valider puis imprimer le test dans des conditions proches du projet (matière, orientation et réglages).
| Jeu diamétral | Trou pour tige de 8 mm | À relever sur papier |
|---|---|---|
| + 0,1 mm | 8,1 mm | Bloqué / serré / glissant / trop libre |
| + 0,2 mm | 8,2 mm | Bloqué / serré / glissant / trop libre |
| + 0,3 mm | 8,3 mm | Bloqué / serré / glissant / trop libre |
| + 0,4 mm | 8,4 mm | Bloqué / serré / glissant / trop libre |
Décide avec notre imprimante, notre filament et nos paramètres. Si aucun trou ne convient, élargis la série de tests. Le monde réel fait partie du débogage.
15 / BONUS AVANCÉ · FACULTATIF
labyrinthe = [
"#########",
"#S......#",
"#.###.#.#",
"#...#.#E#",
"#########"
]
for ligne in range(len(labyrinthe)):
for colonne in range(len(labyrinthe[ligne])):
if labyrinthe[ligne][colonne] == "#":
# TODO : générer un mur
pass# = mur · S = départ · E = arrivée
La même matrice peut afficher le labyrinthe, le résoudre avec BFS/DFS, générer son modèle 3D puis permettre de l’imprimer. Pour un mur, place un cube en [colonne * taille, ligne * taille, hauteur_base] et ajoute un socle sous l’ensemble.
Génère les murs avec deux boucles imbriquées. Puis retrouve le chemin avec BFS (parcours en largeur) ou DFS (parcours en profondeur) avant de fabriquer le labyrinthe.
16 / FABRIQUER RESPONSABLEMENT
17 / VÉRIFIER LE DÉCLIC
Huit questions pour vérifier que tu maîtrises la chaîne. Choisis une réponse par question.