DRO dla ubogich poraz wtóry.

Planujesz zakup sprzętu do warsztatu, masz problem z maszyną tu możesz o tym porozmawiać - nie tylko maszyny CNC
Awatar użytkownika

tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 29
Posty: 4654
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: DRO dla ubogich poraz wtóry.

#11

Post napisał: tuxcnc » 29 mar 2020, 17:07

tristar0 pisze:
29 mar 2020, 16:45
czy ktoś dopomoże i rzuci okiem po programie "świeżym okiem".
To nie ma prawa działać z uwagi na zależności czasowe.
Jak już jesteś uparty zastosować obsługę programową enkodera, to nie ominą Cię procedury w asemblerze.
Natomiast właściwym rozwiązaniem jest obsługa sprzętowa, co wymusza użycie Arduino DUE lub STM32.
Niedawno opisałem na forum DRO na DUE i tablecie, poszukaj.



Tagi:


tristar0
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 51
Posty: 319
Rejestracja: 21 sty 2020, 17:48
Lokalizacja: Toruń

Re: DRO dla ubogich poraz wtóry.

#12

Post napisał: tristar0 » 29 mar 2020, 17:16

to działa na wyswietlaczu 16x2 ja tylko przerobiłem na ft800 bo jest duży i nie chce już dzałać

Dodane 6 minuty 25 sekundy:
dla jasności całość ;


#include <EEPROM.h>
#include <SPI.h>
#include <Wire.h>
#include <FT_VM800P43_50.h>
FT800IMPL_SPI FTImpl(FT_CS_PIN, FT_PDN_PIN, FT_INT_PIN);
// Adapter ↔ Arduino UNO
// 5V ↔ 5V
// GND ↔ GND
// SCK ↔ D13
// MISO ↔ D12
// MOSI ↔ D11
// INT ↔ D10
// CS ↔ D9
// PD ↔ D4




volatile long encoder0Pos = 0;
float tmp = 0;
long Aold = 0;
long Bnew = 0;
float Mm = 1;
float podz = Mm /2; // wartosc przez ktorą dzielimy wynik
float imp = 400; //imp/enkodera x4


//--------------------------------------- ustawienia lcd ft 800
void setup() {
FTImpl.Init(FT_DISPLAY_RESOLUTION);
FTImpl.SetDisplayEnablePin(FT_DISPENABLE_PIN);
FTImpl.SetAudioEnablePin(FT_AUDIOENABLE_PIN);
FTImpl.DisplayOn();
FTImpl.AudioOn();

FTImpl.DLStart();
FTImpl.Finish();
FTImpl.DLStart();
FTImpl.DLEnd();
FTImpl.Finish();

#define encoder0PinA 2
#define encoder0PinB 3
#define zeroPin 5 //zerowanie wartości
#define podzPin 6 //podział wartosci 1/2
#define pinMode(encoder0PinA, INPUT);
#define pinMode(encoder0PinB ,INPUT);
#define pinMode(zeroPin, INPUT) ;
#define pinMode(podzPin, INPUT) ;
#define digitalWrite(zeroPin, HIGH);
#define digitalWrite(podzPin, HIGH);

}
void scena ( float tmp )
{
FTImpl.DLStart();
FTImpl.DLStart();
FTImpl.ColorRGB(255, 255, 0);
FTImpl.Cmd_Button(10, 10, 120, 60, 31, 0, "mm");
FTImpl.ColorRGB(255, 255, 0);
FTImpl.Cmd_Number(190, 16, 31, 0, tmp);




FTImpl.DLEnd(); // Zamykamy liste wyswietlania
FTImpl.Finish(); // Renderujemu liste i czekamy na ukonczenie

}

void loop() {
scena ( tmp );
if (tmp != encoder0Pos || (digitalRead(zeroPin) == 0)) {
if (digitalRead(zeroPin) == 0) {
tmp = 0;
encoder0Pos = 0;
}
if (digitalRead(podzPin) == 0) {
tmp = encoder0Pos / imp * podz;//dzielimy na 2

}
else {
tmp = encoder0Pos / imp * Mm ; // mm

}

}

}

// Interrupt A
void doEncoderA() {
Bnew^Aold ? encoder0Pos++:encoder0Pos--;
Aold=digitalRead(encoder0PinA);

}

// Interrupt B
void doEncoderB(){
Bnew=digitalRead(encoder0PinB);
Bnew^Aold ? encoder0Pos++:encoder0Pos--;

}

Dodane 4 minuty 11 sekundy:
tak sobie ostatnio przeglądałem net i jakoś wszyscy upierają się na suwmiarki a chyba z enkoderem jest o wiele ciekawiej no i suwmiarki te tanie zwłaszcza szaleją z odczytem

Dodane 1 minuta 32 sekundy:
a poza tym ciężko zmierzyć suwmiarką metr

Awatar użytkownika

tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 29
Posty: 4654
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: DRO dla ubogich poraz wtóry.

#13

Post napisał: tuxcnc » 29 mar 2020, 17:26

tristar0 pisze:
29 mar 2020, 17:10
to działa
To działa tak, jak wbijanie gwoździ kombinerkami.
Ale jeśli wiesz lepiej, to radź sobie sam.


tristar0
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 51
Posty: 319
Rejestracja: 21 sty 2020, 17:48
Lokalizacja: Toruń

Re: DRO dla ubogich poraz wtóry.

#14

Post napisał: tristar0 » 29 mar 2020, 17:28

gdybym wiedział lepiej to nie pytałbym

Awatar użytkownika

tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 29
Posty: 4654
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: DRO dla ubogich poraz wtóry.

#15

Post napisał: tuxcnc » 29 mar 2020, 17:45

tristar0 pisze:
29 mar 2020, 17:28
gdybym wiedział lepiej to nie pytałbym
No więc przyjmij do wiadomości, ze twój program nadaje się co najwyżej do zabawy, ale montowanie takiego urządzenia do rzeczywistej obrabiarki jest głupotą.
Tutaj masz opis mojego rozwiązania podzielnica-elektroniczna-t104790.html.
Jest też na forum długi wątek o sprzętowej obsłudze enkodera, ale poszukaj sobie sam.
Przy okazji poszukaj sobie też w necie, ile czasu trwa procedura digitalRead(), która jest umieszczona wewnątrz przerwania i sam się zastanów jaki to ma sens, a raczej dlaczego to sensu nie ma.
I na koniec, ale nie najmniej ważne, to ile kosztuje metrowy enkoder liniowy i czy warto "zaoszczędzić" na mikrokontrolerze 40 PLN tylko po to, żeby nie działało ?


tristar0
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 51
Posty: 319
Rejestracja: 21 sty 2020, 17:48
Lokalizacja: Toruń

Re: DRO dla ubogich poraz wtóry.

#16

Post napisał: tristar0 » 29 mar 2020, 18:15

chyba się nie zrozumieliśmy ,tak wiem sa enkodery liniowe ale ja próbuje rozwiązać własny problem mam w maszynie już enkodery na silnikach z servami , dodatkowo na sterowniku silników mam gotowe wyjścia z enkoderów sygnały ttl A,B,Z , gdybym nie miał tych sygnałów to skłaniałbym się o zakup gotowych enkoderów liniowych i jakieś firmowe dro.
Maszyny używam sporadycznie a nie przemysłowo .

Dodane 6 minuty 32 sekundy:
poza tym sprawdzałem ten program i działa tyle że ledy biją po oczach


// Quad Encoder 600 ppr LPA3806
// Red 5 Vcc
// White Chanel A Pin 2 (Int 1)
// Green Chanel B Pin 3 (Int 2)
// Black Gnd

// Display 8 digit MAX7219 -a-
// VCC R 5 Vcc f b
// DIN W MOSI Pin 11 -g-
// CS Y SS Pin 10 e c
// CLK B SCK Pin 13 -d- p
// GND B Gnd pgfe dcba

// Zero switch
// COM B Gnd
// NO Y Pin 9

/******************************************************************/

#include <LedControl.h>

LedControl lc=LedControl(11,13,10,1);

/******************************************************************/

#define SCF 75.00000 // Encoder factor (1/((600*4)/(12*0.08))*10000) // 75.00000 /obr 3mm 50.00000 =2mm 25.0000 =1mm

#define DLY 50 // Refresh period (100 ms)

#define QCA 2 // Encoder Chanel A (Pin 2)
#define QCB 3 // Encoder Chanel B (Pin 3)

#define QIA 0 // Encoder Chanel A (Int 1)
#define QIB 1 // Encoder Chanel B (Int 2)

#define SWZ 9 // Zero switch (Pin 9)

long DroCnt; // DRO raw counter
long DroOfs; // DRO offset (zero)
long DroMea; // DRO measurement (inch *10000)
float DroKft; // DRO scale factor


/******************************************************************/


void setup()
{
IniSwz(); // Init Zero switch
IniEnc(); // Init Encoder
IniDsp(); // Init Display
IniClc(); // Init Calc
}


void loop()
{
ThrSwz(); // Test Zero switch
ThrClc(); // Calc measure
ThrDsp(); // Display measure
delay(DLY);
}


/******************************************************************/


void IniClc(void) // Init Calc
{
DroCnt=0;
DroOfs=0;
DroMea=0;
DroKft=SCF;
}


void ThrClc(void) // Calc measure
{
DroMea=FltLng((float)(DroCnt-DroOfs)*DroKft);
}


/******************************************************************/


void IniDsp(void) // Init Display
{
lc.shutdown(0,false); // MAX7219 out of power-saving mode
lc.setIntensity(0,9); // jasnosc wyswietlacza
lc.clearDisplay(0); // Clear display
}

void ThrDsp(void) // Display measure
{
long v;
int i,n,m;

n=0;
v=DroMea;
if(v<0)
{
n=1;
v*=-1;
}
for(i=0;i<8;i++)
{
m=v%10;
switch(i)
{
case 0:
if(m>=5)
lc.setDigit(0,i,5,false);
else
lc.setDigit(0,i,0,false);
break;
case 1:
case 2:
case 3:
lc.setDigit(0,i,m,false);
break;
case 4:
lc.setDigit(0,i,m,true);
break;
case 5:
case 6:
case 7:
if(m)
lc.setDigit(0,i,m,false);
else
{
if(n)
{
n=0;
lc.setChar(0,i,'-',false);
}
else
lc.setChar(0,i,' ',false);
}
break;
}
v/=10;
}
}


/******************************************************************/


void IniSwz(void) // Init Zero switch
{
pinMode(SWZ,INPUT_PULLUP);
}


void ThrSwz(void) // Test Zero switch
{
if(!digitalRead(SWZ))
DroOfs=DroCnt;
}


/******************************************************************/


void IniEnc(void) // Init Encoder
{
pinMode(QCA,INPUT_PULLUP);
pinMode(QCB,INPUT_PULLUP);
attachInterrupt(QIA,QenChAInt,CHANGE);
attachInterrupt(QIB,QenChBInt,CHANGE);
}


void QenChAInt(void) // Interruption chanel A
{
if(PIND&4)
{ // Chanel A High
if(PIND&8)
DroCnt++; // Chanel B High (increase)
else
DroCnt--; // Chanel B Low (decrease)
}
else
{ // Chanel A Low
if(PIND&8)
DroCnt--; // Chanel B High (decrease)
else
DroCnt++; // Chanel B Low (increase)
}
}


void QenChBInt(void) // Interruption chanel B
{
if(PIND&8)
{ // Chanel B High
if(PIND&4)
DroCnt--; // Chanel A High (decrease)
else
DroCnt++; // Chanel A Low (increase)
}
else
{ // Chanel B Low
if(PIND&4)
DroCnt++; // Chanel A High (increase)
else
DroCnt--; // Chanel A Low (decrease)
}
}


/******************************************************************/


long FltLng(float v)
{
return((v<0)?(long)(v-0.5):(long)(v+0.5));
}

Dodane 8 minuty 39 sekundy:
Dla tego bardziej przemawia do mnie FT800 niz ledy

Awatar użytkownika

tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 29
Posty: 4654
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

Re: DRO dla ubogich poraz wtóry.

#17

Post napisał: tuxcnc » 29 mar 2020, 19:09

tristar0 pisze:
29 mar 2020, 18:23
chyba się nie zrozumieliśmy
Nie, ja wszystko doskonale rozumiem - znalazłeś w necie gówniany program i uparłeś się go zastosować.
Nie słuchasz, bo jesteś zajęty wygłaszaniem monologu.
Na tym zakończymy naszą rozmowę, bo naprawdę szkoda mojego czasu..


tristar0
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 51
Posty: 319
Rejestracja: 21 sty 2020, 17:48
Lokalizacja: Toruń

Re: DRO dla ubogich poraz wtóry.

#18

Post napisał: tristar0 » 29 mar 2020, 19:16

to po co człowieku wogule się odzywasz i mącisz chcesz poklasku to zmień adres


tristar0
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 51
Posty: 319
Rejestracja: 21 sty 2020, 17:48
Lokalizacja: Toruń

Re: DRO dla ubogich poraz wtóry.

#19

Post napisał: tristar0 » 30 mar 2020, 11:19

[
Nie, ja wszystko doskonale rozumiem - znalazłeś w necie gówniany program i uparłeś się go zastosować.
]

ktokolwiek miał ,ma do czynienia z arduino stwierdza że każdy inny pomysł niż jego to g......
no niech tak będzie a mnie interesuje tylko jak wyświetlić zmienną float na ft800 w formacie 000,00
i nie mam najmniejszego powodu ani ochoty polemizować z ''guru'' programistami.


tristar0
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 51
Posty: 319
Rejestracja: 21 sty 2020, 17:48
Lokalizacja: Toruń

Re: DRO dla ubogich poraz wtóry.

#20

Post napisał: tristar0 » 02 gru 2020, 17:46

Obrazek ]W końcu miałem trochę czasu na zrobienie własnego dro , brak czasu chęci i doświadczenia ale trochę to nadrobiłem .Całość na arduino mega ( obsługa 3 enkoderów ) dodatkowo zerowanie i dzielenie wartości .wybrałem na wyświetlacz ft 800 duży i czytelny.

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „WARSZTAT”