Ceci est une ancienne révision du document !
Table des matières
Machine à peindre
Inspirations
“Non, la peinture n’est pas faite pour décorer les appartements. C’est un instrument de guerre offensive et défensive contre l’ennemi.”
Pablo Picasso
Réalisation
JOUR 1
09/11/2108
Base une lyre Robe Spot 250xt hors d'usage. La voici démontée :
Les deux moteurs pas-à-pas qui réalisent le pan et le tilt ont comme référence : 23HS0001-02
Les connecteurs de moteur JST :
Boitier - Code commande : RS 820-1523 / Référence fabricant : XHP-11 / Fabricant : JST
Cosse - Code commande RS : 820-1529 / Référence fabricant : BXH-001T-P0.6 / Fabricant : JST
Commutateur optique manquant : Code commande RS 708-5538 Référence fabricant TCST1103 Fabricant Vishay
JOUR 2
22/11/2108 Objectif : Réalisation du capteur optique manquant sur la roue codeuse du pan :
J'ai pris modèle sur le capteur du tilt. La surprise a été de constater que deux encodeurs optique étaient positionnés côte à côte.
JOUR 3
13/12/2108
Objectif : Compter le nombre de pas du pan avec l'encodeur optique. Résultat : ~2470
Code Arduino :
byte c2, c3; void setup() { Serial.begin(115200); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); c2 = digitalRead(2); c3 = digitalRead(3); } void loop() { if (c2 != digitalRead(2)) { c2 = digitalRead(2); byte b = c2 + (digitalRead(3) << 1); Serial.write(b); } if (c3 != digitalRead(3)) { c3 = digitalRead(3); byte b = digitalRead(2) + (c3 << 1); Serial.write(b); } }
Code Processing :
import processing.serial.*; Serial arduino; int val = 0; void setup() { String portArduino = Serial.list()[4]; arduino = new Serial(this, portArduino, 115200); } void draw() { } void serialEvent(Serial port) { val++; } void keyPressed() { switch(key) { case ' ' : println(val); break; case 'a' : val = 0; break; } }
JOUR 4
14/12/2108
Objectif : Faire fonctionner les capteurs à effet Hall du pan
J'ai repris le code Arduino de l'étape précédente. Pour la visualisation des capteurs, voici le code Processing :
import processing.serial.*; Serial arduino; byte lecture = 3; void setup() { size(500, 300); String portArduino = Serial.list()[4]; arduino = new Serial(this, portArduino, 115200); } void draw() { background(255); if ((lecture & 1) != 0) { fill(255); } else { fill(255, 0, 0); } rect(100, 100, 100, 100); if ((lecture & 2) != 0) { fill(255); } else { fill(255, 0, 0); } rect(300, 100, 100, 100); } void serialEvent(Serial port) { lecture = (byte)arduino.read(); }
Driver des moteurs pas à pas : NJM2670D2 fabricant JRC
Jours ...
Qtt | Nom | Valeur | Référence Fabricant | Fabricant | Réf. Fournisseur | Fournisseur |
---|---|---|---|---|---|---|
2 | Driver moteur | 4A | L298N | STMicroelectronics | 636-384 | RS |
2 | Dissipateur | 8.5°C/W | ML33 | AAVID THERMALLOY | 712-4263 | RS |
1 | Embase IDC | 40 contacts | AWHW 40G-0202-T | ASSMANN WSW | 674-1252 | RS |
2 | Connecteur IDC F | 40 contacts | 09185406813 | Harting | 409-8720 | RS. |
2 | Connecteur XHP | 11 contacts | XHP-11 | JST | 820-1523 | RS |
8 | Cosse à sertir | JST | BXH-001T-P0.6 | JST | 820-1529 | RS |
6 | Embase KK | 4 Contacts | 22-27-2041 | Molex | 483-8483 | RS |
2 | Embase KK | 2 Contacts | 22-27-2021 | Molex | 483-8461 | RS |
17 | Diode | 2A 100V | HER202G R0 | Taiwan Semiconductor | 688-1940 | RS |
2 | Résistance | 22 ohm. | MRS25000C2209FCT00 | Vishay | 683-3336 | RS |
1 | Résistance | 10k ohm | ||||
8 | Résistance | 1 ohm | CFR25J1R0 | TE Connectivity | 135-550 | RS |
1 | Condensateur | 470uF | 711-1129 | RS Pro | 711-1129 | RS |
1 | Condensateur | 100nF | USR1H0R1MDD | Nichicon | 475-8961 | RS |
1 | MOSFET canal N | 30A 60VA | STP36NF06L | STMicroelectronics | 486-5671 | RS |
JOUR 5
21/10/2019
Finition du PCB avec génération des fichiers Gerber. J'ai commandé le PCB chez Seed Studio :
JOUR 6
29/10/2019
Réalisation du gabarit pour fixer le support du “pinceau” sur le plaque emboutie soutenant le projecteur. Voici le fichier le code OpenSCAD :
$fn=40; Plaque(); module Plaque() { difference() { translate([-122, 0]) square([244, 100]); translate([-110, 10]) circle(d = 4); translate([110, 10]) circle(d = 4); translate([-110, 89]) circle(d = 4); translate([110, 89]) circle(d = 4); } }
JOUR 7
31/10/2019
Fraisage du plateau avec le code ci-dessous :
module Plateau() { difference() { hull() { // Forme translate([-10, 132]) circle(r=30); translate([10, 132]) circle(r=30); translate([91, 55]) circle(r=30); translate([91, -42]) circle(r=30); translate([10, -126]) circle(r=30); translate([-10, -126]) circle(r=30); translate([-91, 55]) circle(r=30); translate([-91, -42]) circle(r=30); } translate([0, -7.2]) { // Décalage pour que l'axe X soit l'axe dde rotation translate([-110, -39.5]) circle(d = 4.1); // Bas Gauche translate([110, -39.5]) circle(d = 4.1); // Bas Droite translate([-110, 39.5]) circle(d = 4.1); // Haut Gauche translate([110, 39.5]) circle(d = 4.1); // Haut Droite translate([-110, -39.5]) translate([65, 6]) circle(d = 4.1); // Bas Centre Gauche translate([-110, 39.5]) translate([65, 1]) circle(d = 4.1); // Haut Centre Gauche translate([110, -39.5]) translate([-65, 6]) circle(d = 4.1); // Bas Centre Droite translate([110, 39.5]) translate([-65, 1]) circle(d = 4.1); // Haut Centre Droite } translate([-10, -116]) square([20, 238]); // Emplacement marqueur translate([38, 48.3]) square([64, 4]); // Rainure renfort translate([-102, 48.3]) square([64, 4]); // // Rainure renfort translate([0, -4]) circle(d=26); // Sécurité // -103.3 Vis arrière // 90.7 Vis avant // 194 Distance entre deux vis // Support marqueur arrière translate([-20, -83.3]) circle(d = 4.1); translate([-20, -123.3]) circle(d = 4.1); translate([20, -83.3]) circle(d = 4.1); translate([20, -123.3]) circle(d = 4.1); // Support marqueur avant translate([-20, 110.7]) circle(d = 4.1); translate([-20, 70.7]) circle(d = 4.1); translate([20, 110.7]) circle(d = 4.1); translate([20, 70.7]) circle(d = 4.1); // Fixation Solénoïde translate([15, 25]) circle(d=3); translate([35, 25]) circle(d=3); translate([15, 55]) circle(d=3); translate([35, 55]) circle(d=3); } }
JOUR 8
01/11/2019
Conception du support de l'embout du marqueur :
module SupportEmbout() { difference() { union() { resize([43.3012702, 0, 0]) cylinder(d = 25, h = 55); // Cylindre principal hull() { // Platine de fixation translate([-30, 0, 0]) cylinder(d = 25, h = 6); translate([30, 0, 0]) cylinder(d = 25, h = 6); } } translate([-3, 0, 31.6492]) rotate([0, 30, 0]) union() { translate([0, 0, 22]) cube([60, 30, 30], center = true); // Cube pour le biseau resize([44.8, 0, 0]) cylinder(d = 18, h = 7); // Ellipse intérieure translate([0, 0, -32]) cylinder(d = 6, h = 100); // Axe de la vis de 40 translate([0, 0, -25]) { // Trou ecrou cylinder(d = 12, h = 5.5, $fn = 6); translate([-40, -5.2, 0]) cube([40, 10.4, 5.5]); } } // Trous de fixation translate([-30, 0, 0]) cylinder(d = 4.2, h = 6); translate([30, 0, 0]) cylinder(d = 4.2, h = 6); } }
JOUR 9
02/11/2019
Conception des supports de l'applicateur :
La distance entre le dessus du plateau en bois et l'axe de rotation est de 35,7mm.
module SupportMarqueur() { taille = 20; hauteur = 14.25; difference() { hull() { translate([0, 0, hauteur]) rotate([90, 0, 0]) cylinder(d = 20, h = taille); hull() { translate([20, -taille / 2, 0]) cylinder(d = taille, h = 0.1); translate([-20, -taille / 2, 0]) cylinder(d = taille, h = 0.1); } } translate([0, 0, hauteur]) rotate([90, 0, 0]) cylinder(d = 4, h = taille); // Trou de l'axe // Trous de vis translate([20, -taille / 2, 0]) cylinder(d = 4.2, h = 20); translate([-20, -taille / 2, 0]) cylinder(d = 4.2, h = 20); // Trous tête de vis translate([20, -taille / 2, 4]) cylinder(d = 8, h = 20); translate([-20, -taille / 2, 4]) cylinder(d = 8, h = 20); // Forme du cylindre translate([0, 10, hauteur]) rotate([0, 90, 0]) cylinder(d = 25.5, h = 200, center = true); translate([0, 10, 0]) cube([200, 20, 60], center = true); } }
JOUR 10
08/12/2019
Impression du support du S. Echec cuisant, j'ai retournée la pièce pour l'impression et oublié de mettre l'encoche de l'autre côté.
JOUR 11
09/12/2019
J'ai rectifié l'erreur d'hier et j'en ai profité pour peaufiner le tout :
module SupportSolenoide() { difference() { union() { hull() { translate([80, 47, 0]) cylinder(d = 14, h = 5); translate([80, 7, 0]) cylinder(d = 14, h = 5); translate([7, 47, 0]) cylinder(d = 14, h = 5); translate([7, 7, 0]) cylinder(d = 14, h = 5); } //Patte hull() { translate([77, -4, 0]) cylinder(d = 20, h = 5); translate([77, 58, 0]) cylinder(d = 20, h = 5); } // Extension solénoïde hull() { translate([91, 42, 0]) cylinder(d = 10, h = 7.5); translate([91, 12, 0]) cylinder(d = 10, h = 7.5); translate([49, 42, 0]) cylinder(d = 10, h = 7.5); translate([49, 12, 0]) cylinder(d = 10, h = 7.5); } } // Trous solénoïde translate([88, 38, 0]) cylinder(d = 3.2, h = 7.5); translate([88, 16, 0]) cylinder(d = 3.2, h = 7.5); translate([58, 38, 0]) cylinder(d = 3.2, h = 7.5); translate([58, 16, 0]) cylinder(d = 3.2, h = 7.5); // Tête de vis translate([88, 38, 0]) cylinder(d1 = 6.3, d2 = 3.2, h = 1.7); translate([88, 16, 0]) cylinder(d1 = 6.3, d2 = 3.2, h = 1.7); translate([58, 38, 0]) cylinder(d1 = 6.3, d2 = 3.2, h = 1.7); translate([58, 16, 0]) cylinder(d1 = 6.3, d2 = 3.2, h = 1.7); // Fixation translate([7, 7, 0]) cylinder(d = diamtreFixation, h = 6); translate([7, 47, 0]) cylinder(d = diamtreFixation, h = 6); // Passage écrou translate([41.5, 47, 0]) cube([11, 7, 7.5]); translate([47, 47, 0]) cylinder(d = 11, h = 7.5); //pattes translate([77, 58, 0]) cylinder(d = diamtreFixation, h = 6); translate([77, -4, 0]) cylinder(d = diamtreFixation, h = 6); // Passage marqueur translate([0, 17, 0]) cube([16, 20, 7]); translate([0, 17, 0]) cube([40, 20, 3]); } }
JOUR 12
10/12/2019
L'embout précédent s'est cassé au serrage de la courroie. J'ai modifié la position pour l'impression. De ce fait la fibre de PLA est perpendiculaire à l'effort. J'ai aussi augmenté l'épaisseur des pattes de serrage. L'ensemble des éléments du plateau sont imprimés. Il reste à équilibrer le plateau afin de diminuer les efforts sur le moteur de tilt.
module EmboutSolenoide() { largeurCourroie = 6; largeurEmbout = 50; profondeur = 18; longueurVis = 17; largeurCote = 10; difference() { union() { // Base hull() { translate([4, 0, 4]) rotate([-90, 0, 0]) cylinder(d = 8, h = profondeur); translate([largeurEmbout - 4, 0, 4]) rotate([-90, 0, 0]) cylinder(d = 8, h = profondeur); } // Côté gauche translate([0, 0, 4]) cube([largeurCote, profondeur, 13 + largeurCourroie / 2]); translate([0, profondeur / 2, 17 + largeurCourroie / 2]) rotate([0, 90, 0]) cylinder(d = profondeur, h = largeurCote); translate([-4, 0, 14 - largeurCourroie / 2]) cube([4, profondeur, largeurCourroie + 2]); // Passage courroie translate([-4, 0, 11]) rotate([0, 180, -90]) prisme(profondeur, 4, 4); // Côté droit translate([largeurEmbout - largeurCote, 0, 4]) cube([largeurCote, profondeur, 13 + largeurCourroie / 2]); translate([largeurEmbout - largeurCote, profondeur / 2, 17 + largeurCourroie / 2]) rotate([0, 90, 0]) cylinder(d = profondeur, h = largeurCote); translate([largeurEmbout, 0, 14 - largeurCourroie / 2]) cube([4, profondeur, largeurCourroie + 2]); // Passage courroie translate([largeurEmbout + 4, profondeur, 11]) rotate([0, 180, 90]) prisme(profondeur, 4, 4); // Partie centrale hull() { translate([largeurEmbout / 2, 0, 15]) rotate([-90, 0, 0]) cylinder(d = 22, h = profondeur); translate([largeurCote, 0, 8]) cube([largeurEmbout - 2 * largeurCote, profondeur, 0.1]); } } // Axe solénoïde translate([largeurEmbout / 2, 0, 15]) rotate([-90, 0, 0]) cylinder(d = 12.1, h = 13); // Encoches translate([largeurCote / 2, 0, 5]) Trapeze(0.5, 1.5, profondeur, 30); translate([largeurEmbout - largeurCote / 2, 0, 5]) Trapeze(0.5, 1.5, profondeur, 30); // Vis translate([0, profondeur / 2, 17 + largeurCourroie / 2]) rotate([0, 90, 0]) cylinder(d = 4, h = longueurVis); translate([largeurEmbout - longueurVis, profondeur / 2, 17 + largeurCourroie / 2]) rotate([0, 90, 0]) cylinder(d = 4, h = longueurVis); // Tête de vis translate([-4, profondeur / 2, 17 + largeurCourroie / 2]) rotate([0, 90, 0]) cylinder(d = 7, h = 4); translate([largeurEmbout, profondeur / 2, 17 + largeurCourroie / 2]) rotate([0, 90, 0]) cylinder(d = 7, h = 4); // Ecrou translate([largeurCote, profondeur / 2, 17 + largeurCourroie / 2]) rotate([0, 90, 0]) cylinder(d = 8, h = 5.6); translate([largeurEmbout - largeurCote -5.6, profondeur / 2, 17 + largeurCourroie / 2]) rotate([0, 90, 0]) cylinder(d = 8, h = 5.6); // Fixation sur solenoide translate([largeurEmbout / 2, 7, 10]) cylinder(d = 3.3, h = 20); translate([largeurEmbout / 2, 7, 1]) cylinder(d = 3.1, h = 15); // Arrondisseur translate([0, 4, 0]) rotate([0, 0, 180]) arrondisseurAngle(4, 30); translate([largeurEmbout, 4, 0]) rotate([0, 0, -90]) arrondisseurAngle(4, 30); } } module arrondisseurAngle(rayon, hauteur) { difference() { cube([rayon, rayon, hauteur]); cylinder(r = rayon, h = hauteur); } } module Trapeze(b1, b2, p, h) { CubePoints = [ [ -b1 / 2, 0, 0 ], //0 [ b1 / 2, 0, 0 ], //1 [ b1 / 2, p, 0 ], //2 [ -b1 / 2, p, 0 ], //3 [ -b2 / 2, 0, h ], //4 [ b2 / 2, 0, h ], //5 [ b2 / 2, p, h ], //6 [ -b2 / 2, p, h ]]; //7 CubeFaces = [ [0,1,2,3], // Base [4,5,1,0], // Face [7,6,5,4], // Haut [5,6,2,1], // Droite [6,7,3,2], // Arrière [7,4,0,3]]; // Gauche polyhedron( CubePoints, CubeFaces ); }
JOUR 13
24/12/2019
Echec lamentable d'impression des outils pour centrer le dispositif de peinture.
JOUR 14
25/12/2019
Passage par la fraiseuse numérique avec l'utilisation d'un conte-plaqué de 5mm afin d'obtenir ceci :
$fn = 50; Decalage(); module Decalage() { difference() { // Base hull() { circle(d = 60); translate([25, 0, 0]) circle(d = 60); } for (i = [-26: 5 : 50]) { translate([i, 0]) circle(d = 3); // Trou de l'axe } translate([-50, 22.63]) square([100, 100]); for (i = [0 : 3]) { for (j = [0 : 6: 24]) { translate([j, 0]) rotate(90 * i) translate([18, 18]) circle(d = 4.2); // Trous de fixations 1 } } } }
JOUR 15
26/12/2019
La fraiseuse numérique à encore travailler. Aujourd'hui réalisation du plateau avec les corrections faites au fil du temps :
module Plateau() { difference() { hull() { // Forme translate([-20, 132]) circle(r=30); translate([111, 152]) circle(r=10); translate([111, -162]) circle(r=10); translate([-20, -142]) circle(r=30); translate([-91, 45]) circle(r=30); translate([-91, -52]) circle(r=30); } // Vis support lyre translate([-110, -42]) circle(d = 4); // Bas Gauche translate([110, -42]) circle(d = 4); // Bas Droite translate([-110, 22]) circle(d = 4); // Haut Gauche translate([110, 22]) circle(d = 4); // Haut Droite translate([-45, -36]) circle(d = 4); // Bas Centre Gauche translate([-45, 23]) circle(d = 4); // Haut Centre Gauche translate([45, -36]) circle(d = 4); // Bas Centre Droite translate([45, 23]) circle(d = 4); // Haut Centre Droite translate([-10, -116]) square([20, 155]); // Emplacement marqueur // Passage embout translate([0, 109]) circle(d = 26); translate([-10, 77]) square([20, 32]); translate([-10, 39.1]) square([20, 37.8]); // Poche de 1mm de profondeur translate([38, 37]) square([64, 5]); // Rainure renfort droite translate([-102, 37]) square([64, 5]); // // Rainure renfort gauche translate([0, -4]) circle(d=26); // Sécurité // -103.3 Vis arrière // 90.7 Vis avant // 194 Distance entre deux vis // Support marqueur arrière translate([-20, -83]) circle(d = 4.1); translate([-20, -123]) circle(d = 4.1); translate([20, -83]) circle(d = 4.1); //translate([20, -123]) circle(d = 4.1); // Support marqueur avant translate([-20, 111]) circle(d = 4.1); translate([-20, 71]) circle(d = 4.1); translate([20, 111]) circle(d = 4.1); translate([20, 71]) circle(d = 4.1); // Support Bouteille translate([31, -153]) circle(d = 4.1); translate([111, -153]) circle(d = 4.1); translate([111, -103]) circle(d = 4.1); // Support Solénoïde translate([-31, -153]) circle(d = 4.1); // Support Embout Bouteille translate([41, 154]) circle(d = 4.1); translate([101, 154]) circle(d = 4.1); translate([41, 126]) circle(d = 4.1); translate([101, 126]) circle(d = 4.1); } }
Une erreur existe encore, mais je la corrigerais peut-être plus tard. Il reste encore à vérifier que le plateau soit bien équilibré par rapport à 'axe de rotation.
JOUR 16
27/12/2019
Mise au point du test logiciel pour la rotation des différents axes. Réussite absolue comme cette vidéo en témoigne :
Matériel
Visserie
Qtt | Nom | Diamètre | Taille | Référence | Remarques |
---|---|---|---|---|---|
20 | Vis TCHC acier 8.8 noir EF DIN 912 | 4 | 20 | TCHC04/020A8NOEF | FIXNVIS |
20 | Vis TCHC acier 8.8 noir EF DIN 912 | 4 | 30 | TCHC04/030A8NOEF | FIXNVIS |
1 | Ecrou carré DIN 557 | 5 | 8x8x4 | ECRCAR05/08/08/4ZN | FIXNVIS |
1 | Ecrou nylstop acier zingué blanc DIN 985 | 4 | ECRNYL04ZN | FIXNVIS | |
1 | Rondelle acier zingué blanc NFE 25513 | 4 | M | RONM04ZN | FIXNVIS |
Qtt | Nom | Diamètre | Taille | Référence | Remarques |
---|---|---|---|---|---|
4 | Vis tête cylindrique hexagonale creuse | UNF 10-32 | 1'' | eBay | |
1 | Vis TCHC acier 8.8 noir EF DIN 912 | 3 | 20 | TCHC03/020A8NOEF | FIXNVIS |
2 | Vis TCHC acier 8.8 noir EF DIN 912 | 4 | 16 | TCHC04/016A8NOEF | FIXNVIS |
1 | Vis TCHC acier 8.8 noir EF DIN 912 | 5 | 40 | TCHC05/040A8NOEF | FIXNVIS |
4 | Vis TFHC acier 10.9 noir EF DIN 7991 | 3 | 12 | TFHC03/012A10NOEF | FIXNVIS |
Alimentation
Consommables
Liens
Pour les PCB :
Tutoriel : http://riton-duino.blogspot.com/2018/11/concevoir-un-pcb.html
Joystick :
https://gist.github.com/jasonwhite/c5b2048c15993d285130
https://gist.github.com/meghprkh/9cdce0cd4e0f41ce93413b250a207a55
Circuit :
https://reprap.org/wiki/Stepper_Motor_Driver_2.3
http://www.cuteminds.com/en/elettronicagen/elettronica/36-controller-bipolare-con-a3982-allegro