#1 2020-10-27 13:36:14

IzzyVilagosz
Учасник
Зареєстрований: 2020-10-27
Повідомлень: 6

Не работает затухание светодиода при вращении енкодера в другую сторон

Есть небольшое задание: сделать программу которая вращает сервопривод в ту сторону, в которую вращается ручка енкодера. И если достигнут предел вращения сервопривода - зажигать светодиод и продолжать усиливать его яркость до того момента, пока ручка енкодера не начнет вращаться в противоположную сторону. Тогда начать уменьшать яркость светодиода, и когда она дойдет до 0 - начать опять вращать сервопривод. И у меня это работает только в одну сторону. Как исправить?

#include <Servo.h>

Servo myServo;

int servoAngle = 0;
int posLevel = 10;
int maxAngle = 180;

int ledPin = 6;
int brightness = 0;
int change = 10;

unsigned long currentTime;
unsigned long loopTime;

const int pin_A = 12;
const int pin_B = 11;

unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;

void setup() {
  Serial.begin(9600);
  myServo.attach(9);
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  pinMode(ledPin, OUTPUT);
  analogWrite(ledPin, LOW);
  currentTime = millis();
  loopTime = currentTime;
}

void loop() {
  currentTime = millis();
  if (currentTime >= (loopTime + 5)) {
    encoder_A = digitalRead(pin_A);
    encoder_B = digitalRead(pin_B);
    analogWrite(ledPin, brightness);
    if ((!encoder_A) && (encoder_A_prev)) {
      if (encoder_B) {
        if ((servoAngle + posLevel <= maxAngle) && (brightness <= 0)) {
          servoAngle += posLevel;
        } else {
          if (encoder_B) {
            if (brightness + change <= 255) brightness += change;
          } else {
            if (brightness - change >= 0) brightness -= change;
          }
        }
      } else {
        if ((servoAngle - posLevel >= 0)) {
          if (brightness <= 0) {
            servoAngle -= posLevel;
          } else {
            if (encoder_A) {
              if (brightness + change <= 255) brightness += change;
            } else {
              if (brightness - change >= 0) brightness -= change;
            }
          }
        }
      }
    }
    
    encoder_A_prev = encoder_A;
    myServo.write(servoAngle);

    loopTime = currentTime;
  }
}

Остання редакція IzzyVilagosz (2020-10-27 13:36:41)

Неактивний

#2 2020-10-27 14:15:40

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 746

Re: Не работает затухание светодиода при вращении енкодера в другую сторон

разбейте свою задачу на три части
поворот сервы при вращении энкодера
изменение яркости при вращении энкодера
потом всё в кучу соедините

Неактивний

#3 2020-10-27 15:48:33

IzzyVilagosz
Учасник
Зареєстрований: 2020-10-27
Повідомлень: 6

Re: Не работает затухание светодиода при вращении енкодера в другую сторон

vvr пише:

разбейте свою задачу на три части
поворот сервы при вращении энкодера
изменение яркости при вращении энкодера
потом всё в кучу соедините

