Outils pour utilisateurs

Outils du site


machine_a_peindre

Ceci est une ancienne révision du document !


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

Niki de Saint-Phalle

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 ...

QttNom Valeur Référence Fabricant Fabricant Réf. FournisseurFournisseur
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 contactsAWHW 40G-0202-T ASSMANN WSW 674-1252 RS
2 Connecteur IDC F 40 contacts09185406813 Harting 409-8720 RS.
2 Connecteur XHP 11 contactsXHP-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Ω MRS25000C2209FCT00 Vishay 683-3336 RS
1 Résistance 10kΩ
8 Résistance 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 :

Plateau

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.

Support Marqueur

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 qui va me permettre de trouver le point d'équilibre précis du plateau avec tout les accessoires :

Centre

$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 :

JOUR 17

29/12/2019

Test de l'équilibre du plateau avec les accessoires. Il est bien équilibré et le moteur entraine convenablement l'ensemble.

Avec l'inertie de l'ensemble, des pas “sautent”, donc il est nécessaire d'utiliser la roue dentée et les fourches optique afin de pouvoir établir une position précise.

Une modification du plateau est nécessaire pour que le coin inférieur droit puis passer dans la fourche de la lyre.

JOUR 17

25/01/2020

Finalisation de la pseudo-résidence au 108 pour voir la machine montée et la faire fonctionner. Voici le résultat :

Un autre angle permettant de voir la machine en fonctionnement :

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

Boîtier SFX ou TFX

Contrôleur de moteur pas à pas:

A3982

Consommables

Liens

machine_a_peindre.1603724304.txt.gz · Dernière modification : 2020/10/26 14:58 de Labomedia