Welcome! Log In Create A New Profile

Advanced

Arduino pins come usarli e come funzionano!!!

Posted by MagoKimbra 
Arduino pins come usarli e come funzionano!!!
May 02, 2014 05:14AM
Questa vuole essere una piccola guida all'utilizzo dei pin delle nostre schede per gestire le stampanti 3d. La guida si baserà su Arduino mega e scheda Ramps 1.4, ma può essere tranquillamente usata con un minimo di cambiamenti per tutte le altre schede. Si prevede comunque un minimo di conoscenza di elettronica e di processori.
Partiamo da Arduino; é un processore programmabile con un bel numero di input e output, alcuni analogici e altri digitali. Per esempio per leggere il valore resistivo di un termistore abbiamo bisogno di un ingresso analogico, questo perché il nostro processore ha un covertitore analogico-digitale su quel pin, mentre per vedere se uno switch è chiuso o no (0 o 1) basterà un ingresso digitale.
Da questa immagine vediamo il connettore sulla scheda Arduino con tutti i pin.



La Ramps non ha a bordo nessun processore, prende i segnali provenienti da i vari pins e li gestisce raggruppandoli. Per esempio raggruppa da una parte tutti gli ingressi analogici per i termistori.
Altri pins vengono portati ai driver per la gestione dei motori, altri verranno utilizzati per controllare i transistor di potenza per alimentare hotend, fan, bed.




Come si può vedere in nell'angolo in alto a sinistra (seconda foto) c'è il connettore della ramps con arduino mega, ci sono già il numero del pin con la sua funzione nella ramps. I pin partono da D1 a D53 e poi ci sono i pin analogici che saranno numerati da 54 a 69.
Come fare a individuare questi pin? Bisognerà guardare nel firmware nel file pin.h, come ho già detto farò riferimento alla ramps.

Sezione Steppers Drivers
Pin.h
    #define X_STEP_PIN         54
    #define X_DIR_PIN          55
    #define X_ENABLE_PIN       38
    #define X_MIN_PIN           3
    #define X_MAX_PIN           2

    #define Y_STEP_PIN         60
    #define Y_DIR_PIN          61
    #define Y_ENABLE_PIN       56
    #define Y_MIN_PIN          14
    #define Y_MAX_PIN          15

    #define Z_STEP_PIN         46
    #define Z_DIR_PIN          48
    #define Z_ENABLE_PIN       62
    #define Z_MIN_PIN          18
    #define Z_MAX_PIN          19

    #define E0_STEP_PIN        26
    #define E0_DIR_PIN         28
    #define E0_ENABLE_PIN      24

    #define E1_STEP_PIN        36
    #define E1_DIR_PIN         34
    #define E1_ENABLE_PIN      30
Cerchiamo di capire cosa vogliono dire questi numeri...
Partiamo dalla prima riga: #define X_STEP_PIN 54
Questa riga definisce la costante X_STEP_PIN con il numero 54, questo dirà al firmware che dovrà usare il pin 54 per gestire gli step del motore X, se andiamo a vedere il connettore vedremo il pin A0 (come detto prima 54) fa la funzione x-step. Dal circuito vediamo che quel pin andrà ad alimentare lo stepper della X.
La riga #define X_MIN_PIN 3 definisce il pin per lo switch dell'endstop X-MIN.
Etc etc.


Sezione Heaters & Fan
Vediamo invece i pin D8-D9-D10 che possiamo vedere a sinistra dello schema della Ramps. Questi pin vanno ad alimentare un transistor di potenza (mosfet) che servirà per controllare grossi carichi resistivi (Hotend, Bed).
Come sono settati questi pin? Dobbiamo partire da quì:
//// The following define selects which electronics board you have. Please choose the one that matches your setup
// 10 = Gen7 custom (Alfons3 Version) "https://github.com/Alfons3/Generation_7_Electronics"
// 11 = Gen7 v1.1, v1.2 = 11
// 12 = Gen7 v1.3
// 13 = Gen7 v1.4
// 2  = Cheaptronic v1.0
// 20 = Sethi 3D_1
// 3  = MEGA/RAMPS up to 1.2 = 3
// 33 = RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Bed)
// 34 = RAMPS 1.3 / 1.4 (Power outputs: Extruder0, Extruder1, Bed)
// 35 = RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Fan)
// 4  = Duemilanove w/ ATMega328P pin assignment
// 5  = Gen6
// 51 = Gen6 deluxe
// 6  = Sanguinololu < 1.2
// 62 = Sanguinololu 1.2 and above
// 63 = Melzi
// 64 = STB V1.1
// 65 = Azteeg X1
// 66 = Melzi with ATmega1284 (MaKr3d version)
// 67 = Azteeg X3
// 68 = Azteeg X3 Pro
// 7  = Ultimaker
// 71 = Ultimaker (Older electronics. Pre 1.5.4. This is rare)
// 72 = Ultimainboard 2.x (Uses TEMP_SENSOR 20)
// 77 = 3Drag Controller
// 8  = Teensylu
// 80 = Rumba
// 81 = Printrboard (AT90USB1286)
// 82 = Brainwave (AT90USB646)
// 83 = SAV Mk-I (AT90USB1286)
// 9  = Gen3+
// 70 = Megatronics
// 701= Megatronics v2.0
// 702= Minitronics v1.0
// 90 = Alpha OMCA board
// 91 = Final OMCA board
// 301= Rambo
// 21 = Elefu Ra Board (v3)

