Conception Assistée par Ordinateur (CAO)#

1. Introduction#

Cette semaine, nous nous sommes plongé dans l’univers du « Compliant Mechanism » (mécanisme souple) et de la modélisation 3D. Nous avons exploré différentes facettes de cette nouvelle notion, introduisant des logiciels tels qu’Inkscape, OpenSCAD et FreeCAD.

2. Objectif#

L’objectif de ce module est d’apprendre à modéliser un objet qui intègre un FlexLinks. Mais qu’est-ce qu’un FlexLinks ? Un FlexLinks est un type de mécanisme souple conçu pour permettre la flexion et la déformation contrôlées, souvent utilisé dans la conception de structures flexibles et d’articulation mécaniques. Il offre une chouette solution pour créer des mouvement flexibles dans les objets imprimés en 3D.

On va donc passer d’abord par la conception et modélisation de notre FlexLinks et puis l’étape suivante consistera à imprimer cet objet à l’aide d’une imprimante 3D, mais ça vous le découvrirez dans mon prochain module. ;)

3. Outils#

Mais quelles sont les différences entre les trois logiciels ? - Inkscape : logiciel de dessin vectoriel open-source, parfait pour la création d’illustrations, d’icônes et de graphiques. - FreeCAD : logiciel de modélisation paramétrique 3D libre et open-source, adapté à la conception de pièces mécaniques et assemblages, mais sans utiliser du code. - OpenSCAD : logiciel de modélisation 3D paramétrique, basé sur la programmation. Il permet donc de créer des modèles en utilisant du code.

Ici se trouve un bon mode d’emploi d’OpenSCAD (logiciel que j’ai choisi d’utiliser) et je vous conseille vivement aussi regarder cette vidéo.

Conception#

Après concertation avec Charles, nous avons imaginé une sorte d’oiseau dont les ailes battraient à l’aide du mécanisme de FlexLinks. Vous pouvez observer notre magnifique croquis ci-dessous :

Pour réaliser cela, nous nous sommes surtout servis d’OpenSCAD, trouvant que l’interface était agréable, et nous avons pu retrouver une cheatsheet sur leur site qui rend le codage bien plus aisé.

Voici mon premier essai à la modélisation d’un FlexLinks. Je ne parvenais pas à faire les deux trous dans mon cylindre, et ça me rendait un peu folle à vrai dire ! Le soucis était que je ne comprenais pas comment je devais faire pour assembler mes deux cylindres avec mon carré pour en faire une seule forme pour ensuite la trouée.

Et voici le code utilisé :

// FILE : encode.scad
// AUTHOR : Gala Toscano-Aguilar
// LICENSE : Creative Commons Attribution 4.0 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
height = 10; BottomRadius = 10; TopRadius = 10; NumberOfFaces = 250;

translate([10,0,0]) 
   cylinder(h = height, r1 = BottomRadius, r2 = TopRadius, center = true, $fn = NumberOfFaces);


translate([-10,0,0]) 
   cylinder(h = height, r1 = BottomRadius, r2 = TopRadius, center = true, $fn = NumberOfFaces);

 cube([20,20,10],true);
 box=[20,20,10];cube(box,true);

Après des essais et des essais, Suzanne, une amie également en bio-ingénierie et qui a suivi cette formation l’année passée, m’a conseillé de jeter un œil à sa documentation, car elle aussi a eu fort du mal dans la conception de ce FlexLinks. J’ai pu retrouver sur sa page un code qui fonctionnait très bien pour la création de ce FlexLinks. J’ai pris le temps de comprendre chaque étape du code en réalisant des essais, en supprimant certaines lignes de codes pour observer les changements, etc. Voici donc le FlexLinks correctement modélisé suivi du code qui l’a permis !

// FILE : flexlinks.scad
// AUTHOR : Gala Toscano-Aguilar
// LICENSE : Creative Commons Attribution 4.0 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
$fn = 50;   // nombres de faces
h = 9.6;    // hauteur du flexlink
d = 50;     // longueur de la tige
w = 1;      // épaisseur de la tige
rc = 4;     // rayons des extrémités
e = 8;      // distance entre les centres des trous
hole = 2.5; // rayon des trous
// taille des extrémitées = e + 2*rc
// longueur totale = d + 2*size of extremities

// tige
translate ([-w/2,e+rc,0]) 
// w/2 pour que tige soit centrée
cube([w,d,h]);

// extremité 1
difference(){ // pour créer les trou 
    union(){ // corps
        // pour unifier 2 cylindres + cube
        cylinder(h, r=rc);
        translate([0,e,0])
        cylinder(h, r=rc);
        translate([-rc,0,0])
        cube([2*rc,e,h]);
    } 
    cylinder(h, r=hole); // trou 1
    translate([0,e,0])
    cylinder(h, r=hole); // trou 2
}


// extremité 2 
// on fait la même chose qu'au dessus mais 
// en utilisant une commande translate en +
// à une distance de la tige
difference(){
    union(){ //corps
        translate([0,d+(2*rc+e),0]){
            cylinder(h, r=rc);
            translate([0,e,0])
            cylinder(h, r=rc);
            translate([-rc,0,0])
            cube([2*rc,e,h]);
        }
    }
    translate([0,d+(2*rc+e),0]){
        cylinder(h, r=hole); // trou 3
        translate([0,e,0])
        cylinder(h, r=hole); // trou 4
    }
}

Les opérations clés étaient union() pour combiner le cylindre et le carré et difference() pour créer les trous aux centres.

Modélisation des ailes#

Charles s’est ensuite penché sur la création des ailes et est parvenu a créer ceci à l’aide de chatgpt (super atout pour le code !).

// FILE : ailes.scad
// AUTHOR : Charles Ackermans
// LICENSE : Creative Commons Attribution 4.0 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
$fn = 100; // Augmente la résolution des courbes

// Dimensions de l'aile
aile_longueur = 100 ;
aile_largeur = 30 ;
aile_epaisseur = 3;
encoche_largeur = 2.4;
encoche_hauteur = 5;
encoche_epaisseur = 11;

// Fonction pour créer une encoche LEGO convexe
module encoche_convexe() {
    union() {
        rotate([90, 0, 180]) { // permet jouer avec le sens des encoches
            scale([1, 1, -1]) {
                difference() {
                    cylinder(r = encoche_largeur / 2, h = encoche_epaisseur);
                    translate([0, 0, -1])
                        cylinder(r1 = encoche_largeur / 2, r2 = 0, h = 1);
                }
            }
        }
    }
}

// Fonction pour créer l'aile avec les encoches LEGO convexes
module aile() {
    union() {
        linear_extrude(height = aile_epaisseur) {
            polygon(points = [
                [0, 0],
                [aile_longueur / 2, aile_largeur],
                [aile_longueur, 0]
            ]);
        }
        translate([1.5, 0,1.5])
            encoche_convexe(); // Permet de translater l'encoche à la base du repère
        translate([aile_longueur-1.5, 0, 1.5])
            encoche_convexe(); // permet de translater l'encoche au bout
    }
}

// Appel de la fonction pour créer l'aile
aile();

5. License Creative Commons#

Pour les trois codes, nous avons utilisé la licence CC BY-SA, ce qui signifie que tout le monde peut utiliser ces codes, mais doivent nous créditer et utiliser également la licence CC BY-SA 4.0.