====== 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 [[https://www.youtube.com/watch?v=s5MUxuY4Hbw|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 : {{media_03:demontage.jpg?400|}} 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 : {{media_03:encodeur.jpg?400|}} 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 {{media_09:montage.jpg?400|}} 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 {{media_06:hall_map.jpg?400|}} 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Ω |MRS25000C2209FCT00 |Vishay |683-3336 |RS | |1 |Résistance |10kΩ | | | | | |8 |Résistance |1Ω |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 [[https://www.seeedstudio.com/fusion_pcb.html|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 : {{media_11:plateau.png?400|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 : {{media_12:supportembout.png?400 |}} 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. {{media_12:supportmarqueur.png?400 |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 : {{media_05:centrage.png?direct&400|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 : {{test_rotation.mp4|Rotation}} ==== 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 : {{ media_08:map_coeur.mp4 |}} Un autre angle permettant de voir la machine en fonctionnement : {{ media_08:map_coeur2.mp4 |}} ===== 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 [[https://www.ldlc.com/informatique/pieces-informatique/alimentation-pc/c4289/+fv1911-10773.html|SFX]] ou [[https://www.ldlc.com/informatique/pieces-informatique/alimentation-pc/c4289/+fv1911-10775.html|TFX]] Contrôleur de moteur pas à pas: A3982 ==== Consommables ==== [[https://www.geant-beaux-arts.fr/papier-recycle-110g-m-1-x-50m-gris-clair-rouleau.html|Papier gris 1 x 50]] ===== Liens ===== Pour les PCB : [[http://riton-duino.blogspot.com/2018/11/concevoir-un-pcb.html|Tutoriel]] [[https://www.pcbway.com|pcbway]] [[https://oshpark.com|oshpark]] [[https://forum.hardware.fr/hfr/electroniquedomotiquediy/conception_depannage_mods/concevoir-fabriquer-presque-sujet_645_6.htm|Forum PCB : concevoir et fabriquer comme un pro (ou presque)]] A tester pour un clavier : [[https://gitlab.freedesktop.org/libevdev/libevdev/blob/master/tools/libevdev-events.c|libevdev-events]] Joystick : [[https://gist.github.com/jasonwhite/c5b2048c15993d285130|Reads joystick/gamepad events on Linux and displays them.]] [[https://gist.github.com/meghprkh/9cdce0cd4e0f41ce93413b250a207a55|Libevdev playground]] Circuit : [[https://reprap.org/wiki/Stepper_Motor_Driver_2.3|Stepper Motor Driver 2.3]] [[http://www.cuteminds.com/en/elettronicagen/elettronica/36-controller-bipolare-con-a3982-allegro|A3982 bipolar small stepper motor controller]] Logiciel : PWM : [[https://librpip.frasersdev.net/peripheral-config/pwm0and1/|PWM0 & 1]] PWM : [[https://github.com/raspberrypi/firmware/issues/1178|RPI4 : PWM0 & PWM1 Alternate pins]] ISR : [[https://gist.github.com/ast/a19813fce9d34c7240091db11b8190dd|How to read a quadrature encoder in C on the Raspberry Pi GPIO, using the wiringPi library]] Câble : [[https://yadom.fr/plateformes-de-developpement/raspberry-pi/alimentations/cable-usb-c-coude-alimentation-raspberry-pi-4.html|yadom]] [[https://www.amazon.fr/gp/product/B07V6PVPKB|Amazon]] [[http://www.phartech.it|Fabricant de billes]] [[http://paintballfactory.pl/fr/page-daccueil/|Autre piste]] {{tag>sylvain}}