Robot arm 3D printed openscad

Robot arm 3D printed openscad è il secondo articolo dedicato alla realizzazione di un cobot o co-robot.

robot arm controller base montaggio

Puoi leggere l’articolo introduttivo, con la descrizione di cosa intendo come cobot qui.

Come hai letto ho voluto modificare la base del controller per poter utilizzare dei componenti che già erano a mia disposizione.

Come vedi nella foto i componenti sono perfettamente alloggiati nelle rispettive sedi.

Ho condiviso il progetto modificato su thingiverse da cui puoi scaricare i files.

Robot arm 3D printed openscad

Partendo dalla base scaricata dal sito del progetto originale:

l’ho adattata alle mie necessità disegnandola con le medesime proporzioni in openscad:

robot arm 3d printed openscad base no componentse, di conseguenza, ho preferito riprogettare anche la parte superiore della base in modo che coincidessero:

robot arm 3d printed openscad top no components

I componenti a mia disposizione li ho ridisegnati in openscad per poterli sottrarre dalle parti piene della base:robot arm 3d printed openscad base

e della parte superiore:

robot arm 3d printed openscad top

arrivando ad ottenere un risultato complessivo simile al seguente:

robot arm 3d printed openscad completo

nella fase di disegno/progettazione della nuova console di controllo del robot arm 3D printed openscad.

Il codice del modello

Utilizzando un prodotto come openSCAD, modellazione 3D via codice opensource, è facile trasferire il modello disegnato semplicemente passando il codice:

base();
top();
section=false;

/* BASE */
module base() {
difference() {

hull() {
translate([0,0,4]) cylinder(r=32,h=8,center=true,$fn=96);

translate([31,-21,4]) cylinder(r=13,h=8,center=true,$fn=96);
translate([-31,-21,4]) cylinder(r=13,h=8,center=true,$fn=96);
}

translate([31,-20,5]) rotate([0,0,45]) pot();
translate([-31,-20,5]) rotate([0,0,-45]) pot();

translate([12,-5,5.1]) pushButton();
translate([-12,-5,5.1]) pushButton();

translate([0,-2,5]) cube([5.2,20.2,8],center=true);

/* SCREEW */
translate([17,13,5.1]) cylinder(r=1.6,h=12,center=true,$fn=96);
translate([-17,13,5.1]) cylinder(r=1.6,h=12,center=true,$fn=96);
translate([0,-23,5.1]) cylinder(r=1.6,h=12,center=true,$fn=96);

/* NUTS */
translate([17,13,1.2]) cylinder(r=3.4,h=2.5,center=true,$fn=6);
translate([-17,13,1.2]) cylinder(r=3.4,h=2.5,center=true,$fn=6);
translate([0,-23,1.2]) cylinder(r=3.4,h=2.5,center=true,$fn=6);

/* incisioni */

hull() {
translate([25,8,5.1]) cylinder(r=4.2,h=6,center=true,$fn=96);
translate([25,-8,5.1]) cylinder(r=4,h=6,center=true,$fn=96);
}

hull() {
translate([-25,8,5.1]) cylinder(r=4.2,h=6,center=true,$fn=96);
translate([-25,-8,5.1]) cylinder(r=4,h=6,center=true,$fn=96);
}
difference() {
translate([0,0,5.1]) cylinder(r=30.5,h=6,center=true,$fn=96);
translate([0,0,5.1]) cylinder(r=26,h=6.1,center=true,$fn=96);
translate([0,-10,5.1]) cube([80,40,6],center=true);
}
translate([9,7,5.1]) cube([5,20.2,6],center=true); // wire out
translate([-9,7,5.1]) cube([5,20.2,6],center=true); // wire out
translate([0,25,5.1]) cube([10,20.2,6],center=true); // wire out

/* scavi */
hull() {
translate([7,-17,5.1]) cylinder(r=5,h=7,center=true,$fn=96);
translate([18,-28,5.1]) cylinder(r=5,h=7,center=true,$fn=96);
translate([11,-28,5.1]) cylinder(r=5,h=7,center=true,$fn=96);
}
hull() {
translate([-7,-17,5.1]) cylinder(r=5,h=7,center=true,$fn=96);
translate([-18,-28,5.1]) cylinder(r=5,h=7,center=true,$fn=96);
translate([-11,-28,5.1]) cylinder(r=5,h=7,center=true,$fn=96);
}
difference() {
translate([0,0,5.1]) cylinder(r=30,h=6,center=true,$fn=96);
translate([16,-10,5.1]) rotate([0,0,45]) cube([60,40,6],center=true);
translate([-16,-10,5.1]) rotate([0,0,-45]) cube([60,40,6],center=true);
translate([0,-10,5.1]) cube([60,40,6],center=true);
}
if(section) translate([10,-50,-15]) cube([100,100,30]);
}
}

/* TOP */

module top() {
difference() {
union() {
minkowski() {
hull() {
translate([0,0,9]) cylinder(r=30,h=.1,center=true,$fn=96);

translate([31,-21,9]) cylinder(r=11,h=.1,center=true,$fn=96);
translate([-31,-21,9]) cylinder(r=11,h=.1,center=true,$fn=96);
}
sphere(2,$fn=96);
}
/* */
hull() {
translate([0,0,7]) cylinder(r=32,h=4,center=true,$fn=96);

translate([31,-21,7]) cylinder(r=13,h=4,center=true,$fn=96);
translate([-31,-21,7]) cylinder(r=13,h=4,center=true,$fn=96);
}
/* */
}
translate([31,-20,5]) rotate([0,0,45]) pot();
translate([-31,-20,5]) rotate([0,0,-45]) pot();

translate([12,-5,5.1]) pushButton();
translate([-12,-5,5.1]) pushButton();

translate([0,-2,9]) cube([5.2,20.2,8],center=true);

/* HEAD SCREEW */
translate([17,13,9.7]) cylinder(r=3.4,h=3,center=true,$fn=96);
translate([-17,13,9.7]) cylinder(r=3.4,h=3,center=true,$fn=96);
translate([0,-23,9.7]) cylinder(r=3.4,h=3,center=true,$fn=96);

/* SCREEW */
translate([17,13,8.1]) cylinder(r=1.6,h=12,center=true,$fn=96);
translate([-17,13,8.1]) cylinder(r=1.6,h=12,center=true,$fn=96);
translate([0,-23,8.1]) cylinder(r=1.6,h=12,center=true,$fn=96);

hull() {
translate([7,-17,6.5]) cylinder(r=5,h=7,center=true,$fn=96);
translate([18,-28,6.5]) cylinder(r=5,h=7,center=true,$fn=96);
translate([11,-28,6.5]) cylinder(r=5,h=7,center=true,$fn=96);
}
hull() {
translate([-7,-17,6.5]) cylinder(r=5,h=7,center=true,$fn=96);
translate([-18,-28,6.5]) cylinder(r=5,h=7,center=true,$fn=96);
translate([-11,-28,6.5]) cylinder(r=5,h=7,center=true,$fn=96);
}
difference() {
translate([0,0,6.5]) cylinder(r=30,h=6,center=true,$fn=96);
translate([16,-10,6.5]) rotate([0,0,45]) cube([60,40,6],center=true);
translate([-16,-10,6.5]) rotate([0,0,-45]) cube([60,40,6],center=true);
translate([0,-10,6.5]) cube([60,40,6],center=true);
}

if(section) translate([10,-50,-15]) cube([100,100,30]);
}
}

module pot() {
translate([0,4,0])cube([16,24,7.5],center=true);
translate([0,0,10]) cylinder(r=5,h=13,center=true,$fn=96);
translate([0,0,20]) cylinder(r=3,h=32,center=true,$fn=96);
}

module pushButton() {
cube([11,11,6],center=true);
translate([0,0,7.5]) cylinder(r=2,h=15,center=true,$fn=96);
translate([4,4.75,-2]) rotate([90,0,0]) cube([3,3,6],center=true);
translate([-4,4.75,-2]) rotate([90,0,0]) cube([3,3,6],center=true);
translate([4,-4.75,-2]) rotate([90,0,0]) cube([3,3,6],center=true);
translate([-4,-4.75,-2]) rotate([90,0,0]) cube([3,3,6],center=true);
}

che puoi modificare per adattarlo ai tuoi componenti o per dargli una forma che reputi più adatta al tuo progetto.

I componenti del controller

Oltre a riprogettare la base del controller per il robot arm 3D printed openscad ho adattato anche altre parti per renderle compatibili con i componenti a mia disposizione.

In particolare ho modificato le parti che includono dei potenziometri come la spalla ( epaule nel progetto ):

che nella mia versione presenta una scanalatura circolare per alloggiarvi un potenziometro circolare da 10Kohm come questo:

il cui foro per la leva è di tipo esagonale e l’ingombro è di circa 12mm di diametro.

Il risultato in openScad è il seguente:

robot arm 3d printed openscad epaule spalla shoulder

in cui vedi chiaramente l’incavo circolare per alloggiare il potenziometro.

Il codice per la realizzazione di questo componente parte dal modello stl originale a cui ho solo praticato l’incavo ed un foro per il riferimento in fase di montaggio.

Ecco il codice che puoi utilizzare:

$fn=90;

difference() {
translate([350,-80,-158]) import("Ctrl_Epaule.stl");


translate([0,-13.45,48.75])rotate([0,90,0]) cylinder(r=6,h=5,center=true);
translate([0,-13.45,48.75])rotate([0,90,0]) cylinder(r=1.2,h=15,center=true);
}

per generare il tuo componente definitivo:

Il braccio del controller

Il braccio che collega la “spalla” al “polso” del controller presenta un incastro destinato ad alloggiare un altro potenziometro, nel mio esempio, circolare:

per cui ho dovuto modificarlo per renderlo adatto al mio scopo:

robot arm 3d printed openscad braccio

prima di poterlo stampare.

Il codice che puoi utilizzare è il seguente:

$fn=90;

difference() {
    rotate([0,-90,0]) translate([395.5,-97,-207]) import("Ctrl_Bras.stl");
    translate([0,29.5,0])cylinder(r=6,h=7,center=true);
}

Infine ho voluto disegnare la manopola del potenziometro, ossia la parte che presenta il perno da inserire nel potenziometro e che ne determina la rotazione in funzione del movimento.

Asse del potenziometro

L’asse del potenziometro, in questo esempio del robot arm 3D printed openscad, non è inteso come esclusivamente l’asse in se ma presenta anche la parte stampata in 3D che sarà fissata al braccio ed al polso:

nel modello originale la forma era quella mostrata nella figura sopra, le mie modifiche hanno portato alla realizzazione di una leva del potenziometro composta in due parti:

quella 3D disegnata sulla base di quella fornita;

l’asse esagonale vero e proprio che ho ottenuto tagliando un chiavino esagonale;

Il modello 3D è il seguente:

robot arm 3d printed openscadknob

e devi ultimarlo inserendovi l’asse esagonale tagliato a circa 1cm di lunghezza.

Il codice per la realizzazione della manopola o leva del potenziometro è:

difference() {
    cylinder(r=6.8,h=3, center=true,$fn=90);
    difference() {
        translate([0,0,1.3]) cylinder(r=3,h=.6, center=true,$fn=90);
        translate([2.6,-10,1.3]) cube([10,20,1]);
        translate([-12.4,-10,1.3]) cube([10,20,1]);
    }
    cylinder(r=1,h=8, center=true,$fn=6);
}

ed il risultato finale dovrebbe risultarti simile al seguente:

robot arm controller knob potetntiometer

Ora sei pronto per assemblare il robot arm 3D printed openscad ed il suo controller e procedere con la programmazione.

Nei prossimi articoli ci occuperemo di questi aspetti.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/robot-arm-3d-printed-openscad.html

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.