====== 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}}