Ketvirtadienis, gruodžio 14, 2017
Lithuanian English Russian

XY-4140 pasiruošimai arba žingsninių motoriukų valdymas džoistiku

Pagaliau šiek tiek toliau pajudinau savo bandymus su XY-4140 ploteriu. Tiksliau pasidariau šiokią tokią žingsninių varikliukų bandymo sistemą. Tam prireikė Arduino UNO, analoginio džoistiko (nuo kažkokio žaidimų valdiklio, pirkto už gal 2$) ir ankščiau surinktos žingsninių variklių valdymo plokštės.

Džoistiką primontuojame prie maketinės plokštės, potenciometrus jungiame galiniais išvadais lygiagrečiai, jungsime tarp GND ir +5 V, išėjimo įtampą nuimame nuo vidurinio potenciometrų išvado. Dar čia yra mygtukas ateičiai.

Gavosi kažkas tokio:

 DSC 6700 1

Visas "setup'as" atrodo taip:

D20 2049 1

Toliau programa, kitaip vadinant Arduino skečas.

Visų pirma - norėjau pasidaryti ateičiai tinkamą daiktą, pvz mechaninės CNC sistemos testavimui. Dėl to iš karto galvojau apie džoistiko panaudojimą ar ten kalbainių vadinamą linksmalazdę.  Tai yra džoistikui esant normalioje padėtyje niekas nevyksta. Judinant svirtelę viena ašim - įsijungia vienas žingsninis varikliukas ir sukasi atitinkamai į vieną ar kitą pusę (atsiranda valdymo impulsai draiverių plokštei), judinant kita ašimi - įsijungia kitas žingsninis varikliukas. Judinant svirtelę įstrižai - įsijungia abu varikliukai. Kuo daugiau palenkta sivrtelė - tuo greičiau. Programoje galima nustatyti minimalų bei maksimalų sukimosi greičius. Taip pat padariau šiokią tokią "0" toleranciją, jei analoginiuose įėjimuose yra labai nežymus svyravimas - niekas nevyksta. Tolerancija pasirinkau 10 vienetų (visas įėjimo reikšmių diapazonas nuo 0 iki 1023). Bet vistiek pasijungus varikliukus pastebėjau retkarčiais pasitaikančius pavienius "žingsniukus" ne į temą. Per serijinį portą pamačiau gana žymius analoginių įėjimų svyravimus, t.y. pralenda triukšmai iš varikliukų į analognius įėjimus. Kondensatoriai ant Arduino įėjimų ir laidų "sutvarkymas"  greičiausiai padėtų šioje vietoje. Programa parašyta taip kaip gavosi per porą prisėdimų, gali būti ir kokių klaidų, jei randate - rašykite komentaruose.

Dar vienas dalykas - greičio valdymo priklausomybė turėtų būti logaritmiška, t.y. kuo daugiau palenkiant svirtelę, tuo turėtų staigiau didėti greitis, bet tai jau palieku kitam kartui. Dabar pakanka ir taip kaip yra.

Programoje, pagrindinai derinimui, yra galimybė įsijungti duomenų stebėjimą per Serial Monitor (115200 bps), tam reikia nusiimti komentarų ženklus trijose vietose.

Už  pagrindą ėmiau Easy Driver Examples ir dar kelis pavyzdžius.

Taigi pati programa:

     


//Stepers control by joystick. http://megejas.lt
#include <AccelStepper.h> //This library from http://www.airspayce.com/mikem/arduino/AccelStepper/

// Define the steppers and the pins it will use
AccelStepper stepper1(1, 9, 8);
AccelStepper stepper2(1, 11, 10);


#define BLINK_PIN 13
// Define our analog joystick input pins
#define SPEED_PIN1 0
#define SPEED_PIN2 1

// Define our maximum and minimum speed in steps per second
#define MAX_SPEED 1000
#define MIN_SPEED 0.1
static float analog_0_1;
static float analog_0_2;
void setup() {
// The only AccelStepper value we have to set here is the max speeed, which is higher than we'll ever go
stepper1.setMaxSpeed(10000.0);
stepper2.setMaxSpeed(10000.0);

// initialize serial IF NEED:
 // Serial.begin(115200);   //Remowe comments in front for serial

analog_0_1 = analogRead(SPEED_PIN1);
analog_0_2 = analogRead(SPEED_PIN2);
pinMode(BLINK_PIN, OUTPUT);
if (analog_0_1 >600 || analog_0_1<400 || analog_0_2 >600 || analog_0_2<400) blink(); //Testing joystick - in zero range?

}

void blink() { //Joystick out of range
digitalWrite(BLINK_PIN, HIGH); // turn the LED on
delay(200); // wait
digitalWrite(BLINK_PIN, LOW); // turn the LED off by making the voltage LOW
delay(200); // wait
blink();
}

void loop() {
static float current_speed1 = 0.0; // Holds current motor speed in steps/second
static float current_speed2 = 0.0;
static int analog_read_counter = 1000; // Counts down to 0 to fire analog read
static float analog_value_1 = analog_0_1; // Holds raw analog value chanel 1.
static float analog_value_2 = analog_0_2; // Holds raw analog value chanel 2.
static int print = 10; // Print countdown

// We only want to read the joystick every time in main loop (because it takes a long time we don't
if (analog_read_counter > 0) {
analog_read_counter--;
}
else {
analog_read_counter = 3000;
// Now read the pot (from 0 to 1023)
analog_value_1 = analogRead(SPEED_PIN1);
if ((analog_value_1> analog_0_1 && analog_value_1-analog_0_1 <10) ||(analog_value_1<analog_0_1 && analog_0_1 - analog_value_1 <10)) {
analog_value_1 = analog_0_1;
}
// Give the stepper a chance to step if it needs to
stepper1.runSpeed();
current_speed1 = (((analog_value_1-analog_0_1)/analog_0_1)* (MAX_SPEED - MIN_SPEED));
// Update the stepper to run at this new speed
stepper1.setSpeed(current_speed1);
stepper1.runSpeed();

 /*     //Remowe comments in front for serial 
if (print>0) {
print --;
}
else {

Serial.print("analog_val.:");
Serial.print(analog_value_1);
Serial.print(" ");
Serial.print(analog_value_2);
Serial.print(" analog_0:");
Serial.print(analog_0_1);
Serial.print(" ");
Serial.print(analog_0_2);
Serial.print(" analog_value-analog_0:");
Serial.print(analog_value_1-analog_0_1);
Serial.print(" ");
// Serial.print(((analog_value_1-analog_0_1)/analog_0_1));
Serial.print(" current_speed:");
Serial.print(current_speed1);
Serial.print(" ");
Serial.println(current_speed2);
print=5;
}

 */     //Remowe comments in front for serial

analog_value_2 = analogRead(SPEED_PIN2);
if ((analog_value_2> analog_0_2 && analog_value_2-analog_0_2 <10) ||(analog_value_2<analog_0_2 && analog_0_2 - analog_value_2 <10)) {
analog_value_2 = analog_0_2;
}
// Give the stepper a chance to step if it needs to
stepper2.runSpeed();
current_speed2 = (((analog_value_2-analog_0_2)/analog_0_2)* (MAX_SPEED - MIN_SPEED));
// Update the stepper to run at this new speed
stepper2.setSpeed(current_speed2);
}

// This will run the stepper at a constant speed
stepper1.runSpeed();
stepper2.runSpeed();
}

Na ir video:

 

 

 

Čia matosi, tiksliau girdisi, kaip barška dantračiai sukantis vienam varikliukui mažu greičiu, tai visiškai normalu. Jei būtų bent šioks toks dantračių įtempimas, apkrova, barškėjimo praktiškai nebeliktų.

Pasikeikus dirbant su idiotiška programa window$ movie maker (turimame kompe nieko geriau kol kas nebuvo) padariau antrą filmuką.

Testas su XY-4140 motoriukais arba kam išvis tai buvo reikalinga:

 

Beje, kai yra įjungtas duomenų siuntimas per serijinį portą ir greičiui esant didesniam, nei panašiai 500 impulsų, atsiranda motoriukų trukčiojimai, dėl kurių gali jie net sustoti. Čia viskas dėl to, kad duomenų siuntimas "suvalgo" nemažai procesoriaus taktų, kurių metu nebevykdoma pagrindinė programa su impulsų siuntimu. Taigi jei duomenys terminale nėra reikalingi - geriau siuntimą išjungti.

 

 

Komentuoti


Rss