Прошу помощи более опытных специалистов.
Шаговый мотор управляется микроконтроллером на Ардуино, запрограммированным таким скетчем:
По такой схеме всё отрабатывает нормально и счёт циклов выводится на монитор порта. Но понадобилось оторвать устройство от компьютера, а индикацию количества отработанных циклов вывести на четырехразрядный семисегментный индикатор. Подключил индикатор TM1637, установил библиотеку TM1637.h, загрузил demo скетч. Также всё работает, индикатор выводит заданное значение.
Теперь объединил два скетча в один:
В результате скетч компилируется, загружается в Ардуину, но не запускается цикл. При этом если закомментировать строки из первого скетча, то индикатор инициализируется и показывает значение переменной (в данном случае j=0), а если закомментировать строки инициализации индикатора:
// disp.init(); // инициализация
и
// disp.displayInt(j);
то программа запускается, но без индикации.
Буду очень благодарен, если кто-нибудь разберётся в этой проблеме и подскажет мне как её решить.
Шаговый мотор управляется микроконтроллером на Ардуино, запрограммированным таким скетчем:
C++:
int j = 0;
int n = 10; //Количество циклов
//Пины управления шаговиком
#define STEP_PIN 3
#define DIR_PIN 2
#define ENABLE_PIN 4
//Пин кнопки
#define start_button 6
//Здесь можно настроить время поворота и паузы
#define move_forward_time 5000 //время прямого хода в мсек
#define move_back_time 5000 //время обратного хода в мсек
#define pause_time 1000 //время паузы в мсек
#define frequency 100 //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота следования импульсов 1/0.001 = 1 кГц,
//Не рекомендуется устанавливать время меньше 100 мсек, т.к. частота будет 10 кГц
//Таймер для millis()
uint32_t timer = 0;
int period_smazki =0;
//Логический флаг для рабочего режима
bool flag = 0;
void setup() {
Serial.begin(9600);
pinMode(start_button, INPUT_PULLUP); //Подтягиваем кнопку к питанию
pinMode(STEP_PIN , OUTPUT); //Настраиваем пины управления
pinMode(DIR_PIN , OUTPUT);
pinMode(ENABLE_PIN , OUTPUT);
digitalWrite(ENABLE_PIN , HIGH); //Выключаем мотор, чтобы не грелся
}
void loop () {
if (!digitalRead(start_button)) { //Если нажали на кнопку
digitalWrite(ENABLE_PIN , LOW);
//Serial.println("Мотор включен"); //Включаем мотор
flag = 1; //Активируем флаг рабочего режима
timer = millis(); //Запускаем таймер
}
if (flag) { //Если флаг активирован
//Задаем направление вращения
for(int j=1; j <=n; j++){
Serial.print("Цикл ");Serial.println(j);
digitalWrite(ENABLE_PIN , LOW);
digitalWrite(DIR_PIN , HIGH);
for (int i = 1; i <=400*16; i++) { //Выполняем нужное число шагов 200 = 1 оборот
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN , LOW);
delayMicroseconds(frequency);
//Serial.print("шаг ");Serial.println(i);
}
digitalWrite(ENABLE_PIN , HIGH);
flag = 0;
//Serial.println("пауза 1 сек"); //Пауза pause_time мсек
delay(pause_time);
timer = millis();
digitalWrite(ENABLE_PIN , LOW);
digitalWrite(DIR_PIN , LOW);
for (int i = 1; i <= 400*16; i++) { //Выполняем нужное число шагов 200 = 1 оборот
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN , LOW);
delayMicroseconds(frequency);
//Serial.print("шаг назад ");Serial.println(i);
}
flag = 0;
digitalWrite(ENABLE_PIN , HIGH);
//Serial.println("пауза 1 сек"); //Пауза pause_time мсек
delay(pause_time);
timer = millis();
}
}
}
Теперь объединил два скетча в один:
C++:
#include "TM1637.h"
#define CLK 9
#define DIO 8
TM1637 disp(CLK, DIO);
int j = 0;
int n = 10; //Количество циклов
//Пины управления шаговиком
#define STEP_PIN 3
#define DIR_PIN 2
#define ENABLE_PIN 4
//Пин кнопки
#define start_button 6
//Здесь можно настроить время поворота и паузы
#define move_forward_time 5000 //время прямого хода в мсек
#define move_back_time 5000 //время обратного хода в мсек
#define pause_time 1000 //время паузы в мсек
#define frequency 100 //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота следования импульсов 1/0.001 = 1 кГц,
//Не рекомендуется устанавливать время меньше 100 мсек, т.к. частота будет 10 кГц
//Таймер для millis()
uint32_t timer = 0;
int period_smazki =0;
//Логический флаг для рабочего режима
bool flag = 0;
void setup() {
//Serial.begin(9600);
pinMode(start_button, INPUT_PULLUP); //Подтягиваем кнопку к питанию
pinMode(STEP_PIN , OUTPUT); //Настраиваем пины управления
pinMode(DIR_PIN , OUTPUT);
pinMode(ENABLE_PIN , OUTPUT);
digitalWrite(ENABLE_PIN , HIGH); //Выключаем мотор, чтобы не грелся
disp.init(); // инициализация
disp.set(1); // яркость, 0 - 7 (минимум - максимум)
}
void loop () {
if (!digitalRead(start_button)) { //Если нажали на кнопку
digitalWrite(ENABLE_PIN , LOW);
//Serial.println("Мотор включен"); //Включаем мотор
flag = 1; //Активируем флаг рабочего режима
timer = millis(); //Запускаем таймер
}
if (flag) { //Если флаг активирован
//Задаем направление вращения
for(int j=1; j <=n; j++){
//Serial.print("Цикл ");Serial.println(j);
disp.displayInt(j);
digitalWrite(ENABLE_PIN , LOW);
digitalWrite(DIR_PIN , HIGH);
for (int i = 1; i <=400*16; i++) { //Выполняем нужное число шагов 200 = 1 оборот
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN , LOW);
delayMicroseconds(frequency);
//Serial.print("шаг ");Serial.println(i);
}
digitalWrite(ENABLE_PIN , HIGH);
flag = 0;
//Serial.println("пауза 1 сек"); //Пауза pause_time мсек
delay(pause_time);
timer = millis();
digitalWrite(ENABLE_PIN , LOW);
digitalWrite(DIR_PIN , LOW);
for (int i = 1; i <= 400*16; i++) { //Выполняем нужное число шагов 200 = 1 оборот
digitalWrite(STEP_PIN , HIGH);
delayMicroseconds(frequency);
digitalWrite(STEP_PIN , LOW);
delayMicroseconds(frequency);
//Serial.print("шаг назад ");Serial.println(i);
}
flag = 0;
digitalWrite(ENABLE_PIN , HIGH);
//Serial.println("пауза 1 сек"); //Пауза pause_time мсек
delay(pause_time);
timer = millis();
}
}
}
// disp.init(); // инициализация
и
// disp.displayInt(j);
то программа запускается, но без индикации.
Буду очень благодарен, если кто-нибудь разберётся в этой проблеме и подскажет мне как её решить.
Изменено: