Панорамная головка на шаговых двигателях

Сергей Р
Offline
Зарегистрирован: 19.02.2016

Доброе время суток всем, решил собрать роботизированную панорамную головку для фото панорам. Нагрузка: фотик с объекивом -2,5кг., подчти собрал. Фотки сборки и работу головки потом выложу, если интересно. Подскажите пожалуйста, как упростить код, а именно, при получении какого либо сигнала с пульта включить не pin (4,5 и т.д), а запустить напрямую подпрограмму которая выполнит условие, а то pin-ов уже не хватает для других целей. Может код и наивный, но работает. Я толко учусь, и много чего ещё не знаю. Спасибо заранее, думаю не откажите в помощи.

Сергей Р
Offline
Зарегистрирован: 19.02.2016

#include <IRremote.h> 
#include <AccelStepper.h>

IRrecv irrecv(A0); // указываем пин, к которому подключен IR приемник
decode_results results;
AccelStepper Stepper1(1,9,8); 
AccelStepper Stepper2(1,11,10);
//eventTime, для паузы,  вместо delay,будем использовать функцию millis.
unsigned long eventTime = 0;
//индикация таймера
int timer = 13;

int steeps = 300; // количество шагов
long KNO1 = 0; // Исходное значение для таймера.
long KNO2 = 200; // 200 милисекунд предотвращения повторного нажатия
int dir = 1; //используется для смены направления

const int cntLoop = 10;       // Колличество циклов
const int ledPin = 3;        // Пин для подключения фото
const int timeLite = 1000;    // Длительность свечения светодиода
int step_etag = 410;          // Колличество этажей 406
int cnt_etag = 4;             // Колличество этажей
bool reverse = false;         // Текущее состояние реверса
int positionStepper1 = 0;     // Текущая позиция двигателя  1
int positionStepper2 = 0;     // Текущая позиция двигателя  2

void setup() {
 irrecv.enableIRIn(); // включить приемник
 pinMode(A0, INPUT); // пин A0 будет входом
 pinMode(4, OUTPUT);
 digitalWrite(4, HIGH);  //выкл 
 pinMode(5, OUTPUT);
 digitalWrite(5, HIGH);  //выкл
 pinMode(6, OUTPUT);
 digitalWrite(6, HIGH);  //выкл
 pinMode(7, OUTPUT);
 digitalWrite(7, HIGH);  //выкл 
 pinMode(timer, OUTPUT);
  pinMode(ledPin, OUTPUT); 
  digitalWrite(ledPin, LOW);
  
Stepper1.setMaxSpeed(500); //Задаём максимальную скорость двигателя1
Stepper1.setAcceleration(300); //устанавливаем ускорение (шагов/секунду^2)
Stepper1.setSpeed(20); // Установим скорость в шагах за секунду

Stepper2.setMaxSpeed(500); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
Stepper2.setAcceleration(300); //устанавливаем ускорение (шагов/секунду^2)
Stepper2.setSpeed(50); // Установим скорость в шагах за секунду   
 Serial.begin(9600);
}

void loop() 
{
  ////////////////////360/////////////////////////////
  while(cnt_etag > 0) 
    {    Serial.println(positionStepper1);
        Stepper1.runToNewPosition(positionStepper1);
        for(int i = 0; i < cntLoop; i++) {
           delay(timeLite); digitalWrite(ledPin, HIGH); delay(timeLite); digitalWrite(ledPin, LOW);delay(timeLite);
           Serial.println("foto");
            if(!reverse) positionStepper1 += 410; else positionStepper1 -= 410;
            Stepper1.runToNewPosition(positionStepper1);
             Serial.println(positionStepper1);
        }
        positionStepper2 += step_etag;
        Serial.println("etaj");
        Stepper2.runToNewPosition(positionStepper2);
        reverse =!reverse;
  Serial.println("REVERSE");
        cnt_etag--;
    }
//////////////пульт/////////////////////////////
  if (digitalRead(A0) == LOW)
    //  Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);
    eventTime = millis(), digitalWrite(timer, HIGH);
  //  Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)
  if (millis() - eventTime > 100) digitalWrite(timer, LOW);

  if (irrecv.decode(&results))
  {
    if (results.value == 2080 || results.value == 32 && (digitalRead(timer) == HIGH) )digitalWrite(4, LOW); //верх 2дв
    if (results.value == 2081 || results.value == 33 && (digitalRead(timer) == HIGH) )digitalWrite(5, LOW); //вниз 2дв
    if (results.value == 2065 || results.value == 17 && (digitalRead(timer) == HIGH) )digitalWrite(6, HIGH); //лево 1дв
    if (results.value == 2064 || results.value == 16 && (digitalRead(timer) == HIGH) )digitalWrite(7, HIGH); //право 1дв
    if (results.value == 2092 || results.value == 44 && (digitalRead(timer) == HIGH) )digitalWrite(6, HIGH), digitalWrite(7, HIGH), digitalWrite(5, HIGH), digitalWrite(4, HIGH); //меню- стоп
    //    if (results.value == 2104 || results.value == 56 && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH); //picture
    //    if (results.value == 2076 || results.value == 28 && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH); //calendar
    irrecv.resume();
    delay(50);
  }
///////////////////////////////////////////
    if(digitalRead(7)==0) //право
  {
    if(Stepper1.distanceToGo()==0)
   { 
     Stepper1.move(50*dir); //устанавливает следующее перемещение на n шагов 
     delay(200); 
   }
  }
///////////////////////////////////////
   if(digitalRead(6)==0)//лево
 {
   if(Stepper1.distanceToGo()==0)
  { 
    Stepper1.move(50*dir*(-1)); //устанавливает следующее перемещение на n шагов, -1 обратно
    delay(200); 
  }
 }
 //////////////////////////////////////////
     if(digitalRead(5)==0) //вниз
  {
    if(Stepper1.distanceToGo()==0)
   { 
     Stepper1.move(50*dir); //устанавливает следующее перемещение на n шагов 
     delay(200); 
   }
  }
///////////////////////////////////////
   if(digitalRead(4)==0)//верх
 {
   if(Stepper1.distanceToGo()==0)
  { 
    Stepper1.move(50*dir*(-1)); //устанавливает следующее перемещение на n шагов, -1 обратно
    delay(200); 
  }
 }
 //////////////////////////////////////////
Stepper1.run();
 delay(50);
}

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Сергей Р пишет:

а запустить напрямую подпрограмму которая выполнит условие, а то pin-ов уже не хватает...

напрямую == телепатически ?

Сергей Р
Offline
Зарегистрирован: 19.02.2016

Нет , не телепатически )). Почему то текст вырезался.
Можно как то, вместо digitalWrite(4, LOW);  что то условное, чтоб запустилось условие   if(digitalRead(4)==0)//верх. Может флаг или ещё чего?
А точней нажал на кнопку на пульте и включился шаг.двигатель с определёнными условиями. Так то всё работает, но pin-ов не хватает для других целей.

Сергей Р
Offline
Зарегистрирован: 19.02.2016

Может так?

Сергей Р
Offline
Зарегистрирован: 19.02.2016
if (results.value == 2080 || results.value == 32 && (digitalRead(timer) == HIGH)  //верх 2дв
{
   if(Stepper1.distanceToGo()==0)
  { 
    Stepper1.move(50*dir*(-1)); //устанавливает следующее перемещение на n шагов, -1 обратно
    delay(200); 
  } }
 

 

Сергей Р
Offline
Зарегистрирован: 19.02.2016

Это не возможно или я что не так спрашиваю? Помогите пожалуйста. Дайте наводку.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Сергей Р пишет:
Это не возможно или я что не так спрашиваю?

если ты переведёшь российское наречие русского языка на литературный язык, например Чехова, то я смогу тебе помочь - иначе, нихт фернштейн, рашен абориген.

Сергей Р
Offline
Зарегистрирован: 19.02.2016

Я просто спросил, а все молчат. Может не так спросил? Или язык вопроса нужен специальный для таких как ты?

Сергей Р
Offline
Зарегистрирован: 19.02.2016

Без обид.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Сергей Р, лично я вообще не понял, что Вы хотите.

Попытайтесь сформулировать вопрос как-то иначе.

Собственно, 3 наводящих вопроса:

1. Что именно Вы хотите сделать?

2. Что именно получается на данный момент?

3. Чем первое отличается от второго?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Сергей Р пишет:
Или язык вопроса нужен специальный для таких как ты?

если не можешь сформулировать мисль на русском языке, то можно на украинском - мне без разницы.