#ifndef MOTHERBOARD
#define MOTHERBOARD 33
#endif
Quì definiamo il tipo di scheda, la ramps può essere settata o come 33, come 34 o come 35.
(Power outputs: D10 , D9 , D8)
// 33 = RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Bed)
// 34 = RAMPS 1.3 / 1.4 (Power outputs: Extruder0, Extruder1, Bed)
// 35 = RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Fan)
Cioè come vogliamo definire le nostre tre uscite di potenza, nel caso 33 abbiamo D10=Extruder (hotend), D9=Fan, D8=BED.
E questo lo ritroviamo sempre nel firmware in pin.h
#define HEATER_0_PIN 10 //Estrusore 0
#define FAN_PIN 9 // Fan
#define HEATER_BED_PIN 8 // Bed

Queste sono dei setting di default, ma nulla ci vieta, per esempio, se abbiamo il mosfet del bed bruciato e non usiamo quello delle fan, utilizzare il pin D9 invece che il PIN D8.
Cambiando così il nostro pin.h:
#define FAN_PIN -1 // Fan
#define HEATER_BED_PIN 9 // Bed

Il -1 nel FAN_PIN serve a dire che non verrà usato, se lo lasciassimo a 9 andrebbe in conflitto con il BED, quindi mi raccomando se fate questi interventi a controllare bene, altrimenti aumenterebbero i problemi.

Sezione Power
Nella sezione in basso a sinsitra abbiamo la parte di alimentazione. Qui possiamo notare tre pin; VCC, PS-ON e il 5v.
PS-ON può essere usato per accendere e spegnere un alimentatore di tipo ATX, viene comandato dal comando M80 (accende) e M81 (spegne). Basterà collegarlo al cavo verde del connettore grande (quello che va sulla scheda madre).
La Ramps, non ha i 5v sulla sheda, quindi se vogliamo alimentare apparati a 5v (vedi i servo più avanti) dobbiamo necessariamente dargli i 5v.
E' possibile farlo in due modi:
  1. Prendendo i 5v da Arduino, come? facendo un ponticello su VCC (5 volt da arduino) e 5V. Non c'è null da saldare basta mettere un connettore a tre poli (tipo quello degli end stop) dove PS-ON lo mandiamo all'ATX come detto prima, e VCC e 5V li mettiamo in corto.
  2. Questa soluzione permette anche di alimentare Arduino direttamente dalla Ramps se non si hanno i diodi D1 D2 saldati (questa parte la spiegherò più avanti). Se abbiamo un alimentatore ATX, possiamo prelevare i 5v (cavo rosso) e metterli sia su VCC che su 5V, in questo modo diamo i 5V alla ramps e i 5V a VCC che va su Arduino alimentandolo direttamente senza bisogno di USB e/o alimentatori esterni. Non vi preoccupate su Arduino c'è un diodo di protezione che impedisce un ritorno di tensione verso la USB, quindi anche attaccandolo al nostro PC non avremo problemi.


Sezione Servos
Qui abbiamo una sezione dedicata ai servo, ma nulla ci vieterà di usarla per altre soluzione che spiegherò.
I pin usati sono D4-D5-D6-D11, sui connettori avremmo anche la massa e i 5v (solo se abbiamo fatto uno dei due punti nella sezione power).
In configuratio.h:
#define NUM_SERVOS 1
Definiamo quanti servo abbiamo. 0 per disabilitare tutti i servo. 4 è il massimo.

In pins.h:
#ifdef NUM_SERVOS
    #define SERVO0_PIN         11

    #if NUM_SERVOS > 1
      #define SERVO1_PIN         6
    #endif

    #if NUM_SERVOS > 2
      #define SERVO2_PIN         5
    #endif

    #if NUM_SERVOS > 3
      #define SERVO3_PIN         4
    #endif
  #endif

Quindi se definiamo 1 servo il pin sarà 11, se 2 i pin saranno 11 e 6, fino ad avere 11, 6, 5, 4.
Questi pin possono essere comandati con il comando M280.
Esempio:
Definiamo 2 servo: #define NUM_SERVOS 2.
  • Con il comando M280 P0 0 mettiamo il pin 11 a 0.
  • Con il comando M280 P0 255 mettiamo il pin 11 a 5v.
  • Con il comando M280 P1 0 mettiamo il pin 6 a 0.
  • Con il comando M280 P1 255 mettiamo il pin 6 a 5v.

Se montiamo un servo, il servo girerà dalla posizione minima alla sua posizione massima, naturalemente possiamo mettere qualsiasi valore da 0 a 255 facendo girare il servo in tutte le sue posizioni. E se non volessimo montare un servo e farci altro? Certo che possiamo!!! E cosa possiamo farci??
Possiamo montarci un circuito con un mosfet, per avere una tensione variabile da 0 al massimo (dipende dal circuito che andiamo a mettere), se mettessimo un circuito con con la 220, per esempio, potremmo controllare una lampadina classica di casa che si accende e varia la luminosità a nostro piacimento. Si lo so è folle, ma per far capire cosa si potrebbe fare.
Oppure potremmo montarci un relè. Ecco forse questo può essere più utile.
Prendiamo un modulo relè fatto cosi:




