Arxiu de la categoria: CNC

script cncboxparam: tall làser de caixes de fusta

El novembre passat li vaig regalar a la Maria una caixeta de llum per il·luminar l’habitació [1]. Estic content del resultat, però es pot millorar tant en la part de construcció de la capsa, com en la part de l’electrònica (un timer 555 que fa apagar la llum després de 20 minuts).

Aquí va el script cncboxparam per automatitzar la creació de capses (amb un text a la cara frontal). Genera un fitxer que es pot enviar directament a una màquina de tall làser. La idea que em persegueix de fa temps és fer aquesta mena de capses minimitzant els costos i el temps. Seria una prova de concepte de disseny industrial i fabricació digital, fins a quin punt amb pocs recursos es pot automatitzar fins a fer rendible un petit procés industrial. El curs vinent m’agradaria adquirir una màquina de tall làser, però ja em faig a la idea de què haurà de ser de les màquines xines més petites.

La part de l’electròncia també l’hauria de millorar de cara el curs vinent. La idea és dissenyar una nova placa PCB i utilitzar només components SMD, però això ja és un altre tema.

El script està programat amb C++ i compila sense cap llibreria especial. Per tal de generar el text s’ha de tenir instal.lat la utilitat truetype-tracer-dxf. Les proves les he fet amb LibreCAD, que és el programa de CAD que utilitzo habitualment.

Enllaços:

Projecte CNC: script per a un joc de taula Abalone

Abalone Bord Game and hexagonal gridL’Abalone és un joc de taula dissenyat per Michel Lalet i Laurent Lévi el 1987. És un taulell amb forats on col.loquem 14 caniques per bàndol, i es tracta de fer fora sis caniques del contrincant. De fet, mai hi he jugat, però de moment construirem un taulell.

El problema consisteix bàsicament en fer una xarxa en format rusc d’abelles, que de fet són hexàgons i triangles equilàters. Per disposar els punts sobre un programa de CAD (jo utilitzo LibreCAD), de seguida necessitem el cos(60) i el sin(60). Partint d’una graella ortogonal no és fàcil fer aquesta graella. El millor és crear un script i generar els punts de forma automàtica.

Partim d’un fitxer buit de LibreCAD, creem la capa punts, i fico tres punts de prova. Obrim amb un editor de text (els fitxers de CAD tenen un format de text pla) i localitzem els punts de referència. Ara ja sabem el format que ha de tenir els punts que volem generar programàticament.

Mostrem el tros de codi més representatiu que genera la geometria de la meva graella, script bee_grid.cpp:

...
\tfor (j=0; j
El script genera un fitxer de text amb les línies que podem inserir en el nostre fitxer original, i el resultat el podem veure a la foto. És una graella de punts per al joc de l'Abalone. L'altra foto, la del joc de l'Abalone, no és meva (l'he trobat per Internet), però aquest és el meu objectiu: construir un taulell d'Abalone. Per fer-ho ja tinc el fitxer de CAD, després hauré de generar el G-Code, i finalment fresar tots els punts sobre una fusta. Ja ensenyaré el resultat quan ho hagi acabat.

Enllaços:

update 21/06/2018: aquest és el resultat final. He aprofitat una fusta de cuina, que estava molt marcada, però el resultat final m'agrada.

Maria 12 anys: caixa retroil.luminada amb timer basat en 555

El diumenge la Maria fa 12 anys. En aquesta ocació he fet una caixeta retroil·luminada amb tres LEDs SMD. L’electrònica no és difícil, es tracta d’un timer 555 configurat per tal de què estigui encés durant 15 minuts. Ha de servir com a punt de llum a l’habitació a l’hora de fer nones.

El projecte l’he dissenyat primer amb Eagle CADSoft, i després amb KiCAD, doncs de fet estic migrant a KiCAD, com ha de ser. El prototipus de la placa PCB l’he fet amb la fresadora. Ja tenia experiència de l’any passat d’utilitzar el script pcb2gcode a l’Eagle, i ara l’estic utilitzant amb el KiCAD, amb resultats molt bons.

