regulátor otáček ( kroků ) krokového motoru
aha, takže tyč je na pevno a otáčí se matka chápu to správně?
Ano, prosímRKal píše:aha, takže tyč je na pevno a otáčí se matka chápu to správně?
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
-
- Příspěvky: 379
- Registrován: 27. 12. 2011, 9:24
- Kontaktovat uživatele:
V sobotu 17. října (tedy asi za 6 týdnů) pořádáme na MFF-UK další Malostranské Robodoupě, tentokrát zaměřené na řízení krokových motorů pomocí mikrokontrolérů a PC. Program není ještě přesně určen, ale s vysokou pravděpodobností se bude probírat knihovna AccelStepper pro Arduino, Arduino s programem GRBL, implementace Linuxu CNC do Beaglebone Black a bude se povídat i o Linuxu CNC v PC. Nebude pochopitelně chybět ani ukázka řízení krokového motoru mým oblíbeným PICAXE.elbarto píše:Kdyby nekdo ... kdo dobre vi, ktera bije planoval najakou prednasku/predvadecku na tema pohony/drivery/rizeni atd. prihlasi se myslim dost lidi. Za sebe bych rovnou rekl ANO. Posledni dobou na tema dost dikutujeme a zjistujeme, ze v tom pekne litame. Kutilove maji rozestaveme stavby ci prestaby a ted tapou v tematu pohonu a rizeni.
K vidění budou také funkční vzorky stolních strojů a v kuloárech bude možno probrat i ledacos jiného.
Pokud má někdo co říct k danému tématu, budeme rádi, když se s námi o své znalosti podělí veřejně. K dispozici je datový projektor, takže během přednášek budou i obrázky
Upozorňuji ale, že - protože se jedná jen o jedno sobotní odpoledne - jednotlivé přednášky o délce cca 20 minut budou mít více méně informativní charakter a jejich účelem je, mimo jiné, zkontaktovat lidi se zájmem o podobnou problematiku. Následně můžeme udělat další setkání v méně honosných prostorách a diskutovat o jednotlivých tématech až do bezvědomí...
Přesnou skladbu programu setkání, případně organizační změny můžete průběžně sledovat na Robodoupěti.
jrt
hobbyrobot.cz, jederobot.cz
robodoupe.cz, forum.robodoupe.cz
hobbyrobot.cz, jederobot.cz
robodoupe.cz, forum.robodoupe.cz
-
- Příspěvky: 379
- Registrován: 27. 12. 2011, 9:24
- Kontaktovat uživatele:
Aliexpress.com. Motor s osazenou převodovkou je většinou mnohem levnější, než samotná převodovka. A taky je dobré si při vyhledávání zaškrtnout "free shipping"... kde se dají koupit planetové převodovky na krokáče na NEMA 17
jrt
hobbyrobot.cz, jederobot.cz
robodoupe.cz, forum.robodoupe.cz
hobbyrobot.cz, jederobot.cz
robodoupe.cz, forum.robodoupe.cz
Bylo by dobré se před koupí zamyslet, co si od toho slibuješ, jestli to tím dosáhneš a jestli to tedy skutečně potřebuješ. Řekl bych, že ve většině případů se dá daný problém řešit jinak, elegantnějí a nakonec i levněji.Pidrman píše:Zeptám se, kde se dají koupit planetové převodovky na krokáče na NEMA 17.
Mam prosbu, je tu někdo kdo umí arduino. Potřeboval bych s tím poradit.
Veškeré komponenty již mam doma, program nahraný na arduino, ale nějak mi to nefunguje jak má. Po nějaké době spuštění a navolení rychlosti otáčení se to pokaždé kousne ( ca 1 minuta )
A příznám se, že si s tím nevím rady
Honza
Veškeré komponenty již mam doma, program nahraný na arduino, ale nějak mi to nefunguje jak má. Po nějaké době spuštění a navolení rychlosti otáčení se to pokaždé kousne ( ca 1 minuta )
A příznám se, že si s tím nevím rady
Honza
- jova
- Příspěvky: 2511
- Registrován: 2. 11. 2007, 1:40
- Bydliště: Chýnov to je kousek od Tábora
- Kontaktovat uživatele:
Možná ti poradí tady: http://forum.robodoupe.cz/viewforum.php ... bfc0b59350
tak sem dej program kouknem na toPidrman píše:Mam prosbu, je tu někdo kdo umí arduino. Potřeboval bych s tím poradit.
Veškeré komponenty již mam doma, program nahraný na arduino, ale nějak mi to nefunguje jak má. Po nějaké době spuštění a navolení rychlosti otáčení se to pokaždé kousne ( ca 1 minuta )
A příznám se, že si s tím nevím rady
Honza
Díky za rady, snad někdo poradí.
Co se týče programu, tak tady je..... jen jsem upravil podle rad typ hodnoty u tick_count, změnil jsem původní hodnotu int tick_count; na unsigned long tick_count; :
#include <LiquidCrystal.h>
#include <TimerOne.h>
// buttons code
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
// directions
#define FORWARD HIGH
#define BACKWARD LOW
// debounce time (milliseconds)
#define DEBOUNCE_TIME 200
// PINs for Pololu controller
#define PIN_STEP 2
#define PIN_DIR 3
// lookup table speed - ticks (interrupts)
const int speed_ticks[] = {-1, 600, 300, 200, 150, 120, 100, 86, 75, 67, 60, 55, 50, 46, 43};
// global variables
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int actual_speed;
int actual_direction;
int ticks;
unsigned long tick_count;
int button;
boolean debounce;
int previous_time;
// custom LCD square symbol for progress bar
byte square_symbol[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
// string constants
char forward_arrow[] = "-->";
char backward_arrow[] = "<--";
void setup() {
// init the timer1, interrupt every 0.1ms
Timer1.initialize(100);
Timer1.attachInterrupt(timerIsr);
// init LCD and custom symbol
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.createChar(0, square_symbol);
// pins direction
pinMode(PIN_STEP, OUTPUT);
pinMode(PIN_DIR, OUTPUT);
// initial values
actual_speed = 0;
actual_direction = FORWARD;
tick_count = 0;
ticks = -1;
debounce = false;
digitalWrite(PIN_DIR, actual_direction);
updateLCD();
}
void loop() {
// check if debounce active
if(debounce) {
button = btnNONE;
if(millis() > previous_time + DEBOUNCE_TIME) debounce = false;
} else button = read_buttons();
// if a button is pressed, start debounce time
if(button != btnNONE) {
previous_time = millis();
debounce = true;
}
// check which button was pressed
switch(button) {
case btnUP:
increase_speed();
break;
case btnDOWN:
decrease_speed();
break;
case btnLEFT:
change_direction(BACKWARD);
break;
case btnRIGHT:
change_direction(FORWARD);
break;
case btnSELECT:
emergency_stop();
break;
}
// finally update the LCD
updateLCD();
}
// increase speed if it's below the max (70)
void increase_speed() {
if(actual_speed < 70) {
actual_speed += 1;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
}
// decrease speed if it's above the min (0)
void decrease_speed() {
if(actual_speed > 0) {
actual_speed -= 1;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
}
// change direction if needed
void change_direction(int new_direction) {
if(actual_direction != new_direction) {
actual_direction = new_direction;
digitalWrite(PIN_DIR, actual_direction);
}
}
// emergency stop: speed 0
void emergency_stop() {
actual_speed = 0;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
// update LCD
void updateLCD() {
// print first line:
// Speed: xxxRPM -> (or <-)
lcd.setCursor(0,0);
lcd.print("SPEED: ");
lcd.print(actual_speed);
lcd.print("RPM ");
lcd.setCursor(13,0);
if(actual_direction == FORWARD) lcd.print(forward_arrow);
else lcd.print(backward_arrow);
// print second line:
// progress bar [##### ]
// 15 speed steps: 0 - 5 - 10 - ... - 70
lcd.setCursor(0,1);
lcd.print("[");
for(int i = 1; i <= 14; i++) {
if(actual_speed > (5 * i) - 1) lcd.write(byte(0));
else lcd.print(" ");
}
lcd.print("]");
}
// timer1 interrupt function
void timerIsr() {
if(actual_speed == 0) return;
tick_count++;
if(tick_count == ticks) {
// make a step
digitalWrite(PIN_STEP, HIGH);
digitalWrite(PIN_STEP, LOW);
tick_count = 0;
}
}
// read buttons connected to a single analog pin
int read_buttons() {
int adc_key_in = analogRead(0);
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
}
Co se týče programu, tak tady je..... jen jsem upravil podle rad typ hodnoty u tick_count, změnil jsem původní hodnotu int tick_count; na unsigned long tick_count; :
#include <LiquidCrystal.h>
#include <TimerOne.h>
// buttons code
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
// directions
#define FORWARD HIGH
#define BACKWARD LOW
// debounce time (milliseconds)
#define DEBOUNCE_TIME 200
// PINs for Pololu controller
#define PIN_STEP 2
#define PIN_DIR 3
// lookup table speed - ticks (interrupts)
const int speed_ticks[] = {-1, 600, 300, 200, 150, 120, 100, 86, 75, 67, 60, 55, 50, 46, 43};
// global variables
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int actual_speed;
int actual_direction;
int ticks;
unsigned long tick_count;
int button;
boolean debounce;
int previous_time;
// custom LCD square symbol for progress bar
byte square_symbol[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
// string constants
char forward_arrow[] = "-->";
char backward_arrow[] = "<--";
void setup() {
// init the timer1, interrupt every 0.1ms
Timer1.initialize(100);
Timer1.attachInterrupt(timerIsr);
// init LCD and custom symbol
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.createChar(0, square_symbol);
// pins direction
pinMode(PIN_STEP, OUTPUT);
pinMode(PIN_DIR, OUTPUT);
// initial values
actual_speed = 0;
actual_direction = FORWARD;
tick_count = 0;
ticks = -1;
debounce = false;
digitalWrite(PIN_DIR, actual_direction);
updateLCD();
}
void loop() {
// check if debounce active
if(debounce) {
button = btnNONE;
if(millis() > previous_time + DEBOUNCE_TIME) debounce = false;
} else button = read_buttons();
// if a button is pressed, start debounce time
if(button != btnNONE) {
previous_time = millis();
debounce = true;
}
// check which button was pressed
switch(button) {
case btnUP:
increase_speed();
break;
case btnDOWN:
decrease_speed();
break;
case btnLEFT:
change_direction(BACKWARD);
break;
case btnRIGHT:
change_direction(FORWARD);
break;
case btnSELECT:
emergency_stop();
break;
}
// finally update the LCD
updateLCD();
}
// increase speed if it's below the max (70)
void increase_speed() {
if(actual_speed < 70) {
actual_speed += 1;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
}
// decrease speed if it's above the min (0)
void decrease_speed() {
if(actual_speed > 0) {
actual_speed -= 1;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
}
// change direction if needed
void change_direction(int new_direction) {
if(actual_direction != new_direction) {
actual_direction = new_direction;
digitalWrite(PIN_DIR, actual_direction);
}
}
// emergency stop: speed 0
void emergency_stop() {
actual_speed = 0;
tick_count = 0;
ticks = speed_ticks[actual_speed / 5];
}
// update LCD
void updateLCD() {
// print first line:
// Speed: xxxRPM -> (or <-)
lcd.setCursor(0,0);
lcd.print("SPEED: ");
lcd.print(actual_speed);
lcd.print("RPM ");
lcd.setCursor(13,0);
if(actual_direction == FORWARD) lcd.print(forward_arrow);
else lcd.print(backward_arrow);
// print second line:
// progress bar [##### ]
// 15 speed steps: 0 - 5 - 10 - ... - 70
lcd.setCursor(0,1);
lcd.print("[");
for(int i = 1; i <= 14; i++) {
if(actual_speed > (5 * i) - 1) lcd.write(byte(0));
else lcd.print(" ");
}
lcd.print("]");
}
// timer1 interrupt function
void timerIsr() {
if(actual_speed == 0) return;
tick_count++;
if(tick_count == ticks) {
// make a step
digitalWrite(PIN_STEP, HIGH);
digitalWrite(PIN_STEP, LOW);
tick_count = 0;
}
}
// read buttons connected to a single analog pin
int read_buttons() {
int adc_key_in = analogRead(0);
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
}
Tady je original program
https://github.com/lucadentella/A4988-a ... Dir.ino#L1" onclick="window.open(this.href);return false;
https://github.com/lucadentella/A4988-a ... Dir.ino#L1" onclick="window.open(this.href);return false;
Nešlo jen o lepší čitelnost, CODE tag má i omezenou výšku a člověk tak nemusí skrolovat přes tři obrazovky, aby se doskroloval k dalšímu postu (zkus to, ještě to možná stihneš, možnost editace odeslaného postu je časově omezená).
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino