mire.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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 "Ce script permet de générer un fichier gcode"
  9. echo "afin de créer un damier en faisant varier la puissance du laser"
  10. echo "de 0 à 255 et générer des niveaux de gris"
  11. echo "La hauteur de la mire peut varier de quelques mm à cause des arrondis"
  12. echo ""
  13. echo "Le fichier gcode en sortie utilisera des coordonées relatives."
  14. echo ""
  15. echo "La procédure est la suivante :"
  16. echo "-connaitre la distance focale"
  17. echo "-connaitre le diamètre du laser"
  18. echo "-exécuter le fichier gcode"
  19. echo ""
  20. echo "Détail des options"
  21. echo -e "-f\tfocale du laser en mm"
  22. echo -e "-d\tdiamètre du laser en mm"
  23. echo -e "-v\tvitesse de gravure en mm/min"
  24. echo -e "-t\ttaille de la mire mm"
  25. }
  26. readonly VERSION='1.0'
  27. #affiche la version du script
  28. version()
  29. {
  30. echo "$(basename "${0}") : ${VERSION}"
  31. echo ''
  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. #boucle pour la gestion des options
  52. #s: signifie qu'un paramètre est attendu
  53. #hV signifie que ces options existent mais ne prennent pas de paramètre
  54. while getopts "d:f:v:t:hV" OPT
  55. do
  56. case "$OPT" in
  57. h)
  58. usage
  59. exit 0
  60. ;;
  61. V)
  62. version
  63. exit 0
  64. ;;
  65. d)
  66. #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly
  67. DIAMETRE=${OPTARG}
  68. ;;
  69. f)
  70. #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly
  71. FOCALE=${OPTARG}
  72. ;;
  73. v)
  74. #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly
  75. VITESSE=${OPTARG}
  76. ;;
  77. t)
  78. #afin de garantir le contenu de la variable il est préférable de la déclarer comme readonly
  79. TAILLE=${OPTARG}
  80. ;;
  81. *)
  82. #ce point est atteint lorsqu'une option inexistante est demandée
  83. echo "parametres non valide"
  84. usage
  85. exit 1
  86. ;;
  87. esac
  88. done
  89. verification "$DIAMETRE" "diamètre" 0.2
  90. DIAMETRE=$VALEUR
  91. echo -e "diamètre=$DIAMETRE"
  92. verification "$FOCALE" "focale" 5
  93. FOCALE=$VALEUR
  94. echo -e "focale=$FOCALE"
  95. verification "$VITESSE" "vitesse" 2000
  96. VITESSE=$VALEUR
  97. echo -e "vitesse=$VITESSE"
  98. verification "$TAILLE" "taille" 100
  99. TAILLE=$VALEUR
  100. echo -e "taille=$TAILLE"
  101. #la mire est constitué de carrés formant un dégradé
  102. #sur chaque ligne on gravera des carré de plus en plus foncés
  103. #on balaye donc sur une ligne des valeurs de n à n + 15
  104. #la largeur d'un carré est donnée par :
  105. # ($TAILLE - 15*$DIAMETRE)/16
  106. largeur=$(echo "scale=1; ($TAILLE - 15.0*$DIAMETRE)/16.0" | bc)
  107. demi_largeur=$(echo "scale=1; ($TAILLE - 15.0*$DIAMETRE)/32.0" | bc)
  108. hauteur_reelle=0
  109. echo -e "G91\nG21\nG0 Z $FOCALE" > sortie.gcode
  110. echo -e "G1 F$VITESSE\n" >> sortie.gcode
  111. for ligne in `seq 0 15`
  112. do
  113. for hauteur in `seq 0 $DIAMETRE $demi_largeur`
  114. do
  115. #on trace une ligne de $DIAMETRE d'épaisseur en faisant varier la puissance
  116. for colonne in `seq 0 15`
  117. do
  118. puissance=$(echo "16*$ligne + $colonne" | bc)
  119. echo -e "M106 P1 S$puissance\nG1 X$largeur" >> sortie.gcode
  120. done
  121. #une fois qu'on a tracé une ligne on se décalle d'abord sur Y
  122. echo -e "\n;Nouvelle ligne\nM400\nG1 X0 Y-$DIAMETRE" >> sortie.gcode
  123. hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc)
  124. #puis on repart dans l'autre sens
  125. for colonne in `seq 15 -1 0`
  126. do
  127. puissance=$(echo "16*$ligne + $colonne" | bc)
  128. echo -e "M106 P1 S$puissance\nG1 X-$largeur" >> sortie.gcode
  129. done
  130. echo -e "\n;Nouvelle ligne\nM400\nG1 X0 Y-$DIAMETRE" >> sortie.gcode
  131. hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc)
  132. done
  133. #à ce moment là on vient de finir une ligne de carrés
  134. #on place donc une délimitation avant de continuer
  135. echo -e "\nM106 P1 S255" >> sortie.gcode
  136. echo -e "G1 X$TAILLE" >> sortie.gcode
  137. echo -e "G1 X-$TAILLE" >> sortie.gcode
  138. echo -e "G1 X0 Y-$DIAMETRE" >> sortie.gcode
  139. hauteur_reelle=$(echo "scale=1; $hauteur_reelle + $DIAMETRE" | bc)
  140. echo -e "\nM106 P1 S0\nM400" >> sortie.gcode
  141. done
  142. #une fois fini on trace les délimitation verticales
  143. echo -e "\n;grille\nM106 P1 S255" >> sortie.gcode
  144. for colonne in `seq 1 8`
  145. do
  146. echo -e "G1 X0 Y$hauteur_reelle" >> sortie.gcode
  147. echo -e "G1 X$largeur" >> sortie.gcode
  148. echo -e "G1 X0 Y-$hauteur_reelle" >> sortie.gcode
  149. echo -e "G1 X$largeur" >> sortie.gcode
  150. done
  151. #on coupe le laser
  152. echo -e "\nM106 P1 S0" >> sortie.gcode
  153. exit 0