Никак не получается сделать светодиод в обе стороны. Просто туплю и все(

Неактивний

#4 2020-10-27 15:49:58

IzzyVilagosz
Учасник
Зареєстрований: 2020-10-27
Повідомлень: 6

Re: Не работает затухание светодиода при вращении енкодера в другую сторон

вот почти то что надо, но все равно - в обе стороны не понимаю как сделать. Вроде все должно быть элементарно, но никак не доходит

int brightness = 120;      // яркость LED, начинаем с половины
int fadeAmount = 10;      // шаг изменения яркости LED
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12;     // pin 12
const int pin_B = 11;     // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

void setup()  {
  // declare pin 9 to be an output:
  pinMode(6, OUTPUT);     // устанавливаем pin 9 как выход
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  currentTime = millis();
  loopTime = currentTime; 
} 

void loop()  {
  currentTime = millis();
  if(currentTime >= (loopTime + 5)){  // проверяем каждые 5мс (200 Гц)
    encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера 
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера    
    if((!encoder_A) && (encoder_A_prev)){  // если состояние изменилось с положительного к нулю
      if(encoder_B) {
        // выход В в полож. сост., значит вращение по часовой стрелке
        // увеличиваем яркость, не более чем до 255
        if(brightness + fadeAmount <= 255) brightness += fadeAmount;               
      }   
      else {
        // выход В в 0 сост., значит вращение против часовой стрелки     
        // уменьшаем яркость, но не ниже 0
        if(brightness - fadeAmount >= 0) brightness -= fadeAmount;               
      }   

    }   
    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла 
    
    analogWrite(6, brightness);   // устанавливаем яркость на 9 ножку
   
    loopTime = currentTime;
  }                       
}

Неактивний

#5 2020-10-27 16:41:21

IzzyVilagosz
Учасник
Зареєстрований: 2020-10-27
Повідомлень: 6

Re: Не работает затухание светодиода при вращении енкодера в другую сторон

Вот последнее что получилось. Все равно не работает.

#include <Servo.h>

Servo myServo;

int servoAngle = 0; //початкова позиція
int posLevel = 10; //значення зміни кута сервоприводу
int maxAngle = 180; //діапазон повертання (від 1 до 180)

int ledPin = 6;
int brightness = 0;
int change = 10;

unsigned long currentTime;
unsigned long loopTime;

const int pin_A = 12;
const int pin_B = 11;

unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;

void LightLeft(){
  if((!encoder_B)&&(encoder_A_prev)){
      if(encoder_A) {
        if (brightness + change <= 255){
          brightness += change; 
          if (brightness >=255){
            brightness == 255;
          }
        }
                      
        }   
        else {
          if (brightness - change >= 0){
            brightness -= change;
            if (brightness <0){
            brightness ==0;
          }
          }
        }                               
      }
    encoder_A_prev = encoder_B;
}

void LightRight(){
  if((!encoder_A)&&(encoder_A_prev)){
      if(encoder_B) {
        if (brightness + change <= 255){
          brightness += change; 
          if (brightness >=255){
            brightness == 255;
          }
        }
                      
        }   
        else {
          if (brightness - change >= 0){
            brightness -= change;
            if (brightness <0){
            brightness ==0;
          }
          }
        }                               
      }
    encoder_A_prev = encoder_A;
}

void setup() {
  Serial.begin(9600);
  myServo.attach(9);
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  pinMode(ledPin, OUTPUT);
  analogWrite(ledPin, LOW);
  currentTime = millis();
  loopTime = currentTime;
}

void loop() {
  currentTime = millis();
  if (currentTime >= (loopTime + 5)) {
    encoder_A = digitalRead(pin_A);
    encoder_B = digitalRead(pin_B);
    analogWrite(ledPin, brightness);
    /*
    if((!encoder_A)&&(encoder_A_prev)){
      if(encoder_B) {
        if(servoAngle + posLevel <= maxAngle) servoAngle += posLevel;               
      }   
      else {
        if(servoAngle - posLevel >= 0) servoAngle -= posLevel;               
      }    
    }*/
    bool trig = false;
    if(!trig){
      if((!encoder_B)&&(encoder_A_prev)){
        LightLeft();
        if (brightness <= 0){
          trig = true;
          brightness = 0;
        }
      }
      encoder_A_prev = encoder_B;
    }
    else{
      if((!encoder_A)&&(encoder_A_prev)){
        LightRight();
        if (brightness <= 0){
          trig = false;
          brightness = 0;
        }
      }
      encoder_A_prev = encoder_A;
    }
    myServo.write(servoAngle);

    loopTime = currentTime;
  }
}

Неактивний

#6 2020-10-27 19:05:42

IzzyVilagosz
Учасник
Зареєстрований: 2020-10-27
Повідомлень: 6

Re: Не работает затухание светодиода при вращении енкодера в другую сторон

Я сделал. Оставлю на всякий. Может кто то доработает или кому нить пригодиться

#include <Servo.h>

Servo myServo;

int servoAngle = 0; 
int posLevel = 10; 
int maxAngle = 180; 

int ledPin = 6;
int brightness = 0;
int change = 10;

unsigned long currentTime;
unsigned long loopTime;

const int pin_A = 12;
const int pin_B = 11;

unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;

int trig = 0;

void LightLeft(){
  if((!encoder_B)&&(encoder_A_prev)){
      if(encoder_A) {
        if (brightness + change <= 255){
          brightness += change; 
          if (brightness >=255){
            brightness == 255;
          }
        }
                      
        }   
        else {
          if (brightness - change >= 0){
            brightness -= change;
            if (brightness <0){
            brightness ==0;
          }
          }
        }                               
      }
    encoder_A_prev = encoder_B;
}

void LightRight(){
  if((!encoder_A)&&(encoder_A_prev)){
      if(encoder_B) {
        if (brightness + change <= 255){
          brightness += change; 
          if (brightness >=255){
            brightness == 255;
          }
        }
                      
        }   
        else {
          if (brightness - change >= 0){
            brightness -= change;
            if (brightness <0){
            brightness ==0;
          }
          }
        }                               
      }
    encoder_A_prev = encoder_A;
}

void setup() {
  Serial.begin(9600);
  myServo.attach(9);
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  pinMode(ledPin, OUTPUT);
  analogWrite(ledPin, LOW);
  currentTime = millis();
  loopTime = currentTime;
}

void loop() {
  currentTime = millis();
  if (currentTime >= (loopTime + 5)) {
    //Serial.println(trig);
    encoder_A = digitalRead(pin_A);
    encoder_B = digitalRead(pin_B);
    analogWrite(ledPin, brightness);
    if(trig==0){
      encoder_A = digitalRead(pin_A);
      encoder_B = digitalRead(pin_B);
      if((!encoder_A)&&(encoder_A_prev)){
        if(encoder_B) {
          if(servoAngle + posLevel <= maxAngle){
            servoAngle += posLevel; 
            } 
          else{
            trig = 1;           
          }
        }   
        else {
          if(servoAngle - posLevel >= 0){
            servoAngle -= posLevel;              
          }
          else{
            trig = 2;
          }
        }
      }
      encoder_A_prev = encoder_A;}
    
    if(trig==2){
      if((!encoder_B)&&(encoder_A_prev)){
        LightLeft();
        Serial.println(brightness);
        if (brightness < 1){
          trig = 0; 
          brightness = 0;      
        }
      }
      encoder_A_prev = encoder_B;
    }
    if(trig==1){
      if((!encoder_A)&&(encoder_A_prev)){
        LightRight();
        
        if (brightness < 1){
          trig = 0;
          brightness = 0;
        }
      }
      encoder_A_prev = encoder_A;
    }
    
    myServo.write(servoAngle);
    loopTime = currentTime;
  }
}

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму