Помощь в программировании

Помогите пожалуйста 🥺

Нужно соединить два простых кода в один

1 код кнопки тригера

2 код управление двигателем.

Имею Digispark ATtiny85 в нем 0 и 1 пин идут на драйвер двигателя DRV8833. Пин 2 на кнопку и на землю.

Задача по нажатию кнопки запустить двигатель на 10 секунд в одну сторону, потом пауза 3 секунды и снова запуск двигателя в обратную сторону на 10 секунд. И так повтор до тех пор пока не нажмется кнопка. ( двигатель запускается в одно направление путем подачи сигналов low и high соответственно пинам 0 и 1, а в обратную high и low соответственно пинам 0 и 1. Остановка двигателя это low и low на пинах 0 и 1.

Не понимаю как именно сделать цикл при включении. С помощью while или loops. Помогите пожалуйста. Я только учусь.

Лига программистов

2.3K постов12K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

Все просто. Заведи переменную состояния двигателя (их у тебя три) в начале проги состояние ноль (выкл). Дальше в цикле проверяешь состояние и включаешь выходы по нему. Дальше там же проверяешь кнопку и меняешь состояние если она нажать. Ну и считаешь время и меняешь состояние.... Всё!

А, не забудь ещё дребезг контактов обработать программно или аппаратно.

раскрыть ветку (18)
0
Автор поста оценил этот комментарий

const int buttonPin = 3;   // Пин кнопки


int state = 0;   // Переменная состояния


void setup()


{


  //Установите контакты 0 и 1 в качестве выходов для драйвера двигателя DRV8833


  pinMode(0, OUTPUT);


  pinMode(1, OUTPUT);


  pinMode(buttonPin, INPUT);


}


void loop()

  if (digitalRead(buttonPin) == HIGH) {   // Если кнопка нажата

    state = !state;   // Инвертируем состояние

    if (state == HIGH)

{


  //Установите контакты мотора прямое направление


  digitalWrite(0, HIGH);


  digitalWrite(1, LOW);


  //Ждем 3 сек работы


  delay(3000);


  //мотор выключаем


  digitalWrite(0, LOW);


  digitalWrite(1, LOW);


  //Ждем 3 сек паузы


  delay(3000);


  //Установите контакты мотора обратное направление


  digitalWrite(0, LOW);


  digitalWrite(1, HIGH);


  //Ждем 3 сек работы


  delay(3000);


  //мотор выключаем


  digitalWrite(0, LOW);


  digitalWrite(1, LOW);


  //Пауза до следующего повтора цикла 5 сек


  delay(5000);


}

Вот что смог, но он не компилируется ( синтаксические ошибки вероятно 🤷‍♂️

раскрыть ветку (17)
1
Автор поста оценил этот комментарий

но он не компилируется

Это не страшно. Хуже то, что оно не соответствует ТЗ. У вас мотор включится, а выключиться сможет только в момент окончания цикла. Челу надо чтобы в любой момент можно было выключить эти фрикции..


На свежую голову - я бы еще изучил битовые функции и управление мотором и состояние сделал бы одной переменной (0 - выкл, 1 - вкл, 2 - реверс. Побитно 00, 01 и 10 соответственно, т.е. переменную можно напрямую в порт пихать. Красиво и изящно)

Итого две переменные - на состояние и переменную с подсчетом времени (на реверс).


Если не лень будет - вечером накидаю скетч (как раз давно не занимался - глядишь заодно и от деменции убегу не на долго). Ща некогда просто.

раскрыть ветку (16)
0
Автор поста оценил этот комментарий

Спасибо Вам большое 😊🤝

раскрыть ветку (15)
1
Автор поста оценил этот комментарий

(на работоспособность естественно не проверял. Хотя можно было загнать в эмулятор)


const int mPinL = 0; // Пин мотора влево

const int mPinR = 1; // Пин мотора вправо

const int bPin = 2; // Пин кнопки - не забыть подтянуть кнопку резистором к +питанию!

int s = 0; // Переменная состояния: 0 - мотор выкл, 1 - мотор влево, 2 - пауза мотора после левого хода, 3 - мотор вправо, 4 - пауза мотора после хода вправо

long t = 0; // хранит время для хода и паузы

int w = 10000; // Время работы в одну сторону, миллисекунды

int p = 3000; // Время паузы между реверсом, миллисекунды

void setup() {

pinMode(mPinL, OUTPUT);

pinMode(mPinR, OUTPUT);

pinMode(bPin, INPUT);

}

void loop()

{

// дергаем мотор. не стал заморачиваться с битами - сам сделай если захочешь

switch (s)

{

case 1:

digitalWrite(mPinR, LOW); // Сначала выключаем правй пин - на случай если мотор ехал вправо, чтобы не было ситуации когда оба пина подняты (не знаю что при этом с твоим драйвером будет, но лучше не рисковать)

digitalWrite(mPinL, HIGH);

break;

case 3:

digitalWrite(mPinL, LOW); // то же самое про опускание, только левый

digitalWrite(mPinR, HIGH);

break;

default : //во всех остальных случаях просто выключаем мотор (т.е. при нуле и при паузах)

digitalWrite(mPinL, LOW);

digitalWrite(mPinR, LOW);

break;

}

// Проверяем кнопку

if (digitalRead(bPin) == LOW) // Если нажата

{

delay (50); // Ждем 50мс от дребезга. Если не поможет 50 - увеличить, или использовать стороннюю библиотеку против дребезга (+ конденсатор керамику на контакты кнопки)

if (digitalRead(bPin) == LOW) // Если все еще нажата, значит не дребезг

{

if (s=0)

{

s = 1; //если был выкл, то вкл

t = millis() + w; // Запоминаем время для переключения

}

else {s = 0;} //если был вкл, то выкл

}

}

//Проверяем время

if (millis() > t //Прошло больше заданного секунд

&& s !=0 //И мотор не выкл

)

{

switch (s)

{

case 1: // работал влево

s = 2; //меняем состояние

t = millis() + p; // Запоминаем время для паузы

break;

case 2: // стоял на паузе после лев

s = 3; //меняем состояние на прав

t = millis() + w; // Запоминаем новое время работы

break;

case 3: // работал вправо

s = 4; //меняем состояние

t = millis() + p; // Запоминаем время для паузы

break;

case 4: // стоял на паузе после прав

s = 1; //меняем состояние на лев

t = millis() + w; // Запоминаем новое время работы

break;

default:

break;

}

}

lbl: // метка для цикла ожидания когда отпустят кнопку.

if (digitalRead(bPin) == LOW) // ждем когда отпустят кнопку, иначе если будет нажата кнопка все время - мотор будет дергаться вкл-выкл

{

delay(50); //дребезг типа

if (digitalRead(bPin) == LOW)

{

delay (100);

goto lbl; // goto некрасиво, но для while пришлось бы заводить еще одну переменную.

}

}

}

раскрыть ветку (13)
0
Автор поста оценил этот комментарий

Это виндер для подзаводки механических часов

0
Автор поста оценил этот комментарий

Спасибищееее огромнейшее 🙏

раскрыть ветку (11)
0
Автор поста оценил этот комментарий

Завтра буду пробовать. Сегодня устал воровать асфальтную крошку целый день 🤣

раскрыть ветку (6)
0
Автор поста оценил этот комментарий

У меня в эмуляторе скомпилировалось, но, ожидаемо, не работает :)

Причем не пойму что именно - такое впечатление что я с пинами налажал.

Ща поковыряюсь еще чуть - если получится - прямо из эмулятора код заберешь после проверки. Если нет (тоже за сегодня упахался уже) - завтра еще на свежую голову посмотрю.

0
Автор поста оценил этот комментарий

В общем заработало, но дребезг окончательно не победил (надо попробовать больше задержку ставить. А лучше - аппаратно его давить)

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Есть небольшой проблем - pincode(bPin, INPUT_PULL-UP);

При загрузке или при компиляции упирается в него. Was not declared in this scope

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Если убрать пулап то компилируется. Надо просто резюк подтянуть и все? Пулап можно пропустить?

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Да, пуллап это программный заменитель резюка.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

в этом варианте косяк: вместо

if (s=0)

должно быть

if (s==0)

Но лучше взять вариант из эмулятора (по ссылке) - там антидребезг получше

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Нет слов 😲 для меня получился космос 🤔 такого кода я сам не напишу 😒 спасибо вам огромнейшее 🙏.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Ой да не надо себя принижать. Вы на 10 лет моложе меня, а я как раз 10 лет назад впервые занялся ардуинами :)

Хотя у меня тоже синдром самозванца прогрессирует прям.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Тема интересная, времени не хватает, хотя и работаю сам на себя. Вот такой парадокс 😁

0
Автор поста оценил этот комментарий

Закинул в эмулятор. Только блин они его теперь платным сделали -бесплатно компиляцию не дождался (якобы сервер занят). Если дождешься - то проверишь. Вместо драйвера мотора я приделал светодиоды - горит тот, в какую сторону мотор включен.


Для кнопки там можно включать дребезг (для первого запуска лучше выключить его)


https://wokwi.com/projects/474424991039771649

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества