Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //либы
- #include <Bounce.h>
- #include <MsTimer2.h>
- #include <LiquidCrystal.h>
- //кнопки (входы)
- #define ENABLE_B 2 // кнопка включить выключить двигатель
- #define DIRECTION_B 3 // кнопка реверс
- #define UP_SPEED_B 4 // + скорость
- #define DOWN_SPEED_B 5 // -скорость
- #define HALF_FULL_B 6 // шаг/полушаг
- #define MODE_B 7 // режим
- #define STEP_B A0 //шаг
- //выходы (идут на входы L297)
- #define ENABLE_P A5 //пин включения
- #define DIRECTION_P A4 //пин направление
- #define CLOCK_P A3 //клок пин
- #define HALF_FULL_P A2 //шаг полушаг
- #define RESET_P A1 //пин сброса
- // начальные данные
- int enable_var = LOW; // двигатель отключен
- int direction_var = LOW; // по часовой
- int speed = 10; // скорость
- int half_full_var = HIGH; // полушаговый режим
- int mode = LOW; //режим одногошага
- //инициализация объектов для дебоунсера
- Bounce bouncer = Bounce( ENABLE_B, 5 );
- Bounce bouncer1 = Bounce( DIRECTION_B, 5 );
- Bounce bouncer2 = Bounce( UP_SPEED_B, 5 );
- Bounce bouncer3 = Bounce( DOWN_SPEED_B, 5 );
- Bounce bouncer4 = Bounce( HALF_FULL_B, 5 );
- Bounce bouncer5 = Bounce( MODE_B, 5 );
- Bounce bouncer6 = Bounce( STEP_B, 10 );
- LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //инициализация дисплея
- //переменные для хранения символов
- byte symb_L[8] = { //символ Л
- 0x7, 0x9, 0x9, 0x9, 0x9, 0x9, 0x11, 0x0};
- byte symb_P[8] = { //символ П
- 0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0};
- byte symb_U[8] = { //символ У
- 0x11, 0x11, 0x11, 0xF, 0x1, 0x1, 0xE, 0x0};
- byte symb_m[8] = { //символ м
- 0x0, 0x0, 0x11, 0x1B, 0x15, 0x11, 0x11, 0x0};
- byte symb_b[8] = { //символ б
- 0x1, 0xE, 0x10, 0x1E, 0x11, 0x11, 0xE, 0x0};
- byte symb_i[8] = { //символ и
- 0x0, 0x0, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0};
- byte symb_n[8] = { //символ н
- 0x0, 0x0, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x0};
- byte symb_ch[8] = { //симовол Ч
- 0x11, 0x11, 0x11, 0xF, 0x1, 0x1, 0x1,};
- void setup() {
- // объявление кнопок входами для МК
- pinMode(ENABLE_B, INPUT);
- pinMode(DIRECTION_B, INPUT);
- pinMode(UP_SPEED_B, INPUT);
- pinMode(DOWN_SPEED_B, INPUT);
- pinMode(HALF_FULL_B, INPUT);
- pinMode(MODE_B, INPUT);
- pinMode(STEP_B, INPUT);
- // объявление пинов выходами
- pinMode(CLOCK_P, OUTPUT);
- pinMode(ENABLE_P, OUTPUT);
- pinMode(DIRECTION_P, OUTPUT);
- pinMode(RESET_P,OUTPUT);
- pinMode(HALF_FULL_P, OUTPUT);
- // ввывод начальных данных
- digitalWrite(ENABLE_P, enable_var);
- digitalWrite(CLOCK_P, HIGH);
- digitalWrite(RESET_P, LOW);
- delayMicroseconds(10);
- digitalWrite(RESET_P, HIGH);
- digitalWrite(DIRECTION_P, direction_var);
- digitalWrite(DIRECTION_P, direction_var);
- digitalWrite(HALF_FULL_P, half_full_var);
- Serial.begin(9600); // для отладки
- // MsTimer2::set(speed, flash); // объявление таймера
- // MsTimer2::start(); // запуска таймера
- lcd.begin(16, 2); //объявление размера дисплея
- //создание новых символов
- lcd.createChar(1, symb_L);
- lcd.createChar(2, symb_P);
- lcd.createChar(3, symb_U);
- lcd.createChar(4, symb_m);
- lcd.createChar(5, symb_b);
- lcd.createChar(6, symb_i);
- lcd.createChar(7, symb_n);
- lcd.createChar(8, symb_ch);
- upd_lcd(); //обновить дисплей
- Serial.println("test");
- }
- void loop() {
- // чтение кнопок
- // чтение кнопки ENABLE
- if ( bouncer.update() ) {
- if ( bouncer.read() == HIGH) {
- enable_var = !enable_var;
- digitalWrite(ENABLE_P, enable_var);
- update_speed(); //обновить таймер скорости
- upd_lcd(); //обновить дисплей
- digitalWrite(RESET_P, LOW);
- delayMicroseconds(10);
- digitalWrite(RESET_P, HIGH);
- }
- }
- // чтение кнопки DIRECTION
- if ( bouncer1.update() ) {
- if ( bouncer1.read() == HIGH) {
- direction_var = !direction_var;
- digitalWrite(DIRECTION_P, direction_var);
- upd_lcd(); //обновить дисплей
- }
- }
- // Чтение кнопки +
- if ( bouncer2.update() ) {
- if ( bouncer2.read() == HIGH) {
- speed = speed + 1;
- update_speed(); //обновить таймер скорости
- upd_lcd(); //обновить дисплей
- }
- }
- // чтение кнопки -
- if ( bouncer3.update() ) {
- if ( bouncer3.read() == HIGH) {
- speed = speed - 1;
- update_speed(); //обновить таймер скорости
- upd_lcd(); //обновить дисплей
- }
- }
- // чтение кнопки HALF_FULL
- if ( bouncer4.update() ) {
- if ( bouncer4.read() == HIGH) {
- half_full_var = !half_full_var;
- digitalWrite(HALF_FULL_P, half_full_var);
- upd_lcd(); //обновить дисплей
- digitalWrite(RESET_P, LOW);
- delayMicroseconds(10);
- digitalWrite(RESET_P, HIGH);
- }
- }
- // чтение кнопки MODE
- if ( bouncer5.update() ) {
- if ( bouncer5.read() == HIGH) {
- mode = !mode;
- update_speed();
- Serial.println(mode);
- upd_lcd(); //обновить дисплей
- digitalWrite(RESET_P, LOW);
- delayMicroseconds(10);
- digitalWrite(RESET_P, HIGH);
- }
- }
- // чтение кнопки STEP
- if ( bouncer6.update() ) {
- if ( bouncer6.read() == HIGH) {
- Serial.println("STEP");
- upd_lcd(); //обновить дисплей
- if (mode == 0){
- digitalWrite(CLOCK_P, LOW);
- delay(1);
- digitalWrite(CLOCK_P, HIGH);
- }
- }
- }
- }
- void flash() // импульс шага
- {
- digitalWrite(CLOCK_P, LOW);
- // delayMicroseconds(1);
- delay(1);
- digitalWrite(CLOCK_P, HIGH);
- // Serial.println(speed); //вывод скорости в порт
- }
- void update_speed()//обновление таймера скорости
- {
- speed = constrain(speed, 8, 99); //удержание в пределах 4-200
- if (enable_var == 1 && mode ==1) //если ВКЛ то обновляем таймер
- {
- MsTimer2::stop(); //остановка таймера
- MsTimer2::set(speed, flash); //установка нового промежутка
- MsTimer2::start(); //запуск таймера
- }
- else MsTimer2::stop();
- }
- void print_VKL() //вывод надписи ВКЛ
- {
- lcd.print("BK");
- lcd.write(1);
- lcd.print(" ");
- }
- void print_OTKL() //вывод написи ОТКЛ
- {
- lcd.print("OTK");
- lcd.write(1);
- lcd.print(" ");
- }
- void print_ms() //вывод частоты
- {
- if ((speed / 10) < 1) lcd.print(" "); // если число не 2х значное вывести пробел
- lcd.print(speed); //вывести частоту
- lcd.write(4);
- lcd.print("c ");
- if (speed == 8 || speed == 99 && mode == 1) lcd.print("!"); // если максимальная скорость вывести !
- else lcd.print(" ");
- }
- void print_POLU() //вывод ПОЛУ
- {
- lcd.write(2);
- lcd.print("O");
- lcd.write(1);
- lcd.write(3);
- }
- void print_POLN() //вывод ПОЛН
- {
- lcd.write(2);
- lcd.print("O");
- lcd.write(1);
- lcd.write("H");
- }
- void print_dir_cw() //вывод >>
- {
- lcd.print(">>");
- }
- void print_dir_ccw() //вывод <<
- {
- lcd.print("<<");
- }
- void print_obmin() //вывод скорости об/мин
- {
- float pspeed = 0; //переменная для хранение об/мин
- byte kf = 0; //кф шага/полушага
- if ( half_full_var == 0) kf = 2;
- else kf = 1;
- lcd.setCursor(0, 1); //установка курсора на 2ю строку
- pspeed = (kf * 625) / (float)speed; //высчитываем скорость
- if (mode == 1) {
- if ((pspeed / 100) < 1) lcd.print(" "); //если число не 2х значное выводим пробел
- if ((pspeed / 10) < 1) lcd.print(" ");
- lcd.print(pspeed); //выводим скорость
- lcd.print(" ");
- lcd.print("o");
- lcd.write(5);
- lcd.print("/");
- lcd.write(4);
- lcd.write(6);
- lcd.write(7);
- lcd.print(" ");
- }
- else {
- lcd.print(" P");
- lcd.write(3);
- lcd.write(8);
- lcd.print("H ");
- }
- }
- void upd_lcd() //функция обновления дисплея
- {
- lcd.setCursor(0,0); //установка курсора в начало дисплея
- if (enable_var == 1) print_VKL(); //если двигатель включен вывзываем функцию вывода ВКЛ
- else print_OTKL(); // иначе выводим ВЫКЛ
- if ( half_full_var == 1) print_POLU(); // если включен режим полушага вызываем функцию вывода ПОЛУ
- else print_POLN(); //иначе выводим ПОЛН
- lcd.print(" ");
- if (mode == 1)print_ms(); // вызываем вывод частоты
- else lcd.print (" ");
- print_obmin(); //вызываем вывод об/мин
- if ( direction_var == 0) print_dir_cw(); // отображаем направление
- else print_dir_ccw();
- }
- void mode_switch()
- {
- if (mode == 0) MsTimer2::stop;
- else MsTimer2::start;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement