DRAKON.SU

Текущее время: Четверг, 08 Декабрь, 2022 06:40

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
СообщениеДобавлено: Суббота, 30 Июль, 2022 12:45 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
Решил разобраться с построением Дракон схем.
Нет ничего лучше чем взять рабочий скетч Ардуино и на его основе нарисовать Дракон схему
Используется Arduino UNO R3. Atmega 328
Программа Drakon-Editor 1.31 от Митькина.
Скетч взят от Станка намотки катушки индуктивности.
Источник: https://youtu.be/01Un0Ifq334
Однако сам скетч используется модернизированный, добавлено:
- обработка геркона (подсчет оборотов намотки)
- включение нагрева проволоки для нанесения изоляции
- дополнительный дисплей LCD1602
Симуляция работы модернизированного станка, ссылка: https://youtu.be/yynDRfAlyrE
Ссылка на сам модернизированный скетч: https://yourmy.monster/WE1PX4

Ну и естественно столкнулся с проблемой как этот код, запихивать в дракон схему.
То есть в данном случае я решаю обратную задачу, как работает программа.


Последний раз редактировалось tur55 Суббота, 30 Июль, 2022 12:50, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Июль, 2022 12:48 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
Собственно сам скетч Станка намотки катушки индуктивности с нанесением изоляции на проволоку.
Код:
/* Main.ino file generated by New Project wizard
 *
 * Created:   Чт июл 21 2022
 * Processor: Arduino Uno
 * Compiler:  Arduino AVR
 */

// Peripheral Configuration Code (do not edit)
//---CONFIG_BEGIN---
#pragma GCC push_options
#pragma GCC optimize("Os")

#include <core.h> // Required by cpu
#include <cpu.h>

#pragma GCC pop_options

// Peripheral Constructors
CPU &cpu = Cpu;

void peripheral_setup()
{
}

void peripheral_loop()
{
}
//---CONFIG_END---

//Скетч под три кнопки управления станком по намотке провода от Proektirovshik
//видео станка ниже на ютубе и дзене
// https://youtu.be/01Un0Ifq334
// https://zen.yandex.ru/video/watch/626ea9b95bdcdb7bacf09e1d
//управляет сервоприводом укладчика провода и основным мотрчиком с редуктором
//с кнопок на выводах 11 больше и 12 меньше устанавливается значение количества витков и нажимается пуск на кнопке вывод 10
//моторредуктор висит на 3 и 4 выводах через плату контроллера D293
//сервопривод висит на 9 выводе через плату контроллера D293
//управление экраном по шине I2C
#include <Wire.h>                   //объявление библиотеки Wire
#include <SSD1306Ascii.h>           //объявление библиотеки для вывода текста на OLED дисплеи
#include <SSD1306AsciiWire.h>       //объявление библиотеки для вывода текста на OLED дисплеи
#include <LiquidCrystal_I2C.h>      //#############################################объявление библиотеки для вывода текста на LCD1602
#include <Servo.h>                  //объявление библиотеки для сервопривода
#define I2C_ADDRESS 0x3C            // I2C_ADDRESS присвоить адрес 0x3C
Servo servo;                        // Создаем объект сервопривод
SSD1306AsciiWire oled;              //инициирование дисплея
LiquidCrystal_I2C lcd(0x20, 16, 2); //##############################################установка lcd1602 на адрес 0x20
int UP = 12;                        //кнопка переманной вперед UP присвоено значение 12
int DOWN = 11;                      //кнопка переменной назад DOWN присвоено значение 11
int START = 10;                     //кнопка переменной старт START присвоено значение 10
int NAGREV = 2;                     //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@вывод на управление нагревом
int GERKON = 5;                     //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! порт 5 называем GERKON
int x = 0;                          //переменной x присвоено значение 0
unsigned short y = 0;               //желаемое количество витков переменной y (0 до 65535) присвоено изначально значение 0
unsigned int CountGerkon = 0;       //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!счетчик Геркона
static int j = 1;                   //вспомогательной переменной j присвоена 1 для цикла серво привода
static int g = 0;                   //переменной g присвоен изначально 0 это количество умещаемых витков в одной секции
#define MOT1_STP 4                  // MOT1_STP присвоить значение вывода 4
#define MOT1_DIR 3                  // MOT1_DIR присвоить значение вывода 3

void setup()
{
    peripheral_setup();
    // TODO: put your setup code here, to run once:
    servo.attach(9);        // Указываем объекту класса Servo, что серво присоединен к пину 9
    servo.write(0);         // Выставляем начальное положение
    Wire.begin();           //Инициализирует библиотеку Wire и подключается к шине I2C
    Wire.setClock(400000L); //задаем частоту передачи данных 400кГц
    oled.begin(&Adafruit128x64, I2C_ADDRESS);
    oled.setFont(Adafruit5x7);
    oled.clear();                  //почистить экран OLED
    lcd.init();                    //##################################################инициализация lcd1602
    lcd.backlight();               //##################################################вкл подстветка
    pinMode(UP, INPUT_PULLUP);     //Устанавливает режим работы заданного вход/выхода(pin) как входа
    pinMode(DOWN, INPUT_PULLUP);   //Устанавливает режим работы заданного вход/выхода(pin) как входа
    pinMode(START, INPUT_PULLUP);  //Устанавливает режим работы заданного вход/выхода(pin) как входа
    pinMode(MOT1_DIR, OUTPUT);     //Устанавливает режим работы заданного вход/выхода(pin) как выхода
    pinMode(MOT1_STP, OUTPUT);     //Устанавливает режим работы заданного вход/выхода(pin) как выхода
    pinMode(NAGREV, OUTPUT);       //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Управление нагревом
    pinMode(GERKON, INPUT_PULLUP); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Порт Геркон принимает сигнал от кнопки
    x = 0;                         //обнуляем
    y = 0;                         //обнуляем
}

void loop()
{
    peripheral_loop();
    // TODO: put your main code here, to run repeatedly:
    staticmenu(); //вызов функции

    if (!digitalRead(UP) && x == 0) //если нажата кнопка UP
    {
        oled.clear();           //чистка экрана
        lcd.clear();            //#####################################################чистка lcd1602
        staticmenu();           //вызов функции
        y += 1;                 //прибавляем один виток при нажатии кнопки UP
        delay(5);               //задержка при установки числа витков в плюс
        oled.setCursor(55, 60); //курсор в точку
        oled.print(y, DEC);     //на экран в десятичном виде выдать значение переменной y
        lcd.setCursor(6, 1);    //#####################################################ставим курсор на 6 позицию 1 строки
        lcd.print(y, DEC);      //#####################################################на экран в десятичном виде выдать значение переменной y
    }
    if (!digitalRead(DOWN) && x == 0) // если нажата кнопка DOWN
    {
        oled.clear();           //чистка экрана
        lcd.clear();            //чистка lcd1602
        staticmenu();           //вызов функции
        y -= 1;                 //вычитаем один виток при нажатии кнопки DOWN
        delay(5);               //задержка установки числа витков в минус
        oled.setCursor(55, 60); //курсор в точку
        oled.print(y, DEC);     //на экран в десятичном виде выдать значение переменной y
        lcd.setCursor(6, 1);    //#####################################################ставим курсор на 6 позицию 1 строки
        lcd.print(y, DEC);      //#####################################################на экран в десятичном виде выдать значение переменной y
    }
    if (x == 0 && y >= 1) //если x=0 и введено некоторое количество витков y больше или равно 1
    {
        if (!digitalRead(START)) //если нажата кнопка старт
        {
            stepA(); //вызвать функцию stepA
        }
    }
}

