• 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
Silnik krokowy+fotorezystor
#1
Lightbulb 
Cześć wszystkim,
mam drobny problem z tworzeniem kodu, zatrzymałam się na pewnym etapie i zupełnie nie wiem jak ruszyć dalej. Mój silnik (28BYJ-48 + sterownik ULN2003 V2) wykonuje obroty zarówno w jedną jak i w drugą stronę, zależnie od wartości światła (wykorzystuje do tego fotorezystor). Chciałabym jednak aby silnik wykonywał wyznaczoną przeze mnie ilość kroków po czym czekał na zmianę wartości światła i dopiero wtedy ruszał w drugą stronę. Przy aktualnym kodzie silnik tak jak powinien reaguje na zmianę wartości światła, jednak jeśli dojdzie do wyznaczonej przeze mnie ilości kroków całkowicie wstrzymuje swoje działanie i nawet po przysłonieniu fotorezystora nie wykonuje żadnych interakcji.
KOD:

#define STEPPER_PIN_1 9
#define STEPPER_PIN_2 10
#define STEPPER_PIN_3 11
#define STEPPER_PIN_4 12


int step_number = 0;
int fotorezystor = A0;
int wartosc= 0;
int krok=0;
int stepCount = 0;
void setup() {
  Serial.begin(9600);
pinMode(STEPPER_PIN_1, OUTPUT);
pinMode(STEPPER_PIN_2, OUTPUT);
pinMode(STEPPER_PIN_3, OUTPUT);
pinMode(STEPPER_PIN_4, OUTPUT);

}

void loop() {

    int wartosc = analogRead(fotorezystor);
 
 Serial.print("krok:");
  Serial.println(krok);
if(wartosc>100){
krok++;
  OneStep(false);
    delay(4);
    do{  
    OneStop(false);
     if(wartosc>100) continue;}while (krok==500);
   
}
 
  if(wartosc<100){
  krok--;
 
  OneStep(true);
  delay(4);
do{  
  OneStop(true);
   if(wartosc>100) continue;}while (krok==200);
 
}}


void OneStep(bool dir){
    if(dir){
switch(step_number){
  case 0:
  digitalWrite(STEPPER_PIN_1, HIGH);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 1:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, HIGH);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 2:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, HIGH);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 3:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, HIGH);
  break;
 
}
  }else{
    switch(step_number){
  case 0:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, HIGH);
  break;
  case 1:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, HIGH);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 2:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, HIGH);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;
  case 3:
  digitalWrite(STEPPER_PIN_1, HIGH);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
}

 }}
 
  void OneStop (bool dir){
if (dir){
    switch(step_number){
 case 0:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;  
  case 1:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;    
  case 2:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;  
  case 3:
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  break;


}
}
 
   

step_number++;
  if(step_number > 3){
 
    step_number = 0;
       
 
 
}}
 
Odpowiedź
#2
masz zle podejście albo użyj biblioteki stepper i raczej na pewno https://www.arduino.cc/en/reference/stepper

Lub sam napisać obsługę timera
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
(26-04-2021, 21:27)Jarewa0606 napisał(a): masz zle podejście albo użyj biblioteki stepper i raczej na pewno  https://www.arduino.cc/en/reference/stepper

Lub sam napisać obsługę timera
właśnie używając biblioteki i przykładów które są już tam zawarte, arduino nie czyta mi polecenia kręcenia silnikiem w drugą stronę. 
Mam tu na myśli takie polecenie:


void loop() {
  // step one revolution  in one direction:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);

  // step one revolution in the other direction:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);

silnik kręci się w jedną stronę, a w momencie gdy powinien zmieniać swój kierunek, to po prostu się stopuje, tak jakby nie czyta "-". W czym może leżeć problem ?
 
Odpowiedź
#4
Wyrzuć zmienną wartość na serial i powiedz, co pokaże po zasłonięciu fotorezystora.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości