Верните направляющую для укладки фотографий в начало
В изоляции (73 года) и пытаюсь вернуть мою направляющую для укладки макрофотографий в исходное положение без концевого выключателя. Я знаю количество пройденных шагов, так что это просто вопрос реверсирования двигателя. Мой код (скопированный и вставленный с других сайтов) работает как сон (10 шагов, запуск триггера ИК-камеры) и продолжается до тех пор, пока я не захочу вернуться (строка 73), сделав 100 снимков или шагов, сколько я хочу - нет проблем.
Я запустил цикл возврата пустоты (и прервал цикл), но код меня поразил. Я прикрепил свой код (может выглядеть ужасно, но он работает). Может ли кто-нибудь помочь этому старику и дать мне код для 1000 шагов против часовой стрелки?
Спасибо, ребята Дэвид
[code]
#include <AccelStepper.h>
#include <MultiStepper.h>
int smDirectionPin = 2; //Направляющий штифт
int smStepPin = 3; //Шаговый штифт
int Distance = 0; // записывает количество пройденных нами шагов
byte numRepeats = 0;
byte maxRepeats = 100;
int smFirePin = 13; // Триггерный штифт
#define fire 13
void setup(){
/*Sets all pin to output; the microcontroller will send them(the pins) bits, it will not expect to receive any bits from thiese pins.*/
pinMode(2, OUTPUT); //Указатель направления
pinMode(3, OUTPUT); //Шаговый пин
pinMode(13, OUTPUT); // светодиодный контакт
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(13,LOW);
pinMode(smDirectionPin, OUTPUT);
pinMode(smStepPin, OUTPUT);
Serial.begin(9600); //Открываем последовательное соединение для отладки
}
void loop(){
if (numRepeats < maxRepeats) {
move1Step();
Distance = Distance + 1; //запишите этот шаг, чтобы увидеть, подошли ли мы к концу нашего хода
if (Distance == 10)
{
if (digitalRead(2) == LOW)
{
digitalWrite(2 , LOW);
}
else
{
digitalWrite(2, LOW);
}
Distance = 0;
numRepeats ++;
delay(3000);
{
trigger();
}
}
}
}
void move1Step() {
digitalWrite(3, HIGH);
delayMicroseconds(750);
digitalWrite(3, LOW);
delayMicroseconds(750);
}
// Включите цепь ИК-триггера, чтобы запустить камеру
void trigger()
{
delay(1000); // ждем, пока уляжется вибрация
digitalWrite(fire, HIGH); // сделать снимок
delay(2000); // ждем, пока это произойдет
digitalWrite(fire, LOW); // снова отключаем ИК-цепь
}
// Вперед двигатель на один шаг
void step()
{
digitalWrite(step, HIGH); //Активировать на один шаг вперед
delay(1);
digitalWrite(step, LOW); // Потяните ступенчатый штифт в низкий уровень, чтобы его можно было запустить снова
delay(1);
}
void return();
{
digitalWrite(smDirectionPin, HIGH);
/*Slowly turns the motor 1600 steps*/
for (int i = 0; i <200; i++){
digitalWrite(smStepPin, HIGH);
delayMicroseconds(700);
digitalWrite(smStepPin, LOW);
delayMicroseconds(700);
}
while(1) { }
}
[/code]
@Tazdave, 👍0
Обсуждение1 ответ
Лучший ответ:
Я немного подчистил ваш код. Удалены повторяющиеся и неиспользуемые коды. Я использовал цикл for
, чтобы выполнить 100 повторений.
Не стесняйтесь, дайте мне знать, если у вас возникнут дополнительные вопросы или что-то неясно.
// Вы не используете эти библиотеки, поэтому я их закомментировал
//#include <AccelStepper.h>
//#include <MultiStepper.h>
int smDirectionPin = 2; //Направляющий штифт
int smStepPin = 3; //Шаговый штифт
int smFirePin = 13; // Триггерный штифт
byte maxRepeats = 100;
void setup()
{
/*Sets all pin to output; the microcontroller will send them(the pins) bits, it will not expect to receive any bits from thiese pins.*/
pinMode(smDirectionPin, OUTPUT); //Указатель направления
pinMode(smStepPin, OUTPUT); //Шаговый пин
pinMode(smFirePin, OUTPUT); // Файр контакт
digitalWrite(smDirectionPin, LOW);
digitalWrite(smStepPin, LOW);
digitalWrite(smFirePin,LOW);
Serial.begin(9600); //Открываем последовательное соединение для отладки
}
void loop()
{
digitalWrite(smDirectionPin, LOW); // настроить шаговый двигатель на движение вперед
for( byte i=0; i<maxRepeats; i++ ) // выполнить следующий раздел 100 раз
{
// переходим на 10 шагов вперед
for( byte j=0; j<10; j++ )
{
move1Step();
}
// ждем и делаем фото
delay(3000);// в функции `trigger` уже есть задержка, так что этот лайк можно убрать
trigger();
}
// вернуть шаговый двигатель в исходное положение
digitalWrite(smDirectionPin, HIGH); // устанавливаем шаговый двигатель для работы в обратном направлении
for( byte i=0; i<maxRepeats; i++ ) // выполнить следующий раздел 100 раз
{
// переходим на 10 шагов назад
for( byte j=0; j<10; j++ )
{
move1Step();
}
}
// Ничего не делать
while(1){ }
}
void move1Step()
{
digitalWrite(smStepPin, HIGH);
delayMicroseconds(750);
digitalWrite(smStepPin, LOW);
delayMicroseconds(750);
}
// Включите цепь ИК-триггера, чтобы запустить камеру
void trigger()
{
delay(1000); // ждем, пока уляжется вибрация
digitalWrite(smFirePin, HIGH); // сделать снимок
delay(2000); // ждем, пока это произойдет
digitalWrite(smFirePin, LOW); // снова отключаем ИК-цепь
}
Gerben, последую вашему совету по удалению задержки, вы должны опубликовать это, многие в микрофотографии будут благодарны, работает как шарм. Фантастика., @Tazdave
Если вы удалите задержку, возможно, вам придется увеличить задержку (1000). В настоящее время он ждет 4 секунды, чтобы предотвратить любое движение от вибрации. Вы должны увидеть, насколько короткими могут быть значения, или просто быть немного терпеливее. Рад, что это помогло вам., @Gerben
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Как я могу прервать задержку() при нажатии кнопки?
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Как установить управляющий регистр в модуле RTC DS3231 для Arduino UNO R3?
- Как повторить другое действие внутри цикла?
- Клиент веб-сокета Arduino CC3000
такой код не имеет смысла...
if (digitalRead(2) == LOW) { digitalWrite(2, LOW); } иначе { digitalWrite(2, LOW); }
... весь этот блок можно заменить наdigitalWrite(2, LOW);
, @jsotolareturn
— это зарезервированное слово, поэтому вам следует переименовать функцию, например, вreturnHome
. Вам также необходимо удалить;
в конце этой строки кода., @GerbenПлюс ваш отступ - беспорядок. Выберите стиль отступа, а затем неукоснительно следуйте ему. Так как код довольно трудно читать., @Duncan C
Gerben предоставил решение, ваше замечание было принято к сведению, спасибо, @Tazdave