void staticmenu() //сама функция staticmenu()
{
    oled.set2X();
    oled.setCursor(20, 0);
    oled.println("HAMOTKA"); //Надпись названия программы сверху
    lcd.setCursor(0, 0);
    lcd.println("    HAMOTKA     "); //##################################################вывод строки Привет мир
}

void stepA() //сама функция stepA
{
    x = 1; //переменной x присвоена 1
    // for (unsigned int a = 1; a <= y; a++) // a это текущее значение намотанных витков на экране, для a=1, a меньше или равно y, прибавить к a единицу
    do // Заменяем цикл FOR на DO .. WHILE цикл идет до тех пор пока CountGerkon не сравняется с установленным количеством намотки y
    {
        if (j) //организуем цикл для сервопривода качания каретки вправо влево
        {
            if (g == 22) // g витков в одном слою секции меняется возрастая и убывая
            {
                j = 0;
                --g; //вычесть единицу
            }
            else
                ++g; //прибавить единицу
        }
        else
        {
            if (g == 0)
            {
                j = 1;
                ++g; //прибавить единицу
            }
            else
                --g; //вычесть единицу
        }

        //////////////////////////////обработка геркона (при нажатии кнопки)
        if (!digitalRead(GERKON))         //если сработал геркон
        {
            oled.clear();                 //чистка экрана
            lcd.clear();                  //#####################################################чистка lcd1602
            staticmenu();                 //вызов функции
            CountGerkon += 1;             //прибавляем один при срабатывании геркона
            delay(5);                     //задержка для усранения дребезга
            oled.setCursor(55, 60);       //курсор в точку
            oled.print(CountGerkon, DEC); //на экран в десятичном виде выдать значение переменной y
            lcd.setCursor(6, 1);          //#####################################################ставим курсор на 6 позицию 1 строки
            lcd.print(CountGerkon, DEC);  //#####################################################на экран в десятичном виде выдать значение переменной y
        }
        /////////////////////////////end обработки геркона (нажатия кнопки)

        oled.clear(); //почистить экран
        lcd.clear();  //чистка lcd1602
        staticmenu(); //вызов функции staticmenu()
        oled.set2X();
        oled.setCursor(55, 65);       //курсор поставить на 55 и 65
        oled.print(CountGerkon, DEC); //печать на экран фактического текущего значения витков переменной a
        lcd.setCursor(6, 1);          //#############################################################курсор поставить на 6 позицию 1 строки
        lcd.print(CountGerkon, DEC);  //#############################################################печать на экран фактического текущего значения витков переменной a
        digitalWrite(MOT1_STP, HIGH); //Установка значения HIGH приведет к тому, что напряжение на выходе MOT1_STP будет 5В
        digitalWrite(NAGREV, HIGH);   //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Установка значения HIGH приведет к тому, что включится нагрев
        servo.write(g);               // Поворачиваем серво на g градусов
        delay(355);                   // ждем 355 подбироается под обороты конкретного редуктора основного привода намотки
    } while (CountGerkon <= y - 1);

    digitalWrite(MOT1_STP, LOW); //Установка значения LOW приведет к тому, что напряжение на выходе MOT1_DIR будет 0В
    digitalWrite(NAGREV, LOW);   //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Установка значения LOW приведет к тому,что нагрев прекратится
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Июль, 2022 18:17 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
В общем итог первого дня знакомства.
1.Программа Митькина оказалась интуитивно непонятной, методом тыка не смог разобраться.
(Специально не читал литературу, не смотрел видео, как работает его Drakon-Editor) с белого листа наскоком не удалось сразу взять вершину.
2.Скачал Фабулу, оказалась интуитивно понятной. Есть подсказки подсвечивает, какие иконки можно брать, какие нет. Смог быстренько накидать Алгоритм взаимодействия со станком.
Глубоко в Фабулу не стал вникать (к примеру не знаю для чего там репозиторий и прочий функционал)

Ставил главное условие - Низкий порог вхождения.

Изображение


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Июль, 2022 18:21 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
Теперь будем Читать описание Иконок
Для чего они и чем отличаются друг от друга похожие по действию Иконки


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Июль, 2022 20:20 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5511
Откуда: Москва
Иконы Имя ветки (Нажать кнопку Up, Нажать кнопку Down) — это просто метки. Они не выполняют никаких действий.
В иконе Конец следует писать Конец (а не Выключить станок)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Июль, 2022 20:36 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
Спасибо за пояснение.
С иконами не познакомился как следует. Сразу быка за рога взял. Только на ошибках можно научится


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Август, 2022 07:19 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
Только что дошло, что я создал алгоритм действий оператора станка,
А не работы самого станка
С учетом замечаний Паронджанова В.Д. изменил схему, добавил красок для наглядности.
Продолжаем изучать Дракон - технологию.


Вложения:
Cnfyjr 12.jpg
Cnfyjr 12.jpg [ 245.27 КБ | Просмотров: 1078 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Август, 2022 09:20 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5511
Откуда: Москва
В вашей схеме четыре ветки.
Мне интересно, что делает каждая ветка.
Пожалуйста, объясните мне в виде связного рассказа, что делает каждая ветка (обычными словами).
Схему переделывать не надо.

.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Август, 2022 10:18 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
В общем имеется скетч рабочий, испытанный, решил его описать в виде Дракон схемы.
Но в результате описал Действие оператора станка, а не самого станка.
Объясняю саму схему, а не работу станка.

Есть N - требуемое количество витков, которые надо намотать на катушку индуктивности

(Ветка Кнопки UP)
Нажимаем Кнопку UP
в результате на экране высвечивается цифра.
Если цифра меньше N нажимает UP
Если цифра равна N переходим на ветку Кнопки START
Если перескочили N переходим на ветку Кнопки DOWN

(Ветка Кнопки DOWN)
Нажимаем Кнопку DOWN
в результате на экране высвечивается цифра.
Если цифра больше N нажимает DOWN
Если цифра равна N переходим на ветку Кнопки START
Если перескочили N переходим на ветку Кнопки UP

(Ветка Кнопки START)
Нажимаем кнопку START
Включается сервопривод, мотор, нагрев проволоки.
(На станке стоит геркон который отсчитывает количество оборотов.)
Если количество оборотов (срабатываний геркона) равна N
переходим на ветку Остановить ..

(Ветка Остановить)
Выключить серво
Выключить Мотор
Выключить Нагрев

КОНЕЦ


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Август, 2022 10:48 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
Еще в процессе создания Дракон схемы возникли число психологические барьеры.
К примеру как соотнести функцию цикла loop() с макроиконой.

Так как Циклы делятся на
I. Циклы со стрелкой
II. Веточные циклы.
III. Циклы ДЛЯ
IV. Циклы ждать

В свою очередь
I. Циклы со стрелкой делятся на

I.1. ДО
I.2. ПОКА
I.3. ГИБРИДНЫЕ
и т.д.

Тут несколько понятийных слоев.
1. Словесное наименование иконы. (Стрелочный цикл, Гибридный цикл)
2. Текстовое обозначение (ПОКА, ДЛЯ, ДО)
3. Графическое обозначение (картинка Иконы)
4. Программисткое обозначение (DO..WHILE; WHILE; FOR)

Предположу что школьник лучше поймет значение слова ПОВТОР чем ЦИКЛ
ПОВТОР С ВОПРОСОМ ПЕРЕД.
ПОВТОР С ВОПРОСОМ ПОСЛЕ.

Чем ЦИКЛ ПОКА, ЦИКЛ ДО...

У меня нет трудностей с английским конструкциями DO...WHILE; FOR и т.д.
Но возникают трудности как соотнести английские конструкции с русской терминологией и иконами


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Август, 2022 13:19 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5511
Откуда: Москва
Я попытался предложить "говорящие" имена веток. Возможно, у меня получилось неудачно, так как я не знаком с предметной областью. Попробуйте исправить мои имена веток, чтобы они ТОЧНО выражали назначения каждой ветки.

tur55 писал(а):
(Ветка Кнопки UP)
Нажимаем Кнопку UP
в результате на экране высвечивается цифра.
Если цифра меньше N нажимает UP
Если цифра равна N переходим на ветку Кнопки START
Если перескочили N переходим на ветку Кнопки DOWN
Я понял так. Задача первой ветки — установить точное или приблизительное число витков. Имя ветки —
«Первая установка числа витков»

tur55 писал(а):
(Ветка Кнопки DOWN)
Нажимаем Кнопку DOWN
в результате на экране высвечивается цифра.
Если цифра больше N нажимает DOWN
Если цифра равна N переходим на ветку Кнопки START
Если перескочили N переходим на ветку Кнопки UP
Имя ветки — «Вторая установка числа витков»

tur55 писал(а):
(Ветка Кнопки START)
Нажимаем кнопку START
Включается сервопривод, мотор, нагрев проволоки.
(На станке стоит геркон который отсчитывает количество оборотов.)
Если количество оборотов (срабатываний геркона) равна N
переходим на ветку Остановить
. Имя ветки — «Включение станка намотки проволоки»

tur55 писал(а):
(Ветка Остановить)
Выключить серво
Выключить Мотор
Выключить Нагрев
. Имя ветки — «Выключение станка намотки проволоки»


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Август, 2022 13:46 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
Можно и так.
Как я и говорил это Алгоритм на основе которого Оператор взаимодействует со станком намотки.
Это не алгоритм программы станка.

А вот Алгоритм скетча Ардуино для станка намотки.

Я его тупо из комментов составил. То есть это Парадигма [Программа-Комментарий].
Возникли вопросы поскольку у меня есть две функции
staticmenu() и stepA() - иконы зеленного цвета

Для них надо делать отдельные силуэты?
Или сойдет если добавить две ветки в представленный силуэт?


Вложения:
Станок1.png
Станок1.png [ 226.48 КБ | Просмотров: 1066 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Август, 2022 14:21 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5511
Откуда: Москва
Алгоритм и программа — разные вещи. У вас получился плохой гибрид (каша) алгоритма и программы.
Так нельзя.
Пишите либо алгоритм, либо программу.

Желательно научиться правильно заполнять иконы Заголовок и Имя ветки. Они должны быть "говорящими".
В иконе Заголовок нельзя писать "Алгоритм".
Икона Имя ветки не может быть пустой. В вашем случае (перед Концом) напишите Завершение.
Вместо Настройка SETUP лучше написать "Установка начальных значений".
В иконе Имя ветки" нельзя писать Цикл Loop (надо писать зачем нужна эта ветка, каково ее назначение).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 04 Ноябрь, 2022 07:17 

Зарегистрирован: Среда, 27 Июль, 2022 16:21
Сообщения: 20
Продолжаю делать свой намоточный станок!!
Использовал Дракон схему и программу Фабула чтоб проанализировать чужой код и видоизменить его.

собственно ссылка на ютуб канал:
https://youtu.be/bOZxCwcbM2c?t=318

Вложение:
изображение_2022-11-04_122137520.png
изображение_2022-11-04_122137520.png [ 265.19 КБ | Просмотров: 427 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 04 Ноябрь, 2022 10:14 

Зарегистрирован: Вторник, 27 Апрель, 2021 05:25
Сообщения: 77
Откуда: Томск
Здравствуйте, можете отправить, пожалуйста, Вашу дракон-схему как отдельный файл, а не скрин из видео? Её невозможно прочесть


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 09 Ноябрь, 2022 20:30 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5511
Откуда: Москва
viewtopic.php?p=106682#p106682


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2008-2022, участники конференции «DRAKON.SU», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB