Krokový motor
Úvodní stránka › Fórum › Vaše projekty › Arduino › Krokový motor
- Toto téma obsahuje celkem 7 odpovědí. Do diskuze (2 diskutující) se naposledy zapojil uživatel posjirka a poslední změna proběhla před 7 roky a 8 měsíci.
-
AutorPříspěvky
-
30.1.2017 v 19:03 #10278romansisÚčastník
Zdravím, našel by se někdo, kdo by mi pomohl s mým projektem?
Mám program, který pohybuje krokovým motorkem tam a zpátky určitou rychlostí.
A já bych potřeboval, aby po dobu stlačení tlačítka se krokový motor točil
jinou rychlostí. Byl by někdo ochoten s tím poradit? Děkuji Šiška.1.2.2017 v 15:21 #10331posjirkaÚčastníkbez kodu ti asi nikdo neporadi. predpokladam ze tam mas nejakou promennou ktera urcuje delku mezery mezi kroky. co tak podminka jestli je stsknute tlacitko tak nasv promennou na x jinak nastav na y?
1.2.2017 v 17:32 #10339romansisÚčastníkTady je ten kód.
// Krokový motor a driver
// čísla pinů pro digitální výstupy
const int in1 = 8;
const int in2 = 9;
const int in3 = 10;
const int in4 = 11;// proměnná pro nastavení rychlosti,
// se zvětšujícím se číslem se rychlost zmenšuje
int rychlost =1;
//
int uhel = 90;void setup() {
// inicializace digitálních výstupů
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}void loop() {
// plná rotace o 360 stupňů = 512 volání
// funkce rotacePoSmeru() či rotaceProtiSmeru()
for(int i=0;i<(uhel*64/45);i++){
rotacePoSmeru();
}
// pauza po dobu 1 vteřiny
delay(1000);for(int i=0;i<(uhel*64/45);i++){
rotaceProtiSmeru();
}
// pauza po dobu 1 vteřiny
delay(1000);
}
// zde následují funkce pro volání jednotlivých
// kroků pro otočení po či proti směru hodinových
// ručiček
void rotacePoSmeru() {
krok1();
krok2();
krok3();
krok4();
krok5();
krok6();
krok7();
krok8();
}
void rotaceProtiSmeru() {
krok8();
krok7();
krok6();
krok5();
krok4();
krok3();
krok2();
krok1();
}
// každý krok obsahuje výrobcem dané pořadí
// pro správné spínání motoru a následnou
// pauzu, kterou určujeme rychlost otáčení
void krok1(){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
delay(rychlost);
}
void krok2(){
digitalWrite(in1, HIGH);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
delay(rychlost);
}
void krok3(){
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
delay(rychlost);
}
void krok4(){
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(rychlost);
}
void krok5(){
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(rychlost);
}
void krok6(){
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, HIGH);
delay(rychlost);
}
void krok7(){
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(rychlost);
}
void krok8(){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(rychlost);
}1.2.2017 v 21:08 #10350posjirkaÚčastníkprosím používejte párové značky CODE, jinak je kod špatně formátovaný a zároveń není použitelný.
zkus tento upravený kod:// Krokový motor a driver #define tlacitko 2 // cislo pinu s talcitkem #define rychlost1 1 // prvni -standratni rychlost #define rychlost2 2 // rychlost pri stisku tlacitka // čísla pinů pro digitální výstupy const int in1 = 8; const int in2 = 9; const int in3 = 10; const int in4 = 11; // proměnná pro nastavení rychlosti, // se zvětšujícím se číslem se rychlost zmenšuje int rychlost =1; // int uhel = 90; void setup() { // inicializace digitálních výstupů pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(tlacitko, INPUT); } void loop() { if(digitalRead(tlacitko) == 0){ // kdyz je stisknuto tlacitko rychlost = rychlost2; // sniz rychlost } else { // jinak rychlost = rychlost1; // pouzij normalni rychlost } // plná rotace o 360 stupňů = 512 volání // funkce rotacePoSmeru() či rotaceProtiSmeru() for(int i=0;i<(uhel*64/45);i++){ rotacePoSmeru(); } // pauza po dobu 1 vteřiny delay(1000); for(int i=0;i<(uhel*64/45);i++){ rotaceProtiSmeru(); } // pauza po dobu 1 vteřiny delay(1000); } // zde následují funkce pro volání jednotlivých // kroků pro otočení po či proti směru hodinových // ručiček void rotacePoSmeru() { krok1(); krok2(); krok3(); krok4(); krok5(); krok6(); krok7(); krok8(); } void rotaceProtiSmeru() { krok8(); krok7(); krok6(); krok5(); krok4(); krok3(); krok2(); krok1(); } // každý krok obsahuje výrobcem dané pořadí // pro správné spínání motoru a následnou // pauzu, kterou určujeme rychlost otáčení void krok1(){ digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(rychlost); } void krok2(){ digitalWrite(in1, HIGH); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(rychlost); } void krok3(){ digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(rychlost); } void krok4(){ digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); delay(rychlost); } void krok5(){ digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); delay(rychlost); } void krok6(){ digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, HIGH); delay(rychlost); } void krok7(){ digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); delay(rychlost); } void krok8(){ digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); delay(rychlost); }
2.2.2017 v 18:12 #10356romansisÚčastníkzdravím, když nechám zkontrolovat tento kód tak sketch hlásí chybu.
for(int i=0;i<(uhel*64/45);i++){2.2.2017 v 18:30 #10357posjirkaÚčastníkto bohužel není muj boj. Tuto část jsem převzal z tveho kodu.
NAUČTE SE POUŽÍVAT PÁROVÉ ZNAČKY „CODE“2.2.2017 v 19:51 #10359romansisÚčastníkPárové značky opraveny. SUPER, změna rychlosti funguje, ale projeví se až po projetí cyklu tam a zpět. Já bych potřeboval aby reakce na tlačítko byla okamžitá. Zatím díky moc.
2.2.2017 v 21:42 #10363posjirkaÚčastníkvšechno jde. Jen když se dívám na to řešení je docela „not friendly“ pro tuto funkci.
Kdyby spoužil celý krok pro otáčení a né půl kroky mohls to vše dělat ve smyčce Loop, jen posunem bitu a reagovalo by ti to kdy budeš potřebovat. Takto musíš použít před definicí proměnné příkaz „volatile“ ( https://www.arduino.cc/en/Reference/Volatile ) aby ti reagoval i v případě přerušení hlavní smyčky a nastavit přerušení na pin tlačítka ( https://www.arduino.cc/en/Reference/AttachInterrupt ). Toto přerušení přeruší hlavní program a vykoná funkci, na kterou se v definici přerušení odkazuješ. Až skončí tato funkce, smyčka hlavního programu se opět rozjede tam, kde skončila a v klidu pokračuje. Jen musíš hlídat aby se ti nezacyklila. To nastane, kdy funkce volaná přerušení trvá déle než interval mezi přerušeními. Můžeš dokonce ragovat zvlášť na na změnu stavu, na přechod na log. 0 a na přechod na log.1. -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.