Намоточный станок
- Войдите на сайт для отправки комментариев
Ср, 15/08/2018 - 23:12
добрый вечер всем посетившим . Решил собрать намоточный станок для мелких двигателей . В код программы решил добавить lcd шилд с кнопками . Не могу найти ошику , не могу понять почему кнопки в лево и право не срабатывают . Если кто знает где ошибка и как заставить срабатывать кнопки правильно буду благодарен за помошь .
заранее спасибо
//23.02.2016 #include <Wire.h> // добавляем необходимые библиотеки #include <EEPROM.h> #include <LiquidCrystal.h> #include "TimerOne.h" #include <MenuSystem.h> #include "HID.h" #include "Keyboard.h" #define FULLTURN1 360/1.8*16 //full turn per steps drive1 #define FULLTURN2 360/1.8*32 //full turn per steps drive2 #define STEP_PER_MM FULLTURN2 / 0.8 //шагов на мм для шпильки M5 #define d1 1 //для указания направления #define d2 -1 const int sd1d = 9; // pin for dir steps drive 1 const int sd1 = 10; // pin for step steps drive 1 const int sd2d = 11 ; // pin for dir steps drive 2 const int sd2 = 12; // pin for step steps drive 2 LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); //init LCD display, pins 1,2,3,4,5 #define KEY_ESC #define KEY_UP_ARROW #define KEY_DOWN_ARROW #define KEY_LEFT_ARROW #define KEY_RIGHT_ARROW float WIRED = 0.3; //default wire diameter, mm float WINDOW = 30; //default window, mm int COILS = 200; //default coils int spd = 200; //default step motor delay int steps1 = 0; //счетчик шагов int steps2 = 0; //счетчик шагов для второго шд int count_coils = 0; // счетчик витков int count_coilspw = 0; //счетчик на заполнение окна int STEP_PER_COIL = 0; int dir = 1; int flag_i = 0; //для мотора на прерываниях то 1 выдаем то 0 int motor_on = 0; //вкл./выкл. мотор намотки int buttonValue = 0; char k; //menu MenuSystem ms; Menu mm("------Menu------"); MenuItem mm_mi1("Calibration"); MenuItem mm_mi2("Diagnostic"); MenuItem mm_mi3("Wired"); MenuItem mm_mi4("Window"); MenuItem mm_mi5("Coils"); MenuItem mm_mi6("Direction"); MenuItem mm_mi7("Run"); void setup() { lcd.begin(16, 2); pinMode(sd1, OUTPUT); pinMode(sd2, OUTPUT); pinMode(sd1d, OUTPUT); pinMode(sd2d, OUTPUT); pinMode(0, INPUT_PULLUP); //Keyboard.begin(); //возвращаем параметры из eeprom float WIRED_EEPROM = 0; WIRED_EEPROM = EEPROM_float_read(0); if ((WIRED_EEPROM >= 0.2) && (WIRED_EEPROM <= 0.6)) { WIRED = WIRED_EEPROM; } float WINDOW_EEPROM = 0; WINDOW_EEPROM = EEPROM_float_read(4); if ((WINDOW_EEPROM >= 0.5) && (WINDOW_EEPROM <= 150)) { WINDOW = WINDOW_EEPROM; } int COILS_EEPROM = 0; COILS_EEPROM = EEPROM_int_read(8); if ((COILS_EEPROM >= 10) && (COILS_EEPROM <= 5000)) { COILS = COILS_EEPROM; } int DIR_EEPROM = 0; COILS_EEPROM = EEPROM_int_read(12); if ((DIR_EEPROM == 1) || (DIR_EEPROM == -1)) { dir = DIR_EEPROM; } mm.add_item(&mm_mi1, &Calibration); mm.add_item(&mm_mi2, &Diagnostic); mm.add_item(&mm_mi3, &Wired); mm.add_item(&mm_mi4, &Window); mm.add_item(&mm_mi5, &Coils); mm.add_item(&mm_mi6, &Direction); mm.add_item(&mm_mi7, &Runing); //mm.add_item(&mm_mi6, &day_setup_selected); ms.set_root_menu(&mm); //инициалищируем таймер Timer1.initialize(100000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-a //Timer1.attachInterrupt( timerIsr ); // прикрепить подпрограмму обслуживания здесь hello(); } // setup()... void loop() { menu(); } //loop()... void MenuSystem() { lcd.setCursor(0, 0); lcd.clear(); // Display the menu Menu const* cp_menu = ms.get_current_menu(); lcd.print("menu name:"); lcd.print(cp_menu->get_name()); lcd.setCursor(0, 1); lcd.print(cp_menu->get_selected()->get_name()); delay(500); } char KEY() { int KEY = analogRead (0); //debug lcd.setCursor(10, 1); //right if (KEY < 100) { return 'r'; //right 'r'; } //up if (KEY < 200) { return 'u'; //up 'u'; } //down if (KEY < 400) { return 'd'; //down 'd'; } //left if (KEY < 600) { return 'l'; //left 'l'; } //SELECT if (KEY < 800) { return 'e'; //Enter 'e'; } return 0; } void hello() { lcd.setCursor(0, 0); lcd.print(F("Winding machine")); } void menu() { k = KEY(); switch (k) { case 'c': //Esc/Cancel 'c'; ms.back(); hello(); break; case 'u': //up 'u'; ms.prev(); MenuSystem(); break; case 'd': //down 'd'; ms.next(); MenuSystem(); break; case 'e': //Enter 'e'; ms.select(); MenuSystem(); break; } } void Calibration(MenuItem* p_menu_item) { lcd.setCursor(0, 0); lcd.print(F("Calibration mode")); delay(30); while (k != 'c') //Esc/Cancel 'c'; { if (k == 'd') //down 'd'; { spd = 1500; step(sd1, -16); } if (k == 'u') //up 'u'; { spd = 1500; step(sd1, 16); } if (k == 'r') //right 'r'; { spd = 80; step(sd2, 16); } if (k == 'l') //left 'l'; { spd = 80; step(sd2, -16); } } } void Diagnostic(MenuItem* p_menu_item) { lcd.setCursor(0, 0); lcd.print(F("Diagnostic mode")); while (k != 'c') //Esc/Cancel 'c'; { if (k == 'd') { spd = 200; step(sd1, FULLTURN1 * -1); } if (k == 'u') { spd = 200; step(sd1, FULLTURN1); } if (k == 'r') { spd = 50; int i = 0; while (i != 43) { step(sd2, STEP_PER_MM); i++; } } if (k == 'l') { spd = 50; step(sd2, FULLTURN2 * -1); } } } void Wired(MenuItem* p_menu_item) { while (k != 'c') { lcd.setCursor(0, 1); lcd.print("Wired:"); lcd.print(WIRED, 2); lcd.print(" < "); if (k == 'l') { if (WIRED > 0.2) { WIRED = WIRED - 0.01; delay(100); } } if (k == 'r') { if (WIRED < 0.6) { WIRED = WIRED + 0.01; delay(100); } } if (k == 'e') { EEPROM_float_write(0, WIRED); lcd.print(" OK"); delay(100); } } } void Window(MenuItem* p_menu_item) { while (k != 'c') { lcd.setCursor(0, 1); lcd.print("Window:"); lcd.print(WINDOW, 1); lcd.print(" < "); delay(20); if (k == 'l') { if (WINDOW > 0.5) { WINDOW = WINDOW - 0.5; delay(100); } } if (k == 'r') { if (WINDOW < 150) { WINDOW = WINDOW + 0.5; delay(100); } } if (k == 'e') { EEPROM_float_write(4, WINDOW); lcd.print("OK"); delay(100); } } } void Coils(MenuItem* p_menu_item) { while (k != 'c') { lcd.setCursor(0, 1); lcd.print("Coils:"); lcd.print(COILS); lcd.print(" < "); delay(200); if (k == 'l') { if (COILS > 10) { COILS = COILS - 1; delay(60); } } if (k == 'r') { if (COILS < 5000) { COILS = COILS + 1; delay(60); } } if (k == 'u') { if (COILS < 4900) { COILS = COILS + 100; delay(60); } } if (k == 'd') { if (COILS > 100) { COILS = COILS - 100; delay(60); } } if (k == 'e') { EEPROM_int_write(8, COILS); lcd.print("OK"); delay(100); } } } void Runing(MenuItem* p_menu_item) { count_coils = 0; int COILSPW = WINDOW / WIRED; //сколько витков помещается в окошке STEP_PER_COIL = STEP_PER_MM * WIRED; //расчитываем кол-во шагов на виток lcd.setCursor(0, 0); lcd.print("Wir:"); lcd.print(WIRED); lcd.print(" W:"); lcd.print(WINDOW, 1); lcd.setCursor(14, 1); lcd.print(COILSPW); float Tpercent = 0; int stepsNado = 0; int s = 0; byte stat = 0; spd = 600; digitalWrite(sd1d, LOW); //вот выбрали направление motor_on = 1; //и идем long ttt = 0; lcd.setCursor(0, 1); lcd.print("C:"); while (count_coils <= COILS) { delayMicroseconds(spd); if (motor_on == 1) { //что-нибудь делаем, если только motor_on if (flag_i == 0) { digitalWrite(sd1, HIGH); flag_i = 1; } else { digitalWrite(sd1, LOW); flag_i = 0; steps1++; //счетчик шагов } Tpercent = float(steps1) / float(FULLTURN1); stepsNado = Tpercent * STEP_PER_COIL; s = stepsNado - steps2; steps2 = stepsNado; step(sd2, dir * s); if (steps1 == FULLTURN1) { count_coils++; count_coilspw++; steps1 = 0; steps2 = 0; lcd.setCursor(2, 1); lcd.print(count_coils); lcd.print("/"); lcd.print(COILS); lcd.print(" "); lcd.print(COILSPW); if (dir > 0) { lcd.print(" >"); } else { lcd.print(" <"); } if (count_coilspw == COILSPW) { if (dir == d1) { dir = d2; } else { dir = d1; //меняем направление } count_coilspw = 0; spd = 600; pause(); //пауза } } else { delayMicroseconds(100); } } if (k == 'e') { if (pause()) { return; } } } motor_on = 0; //стоп машина } byte pause() { motor_on = 0; delay(300); int cnt = 0; int flag = 0; while (k != 'e') { lcd.setCursor(15, 1); if (flag) { lcd.print(" "); } else { lcd.print("P"); } if (cnt < 100) { cnt++; } else { cnt = 0; if (flag) { flag = 0; } else { flag = 1; } } delay(10); if (k == 'c') { return 1; } } motor_on = 1; lcd.setCursor(15, 1); lcd.print(" "); delay(200); return 0; } void Direction(MenuItem * p_menu_item) { while (k != 'c') { lcd.setCursor(0, 1); lcd.print("Dir.:"); if (dir > 0) { lcd.print(" >"); } else { lcd.print(" <"); } lcd.print(" < "); delay(200); if (k == 'l') { dir = 1; delay(200); } if (k == 'r') { dir = -1; delay(200); } if (k == 'e') { EEPROM_int_write(12, dir); lcd.print("OK"); delay(100); } } } void step(int drive, int steps) { int sdir; int dirval; if (steps < 0 ) { steps = abs(steps); dirval = HIGH; } else { dirval = LOW; } if (drive == sd1) { sdir = sd1d; } if (drive == sd2) { sdir = sd2d; } digitalWrite(sdir, dirval); while (steps != 0 ) { delayMicroseconds(spd); digitalWrite(drive, HIGH); delayMicroseconds(spd); digitalWrite(drive, LOW); steps--; } } void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ { byte *x = (byte *)&val; for (byte i = 0; i < 4; i++) EEPROM.write(i + addr, x[i]); } float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ { byte x[4]; for (byte i = 0; i < 4; i++) x[i] = EEPROM.read(i + addr); float *y = (float *)&x; return y[0]; } void EEPROM_int_write(int p_address, int p_value) { byte lowByte = ((p_value >> 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); } unsigned int EEPROM_int_read(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00); }
шыпко не разбирался, но 9-й пин используется и для кнопки и для lcd, а этта неправильно.
шыпко не разбирался, но 9-й пин используется и для кнопки и для lcd, а этта неправильно.
Добрый вечер . ошибку с 9 пином изменил , результат тот же . Вверх и вниз кнопки срабатывают а при выборе любой функиции я не могу сделать не одну настройку . В лево и в право кнопки не где не срабатывают .
Так а у Вас и нет каких-либо действий на эти кнопки. Смотрите Вашу функцию menu(), разве там есть что-то про влево и вправо? Контроллер сам о Ваших желаниях не догадается :)
Так а у Вас и нет каких-либо действий на эти кнопки. Смотрите Вашу функцию menu(), разве там есть что-то про влево и вправо? Контроллер сам о Ваших желаниях не догадается :)
Я правильно вас понимаю ? в этом заголовке надо вписать функуи. влево и вправо :
181
void
menu() {
182
183
k = KEY();
184
switch
(k) {
185
case
'c'
:
//Esc/Cancel 'c';
186
ms.back();
187
hello();
188
break
;
189
190
case
'u'
:
//up 'u';
191
ms.prev();
192
MenuSystem();
193
break
;
194
195
case
'd'
:
//down 'd';
196
ms.next();
197
MenuSystem();
198
break
;
199
200
case
'e'
:
//Enter 'e';
201
ms.select();
202
MenuSystem();
203
break
;
204
}
205
}
в библеотеке я не нашел таких функций #include <MenuSystem.h>
Так а у Вас и нет каких-либо действий на эти кнопки. Смотрите Вашу функцию menu(), разве там есть что-то про влево и вправо? Контроллер сам о Ваших желаниях не догадается :)
посоветуйте какую библеотеку использовать для меню и ардуино lcd шилда с кнопками . Заранее спасибо
У Вас тут много ошибок. Кнопка считывается в функции KEY() и значение возвращается в виде одного из символов - r u d l e. А в функции menu() есть проверка на c u d e. 'c' откуда возьмётся? Не может у Вас такого значения быть. А 'l' вообще не проверяется. 'c' ещё и в скетче в других функциях проверяется, значит и они у Вас не работают. Исправляйте.
У Вас кнопки используются двояко. Во-первых, для навигации по меню, во-вторых, уже где-то по ходу работы. И что по этим кнопкам должно делаться - только Вы знаете. Может в меню они Вам и не нужны?
Библиотек не подскажу. А чем Вас то, что есть не устраивает?
Основная программа и не моя . я решил собрать станок и взял материал из интеренета , так как я не умею прогромировать ! Попытался самостоятельно устранить ошибки , но особо не получатся! Вот решиз задать вопрос по поводу прошивки , чтобы люди которые понимают этот код подсказали мне где эти ошибки и как заставить работать этот код правильно
У Вас тут много ошибок. Кнопка считывается в функции KEY() и значение возвращается в виде одного из символов - r u d l e. А в функции menu() есть проверка на c u d e. 'c' откуда возьмётся? Не может у Вас такого значения быть. А 'l' вообще не проверяется. 'c' ещё и в скетче в других функциях проверяется, значит и они у Вас не работают. Исправляйте.
У Вас кнопки используются двояко. Во-первых, для навигации по меню, во-вторых, уже где-то по ходу работы. И что по этим кнопкам должно делаться - только Вы знаете. Может в меню они Вам и не нужны?
Библиотек не подскажу. А чем Вас то, что есть не устраивает?
Основная программа и не моя . я решил собрать станок и взял материал из интеренета , так как я не умею прогромировать ! Попытался самостоятельно устранить ошибки , но особо не получатся!
Значит начните с более простых примеров и книжек по языку, вернётесь к этой задаче, когда всё в программе понятно станет, либо обратитесь в раздел "Ищу исполнителя", там может кто за денежку Вашу проблему решит. На этом форуме других вариантов у Вас нет, так как тут не ошибку исправить нужно, а полностью за Вас взять и сделать.
Вот решиз задать вопрос по поводу прошивки , чтобы люди которые понимают этот код подсказали мне где эти ошибки и как заставить работать этот код правильно
в сообщении #6 kalapanga вам подсказал для начала самые очевидные ошибки. Попробуйте исправить сначала эти - и посмотрите, как изменится работа кода.
Вот решиз задать вопрос по поводу прошивки , чтобы люди которые понимают этот код подсказали мне где эти ошибки и как заставить работать этот код правильно
в сообщении #6 kalapanga вам подсказал для начала самые очевидные ошибки. Попробуйте исправить сначала эти - и посмотрите, как изменится работа кода.
Возможно мои исправления не совсем и верны . вы просмотрели исправленный код последний ?
Если Вы о коде в сообщении #9, то всё стало ещё хуже. Вы намешали строчки программы по совершенно непонятной логике. А программа Ваша теперь вообще ничего не делает кроме каких-то начальных установок. Вы этого не заметили?
Ну сложна эта задача для Вас, начинайте с элементарных примеров!