• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
sterowanie krokowcem - pozycjoner
#1
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 -- */
 
Odpowiedź
#2
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ć.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości