Панорамная головка на шаговых двигателях
- Войдите на сайт для отправки комментариев
Втр, 14/11/2017 - 02:43
Доброе время суток всем, решил собрать роботизированную панорамную головку для фото панорам. Нагрузка: фотик с объекивом -2,5кг., подчти собрал. Фотки сборки и работу головки потом выложу, если интересно. Подскажите пожалуйста, как упростить код, а именно, при получении какого либо сигнала с пульта включить не pin (4,5 и т.д), а запустить напрямую подпрограмму которая выполнит условие, а то pin-ов уже не хватает для других целей. Может код и наивный, но работает. Я толко учусь, и много чего ещё не знаю. Спасибо заранее, думаю не откажите в помощи.
#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); }а запустить напрямую подпрограмму которая выполнит условие, а то pin-ов уже не хватает...
напрямую == телепатически ?
Нет , не телепатически )). Почему то текст вырезался.
Можно как то, вместо digitalWrite(4, LOW); что то условное, чтоб запустилось условие if(digitalRead(4)==0)//верх. Может флаг или ещё чего?
А точней нажал на кнопку на пульте и включился шаг.двигатель с определёнными условиями. Так то всё работает, но pin-ов не хватает для других целей.
Может так?
if (results.value == 2080 || results.value == 32 && (digitalRead(timer) == HIGH) //верх 2дв { if(Stepper1.distanceToGo()==0) { Stepper1.move(50*dir*(-1)); //устанавливает следующее перемещение на n шагов, -1 обратно delay(200); } }Это не возможно или я что не так спрашиваю? Помогите пожалуйста. Дайте наводку.
если ты переведёшь российское наречие русского языка на литературный язык, например Чехова, то я смогу тебе помочь - иначе, нихт фернштейн, рашен абориген.
Я просто спросил, а все молчат. Может не так спросил? Или язык вопроса нужен специальный для таких как ты?
Без обид.
Сергей Р, лично я вообще не понял, что Вы хотите.
Попытайтесь сформулировать вопрос как-то иначе.
Собственно, 3 наводящих вопроса:
1. Что именно Вы хотите сделать?
2. Что именно получается на данный момент?
3. Чем первое отличается от второго?
если не можешь сформулировать мисль на русском языке, то можно на украинском - мне без разницы.