Prośba o poradę - kontrola pracy cyklicznej silnika krokowego

Dyskusje na temat silników krokowych i sterowników silników krokowych.

Autor tematu
Somnambulik
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 7
Posty: 8
Rejestracja: 22 sty 2021, 00:27

Re: Prośba o poradę - kontrola pracy cyklicznej silnika krokowego

#11

Post napisał: Somnambulik » 24 sty 2021, 23:39

TOP67 pisze:Tak. To wystarczy. Shield jest podstawką pod malutkie sterowniki, ale one tego silnika nie uciągną.


Dziękuję za całą pomoc w doborze :)
tuxcnc pisze: a do napisania własnych już trochę więcej wiedzy potrzeba ...

na szczęście jakieś podstawy programowania mam (choć niestety nie z tej branży :P), nie ma to być cudo, to może się uda, wiedza jest rozsiana po całym internecie, może znajdę, gdzieś ukryta w tym całym śmietniku informacji, szczególnie, że kod nie wysyła ludzi na Marsa :) w każdym razie jestem dobrej myśli, a w razie dużych problemów myślę że znajdę cudotwórcę :)

----------------------------------------------------------------------------
nobody is perfect - be nobody



Awatar użytkownika

TOP67
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 4
Posty: 2224
Rejestracja: 17 wrz 2018, 10:47
Lokalizacja: Wrocław
Kontakt:

Re: Prośba o poradę - kontrola pracy cyklicznej silnika krokowego

#12

Post napisał: TOP67 » 24 sty 2021, 23:55

Jeśli silniki nie będą się kręciły bardzo szybko i nie będzie potrzebna rampa, to zaprogramowanie jest dziecinnie łatwe i nie potrzeba żadnych bibliotek poza tą do wyświetlacza.


tristar0
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 2847
Rejestracja: 21 sty 2020, 17:48
Lokalizacja: Toruń miasto Tadeusza R

Re: Prośba o poradę - kontrola pracy cyklicznej silnika krokowego

#13

Post napisał: tristar0 » 27 sty 2021, 09:17

jak będziesz miał problem daj znać zostało mi parę PCB prototypowych i wyświetlaczy no i plytek bazowych no i soft więc mogę zmodyfikować pod twoje potrzeby. Nie jest to Arduino Uno choć wyprowadzenia płyty takie same .
Mam wyrypane na wszelkiej maści proroków ,mędrców i wszystkich którzy stawiają się ponad innymi ,i tak ich zjedzą robaki


Autor tematu
Somnambulik
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 7
Posty: 8
Rejestracja: 22 sty 2021, 00:27

Re: Prośba o poradę - kontrola pracy cyklicznej silnika krokowego

#14

Post napisał: Somnambulik » 29 sty 2021, 02:02

TOP67 pisze:Jeśli silniki nie będą się kręciły bardzo szybko i nie będzie potrzebna rampa, to zaprogramowanie jest dziecinnie łatwe i nie potrzeba żadnych bibliotek poza tą do wyświetlacza.


Nie, raczej powoli wszystko będzie działać, UNO i LCD Shield dotarło - podłączyłem na razie tylko to, później pobawię się i popodłączam do silnika, zainstalowałem IDE, wszystko pięknie działa i jak widzę faktycznie banalnie proste, nie powinno być problemu z rozwinięciem prototypu w przyszłości, już mi przemnkęły potrzebne później czujniki itp. Na razie muszę zająć się całą konstrukcją mechaniczną, samo zaprogramowanie to będzie przyjemność, jeżeli by się udał to podzieliłbym tym co stworzę, na razie nie zapeszam :)

tristar0 pisze:jak będziesz miał problem daj znać zostało mi parę PCB prototypowych i wyświetlaczy no i plytek bazowych no i soft więc mogę zmodyfikować pod twoje potrzeby. Nie jest to Arduino Uno choć wyprowadzenia płyty takie same .

Dziękuję, w razie czego się odezwę

Pozdrawiam serdecznie,
Kamil


Autor tematu
Somnambulik
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 7
Posty: 8
Rejestracja: 22 sty 2021, 00:27

Re: Prośba o poradę - kontrola pracy cyklicznej silnika krokowego

#15

Post napisał: Somnambulik » 06 lut 2021, 16:38

Piszę update, może komuś się przyda w przyszłości, kod napisany. Do kompletu dokupiłem jeszcze Arduino screw shield v3.
Kod napisany, działa, przyciski na keypadzie zmieniają prędkość oraz zatrzymują i startują silniczek. W sumie enkodera nie używam, ale podłączony :) Udało się uniknąć "delay", dzięki temu przyciski na keypadzie zawsze działają (w poprzedniej wersji przy komendzie 'delay' przyciski nie działały w momencie zatrzymania programu

Wklejam kod, może komuś się przyda. Od strony mechanicznej niestety jeszczcze wszystko leży i czeka na ostatnie części


Kod v0.01 :) w przyszłości dodam zapewne parę czujników i elementów, ale to w bliżej nieokreślonej przyszłości. Pozdrawiam

Kod: Zaznacz cały

#include <LiquidCrystal.h> 
#include <Stepper.h>


//create object to control an LCD.  
//number of lines in display=2
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 ); 

// Define pins
int driverPUL = 12;    // PUL- pin
int driverDIR = 13;    // DIR- pin
int EncoderDT = A1;     // Encoder Output A
int EncoderCLK = A2;     // Encoder Output B
int stopSwitch = A3;  // Push button on encoder

// Define variables
int pause = 3000;     // time for stepper to stop/pause
long previousMillis = 0;        // will store last time LED was updated
long interval = pause; 
bool stepperOn = false;
const int stepsPerRevolution = 1600;  // change this to fit the number of steps per revolution

// Stepper options
Stepper myStepper(stepsPerRevolution, driverPUL, driverDIR); 

//Keypad setup 
int adc_key_val[5] ={30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;


///////////////////////////SETUP/////////////////////START///////
 
void setup() { 
  pinMode(stopSwitch, INPUT);
  myStepper.setSpeed(300);
//  Serial.begin(9600);

  pinMode (driverPUL, OUTPUT);
  pinMode (driverDIR, OUTPUT);

 //////// LCD SETUP /////// START ///////
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print("Prototype v0.01");
  lcd.setCursor(0, 2);
  lcd.print("Pause:");
  lcd.setCursor(6, 2);
  lcd.print (pause);
   //////// LCD SETUP /////// END ///////
}




///////////////////////////SETUP/////////////////////END///////


///////////////////////////LOOP///////////////////START/////////

void loop() {


  
  ////////////////////STEPPER IN LOOP///////START////
  unsigned long currentMillis = millis(); 
  if(stepperOn && currentMillis - previousMillis > interval)
    {
    previousMillis = currentMillis;  
    myStepper.step(stepsPerRevolution);       
    }
  ////////////////////STEPPER IN LOOP///////END////


  ////////////////////KYPAD IN LOOP///////START////

  adc_key_in = analogRead(0);    // read the value from the sensor  
  key = get_key(adc_key_in);            // convert into key press
  
  if (key != oldkey)            // if keypress is detected
  {
    delayMicroseconds(500);    // TODO wait for debounce time (will propably be interrupting stepper, change to millis or something, not v. important as it's gonna start/stop motor
    adc_key_in = analogRead(0);    // read the value from the sensor  
    key = get_key(adc_key_in);            // convert into key press
    if (key != oldkey)        
    {     
      oldkey = key;
      if (key >=0){
      lcd.setCursor(0, 2);  //line=2, x=0
        if(key == 0)            //if key pressed is RIGHT;
          {               
            Serial.println(key);
            stepperOn = true;
          }
        if(key == 1)            //if key pressed is UP;
          {  
            pause += 100;             
            Serial.println(key);    
          }
        if(key == 2)            //if key pressed is DOWN;
          {               
            Serial.println(key);
            pause -= 100;        
          }
        if(key == 3)            //if key pressed is LEFT;
          {               
            Serial.println(key);
            stepperOn = false;
          }
        if(key == 4)            //if key pressed is SELECT;
          {               
            Serial.println(key);
          }
          Serial.println(pause);
          lcd.setCursor(6, 2);  //line=2, x=6 
          lcd.print (pause); //////TO DO //////////////////Print current pause time in milliseconds   
          interval = pause;
          

      }
    }
  }

    ////////////////////KYPAD IN LOOP///////END////
  
  
}
///////////////////////////LOOP///////////////////END/////////


// Convert ADC value to key number
int get_key(unsigned int input)
{
  int k;
    
  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {
           
    return k;
        }
  }
    
    if (k >= NUM_KEYS)
        k = -1;     // No valid key pressed
    
    return k;
}


Obrazek
Obrazek

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Silniki Krokowe / Sterowniki Silników Krokowych”