Arduino Polska Forum

Pełna wersja: sterowanie krokowcem - pozycjoner
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Hej,
na początku od razu uprzedzam, że jestem kompletnym amatorem.
Zamarzył mi się mały pozycjoner, który mechanicznie zrobiłem sobie z prowadnicy lasera od starego CD'ka

Sterować nim chce za pomocą IR - pilota już mam, guziki sobie zdekodowałem.

Lewo/Prawo mi jedzie ale tylko zadaną wartość w krokach, którą mu podałem.

Chciałbym na początku dodać funkcje
Trzymam guzik/przycisk "A" - tak długo jak trzymam tak długo jedzie w prawo z określoną w programie prędkością
guzik/przycisk "B" - analogicznie to samo tylko w lewo

ewentualnie dodać rampę, że z upływem czasu prędkość narasta ?

Pomoże ktoś?

Kod:
#include "Stepper.h"
#include "IRremote.h"

/*----- Variables, Pins -----*/
#define STEPS  32   // Number of steps per revolution of Internal shaft
int  Steps2Take;  // 2048 = 1 Revolution
int receiver = 6; // Signal Pin of IR receiver to Arduino Digital Pin 6

/*-----( Declare objects )-----*/
// Setup of proper sequencing for Motor Driver Pins
// In1, In2, In3, In4 in the sequence 1-3-2-4

Stepper small_stepper(STEPS, 8, 10, 9, 11);
IRrecv irrecv(receiver);    // create instance of 'irrecv'
decode_results results;     // create instance of 'decode_results'

void setup()
{
 irrecv.enableIRIn(); // Start the receiver
}

void loop()
{
if (irrecv.decode(&results)) // have we received an IR signal?

 {
   switch(results.value)

   {

     case 0x8C549057: // UP button pressed
                     small_stepper.setSpeed(500); //Max seems to be 700
                     Steps2Take  =  10;  // Rotate CW
                     small_stepper.step(Steps2Take);
                     delay(2000);
                     break;

     case 0xDE5526F7: // DOWN button pressed
                     small_stepper.setSpeed(500);
                     Steps2Take  =  -10;  // Rotate CCW
                     small_stepper.step(Steps2Take);
                     delay(2000);
                     break;
                     
   }
   
     irrecv.resume(); // receive the next value
 }  


}/* --end main loop -- */
Witam
Sprawdź jaka jest częstotliwość ponawiania sygnału z pilota, ustaw kroków tyle by ruch między ponowieniem komendy był utrzymany, wywal delay, zeruj komendę/ustaw flagę, żeby była wykonywana tylko jeśli to jest nowa. Dodaj case default do zatrzymania silnika po np. 50ms. Ja używam biblioteki AccelStepper, ma definiowalne przyspieszenie, można np. odczytać jaka jest aktualna pozycja, jaka jest docelowa i ustawić cel jako aktualną pozycję by zatrzymać.