Update
Inizio scusandomi con tutti se questo topic sembra piu' un blog personale che un fai da te e ringraziando spirit74 per l incoraggiamento
Quindi grazie spirit74 e . . . si, faro' tagliare il tutto da un' officina specializzata mentre le parti in abs saranno stampate al laser.
La ditta che stampa mi fornira' anche boccole e cuscinetti in materiale "plastico" a zero usura. Sono leggerissimi e (a detta loro...) piu' resistenti dell' acciaio.
Effettivamente ho visto una campionatura di boccole (o bronzine) che non hanno bisogno di lubrificante e paiono indistruttibili oltre ad essere leggerissimi e super scorrevoli.
Super anche il prezzo 3 volte superiore ad un abec 11 in acciaio, maledetti polimeri !
Come detto nel precedente post, ecco lo schema di collegamento e lo sketch per far muovere il tutto.
Come dicevo (anche se funzionante) e' stato abbozzato alla brutos e messo nel dimeticatoio in favore di una programmazione piu' pulita ed espandibile che non pubblichero' per ovvi motivi.
Alla fine il lavoro lo fanno i driver ed i motori e questi mostriciattoli da 3 Ampere muovono tutti i 3200 passi (in microstepping) con amore senza perdere step
Ovviamente e' necessario munirsi degli stessi motori citati nel primo post che supportano tale amperaggio ed una torsione di 4,8Kg/Cm
I microswitch dei driver a disegno sono appunto impostati per erogare 3 ampere in microstepping 1/16.
Poi,
Alcuni LCD hanno catodo ed anodo inveriti. Ovviamente non accade nulla di grave, ma non si ha retroilluminazione. Controllate il vostro datasheet.
Nello schema i pot sono due entrambe da 10k. Uno per il contrasto e l' altro per la retroilluminazione.
Una delle due batterie ha montato in parallelo uno step-down per alimentare Arduino direttamente a 7V.
Il joy per il menu e' un classico minithumb da 10k con interruttore a pulsante. C'e' una resistenza sul pulsante per non mandare proprio in corto tutto quando chiude ...
Una parte dello sketch serve a fare lo "0" del joystick di manovra motori. I dati sono relativi al joy in mio possesso da 5k. Sara' sicuramente necessario variarli.
Rimando a questa discussione per approfondire la funzione "map" di Arduino (la prima a caso cercando con google...) :
http://www.provalotu.com/robotica-2/arduino-e-la-funzione-map/E' necessario aggiungere alcune librerie come si vede nello sketch
E bon . . .
Codice: Seleziona tutto/* uso del display LCD 16x2 standard Hitachi HD44780
Circuito:
* pin RS collegato al pin digitale 7
* pin E (Enable) collegato al pin digitale 6
* pin D4 collegato al pin digitale 5
* pin D5 collegato al pin digitale 4
* pin D6 collegato al pin digitale 3
* pin D7 collegato al pin digitale 2
* pin R/W collegato al GND
* pin 1 e pin 4 collegati a GND
* pin 2 collegato a +Vcc
* centrale del potenziometro/trimmer da 10 KOhm collegato al pin 3 del'LCD
* pin SX potenziometro/trimmer collegato a +Vcc
* pin DX potenziometro/trimmer collegato a GND
* i pin SX e DX del potenziometro/trimmer possono essere interscambiati
*/
/* uso dei drivere singolo asse TB6560
Circuito:
- Motore X
* CLK+ (step) collegato a pin digitale 9
* CW+ (senso di rotazione) collegato a pin digitale 8
* CLK- CW- collegato A GND
- Motore Y
* CLK+ (step) collegato a pin digitale 11
* CW+ (senso di rotazione) collegato a pin digitale 10
* CLK- CW- collegato A GND
*/
#include <LiquidCrystal.h> // carica la libreria per il display
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // dico alla libreria dove sono connessi i pin LCD
#include <AccelStepper.h> // carica la libreria per i motori
AccelStepper stepperX(1, 9, 8); // dico alla libreria dove sono connessi i pin dei controller X
AccelStepper stepperY(1, 11, 10); // dico alla libreria dove sono connessi i pin dei controller Y
/*
JOYSTICK Movimento motori
Definizione pin ingresso joystick analogico
*/
#define asseX A1
#define asseY A0
/*
JOYSTICK Movimento menu
Definizione pin ingresso joystick analogico e pulsante analogico
*/
#define menuX A5
#define menuY A4
#define pulsA A3
int s=0; // questo mi serve per aggiornare il display ogni tot cicli (vedi sezione motori piu avanti)
int m=0; // questo mi serve per aggiornare lo stato del menu ogni tot cicli (vedi sezione menu piu avanti)
int X=50;
int Y=50;
void setup() {
/*
Questo blocco oltre ad avere funzione estetica, da tempo ai driver
stepper di accendendersi correttamente
*/
lcd.begin(16, 2); // Numero di colonne ed il numero di righe di lcd
lcd.print(" MATIM (C) 2015"); // Visualizzo il messaggio sul display
delay(1500); // aspetto un secondo e mezzo
lcd.setCursor(0, 1); // vado a capo
lcd.print("..Initializing.."); // Visualizzo il messaggio sul display
delay(2000); // aspetto due secondi
lcd.clear(); // pulisco lo schermo
/*
JOYSTICK motori e menu
Definisce come arudino deve interpretare i segnali (che sono tutti di input)
*/
pinMode( asseX,INPUT );
pinMode( asseY,INPUT );
pinMode( menuX,INPUT );
pinMode( menuY,INPUT );
pinMode( pulsA,INPUT );
/*
MOTORI X e Y
Definisce velocita' massima
*/
stepperX.setMaxSpeed(3000);
stepperY.setMaxSpeed(3000);
}
void loop() {
// TEST SERIALE VERIFICA DATI
// Serial.print( "Corrente del pulsante: " );
// Serial.print( analogRead( buttA ) );
// Serial.print( "\n" );
// cerco di fare uno zero data l alta sensibilita' del joystick
int mapX = analogRead(asseX); // assegno a mapX la lettura del pot per il remap
int mapY = analogRead(asseY); // assegno a mapY la lettura del pot per il remap
mapY = map(mapY, 20, 920, -10, 10); // adesso al centro e' 0 e va a +500 o -500
mapX = map(mapX, 100, 990, -10, 10); // adesso al centro e' 0 e va a +500 o -500
mapX = constrain(mapX,-100,100); // fisso i valori min max per non andare fuori scala
mapY = constrain(mapY,-100,100); // fisso i valori min max per non andare fuori scala
if (mapX == 1 || mapX == -1 ) { mapX=0;}
if (mapY == 1 || mapY == -1 ) { mapY=0;}
/*
MENU
controllo se e' stato mosso il joystick-bottone del menu
el caso visualizzo sull LCD le modifiche
*/
m++;
if (m>400) {
m=0;
if (analogRead(pulsA) == 0) {
delay(500);
while (analogRead(pulsA) >= 50) {
X = constrain(X,1,100);
Y = constrain(Y,1,100);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("--- Set Vel ---");
lcd.setCursor(1, 1);
lcd.print("Pan:");
lcd.setCursor(5, 1);
lcd.print(X);
lcd.setCursor(8, 1);
lcd.print("Tilt:");
lcd.setCursor(13, 1);
lcd.print(Y);
switch (analogRead(menuX) ) {
case 1023:
X++;
break;
case 0:
X--;
break;
}
switch (analogRead(menuY) ) {
case 1023:
Y--;
break;
case 0:
Y++;
break;
}
delay(250);
}
}
}
/*
if (analogRead(pulsA) == 0) {
lcd.clear();
lcd.print("Button OK :");
lcd.setCursor(9, 1);
lcd.print( analogRead( pulsA ) );
delay(1500);
}
if (analogRead(menuX) == 1023) {
lcd.clear();
lcd.print("X Right:");
lcd.setCursor(9, 1);
lcd.print( analogRead( menuX ) );
delay(1500);
}
if (analogRead(menuX) == 0) {
lcd.clear();
lcd.print("X Left:");
lcd.setCursor(9, 1);
lcd.print( analogRead( menuX ) );
delay(1500);
}
if (analogRead(menuY) == 0) {
lcd.clear();
lcd.print("Y Up:");
lcd.setCursor(9, 1);
lcd.print( analogRead( menuY ) );
delay(1500);
}
if (analogRead(menuY) == 1023) {
lcd.clear();
lcd.print("Y Down:");
lcd.setCursor(9, 1);
lcd.print( analogRead( menuY ) );
delay(1500);
}
*/
/*
MOTORI
comando i motori con il joystick in base ai parametri impostati nel menu
e visualizzo le coordinate sull LCD
*/
s++; // ho dichiarato i=0 quando i arriva a 500 il display viene aggiornato ed i torna a 0
if (s>500) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print( "Pan Vel : " );
lcd.setCursor(11, 0);
lcd.print(mapX);
lcd.setCursor(0, 1);
lcd.print( "Tilt Vel : " );
lcd.setCursor(11, 1);
lcd.print(mapY);
s=0;
}
// Test movimento motori
if (mapX == 0) {
stepperX.setCurrentPosition(0);
stepperX.stop();
}
if (mapY == 0) {
stepperY.setCurrentPosition(0);
stepperY.stop();
}
stepperX.setSpeed(mapX*X);
stepperX.runSpeed();
stepperY.setSpeed(mapY*Y);
stepperY.runSpeed();
}