chi mi aiuta a realizzare questo????

Sezione dedicata a Linuxcnc
Rispondi
Lucariel
Member
Member
Messaggi: 200
Iscritto il: mercoledì 21 novembre 2007, 23:55
Località: Napoli

chi mi aiuta a realizzare questo????

Messaggio da Lucariel » venerdì 10 dicembre 2010, 15:19

ho tutto l'hardware necessario.. display arduino rotary encoder e altre cosucce... ma non riesco a farlo funzionare.........
qualcuno sarebbe in grado di aiutarmi????

http://www.youtube.com/watch?v=n9YMpQjsab4

http://www.youtube.com/watch?v=flajZMff28U

ci sto sbattendo da qualche settimana ma senza risultati......

sarebbe una cosa fantastica inoltre funzionando con l'usb è molto piuù comodo da portarsi dietro rispetto alla classica parallela.. senza parlare della comodità  di avevre a portata di mano la visualizzazione delle coordinate.

franceso
Senior
Senior
Messaggi: 1341
Iscritto il: martedì 22 aprile 2008, 16:37
Località: BZ

Re: chi mi aiuta a realizzare questo????

Messaggio da franceso » venerdì 10 dicembre 2010, 15:57

che cosa vuoi fare (davvero).
Secondo me il tipo sbaglia nella sua implementazione.
Io lo farei diversamente, e asattamente implementerei il codice nell´ arduino come periferica modbus, che poi e´ supportata
al 100% sia da mach3 che da EMC2 ma per ovvi motivi non lo trovi nella main release.

Lucariel
Member
Member
Messaggi: 200
Iscritto il: mercoledì 21 novembre 2007, 23:55
Località: Napoli

Re: chi mi aiuta a realizzare questo????

Messaggio da Lucariel » sabato 11 dicembre 2010, 14:02

dunque ti spiego chiaramente quale sarebbe il mio desiderio.....

per motivi di praticità  uso per la cnc un portatile dotato di parallela la cui capacità  di calcolo e la ram permettono al sistema di girare ottimamente, nel caso di lavorazioni manuali uso un jog dotato di encoder cablato sulla seconda parallela di un pc desktop.. ma trovo il tutto molto scomodo in quantonon riesco ad avere il monitore la tastiera nella giusta vicinanza.....

se potessi avere un jog comme quello che si vede nel primo video ovvero con un minimo di tasti ed un display dedicato sul quale leggere il dro e magari anche i 2 comandi di spindle override e feed override mi permetterebbe di eliminare il computer desktop e recuperare molto spazio... oltre che rendermi più comodo l'utilizzo della fresa in manuale.

ad essere sinceri non ho capito quale sarebbe l'approccio che mi suggerisci al problema.... potresti darmi una mano o almeno indicarmi qualche link da studiare... tenendo conto che sono totalmente inesperto...

ti ringrazio in anticipo Luca.

franceso
Senior
Senior
Messaggi: 1341
Iscritto il: martedì 22 aprile 2008, 16:37
Località: BZ

Re: chi mi aiuta a realizzare questo????

Messaggio da franceso » sabato 11 dicembre 2010, 14:27

metti un immagine del jog che hai e qualche descrizione dei collegamenti, e poi anche del resto di robba che hai, incluso descrizione (tipo di display, ...)

PS: se ti serve solo un jog con un interruttore a 4 posizioni e un pulsante, allora usa un mouse anche ottico usb che modifichi a dovere.

Lucariel
Member
Member
Messaggi: 200
Iscritto il: mercoledì 21 novembre 2007, 23:55
Località: Napoli

Re: chi mi aiuta a realizzare questo????

Messaggio da Lucariel » sabato 11 dicembre 2010, 14:42

le immagini potro metterle solo la settimana prossima quando potro passare dal box....
posso anticiparti che il materiale che ho a disposizione è un encoder che tira fuori i 2 classici segnali in quadratura un arduino nano e un display 20x4.

il mio file di configurazione hal è quello classico che trovi sul sito di emc che ho caricato pari pari.. riasssegando qualche pin per comodita.....

ovviamente con arduino non sono stato di far funzionare nulla.... a dire il vero non ho neanche la piu pallida idea di come fare..... mentre collegando l'encoder sulla seconda parallela tutto funziona perfettamente.....

non ho proprio idea ci come implementare il tutto mediante arduino..... bisognerebbe fare in modo di scrivere uno sketch per arduino che contempli la lettura del dro di emc2 e allo stesso tempo renda disponibili i restanti pin per encoder e pulsanti.... analogamente su emc2 bisognerebbe collegare tali pin virtuali.....

mi sbaglio?

franceso
Senior
Senior
Messaggi: 1341
Iscritto il: martedì 22 aprile 2008, 16:37
Località: BZ

Re: chi mi aiuta a realizzare questo????

Messaggio da franceso » sabato 11 dicembre 2010, 15:21

Ok, non importa, credevo che fosse piu robba.

Guardati il HALUI di emc2. E´ quello che ti serve.
Qua un esempio di arduino/emc.

Listing 1: adc6.pde

void setup() {
Serial.begin(9600);
}

void loop() {
for(int i=0; i<6; i++) {
uint16_t v = analogRead(i) | (i << 10);
Serial.print((v >> 7) | 0x80, BYTE);
Serial.print(v & 0x7f, BYTE);
}
}

Listing 2: arduino-adc6.py

#!/usr/bin/python

import serial
import hal
import sys

PORT = "/dev/ttyUSB0"

if len(sys.argv) > 1:
PORT = sys.argv[1]

ser = serial.Serial(PORT, 9600, timeout=2)

c = hal.component("arduino-adc6")
for port in range(6):
c.newpin("analog-in-%d" % port, hal.HAL_FLOAT, hal.HAL_OUT)
c.newparam("analog-in-%d-offset" % port, hal.HAL_FLOAT, hal.HAL_RW)
c.newparam("analog-in-%d-gain" % port, hal.HAL_FLOAT, hal.HAL_RW)
c['analog-in-%d-gain' % port] = 1.0
c.ready()

while 1:
b1 = ord(ser.read())
if b1 & 0x80 != 0x80: continue # First bit of packet has high bit set
b2 = ord(ser.read())
if b2 & 0x80 != 0: continue # Second bit of packet has high bit clear
v = (b1 << 7) | b2
port = (v >> 10) & 7
gain = c['analog-in-%d-gain' % port]
offset = c['analog-in-%d-offset' % port]
value = (v & 1023) / 1023. * 5.0 * gain + offset
c['analog-in-%d' % port] = value

Lucariel
Member
Member
Messaggi: 200
Iscritto il: mercoledì 21 novembre 2007, 23:55
Località: Napoli

Re: chi mi aiuta a realizzare questo????

Messaggio da Lucariel » lunedì 13 dicembre 2010, 15:28

Innanzitutto ti ringrazio del tempo che mi stai dedicando....
dunque delle cose che hai postato non ne ho capito molto... sembrerebbe l'esempio di jeff epler che si trova al link
http://axis.unpy.net/01198594294

ma anche seguendo le istruzioni non riesco a far convivere il pannello che monitorizza i pin di arduino ed emc2....

Ti descrivo in parte la configurazione hardware che ho al momento su arduino.....

ho i piedini 2,3,4,5 10,11,12 utilizzati per il display ( potrei eventualmente recuperare un altro piedino ma al momento posso provare anche cosi)
le 2 uscite dell'encoder sono collegate ai piedini 6 e 7 di arduino.... e per il momento nessun tasto.....

vorrei fare una cosa per volta......
ad esempio come visualizzare sul display il dro di emc2?

poi secondo step.. configurare i piedini 6 e 7 per utilizzare l'encoder per il movimento degli assi.... (ovviamente occorrera` qualche pulsante per abilitare l'asse e per selezionare la risoluzione...)

terzo step.. configurare un paio di piedinio analogici per utilizzare due potenziometri per spindle e feed override.....

infine una vera e propria tastiera per le varie funzioni.

sto correndo troppo?

franceso
Senior
Senior
Messaggi: 1341
Iscritto il: martedì 22 aprile 2008, 16:37
Località: BZ

Re: chi mi aiuta a realizzare questo????

Messaggio da franceso » lunedì 13 dicembre 2010, 17:06

Si, stai correndo troppo, nel senso che corri troppo e vuoi fare molte cose allo stesso tempo.

Ti descrivo in parte la configurazione hardware che ho al momento su arduino.....
ho i piedini 2,3,4,5 10,11,12 utilizzati per il display
le 2 uscite dell'encoder sono collegate ai piedini 6 e 7 di arduino.... e per il momento nessun tasto.....

Ok, e questo va benissimo. Adesso prima di scrivere il codice, pensa a assegnare il resto dei pin, da non dover riscrivere il firmware troppe
volte. Diciamo questo e´ lo step 0.

Poi hai detto questi Steps:
1) ad esempio come visualizzare sul display il dro di emc2?
2) configurare i piedini 6 e 7 per utilizzare l'encoder per il movimento degli assi....
3) configurare un paio di piedinio analogici per utilizzare due potenziometri per spindle e feed override.....

Da quello che hai detto, hai l´encoder e il display funzionante come Hardware. Benissimo.
Scrivi del SW per questi componenti, questo non sembra male per quanto riguarda lencoder di quadratura, te lo incollo qui sotto.
Poi aggiungi il display, inserisci il codice che visualizza le coordinate dell´encoder, magari X normale e Y diviso 10 e Z diviso 1000.
Praticamente dovresti testare il tutto che funzioni solo con arduino e il display e utilizzare per ogni cosa una variablile diversa.
Se tutto poi funziona, si va avanti a interfacciarlo con EMC come descritto dalla pagina.

#include
#include

int ledPin = 13; // LED connected to digital pin 13
int ENCODE_A = 2;
int ENCODE_B = 3;
boolean CW = HIGH;
unsigned long counter = 0;
unsigned long oldCounter = 0;

void flash()
{
static uint16_t stateA = 0; // Current debounce status A
static uint16_t stateB = 0; // Current debounce status B
stateA = (stateA<<1) | digitalRead(ENCODE_A);
stateB = (stateB<<1) | digitalRead(ENCODE_B);
// High to Low transitions
if ((stateA == 0xf000) && (stateB == 0xffff)) counter++;
if ((stateB == 0xf000) && (stateA == 0x0000)) counter++;
// Low to High transitions
if ((stateA == 0x0fff) && (stateB == 0x0000)) counter++;
if ((stateB == 0x0fff) && (stateB == 0xffff)) counter++;

// High to Low transitions
if ((stateB == 0xf000) && (stateA == 0xffff)) counter--;
if ((stateA == 0xf000) && (stateB == 0x0000)) counter--;
// Low to High transitions
if ((stateB == 0x0fff) && (stateA == 0x0000)) counter--;
if ((stateA == 0x0fff) && (stateB == 0xffff)) counter--;
}

void setup()
{
// sets the digital pin as output
pinMode(ledPin, OUTPUT);

//During set up, we want to enable the pull-up resistors
//for pin 2 and pin 4 with:

pinMode(ENCODE_A, INPUT); // Pin 2
digitalWrite(ENCODE_A, HIGH); // Enable pull-up resistor

pinMode(ENCODE_B, INPUT); // Pin 3
digitalWrite(ENCODE_B, HIGH); // Enable pull-up resistor

MsTimer2::set(1, flash); // 1ms period
MsTimer2::start();
Serial.begin(9600);
}

void loop()
{
if (counter != oldCounter)
{
oldCounter = counter;
Serial.println(counter,DEC);
}
}

Lucariel
Member
Member
Messaggi: 200
Iscritto il: mercoledì 21 novembre 2007, 23:55
Località: Napoli

Re: chi mi aiuta a realizzare questo????

Messaggio da Lucariel » lunedì 13 dicembre 2010, 18:39

.....da quello che mi stai spiegando se ho capito bene l'encoder sara` in hardware dentro arduino e quindi il display dovra` visualizzare la lettura dell'encoder indipendentemente da emc2.....
invece io credevo che arduino rendesse disponibili virtualmente in emc2solo i pin hardware e per il movimento si sarebbe usato poi l'encoder software come accade per il jog classico su porta parallela....

come faranno ad essere sincronizzati i 2 dro ( arduino ed emc2)???
in tutti i casi provo il codice che hai scritto per vedere se riesco a far funzionare il jog....

franceso
Senior
Senior
Messaggi: 1341
Iscritto il: martedì 22 aprile 2008, 16:37
Località: BZ

Re: chi mi aiuta a realizzare questo????

Messaggio da franceso » lunedì 13 dicembre 2010, 18:57

Si, l´encoder deve per forza essere in hw dentro arduino, perche l´usb sarebbe troppo lenta, anche la seriale in caso pensassi a quella.
L´arduino deve filtrare (debouncing) gli ingressi e decodificare il dro. Fatto questo, lo trasmettera a emc2 che tramite il software in
python e la configurazione come descritto qua http://www.anderswallin.net/2006/11/jogging-emc2/ fara il resto solo che al posto di usare
un componente SW per l´encoder che genera il count, quello li viene data dall´arduino. Il codice fa solo la parte del encoder, la parte
del display lcd devi completarla te. In rete troverai sicuramente come fare. Se poi funziona tutto, si va avanti, si sa che l´arduino funziona
si amplia il codice con l´invio e la ricezione dei commandi, si modifica il file python e hal. Altrimenti non potrai mai sapere, se non funziona,
dove sta l´errore e perche non funziona.

Lucariel
Member
Member
Messaggi: 200
Iscritto il: mercoledì 21 novembre 2007, 23:55
Località: Napoli

Re: chi mi aiuta a realizzare questo????

Messaggio da Lucariel » lunedì 13 dicembre 2010, 19:43

ok... mi e` chiara la spiegazione tranne una cosetta... se il dro visualizzato sul display e` legato all'encoder di arduino come potra` visualizzare la stessa lettura presente su emc2? se azzero dal tasto sul software come verra` riportata la lettura sul display del jog?

in tutti i casi.. ho messo l'encoder che mi hai postato dentro arduino e funziona.... visualizzo sul monitor seriale l'incremento o il decremento delle cifre e le vedo anche sul display lcd.

sto cercando di risolvere 2 problemi.. il primo e` che se muovo velocemente l'encoder.. si perde gli impulsi.... per cui conta bene solo se ruoto molto lentamente la manopola.....
l'altro problema e` che quando passo dalla massima lettura che e` : 4294967295
alla lettura : 0 le cifre restano tutte accese sul display e si sovrappune la lettura solo delle prime.....
debbo studiarmi bene il display....

aspetto tue news... nel frattempo grazie mille.....
nella speranza anche che questo lavoro sia utile a molti altri...... visto il fatto che al momento pare che nessuno sulla rete stia sviluppando questo progetto in modo pubblico.

franceso
Senior
Senior
Messaggi: 1341
Iscritto il: martedì 22 aprile 2008, 16:37
Località: BZ

Re: chi mi aiuta a realizzare questo????

Messaggio da franceso » lunedì 13 dicembre 2010, 20:54

Viene poi gestito dal HAL, ma siccome la cosa e´ abbastanza complessa e ci possono essere problemi da tutte le parti, prima deve funzionare
sul arduino da solo. Se funziona perfettamente, allora si va avanti.

Mi fa piacere che funzioni, meno che non ce la fa e perde passi. Cé qualcosa che non va. Allora prima di tutto devi verificare che non cé
qualcosa che non funziona. Ad esempio serial.print in software o altro che disabilita le interrupt o riprogramma il timer.
Quanti impulsi ha l´encoder per ogni rotazione ? Per esempio, non devi usare la funzione delay e cosi via. usa mills come alternativa.
Per il problema della formattazione, usa sprintf, http://linux.die.net/man/3/sprintf e poi "%12d" come esempio se deve avere 12 numeri
e non avrai piu il problema. comunque guardati anche il manuale.

include <stdarg.h>
void p(char col, char row, char *fmt, ... ){
char tmp[128]; // resulting string limited to 128 chars
va_list args;
va_start (args, fmt );
vsnprintf(tmp, 128, fmt, args);
va_end (args);
lcd.setCursor(col, row)
lcd.print(tmp);
}
[Get Code]

Examples: manca il parametro col e row che ho inserito io
p("%s", "Hello world");
p("%s\n", "Hello world"); // with line break
unsigned long a=0xFFFFFFFF;
p("Decimal a: %l\nDecimal unsigned a: %lu\n", a, a);
p("Hex a: %x\n", a);

Lucariel
Member
Member
Messaggi: 200
Iscritto il: mercoledì 21 novembre 2007, 23:55
Località: Napoli

Re: chi mi aiuta a realizzare questo????

Messaggio da Lucariel » lunedì 13 dicembre 2010, 22:55

ovviamente sto facendo varie prove.....per far funzionare tutto come dici tu in hardware.....
dunque....

dopo alcune prove posso affermare che la visualizzazione attraverso il monitor della seriale e` ok conta benissimo in un senso e nell'altro..... senza alcun problema....

il problema resta la velocita` ovvero... superato un certo numero di impulsi giro e` come non ce la facesse piu` a contare e resta al valore senza incertezze fino a quando diminuendo la velocita` di rotazione riprende a contare correttamente da dove si era fermato... in un senso e nell'altro.....

ho provato anche un modulo encoder piu` semplice ( il primo esempio sulla pagina di arduino) e da lo stesso problema.... ma a velocita` ben piu` alte.... per cui il tutto sembrerebbe collegato alla velocita di interrupt.....

ho provato a variare il tempo di esecuzione della funzione flash che hai usato... ma senza risultato.... ( non so se accetta valori minori di 1ms).

per quanto riguarda la visualizzazione con l'encoder che ti incollo di sotto la visualizzazione era corretta..... ovvero quando si passa a valori da tre a 2 e poi a 1 cifra e poi ai seguenti valori negativi il display viene aggiornato correttamente sempre col comando lcd.print... e non capisco perche.. di contro... capita che parta a contare e non si fermi piu` oppure all'aumentare della velocita` dia valori a caso....

int val;
int encoder0PinA = 6;
int encoder0PinB = 7;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;

void setup() {
pinMode (encoder0PinA,INPUT);
pinMode (encoder0PinB,INPUT);
Serial.begin (9600);
}

void loop() {
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;
} else {
encoder0Pos++;
}
Serial.println (encoder0Pos);

}
encoder0PinALast = n;
}

Lucariel
Member
Member
Messaggi: 200
Iscritto il: mercoledì 21 novembre 2007, 23:55
Località: Napoli

Re: chi mi aiuta a realizzare questo????

Messaggio da Lucariel » martedì 14 dicembre 2010, 1:06

ho usato sprintf per formattare correttamente il display ( anche se adesso sul display quando appare "-10" sul serial appare "4294967286"
allego lo sketch di arduino in modo che puoi renderti conto meglio su cosa sto lavorando...



#include <LiquidCrystal.h>

#include <MsTimer2.h>


// initialize the library with the numbers of the interface pins
//( 12=RS 11=RW 10=E 5=D4 4=D5 3=D6 2=D7 )
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int ENCODE_A = 6;
int ENCODE_B = 7;
boolean CW = HIGH;
unsigned long counter = 0;
unsigned long oldCounter = 0;


void flash()
{
static uint16_t stateA = 0; // Current debounce status A
static uint16_t stateB = 0; // Current debounce status B
stateA = (stateA<<1) | digitalRead(ENCODE_A);
stateB = (stateB<<1) | digitalRead(ENCODE_B);
// High to Low transitions
if ((stateA == 0xf000) && (stateB == 0xffff)) counter++;
if ((stateB == 0xf000) && (stateA == 0x0000)) counter++;
// Low to High transitions
if ((stateA == 0x0fff) && (stateB == 0x0000)) counter++;
if ((stateB == 0x0fff) && (stateB == 0xffff)) counter++;

// High to Low transitions
if ((stateB == 0xf000) && (stateA == 0xffff)) counter--;
if ((stateA == 0xf000) && (stateB == 0x0000)) counter--;
// Low to High transitions
if ((stateB == 0x0fff) && (stateA == 0x0000)) counter--;
if ((stateA == 0x0fff) && (stateB == 0xffff)) counter--;

}

char bufferX [10];
char bufferY [10];
char bufferZ [10];
char bufferA [10];


void setup()
{

// set up the serial port
Serial.begin(9600);


//During set up, we want to enable the pull-up resistors
//for pin 6 and pin 7 with:

pinMode(ENCODE_A, INPUT); // Pin 6
digitalWrite(ENCODE_A, HIGH); // Enable pull-up resistor

pinMode(ENCODE_B, INPUT); // Pin 7
digitalWrite(ENCODE_B, HIGH); // Enable pull-up resistor

MsTimer2::set(1, flash); // 1ms period
MsTimer2::start();



// set up the LCD's number of columns and rows:
lcd.begin(20, 4);

// Print a message to the LCD.

lcd.setCursor(0, 0);
lcd.print("X:");

lcd.setCursor(0, 1);
lcd.print("Y:");

lcd.setCursor(0, 2);
lcd.print("Z:");

lcd.setCursor(0, 3);
lcd.print("A:");

lcd.setCursor(12, 0);
lcd.print("Feed %");
lcd.setCursor(12, 1);
lcd.print("Spdl %");

}


void loop()
{

if (counter != oldCounter)
{
oldCounter = counter;
Serial.println(counter,DEC);
}

sprintf(bufferX,"%-8d",counter);
sprintf(bufferY,"%-8d",counter);
sprintf(bufferZ,"%-8d",counter);
sprintf(bufferA,"%-8d",counter);

lcd.setCursor(2, 0);
lcd.print(bufferX);

lcd.setCursor(2, 1);
lcd.print(bufferY);

lcd.setCursor(2, 2);
lcd.print(bufferZ);

lcd.setCursor(2, 3);
lcd.print(bufferA);


}
Non hai i permessi necessari per visualizzare i file e le foto allegati in questo messaggio. Per visualizzare tali file devi registrarti ed effettuare il Login

franceso
Senior
Senior
Messaggi: 1341
Iscritto il: martedì 22 aprile 2008, 16:37
Località: BZ

Re: chi mi aiuta a realizzare questo????

Messaggio da franceso » martedì 14 dicembre 2010, 9:46

che e´ ,sembra un motore stepper usato come encoder.
Quale risoluzione per giro ha ? per sapere anche il timing, come dovrebbe essere.

Rispondi

Torna a “Linuxcnc”