Помогите дописать скетч
- Войдите на сайт для отправки комментариев
Всем здравствуйте!
Прошу дописать/исправить/оптимизировать скетч. Скетч раньше крутил один мотор теперь нужно крутить два плюс добавляется функционал. Попытался задачу решить самостоятельно, но ничего не получилось, только мусора в код понаписывал.
Заранее благодарю!
Оборудование: ардуино Nano, LCD шилд с кнопками, два драйвера DRV8825, два биполярных мотора.
Необходимые условия функционала:
1. Мотор1 должен шагать по таймеру точно с заданными задержками, параллельные процессы не должны влиять на стабильность его работы.
2. При остановке мотора(-ов) отключать драйвер, что бы не грелись моторы и не садили батарею.
3. Нажатие на кнопку 4 запускает мотор1 с заданным периодом motorPeriod_1, повторное нажатие останавливает его.
4. Нажатие и удержание кнопки 3 при работающем моторе1 плавно (~5сек.) уменьшает значение motorPeriod_1 до значения motorForward, после отпускания кнопки вернуть (не плавно) прежнее значение motorPeriod_1.
5. Кнопка 0 задаёт режим работы кнопок 1 и 2. Режим 1 «Focus» (по умолчанию), режим 2 «Mod». Режимы циклически сменяют друг друга по каждому нажатию кнопки 0.
6. При выбранном режиме 1 «Focus» кнопки 0, нажатие и удержание кнопки 1 крутит мотор2 с периодом motorPeriod_2, отпускание останавливает мотор2, аналогично для кнопки 2 только мотор2 должен крутиться в противоположную сторону.
При выбранном режиме 2 «Mod» кнопки 0, однократное нажатие кнопок 1 и 2 увеличивает и уменьшает соответственно значение motorPeriod_1 на величину motorMod, при нажатии и удержании кнопок 1 и 2 выполнять действие циклически с небольшой задержкой. Значение motorPeriod_1 не должно принимать значение меньше motorForward.
7. На дисплее надо отображать в первой строке текущее состояние мотора1 (Run/Stop) и режим кнопки 0 (Focus/Mod), во второй строке текущее значение motorPeriod_1 «Speed (значение)».
Скетч:
#include <TimerOne.h> #include <LiquidCrystal.h> int NUM_KEYS = 5; LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); int adc_key_val[5] = {50, 200, 400, 600, 800}; int dirPin_1 = 3; //motor1 int stepperPin_1 = 2; int enable_1 = 12; int dirPin_2 = 16; //motor2 int stepperPin_2 = 15; int enable_2 = 17; unsigned long motorPeriod_1 = 595; unsigned long motorForward = 300; unsigned long motorPeriod_2 = 400; unsigned long motorMod = 10; int adc_key_in; int key = -1; int isRun = 0; static bool runing = 0; int napr = 0; void setup() { pinMode(dirPin_1, OUTPUT); pinMode(stepperPin_1, OUTPUT); pinMode(enable_1, OUTPUT); digitalWrite(dirPin_1, LOW); digitalWrite(enable_1, LOW); pinMode(dirPin_2, OUTPUT); pinMode(stepperPin_2, OUTPUT); pinMode(enable_2, OUTPUT); digitalWrite(dirPin_2, LOW); digitalWrite(enable_2, LOW); Timer1.initialize(motorPeriod_1); lcd.clear(); lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("Stop "); lcd.setCursor(0,1); lcd.print("Speed "); lcd.print(motorPeriod_1); lcd.print(" "); analogWrite(11, 9); } void EventTimer_1() { digitalWrite(stepperPin_1, !digitalRead(stepperPin_1)); } void step(boolean dir,int stoped) { digitalWrite(dirPin_2,dir); delay(50); while(stoped > 0) { digitalWrite(stepperPin_2, HIGH); delayMicroseconds(motorPeriod_2); digitalWrite(stepperPin_2, LOW); delayMicroseconds(motorPeriod_2); } } int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) return k; } if (k >= NUM_KEYS) k = -1; // No valid key pressed return k; } void loop() { adc_key_in = analogRead(0); // read the value from the sensor key = get_key(adc_key_in); // convert into key press if (key >= 0) // if keypress is detected { switch(key) { case 0: case 1: if (!runing) { step(true,1); runing = 1; delay(200); } break; case 2: if (!runing) { step(false,1); runing = 1; delay(200); } break; case 3: case 4: isRun = 1 - isRun; lcd.setCursor(0,0); if (isRun == 1) { lcd.print("Run "); Timer1.attachInterrupt(EventTimer_1); } else { lcd.print("Stop "); Timer1.detachInterrupt(); } delay(250); break; }//swich close lcd.setCursor(0, 1); lcd.print("Speed "); lcd.print(motorPeriod_1); lcd.print(" "); delay(50); } else if (runing) { lcd.print("Stop "); runing = 0; step(false,0); } }
Никто не поможет?(
Попробуйте обратиться в "Ищу исполнителя". Здесь помогают тем, кто делает сам. Вам же просто нужно переписать чужой скетч, как я понимаю.
Не вижу принципиальной разницы чей скетч, мой или чужой. Если я правильно понял, в этом разделе помогают тем у кого уже что-то есть, а в разделе "Ищу исполнителя" просят написать с нуля. Возможно, я ошибаюсь, в любом случае спасибо за подсказку, попробую попросить ещё там.
Если я правильно понял, в этом разделе помогают тем у кого уже что-то есть, а в разделе "Ищу исполнителя" просят написать с нуля.
Нет, неправильно. Здесь помогают тому, кто делает сам. С чужим скетчем (которого хозяин не понимает) помочь невозможно - можно только сделать самому.
По Вашей подсказке создал аналогичную тему в разделе "Ищу исполнителя", надеюсь кто-то откликнется.
Удачи!
Обратился за помощью в раздел "Ищу исполнителя", там помогают только за деньги, мне такой вариан не подходит, здесь тоже никто не хочет помочь. Год назад я обратился за помощью в этот раздел с подобной проблемой, и мне человек (к сожалению ник не помню, всего хорошего ему) помог быстро, качественно и без лишних вопросов, теперь какие-то ограничения, мой код, не мой код. Что мне делать?
Что мне делать?
плати бабло и не задавай лишних вопросов.
Год назад я обратился ...
И Вы за год не научились программировать?
Что мне делать?
А что Вы обычно делаете, когда надо сделать что-нибудь, чего Вы сами не умеете?
Также и здесь. Либо учиться программировать самому, либо платить тому, кто умеет.
Клапауций 322, платить или не платить, задавать вопросы или не задавать, я буду решать сам! Выше я написал, что вариант за деньги мне не подходит, поэтому, если Вы не можете или не хотите помочь мне БЕСПЛАТНО, оставьте подобные бесценные советы при себе!
ЕвгенийП, да, за год я так и не научился программировать, потому как это мне и не нужно было, система Ардуино + двигатели призвана помочь мне в моём хобби, наблюдении звезд, год назад добрый человек под ником maksim (отыскал его ник) помог мне в этом вопросе, устройство работало, большего мне не требовалось до сегодняшнего момента. Я не сразу же прибежал на этот форум, я читал, пробовал, что-то получалось, что-то нет, какие-то моменты я понимаю, какие-то нет. К примеру, понимаю, что приведенный выше скетч зацикливается на условии while в функции запуска второго мотора, по отдельности получается крутить, вместе нет. В общем, пока я буду разбираться что к чему методом проб и ошибок пройдет уйма времени и будут упущены бесценные ясные ночи для наблюдений.
А на счет платить, я понимаю, что любой труд должен быть оценен по достоинству и оплачен, но видимо наивно полагал, что не все в этом мире завязано на бабле (как выше выразился товарищ с очень дельным советом) и люди могут помогать просто так, человеку умеющему писать код, здесь работы на 20 мин с перекуром.
Клапауций 322, платить или не платить, задавать вопросы или не задавать, я буду решать сам!
сам ты будешь решать у себя под одеялом.
Ожидаемая реакция дурно воспитанного человека. Прошу Вас ещё раз, не можете помочь, проходите мимо, мне абсолютно не интересно общение с Вами на эту тему и в подобном тоне!
Прошу Вас ещё раз
попроси меня ещё три раза.
Такие как Вы, когда не могут победить в честном бою, идут на подлости, в Вашем случае это минусовать мои посты. Чего Вы эти хотите добиться? Выглядите смешно и жалко! Дабы не опускаться до Вашего уровня интеллекта, это будет последнее моё сообщение Вам. Всего доброго!
Ожидаемая реакция дурно воспитанного человека. Прошу Вас ещё раз, не можете помочь, проходите мимо, мне абсолютно не интересно общение с Вами на эту тему и в подобном тоне!
Увы но дурно воспитанный тут автор темы %(
Ладно, попробую объяснить. Я уже лет двадцать не вожусь с электроникой, и лет 10 не пишу программы - для этого есть специалисты у меня в подчинении (я руководитель ИТ-службы на предприятии).
Когда решил сделать проект игровых реквизитов для своего ЛИЧНОГО хобби (страйкбол) - остановился на ардуино. Аналогично попросил о помощи - и совершенно предсказуемо получил такой же ответ - иди в раздел "Ищи исполнителя" и договаривайся о сумме.
В результате я поставил эмулятор Протеус, нарисовал в нем схему, написал прообраз скетча, проверил в работе. Потом купил пару нано-ардуинок, индикаторы, друзъя подогнали клавиатуру и считку ТМ-ключей с ключами. Собрал в макете. Написал кусок кода для работы с индикатором. Потом - с клавиатурой. Потом - с ТМ-ключем. Потом собрал все вместе. Потом написал блок управления/администрирования (меню). Потом добавил еще один сценарий в виде отдельной функции вызываемой из меню. Потом все это проверил.
Сейчас собираю первый рабочий образец.....
А для того чтобы понять язык Си не нужно быть программистом - нужно быть хоть чуть-чуть технарем, понимать логику, включая цифровую базу, и желание самостоятельно учиться.
Или платить тем кто это умеет.....
И в догонку.
Объясни зачем и какой собственно смысл:
061
void
step(boolean dir,
int
stoped)
062
{
063
digitalWrite(dirPin_2,dir);
064
delay(50);
065
while
(stoped > 0)
066
{
067
digitalWrite(stepperPin_2, HIGH);
068
delayMicroseconds(motorPeriod_2);
069
digitalWrite(stepperPin_2, LOW);
070
delayMicroseconds(motorPeriod_2);
071
}
072
}
074
int
get_key(unsigned
int
input)
075
{
076
int
k;
077
for
(k = 0; k < NUM_KEYS; k++)
078
{
079
if
(input < adc_key_val[k])
080
return
k;
081
}
082
if
(k >= NUM_KEYS)
083
k = -1;
// No valid key pressed
084
return
k;
085
}
Такие как Вы, когда не могут победить в честном бою
каком бою, чучело плоскостопое?
у меня экран 110% и я вообще не наблюдаю стрелок +-
at0mix, Вы считаете нормой, когда к незнакомому человеку обращаются на ты и в приказном тоне указывают, что делать? Я считаю, это как минимум неуважением к собеседнику. Попросил избавить меня от таких советов, на что получил вульгарные намеки.
Теперь по теме вопроса. Я рад, что у Вас хватило времени, терпения и желания довести Ваш проект до этапа сборки рабочего образца. К сожалению, у меня не слишком много свободного времени которое я могу уделить на освоение программирования под ардуино. Выше я писал, что пытался разобраться, что-то даже получалось, но на это затрачивается довольно много времени. Ладно бы я хотел и дальше этим заниматься, тогда без вариантов, но на данный момент такого не планирую. Давненько писал простенькие програмки на С# в визуал студии, поэтому базовые понятия, что такое IF или WHILE имеются, но здесь другая ситуация, циклическое выполнение кода и невозможность поставить точку остановки, чтобы отладить какой-то кусок кода, посмотреть какие значения принимаю переменные в данный момент или найти в каком месте выполнения кода я пошел по ложному пути. Плюс здесь куча незнакомых мне функций, переменных и много чего другого.
Первый кусок кода, это функция которая при вызове должна крутить второй движок в одну или другую сторону в зависимости от принимаемого значения true / false. Внутри оператор while выбран мной неудачно, думаю он является причиной зацикливания и невозможности остановить движок при отпускании кнопки.
Второй кусок кода был изначально, как я думаю, это функция определения и присвоения переменной номера нажатой кнопки.
Я не сразу же прибежал на этот форум, я читал, пробовал, что-то получалось, что-то нет,
Так вот, если Вы пробовали, то выкладывайте свои пробы и объясняйте, что получается, а что нет. Тем, кто делает сам, здесь помогают.
Ну, почему, наивно? Так и есть - не всё. Как видите, я не предлагаю Вам сделать эту работу за деньги. Вы можете найти десятки постов в этом разделе, где я что-то подсказывал коллегам, но не найдёте ни одного в "Ищу исполнителя" где бы я предлагал что-то сделать за деньги. Мне это неинтересно.
Вот Вы говорите ...
таким образом, Вы согласны с тем, что передо мною стоит выбор: либо 20 минут поиграть с моей очаровательной внучкой, либо потратить их на то, чтобы написать для Вас кусок кода. Назовите мне хоть одну причину выбрать второе.
Совсем другое дело, когда человек пытается писать сам. Такого человека я воспринимаю как начинающего коллегу и стараюсь ему помочь (вы можете найти десятки постов в этом разделе, где я это делаю). А если человек, как Вы, заявляет, что "не научился программировать, потому как это мне и не нужно", то с какого перепугу программировать за него должно быть нужно мне? Вот скажите, с какого?
Ну, и последнее, насчёт 20 минут. Тут есть два соображения:
1) Это не 20 минут, это ещё огромное время, затраченное специалистом на то, чтобы научиться всё это делать за 20 минут. Вам на это (на учёбу) жалко тратить время, а чужим можно пользоваться?
2) У вас же не возникает вопроса платить или не платить за 20 минут работы таксисту? Платите и даже тени сомнений нет в том, что платить надо и что это правильно. А вот платить за 20 минут работы инженеру Вы почему-то считаете неправильным. Не находите в этом противоречия?
at0mix, Вы считаете нормой, когда к незнакомому человеку обращаются на ты и в приказном тоне указывают, что делать? Я считаю, это как минимум неуважением к собеседнику. Попросил избавить меня от таких советов, на что получил вульгарные намеки.
99% отвечающих толком на форуме считают нормой обращение на ТЫмежду коллегами по хобби - мы не приеме у ангицкой королевы ;)
В приказном тоне никто никому не указывает - просто опытный товрищ пальцем тыкает куда илти и что читать. Если неопытный чечако начинает качать права не имея на то прав - его посылают еще дальше.
Нет программирования "под ардуино". Используется обычный язык Си - классика жанра, с расширениями в части доп-функций по управлению портами ввода-вывода.
Переменные они всегда незнакомые ;)
Описание всего это лежит тут же рядом
http://arduino.ru/Reference
Смотри:
void
step(boolean dir,
int
stoped)
т.е. ты передаеш переменную в функцию.
потом
while
(stoped > 0)
066
{
067
digitalWrite(stepperPin_2, HIGH);
068
delayMicroseconds(motorPeriod_2);
069
digitalWrite(stepperPin_2, LOW);
070
delayMicroseconds(motorPeriod_2);
071
}
А где и каким образом изменяется эта переменная? Если хоть чутка подумать то станет ясно что сама переменная будет ВСЕГДА иметь значение полученное при вызове функции. Это причина вечного кайфа в цикле.
Теперь смотри:
for
(k = 0; k < NUM_KEYS; k++)
к меняется от 0 до 4 (нум-кей=5)
Далее
if
(k >= NUM_KEYS)
но т.к. к меняется от 0 до 4 то оно НИКОГДА не станет больше или равно 5.
ЧТО ТУТ НЕПОНЯТНОГО?
выкладывайте свои пробы и объясняйте, что получается, а что нет.
В первом посте последний вариант на котором я застрял.
я не предлагаю Вам сделать эту работу за деньги. Вы можете найти десятки постов в этом разделе, где я что-то подсказывал коллегам, но не найдёте ни одного в "Ищу исполнителя" где бы я предлагал что-то сделать за деньги. Мне это неинтересно.
Не сомневаюсь, что так оно и есть.
поиграть с моей очаровательной внучкой, либо потратить их на то, чтобы написать для Вас кусок кода.
Выбор здесь очевиден!
когда человек пытается писать сам. Такого человека я воспринимаю как начинающего коллегу и стараюсь ему помочь.
Но при этом, Вам прийдется потратить на много больше чем 20 мин.
с какого перепугу программировать для него должно быть нужно мне? Вот скажите, с какого?
Только из желания помочь и только на добровольной основе.
1) Это не 20 минут, это ещё огромное время, затраченное специалистом на то, чтобы научиться всё это делать за 20 минут. Вам на это (на учёбу) жалко тратить время, а чужим можно пользоваться?
2) У вас же не возникает вопроса платить или не платить за 20 минут работы таксисту? Платите и даже тени сомнений нет. А вот платить за 20 минут инженеру Вы почему-то считаете неправильным. Не находите это противоречивым?
1) Полностью согласен, специалистом становятся не за 20 мин. На счет тратить чужое время, повторюсь, всё на добровольной основе, каждый для себя решает сам, тратить или не тратить время, сколько тратить. Я же не могу Вас заставить.
2) Платить иженеру или таксисту я не считаю неправильным, один, к примеру, копил на автомобиль, второй учился и преобретал опыт, и вполне нормально теперь пытаться возместить затраты. В то же время, с моей стороны, если я не хочу платить, я не буду садиться в такси, есть ещё вариант, дойти до места назначения пешком или попытаться поймать попутку.
Поймать попутку на этом форуме, как я понял, не получится. Остаётся вариант идти пешком, но сам я этот путь не осилю, пробовал. Вы согласны помогать, подсказывать, направлять меня в сторону решения и реализации описанной в первом посте задачи? Если да, то в первую очередь заранее благодарю, а во вторую, хотелось бы сразу к делу. Как мне кажется, начать стоит с функции
void
step(boolean dir,
int
stoped),
оператор while здесь не годится, что посоветуете вместо него или предложите свой вариант продвижения к намеченой цели?at0mix, по поводу while понял и согласен, только не знаю как и какую переменную запихнуть в цикл while которая будет изменяться, когда в функцию прийдет значение переменной на остановку двигателя.
Про функцию для кнопок, не понял к чему Вы клоните. Возможно это не оптимально, но оно же работает. Поправьте если ошибаюсь.
Что если в цикле while применить break или goto? Цикл один раз выполнится, далее идем в начало функции и проверяе значение переменной stoped, далее опять в while если условие stoped>0 выполняется и так по кругу.
Мда, очередная клиника. Организм уже не принимает столько попкорна за раз :)
DIYMan, это Вы мне? Поясните, почему клиника и что Вас развеселило?)
DIYMan, это Вы мне? Поясните, почему клиника и что Вас развеселило?)
Смысл? Если вы всё равно не поймёте? Вам уже и так, и эдак объясняли - не понимаете. Зачем ещё я? Я лучше попкорна пожую.
Что если в цикле while применить break или goto? Цикл один раз выполнится, далее идем в начало функции и проверяе значение переменной stoped, далее опять в while если условие stoped>0 выполняется и так по кругу.
Представьте себе while, как еще один loop из которого можно выйти по условию и как в loop, никто не запрещает вызывать из него любые функции, которые и могут изменить сие условие.
bwn, Вы предлагаете в нем вызывать функцию, которая будет проверять и возвращать значение перемнной отвечающей за "крутить/не крутить" движок? При таком варианте разве не получится неравномерное вращени из-за времени на выполнения этой функции раз в цикл? Мне для второго движка это конечно не критично, но может есть более првильное решение, без while и функции в функции? В любом случае, спасибо за совет!
Что если в цикле while применить break или goto? Цикл один раз выполнится, далее идем в начало функции и проверяе значение переменной stoped, далее опять в while если условие stoped>0 выполняется и так по кругу.
Увы это клиника.
для особо одаренных и ВЕЖЛИВЫХ.
В среде русских на ВЫ называют либо старших по возрасту, либо по званию-должности.
Здесь общаются фанаты, и мне при моем возрасте приятно общение на ты (у меня внук и внучка ;)
Подчиненных я тоже не вижу, начальников тем более. Это по обращению.
По пониманию. Я так понимаю - если чел передает в функцию переменную, внутри функции ставит цикл на контроль изменения этой переменной при этом саму переменную нигде не меняя - ЭТО КЛИНИКА.
Ну мозго то включить можно? Элементарную логику без применения к языку программирования?
at0mix, по поводу while понял и согласен, только не знаю как и какую переменную запихнуть в цикл while которая будет изменяться, когда в функцию прийдет значение переменной на остановку двигателя.
Про функцию для кнопок, не понял к чему Вы клоните. Возможно это не оптимально, но оно же работает. Поправьте если ошибаюсь.
https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%A1%D0%B8_%28%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0%29
Прочти хотя бы это.....
Или это
http://arduino.ru/Reference
Есть куча примеров - по ним просто понять как другие пишут скетчи.
Если нет желания читать, вникать и понимать - тогда нужно просто найти исполнителя за соответствующую плату.
PS - моя з/п позволяет нанять исполнителя, но мне интересно самому разобратья, ошибиться, исправить и понять!
Я, не зная ни возраста человека, ни имени, привык обращаться на "Вы". Ко мне можете обращаться на "Ты", проблем в этом не вижу.
Может и клиника, но глумиться не обязательно. Я понимаю, что надо изменить значение переменной, как - не знаю!
Я смотрел пример по while, там счетчик, мне счетчик не подходит.
ТАК понятно?
Да, вот ПРИМЕР:
Пример
var = 0;
while
(var < 200){
// выполнить что-то, повторив 200 раз
var++;
}
bwn, Вы предлагаете в нем вызывать функцию, которая будет проверять и возвращать значение перемнной отвечающей за "крутить/не крутить" движок? При таком варианте разве не получится неравномерное вращени из-за времени на выполнения этой функции раз в цикл? Мне для второго движка это конечно не критично, но может есть более првильное решение, без while и функции в функции? В любом случае, спасибо за совет!
Просто уверен, что есть другое решение и не одно. Я не смотрел ваш код, предложил вариант. По скорости функций, если там нет откровенных делеев, то недавно ЕвгенийП исследовал скорость пустого loop, получилось около 2млн раз в секунду. Даже если останется тысяча проходов, движок это не поймет. ИМХО.
Главное это придумать алгоритм и потом проверить его на практике. Переложить на понятный МК язык, это уже самое простое (чистая механика). Если простого алгоритма не достаточно, начинаем оптимизировать.
Я смотрел пример по while, там счетчик, мне счетчик не подходит.
А если запишем while(i = 1). При любом другом i цикл остановится. Счетчик исчез.))))
bwn, аккуратнее, чел ведь может и повторить.... while (i==1)
at0mix, у Вас дважды уменьшается значение переменной stoped, это опечатка или так и должно быть?
bwn, аккуратнее, чел ведь может и повторить.... while (i==1)
Виноват, признаю)))
А чтобы таких косяков не было, еще правильнее while (1 == i)
at0mix, у Вас дважды уменьшается значение переменной stoped, это опечатка или так и должно быть?
А прочитать хотя бы просто описание языка слабо? Слово "инкремент" - "декремент" ни о чем не говорит?
Унарные операции?
Еще раз повторяю - или чел учится и читает умные книги, или идет в тему "Ищу исполнителя".
Ты походу ни читать ни учиться просто не желаешь %(
УВЫ.
Не работал с библиотекой TimerOne но, мои скромные многофигзнаетсколькочасовые бдения над даташитом микроконтроллера, плюс мимолетный взгляд на название библиотеки позволяют предположить, что используется ОДИН первый таймер. И так просто под два мотора вы этот скетч не переделаете. Даже если решите все остальные косяки кода (особо не вглядывался), то дополнительно нужно будет при каждом срабатывании прерывания таймера отдельно рассчитывать - что же нужно конкретно в этот момент сделать и когда таймер должен сработать следующий раз. Это так, на вскидку. Так что ваша задача действительно не такая простая, как могло показаться вам в начале.
at0mix, дописал декремент, движок шагает, но очень медленно.
okta, когда мне дописали этот таймер, сказали, что когда функция запущена, то что происходит в loop никак не мешает работе таймера. Если Вы об этом.
Нет, не об этом. А о том, что для управления вторым мотором тоже нужен таймер. Вашим способом нормально крутить мотор и одновременно следить за отжатием кнопки не получится. Либо, как вариант, при нажатии кнопки вешать прерывание на отжатие, и в прерывании обнулять stopped, но тут еще надо смотреть как у вас кнопки подключены.
поменяй
stoped--;
на
int step=10;
stoped-=step;
потом меняя step подберешь нужную скарость.
и прочитай описание на унарные операторы.
okta, а в чем будет выражаться проблема "нормально крутить мотор и одновременно следить за отжатием кнопки не получится"?
Кнопки подключены к А0, остальные номера пинов соответствуют номерам пинов на Нано, за исключением 10го пина, он повешен на 11 пин из-за использования 10го таймером.
at0mix, вечером попробую, спасибо!
тем, что у вас шаг мотора 400 микросекунд, почитайте сколько времени у микроконтроллера занимает АЦП, которое будет использоваться для чтения состояния кнопки if(analogread(0)>800){stopped=0;}(это тонкий намек - как выйти из цикла), и посчитайте какая после этого будет погрешность и как будет колбасить мотор (хотя это теория, на практике может вас и устроит).
PS а чем таким таймер занимается на 10м пине? :)
okta, на 10м пине раньше управлял яркостью дисплея, применив таймер, дисплей начал мерцать, как выяснили товарищи, с частотой примерно 13Гц, это очень раздражало поэтому пришлось использовать 11й пин.
:) ну да, шим (если именно через него пытались яркость регулировать) на 9 и 10 пинах управляется таймером 1. А он у вас задействован в скетче под другие нужды. Но сам по себе таймер на пин ни как не влияет :) Хотя, если надергать кусками код даже приблизительно не понтересовавшись что к чему, то результаты бывают очень удивительные. Что-то мне говорит, что моя подсказка в предыдущем посте вам не поможет (хотя она напрямую указыват как сделать так, что бы именно ваш код хоть как-то заработал). Увы. Соглашусь с предыдущими, вам это нужно для разовой задачи, и сами разбираться либо не хотите, либо не можете. Так что вам в "ищу исполнителя", или ждать школьника, который захочет на вашей задаче потренироваться.
Кнопки подключены к А0, остальные номера пинов соответствуют номерам пинов на Нано, за исключением 10го пина, он повешен на 11 пин из-за использования 10го таймером.
at0mix, вечером попробую, спасибо!
Нет такой купюры %) (С) Одесса.
Шутю.
Для того чтобы сделать рабочий проект - прежде всего нужно положить на бумагу ТЗ - техническое задание - а что собственно хотим получить. Написать алгоритм. Разбить его на блоки. Собрать в макете поблочно по-очереди, и поблочно опробовать.
Например.
У меня в проекте было 3 блока - индикатор, клавиатура, считка ТМ-ключа.
Я подключил индикатор, написал скетч работы с ним.
Потом подключил кнопки и с индикацией на индикаторе написал скетч нажатия кнопок.
Потом подключил считку ТМ-настроил считывание ключей.
А вот потом началось самое главное - собрать все в кучу и написать код меню управления ;)
Нужно помочь самому себе. Пост:
https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%A1%D0%B8_%28%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0%29
https://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%81%D1%82%D1%83%D0%BF_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29
http://lib.ru/CTOTOR/kernigan.txt_with-big-pictures.html
Абрам 30 лет молился богу - я работаю в поте лица, не пропускаю молитв и всегда прошу помочь мне! Ну почему боже ты не можешь дать мне например миллион долларов?
БОГ - Абрам, дай мне шанс - КУПИ ЛОТЕРЕЮ!
Ребята, прочтите книжку! (Керниган и Ритчи) Куча вопросов отпадет.....
Ну а на десерт - 4х томник Кнута "Искусство программирования"- классика жанра ;)
https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F