• 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 silnikiem krokowy i dc przy pomocy IR
#1
Witam

Nie mogę dojść końca z równoczesnym sterowaniem silnikiem krokowym oraz dc. Chciałbym aby silnik krokowy wykonywał ciagłą rotecje z regulacją obrotów, do tego regulacja obrotów silnika dc. Na chwilę obecną albo działa ir i silnik dc albo kiedy dział silnik krokowy i dc to po wyłączeniu nie czyta sygnału ir.
Kod:
#include "IRremote.h"

#include <Stepper.h> // Include the header file
// change this to the number of steps on your motor
#define STEPS 64
// create an instance of the stepper class using the steps and pins
Stepper stepper(STEPS, 8, 10, 9, 11);

int receiver = 3;
int Power__ON = 0;

int x;
int w1 = 5; // wiatrak pwm
int val = 0;

IRrecv irrecv(receiver);
decode_results results;

int vel2 = 100; // naped
int vel1 = 150; //wiatrak

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn();
// Set the output pins
pinMode(w1, OUTPUT);
 //val = 100;
   
}

void loop()
{
   if (irrecv.decode(&results))
 {
   x = results.value & 0x0000ff;
   Serial.println(results.value, HEX);
   processIR();
   irrecv.resume();
   }
   stepper.step(val+10);
  // irrecv.resume();
}

void processIR()
{
  if (x == 0x3D || x == 0xBB) //ON
  {
//wiatrak
analogWrite(w1, vel1); // Sets speed variable via PWM
stepper.setSpeed(vel2);
}


else if (x == 0x1D || x == 0x7F) //turn off
 {
   Power__ON = Power__ON;
   int x = Power__ON%2;
   Serial.println(x);
   if (x == 0)
   {
     Serial.println("Both Motor goes OFF");
     analogWrite(w1, 0); // Sets speed variable via PWM
     stepper.setSpeed(0);
     stepper.step(0);
}
}
else if (x == 0x57 || x == 0xDB) // vol+
 {
   vel1 = vel1 + 10;
   analogWrite(w1, vel1);
   vel2 = vel2 + 40;
   stepper.setSpeed(vel2);
   
 }
 
  else if (x == 0x1F || x == 0x3B) // vol-
 {
  vel1 = vel1 - 10;
   analogWrite(w1, vel1);
   vel2 = vel2 - 40;
   stepper.setSpeed(vel2);
 }
 
}
 
Bedę wdzięczny za pomoc.
 
Odpowiedź
#2
Stepper.h jak zauważyłem, a bawiłem się krótko, jak włączy silnik to nim steruje aż do zatrzymania. Lepiej użyj biblioteki accelstepper. Ewentualnie dodatkowo dedykowanego sterownika a4988, czy coś podobnego. Przejrzyj bibliotekę co obsługuje. Biblioteka IR potrzebuje do działania pinu z zewnętrznym przerwaniem i timera, te zasoby mogą być używane w PWM, powinieneś więc przeanalizować który timer obsługuje dane piny z PWM, którego timera używa IR i takich użyć by nie robić konfliktów.
 
Odpowiedź
#3
Witam

Uzyłem biblioteki accelstepper, jest prawie ok. narazie podpiołem sterowanie na przyciskach. Problem mam tylko kiedy chcę regulować prędkość, regulacja silnika dc działa natomiast silnik krokowy nie reaguje.

Kod:
#include <AccelStepper.h> // Include the header file
// change this to the number of steps on your motor

// create an instance of the stepper class using the steps and pins
AccelStepper stepper(4,2,9,10,12);


int w1 = 5; // wiatrak pwm
int w2 = 4;
int w3 = 7;
//int val = 50;

//buttons

const int on = A0;
const int plus = A1;
const int minus = A2;

int vel2 = 500; // naped
int vel1 = 58; //wiatrak

int buttonState = 0;
int flag=0;
int buttonflag=LOW;

int buttonStatePlus = 0;
int flagPlus=0;
int buttonFlagPlus=LOW;

int buttonStateMinus = 0;
int flagMinus=0;
int buttonFlagMinus=LOW;

void setup()

{
Serial.begin(9600);
pinMode(w1, OUTPUT);
// pinMode(on, INPUT);
pinMode(on, INPUT);
pinMode(plus, INPUT);
pinMode(minus, INPUT);
stepper.setMaxSpeed(1000);
stepper.setSpeed(vel2);
stepper.setAcceleration(500);

}

void loop()
{    


 buttonflag=buttonState;   // zapamiętanie poprzedniego stanu porzycisku


 buttonState = digitalRead(on);




  //delay(100);
  if (buttonflag!=buttonState)   //sprawdzamy czy nastąpiła zmiana stanu przycisku
  {
   if (buttonState == HIGH) flag=!flag;
  }
  // }
   //...ones, turn led on!
   if ( flag == 1){
     Serial.println("Both Motor goes ON");
     analogWrite(w1, vel1); // Sets speed variable via PWM
     digitalWrite(w2, HIGH);
     digitalWrite(w3, LOW);
     stepper.setSpeed(vel2);
     stepper.runSpeed();
}
else if ( flag == 0){
Serial.println("Both Motor goes OFF");
     analogWrite(w1, 0); // Sets speed variable via PWM
     digitalWrite(w2, LOW);
     digitalWrite(w3, LOW);
 
    stepper.stop();
    digitalWrite(2, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(12, LOW);
 }

 
   if ( digitalRead(plus)){
   Serial.println("Plus");
   vel1 = vel1 + 5;
   analogWrite(w1, vel1);
   //vel2 = vel2 + 50;
  stepper.setSpeed(vel2+50);
  //stepper.runSpeed();
   delay(100);
}



else if (digitalRead(minus)) //sprawdzamy czy nastąpiła zmiana stanu przycisku
{
   Serial.println("Minus");
   vel1 = vel1 - 5;
   analogWrite(w1, vel1);
   //vel2 = vel2 - 50;
  stepper.setSpeed(vel2-50);
   //stepper.runSpeed();
    delay(100);
 }
 

}
 
Odpowiedź
#4
Teraz zrób to samo bez delay.
 
Odpowiedź
#5
Już zrobiłem, dalej to samo.
 
Odpowiedź
#6
To pokaż ten kod bez delay. A jak zmieniasz prędkość to zmieniaj wartość zmiennej bo najpierw zadajesz prędkość większą, potem początkową i dopiero jest polecenie runSpeed. Możesz sobie też drukować przed wydaniem polecenia run jaką wartość ma ta prędkość.
 
Odpowiedź
#7
Kod bez delay:

Kod:
#include <AccelStepper.h> // Include the header file
// change this to the number of steps on your motor

// create an instance of the stepper class using the steps and pins
AccelStepper stepper(4,2,9,10,12);


int w1 = 5; // wiatrak pwm
int w2 = 4;
int w3 = 7;
//int val = 50;

//buttons

const int on = A0;
const int plus = A1;
const int minus = A2;  

int vel2 = 50; // naped
int vel1 = 58; //wiatrak

int buttonState = 0;
int flag=0;
int buttonflag=LOW;

int buttonStatePlus = 0;
int flagPlus=0;
int buttonFlagPlus=LOW;

int buttonStateMinus = 0;
int flagMinus=0;
int buttonFlagMinus=LOW;

void setup()

{
Serial.begin(9600);
stepper.setMaxSpeed(700);
stepper.setSpeed(vel2);
stepper.runSpeed();
pinMode(w1, OUTPUT);
// pinMode(on, INPUT);
pinMode(on, INPUT);
pinMode(plus, INPUT);
pinMode(minus, INPUT);

}

void loop()
{    

 buttonflag=buttonState;   // zapamiętanie poprzedniego stanu porzycisku
 
 buttonState = digitalRead(on);

  if (buttonflag!=buttonState)   //sprawdzamy czy nastąpiła zmiana stanu przycisku
  {
   if (buttonState == HIGH) flag=!flag;
  }
  // }
   //...ones, turn led on!
   if ( flag == 1){
     Serial.println("Both Motor goes ON");
     analogWrite(w1, vel1); // Sets speed variable via PWM
     digitalWrite(w2, HIGH);
     digitalWrite(w3, LOW);
     stepper.setSpeed(vel2);  
     stepper.runSpeed();
}
else if ( flag == 0){
Serial.println("Both Motor goes OFF");
     analogWrite(w1, 0); // Sets speed variable via PWM
     digitalWrite(w2, LOW);
     digitalWrite(w3, LOW);
 
    stepper.stop();
    digitalWrite(2, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(12, LOW);
 }
 
 
   if ( digitalRead(plus)){
   Serial.println("Plus");
   vel1 = vel1 + 5;
   analogWrite(w1, vel1);
   //vel2 = vel2 + 50;
  stepper.setSpeed(vel2+50);
  stepper.runSpeed();
   
}



else if (digitalRead(minus)) //sprawdzamy czy nastąpiła zmiana stanu przycisku
{
   Serial.println("Minus");
   vel1 = vel1 - 5;
   analogWrite(w1, vel1);
   //vel2 = vel2 - 50;
  stepper.setSpeed(vel2-50);
   stepper.runSpeed();
   
 }
 
 
}
 
Odpowiedź
#8
Haha, dobry żart, nie chodzi o to by je wykasować tylko zastąpić. Albo własna funkcja do drgań styków z millis albo użyj gotowych bibliotek bounce2 czy easybutton.
Dalej masz to: stepper.setSpeed(vel2+50);, jak użyjesz w innym miejscu stepper.setSpeed(vel2); to wpisze z powrotem starą wartość, miałeś mienić vel2+=50 czy tam minus, czy tam vel2=vel2+50.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości