=====Installation version portable à l'IUT=====
https://openscad.org/downloads.html
version 64bits zip: https://files.openscad.org/OpenSCAD-2021.01-x86-64.zip
Mirroir: https://bvdp.inetdoc.net/files/openscad/OpenSCAD-2021.01-x86-64.zip
=====Thingiverse=====
Exemples de modèles 3D personnalisables: https://www.thingiverse.com/search?q=customizable&page=1&type=things&sort=relevant
Exemple de grille de ventilateur: https://www.thingiverse.com/apps/customizer/run?thing_id=2802474
Exemple d'arbre: https://www.thingiverse.com/apps/customizer/run?thing_id=279864
Exemples de librairies 3D: https://www.thingiverse.com/search?q=library&page=1&type=things&sort=relevant
=====Notations pour les changements de repères====
Choix des notations de: https://www.gdr-robotique.org/cours_de_robotique/online/Khalil-Dombre_Modelisation/Khalil-Dombre_Modelisation.pdf
Matrice de rotation dont les colonnes sont les axes du repère $i$ exprimés dans le repère $j$: $^i_{}R_{j}$
Vecteur translation exprimant l'origine du repère $j$ dans le repère $i$: $^i_{}T_{j}$
Matrice de changement de repère:
$^i_{}M_{j}=\begin{bmatrix}
^i_{}R_{j} & ^i_{}T_{j}\\
0 & 1
\end{bmatrix}
$
=====Matrice rotation dans le plan=====
https://fr.wikipedia.org/wiki/Matrice_de_rotation
=====Solution TD1=====
////////////////////////////////
module fleche(resolution=60){
cylinder(h = 0.5, r1 = 0.1, r2 = 0.1, center = false,$fn=resolution);
translate([0,0,0.5])
cylinder(h = 0.5, r1 = 0.2, r2 = 0, center = false,$fn=resolution);
}
////////////////////////////////
module repere(){
color("red")
rotate(90,[0,1,0]) //équivalent à rotate([0,90,0])
fleche(10);
color("green")
rotate(-90,[1,0,0])
fleche(10);
color("blue")
rotate(0,[0,1,0])
fleche(10);
}
////////////////////////////////
-------------------------------
use
repere();
/*
translate([1,2,3]) repere();
//équivalent à:
angle=0;
multmatrix(m = [ [cos(angle), -sin(angle), 0, 1],
[sin(angle), cos(angle), 0, 2],
[ 0, 0, 1, 3],
[ 0, 0, 0, 1]
]) repere();
*/
/*
rotate([0,0,45]) repere();
//équivalent à:
angle=45;
multmatrix(m = [ [cos(angle), -sin(angle), 0, 0],
[sin(angle), cos(angle), 0, 0],
[ 0, 0, 1, 0],
[ 0, 0, 0, 1]
]) repere();
*/
scale([0.5,1,2]) repere();
//équivalent à:
multmatrix(m = [ [0.5, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 1]
]) repere();
module repere(){
fleche("blue");
rotate([0,90,0])
fleche();
rotate(-90,[1,0,0])
fleche("green");
}
repere();
/*
rotate([-45,0,0])
translate([0,0,2])
rotate([45,0,0])
repere();
*/
/*
translate([0,sqrt(2),sqrt(2)])
repere();
*/
angle=0;
//rotation=360*$t; //pour faire un tour complet
rotation=90*sin(360*$t); //pour faire des allers retours
rotate([0,0,rotation])
multmatrix(m = [ [cos(angle), -sin(angle), 0, 0],
[sin(angle), cos(angle), 0, sqrt(2)],
[ 0, 0, 1, sqrt(2)],
[ 0, 0, 0, 1]
])
scale([0.5,1,1.5])
repere();
=====Exemple de modélisation Denavit-Hartenberg avancé=====
Matrice de Denavit Hartenberg, notation de Khalil et Kleinfinger page 3 de: https://www.gdr-robotique.org/cours_de_robotique/online/Khalil-Dombre_Modelisation/Khalil-Dombre_Modelisation.pdf
//B. Vandeportaele 2023
//les angles sont en degrés!
use
//////////////////////////////////
//matrice de Denavit Hartenberg, notation de Khalil et Kleinfinger page 3 de:
//https://www.gdr-robotique.org/cours_de_robotique/online/Khalil-Dombre_Modelisation/Khalil-Dombre_Modelisation.pdf
module matDh(alpha=0,d=0,theta=0,r=0){
multmatrix(m = [ [cos(theta) , -sin(theta), 0, d],
[cos(alpha)*sin(theta), cos(alpha)*cos(theta), -sin(alpha), -r*sin(alpha)],
[sin(alpha)*sin(theta), sin(alpha)*cos(theta), cos(alpha), r*cos(alpha)],
[ 0 , 0 , 0 , 1 ] ])
children();
}
//////////////////////////////////
module robot(tabtheta){
repere();
//exemples d'utilisation de matDh
//matDh(alpha=10,d=0,theta=0,r=0) repere();
//matDh(alpha=0,d=1,theta=0,r=0) repere();
//matDh(alpha=0,d=0,theta=10,r=0) repere();
//matDh(alpha=0,d=0,theta=0,r=1) repere();
//matDh(alpha=10,d=1,theta=10,r=1) repere();
//pour animer:
//matDh(alpha=10,d=1,theta=180*sin($t*360),r=1) repere();
///////////////////////////////////
d3=5;
rl4=6;
matDh(theta=tabtheta[1-1]){
repere();
matDh(alpha=90,theta=tabtheta[2-1]){
repere();
matDh(d=d3,theta=tabtheta[3-1]){
repere();
matDh(alpha=-90,theta=tabtheta[4-1],r=rl4){
repere();
matDh(alpha=90,theta=tabtheta[5-1]){
repere();
matDh(alpha=-90,theta=tabtheta[6-1]){
repere();
}
}
}
}
}
}
}
////////////////////////////////////////////////////////////////
//animer avec angle= $t*360
tabtheta=[$t*360,-10,0,0,0,0];
robot(tabtheta);
=====A faire pour la seconde séance=====
Modéliser la molécule d'eau: https://en.wikipedia.org/wiki/Properties_of_water
=====TD2=====
Modélisation d'une palette:
{{https://bvdp.inetdoc.net/files/iut/td_openscad/palette_td2.png}}
alt+Ins pour Wizard
rotation autour du 3eme axe: shift + clic gauche
faire une librairie (fleche et repere vers repere.scad)
include
include acts as if the contents of the included file were written in the including file, and
use imports modules and functions, but does not execute any commands other than those definitions.
forme 2d (polygon+texte) + extrusion linear_extrude(height,center,convexity,twist,slices)
scale pour le texte
# debug
union()
repere();
translate([0,100,0])
rotate([0,0,atan2(-50,100)])
module piece(jeu=0){...
variable globale resolution=> expliquer modèle pour différentes applications (simu ou impression 3D), mettre valeur petite pour accélérer le rendu pendant la conception
expliquer que c'est comme une constante car openscad est un langage fonctionnel, pas procédural: Values cannot be modified during run time;
for imbriqués
if
echo(…)
intersection()et difference()
hull()
minkowski(convexity)
à la toute fin, faire un module suppport avec Z vertical par rapport au plateau
expliquer:
polyhedron(points, faces, convexity)
import("….ext", convexity)
si il y a le temps expliquer script de compilation, 2 rendu avec resolutions différentes
====Version faite en TD====
//B. Vandeportaele 2023
use
eps=0.0001;
resolution=20; //paramètre pour régler le niveau de détail du modèle rendu
bords_arrondis=1; //1 pour sphere, 2 pour cylindre
/////////////////////
module piece(jeu=0){
rotate([90,0,0])
translate([0,0,-10])
cylinder(h=20,r=15+jeu,$fn=resolution);
}
/////////////////////
module palette(){
rotate([90,0,0])
union(){
difference(){
minkowski(){
#linear_extrude(height = 400, center = true, convexity = 10, twist =0)
polygon([[0,0],[100,0],[100,50],[0,100]], [[0,1,2,3]], convexity = 10);
if (bords_arrondis==1){
sphere(r=4,$fn=resolution);
} else {
//rotate([90,0,0])
cylinder(r=4,h=1,$fn=resolution);
}
}
translate([0,104,0])
rotate([0,0,atan2(-50,100)])
for (b =[1:2]){
for (a =[-4:4]){
echo(a+b*9); // affichage numéro pièce
if (((a+b*9) % 4 )!=0){
translate([b*42-5,0,a*42])
//scale([20,20,20]) repere();
piece(0.5);
}
}
}
translate([0,104,0])
rotate([0,0,atan2(-50,100)])
hull(){
for (b =[1,2]){
for (a =[-4,4]){
echo(a+b*9); // affichage numéro pièce
if (((a+b*9) % 4 )!=0){
translate([b*42-5,9,a*42])
//scale([20,20,20]) repere();
piece(0.5);
}
}
}
}
}
translate([15,10,205-eps])
scale([1.2,2.1,1])
linear_extrude(height = 10, center = true, convexity = 10, twist =0)
text("IUT GEII");
}
}
//////////////////:
palette();
====Version étendue====
include
////////////////////
//Paramètres réglables:
resolution=20; //résolution réglable pour générer le maillage
nbtrouj=7; //paramètre pour faire varier le nombre de trous sur l'axe j, valeur doit être impaire!
rayoncourbure=10; //rayon de courbure pour arrondir les arêtes,la palette n'est pas agrandie quand on change le rayon
////////////////////
module piece(jeu=0){
rotate([90,0,0])
translate([0,0,-10])
cylinder(h=20,r=15+jeu,$fn=resolution);
}
////////////////////
module palette(){
rotate([+90,0,0])
difference(){
union(){
#minkowski(){
linear_extrude(height = nbtrouj*42+22-2*rayoncourbure, center = true, convexity = 10)
//polygon(points=[[0,0],[100,0],[100,50],[0,100]],paths=[[0,1,2,3]]);
polygon(points=[[rayoncourbure,rayoncourbure],[100-rayoncourbure,rayoncourbure],[100-rayoncourbure,50-rayoncourbure*0.6],[rayoncourbure,100-rayoncourbure*1.6]],paths=[[0,1,2,3]]);
sphere(r=rayoncourbure,$fn=resolution); // ou rotate([90,0,0]) cylinder(r=4,$fn=resolution);
}
translate([20,20,((nbtrouj*42+22)/2)])
scale([1.2,2.1,1])
linear_extrude(height = 5, center = true, convexity = 10)
text("IUT GEII");
}
//hull()
{
translate([0,100,0])
//rotate([0,0,-atan(50/100)])
rotate([0,0,atan2(-50,100)])
//rotate([0,0,atan2(-50,100-14)])
//for (i=[-4:4]){
for (i=[-floor(nbtrouj/2):floor(nbtrouj/2)]){
for (j=[1:2]){
if(((j*9+i)%4)!=0){
translate([j*42-5,0,i*42]){
repere();
#piece();
}
}
else
echo("pas ici");
}
}
}
}
}
////////////////////
palette();