|
@@ -0,0 +1,234 @@
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+#fonction appelée en cas de paramètres non valide ou de l'option -h
|
|
|
+usage()
|
|
|
+{
|
|
|
+ # "$(basename "${0}") pour gérer les espaces
|
|
|
+ echo "$(basename "${0}") description"
|
|
|
+ echo ''
|
|
|
+ echo "Lorsqu'on cherche à graver une image avec un laser,"
|
|
|
+ echo "si la taille des pixels est trop petite alors la machine"
|
|
|
+ echo "devra traiter un grand nombre d'instructions très rapidement."
|
|
|
+ echo "Ce script à pour but de générer un fichier gcode"
|
|
|
+ echo "qui permettra de déterminer la taille de pixel la plus petite"
|
|
|
+ echo "que la machine est capable de traiter à la vitesse souhaité"
|
|
|
+ echo ""
|
|
|
+ echo "Le fichier gcode en sortie utilisera des coordonées relatives."
|
|
|
+ echo ""
|
|
|
+ echo "La procédure est la suivante :"
|
|
|
+ echo "-connaitre la distance focale"
|
|
|
+ echo "-connaitre le diamètre du laser"
|
|
|
+ echo "-connaitre la vitesse de gravure optimale"
|
|
|
+ echo "-exécuter le fichier gcode"
|
|
|
+ echo ""
|
|
|
+ echo "Détail des options"
|
|
|
+ echo -e "-h\tafficher cette aide"
|
|
|
+ echo -e "-f\tfocale du laser en mm"
|
|
|
+ echo -e "-d\tdiamètre du laser en mm"
|
|
|
+ echo -e "-v\tvitesse de gravure en mm/min"
|
|
|
+ echo -e "-t\ttaille de pixel minimale en mm"
|
|
|
+ echo -e "-T\ttaille de pixel maximale en mm"
|
|
|
+ echo -e "-p\tpas entre deux taille"
|
|
|
+ echo -e "-l\tlargeur de la mire"
|
|
|
+}
|
|
|
+
|
|
|
+verification()
|
|
|
+{
|
|
|
+ if [ -z $1 ]
|
|
|
+ then
|
|
|
+ echo "la variable $2 n'a pas été précisée, la valeur par défaut est $3"
|
|
|
+ VALEUR=$3
|
|
|
+ else
|
|
|
+ re='^[0-9]+([.][0-9]+)?$'
|
|
|
+ if ! [[ $1 =~ $re ]]
|
|
|
+ then
|
|
|
+ echo "l'argument $2 n'est pas un nombre"
|
|
|
+ usage
|
|
|
+ exit 25
|
|
|
+ else
|
|
|
+ VALEUR=$1
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+#les paramètres sont dans l'ordre :
|
|
|
+#puissance
|
|
|
+#axe
|
|
|
+#distance
|
|
|
+trace_ligne()
|
|
|
+{
|
|
|
+ echo -e "M106 P1 S$1" >> sortie.gcode
|
|
|
+ echo -e "G1 $2$3" >> sortie.gcode
|
|
|
+}
|
|
|
+
|
|
|
+#les paramètres sont dans l'ordre :
|
|
|
+#puissance
|
|
|
+#axe
|
|
|
+#distance
|
|
|
+#taille pixel
|
|
|
+trace_ligne_pixel()
|
|
|
+{
|
|
|
+ for i in `seq 1 $4 $3`
|
|
|
+ do
|
|
|
+ trace_ligne $1 $2 $4
|
|
|
+ done
|
|
|
+}
|
|
|
+
|
|
|
+#boucle pour la gestion des options
|
|
|
+#s: signifie qu'un paramètre est attendu
|
|
|
+#hV signifie que ces options existent mais ne prennent pas de paramètre
|
|
|
+OPTS=$(getopt -o h,f:,d:,v:,t:,T:,p:,l: -l test,v_min:,v_max: -- "$@" )
|
|
|
+eval set -- "$OPTS"
|
|
|
+
|
|
|
+while true
|
|
|
+do
|
|
|
+ case "$1" in
|
|
|
+ -h)
|
|
|
+ usage
|
|
|
+ exit 0
|
|
|
+ ;;
|
|
|
+ -f)
|
|
|
+ FOCALE=$2
|
|
|
+ shift 2
|
|
|
+ ;;
|
|
|
+ -d)
|
|
|
+ DIAMETRE=$2
|
|
|
+ shift 2
|
|
|
+ ;;
|
|
|
+ -v)
|
|
|
+ VITESSE=$2
|
|
|
+ shift 2
|
|
|
+ ;;
|
|
|
+ -t)
|
|
|
+ TAILLE_MIN=$2
|
|
|
+ shift 2
|
|
|
+ ;;
|
|
|
+ -T)
|
|
|
+ TAILLE_MAX=$2
|
|
|
+ shift 2
|
|
|
+ ;;
|
|
|
+ -p)
|
|
|
+ PAS=$2
|
|
|
+ shift 2
|
|
|
+ ;;
|
|
|
+ -l)
|
|
|
+ LARGEUR=$2
|
|
|
+ shift 2
|
|
|
+ ;;
|
|
|
+ --)
|
|
|
+ shift
|
|
|
+ break
|
|
|
+ ;;
|
|
|
+ *)
|
|
|
+ echo "paramètres non valides"
|
|
|
+ usage
|
|
|
+ exit 1
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
+done
|
|
|
+
|
|
|
+verification "$FOCALE" "focale" 5
|
|
|
+FOCALE=$VALEUR
|
|
|
+echo -e "focale=$FOCALE"
|
|
|
+
|
|
|
+verification "$DIAMETRE" "diamètre" 0.2
|
|
|
+DIAMETRE=$VALEUR
|
|
|
+echo -e "diamètre=$DIAMETRE"
|
|
|
+
|
|
|
+verification "$VITESSE" "vitesse" 1300
|
|
|
+VITESSE=$VALEUR
|
|
|
+echo -e "vitesse=$VITESSE"
|
|
|
+
|
|
|
+verification "$TAILLE_MIN" "taille_min" 0.1
|
|
|
+TAILLE_MIN=$VALEUR
|
|
|
+echo -e "taille_min=$TAILLE_MIN"
|
|
|
+
|
|
|
+verification "$TAILLE_MAX" "taille_max" 1
|
|
|
+TAILLE_MAX=$VALEUR
|
|
|
+echo -e "taille_max=$TAILLE_MAX"
|
|
|
+
|
|
|
+verification "$PAS" "pas" 0.1
|
|
|
+PAS=$VALEUR
|
|
|
+echo -e "pas=$PAS"
|
|
|
+
|
|
|
+verification "$LARGEUR" "largeur" 100
|
|
|
+LARGEUR=$VALEUR
|
|
|
+echo -e "largeur=$LARGEURS"
|
|
|
+
|
|
|
+#Pour que seq renvoie des nombre avec '.' et non ',' il faut :
|
|
|
+LANG=en_US
|
|
|
+
|
|
|
+largeur_carre=$(echo "scale=1; $LARGEUR/16.0" | bc)
|
|
|
+demi_largeur_carre=$(echo "scale=1; $LARGEUR/32.0" | bc)
|
|
|
+hauteur_reelle=0
|
|
|
+
|
|
|
+echo -e "$largeur_carre ; $demi_largeur_carre"
|
|
|
+
|
|
|
+#création du fichier openscad
|
|
|
+echo "\$fn = 30;valeur=\"0\";translate([-1, -1, 0]){text(valeur, size=3, valign=\"top\", halign=\"right\");}" > temp.scad
|
|
|
+
|
|
|
+echo -e "G91\nG21\nG0 Z $FOCALE" > sortie.gcode
|
|
|
+echo -e "G1 F$VITESSE\n" >> sortie.gcode
|
|
|
+
|
|
|
+for taille in `seq $TAILLE_MIN $PAS $TAILLE_MAX`
|
|
|
+do
|
|
|
+ #génération du GCode pour noter la taille
|
|
|
+ openscad -o temp.dxf -D 'valeur="'$taille'"' temp.scad
|
|
|
+ dxf2gcode temp.dxf -q -e "${taille}.gcode"
|
|
|
+
|
|
|
+ echo -e "\n;écriture de la taille : $taille\n" >> sortie.gcode
|
|
|
+ cat $taille.gcode >> sortie.gcode
|
|
|
+
|
|
|
+ rm $taille.gcode
|
|
|
+
|
|
|
+ echo -e "\n;tracage d'une ligne\n" >> sortie.gcode
|
|
|
+
|
|
|
+ for hauteur in `seq 0 $DIAMETRE $demi_largeur_carre`
|
|
|
+ do
|
|
|
+ echo -e "\n;ligne numéro : $hauteur\n" >> sortie.gcode
|
|
|
+
|
|
|
+ #on trace une ligne de $DIAMETRE d'épaisseur en faisant varier la puissance
|
|
|
+ for puissance in `seq 15 15 255`
|
|
|
+ do
|
|
|
+ echo -e "\n;carré de puissance : $puissance\n" >> sortie.gcode
|
|
|
+ trace_ligne_pixel $puissance "X" $largeur_carre $taille
|
|
|
+ done
|
|
|
+
|
|
|
+ #une fois qu'on a tracé une ligne on se décalle d'abord sur Y
|
|
|
+ echo -e "\n;Nouvelle ligne\nM400\nG1 X0 Y-$DIAMETRE" >> sortie.gcode
|
|
|
+ hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc)
|
|
|
+
|
|
|
+ #puis on repart dans l'autre sens
|
|
|
+ for puissance in `seq 255 -15 15`
|
|
|
+ do
|
|
|
+ trace_ligne_pixel $puissance "X-" $largeur_carre $taille
|
|
|
+ done
|
|
|
+
|
|
|
+ echo -e "\n;Nouvelle ligne\nM400\nG1 X0 Y-$DIAMETRE" >> sortie.gcode
|
|
|
+ hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc)
|
|
|
+ done
|
|
|
+ #à ce moment là on vient de finir une ligne de carrés
|
|
|
+ #on place donc une délimitation avant de continuer
|
|
|
+ echo -e "\nM106 P1 S255" >> sortie.gcode
|
|
|
+ echo -e "G1 X$TAILLE" >> sortie.gcode
|
|
|
+ echo -e "G1 X-$TAILLE" >> sortie.gcode
|
|
|
+ echo -e "G1 X0 Y-$DIAMETRE" >> sortie.gcode
|
|
|
+ hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc)
|
|
|
+
|
|
|
+ echo -e "\nM106 P1 S0\nM400" >> sortie.gcode
|
|
|
+done
|
|
|
+
|
|
|
+#une fois fini on trace les délimitation verticales
|
|
|
+echo -e "\n;grille\nM106 P1 S255" >> sortie.gcode
|
|
|
+for colonne in `seq 1 8`
|
|
|
+do
|
|
|
+ echo -e "G1 X0 Y$hauteur_reelle" >> sortie.gcode
|
|
|
+ echo -e "G1 X$largeur_carre" >> sortie.gcode
|
|
|
+ echo -e "G1 X0 Y-$hauteur_reelle" >> sortie.gcode
|
|
|
+ echo -e "G1 X$largeur_carre" >> sortie.gcode
|
|
|
+done
|
|
|
+
|
|
|
+#on coupe le laser
|
|
|
+echo -e "\nM106 P1 S0" >> sortie.gcode
|
|
|
+
|
|
|
+exit 0
|