Помогите разобраться с управлением сверлильным станком

Тема в разделе "Arduino & Shields", создана пользователем Sparkfire, 30 окт 2015.

  1. Sparkfire

    Sparkfire Гик

    По отдельности все подключал, и моторчики, и джойстики, и дисплейчики, и клаву. Первая проблема появилась, когда начал пилить именно свою программу.
    Мне кажется, я даже сейчас прохожу самый сложный ее этап, и все остальное будет намного проще, хотя время покажет.
    Перед покупкой ардуины посмотрел кучу видео, да и сейчас отсматриваю постоянно, куча ссылок в закладках, куча файлов в двух отдельных папках на рабочем столе, мозги постоянно обрабатывают массивы информации. Короче заболел парень.
     
  2. Gippopotam

    Gippopotam Нерд

    Я, с вашего позволения, позволю себе порекомендовать все-таки сменить дисплей. Он вам банально не подходит по количеству выводимой за раз информации. Не говоря уже о количестве задействованных пинов.

    И еще - я в подобных проектах стараюсь не адресовать явно позиции курсора, а использовать именованные константы. Однозначно нет такой каши в коде и изменения/подстройку осуществить намного легче.
     
  3. Gippopotam

    Gippopotam Нерд

    В этой библиотеке реализовано много всего полезного, в том числе антидребезг, но я эту библиотеку редко использую, т.к. стараюсь опрос устройств ввода делать по таймеру. Но просто опросом пинов вы эту клавиатуру не прочитаете - там своя "матричная магия".
     
  4. Sparkfire

    Sparkfire Гик

    Сменить дисплей на 2004 или в принципе сменить на дисплей с I2C ? В этом случае согласен, 4 проводка не 12(и даже не 7). Если использовать только семисегментники, то тоже у каждого по 12 пинов.
    Про библиотеку уже почитал, лучше все-таки ее использовать, в первую очередь из-за дребезга.
    Немного не понял про
    , если не трубно объясните, хотя бы в общих словах.

    И еще,
    это когда место записи сразу прописывается перед setup?
    Не смейтесь сильно, но только постигаю язык, сейчас еще интересно, бывают ли кроме setup и loop, другие функции, чтоб не загружать рабочий процесс..
    Прорабатываю параллельно логику ввода, надеюсь это поможет потом в написании и отладке кода.
    [​IMG] [​IMG] [​IMG] [​IMG]
    пока в таком виде.

    Времени как всегда мало, надо же работать еще))
     
  5. Gippopotam

    Gippopotam Нерд

    Ну в таком случае - лучше сразу 2004 I2C.
    Но я имел в виду любой графический дисплей.

    Семисегментники тоже бывают I2C, но чаще на сдвиговом регистре - там всего 3 провода на 4 знака.

    Дребезг фигня, по сравнению с "матричной магией".

    Использую прерывания по таймеру для опроса кнопок и обработки событий. Очень удобно.

    #define LCD_CURRENT_TEMPERATURE_MEMO 0, 0
    #define LCD_CURRENT_TEMPERATURE 0, 14
    ...
    lcd.setCursor(LCD_CURRENT_TEMPERATURE_MEMO);
    lcd.print("Temperature:");
    lcd.setCursor(LCD_CURRENT_TEMPERATURE);
    lcd.print(currentTemperature);

    Не с того проекта вы начали...

    Прерывания. В том числе по таймеру.
     
    Sparkfire нравится это.
  6. Sparkfire

    Sparkfire Гик

    Приподниму свою тему.
    Пока так и не разобрался с вводом моих трехзначных данных, времени мало, основная работа поглощает. Копаю только по вечерам, пока не усну. Есть один вариант, сейчас доеду до работы- попробую.
    Задумал немного усложнить систему. Хочу, чтоб было учтено время с момента запуска устройства, и количество использованных кВт. Возможно это, знаю. Только вопрос , нужно ли для исполнения какое-то дополнительное оборудование? Часы реального времени не нужны, мне не нужно время, мне нужно количество минут. А вот как быть со счетчиком, до конца не понимаю. Есть мысли?
     
  7. Gippopotam

    Gippopotam Нерд

    ваттметр в рамках вашей системы воплотить не получится.
     
  8. Sparkfire

    Sparkfire Гик

    Может мне что-нибудь докупить? Уж очень сильно захотелось мне узнать количество потребления электроэнергии. Могу дозаказать дополнительную ардуинку, если понадобится.
     
  9. Gippopotam

    Gippopotam Нерд

    простого надежного и точного способа я не знаю.
    можете предположить, что напряжение на моторах всегда 230 вольт, тогда можно измерять ток в цепи с определенными промежутками и из полученных данных вывести мощность.
     
  10. Sparkfire

    Sparkfire Гик

    Да нет, я не об этом...
    Принцип работы обычного счетчика электрического.
    Есть ток- колесико крутится, чем мощнее нагрузка- тем быстрее отсчет.
    Ладно, подумаю еще. Спасибо за ответы)))
     
  11. Sparkfire

    Sparkfire Гик

    Снова привет.
    Сегодня на досуге снова пытался построить часть кода для моего станка, и один человек предложил использовать часть кода от калькулятора. Подумал-подумал, а ведь логика в этом есть!! В калькулятор тоже вводят числа с клавиатуры, и нажимают кнопку с запрограммированной операцией, тем самым завершая ввод и записывая число в память.
    Сам поискал, нашёл один(всего лишь) пример с калькулятором на ардуино. Не знаю что, но меня в нем смущает. В языке разбираюсь плохо. Не подскажете код или часть кода калькулятора на ардуино, но только с комментариями? Буду весьма и весьма.
     
  12. Vad33

    Vad33 Капитан-оригинал

    Цифры можно вводить энкодером, в дисплее использовать бегущую строку.
     
  13. Sparkfire

    Sparkfire Гик

    Накопал отличный код для калькулятора на ардуино. А главное, я теперь могу записывать число в память!!!
    Все лежало на поверхности, просто нужно было взять это))
    Основная затыка с кодом практически решена, завтра покажу, что получилось.
     
  14. Sparkfire

    Sparkfire Гик

    Сегодня собрал все воедино в один модуль, чтоб не висело все на проводах, использовал питание 12В для ардуино, и 5 В( от телефонной зарядки) для дисплея.
    Код калькулятора, мало ли кому нужно будет под спойлером
    Код (C++):
    #include <Keypad.h>
    #include <LiquidCrystal.h>
    long first = 0;
    long second = 0;
    double total = 0;

    char customKey;
    const byte ROWS = 4;
    const byte COLS = 4;
      LiquidCrystal lcd(29, 27, 26, 25, 23, 24, 22);
                                         //1-GND-Vss
                                         //2-5V-Vdd
                                         //3-GND-Vo(контрастность)через потенциометр
                                         //4-digital 29-RS
                                         //5-digital 27-R/W
                                         //6-digital 26-ENABLE
                                         //11-digital 25-DB4
                                         //12-digital 23-DB5
                                         //13-digital 24-DB6
                                         //14 digital 22-DB7
                                         //15-5V-LED+
                                         //16-GND-LED-
    char keys[ROWS][COLS] = {
      {'1','2','3','+'},
      {'4','5','6','-'},
      {'7','8','9','*'},
      {'C','0','=','/'}
    };
    byte rowPins[ROWS] = {31,33,35,37}; //connect to the row pinouts of the keypad
    byte colPins[COLS] = {39,41,43,45}; //connect to the column pinouts of the keypad
    Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

    void setup()
    {
    lcd.begin(16, 2);


    }

    void loop()
    {
      customKey = customKeypad.getKey();
      switch(customKey)
      {
      case '0' ... '9': // This keeps collecting the first value until a operator is pressed "+-*/"
        lcd.setCursor(3,0);
        first = first * 10 + (customKey - '0');
        lcd.print(first);
        break;

      case '+':
        first = (total != 0 ? total : first);
        lcd.setCursor(7,0);
        lcd.print("+");
        second = SecondNumber(); // get the collected the second number
        total = first + second;
        lcd.setCursor(0,3);
        lcd.print(total);
        first = 0, second = 0; // reset values back to zero for next use
        break;

      case '-':
        first = (total != 0 ? total : first);
        lcd.setCursor(7,0);
        lcd.print("-");
        second = SecondNumber();
        total = first - second;
        lcd.setCursor(0,3);
        lcd.print(total);
        first = 0, second = 0;
        break;

      case '*':
        first = (total != 0 ? total : first);
        lcd.setCursor(7,0);
        lcd.print("*");
        second = SecondNumber();
        total = first * second;
        lcd.setCursor(0,3);
        lcd.print(total);
        first = 0, second = 0;
        break;

      case '/':
        first = (total != 0 ? total : first);
        lcd.setCursor(7,0);
        lcd.print("/");
        second = SecondNumber();
        lcd.setCursor(0,3);

        second == 0 ? lcd.print("Invalid") : total = (float)first / (float)second;

        lcd.print(total);
        first = 0, second = 0;
        break;

      case 'C':
        total = 0;
        lcd.clear();
        break;
      }
    }

    long SecondNumber()
    {
      while( 1 )
      {
        customKey = customKeypad.getKey();
        if(customKey >= '0' && customKey <= '9')
        {
          second = second * 10 + (customKey - '0');
          lcd.setCursor(8,0);
          lcd.print(second);
        }

        if(customKey == '=') break;  //return second;
      }
    return second;
    }
    Сейчас пытаюсь из него вычленить только то, что мне нужно, но есть проблема с некоторыми операторами.
    Подскажите как работает switch, что для него значат case, и в чем разница long от int, только в размере числа, для этой переменной? Разобрался
    Еще вопрос, как объяснить double total = 0; в переменных? Не актуально
    Пока вроде все.
    Нет, не все, почему первое число в калькуляторе выводится в начале цикла, а второе в конце, и зашифровано в переменную long SecondNumber() ? И что делать, если мне нужно 3 переменные , например poz1, poz2, poz3? Мне нужно определять их вначале, или в конце, как SecondNumber() ведь между этими переменными никаких действий производиться не будет, они просто задают координату передвижения каретки станка.
    Пока хватит вопросов. Спасибо за скорые ответы заранее)))
    [​IMG][​IMG][/IMG]
     
    Последнее редактирование: 16 дек 2015
  15. Sparkfire

    Sparkfire Гик

    Подскажите, что по синтаксису означает знак вопроса в строке:
    first = (total != 0 ? total : first);
    Насколько я понямаю, значение переменной first присваивается следующее значение: если total не равно нулю, то total становится first
    Прочитал, что написал, чуть голову не сломал..):confused:
     
  16. Sparkfire

    Sparkfire Гик

    Нашел. Интересная штука, хоть и не все еще понял.
    Терна́рная усло́вная опера́ция (от лат.ternarius — «тройной») (обычно записывается как "? :" — во многих языках программирования операция, возвращающая свой второй или третий операнд в зависимости от значения логического выражения, заданного первым операндом. Как можно судить из названия, тернарная операция принимает всего три указанных операнда. Аналогом тернарной условной операции в математической логике и булевой алгебре является условная дизъюнкция, которая записывается в виде [p, q, r] и реализует алгоритм: «Если q, то p, иначе r», что можно переписать как «p или r, в зависимости от q или не q».
    Другими словами «Если q, то p, иначе r», переводя в приведенный выше пример
    first = (total != 0 ? total : first);
    будет означать : если total не равно нулю, то first присваивается значение total, иначе все-таки total
    Знающие, отзовитесь. верны ли мои умозаключения?
     
  17. geher

    geher Гуру

    Если условие перед вопросительным знаком верно (total не ноль), то first присваивается результат выражения между вопросительным знаком и двоеточием (total), иначе first присваивается результат выражения после двоеточия (first).
     
    Sparkfire и Tomasina нравится это.
  18. Sparkfire

    Sparkfire Гик

    С радостью продолжу свою тему.
    Она не заглохла, не умерла и не трансформировалась в что-то другое, как часто бывает.
    Потихоньку достаю детали. По электрике- прикупил два шаговых двигателя, раздобыл самодельную плату управления на 2 мотора, с каналами по 4А, что в разы больше, чем необходимо для моих ШД. Так что апгрейдить моторы есть куда.
    И еще сегодня стал обладателем нового(почти нового) источника питания 12В на целых 20А !!!

    Теперь очередь за подробным проектированием станка, покупкой механики, которую тоже нашел по отличным ценам, и обработкой и отладкой скетча.
     
  19. Sparkfire

    Sparkfire Гик

    ПРоектирование идет полным ходом.
    [​IMG]
     
  20. Sparkfire

    Sparkfire Гик

    Приподнимем темку. Собрана основа механической части станочка. Жду ходовой винт и гайку на маленькую ось, заказанные токарю. Предстоит дальнейшая возня с подключением. И немного фото.

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]