El Timer 555 es pot configurar com a temporitzador o per fer pulsos. En el nostre cas, hem optat per un disseny de manera que quan pitgem el pulsador s’encenen els LEDs durant 15 minuts. Els 15 minuts s’aconsegueixen escollint els valors adequats de R i C (recordar que RxC té unitats de temps). He escollit un TLC555CD per tal de minimitzar el consum . El TLC555CD és SMD i té format SOIC. La idea és alimentar-ho tot amb 3V i minimitzar al màxim el consum durant els periodes de stand-by, doncs s’alimenta amb 2 piles AAA i s’espera que durin bastant de temps.

He assajat amb la soldadura SMD, de la que no sóc expert. El timer TLC555CD (format SOIC-8) l’he soldat manualment, i ha quedat una soldadura força neta. Els LEDs també són SMD. Si n’hagués de fer un altre provaria amb la soldadura al forn.

Aquest seria un projecte interessant per fer-ne molts en sèrie, de fet ja vaig estar mirant els proveïdors per aprovisionar una bona quantitat dels components. La idea és que tots els components fossin SMD, i aleshores sí que es faria una comanda de plaques PCB a un fabricant, doncs ara hi ha moltes facilitats i preus raonables.

Quant a la part del fresat la fusta és DM de 2mm. Tots els talls estan fets amb la fresadora, així com les lletres, on s’ha escollit la font Black Rose. La part més crítica és muntar la capsa amb els angles ben rectes, i pintar-ho tot i que quedi perfecte. Al darrera les lletres es fica un metacril·lat blanc, també tallat amb la CNC.

Per tant, és un projecte senzill però finalment més laboriós del que em pensava, i certament es pot automatitzar en gran mesura per fer una tirada gran. El que no es pot automatitzar són els noms que has de fresar, això sí que és sota demanda.

Referències:

cnchollow script. Generador de G-Code per a fresar diferents tipus de cavitats

Hem estat programant un script amb C++ per fer cavitats. Cavitats de diferent tipus: rectangulars, rectangulars amb cantos arrodonits, circulars i el·líptiques. A més, la profunditat de la cavitat pot ser constant (cavitat cilíndrica) o bé una cavitat esfèrica. Per tant, hi ha 8 possibilitats de cavitats diferents, com es veu a la imatge, amb diversos paràmetres que pots controlar. El script genera el G-Code directe per a ser fresat.

Si vols utilitzar el script, primer hauràs de mirar les il·lustracions que hi ha a la documentació, per tal d’entendre els diferents paràmetres. Bàsicament haurem d’introduir l’origen de coordenades de la cavitat (allà on està centrada); els semieixos en el cas dels rectangles-el·lipse, o el radi en el cas del cercle; la profunditat final en el cas de cavitats cilíndriques; el radi esfèric en el cas de cavitats esfèriques, que donarà lloc a més o menys profunditat esfèrica. En funció de la broca que tinguem i de la resolució que vulguem, també hem de definir el pas linial i el pas de profunditat (paràmetres -m i -n).

Per a les cavitats cilíndriques n’hi ha prou amb utilitzar broques normals de fresar (les de 2mm de diàmetre són les més petites que he aconseguit). Però per a les cavitats esfèriques és interessant utilitzar una broca tipus round nose bit, i així aconseguim un millor acabat, com es pot apreciar a la foto.

El primer projecte per utilitzar les meves cavitats és fresar el joc del mancala (o awalé o altres noms), on vull fresar vàries cavitats diferents. Ja informarem quan estigui acabat.

És un projecte escrit amb C++, no requereix cap llibreria especial, per tant la seva compilació és directa. Per la versió 1.0.6, la darrera versió:

$ g++ -o cnchollow cnchollow-1.0.6.cpp
Ex:
$ ./cnchollow -f rectangle -t cylindrical -x 100 -y 100 -r 30.23 -s 15.21 -z -10.3 -m 3.0 -n -1.0 -o ./cnchollow.ngc

Referències:

Fresar una foto en blanc i negre amb CNC

Aquests dies estem vivint uns dies incerts a Catalunya. S’ha de sortir al carrer i defensar el govern legítim, rebutjar de ple l’aplicació de l’article 155 de la Constitución Española, i no deixar passar l’oportunitat que representa les eleccions del 21D. Així que hem fet uns cartells per portar-los a la manifestació del 11N, i totes les que calguin. Actualment, tenim a les presons espanyoles: Jordi Sánchez, Jordi Cuixart, Oriol Junqueras, Dolors Bassa, Meritxell Borràs, Josep Rull, Raül Romeva, Carles Mundó, Joaquim Forn i Jordi Turull. I el número pot augmentar.

Aquí exposo el meu workflow per fer un cartell en blanc i negre, a partir d’una foto.

1. GIMP. A l’hora d’escollir la foto hem de procurar que el fons sigui clar i contrastat amb la foto, de manera que el GIMP detecti bé les vores. Obrim la foto amb el GIMP, i dessaturem la foto (convertint-la a escala de grisos), i amb l’eina llindar de color blanc-negre, escollim la imatge que volem fresar.

2. LibreCAD és el software que faig servir per generar el DXF. Importo la imatge, i creo una capa per definir les línies de fresat. Com que la broca que faré servir és de 2mm, escullo un traç de 2mm, i d’aquesta manera em puc fer una bona idea de com quedarà el resultat final. Ressegueixo tots els contorns, ho faig de manera manual.

3. Encara amb LibreCAD, he de definir els ponts de manera que no hi hagi cap illa que es pugui desenganxar quan després faci el fresat. Genero el fitxer dxf.

4. Torno al GIMP i omplo de negre les superfícies que quedaran buides. D’aquesta manera em puc fer una bona idea del resultat final, i preveure l’èxit de la peça.

5. Amb el script de python dxf2gcode puc definir les propietats del fresat. Concretament, la profunditat de tall. Si la fullola que faré servir és de 3mm, la profunditat serà de 3mm. Genero el fitxer G-Code.

6. Amb LinuxCNC ja puc fresar la peça, amb una broca de 2mm. Un cop acabat, es fa un polit i s’arreglen possibles imperfeccions.

Tot el procés està explicat en el video. A la imatge es veu com queda el resultat final amb la imatge del Raül Romeva, ara mateix a presó. Ara només queda fer els cartells, i sortir al carrer. La lluita continua.

Referències:

Soldadura SMD al forn de casa

Estic en el procés de migrar de Eagle CadSoft a KiCAD (open source), i a més d’utilitzar components SMD en els nous projectes. Per tant, he de practicar la soldadura SMD, i tenir les eines adequades.

Hi ha molts videotutorials de soldadura SMD, interessant veure’n algun per tal d’agafar confiança i evitar errors. Bàsicament hi hauria tres maneres de fer la soldadura SMD:

  1. Soldant a mà, amb un soldador de punta ben fina i fil d’estany ben prim. És fàcil soldar d’aquesta manera quan els components no són molt petits (per exemple 0805 o superiors).
  2. Amb pasta de soldar, i utilitzant un forn a 230º. Val la pena sobretot quan hi ha bastants components a soldar. Aquesta seria la manera definitiva per fer una tirada més grossa, doncs es poden posar vàries plaques al forn. El gran avantatge de la pasta de soldar és que un cop situat el component, aquest no es mou.
  3. Amb pasta de soldar i aire calent d’una estació de soldadura. Encara no ho he provat però hauria de funcionar. Seria correcte per soldar algun component puntual.
  4. En la fotografia es mostra el resultat de la primera prova que he fet en el forn de casa, a uns 230 graus. El gran èxit de la soldadura fina és confiar en la tensió superficial que es genera entre el flux soldant, l’estany i el component. La tensió superficial és la que fa possible que l’estany no s’escampi i faci ponts entre les pistes.

    Els meu workflow de prototipatge:

    • KICAD
    • Generació dels Gerbers
    • pcg2gcode per generar el G-Code per la màquina CNC
    • Fresat CNC
    • Flux: Reïna de colofonia
    • Soldar: components SMD i components through-hole

    Un cop el prototipus funciona, el més correcte és encarregar les plaques a algun fabricant de PCBs, ara n’hi ha molts i bé de preu, amb més o menys temps d’espera.

    Notes de soldadura a la wiki.

