Advertisement
Guest User

Untitled

a guest
Sep 27th, 2013
905
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.48 KB | None | 0 0
  1. //либы
  2. #include <Bounce.h>
  3. #include <MsTimer2.h>
  4. #include <LiquidCrystal.h>
  5. //кнопки (входы)
  6. #define ENABLE_B 2   // кнопка включить выключить двигатель
  7. #define DIRECTION_B 3 // кнопка реверс
  8. #define UP_SPEED_B 4 // + скорость
  9. #define DOWN_SPEED_B 5 // -скорость
  10. #define HALF_FULL_B 6 // шаг/полушаг
  11. #define MODE_B 7 // режим
  12. #define STEP_B A0 //шаг
  13.  
  14. //выходы (идут на входы L297)
  15. #define ENABLE_P A5 //пин включения
  16. #define DIRECTION_P A4 //пин направление
  17. #define CLOCK_P A3 //клок пин
  18. #define HALF_FULL_P A2 //шаг полушаг
  19. #define RESET_P A1 //пин сброса
  20. // начальные данные
  21. int enable_var = LOW; // двигатель отключен
  22. int direction_var = LOW; // по часовой
  23. int speed = 10; // скорость
  24. int half_full_var = HIGH; // полушаговый режим
  25. int mode = LOW; //режим одногошага
  26.  
  27. //инициализация объектов для дебоунсера
  28. Bounce bouncer = Bounce( ENABLE_B, 5 );
  29. Bounce bouncer1 = Bounce( DIRECTION_B, 5 );
  30. Bounce bouncer2 = Bounce( UP_SPEED_B, 5 );
  31. Bounce bouncer3 = Bounce( DOWN_SPEED_B, 5 );
  32. Bounce bouncer4 = Bounce( HALF_FULL_B, 5 );
  33. Bounce bouncer5 = Bounce( MODE_B, 5 );
  34. Bounce bouncer6 = Bounce( STEP_B, 10 );
  35.  
  36. LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //инициализация дисплея
  37. //переменные для хранения символов
  38. byte symb_L[8] = {     //символ Л
  39.   0x7, 0x9, 0x9, 0x9, 0x9, 0x9, 0x11, 0x0};
  40. byte symb_P[8] = {     //символ П
  41.   0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0};
  42. byte symb_U[8] = {     //символ У
  43.   0x11, 0x11, 0x11, 0xF, 0x1, 0x1, 0xE, 0x0};
  44. byte symb_m[8] = {     //символ м
  45.   0x0, 0x0, 0x11, 0x1B, 0x15, 0x11, 0x11, 0x0};
  46. byte symb_b[8] = {     //символ б
  47.   0x1, 0xE, 0x10, 0x1E, 0x11, 0x11, 0xE, 0x0};
  48. byte symb_i[8] = {     //символ и
  49.   0x0, 0x0, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0};
  50. byte symb_n[8] = {    //символ н
  51.   0x0, 0x0, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x0};
  52. byte symb_ch[8] = { //симовол Ч
  53.   0x11, 0x11, 0x11, 0xF, 0x1, 0x1, 0x1,};
  54.  
  55.  
  56. void setup() {
  57.   // объявление кнопок входами для МК
  58.   pinMode(ENABLE_B, INPUT);
  59.   pinMode(DIRECTION_B, INPUT);
  60.   pinMode(UP_SPEED_B, INPUT);
  61.   pinMode(DOWN_SPEED_B, INPUT);
  62.   pinMode(HALF_FULL_B, INPUT);
  63.   pinMode(MODE_B, INPUT);
  64.   pinMode(STEP_B, INPUT);
  65.  
  66.   // объявление пинов выходами
  67.   pinMode(CLOCK_P, OUTPUT);
  68.   pinMode(ENABLE_P, OUTPUT);
  69.   pinMode(DIRECTION_P, OUTPUT);
  70.   pinMode(RESET_P,OUTPUT);
  71.   pinMode(HALF_FULL_P, OUTPUT);
  72.  
  73.   // ввывод начальных данных
  74.   digitalWrite(ENABLE_P, enable_var);
  75.   digitalWrite(CLOCK_P, HIGH);
  76.   digitalWrite(RESET_P, LOW);
  77.   delayMicroseconds(10);
  78.   digitalWrite(RESET_P, HIGH);
  79.   digitalWrite(DIRECTION_P, direction_var);
  80.   digitalWrite(DIRECTION_P, direction_var);
  81.   digitalWrite(HALF_FULL_P, half_full_var);
  82.  
  83.   Serial.begin(9600); // для отладки
  84.  
  85.   //  MsTimer2::set(speed, flash); // объявление таймера
  86.   // MsTimer2::start(); // запуска таймера
  87.  
  88.   lcd.begin(16, 2); //объявление размера дисплея
  89.   //создание новых символов
  90.   lcd.createChar(1, symb_L);
  91.   lcd.createChar(2, symb_P);
  92.   lcd.createChar(3, symb_U);
  93.   lcd.createChar(4, symb_m);
  94.   lcd.createChar(5, symb_b);
  95.   lcd.createChar(6, symb_i);
  96.   lcd.createChar(7, symb_n);
  97.   lcd.createChar(8, symb_ch);
  98.   upd_lcd();  //обновить дисплей
  99.   Serial.println("test");
  100. }
  101.  
  102. void loop() {
  103.   // чтение кнопок
  104.   // чтение кнопки ENABLE
  105.   if ( bouncer.update() ) {  
  106.     if ( bouncer.read() == HIGH) {
  107.       enable_var = !enable_var;
  108.       digitalWrite(ENABLE_P, enable_var);
  109.       update_speed(); //обновить таймер скорости
  110.       upd_lcd();  //обновить дисплей
  111.       digitalWrite(RESET_P, LOW);
  112.       delayMicroseconds(10);
  113.       digitalWrite(RESET_P, HIGH);
  114.     }
  115.   }
  116.   // чтение кнопки DIRECTION
  117.   if ( bouncer1.update() ) {
  118.     if ( bouncer1.read() == HIGH) {
  119.       direction_var = !direction_var;
  120.       digitalWrite(DIRECTION_P, direction_var);
  121.       upd_lcd(); //обновить дисплей
  122.     }
  123.   }
  124.   // Чтение кнопки +
  125.   if ( bouncer2.update() ) {
  126.     if ( bouncer2.read() == HIGH) {
  127.       speed = speed + 1;
  128.       update_speed(); //обновить таймер скорости
  129.       upd_lcd();  //обновить дисплей
  130.     }
  131.   }
  132.   // чтение кнопки -
  133.   if ( bouncer3.update() ) {
  134.     if ( bouncer3.read() == HIGH) {
  135.       speed = speed - 1;
  136.       update_speed(); //обновить таймер скорости
  137.       upd_lcd();  //обновить дисплей
  138.     }
  139.   }
  140.   // чтение кнопки HALF_FULL
  141.   if ( bouncer4.update() ) {
  142.     if ( bouncer4.read() == HIGH) {
  143.       half_full_var = !half_full_var;
  144.       digitalWrite(HALF_FULL_P, half_full_var);
  145.       upd_lcd(); //обновить дисплей
  146.       digitalWrite(RESET_P, LOW);
  147.       delayMicroseconds(10);
  148.       digitalWrite(RESET_P, HIGH);
  149.  
  150.     }
  151.   }
  152.   // чтение кнопки MODE
  153.   if ( bouncer5.update() ) {
  154.     if ( bouncer5.read() == HIGH) {
  155.       mode = !mode;
  156.       update_speed();
  157.       Serial.println(mode);
  158.       upd_lcd(); //обновить дисплей
  159.       digitalWrite(RESET_P, LOW);
  160.       delayMicroseconds(10);
  161.       digitalWrite(RESET_P, HIGH);
  162.  
  163.     }
  164.   }
  165.   // чтение кнопки STEP
  166.   if ( bouncer6.update() ) {
  167.     if ( bouncer6.read() == HIGH) {
  168.       Serial.println("STEP");
  169.       upd_lcd(); //обновить дисплей
  170.       if (mode == 0){
  171.         digitalWrite(CLOCK_P, LOW);
  172.         delay(1);
  173.         digitalWrite(CLOCK_P, HIGH);
  174.       }
  175.     }
  176.   }  
  177. }
  178.  
  179. void flash() // импульс шага
  180. {
  181.   digitalWrite(CLOCK_P, LOW);
  182.   //  delayMicroseconds(1);
  183.   delay(1);
  184.   digitalWrite(CLOCK_P, HIGH);
  185.   //  Serial.println(speed); //вывод скорости в порт
  186. }
  187. void update_speed()//обновление таймера скорости
  188. {
  189.   speed = constrain(speed, 8, 99); //удержание в пределах 4-200
  190.   if (enable_var == 1 && mode ==1) //если ВКЛ то обновляем таймер
  191.   {
  192.     MsTimer2::stop(); //остановка таймера
  193.     MsTimer2::set(speed, flash); //установка нового промежутка
  194.     MsTimer2::start();  //запуск таймера
  195.   }
  196.   else MsTimer2::stop();
  197. }
  198. void print_VKL() //вывод надписи ВКЛ
  199. {  
  200.   lcd.print("BK");
  201.   lcd.write(1);
  202.   lcd.print("  ");
  203. }
  204. void print_OTKL()  //вывод написи ОТКЛ
  205. {  
  206.   lcd.print("OTK");
  207.   lcd.write(1);
  208.   lcd.print(" ");
  209. }
  210. void print_ms()  //вывод частоты
  211. {
  212.   if ((speed / 10) < 1) lcd.print(" "); // если число не 2х значное вывести пробел
  213.   lcd.print(speed); //вывести частоту
  214.   lcd.write(4);
  215.   lcd.print("c ");
  216.     if (speed == 8 || speed == 99 && mode == 1) lcd.print("!"); // если максимальная скорость вывести !
  217.   else lcd.print(" ");
  218. }
  219. void print_POLU() //вывод ПОЛУ
  220. {
  221.   lcd.write(2);
  222.   lcd.print("O");
  223.   lcd.write(1);
  224.   lcd.write(3);
  225. }
  226. void print_POLN() //вывод ПОЛН
  227. {
  228.   lcd.write(2);
  229.   lcd.print("O");
  230.   lcd.write(1);
  231.   lcd.write("H");
  232. }
  233. void print_dir_cw()  //вывод >>
  234. {
  235.   lcd.print(">>");
  236. }
  237. void print_dir_ccw() //вывод <<
  238. {
  239.   lcd.print("<<");
  240. }
  241. void print_obmin() //вывод скорости об/мин
  242. {
  243.   float pspeed = 0; //переменная для хранение об/мин
  244.   byte kf = 0;  //кф шага/полушага
  245.   if ( half_full_var == 0) kf = 2;
  246.   else kf = 1;
  247.   lcd.setCursor(0, 1); //установка курсора на 2ю строку
  248.   pspeed = (kf * 625) / (float)speed;  //высчитываем скорость
  249.   if (mode == 1) {
  250.     if ((pspeed / 100) < 1) lcd.print(" "); //если число не 2х значное выводим пробел
  251.     if ((pspeed / 10) < 1) lcd.print(" ");
  252.     lcd.print(pspeed); //выводим скорость
  253.     lcd.print(" ");
  254.     lcd.print("o");
  255.     lcd.write(5);
  256.     lcd.print("/");
  257.     lcd.write(4);
  258.     lcd.write(6);
  259.     lcd.write(7);
  260.     lcd.print(" ");
  261.   }
  262.   else {
  263.     lcd.print("      P");
  264.     lcd.write(3);
  265.     lcd.write(8);
  266.     lcd.print("H    ");
  267.   }
  268. }
  269. void upd_lcd()  //функция обновления дисплея
  270. {
  271.   lcd.setCursor(0,0); //установка курсора в начало дисплея
  272.   if (enable_var == 1)  print_VKL(); //если двигатель включен вывзываем функцию вывода ВКЛ
  273.   else print_OTKL();   // иначе выводим ВЫКЛ
  274.   if ( half_full_var == 1) print_POLU(); // если включен режим полушага вызываем функцию вывода ПОЛУ
  275.   else print_POLN(); //иначе выводим ПОЛН
  276.   lcd.print(" ");
  277.   if (mode == 1)print_ms(); // вызываем вывод частоты
  278.   else lcd.print ("      ");
  279.   print_obmin(); //вызываем вывод об/мин
  280.   if ( direction_var == 0) print_dir_cw(); // отображаем направление
  281.   else print_dir_ccw();
  282. }
  283. void mode_switch()
  284. {
  285.   if (mode == 0) MsTimer2::stop;
  286.   else MsTimer2::start;
  287. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement