Assurez-vous câblé bras robotisé Edge « Sans fil » avec Arduino DIY + XBee (14 / 15 étapes)

Étape 14 : Code Arduino Sketch & traitement


Voici le Arduino Sketch et Processing Source Code (Arduino Sketch et traitement sont dans le même fichier zip ci-dessous) :

Si vous utilisez cette esquisse, veuillez régler la vitesse de transmission de votre XBee selon votre configuration de XBee.

void setup() {}
...
changer la vitesse de transmission selon votre XBee, j’ai mis mon XBee à 115200.
Serial.Begin(115200) ;
...

}

=== Sketch Arduino

Langue : Arduino
RobotArmControl.pde
//
par Sam Thongrong 26 février 2012
Rev.02
Tableau de commandes de contrôles :
{GripOut, GripIn, WristUp, WristDown, ElbowUp, ElbowDown,
ShoulderUp, shoulderDown, BaseCW, BaseCCW, LightOn, déconvolue, Stop} ;
int contrôle [13] = {0 x 47, 0x67, 0 x 57, 0x77, 0 x 45, 0 x 65,
0 x 53, 0x73, 0 x 42, 0x62, 0x4c, 0x6c, 0 x 58} ;

Base de
int baseEnablePin = 3 ;
int basePin1 = 16 ;
int basePin2 = 17 ;

Épaule
int shoulderEnablePin = 14 ;
int shoulderPin1 = 2 ;
int shoulderPin2 = 4 ;

Coude
int elbowEnablePin = 6 ;
int elbowPin1 = 7 ;
int elbowPin2 = 15 ;

Poignet
int wristEnablePin = 11 ;
int wristPin1 = 8 ;
int wristPin2 = 12 ;

Grip
int gripEnablePin = 10 ;
int gripPin1 = 9 ;
int gripPin2 = 5 ;

int ledPin = 13 ;

définir une variable pour stocker les octets envoyés à partir du port série
int incomingByte ;

void setup() {}
jeu light LED
pinMode (ledPin, sortie) ;
digitalWrite (ledPin, basse) ;

Définissez les broches SN754410 comme sorties :
pinMode (basePin1, sortie) ;
pinMode (basePin2, sortie) ;
pinMode (baseEnablePin, sortie) ;

pinMode (shoulderPin1, sortie) ;
pinMode (shoulderPin2, sortie) ;
pinMode (shoulderEnablePin, sortie) ;

pinMode (elbowPin1, sortie) ;
pinMode (elbowPin2, sortie) ;
pinMode (elbowEnablePin, sortie) ;

pinMode (wristPin1, sortie) ;
pinMode (wristPin2, sortie) ;
pinMode (wristEnablePin, sortie) ;

pinMode (gripPin1, sortie) ;
pinMode (gripPin2, sortie) ;
pinMode (gripEnablePin, sortie) ;

commencer à envoyer des données à 115200 Baud
J’ai mis mon débit en bauds Xbee à 115200 bps,
changer la vitesse de transmission selon votre XBee
Serial.Begin(115200) ;
}

void loop() {}
vérifier qu’il y a quelque chose dans le tampon de série
Si (Serial.available() > 0) {}
lire l’octet et la stocker dans notre variable
l’octet envoyé est en réalité une valeur ascii
incomingByte = Serial.read() ;
Notez l’enveloppe supérieure de chaque lettre !
chaque lettre tourne moteur différemment.

=== Grip
Poignée en
Si (incomingByte == {controls[0])}
gripIn() ;
}
Adhérence sur
Si (incomingByte == {controls[1])}
gripOut() ;
}

Poignet
Si (incomingByte == {controls[2])}
digitalWrite (wristPin1, basse) ;
digitalWrite (wristPin2, HIGH) ;
wristUp() ;
}
Si (incomingByte == {controls[3])}
wristDown() ;
}

=== Coude
Coude vers le haut
Si (incomingByte == {controls[4])}
elbowUp() ;
}
Coude vers le bas
Si (incomingByte == {controls[5])}
elbowDown() ;
}

=== Épaule
Épaules vers le haut
Si (incomingByte == {controls[6])}
shoulderUp() ;
}
L’épaule vers le bas
Si (incomingByte == {controls[7])}
shoulderDown() ;
}

=== Base de
Base droite
Si (incomingByte == {controls[8])}
baseRight() ;
}
Base de gauche
Si (incomingByte == {controls[9])}
baseLeft() ;
}

Light ON
Si (incomingByte == {controls[10])}
digitalWrite (ledPin, HIGH) ;
}
Lumière s’éteint
Si (incomingByte == {controls[11])}
digitalWrite (ledPin, basse) ;
}

Si un O est envoyé faire sûr que les moteurs sont éteints
Si (incomingByte == {controls[12])}
allStop() ;
}

Delay(100) ;
}
}

void gripIn() {}
digitalWrite (gripEnablePin, HIGH) ;
digitalWrite (gripPin1, basse) ;
digitalWrite (gripPin2, HIGH) ;
}

void gripOut() {}
digitalWrite (gripEnablePin, HIGH) ;
digitalWrite (gripPin2, basse) ;
digitalWrite (gripPin1, HIGH) ;
}

void wristUp() {}
digitalWrite (wristEnablePin, HIGH) ;
digitalWrite (wristPin1, basse) ;
digitalWrite (wristPin2, HIGH) ;
}

void wristDown() {}
digitalWrite (wristEnablePin, HIGH) ;
digitalWrite (wristPin2, basse) ;
digitalWrite (wristPin1, HIGH) ;
}

void elbowUp() {}
digitalWrite (elbowEnablePin, HIGH) ;
digitalWrite (elbowPin1, basse) ;
digitalWrite (elbowPin2, HIGH) ;
}

void elbowDown() {}
digitalWrite (elbowEnablePin, HIGH) ;
digitalWrite (elbowPin2, basse) ;
digitalWrite (elbowPin1, HIGH) ;
}

void shoulderUp() {}
digitalWrite (shoulderEnablePin, HIGH) ;
digitalWrite (shoulderPin1, basse) ;
digitalWrite (shoulderPin2, HIGH) ;
}

void shoulderDown() {}
digitalWrite (shoulderEnablePin, HIGH) ;
digitalWrite (shoulderPin2, basse) ;
digitalWrite (shoulderPin1, HIGH) ;
}

void baseRight() {}
digitalWrite (baseEnablePin, HIGH) ;
digitalWrite (basePin1, basse) ;
digitalWrite (basePin2, HIGH) ;
}

void baseLeft() {}
digitalWrite (baseEnablePin, HIGH) ;
digitalWrite (basePin2, basse) ;
digitalWrite (basePin1, HIGH) ;
}

void allStop() {}
digitalWrite (baseEnablePin, basse) ;
digitalWrite (basePin1, basse) ;
digitalWrite (basePin2, basse) ;

digitalWrite (shoulderEnablePin, basse) ;
digitalWrite (shoulderPin1, basse) ;
digitalWrite (shoulderPin2, basse) ;

digitalWrite (elbowEnablePin, basse) ;
digitalWrite (elbowPin1, basse) ;
digitalWrite (elbowPin2, basse) ;

digitalWrite (wristEnablePin, basse) ;
digitalWrite (wristPin1, basse) ;
digitalWrite (wristPin2, basse) ;

digitalWrite (gripEnablePin, basse) ;
digitalWrite (gripPin1, basse) ;
digitalWrite (gripPin2, basse) ;
}

=== Arduino fin

Voici le Code Source de la transformation. You'ill besoin du fichier d’image de fond, et tous les boutons des fichiers image afin de voir les boutons de commande sur l’écran.

Et tous l’arrière-plan et les boutons sont fournis ad il y a dans le dossier appelé données. Vous devrez avoir ce dossier que se trouve dans le même dossier du code de traitement (RobotArmControl.pde)

Langue : traitement
RobotArmControl.pde

par Sam Thongrong 26 février 2012

charger la bibliothèque de série pour le traitement
Import processing.serial.* ;
instance de la classe série
Port série ;

Tableau de commandes de contrôles :
GripOut, GripIn, WristUp, WristDown, ElbowUp, ElbowDown,
ShoulderUp, shoulderDown, BaseCW, BaseCCW, LightOn, déconvolue, Stop

contrôles d’int [] = new int [] {}
0 x 47, 0x67, 0 x 57, 0x77, 0 x 45, 0 x 65,
0 x 53, 0x73, 0 x 42, 0x62, 0x4c, 0x6c, 0 x 58} ;

Bouton d’image.
Chargement des images et les utiliser pour créer un bouton.
ImageButtons GripIn ;
ImageButtons GripOut ;
ImageButtons WristUp ;
ImageButtons WristDown ;
ImageButtons ElbowUp ;
ImageButtons ElbowDown ;
ImageButtons ShoulderUp ;
ImageButtons ShoulderDown ;
ImageButtons BaseCW ;
ImageButtons BaseCCW ;
ImageButtons LightOn ;
ImageButtons déconvolue ;

ImageButtons Pause ;

arrière-plan
Bg de Byte ;

définir la police
PFont myFont ;

Sub controlGUI()
{
BG = loadImage("background.jpg") ;
Background(BG) ;

int buttonSize = 44 ;

Byte sélectionné = loadImage("controlSel.png") ;

Poignée en
GripInImage Byte = loadImage("controlIn.png") ;
GripInOver Byte = loadImage("controlInOver.png") ;
GripIn = new ImageButtons (30, 83, buttonSize, buttonSize,
gripInImage, gripInOver, sélectionné) ;

Adhérence sur
GripOutImage Byte = loadImage("controlOut.png") ;
GripOutOver Byte = loadImage("controlOutOver.png") ;
GripOut = new ImageButtons (78, 83, buttonSize, buttonSize,
gripOutImage, gripOutOver, sélectionné) ;

Poignet vers le haut
WristUpImage Byte = loadImage("controlUp.png") ;
WristUpOver Byte = loadImage("controlUpOver.png") ;
WristUp = new ImageButtons (150, 36, buttonSize, buttonSize,
wristUpImage, wristUpOver, sélectionné) ;

Poignet vers le bas
WristDownImage Byte = loadImage("controlDown.png") ;
WristDownOver Byte = loadImage("controlDownOver.png") ;
WristDown = new ImageButtons (198, 36, buttonSize, buttonSize,
wristDownImage, wristDownOver, sélectionné) ;

Coude vers le haut
ElbowUpImage Byte = loadImage("controlUp.png") ;
ElbowUpOver Byte = loadImage("controlUpOver.png") ;
ElbowUp = new ImageButtons (258, 83, buttonSize, buttonSize,
elbowUpImage, elbowUpOver, sélectionné) ;

Coude vers le bas
ElbowDownImage Byte = loadImage("controlDown.png") ;
ElbowDownOver Byte = loadImage("controlDownOver.png") ;
ElbowDown = new ImageButtons (306, 83, buttonSize, buttonSize,
elbowDownImage, elbowDownOver, sélectionné) ;

Épaules vers le haut
ShoulderUpImage Byte = loadImage("controlUp.png") ;
ShoulderUpOver Byte = loadImage("controlUpOver.png") ;
ShoulderUp = new ImageButtons (208, 160, buttonSize, buttonSize,
shoulderUpImage, shoulderUpOver, sélectionné) ;

L’épaule vers le bas
ShoulderDownImage Byte = loadImage("controlDown.png") ;
ShoulderDownOver Byte = loadImage("controlDownOver.png") ;
ShoulderDown = new ImageButtons (256, 160, buttonSize, buttonSize,
shoulderDownImage, shoulderDownOver, sélectionné) ;

Base de CW
BaseCWImage Byte = loadImage("controlCW.png") ;
BaseCWOver Byte = loadImage("controlCWOver.png") ;
BaseCW = new ImageButtons (130, 234, buttonSize, buttonSize,
baseCWImage, baseCWOver, sélectionné) ;

Base CCW
BaseCCWImage Byte = loadImage("controlCCW.png") ;
BaseCCWOver Byte = loadImage("controlCCWOver.png") ;
BaseCCW = new ImageButtons (178, 234, buttonSize, buttonSize,
baseCCWImage, baseCCWOver, sélectionné) ;
Lumière sur
LightOnImage Byte = loadImage("LightOn.png") ;
LightOnOver Byte = loadImage("LightOnOver.png") ;
LightOn = new ImageButtons (30, 184, buttonSize, buttonSize,
lightOnImage, lightOnOver, sélectionné) ;

Lumière s’éteint
LightOffImage Byte = loadImage("LightOff.png") ;
LightOffOver Byte = loadImage("LightOffOver.png") ;
Déconvolue = new ImageButtons (78, 184, buttonSize, buttonSize,
lightOffImage, lightOffOver, sélectionné) ;

}

void setup() {}
Liste de tous les ports série disponibles dans le volet de sortie.
Vous devrez choisir le port qui est de la carte Arduino
connecté à partir de cette liste. Est le premier port dans la liste
port port #0 et le troisième dans la liste est le #2.
println(Serial.List()) ;
Ouvrir le port connecté à la carte Arduino
(dans ce cas #0)
Assurez-vous d’avoir ouvert le port à la même vitesse Qu'arduino est
en utilisant (112500 bits/s)
port = nouvelle série (ce, Serial.list() [1], 112500) ;

Sur la fenêtre PC, utilisez « Sortant » de l’appareil bluetooth
Celui-ci pour XBee
port = nouvelle série (this, "COM30", 115200) ;

taille de l’écran du programme
taille (145, 455) ;
taille (400, 300) ;
Smooth() ;

ellipse de test
ellipseMode(RADIUS) ;
textFont (createFont ("Verdana", 14)) ;

controlGUI() ;

}

void updateDisplay() {}

GripIn.update() ;
GripIn.display() ;
GripOut.update() ;
GripOut.display() ;

WristUp.update() ;
WristUp.display() ;
WristDown.update() ;
WristDown.display() ;

ElbowUp.update() ;
ElbowUp.display() ;
ElbowDown.update() ;
ElbowDown.display() ;

ShoulderUp.update() ;
ShoulderUp.display() ;
ShoulderDown.update() ;
ShoulderDown.display() ;

BaseCW.update() ;
BaseCW.display() ;
BaseCCW.update() ;
BaseCCW.display() ;

LightOn.update() ;
LightOn.display() ;
LightOff.update() ;
LightOff.display() ;
}

Envoyer des commandes
void sendCommands() {}

Grip
{if(GripIn.Pressed)}
port.Write(Controls[0]) ;
println ("Grip dans:" + (char)controls[0]) ;
}
{if(GripOut.Pressed)}
port.Write(Controls[1]) ;
println ("Grip Out:" + (char)controls[1]) ;
}
Si (mouseX > 30 & & mouseX < 129 & &
mouseY > 51 & & mouseY < 79) {}
port.Write(Controls[12]) ;
println (« Grip Stop! » + (char)controls[12]) ;
}

Poignet
{if(WristUp.Pressed)}
port.Write(Controls[2]) ;
println ("poignet vers le haut:" + (char)controls[2]) ;
}
{if(WristDown.Pressed)}
port.Write(Controls[3]) ;
println ("poignet vers le bas:" + (char)controls[3]) ;
}
Si (mouseX > 148 & & mouseX < 248 & &
mouseY > 5 & & mouseY < 33) {}
port.Write(Controls[12]) ;
println (« Poignet Stop! » + (char)controls[12]) ;
}

Coude
{if(ElbowUp.Pressed)}
port.Write(Controls[4]) ;
println ("coude vers le haut:" + (char)controls[4]) ;
}
{if(ElbowDown.Pressed)}
port.Write(Controls[5]) ;
println ("coude vers le bas:" + (char)controls[5]) ;
}
Si (mouseX > 258 & & mouseX < 358 & &
mouseY > 51 & & mouseY < 79) {}
port.Write(Controls[12]) ;
println (« Coude Stop! » + (char)controls[12]) ;
}

Épaule
{if(ShoulderUp.Pressed)}
port.Write(Controls[6]) ;
println ("épaule vers le haut:" + (char)controls[6]) ;
}
{if(ShoulderDown.Pressed)}
port.Write(Controls[7]) ;
println ("épaule vers le bas:" + (char)controls[7]) ;
}
Si (mouseX > 208 & & mouseX < 308 & &
mouseY > 130 & & mouseY < 158) {}
port.Write(Controls[12]) ;
println (« Épaule Stop! » + (char)controls[12]) ;
}

Base de
{if(BaseCW.Pressed)}
port.Write(Controls[8]) ;
println ("Base de rotation CW:" + (char)controls[8]) ;
}
{if(BaseCCW.Pressed)}
port.Write(Controls[9]) ;
println ("Base tourner CCW:" + (char)controls[9]) ;
}
Si (mouseX > 130 & & mouseX < 230 & &
mouseY > 202 & & mouseY < 230) {}
port.Write(Controls[12]) ;
println (« Base Stop! » + (char)controls[12]) ;
}

Lumière
{if(LightOn.Pressed)}
port.Write(Controls[10]) ;
println ("lumière sur:" + (char)controls[10]) ;
}
{if(LightOff.Pressed)}
port.Write(Controls[11]) ;
println ("lumière éteinte:" + (char)controls[11]) ;
}
}

void draw()
{
updateDisplay() ;

sendCommands() ;
}

Bouton & ImageButtons Classes
classe de bouton
{
int x, y ;
int w, h ;
couleur basecolor, highlightcolor ;
couleur currentcolor ;
booléenne plus = false ;
pressé de Boolean = false ;

pressed() Sub {}
Si (plus & & mousePressed) {}
pressé = true ;
} else {}
pressé = false ;
}
}

Boolean overRect (int x, int y, int width, int height) {}
Si (mouseX > = x & & mouseX < = x + largeur & &
mouseY > = y & & mouseY < = y + height) {}
retourne la valeur true ;
} else {}
retourne la valeur false ;
}
}
}

classe ImageButtons étend bouton
{
Byte base ;
Tableau de Byte ;
Byte
Byte currentimage ;

ImageButtons (int ix, iy int, int iw, int ih,
Ibase Byte, Byte iroll, idown Byte)
{
x = ix ;
y = iy ;
w = iw ;
h = ih ;
base = ibase ;
rouleau = iroll ;
bas = idown ;
currentimage = base ;
}

void update()
{
Over() ;
Pressed() ;
{if(Pressed)}
currentimage = vers le bas ;
} ElseIf (sur) {}
currentimage = rouleau ;
} else {}
currentimage = base ;
}
}

Sub over()
{
Si (overRect (x, y, w, h)) {}
plus = true ;
} else {}
plus = false ;
}
}

display() Sub
{
image (currentimage, x, y) ;
}
}

Fin de traitement

Pour contrôler le moteur bras Robot, déplace le curseur sur la touche souhaitée et cliquez sur.
Pour arrêter l’opération il suffit de déplacer le curseur à toute étiquette. Robot s’arrête.
Afin d’exploiter simultanément plusieurs moteurs, amenez le curseur sur les boutons requis, puis cliquez sur ces boutons.
Mais ne pas traîner le curseur passe sur les étiquettes, ce qui provoquent l’opération arrêter

Profitez!.

Articles Liés

Bras robot maison 3 axes avec Arduino Uno

Bras robot maison 3 axes avec Arduino Uno

Salut les gars,Il s'agit d'un bras robot 3 axes avec arduino uno carte, j'ai trouvé rien de ce que je peux utiliser comme un bras alors j'ai utilisé des règles en plastique assemblés avec de la colle. Je n'ai pas assez broches sur la carte arduino al
Tutoriel - aide HC06 Bluetooth adaptateurs série UART sans fil avec Arduino

Tutoriel - aide HC06 Bluetooth adaptateurs série UART sans fil avec Arduino

Envoi des données entre un Arduino ou compatible Office et un périphérique Bluetooth tel qu'un smartphone Android ou la tablette est très facile grâce à des modules Bluetooth HC-06 peu coûteux, que vous avez peut-être vu sur le marché. Ils sont égale
Programme de téléchargement sans fil pour Arduino sans câble USB

Programme de téléchargement sans fil pour Arduino sans câble USB

Programmateur sans fil Arduino est conçu pour télécharger le programme de votre PC/ordinateur portable à Arduino à bord juste par Bluetooth.Alors maintenant que vous pouvez mettre à jour le programme de cartes Arduino à laquelle était jointe dans la
La réalisation d’un cardan bricolage sans balais avec Arduino

La réalisation d’un cardan bricolage sans balais avec Arduino

Il s'agit d'une histoire de mon troisième projet avec gyro bon marché et Arduino.Après les précédentes deux projets, Simple pendule inversé et calligraphie 3D, j'ai pensé faire Caméra cardan avec Arduino. Puis j'ai eu trois stratégies pour le projet.
Longue portée, 1,8 km, Arduino pour Arduino communication sans fil avec le HC-12.

Longue portée, 1,8 km, Arduino pour Arduino communication sans fil avec le HC-12.

Dans ce instructable vous apprendrez comment communiquer entre Arduinos sur une longue distance jusqu'à 1,8 km en plein air.Le HC-12 est un module de communication sans fil port série qui est très utile, très puissant et facile à utiliser.Tout d'abor
* mise à jour * LED-tour « Hello », Vu-mètre avancé de détection musique sans qu’avec Arduino et l’interfaçage d’IC avec le logiciel PC Windows !

* mise à jour * LED-tour « Hello », Vu-mètre avancé de détection musique sans qu’avec Arduino et l’interfaçage d’IC avec le logiciel PC Windows !

LED-tour « Hello », Vu-mètre avancé de détection musique sans qu'avec Arduino d'ICet l'interfaçage avec le logiciel PC Windows ! Salut, tout le monde.Ce qui rend ce projet cool c'est le fait, que sa musique de télédétection, contrairement aux traditi
Faire un Robot sans fil avec un téléphone Android

Faire un Robot sans fil avec un téléphone Android

Dans ce Instructable nous allons construire un MouseBot.Le MouseBot est un robot de petite arduino sans fil qui vous pouvez de contrôler avec un ordinateur. Il ne nécessite pas un module Wi-Fi. Au lieu de cela, il utilise un téléphone android pour se
Comment construire un robot hexapode sans fil

Comment construire un robot hexapode sans fil

Voici une vidéo d'elle en action.Page Facebook donc vous pouvez garder à jour sur v2Avez-vous complété cette instructable ?  M'envoyer des photos et je vais l'ajouter sur cette page !Une fois terminé, vous aurez un robot marche qui est d'environ 2 pi
SensoDuino : Transformez votre téléphone Android en un Hub de capteurs sans fil pour Arduino

SensoDuino : Transformez votre téléphone Android en un Hub de capteurs sans fil pour Arduino

Mises à jour23 novembre 2013: SensoDuino 0,160 obtient un visage à gauche.Le 19 nov. 2031 : avis : la synergie incroyable entre Arduino & Android.19 novembre 2013: SensoDuino 0.159 est sorti. Téléphone Android date (y, m, d) et l'heure (h, m, s) sont
Geste car(robot) de contrôle avec Arduino et Android(bluetooth)

Geste car(robot) de contrôle avec Arduino et Android(bluetooth)

Salut les gens,Voici un projet intéressant pour tout ce que vous les esprits créatifs là-bas. Nous allons construire une voiture RC de Téléphone android contrôlée.Rien ne pouvait être plus fascinant que de voitures télécommandées. Celui-ci utilise le
Contrôle de moteur sans balai avec Arduino, récupéré moteur HD et des capteurs Hall

Contrôle de moteur sans balai avec Arduino, récupéré moteur HD et des capteurs Hall

il y a beaucoup d'intérêt ces jours-ci chez les amateurs dans le contrôle moteur Brushless DC (BLDC), qui ont amélioré la performance et une meilleure efficacité énergétique surREDUCTEUR traditionnels, mais sont plus difficiles à utiliser. Beaucoup d
Interrupteur de contrôle horaire (433MHz) sans fil de Arduino pour plusieurs périphériques

Interrupteur de contrôle horaire (433MHz) sans fil de Arduino pour plusieurs périphériques

J'ai écrit cette instructable parce que j'ai fait un projet similaire récemment et pensé qu'il serait agréable d'écrire mon travail et partager avec les autres.Ce que nous voulons atteindre avec cette instructable, est sans fil contrôler plusieurs ap
Eye-Fi, Bluetooth pont : impression sans fil avec un Eye-Fi, Polariod Pogo et un téléphone Android directe

Eye-Fi, Bluetooth pont : impression sans fil avec un Eye-Fi, Polariod Pogo et un téléphone Android directe

L'histoire derrière ce Instructable commence par Burning Man 2011 – comme un photographe amateur et un graveur de vierge, j'ai voulu personnes de cadeau avec photos sur la playa. Cependant, j'ai voulu utiliser mon D7000 « fantaisie » et pas un point
Comment faire un outil sans fil avec cordon

Comment faire un outil sans fil avec cordon

tout d'abord, votre question brûlante : pourquoi voudrait-on faire cela?!Eh bien, pour moi, il y avait quelques raisons :1. les piles sucent ! Et, lorsque vous utilisez une scie circulaire, scie-Jeannette ou pratiquement rien d'autre en permanence, d