Електроника и Електротехника | Electronics and Electrical Engineering > Аналогово управление | Analog Control

Arduino за стрелки

<< < (11/38) > >>

mitko0888:
Потъмненият код:
pos = pos == straight ? divergent: straight;
означава:

Ако pos е равно на straight, тогава pos става равно на divergent, иначе pos става равно на straight;

все едно имаш:
if (pos == straight)
    pos = divergent
else
    pos = straight

или казано на друг език:

if (a > b) {
    result = x;
} else {
    result = y;
}

може да се запише като:

result = a > b ? x : y;

pavel75:
Благодарско, много разбираемо обяснение.
 :drinks:

mitko0888:
Само да вметна: ако ще използваш готов код, а няма да си го пишеш сам, ето едно руско творение за три машинки с три бутона и едновременна работа, със запомняне във флеша. И със светодиоди. По добре почни от него, а не от началото.

говорил один мой знакомый: "Это баг, которы вовсе не баг, потому что в скрипах все правильно".
Грешу на сервы...
Сори, комменты кривые, особенно с реверсом, но думаю мысль понятна. Смысл тот же, что у местного ServoMotion.

Код:
//подключаемые библиотеки
#include <EEPROM.h>
#include <Bounce2.h>
#include <Servo.h>

//переменные конфигурации
int servoAngles[][2]={{0,90},{0,90},{0,90}}; // углы отклонения сервоприводов {"прямо", "в бок"}
byte servoReverce[]={0,0,0}; //реверс углов сервоприводов (если в положении "прямо" угол задан во втором элементе предыдущего массива, то поставить 1.)
int servoSpeed[]={10,10,10}; //скорость вращения сервопривода. указано количество миллисекунд поаорота на 1 градус

//переменные определяюще ножки подключения
int normalLed[]={8,10,12}; //ножки подключения светодиода показывающего прямое положение стрелки
int routeLed[]={9,11,13}; //ножки подключения светодиода показывающего положение стрелки "в бок"
int servoPins[]={3,5,6}; //ножки подключения провода управления сервопривода
int buttonPins[]={2,4,7}; //ножки подключения кнопок переключения

//переменные используемые при повороте сервопривода
byte CurrentPosition[]={0,0,0}; //текущее положение сервопривода. 0=прямо, 1=в бок.
int currentAngle[]={0,0,0};//текущий угол поворота сервопривода
unsigned long nextTime[]={0,0,0};// время следующего поворота на 1 градус
unsigned long currentTime; //текущее время
byte dir;// направление поворота сервопривода

//объекты сервоприводов и антидребезка кнопок
const int servos=sizeof(servoPins)/sizeof(int);
Servo servoServos[servos];
Bounce servoBouncer[servos];

void setup() {
  for(int i=0;i<servos;i++){
    pinMode(buttonPins, INPUT);
    servoBouncer = Bounce();
    servoBouncer.attach(buttonPins);
    servoBouncer.interval(5);
    pinMode(normalLed, OUTPUT);
    pinMode(routeLed, OUTPUT);
    if(EEPROM.read(i) > 1){
      EEPROM.update(i,0);
    }
    CurrentPosition=EEPROM.read(i);
    digitalWrite(normalLed, !CurrentPosition);
    digitalWrite(routeLed, CurrentPosition);
    servoServos.attach(servoPins);
    if(servoReverce){
      servoServos.write(servoAngles[!CurrentPosition]);
      currentAngle=servoAngles[!CurrentPosition];
    }
    else {
      servoServos.write(servoAngles[CurrentPosition]);
      currentAngle=servoAngles[CurrentPosition];
    }
  }
  delay(1000);
  for(int i=0;i<servos;i++){
    servoServos.detach();
  }
}

void loop() {
  currentTime=millis();
  for(int i=0;i<servos;i++){
    if(nextTime>0 && nextTime<currentTime){
      if(currentAngle>=servoAngles[0] && currentAngle<=servoAngles[1]){
        nextTime=currentTime+servoSpeed;
        if(servoReverce){
          dir=!CurrentPosition;
        }
        else {
          dir=CurrentPosition;
        }
        if(dir){
          currentAngle++;
        }
        else {
          currentAngle--;
        }
        if(servoAngles[1]/currentAngle == 2 || servoAngles[1]/currentAngle == 2.5 ){
          digitalWrite(normalLed, !CurrentPosition);
          digitalWrite(routeLed, CurrentPosition);
        }
        servoServos.write(currentAngle);
      }
      else{
        nextTime=0;
        servoServos.detach();
      }
    }
    if(servoBouncer.update()){
      if(servoBouncer.read()==LOW){
        CurrentPosition=!CurrentPosition;
        EEPROM.update(i,CurrentPosition);
        nextTime=currentTime;
        if(servoReverce){
          currentAngle=servoAngles[CurrentPosition];
        }
        else {
          currentAngle=servoAngles[!CurrentPosition];
        }
        servoServos.attach(servoPins);
      }
    }
  }
}

И клипче как работи: https://www.youtube.com/watch?v=akvCsXheF6A

В тмоя код не виждам къде превиш detach ...

pavel75:

--- Цитат на: mitko0888 link=topic=4987.msg109426#msg109426 date=1509711915 ---Само да вметна: ако ще използваш готов код, а няма да си го пишеш сам, ето едно руско творение за три машинки с три бутона и едновременна работа, със запомняне във флеша. И със светодиоди. По добре почни от него, а не от началото.

говорил один мой знакомый: "Это баг, которы вовсе не баг, потому что в скрипах все правильно".
Грешу на сервы...
Сори, комменты кривые, особенно с реверсом, но думаю мысль понятна. Смысл тот же, что у местного ServoMotion.

Код:
//подключаемые библиотеки
#include <EEPROM.h>
#include <Bounce2.h>
#include <Servo.h>

//переменные конфигурации
int servoAngles[][2]={{0,90},{0,90},{0,90}}; // углы отклонения сервоприводов {"прямо", "в бок"}
byte servoReverce[]={0,0,0}; //реверс углов сервоприводов (если в положении "прямо" угол задан во втором элементе предыдущего массива, то поставить 1.)
int servoSpeed[]={10,10,10}; //скорость вращения сервопривода. указано количество миллисекунд поаорота на 1 градус

//переменные определяюще ножки подключения
int normalLed[]={8,10,12}; //ножки подключения светодиода показывающего прямое положение стрелки
int routeLed[]={9,11,13}; //ножки подключения светодиода показывающего положение стрелки "в бок"
int servoPins[]={3,5,6}; //ножки подключения провода управления сервопривода
int buttonPins[]={2,4,7}; //ножки подключения кнопок переключения

//переменные используемые при повороте сервопривода
byte CurrentPosition[]={0,0,0}; //текущее положение сервопривода. 0=прямо, 1=в бок.
int currentAngle[]={0,0,0};//текущий угол поворота сервопривода
unsigned long nextTime[]={0,0,0};// время следующего поворота на 1 градус
unsigned long currentTime; //текущее время
byte dir;// направление поворота сервопривода

//объекты сервоприводов и антидребезка кнопок
const int servos=sizeof(servoPins)/sizeof(int);
Servo servoServos[servos];
Bounce servoBouncer[servos];

void setup() {
  for(int i=0;i<servos;i++){
    pinMode(buttonPins, INPUT);
    servoBouncer = Bounce();
    servoBouncer.attach(buttonPins);
    servoBouncer.interval(5);
    pinMode(normalLed, OUTPUT);
    pinMode(routeLed, OUTPUT);
    if(EEPROM.read(i) > 1){
      EEPROM.update(i,0);
    }
    CurrentPosition=EEPROM.read(i);
    digitalWrite(normalLed, !CurrentPosition);
    digitalWrite(routeLed, CurrentPosition);
    servoServos.attach(servoPins);
    if(servoReverce){
      servoServos.write(servoAngles[!CurrentPosition]);
      currentAngle=servoAngles[!CurrentPosition];
    }
    else {
      servoServos.write(servoAngles[CurrentPosition]);
      currentAngle=servoAngles[CurrentPosition];
    }
  }
  delay(1000);
  for(int i=0;i<servos;i++){
    servoServos.detach();
  }
}

void loop() {
  currentTime=millis();
  for(int i=0;i<servos;i++){
    if(nextTime>0 && nextTime<currentTime){
      if(currentAngle>=servoAngles[0] && currentAngle<=servoAngles[1]){
        nextTime=currentTime+servoSpeed;
        if(servoReverce){
          dir=!CurrentPosition;
        }
        else {
          dir=CurrentPosition;
        }
        if(dir){
          currentAngle++;
        }
        else {
          currentAngle--;
        }
        if(servoAngles[1]/currentAngle == 2 || servoAngles[1]/currentAngle == 2.5 ){
          digitalWrite(normalLed, !CurrentPosition);
          digitalWrite(routeLed, CurrentPosition);
        }
        servoServos.write(currentAngle);
      }
      else{
        nextTime=0;
        servoServos.detach();
      }
    }
    if(servoBouncer.update()){
      if(servoBouncer.read()==LOW){
        CurrentPosition=!CurrentPosition;
        EEPROM.update(i,CurrentPosition);
        nextTime=currentTime;
        if(servoReverce){
          currentAngle=servoAngles[CurrentPosition];
        }
        else {
          currentAngle=servoAngles[!CurrentPosition];
        }
        servoServos.attach(servoPins);
      }
    }
  }
}

И клипче как работи: https://www.youtube.com/watch?v=akvCsXheF6A

В тмоя код не виждам къде превиш detach ...

--- Край на цитат ---

Малеееее, ти ме разби. Аз още се уча да различавам променлива от функция
Тук виждам нови за мен неща като - int normalLed[]={8,10,12};
До сега за мен декларирането беше int normalLed=8.
Сега тия скоби и нещата в тях ме хвърляш в оркестъра. Ама ще продължавам да чета.
Благодаря още веднъж.

mitko0888:

--- Цитат на: pavel75 link=topic=4987.msg109427#msg109427 date=1509712511 ---Малеееее, ти ме разби. Аз още се уча да различавам променлива от функция
Тук виждам нови за мен неща като - int normalLed[]={8,10,12};
До сега за мен декларирането беше int normalLed=8.
Сега тия скоби и нещата в тях ме хвърляш в оркестъра. Ама ще продължавам да чета.
Благодаря още веднъж.

--- Край на цитат ---

Нали са до три машинки - 0, 1 и 2

int normalLed[]={8,10,12};

все едно че имаш
normalLed[0]=8;
normalLed[1]=10;
normalLed[2]=12;

Навигация

[0] Списък на темите

[#] Следваща страница

[*] Предходна страница

Премини на пълна версия