taille_pixel.sh 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #!/bin/bash
  2. #fonction appelée en cas de paramètres non valide ou de l'option -h
  3. usage()
  4. {
  5. # "$(basename "${0}") pour gérer les espaces
  6. echo "$(basename "${0}") description"
  7. echo ''
  8. echo "Lorsqu'on cherche à graver une image avec un laser,"
  9. echo "si la taille des pixels est trop petite alors la machine"
  10. echo "devra traiter un grand nombre d'instructions très rapidement."
  11. echo "Ce script à pour but de générer un fichier gcode"
  12. echo "qui permettra de déterminer la taille de pixel la plus petite"
  13. echo "que la machine est capable de traiter à la vitesse souhaité"
  14. echo ""
  15. echo "Le fichier gcode en sortie utilisera des coordonées relatives."
  16. echo ""
  17. echo "La procédure est la suivante :"
  18. echo "-connaitre la distance focale"
  19. echo "-connaitre le diamètre du laser"
  20. echo "-connaitre la vitesse de gravure optimale"
  21. echo "-exécuter le fichier gcode"
  22. echo ""
  23. echo "Détail des options"
  24. echo -e "-h\tafficher cette aide"
  25. echo -e "-f\tfocale du laser en mm"
  26. echo -e "-d\tdiamètre du laser en mm"
  27. echo -e "-v\tvitesse de gravure en mm/min"
  28. echo -e "-t\ttaille de pixel minimale en mm"
  29. echo -e "-T\ttaille de pixel maximale en mm"
  30. echo -e "-p\tpas entre deux taille"
  31. echo -e "-l\tlargeur de la mire"
  32. }
  33. verification()
  34. {
  35. if [ -z $1 ]
  36. then
  37. echo "la variable $2 n'a pas été précisée, la valeur par défaut est $3"
  38. VALEUR=$3
  39. else
  40. re='^[0-9]+([.][0-9]+)?$'
  41. if ! [[ $1 =~ $re ]]
  42. then
  43. echo "l'argument $2 n'est pas un nombre"
  44. usage
  45. exit 25
  46. else
  47. VALEUR=$1
  48. fi
  49. fi
  50. }
  51. #les paramètres sont dans l'ordre :
  52. #puissance
  53. #axe
  54. #distance
  55. trace_ligne()
  56. {
  57. echo -e "M106 P1 S$1" >> sortie.gcode
  58. echo -e "G1 $2$3" >> sortie.gcode
  59. }
  60. #les paramètres sont dans l'ordre :
  61. #puissance
  62. #axe
  63. #distance
  64. #taille pixel
  65. trace_ligne_pixel()
  66. {
  67. for i in `seq 1 $4 $3`
  68. do
  69. trace_ligne $1 $2 $4
  70. done
  71. }
  72. #boucle pour la gestion des options
  73. #s: signifie qu'un paramètre est attendu
  74. #hV signifie que ces options existent mais ne prennent pas de paramètre
  75. OPTS=$(getopt -o h,f:,d:,v:,t:,T:,p:,l: -l test,v_min:,v_max: -- "$@" )
  76. eval set -- "$OPTS"
  77. while true
  78. do
  79. case "$1" in
  80. -h)
  81. usage
  82. exit 0
  83. ;;
  84. -f)
  85. FOCALE=$2
  86. shift 2
  87. ;;
  88. -d)
  89. DIAMETRE=$2
  90. shift 2
  91. ;;
  92. -v)
  93. VITESSE=$2
  94. shift 2
  95. ;;
  96. -t)
  97. TAILLE_MIN=$2
  98. shift 2
  99. ;;
  100. -T)
  101. TAILLE_MAX=$2
  102. shift 2
  103. ;;
  104. -p)
  105. PAS=$2
  106. shift 2
  107. ;;
  108. -l)
  109. LARGEUR=$2
  110. shift 2
  111. ;;
  112. --)
  113. shift
  114. break
  115. ;;
  116. *)
  117. echo "paramètres non valides"
  118. usage
  119. exit 1
  120. ;;
  121. esac
  122. done
  123. verification "$FOCALE" "focale" 5
  124. FOCALE=$VALEUR
  125. echo -e "focale=$FOCALE"
  126. verification "$DIAMETRE" "diamètre" 0.2
  127. DIAMETRE=$VALEUR
  128. echo -e "diamètre=$DIAMETRE"
  129. verification "$VITESSE" "vitesse" 1300
  130. VITESSE=$VALEUR
  131. echo -e "vitesse=$VITESSE"
  132. verification "$TAILLE_MIN" "taille_min" 0.1
  133. TAILLE_MIN=$VALEUR
  134. echo -e "taille_min=$TAILLE_MIN"
  135. verification "$TAILLE_MAX" "taille_max" 1
  136. TAILLE_MAX=$VALEUR
  137. echo -e "taille_max=$TAILLE_MAX"
  138. verification "$PAS" "pas" 0.1
  139. PAS=$VALEUR
  140. echo -e "pas=$PAS"
  141. verification "$LARGEUR" "largeur" 100
  142. LARGEUR=$VALEUR
  143. echo -e "largeur=$LARGEURS"
  144. #Pour que seq renvoie des nombre avec '.' et non ',' il faut :
  145. LANG=en_US
  146. largeur_carre=$(echo "scale=1; $LARGEUR/16.0" | bc)
  147. demi_largeur_carre=$(echo "scale=1; $LARGEUR/32.0" | bc)
  148. hauteur_reelle=0
  149. echo -e "$largeur_carre ; $demi_largeur_carre"
  150. #création du fichier openscad
  151. echo "\$fn = 30;valeur=\"0\";translate([-1, -1, 0]){text(valeur, size=3, valign=\"top\", halign=\"right\");}" > temp.scad
  152. echo -e "G91\nG21\nG0 Z $FOCALE" > sortie.gcode
  153. echo -e "G1 F$VITESSE\n" >> sortie.gcode
  154. for taille in `seq $TAILLE_MIN $PAS $TAILLE_MAX`
  155. do
  156. #génération du GCode pour noter la taille
  157. openscad -o temp.dxf -D 'valeur="'$taille'"' temp.scad
  158. dxf2gcode temp.dxf -q -e "${taille}.gcode"
  159. echo -e "\n;écriture de la taille : $taille\n" >> sortie.gcode
  160. cat $taille.gcode >> sortie.gcode
  161. rm $taille.gcode
  162. echo -e "\n;tracage d'une ligne\n" >> sortie.gcode
  163. for hauteur in `seq 0 $DIAMETRE $demi_largeur_carre`
  164. do
  165. echo -e "\n;ligne numéro : $hauteur\n" >> sortie.gcode
  166. #on trace une ligne de $DIAMETRE d'épaisseur en faisant varier la puissance
  167. for puissance in `seq 15 15 255`
  168. do
  169. echo -e "\n;carré de puissance : $puissance\n" >> sortie.gcode
  170. trace_ligne_pixel $puissance "X" $largeur_carre $taille
  171. done
  172. #une fois qu'on a tracé une ligne on se décalle d'abord sur Y
  173. echo -e "\n;Nouvelle ligne\nM400\nG1 X0 Y-$DIAMETRE" >> sortie.gcode
  174. hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc)
  175. #puis on repart dans l'autre sens
  176. for puissance in `seq 255 -15 15`
  177. do
  178. trace_ligne_pixel $puissance "X-" $largeur_carre $taille
  179. done
  180. echo -e "\n;Nouvelle ligne\nM400\nG1 X0 Y-$DIAMETRE" >> sortie.gcode
  181. hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc)
  182. done
  183. #à ce moment là on vient de finir une ligne de carrés
  184. #on place donc une délimitation avant de continuer
  185. echo -e "\nM106 P1 S255" >> sortie.gcode
  186. echo -e "G1 X$TAILLE" >> sortie.gcode
  187. echo -e "G1 X-$TAILLE" >> sortie.gcode
  188. echo -e "G1 X0 Y-$DIAMETRE" >> sortie.gcode
  189. hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc)
  190. echo -e "\nM106 P1 S0\nM400" >> sortie.gcode
  191. done
  192. #on coupe le laser
  193. echo -e "\nM106 P1 S0" >> sortie.gcode
  194. exit 0