123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- #!/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
- #on coupe le laser
- echo -e "\nM106 P1 S0" >> sortie.gcode
- exit 0
|