Picasso - The Robotic Reincarnation

Introducere

Mi-am propus realizarea unui pen plotter — un dispozitiv robotic capabil să deseneze automat pe hârtie. Un pix, fixat într-un suport mobil, este ghidat de un sistem mecanic cu două axe (X și Y), permițând trasarea cu precizie a contururilor imaginilor sau a textelor furnizate de utilizator. Robotul poate desena o varietate de forme, fie geometrice, fie preluate din imagini digitale, precum și caractere sau simboluri.

Orice imagine se poate transforma într-un șir de vectori. Cu acest robot, practic, am simulat o imprimantă, capabilă să reproducă orice de la forme simple și imagini, până la scris de mână.

Se poate utiliza la orice proiect artistic, întrucât, acest robot este un Pablo Picasso al PM Fair.

Descriere generală

Proiectul are ca și controller un Arduino Uno peste care este montat un CNC Shield V3.

Am utilizat următoarele concepte:

  • GPIO — pentru controlul pinilor digitali, butoane, endstop-uri și motoare.
  • UART — pentru comunicare serială cu PC-ul, debugging și monitorizare.
  • Întreruperi — prin gestionarea evenimentelor cu debounce software la butoane.
  • Timere / PWM — pentru control temporizat (servo, debounce, step) și generarea semnalelor PWM.

Hardware Design

Pinout

Arduino Uno

Pin Arduino Componentă legată Pin componentă Protocol Funcție
D2 CNC Shield (X) STEP_X GPIO Controlează pașii motorului X
D3 CNC Shield (Y) STEP_Y GPIO Controlează pașii motorului Y
D5 CNC Shield (X) DIR_X GPIO Controlează direcția motorului X
D6 CNC Shield (Y) DIR_Y GPIO Controlează direcția motorului Y
D8 CNC Shield EN GPIO Activează/dezactivează driverele de motor
D9 Endstop X_MIN GPIO Detectează limita stânga X
D10 Endstop Y_MIN GPIO Detectează limita jos Y
D11 Servomotor SG90 IN PWM Controlează pixul (sus/jos)
D12 Buton DOWN GPIO Comandă pix jos
D13 Buton UP GPIO Comandă pix sus
A3 Buton START GPIO Comandă de pornire desen

CNC Shield V3

Pin Shield Componentă legată Pin componentă Protocol Funcție
STEP_X Arduino D2 - GPIO Pași motor X
DIR_X Arduino D5 - GPIO Direcție motor X
STEP_Y Arduino D3 - GPIO Pași motor Y
DIR_Y Arduino D6 - GPIO Direcție motor Y
EN Arduino D8 - GPIO Activare/Dezactivare motoare

Servomotor SG90

Pin Servo Conectat la Protocol Funcție
IN Arduino D11 PWM Control poziție pix
GND GND Power Ground
VCC 5V Power Alimentare servo

Endstop-uri & Butoane

Pin componentă Conectat la Protocol Funcție
X_MIN Arduino D9 GPIO Detectează capătul stânga X
Y_MIN Arduino D10 GPIO Detectează capătul jos Y
Buton UP Arduino D13 GPIO Ridică pixul
Buton DOWN Arduino D12 GPIO Coboară pixul
Buton START Arduino A3 GPIO Pornește rutina de desenare

Bill of materials

Denumire Piesă Magazin Nr Preț (RON) Link
Rulment 8x15x45mm ZYX3D 2 18 Rulment LMU8 8x15x45
Rulment 8x15x25mm Optimus Digital 1 4.04 Rulment Liniar LM8UU
Motor pas cu pas Optimus Digital 2 33.99 Motor Pas cu Pas 17HS4401 (1.7 A, 40 N⋅cm)
Roata dintata 5mm Sigmanortec 2 4.59 Fulie dintata GT2 20 dinti, ax 5mm
Fulie dintata 3mm Sigmanortec 1 10.71 Fulie rola intinzatoare GT2 3mm, 20 dinti
Fulie dintata 5mm Sigmanortec 1 10.71 Fulie rola intinzatoare GT2, 20 dinti, 5mm
Fulie rola fara dinti 3mm Sigmanortec 1 10.98 Fulie rola intinzatoare GT2, fara dinti, tip 16, 3mm
Curea 6mm Sigmanortec 4 6.46 Curea GT2 6mm
Servomotor Sigmanortec 1 12.67 Servomotor SG90 360 grade, continuu
Arduino Uno R3 compatibil Sigmanortec 1 30.42 Placa dezvoltare UNO R3 Arduino Compatibil, ATmega328p, CH340G, cu bara pini
Suruburi si piulite emag 1 83.29 Set Suruburi si Piulite Autocise, Inox, Rezistenta la Coroziune, Argintiu
Driver pentru motoare Optimus Digital 2 7.99 Driver pentru Motoare Pas cu Pas A4988 Rosu CNC 3d printer StepStick Stepper
Switch Sigmanortec 2 6.35 Endstop mecanic SS-5GL2
Scut Arduino CNC Optimus Digital 1 21.5 A4988 CNC Shield v3 for Arduino
Ventilator 30mm 5V Sigmanortec 1 8.04 Fan 5V Raspberry Pi, 3030
Axa ghidaj 8mm (35cm x 2, 5.5cm x 1) Reprapmania 1 40.8 Axa ghidaj 8mm
Ghidaj liniar imprimanta 400mm Optimus Digital 1 119 Ghid Liniar MGN12H 400 mm
Cabluri (10m x 6 culori) Optimus Digital 1 44.99 Plusivo PVC Insulated Wire Kit (22AWG, 6 colors, 10m each)
Conector banana Optimus Digital 1 0.99 Famale Banana Plug For Panel ( Red)
Conector 5.5 x 2.1 mama Sigmanortec 1 3.57 Conector 5.5x2.1 Mama cu surub
Conector 5.5 x 2.5 mama Sigmanortec 1 3.68 Conector 5.5x2.5mm, cu surub, Mama
Conector mama Jack Optimus Digital 1 1.49 Conector DC Jack mama 2.1 mm x 5.5 mm
Alimentare 12V, 2A Optimus Digital 1 24.99 12 V 2000 mA Stabilized Power Supply
Panou lemn 60×60 Smartplusdeco 1 99 Blat pentru masa 600x600 mm, Stejar Bardolino Natur H1145 ST10
Marker negru Optimus Digital 2 1.49 Marker Permanent Negru
Conector mama-mama (x40) Sigmanortec 1 7.6 40 fire Dupont 10cm, Mama-Mama
Conector tata-mama (x40) Sigmanortec 1 7.6 40 fire Dupont 10cm, Tata-Mama

Wiring

Software Design

Am folosit PlatformIO integrat în VS Code. Am folosit Arduino.h, Servo.h și Stepper.h ca biblioteci externe.

Am creat următorul API pentru deplasarea într-un sistem de coordonate xOy folosind motoarele, respectiv pentru acționarea pixului:

// mută pixul la coordonata x = 0
void move_till_X_is_pressed();
 
// mută pixul la coordonata y = 0
void move_till_Y_is_pressed();
 
// mută pixul la coordonatele (x, y), măsurate în milimetri
void move_to(long x, long y);
 
// pune pixul în contact cu hârtia
void put_down();
 
// ridică pixul de pe hârtie
void put_up();

De exemplu, o secvență de cod care desenează un pătrat ar arăta așa:

// poziționăm robotul la coordoatele (0, 0)
move_till_X_is_pressed();
move_till_Y_is_pressed();
 
// ne mutăm într-un colț al pătratului
moveTo(100, 100);
delay(500);
 
// punem pixul pe hârtie
put_down();
delay(500);
 
// desenăm prima latură
move_to(100, 150);
delay(500);
 
// desenăm a doua latură
move_to(150, 150);
delay(500);
 
// desenăm a treia latură
move_to(150, 100);
delay(500);
 
// desenăm a patra latură
move_to(100, 100);
delay(500);
 
// ridicăm pixul de pe hârtie
put_up();

