Для того чтобы сделать рабочий проект - прежде всего нужно положить на бумагу ТЗ - техническое задание - а что собственно хотим получить.
справедливости ради с этим тут более-менее норм. А вот дальше начинаются проблемы :)
Ну в основном с головой - извини.
Знаешь анек про летающих крокодильчиков? Так нас на работе так же пи№;%т. Так что летаем как крокодильчики.
А вот в процессе создания продукта по своему желанию - тут вопрос ответсвенности - я заявил что сделаю этот проект. И если не сделаю - и даже мне никто слова не скажет - я просто не сдержу СВОЕГО СЛОВА.
Нашел основную причину того, что второй движок медленно шагал, так же поубирал лишнее, как мне кажется, посмотрите. Сейчас оба движка работают как мне было надо, только второй бывает как-то странно подёргивается, ощущается это если держать его в руках, визуально не заметно.
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);
stoped--;
}
}
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);
}
}
Я обратил внимание на то что кейз 0 без брика - т.е. если key 0 или 1 - действие одниаковое?
3 тоже было без брика - сейчас дописано, отличается от 4.
Но самое главное - самому понять алгоритм. Это работа аналитика. А при наличии алгоритма кодировать - просто знание язика - в нашем случае Си, с использованием встроенных функций управления портами.
По поводу советов.
Я не смогу дать точный совет просто потому что не имею нужно периферии и не горю желанием тратить деньги и время на ее приобретение %) Так что от большинства ты можешь получить совет только исключительно по коду без привязки его работы с железом - учти это.
По тексту.
Если
isRun=1-isRun;
просто булева инверсия то почему не использовать
isRun = !isRun;
? имхо это эффективнее. Да и переменную можно объявить как булеан.
at0mix, без break было потому, что это была заготовка. По поводу isRun = !isRun; подумаю, но чуть позже.
На данный момент реализовал почти все свои хотелки, застрял на "ENABLE", поэтому прошу помочь в таких моментах:
1. сейчас залит вот такой код (см. ниже), при включении/подачи питания на оборудование движок1 примерно 1сек пищит, такого небыло пока я не начал заниматься "ENABLE" и не изменил в void setup() digitalWrite(enable_1, LOW); на digitalWrite(enable_1, HIGH); и соответственно для enable_2, а так же стал дописывать digitalWrite LOW/HIGH в void loop() в зависимости от события. Почему движок может пищать? Думаю это совсем не нормально.
2. если раскомментировать строки digitalWrite(enable_1, LOW); в void EventTimer_1() и digitalWrite(enable_1, HIGH); void loop(), то движок1 при работе "троит" (как двигатель у мотоцикла с плохо настроенным зажиганием, лучшего сравнения не придумал). Думаю это происходит из-за неверно выбраного места написания строчек digitalWrite(enable_1, LOW); и digitalWrite(enable_1, HIGH);. Подскажите как и где лучше применять LOW/HIGH для enable_1 и enable_2?
3. обязательно ли в void setup() прописывать digitalWrite(enable_1, HIGH) и digitalWrite(enable_2, HIGH), ведь в void loop() я делаю то же самое?
#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;
unsigned long razgon = motorPeriod_1;
int knopka0 = 1;
void setup() {
pinMode(dirPin_1, OUTPUT);
pinMode(stepperPin_1, OUTPUT);
pinMode(enable_1, OUTPUT);
digitalWrite(dirPin_1, LOW);
//digitalWrite(enable_1, HIGH);
pinMode(dirPin_2, OUTPUT);
pinMode(stepperPin_2, OUTPUT);
pinMode(enable_2, OUTPUT);
digitalWrite(dirPin_2, LOW);
//digitalWrite(enable_2, HIGH);
Timer1.initialize(motorPeriod_1);
lcd.clear();
lcd.begin(16, 2);
analogWrite(11, 50);
}
void EventTimer_1()
{
//digitalWrite(enable_1, LOW);
digitalWrite(stepperPin_1, !digitalRead(stepperPin_1));
}
void step(boolean dir,int stoped)
{
digitalWrite(dirPin_2,dir);
while(stoped > 0)
{
digitalWrite(enable_2, LOW);
digitalWrite(stepperPin_2, HIGH);
delayMicroseconds(motorPeriod_2);
digitalWrite(stepperPin_2, LOW);
delayMicroseconds(motorPeriod_2);
stoped--;
}
}
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: //режим фокусировки(мотор 2) или задания периода мотора 1
if(knopka0 == 1)
{
knopka0 = 2;
show(isRun,knopka0,motorPeriod_1);
}
else
{
knopka0 = 1;
show(isRun,knopka0,motorPeriod_1);
}
delay(300);
break;
case 1: //запуск мотора 2 или увеличение периода мотора 1
if(knopka0 == 1)
{
step(true,1);
}
else
{
motorPeriod_1 += 10;
Timer1.initialize(motorPeriod_1);
show(isRun,knopka0,motorPeriod_1);
delay(200);
}
break;
case 2: ////запуск мотора 2 или уменьшение периода мотора 1
if(knopka0 == 1)
{
step(false,1);
}
else
{
if(motorPeriod_1 > motorPeriod_2)
{
motorPeriod_1 -= 10;
Timer1.initialize(motorPeriod_1);
show(isRun,knopka0,motorPeriod_1);
delay(200);
}
}
break;
case 3: //плавно ускоряет мотор 1
if(isRun == 1)
{
if(razgon > motorForward)
{
Timer1.initialize(razgon);
razgon-=10;
show(isRun,knopka0,razgon);
delay(200);
}
}
break;
case 4:// запускает/останавливает мотор 1
isRun = 1 - isRun;
if (isRun == 1)
{
Timer1.attachInterrupt(EventTimer_1);
show(isRun,knopka0,motorPeriod_1);
}
else
{
Timer1.detachInterrupt();
show(isRun,knopka0,motorPeriod_1);
}
delay(300);
break;
}//swich close
}// if key close
else
{
step(false,0);
Timer1.initialize(motorPeriod_1);
razgon = motorPeriod_1;
show(isRun,knopka0,motorPeriod_1);
}
//digitalWrite(enable_1, HIGH);
digitalWrite(enable_2, HIGH);
}// loop close
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
return k;
}
k = -1; // No valid key pressed
return k;
}
int show(int run_stop, int knopka, int period)
{
//lcd.clear();
//lcd.begin(16, 2);
lcd.setCursor(0,0);
if(run_stop == 1)
{
lcd.print("Runing");
lcd.print(" ");
if(knopka == 1)
{
lcd.print("Focus");
}
else
{
lcd.print("MOD ");
}
}
else
{
lcd.print("Stop");
lcd.print(" ");
if(knopka == 1)
{
lcd.print("Focus");
}
else
{
lcd.print("MOD ");
}
}
lcd.setCursor(0,1);
lcd.print("Speed ");
lcd.print(period);
lcd.print(" ");
}
at0mix, без break было потому, что это была заготовка. По поводу isRun = !isRun; подумаю, но чуть позже.
На данный момент реализовал почти все свои хотелки, застрял на "ENABLE", поэтому прошу помочь в таких моментах:
enable это что? Явно не функция.
CasterV пишет:
1. сейчас залит вот такой код (см. ниже), при включении/подачи питания на оборудование движок1 примерно 1сек пищит, такого небыло пока я не начал заниматься "ENABLE" и не изменил в void setup() digitalWrite(enable_1, LOW); на digitalWrite(enable_1, HIGH); и соответственно для enable_2, а так же стал дописывать digitalWrite LOW/HIGH в void loop() в зависимости от события. Почему движок может пищать? Думаю это совсем не нормально.
digitalWrite -не есть оператор языка Си - это встроенная функция компилятора для МК Ардуино. Соответственно понять как и зачем я смогу только поставив у себя аналогичную периферию. Т.к. у меня нет потребности в ней - я ее покупать не собираюсь, и опробовать не смогу. Так что все взаимоотношения с железом плиз сам.
CasterV пишет:
2. если раскомментировать строки digitalWrite(enable_1, LOW); в void EventTimer_1() и digitalWrite(enable_1, HIGH); void loop(), то движок1 при работе "троит" (как двигатель у мотоцикла с плохо настроенным зажиганием, лучшего сравнения не придумал). Думаю это происходит из-за неверно выбраного места написания строчек digitalWrite(enable_1, LOW); и digitalWrite(enable_1, HIGH);. Подскажите как и где лучше применять LOW/HIGH для enable_1 и enable_2?
Опять же - ЭТО железо! Которого у меня нет. Извини - сам.
CasterV пишет:
3. обязательно ли в void setup() прописывать digitalWrite(enable_1, HIGH) и digitalWrite(enable_2, HIGH), ведь в void loop() я делаю то же самое?
Сетап исполняется один раз перед запуском лупа - в нем устанавливаются стартовые данные.
В лупе идет динамическое управление.
Если ты в начале лупа поставишь установку - то они будут устанавливаться при начале каждего цикла.
Если ты ставишь внутри лупа установки по условию - то они будут устанавливаться только при наличии условия.
Если ты в сетапе не установил параметры - а в лупе устанавливаешь их по условию = то они установятся при наличии условия, в остальных случаях их поведение непредсказуемо.
ЭТО ПОНЯТНО?
Для того и сделан СЕТАП - установить СТАРТОВЫЕ установки!
Извиняюсь, если я всё правильно понимаю, то "ENABLE" - пин на драйвере DRV8825 предназначенный для отключения драйвера (соответсвенно снятия напряжения с обмоток мотора) при подаче на него HIGH. Мне это нужно, чтоб когда мотор остановлен, не грелся и не жрал аккумуляторы зря.
По поводу писка мотора кажется это из-за севших аккумуляторов, заряжу, проверю.
С учетом пояснений по поводу "ENABLE", можете подсказать где и что дописать, чтоб обесточить обмотки мотора при его остановке?
Извиняюсь, если я всё правильно понимаю, то "ENABLE" - пин на драйвере DRV8825 предназначенный для отключения драйвера (соответсвенно снятия напряжения с обмоток мотора) при подаче на него HIGH. Мне это нужно, чтоб когда мотор остановлен, не грелся и не жрал аккумуляторы зря.
По поводу писка мотора кажется это из-за севших аккумуляторов, заряжу, проверю.
С учетом пояснений по поводу "ENABLE", можете подсказать где и что дописать, чтоб обесточить обмотки мотора при его остановке?
Друг, мы на планете плюк %)
Что есть енабле?????
Ежели это функция - так такой нет. Ежели переменная - так веришь - тоже нет!
Я видел пара переменных енабль-1 и енабль-2 - но они не несут какую-то функцию вне понимания автора.
Еще раз повторю - общество может помочь только исключительно в плане ошибок в программировании, или если конкретно занимается точно таким же проектом. В остальном - самостоятельно!
Извини - без наезда, просто факт.
По поводу советов. Я не телепат - я не знаю что ты и где хочешь сделать.
Бинго :) таки мы узнали через что управляем моторами :)))
Отдаю вам должное, большую часть фигни из кода убрали. С описанными мной проблемами столкнулись. Не трогайте мотор1 и таймер1 котрый им управляет. За "сок" покажу таки как этот код заработает.
Для того чтобы сделать рабочий проект - прежде всего нужно положить на бумагу ТЗ - техническое задание - а что собственно хотим получить.
справедливости ради с этим тут более-менее норм. А вот дальше начинаются проблемы :)
Для того чтобы сделать рабочий проект - прежде всего нужно положить на бумагу ТЗ - техническое задание - а что собственно хотим получить.
справедливости ради с этим тут более-менее норм. А вот дальше начинаются проблемы :)
Ну в основном с головой - извини.
Знаешь анек про летающих крокодильчиков? Так нас на работе так же пи№;%т. Так что летаем как крокодильчики.
А вот в процессе создания продукта по своему желанию - тут вопрос ответсвенности - я заявил что сделаю этот проект. И если не сделаю - и даже мне никто слова не скажет - я просто не сдержу СВОЕГО СЛОВА.
Поэтому раз сказал - Я ДОЛЖЕН ЭТО СДЕЛАТЬ!
Нашел основную причину того, что второй движок медленно шагал, так же поубирал лишнее, как мне кажется, посмотрите. Сейчас оба движка работают как мне было надо, только второй бывает как-то странно подёргивается, ощущается это если держать его в руках, визуально не заметно.
Дописал плавный разгон для мотора 1.
Я обратил внимание на то что кейз 0 без брика - т.е. если key 0 или 1 - действие одниаковое?
3 тоже было без брика - сейчас дописано, отличается от 4.
Но самое главное - самому понять алгоритм. Это работа аналитика. А при наличии алгоритма кодировать - просто знание язика - в нашем случае Си, с использованием встроенных функций управления портами.
По поводу советов.
Я не смогу дать точный совет просто потому что не имею нужно периферии и не горю желанием тратить деньги и время на ее приобретение %) Так что от большинства ты можешь получить совет только исключительно по коду без привязки его работы с железом - учти это.
По тексту.
Если
isRun=1-isRun;
просто булева инверсия то почему не использовать
isRun = !isRun;
? имхо это эффективнее. Да и переменную можно объявить как булеан.
at0mix, без break было потому, что это была заготовка. По поводу isRun = !isRun; подумаю, но чуть позже.
На данный момент реализовал почти все свои хотелки, застрял на "ENABLE", поэтому прошу помочь в таких моментах:
1. сейчас залит вот такой код (см. ниже), при включении/подачи питания на оборудование движок1 примерно 1сек пищит, такого небыло пока я не начал заниматься "ENABLE" и не изменил в void setup() digitalWrite(enable_1, LOW); на digitalWrite(enable_1, HIGH); и соответственно для enable_2, а так же стал дописывать digitalWrite LOW/HIGH в void loop() в зависимости от события. Почему движок может пищать? Думаю это совсем не нормально.
2. если раскомментировать строки digitalWrite(enable_1, LOW); в void EventTimer_1() и digitalWrite(enable_1, HIGH); void loop(), то движок1 при работе "троит" (как двигатель у мотоцикла с плохо настроенным зажиганием, лучшего сравнения не придумал). Думаю это происходит из-за неверно выбраного места написания строчек digitalWrite(enable_1, LOW); и digitalWrite(enable_1, HIGH);. Подскажите как и где лучше применять LOW/HIGH для enable_1 и enable_2?
3. обязательно ли в void setup() прописывать digitalWrite(enable_1, HIGH) и digitalWrite(enable_2, HIGH), ведь в void loop() я делаю то же самое?
at0mix, без break было потому, что это была заготовка. По поводу isRun = !isRun; подумаю, но чуть позже.
На данный момент реализовал почти все свои хотелки, застрял на "ENABLE", поэтому прошу помочь в таких моментах:
enable это что? Явно не функция.
digitalWrite -не есть оператор языка Си - это встроенная функция компилятора для МК Ардуино. Соответственно понять как и зачем я смогу только поставив у себя аналогичную периферию. Т.к. у меня нет потребности в ней - я ее покупать не собираюсь, и опробовать не смогу. Так что все взаимоотношения с железом плиз сам.
Опять же - ЭТО железо! Которого у меня нет. Извини - сам.
CasterV пишет: 3. обязательно ли в void setup() прописывать digitalWrite(enable_1, HIGH) и digitalWrite(enable_2, HIGH), ведь в void loop() я делаю то же самое?
Сетап исполняется один раз перед запуском лупа - в нем устанавливаются стартовые данные.
В лупе идет динамическое управление.
Если ты в начале лупа поставишь установку - то они будут устанавливаться при начале каждего цикла.
Если ты ставишь внутри лупа установки по условию - то они будут устанавливаться только при наличии условия.
Если ты в сетапе не установил параметры - а в лупе устанавливаешь их по условию = то они установятся при наличии условия, в остальных случаях их поведение непредсказуемо.
ЭТО ПОНЯТНО?
Для того и сделан СЕТАП - установить СТАРТОВЫЕ установки!
Извиняюсь, если я всё правильно понимаю, то "ENABLE" - пин на драйвере DRV8825 предназначенный для отключения драйвера (соответсвенно снятия напряжения с обмоток мотора) при подаче на него HIGH. Мне это нужно, чтоб когда мотор остановлен, не грелся и не жрал аккумуляторы зря.
По поводу писка мотора кажется это из-за севших аккумуляторов, заряжу, проверю.
С учетом пояснений по поводу "ENABLE", можете подсказать где и что дописать, чтоб обесточить обмотки мотора при его остановке?
Извиняюсь, если я всё правильно понимаю, то "ENABLE" - пин на драйвере DRV8825 предназначенный для отключения драйвера (соответсвенно снятия напряжения с обмоток мотора) при подаче на него HIGH. Мне это нужно, чтоб когда мотор остановлен, не грелся и не жрал аккумуляторы зря.
По поводу писка мотора кажется это из-за севших аккумуляторов, заряжу, проверю.
С учетом пояснений по поводу "ENABLE", можете подсказать где и что дописать, чтоб обесточить обмотки мотора при его остановке?
Друг, мы на планете плюк %)
Что есть енабле?????
Ежели это функция - так такой нет. Ежели переменная - так веришь - тоже нет!
Я видел пара переменных енабль-1 и енабль-2 - но они не несут какую-то функцию вне понимания автора.
Еще раз повторю - общество может помочь только исключительно в плане ошибок в программировании, или если конкретно занимается точно таким же проектом. В остальном - самостоятельно!
Извини - без наезда, просто факт.
По поводу советов. Я не телепат - я не знаю что ты и где хочешь сделать.
По комментарии слышал?
Бинго :) таки мы узнали через что управляем моторами :)))
Отдаю вам должное, большую часть фигни из кода убрали. С описанными мной проблемами столкнулись. Не трогайте мотор1 и таймер1 котрый им управляет. За "сок" покажу таки как этот код заработает.
okta, каким образом мне Вас угостить соком за предоставленную подсказку? Практически уверен, что проживаем мы в разных государствах.
свяжемся, автобус с надбисью "ХЛЕБ" уже выехал
noise83@rambler.ru
пока почему-то не видно
okta, проверьте почту.
Пусто!
Странно, сейчас повторю.
А сейчас?