Arduino a krokový motor potřetí

Stáhnout jako PDF autor: Johny, arduino, dne 20.11.2014


Můj kód z předchozího příkladu fungoval, nicméně nešel snadno použít pro víc motorů – což může být někdy docela nepříjemné. Důvodem samozřejmě byla existence pouze jedné proměnné s piny motoru i proměnná která udržuje aktuální „krok“ motoru.

Ačkoliv se v programování moc nevyznám, podařilo se mi celkem rychle pochopit jak se pro Arduino dělají knihovny a jednu takovou jsem si napsal. Knihovnu jsem pojmenoval Mmotor (zkratka z Můj Motor). Pak se z Arduina uplně snadno pomocí tří řádků dokáže motor libovolně rychle a v libovolném směru rozhýbat.

//Načte mojí knihovnu MMotor
#include <MMotor.h>

//Inicializace knihovny, nastaví piny na kterých je motor připojen
// a dále nastaví v pátém parametru výchozí rychlost motoru 
// motor si pojmenujeme prvni_motor k pozdějšímu zasílání příkazů
MMotor prvni_motor(8,9,10,11,1000);

void setup() {}


void loop() {

  prvni_motor.rychlost(800);
  prvni_motor.krokuj(100, true);
  delay(100);
  
  prvni_motor.krokuj(100, true);
  delay(100);
  
  prvni_motor.rychlost(2000);
  prvni_motor.krokuj(250, false);
  delay(100);
  
  prvni_motor.vypnout();
  delay(1000);
}

V příkladu je vidět, jak snadno lze motor inicializovat, někam posunout a nastavit rychlost. Kdo chce, může motor i vypnout – trochu to šetří elektřinu, co koukám.

Jednoduše to vypne el. do cívek. Jakmile se ale vydá příkaz k pohybu, motor se sám automaticky zapne a pokračuje tam, kde skončil. Asi by mohl vzniknout problém, kdyby se motor samovolně pootočil – ve vypnutém stavu. Pak by se mohl chytat „blbým“ krokem.

Knihovna MMotor

Aby tento příklad měl smysl, je asi třeba sem dát i knihovnu MMotor, kterou jsem vytvořil. Dovolím si to taky malinko okomentovat. Pokud budu spát bludy, opravte mě prosím – je to poprvé co jsem něco jako arduino knihovnu spáchal – a programování v C je pro mě docela nová věc. (asi tři dny nová :-)).

Každá knihovna se skládá ze dvou souborů. Jmenují se stejně, jeden mápříponu h a druhý cpp. V mém případě to jsou soubory MMotor.cpp a MMotor.h.

Soubor s příponou .h obsahuje definici funkcí a proměnných, řiká, která proměnná je privátní a která není. Z hlediska fungování je podle mého méně podstatný – neobsahuje žádný kód – dá se, v případě nouze – na základě CPP souboru snadno dodělat.

Obsah mého MMotor.h je:

#ifndef MMotor_h
#define MMotor_h

#include "Arduino.h"

class MMotor
{
  public:
    MMotor(int pin1, int pin2, int pin3, int pin4, int speed);
    void krokuj(int kroku, bool smer);
    void jeden_krok(int bkrok);
    void test();
    void rychlost(int r);

    void vypnout();

    int _pin1;
    int _pin2;
    int _pin3;
    int _pin4;
    int rych;
  private:
    byte _step;
    byte krok;
};

#endif

Soubor MMotor.cpp

Druhý soubor obsahuje pak samotný zdrojový kód. Zde jsem se dočetl v nápovědě, že aby vše fungovalo, můsí hned na začátku obsahovat include dvou věcí – Arduino.h a MMotor.h. Arduino.h obsahuje proto, aby nám byly dostupné funkce jako pinMode a podobné.

Soubor sem vložím, tak jak je, neobsahuje komentáře, nicméně jeho struktura koresponduje rámcově s příkladem v předchozím dílu. Navíc věřím, že porozumět nebude vůbec obtížné.

#include "Arduino.h"
#include "MMotor.h"

MMotor::MMotor(int pin1, int pin2, int pin3, int pin4, int speed)
{
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);
  pinMode(pin3, OUTPUT);
  pinMode(pin4, OUTPUT);

 byte _step = 0;

 rych = speed;

 _pin1 = pin1;
 _pin2 = pin2;
 _pin3 = pin3;
 _pin4 = pin4;

}

void MMotor::krokuj(int kroku, bool smer)
{
  for(int i = 0; i < kroku;i++){
    _step+=smer==true?1:-1;
    jeden_krok(_step);
  }
}


void MMotor::jeden_krok(int bkrok) {
 byte _kroky[][4] = {{0,0,0,1}, {0,0,1,1}, {0,0,1,0}, {0,1,1,0}, {0,1,0,0}, {1,1,0,0}, {1,0,0,0}, {1,0,0,1}};

 byte krok = bkrok<<5;
 krok = krok>>5;
 digitalWrite(_pin1, _kroky[krok][0]);
 digitalWrite(_pin2, _kroky[krok][1]);
 digitalWrite(_pin3, _kroky[krok][2]);
 digitalWrite(_pin4, _kroky[krok][3]);

 delayMicroseconds(1000);

}

void MMotor::test(){
    digitalWrite(8, HIGH);
}

void MMotor::rychlost(int r){
    rych = r;
}

void MMotor::vypnout(){
 digitalWrite(_pin1, LOW);
 digitalWrite(_pin2, LOW);
 digitalWrite(_pin3, LOW);
 digitalWrite(_pin4, LOW);
}

Jak mojí knihovnu použít?

Pracuji pod linuxem, a v mém případě stačilo zkopírovat soubory MMotor.h a MMotor.cpp do adresáře /usr/share/arduino/libraries/MMotor

Na windows se dá použít položka v menu Sketch → Import Liberary → Add liberary

Po přidání knihovny je třeba vypnout a zapnout Arduino IDE aby se knihovna načetla do menu.

Víc povídání o tom, jak přidat knihovny jsem našel na stránce arduina

Hodně štěstí a ať vám to funguje! :-D

Připojená fotogalerie: 2014/2014_11_11_Stepper/
Podobné články:

Štítky tohoto článku:

 


Diskuze: Arduino a krokový motor potřetí

  1. test (   test   12.5.2015, 19:47)

    gg

    Reagovat na tento příspěvek
  2. Steev (28.4.2016, 23:50)

    Ahoj, použil jsem tvoje řešení, ale motor se netočí, jen se klepe vpravo a vlevo. všiml jsem si, že máš zapojený unipolární motor (5 pinů) ja mám bipolární motor (4 piny). Měl bych asi uravit „byte_kroky“, že?

    Reagovat na tento příspěvek
  3. Tonino (21.10.2017, 16:41)

    Zdar, sledoval som tvoje riesenie (este som neudelal svoje, ale nieco planujem) a nepaci sa mi na nom, ze sa snazis motor ovladat v podstate priamo riadenim prudu do jednotlivych civek. Je to priame, ale si myslim, ze sa to tazko nastavuje a na pohlad to vypada komplikovane. Navyse rychlost riadis len tym, ako dlho cakas, kym zmenis napajanie na ine vyvody ( v povodnom programe je to funkcia braek – alebo realne v arduinu delay, co nam dava moznost cakat 1 milisekundu- teda za sekundu spravis 1000 krat prepolovanie – teda 1000 krokov, co pri uhle 5,625 potrebujes 64 zmien na jednu otacku motora, ale kedze je tam este prevodovka 1:64 tak na jednu otacku hriadela potrebujes 4096 krokov (alebo prepolovani) – takze mne to vychadza, ze takymto sposobom spravi hriadel 1 otacku za 4,096 sec – co je pomerne pomaly pohyb. Preto som sa zamyslal, ci by nebolo vhodnejsie ako ovladac pouzit nieco taketo: https://www.tme.eu/…OLU-2134.pdf a motorcek ovladat namiesto 4 vystupov z arduina len dvomi, pricom jednym by som ovladal rychlost (PWM signal) a druhym smer. Popripade by som pouzil dalsie na pouzitie mensieho kroku a tym hladsieho chodu. Ak by sa ti chcelo experimentovat takymto sposobom, by som rad videl niekde porovnanie oboch metod riadenia krokoveho motora, ale inak aj tak dakujem za clanok

    Reagovat na tento příspěvek

  4.  
    Diskuze: Arduino a krokový motor potřetí
    Vaše jméno (povinné)
    Váš email (nebude zveřejněn, povinný)
    WEB (bude zveřejněn, pište s http://)
    Text vzkazu:
    Kolik je 3×2? (ochrana proti spamu)
 
[CNW:Counter]