Xiangqi (escacs xinesos)

Fa uns dies que he acabat el taulell de Xiangqi i les peces, i ja he jugat algunes partides. He estat provant diferents maneres d’omplir amb color negre o vermell les peces. Les peces negres (i el taulell) les he fet amb silicona negra. El resultat és correcte, però el problema és que en envernissar-ho queda una mica enganxifós. És per això que finalment el taulell no l’he envernissat. Les peces vermelles les he fet amb Aquaplast barrejat amb pintura acrílica vermella, i el resultat és més que correcte. M’agradaria fer més proves, per exemple algun altre tipus de silicona o bé resina epoxi o de poliéster.

Com que la meva màquina CNC és 30x40cm, el taulell l’he hagut de dividir en dues parts, que he hagut d’ajuntar amb cola blanca i espigues de fusta. El taulell és de fusta de pi, i les fitxes són de fusta de boix de 5 cm de diàmetre. És un procés lent i laboriós fer les fitxes d’una en una (són 32 peces en total). Evidentment, el procés seria molt més ràpid utilitzant un taulell de pi.

Al llarg del procés de construcció he fet unes quantes fotos, i penjo un video de tot el procés. Per tal de millorar el procediment d’envernissat, he fet un jig on puc vernissar per davant i per darrere les peces de 8 en 8.

script cncstroke: millorant la conversió DXF a G-Code, II

Creo un projecte amb LibreCAD, creo la capa ”stroke”, i aquí fiquem les polilínies, tal com s’ha explicat en l’anterior article [1], i tal com es mostra en la imatge. Amb llenguatge C++, el primer que fem és llegir el fitxer dxf i detectar la capa stroke, amb tots els seus punts. En el LibreCAD totes les línies són iguals, tenen un origen i un final. Però a mi m’interessa detectar les polilínies, que són les línies enllaçades de manera que el punt final d’una línia és el mateix que el punt d’origen de la línia següent. Recordem l’estructura de dades que es fa servr:

struct linia {
\tint x0;
\tint y0;
\tint x1;
\tint y1;
\tdouble length;
};

struct polilinia {
\tstd::vector vlinia;
\tdouble length;
};

std::vector vpolilinia;
Recorrem totes les línies, i anem afegint elements al vector polilínia, i dins de cada polilínia anem afegint elements al vector línia. Per cada línia i per cada polilínia, tenim calculada la seva longitud. Un cop tenim omplert el vector de polilínies amb les seves línies, ja podem recórrer totes les polilínies i generar la sortida G-Code, de manera que l’inici d’una polilínia està a profunditat -2mm, i el final de la polilínia està a profunditat 0mm, tal com s’aprecia en aquest tros del G-Code resultant, i en la imatge:

(* POLILINE #2 *)
G0 X 30 Y 30
G0 Z 3.000
F150
G1 Z -2.0
F400
G1 X 50 Y 40 Z -1.11
G1 X 60 Y 30 Z -0.55
G1 X 70 Y 40 Z 0
F150
G0 Z 5.000

Com s’aprecia en el G-Code, posicionem la broca al punt (30,30), foradem fins a -2.0mm, i anem passant per tres punts successius tot aixecant de forma proporcional la broca fins arribar al punt (70,40), en què la broca deixa d’atacar la superfície. Així s’aconsegueix un traç variable, tal com s’aprecia en la imatge. Amb aquesta tècnica podré perfilar detalls en els treballs CNC, com ara els cabells d’un retrat, o el traç en una caligrafia.

Com s’aprecia en la imatge (extrecta del projecte de fresar el retrat d’Albert Einstein en blanc i negre, en una altra entrada mostrarem el resultat final), es veu el resultat d’aplicar el script cncstroke per a les polilínies agrupades en la capa stroke del projecte LibreCAD. Veiem dos traços que acaben en punxa (a la part esquerra de la imatge, sobre fusta), i un altre traç, on no s’ha aplicat el script, que no acaba en punxa. A la part dreta de la imatge veiem un tros del projecte LibreCAD on s’han definit aquestes línies (dues que pertanyen a la capa cncstroke, i una altra que es fresa normal). Així doncs, amb un ús correcte del projecte LibreCAD, podem augmentar la resolució del fresat CNC, aconseguint un efecte més real i detallat.

Pots descarregar i estudiar el codi del script cncstroke des del següent enllaç [2] .
Referències:

Nota aclarativa: En el projecte cncstroke utilitzem el terme polilínia com a successió de línies enllaçades. Ara bé, per generar aquestes línies enllaçades, a LibreCAD, utilitzem l’eina línia (i no pas l’eina polilínia) (En una futura versió s’estudiarà la possibilitat d’utilitzar l’eina polilínia, o ambdues).

script cncstroke: millorant la conversió DXF a G-Code, I

Un dels treballs típics que es fan amb la CNC és el retrat de personatges en format blanc i negre. Per exemple, són coneguts els retrats del Che Guevara o l’Albert Einstein. Aquests dies estic treballant en la imatge de l’Ovidi Montllor [1].

La idea és senzilla i coneguda. Importo la imatge en LibreCAD [2] (el software CAD que utilitzo, que es open source), defineixo la silueta, i defineixo unes àrees de hatching que seran fresades (rebaixades). Faig servir el programa dxf2gcode [3] per exportar a G-Code, i freso tot el treball a una profunditat de 1.5mm. La limitació que tinc és que la fresa que faig servir és de 2mm de diàmetre, i això limita la resolució final que puc tenir.

Estic programant un petit script (cncstroke [4]) per tal de millorar la resolució dels meus treballs. Imaginem per exemple els cabells de l’Albert Einstein. Allò ideal és que les metxes de cabell acabin en punta, fent un traç que passi de gruixut a fi. Això s’aconsegueix fent que la profunditat d’atac de la broca sigui variable, des de 1.5mm de profunditat en l’inici del traç fins a 0mm al final del traç. Però per tal de què l’invent funcioni, no he de fer servir una broca normal, sinó una broca V-Shape (amb punta de 40 graus). D’aquesta manera aconseguiré l’efecte de fer un traç que passi de 2mm d’ample en l’origen a 0mm en l’extrem. Aquesta tècnica també serà molt útil per fresar lletres que simulin traços variables.

La idea és que en els meus projectes de LibreCAD tindré una capa amb la silueta bàsica (que fresaré amb una broca de 2mm), i una capa (que sempre anomenaré stroke) que constarà de polilínies que representaran el traç variable des de 2mm fins a 0 mm d’ample. Amb aquesta segona capa podré fer els detalls com ara cabells o caligrafia de lletres.

En aquest primer article només exposo l’estructura de dades que em permetrà gestionar la generació del G-Code a partir del projecte de LibreCAD. Quan recorri (programàticament) el contingut d’un projecte LibreCAD (format dxf), hauré de cercar la definició de la capa stroke i dels punts que conté. Això és relativament fàcil de fer. Aquesta successió de punts es poden agrupar en polilínies, entenent que una polilínia és un conjunt de línies que van empalmades.

Com que el número de poliínies és variable, i el número de línies que conté una polilínia també és variable, la millor manera de programar aquesta estructura amb llenguatge C++ és utilitzar vectors.

struct linia {
\tint x0;
\tint y0;
\tint x1;
\tint y1;
\tdouble dist;
};

struct polilinia {
\tstd::vector vlinia;
\tdouble dist;
};

std::vector vpolilinia;

Una línia consta d’un punt origen i un punt final (fàcilment es podrà calcular la longitud d’aquesta línia). Una polilínia consta d’un conjunt de línies, i la longitud de la polilínia serà la suma de les longituds individuals.

A continuació mostrem l’exemple mínim de com es poden gestionar diferents polilínies, cadascuna de les quals amb un número variable de línies.

// g++ -o polilinia polilinia.cpp
#include
#include
#include
#include
#include

struct linia {
\tint x0;
\tint y0;
\tint x1;
\tint y1;
\tdouble length;
};

struct polilinia {
\tstd::vector vlinia;
\tdouble length;
};

std::vector vpolilinia;

using namespace std;

int main() {
\t
\tdouble lengthlinia,lengthpolilinia;
\tpolilinia polilinia1;\t
\tlinia linia1;

\tlengthpolilinia=0;

\tlinia1.x0=34;
\tlinia1.y0=30;
\tlinia1.x1=120;
\tlinia1.y1=122;
\tlengthlinia = sqrt(pow(linia1.x1-linia1.x0,2) + pow(linia1.y1-linia1.y0,2));
\tlinia1.length=lengthlinia;
\tlengthpolilinia += lengthlinia;

\tpolilinia1.vlinia.push_back(linia1);

\tlinia1.x0=320;
\tlinia1.y0=322;
\tlinia1.x1=420;
\tlinia1.y1=422;
\tlengthlinia = sqrt(pow(linia1.x1-linia1.x0,2) + pow(linia1.y1-linia1.y0,2));
\tlinia1.length=lengthlinia;
\tlengthpolilinia += lengthlinia;

\tpolilinia1.vlinia.push_back(linia1);
\t
\tpolilinia1.length = lengthpolilinia;
\t
\tvpolilinia.push_back(polilinia1);
\t
\t//cout << vpolilinia.at(0).vlinia.size() << endl;

\t//anem per una altra polilinia
\tpolilinia1.vlinia.clear();
\tlengthpolilinia=0;

\tlinia1.x0=134;
\tlinia1.y0=130;
\tlinia1.x1=220;
\tlinia1.y1=222;
\tlengthlinia = sqrt(pow(linia1.x1-linia1.x0,2) + pow(linia1.y1-linia1.y0,2));
\tlinia1.length=lengthlinia;
\tlengthpolilinia += lengthlinia;

\tpolilinia1.vlinia.push_back(linia1);

\tlinia1.x0=220;
\tlinia1.y0=222;
\tlinia1.x1=320;
\tlinia1.y1=322;
\tlengthlinia = sqrt(pow(linia1.x1-linia1.x0,2) + pow(linia1.y1-linia1.y0,2));
\tlinia1.length=lengthlinia;
\tlengthpolilinia += lengthlinia;

\tpolilinia1.vlinia.push_back(linia1);

\tlinia1.x0=220;
\tlinia1.y0=222;
\tlinia1.x1=320;
\tlinia1.y1=322;
\tlengthlinia = sqrt(pow(linia1.x1-linia1.x0,2) + pow(linia1.y1-linia1.y0,2));
\tlinia1.length=lengthlinia;
\tlengthpolilinia += lengthlinia;

\tpolilinia1.vlinia.push_back(linia1);

\tpolilinia1.length = lengthpolilinia;

\tvpolilinia.push_back(polilinia1);\t

\t//cout << vpolilinia.at(1).vlinia.size() << endl;
\t//cout << vpolilinia.size() << endl;

\t//recorrem totes les polilínies
\tfor (int i=0; i
I la sortida per pantalla:

$ ./polilinia
polilinia #0. length: 267.358
linia #0. length: 125.936
linia #1. length: 141.421
polilinia #1. length: 408.779
linia #0. length: 125.936
linia #1. length: 141.421
linia #2. length: 141.421

En el següent article [5] s'explica la implementació del projecte cncstroke per tal de generar G-Code amb z-depth variable.

Referències:

Nota aclarativa: En el projecte cncstroke utilitzem el terme polilínia com a successió de línies enllaçades. Ara bé, per generar aquestes línies enllaçades, a LibreCAD, utilitzem l'eina línia (i no pas l'eina polilínia) (En una futura versió s'estudiarà la possibilitat d'utilitzar l'eina polilínia, o ambdues).