Il pin in sarà il nostro pin del servo (D11-D6-D5-D4) vcc e gnd la nostra 5v e gnd.
Il relè non ha la possibilità di variare il suo stato o è acceso o è spento quindi il comando potrà essere solo M280 P0 0 o M280 P0 255. Il relè chiude o meno un contatto, come se fosse un interruttore, quindi il connettore d'uscita dovremmo montarlo in un circuito alimentato, tipo chiudere o meno una tensione verso un dispositivo.
Possiamo montarci delle strisce led, cosi possiamo accenderle o spegnerle come meglio vogliamo durante la stampa. Oppure delle ventole che accendiamo come vogliamo. Oppure possiamo alimentare il nostro BED e non dai mosfet sulla scheda. Perché dovremmo? Visto le correnti che passano per il BED, a volte la nostra scheda si surriscalda molto portando danni ai connettori e/o ai mosfet. Ma visto che il bed ha bisogno solo di un on/off e non una varizione di tensione il relè può tornarci utile. Però noi non vogliamo usare il relè del bed con comandi manuali, vogliamo che sia il firmware a gestirlo, come si fa? Bene innanzitutto definiamo NUM_SERVOS 1. In questo modo dedichiamo solo il pin 11 al servo (magari per l'autobed). Dopo di che andiamo sempre nel nostro pins.h: #define HEATER_BED_PIN 8 // Bed e gli mettiamo 6 o 5 oppure 4 (scegliamo quello che ci fa più comodo) tenendo conto che il 4 viene usato di default da marlin per le fan se usassimo la scheda con due estrusori.
A questo punto il firmware attiverà il pin 6 quando si deve attivare il bed, il relè scatterà e farà passare i 12 volt verso il bed che si scalderà.
Oppure possiamo usarlo per la fan che dovrà raffreddare l'hotend. Come?
Questa volta andiamo in configuration_adv.h:
#define EXTRUDER_0_AUTO_FAN_PIN   -1
#define EXTRUDER_1_AUTO_FAN_PIN   -1
#define EXTRUDER_2_AUTO_FAN_PIN   -1
#define EXTRUDER_AUTO_FAN_TEMPERATURE 50
#define EXTRUDER_AUTO_FAN_SPEED   255  // == full speed

Quì possiamo definire 3 pin per tre ventole per tre estrusori. Nel primo mettiamo il pin 6: #define EXTRUDER_0_AUTO_FAN_PIN 6. A questo punto il firmware attiverà il pin 6 a 255 quando la temperatura dell'hotend arriverà a 50°, il relè scatterà e alimenterà la nostra ventola a 12v.

Ho detto prima che il pin 4 viene usato per la fan del PLA nel caso che come scheda mettiamo 34 (quella con due estrusori). Ma se vogliamo il controllo di velocità della ventola, il relè non va bene. Quindi dobbiamo mettere un driver che vari la tensione d'ingresso in funzione del segnale in che gli arriva.
Per esempio la scheda splitter fan della gadget3d ha due di questi driver, quindi se usiamo questa invece di collegare la fan sulla D9 dobbiamo andare in pins.h e cambiare queste righe:
#if MOTHERBOARD == 33 || MOTHERBOARD == 35 || MOTHERBOARD == 67 || MOTHERBOARD == 68
    #define FAN_PIN            9 // Fan
  #else
    #define FAN_PIN            4 // IO pin. Buffer needed
  #endif

sostituire il 9 con 4, in questo modo utilizzeremo sempre il pin 4 per alimentare la fan del PLA.



Per ora mi fermo quì, se gli amministratori ritengono che possa essere utile e/o migliorato potrò dare il mio contributo... Per quello che posso...

Edited 2 time(s). Last edit at 05/02/2014 05:44AM by MagoKimbra.


COMPRA ITALIANO - sostieni le nostre aziende - sostieni la nostra gente - sostieni il tuo popolo - sosterrai te stesso.
Alberto C. felice possessore di una Kossel K2
My Blog - My Thingiverse
Re: Arduino pins come usarli e come funzionano!!!
May 07, 2018 02:30AM
Quote
alessandro347
...vuoi dire che le uscite D4 D5 D6 D11 che normalmente sono usate per dei servi, non sono collegate...

Moltissime versione della RAMPS non alimentanno il blocco servo, portano si i pin D4/5/6/11 ma non la tensione, tant'è che le istruzioni per montare, per esempio, il BLTouch indicano come risolvere la situazione:



Qualcosetta più che un neofina oramai, anche se non si finisce mai d'imparare!
DUE Stampati GEEETech i3B, GT2560+, Marlin GEEETech originale con un paio di modifichine personali (Pin dedicato per la Z Probe e stampa dell'ETE da SD), Barre Trapezie, Estrusore da 0.3 con filo da 1.75, una con estrusore metallico ed una con estrusore ridisegnato e stampato da me, Software AutoCAD/Slic3r/Repetier

My Thingiverse
My Linkedin
Re: Arduino pins come usarli e come funzionano!!!
June 01, 2018 10:17AM
Usando una RAMPS l'alimentatore di Bordo della scheda arduino sottostante è già relativamente carico, in special modo se si ha anche un display LCD.

Un servo, consumerebbe abbastanza corrente e il povero alimentatore che già a volte scalda per i fatti suoi corre il rischio di andare in tilt, bruciando anche la scheda Arduino.

Infatti anche la foto che hai riportato ricorda che sarebbe meglio aggiornare l'alimentazione con una più potente.

A questo scopo esistono in giro dei "riduttori di tensione" che da 12V a 5V (in genere regolabili), a costi contenuti, in genere usano un integrato LM2596 che è dichiarato per 3A ma più ragionevolmente forniscono in modo affidabile 1A , 1.5A effettivi, in uso continuo, anche perché le note applicative di TI (il produttore originale dell'integrato) dicono espressamente che superando i 2A sono necessari grandi aree di dissipazione e ventilazione forzata, dato che a volte l'intero alimentatore, risulta inferiore al prezzo del singolo integrato di fonte affidabile, mi terrei abbastanza abbottonato.

Vengono comunemente chiamati alimentatori step-down in quanto abbassano la tensione in uscita.

Comunque usare uno di quelli farebbe salire di molto poco il costo dell'insieme (al massimo 5 Euro, ma si trovano anche a 1 o 2 Euro in giro).

Il collegamento è semplicissimo, da una parte c'è il + e il - di ingresso, da collegare al +12V e alla GND

dalla parte opposta ci sono le uscite, il + è la tensione regolata usando l'apposito potenziometro di bordo.

In genere si può tranquillamente regolare la tensione attorno ai 5.2 - 5.3V (non maggiore per evitare problemi logici se la usiamo come tensione LOGICA per gli ingressi) e attaccare all'uscita gli utilizzatori, usando una GND comune.

L'alimentatore interno dell'Arduino, servirà per alimentare l'Arduino e il display LCD e il resto verrà alimentato da questo alimentatore aggiuntivo (LED esterni, Relais, Servo ecc.)


Saluti

Carlo D.


P3Steel - MKS GEN v1.2 e REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + Gen 7 MOSFET (HotBed) + alimentatore step-down 12V -> 5V
Firmware MK4duo 4.3.6 con ABL induttivo con LJ18A3 - Slic3R (Originale) ed ESP3D per controllare la stampante da remoto.
HotEnd Cinese V6 clone con ugello da 0.4mm.

[My Building Log]
Attachments:
open | download - step-down.jpg (131.1 KB)
Sorry, only registered users may post in this forum.

Click here to login