Официальный сайт компании Arduino по адресу arduino.cc
Прошу помощи со скетчем
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 29/05/2019 - 21:09
Здравствуйте!
Пытаюсь запрограммировать работу вибромоторов в зависимости от нажатия двух кнопок.
Первая кнопка - просто дребезжат, не останавливаясь. Вторая кнопка - вибрация плавно доходит до максимума, а потом затухает.
У меня, к сожалению, почему то не получается сделать зацикленный второй режим. Вибрация доходит до максимума и дальше на этом же максимуме дребезжит.
Ниже прикреплю код. Помогите, пожалуйста, найти ошибку! Или , что вероятнее всего, я что-то не догоняю в работе с кнопками, может подскажете. Взял пример из библиотеки OneButton
#include "OneButton.h" OneButton button1(A1, true); OneButton button2(A2, true); int motPin1 = 5; int motPin2 = 6; int motPin3 = 9; int motPin4 = 10; void setup() { pinMode(motPin1, OUTPUT); pinMode(motPin2, OUTPUT); pinMode(motPin3, OUTPUT); pinMode(motPin4, OUTPUT); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.println("Starting TwoButtons..."); // link the button 1 functions. button1.attachClick(click1); button1.attachDoubleClick(doubleclick1); // link the button 2 functions. button2.attachClick(click2); button2.attachDoubleClick(doubleclick2); } void loop() { // keep watching the push buttons: button1.tick(); button2.tick(); delay(10); } void click1() { Serial.println("Button 1 click."); analogWrite(motPin1, 255); analogWrite(motPin2, 255); analogWrite(motPin3, 255); analogWrite(motPin4, 255); } // click1 // This function will be called when the button1 was pressed 2 times in a short timeframe. void doubleclick1() { Serial.println("Button 1 doubleclick."); analogWrite(motPin1, 0); analogWrite(motPin2, 0); analogWrite(motPin3, 0); analogWrite(motPin4, 0); } // doubleclick1 void click2() { Serial.println("Button 2 click."); for (int i=0; i <= 255; i++){ analogWrite(motPin1, i); analogWrite(motPin2, i); analogWrite(motPin3, i); analogWrite(motPin4, i); delay(10); } } void doubleclick2() { Serial.println("Button 2 doubleclick."); analogWrite(motPin1, 0); analogWrite(motPin2, 0); analogWrite(motPin3, 0); analogWrite(motPin4, 0); }
Начать тут нужно с другого: определиться как предполагается вписать этот фрагмент в остальной код. Например, то что Вы написали сейчас в click2() заблокирует процесс. Невозможно будет ни работать с MPU-шкой, ни прервать вибрацию.
Нет, МПУшку я на другую ардуинку цепляю. Решил разделить две функции, чтобы было меньше волокиты. Все равно портативного прибора тут не получишь.
Я думал, что сделал так:
1 клик на первую кнопку включает первый режим работы. двойное нажатие на первую кнопку выключает первый режим.
1 клик на вторую кнопку включает второй режим, двойное - выключает его.
Я пытался настроить с одной кнопкой, но там проблем было больше. Здесь все работает, но описанная выше проблема только присутствует.
может и дилдо
в любом случае без второго режима работы даже дилдо получится плохим.
Ну, т.е. вибрация не будет поставлена в прямую зависимость от частоты тремора? Т.е. управление всегда ручное будет?
Да, совершенно верно! Я решил, что в первой версии исследований будет именно так. Я буду в ручную менять параметры вибрации. Если я сейчас буду все объединять, то я половину лета проведу с железками. А такой карт бланш на время у меня , к сожалению, нет. Поэтому к объединению двух функций вернусь осенью, там вроде нас пошлюс к студентам технарям, которые будут с нами работать. А пока хочу собрать данных на пациентах
Позже закажу драйвера на моторчики, там вроде как можно различные виды импульсов на моторы посылать.
Ну, вот я накидал на коленке. В парадигме OneButton мне неудобно (я её первый раз вижу), так что можно было и покрасивее, конечно. Не компилировал, на железе не проверял, просто проиллюстрировал способ управления.
Здравствуйте! Прошу прощения, что пропал на эти дни.
Кинул Ваш код в Ардуино ИДЕ, вставил свои данные в инт и войд сэтап
Но при компиляции выдает ошибку "exit status 1 expected unqualified-id before 'case'", при этом выделяется первая строчка case START_MODE_01 11
Сорри, это я накопипастил, конечно, в ночи.
Должно быть:
И, естественно, с первоначального скетча все эти OneButton, attachClick() надо перетащить.
ну, теперь похоже пошло мое непонимание программирования.
перетащил,что сказали и ошибки выдает, подсвечивая войд сетап. типа в аттачах я написал то, чего нет в коде, как я понял
Всё правильно компилятор говорит.
Вы посылаете attachClick() за йодом (функция click1), а на складе только зелёнка - buttonMode01Click. Говорите attachDoubleClick() накладывать гипс (doubleclick1), а его нет в наличии.
Я попытался написать так, чтобы Вы смогли проследить логику действий, руководствуясь именами функций и переменных. Но в компилятор исходник не засовывал. Сейчас вот ещё вижу, что написал ещё changeMotorsSpeed(), а вызываю changeMotorSpeed(). Так что придётся посидеть ещё Вам над исходником.
с йодом и зеленкой понял, вроде поправил. теперь ругается на buttonMode01.tick(); buttonMode02.tick();
Эти две команды из моего исходника перекинуть?
Та же самая история: объявили OneButton button1(..), зааттачили button1.attachClick(), т.е. и tick() надо вызывать у button1. Или имя объекту везде поменять на buttonMode01.
Дайте ж я Вас расцелую!!! Работает) Единственное что, на двойной клик вторая кнопка не реагирует. Если с кодом все ок, то ладно. буду останавливать первой кнопкой
А... ну я-то с чего-то решил, что надо делать так: первое нажатие на кнопку запускает соотв. режим, второе (либо первое на другую кнопку) - останавливает. Поэтому даблклики не включал в свою версию.
все, понял теперь! значит пока буду делать так)) ничего страшного) Огромное спасибо Вам!