Waarden verschalen , kan wel wat hulp gebruiken

Arduino specifieke Software
Berichten: 22
Geregistreerd: 13 Aug 2018, 17:59
Woonplaats: Krimpen

Waarden verschalen , kan wel wat hulp gebruiken

Berichtdoor swets » 26 Mei 2022, 13:43

Ik heb op min CNC machine zo'n Ebay 15watt led laser gebouwd.
Deze laser kan je PWM aan sturen...

Misschien , ik weet niet of het mag? maar kan je eerst even dit bekijken: https://www.arjan-swets.com/hardware/cn ... intro.html

De meeste mensen sturen zo laser alleen aan/uit, maar ik wilde ook met het via PWM spelen.

Dus ik heb in een Arduino Due het eerste onderstaande verhaal staan.

Met de input "Mode"kan ik kiezen tussen Aan/Uit mode of de PWM mode.
op de Aan/Uit mode, komt er een 2de input binnen op de Arduino, van uit de CNC besturing, welke hoog word als de Laser aan moet.
De Arduino stuurt dan PWM255 naar de Laser, en als de input laag word, stuurt hij PWM 0 naar de laser...

In de PWM mode, kijk de arduino naar 2 inputs. een step en een Dir input.
De arduino gedraagt zich zeg maar als een stepperdriver. en gebruikt die 2 inputjes om de PWM waarden naar de laser op of af te tellen, en kan ik dus vanuit me cnc besturing de sterkte van de laser regelen.

ik maak een toolpad, waar ik wit = 0 mm diep, en waar zwart 0,00255 mm diep is, de Cam software verdeelt de grijstinten van een bitmap in 255 stapjes...
als ik dit toolpad niet naar de z-as (op/Neer) stuur, maar naar de Arduino stuur kan ik dus een foto branden in hout.

Dit hele verhaal werkt!! want je ook op de bovenstaande link kan zien.

Er is alleen een Probleem... het branden van een Laser in hout is natuurlijk niet erg lineair.. dus Als ik de laser PWM 1 stuurt, brand hij natuurlijk nog geen licht grijs lijntje....
Dus later kwam ik er achter dat de laser (afhankelijk van het materiaal natuurlijk) pas wat begint te doen bij PWM 64... en dat als je eenmaal over een bepaalde waarden ga, je ook geen verschil meer zie, laat ik hier even zeggen 128, maar nogmaals dat is heel erg afhankelijk waar je op brand).

Dit heb ik eerst geprobeerd op andere plekken goed te krijgen.... In de cam software, maar dat was moeilijk... ik heb ook met Photoshop geprobeerd een bitmap omt te zetten naar 255 grijstinten, maar dan dat zwart geen 0 is, maar 64 ofzo...
Heb ook heel veel rond gevraagd en gezocht... eigenlijk niets makkelijks kunnen vinden....

En opeens dacht ik, waarom doe ik het niet in de arduino...

Dus het verhaal is eigenlijk, de CNC software stuurt nog steeds dmv de step/dir puls 0 tot 255 naar de arduino,
maar in plaats dat ik deze waarde 1 op 1 door stuur naar de PWM moet ik hem verschalen....

Dus ik zat te denken, om dmv 2 potmeters een Min en een max output in te stellen...
Dat 2de programma (de nog in testfase versie) staat er als 2de...

Ook dit werkt... (althans in de simulator)

https://youtu.be/CL5FIKclxGo

Alleen, ik wil dit hele verhaal zo snel mogelijk hebben... Ik wil niet dat ik stappen ga missen met de CNC machine?

Ik heb begrepen dat dat rekenen met Float getallen heel erg traag kan zijn?
maar blijft het pulsen op de interrupts dan nog wel gewoon goed gaan?

wat die teller mag eigenlijk niet gek doen....

Dus? wie kan er meer vertellen? helpen, mee denken enz enz....

Alvast bedankt!!!!


cpp code
int  PWM_Out  =  64 ; 
int CounterValue = 1 ;
int StepPin = 7 ;
int DirPin = 8 ;
int Mode = 3 ;
int OnOff = 2 ;
int Laser = 9 ;

void setup ( )
{
pinMode ( DirPin , INPUT_PULLUP ) ;
pinMode ( StepPin , INPUT_PULLUP ) ;
pinMode ( Mode , INPUT_PULLUP ) ;
pinMode ( OnOff , INPUT_PULLUP ) ;

analogWriteResolution ( 8 ) ;
pinMode ( Laser , OUTPUT ) ;

attachInterrupt ( digitalPinToInterrupt ( StepPin ) , Count , RISING ) ;
attachInterrupt ( digitalPinToInterrupt ( DirPin ) , ChangeDir , CHANGE ) ;


void loop ( ) {
if ( digitalRead ( Mode ) == HIGH )
{
if ( digitalRead ( OnOff ) == HIGH )
{
PWM_Out = 254 ;
}
else
{
PWM_Out = 0 ;
}
}
analogWrite ( Laser , PWM_Out ) ;


void Count ( )
{
PWM_Out = PWM_Out + CounterValue ;
if ( PWM_Out > 254 )
{
PWM_Out = 254 ;
}
if ( PWM_Out < 0 )
{
PWM_Out = 0 ;
}
}

void ChangeDir ( )
{
CounterValue = 1 ;
if ( digitalRead ( DirPin ) )
{
CounterValue = -1 ; _ } }




cpp code
int PWM_Out = 64;
int tmpPWM_Out;
int CounterValue = 1;

int InHigh = 255;
int InLow = 0;

int OutputHigh = 128;
int OutputLow = 64;

int tmp1;
int tmp2;
float tmp3;
int tmp4;
float tmp5;

// in - outputs
int StepPin = 7;
int DirPin = 8;
int Mode = 3;
int OnOff = 2;
int ScaleOn = 5;
int Laser = 9;

void setup()
{
pinMode(DirPin, INPUT_PULLUP);
pinMode(StepPin, INPUT_PULLUP);
pinMode(Mode, INPUT_PULLUP);
pinMode(OnOff, INPUT_PULLUP);

pinMode(ScaleOn, INPUT_PULLUP);

analogWriteResolution(8);
pinMode(Laser, OUTPUT);

// interrupts on de Step an Dir inputs
// try to make it as fast as posible, because we don't want to miss steps
// maybe the Dir input on a normal input is Better?

attachInterrupt(digitalPinToInterrupt(StepPin), Count, RISING);
attachInterrupt(digitalPinToInterrupt(DirPin), ChangeDir, CHANGE);
}

void loop() {
if (digitalRead(Mode) == HIGH) // on/off mode on

// if the On/Off mode is active, we are not sending step and Dir pulses
// so Count and ChangeDir are never called
{
if (digitalRead(OnOff) == HIGH) // on off input
{
PWM_Out = 254;
}
else
{
PWM_Out = 0;
}
}

if (digitalRead(ScaleOn) == HIGH) // Scale fubction on
{

// RealActualValue:=( ( ( OutputHigh - OutputLow ) / ( InHigh - InLow ) ) * (r_Raw-InLow)) + OutputLow;

tmp1 = OutputHigh - OutputLow; // = 128 - 64
tmp2 = InHigh - InLow; // = 255-0
tmp3 = (float) tmp1 / (float) tmp2;
tmp4 = PWM_Out - InLow;

tmp5 = tmp3 * (float)tmp4;

tmpPWM_Out = (int)tmp5 + OutputLow;

}
else // Scale fubction off
{
tmpPWM_Out = PWM_Out;
}

analogWrite(Laser, tmpPWM_Out); // real output to laser
}

void Count()
{
PWM_Out = PWM_Out + CounterValue; // step pulse input on the rising edges Interrupt
if (PWM_Out > 254)
{
PWM_Out = 254;
}
if (PWM_Out < 0)
{
PWM_Out = 0;
}
}

void ChangeDir()
{
CounterValue = 1; // Dir input
if (digitalRead(DirPin))
{
CounterValue = -1;
}
}

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Waarden verschalen , kan wel wat hulp gebruiken

Berichtdoor shooter » 27 Mei 2022, 08:17

ja dat kan heel makkelijk met map, daar kun je een integer direct veranderen in een andere dus het is een regel, maar mach3 kent dit zelf ook wel,dat heeft te maken met hoe snel je een stap zet, en hoelang de laser aanstaat en dat lijkt dan pwm maar dat is eigenlijk de snelheid van stappen en dus gewoon aan/uit.
paul deelen
shooter@home.nl

Berichten: 22
Geregistreerd: 13 Aug 2018, 17:59
Woonplaats: Krimpen

Re: Waarden verschalen , kan wel wat hulp gebruiken

Berichtdoor swets » 27 Mei 2022, 08:39

shooter schreef:ja dat kan heel makkelijk met map, daar kun je een integer direct veranderen in een andere dus het is een regel, maar mach3 kent dit zelf ook wel,dat heeft te maken met hoe snel je een stap zet, en hoelang de laser aanstaat en dat lijkt dan pwm maar dat is eigenlijk de snelheid van stappen en dus gewoon aan/uit.


Hoi,...
ja dat had ik ondertussen ook uitgevonden.....
Ik had nog eens zitten google-en... want opeens dacht ik... dat meer mensen een (bijvoorbeeld analoge) waarden wilen schalen....
en toen vond ik het....

mijn verhaaltje werkte trouwens wel gewoon....
maar ik heb nu het onderstaande, en dat werkt goed in de simulator....

zal eens kijken of ik het vandaag in de echte Arduino kanzetten op de CNC machine, en eens te kijken hoe hij het doet.....

ik hoop dat hij het gewoon nog bij kan houden....


cpp code
int PWM_Out = 64;
int tmpPWM_Out;
int Direction = 1;

int InHigh = 255;
int InLow = 0;

int OutputHigh;
int OutputLow;

// in - outputs
int StepPin = 7;
int DirPin = 8;
int Mode = 3;
int OnOff = 2;
int ScaleOn = 5;
int AnalogLow = A0; // potentiometer wiper (middle terminal) connected to analog pin 3
int AnalogHigh = A1; // potentiometer wiper (middle terminal) connected to analog pin 3
int Laser = 9;

void setup()
{
pinMode(DirPin, INPUT_PULLUP);
pinMode(StepPin, INPUT_PULLUP);
pinMode(Mode, INPUT_PULLUP);
pinMode(OnOff, INPUT_PULLUP);

pinMode(ScaleOn, INPUT_PULLUP);

analogWriteResolution(8);
pinMode(Laser, OUTPUT);

// interrupts on de Step an Dir inputs
// try to make it as fast as posible, because we don't want to miss steps
// maybe the Dir input on a normal input is Better?
attachInterrupt(digitalPinToInterrupt(StepPin), Count, RISING);
attachInterrupt(digitalPinToInterrupt(DirPin), ChangeDir, CHANGE);

if (digitalRead(DirPin)) // Dir input
{
Direction = -1;
}

}

void loop() {
if (digitalRead(Mode) == HIGH) // on/off mode on

// if the On/Off mode is active, we are not sending step and Dir pulses
// so Count and ChangeDir are never called
{
if (digitalRead(OnOff) == HIGH) // on off input
{
PWM_Out = 255;
}
else
{
PWM_Out = 0;
}
}

if (digitalRead(ScaleOn) == HIGH) // Scale fubction on
{
OutputLow = analogRead(AnalogLow) / 4;
OutputHigh = analogRead(AnalogHigh) / 4;
tmpPWM_Out = map(PWM_Out, 0, 255, OutputLow, OutputHigh); // scale wanted value between 2 potmeter setpoints..
}
else // Scale fubction off
{
tmpPWM_Out = PWM_Out;
}

analogWrite(Laser, PWM_Out); // real output to laser
}

void Count()
{
PWM_Out = PWM_Out + Direction; // step pulse input on the rising edges Interrupt
if (PWM_Out > 255)
{
PWM_Out = 255;
}
if (PWM_Out < 0)
{
PWM_Out = 0;
}
}

void ChangeDir()
{
Direction = 1; // Dir input on a change interrupt
if (digitalRead(DirPin))
{
Direction = -1;
}
}

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Waarden verschalen , kan wel wat hulp gebruiken

Berichtdoor shooter » 28 Mei 2022, 20:16

de arduino is veel sneller als welke mechanisch ding ook hoor. maak je daar maar geen zorgen om.
paul deelen
shooter@home.nl

Berichten: 22
Geregistreerd: 13 Aug 2018, 17:59
Woonplaats: Krimpen

Re: Waarden verschalen , kan wel wat hulp gebruiken

Berichtdoor swets » 28 Mei 2022, 22:39

shooter schreef:de arduino is veel sneller als welke mechanisch ding ook hoor. maak je daar maar geen zorgen om.

nou mechanische ding....

ik geef wel 320 pulsen per mm.... en hij loopt op (nu geloof ik met dit waar het om gaat ) op 2500mm/min dus 42mm sec x 320 = 13440 pulsen/sec en ik kan tot 5500mm/min
en ik wil niet dat de Arduino pulzen gaat missen, want dan gaat het helemaal fout....

dus vandaar dat ik de pulsen al op een interupt gezet heb....

maar vandaag aan het testen geweest.... en het ging goed....

Afbeelding

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 19 gasten