Pentru generarea unor imagini mai complexe, am folosit un script de python care convertește, folosind OpenCV, o imagine într-o serie de instrucțiuni de ”move”, ”up” și ”down”. Instrucțiunile sunt încărcate în flash, de unde sunt executate linie cu linie de către robot.

Un exemplu de astfel de secvență arată așa:

72 18
DOWN
78 5
80 6
72 18
UP
138 21
DOWN
139 21
UP
137 22

Rezultate Obţinute

Mai jos avem un video demonstrativ:

În stânga avem imaginea de la care am pornit. Script-ul a convertit-o într-un set de 499 de comenzi. Rezultatul se află în dreapta:

De asemenea, putem observa pipeline-ul și pentru o poză cu mai multe detalii artistice:

Concluzii

Proiectul a demonstrat cu succes posibilitatea construirii unui pen plotter funcțional folosind componente accesibile și programare pe platforma Arduino. Prin controlul a două motoare pas cu pas și a unui servomotor, am reușit să obținem mișcare bidimensională și control asupra instrumentului de scris.

Dispozitivul este capabil să deseneze forme geometrice simple (pătrat, triunghi, cerc), demonstrând precizie și repetabilitate în execuție. De asemenea, a fost integrată o logică de calibrare automată prin endstop-uri, precum și control manual prin butoane.

Github

Jurnal

Dragă jurnal, iată drumul meu spre exprimarea mea artistică:

  • 3 mai - Primele 9 ore din proiect pentru realizarea Bill of materials, comandate de la 6 magazine diferite. Am adormit la 6 dimineața. Nu știam că acea seară îmi va strica de tot ritmul circadian pentru următoarea lună. Dar a meritat.
  • 7, 8 mai - Comand și butoane în caz de orice. De asemenea am luat și niște senzori IR, just in case, că poate îi pun si scanner. Am avut o tentativă să comand și un ecran LCD cu touchscreen ca să îl pun să deseneze ce îi dau eu pe ecran. M-am uitat în portofel și în calendarul meu și am realizat că nu mai am nici timp, nici bani pentru asta.
  • 12 mai - Ajunge și ultima comandă.
  • 17 mai - Proiectul este asamblat în proporție de 90% după 12 ore continue de dibuială. Piesele 3D au fost topite pe alocuri cu pistolul de lipit cu fludor (ironic, știu). Sistemul de axe xOy funcționează. Nu am reușit să fixez pixul pe servo într-o poziție stabilă.
  • 18 mai - Overengineering: FSM pentru Servo. Denis din viitor va înlocui acel FSM cu 4 stări codate în 35 de linii cu 2 funcții de 3 linii care doar trimit un puls la servo (unul pentru UP, altul pentru DOWN).
  • 19 mai - Prima linie trasată. Am improvizat un suport dintr-un umeraș rupt și lipit într-o poziție favorabilă pe servo deoarece suportul printat nu culisa corespunzător. Momentan desenează numai linii paralele cu sistemele de axe.
  • 25 mai - Posibil să fi ars motoarele. Am adăugat biblioteci în soft și am scurtat puțin din munca manuală. API-ul este gata. Acum poate desena orice linie într-un dreptunghi de 23cm x 30cm. Cu liniile acestea putem face acum orice. Limita e cerul. Urmează să convertim imagini in ceva ce roboțelul poate înțelege și reproduce. Sunt optimist că nu se va arde nimic.
  • 27 mai - Motoarele nu sunt arse, am sudat niște fire prost. Proiectul este într-o stare funcțională. Desenează pătrate, triunghiuri și tentative de cercuri. Trebuie să trag o tură până la Dedeman ca să iau șuruburi pentru lemn. Mai dibuim puțin la soft și va merge.
  • 29 mai - Picasso începe să deprindă aptitudini artistice. A desenat un chinezoi.
  • 30 mai - Picasso o desenează pe Mona Lisa și pe Dan Tudose. De asemenea, poate desena o pisică, un chinez, logo-ul ACS și scrie ”PM FAIR 2025”.

Bibliografie/Resurse

Corelația pinilor pe CNC shield cu Arduino:

pm/prj2025/mdinica/denis.covei.txt · Last modified: 2025/06/01 19:51 by denis.covei
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0