Skip to content

KushlaVR/models-heart

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

99 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Model's Heart

Model's Heart View

Breathe life into your model

Плата для керування електронікою моделі (статичної або рухомої)

Можливості:

  • Керування через WIFI з телефона або ПК
  • 5 незалежних каналів (світлодіоди/сервомотори)
  • 1 Н-міст для підключення мотора (піковий струм до 3А)
  • Вмонтована BMS 1S та контроллер заряду Li-Ion акумулятора з індикацією заряду
  • Вмикання/вимикання 1 кнопкою (вже є на платі)
  • Дистанційне вимкнення

Поки ти читаєш цей текст - українці гинуть від російських ракет.

While you are reading this text, Ukrainians are dying from russian missiles.

Ти можеш перерахувати будь-яку суму на спеціальний рахунок Національного Банку України для допомоги збройним силам україни у протистоянні російському окупанту.

Навіть незначна сума може врятувати чиєсь життя!

You can transfer any amount to a special account of the National Bank of Ukraine to help the armed forces of Ukraine in the fight against the Russian occupier.

Even a small amount can save someone's life!

Для зарахування коштів у національній валюті:

Банк: Національний банк України
МФО 300001
Рахунок № UA843000010000000047330992708
код ЄДРПОУ 00032106
Отримувач: Національний банк України 

To deposit funds in USD:

BENEFICIARY: National Bank of Ukraine
BENEFICIARY BIC: NBUA UA UX
BENEFICIARY ADDRESS: 9 Instytutska St, Kyiv, 01601, Ukraine
ACCOUNT NUMBER: 804790258
BENEFICIARY BANK NAME: JP MORGAN CHASE BANK, New York
BENEFICIARY BANK BIC: CHASUS33
ABA 0210 0002 1
BENEFICIARY BANK ADDRESS: 383 Madison Avenue, New York, NY 10017, USA
PURPOSE OF PAYMENT: for ac 47330992708 

To deposit funds in EUR:

BENEFICIARY: National Bank of Ukraine
IBAN DE05504000005040040066
PURPOSE OF PAYMENT: for ac 47330992708
BENEFICIARY BANK NAME: DEUTSCHE  BUNDESBANK, Frankfurt
BENEFICIARY BANK BIC: MARKDEFF
BENEFICIARY BANK ADDRESS: Wilhelm-Epstein-Strasse 14, 60431 Frankfurt Am Main, Germany

To deposit funds in GBP:

BENEFICIARY/RECIPIENT NAME: National Bank of Ukraine
ACCOUNT NUMBER: 80033041
IBAN GB52CHAS60924280033041
BENEFICIARY ADDRESS: 9 Instytutska St, Kyiv, 01601, Ukraine
BENEFICIARY BANK NAME: JP MORGAN CHASE BANK NA, London
BENEFICIARY BANK BIC: CHASGB2L
SORT CODE: 60-92-42 
BENEFICIARY BANK ADDRESS: 125 London Wall, London EC2Y 5AJ, UK
PURPOSE OF PAYMENT: for ac 47330992708

Донатьте на ЗСУ

Як створювалась ця плата

https://www.youtube.com/watch?v=I-fucbyPBxc&list=PLNvbguf8aVrykSSVMaIyB5YiUsczeTyt5

Цей список відтворення містить детальний опис процесу проектування, виготовлення та створення прошивки для цього проекту з чистого листка.

Schematic

Model's Heart Schematic

Board

Photo

Що обрати Model's Heart чи Arduino?

Плата Model's Heart та Arduino чи Wemos не є взаємозамінні. Вони схожі, проте мають і відмінності. Це як комп'ютери із різною комплектацією. Для коащого розуміння ознайомтесь із порівняльоню таблицею.

Проівняльна таблиця Arduino Nano, Wemos D1, Model's Heart

Характеристика Arduino Nano Wemos D1 Model's Heart
Процесор Atmega 328 ESP8266 ESP8266
Ядро 8-bit AVR RISC Tensilica L106 32-bit RISC Tensilica L106 32-bit RISC
Тип Microcontroller Soc SoC
Оперативня пам'ять 2K bytes 50k bytes 50k bytes
Постійна пам'ять 32K bytes інтергрована - -
Зовнішня пам'ять - 16M bytes 16M bytes
Частота процесора 16MHz 52MHz 52Mhz
GPIO 24 11 8
Analog Pins 8 1 1
ADC 1 1 1
Точність ADC 10bit 10bit 10bit
Wi-Fi - 2.4GHz 2.4GHz
USB Power micro USB micro USB Type-C
Живлення від Li-Ion - - +
Li-Ion BMS - - +
Li-Ion Charger - - +
Power switch - - +
H-Bridge - - 3A (max)

У мене вже є плата Model's Heart, що далі?

Базовий набір:

  • Завантажена з GitHub копія проекту
  • Модуль, або відлагоджувальна плата Model's Heart, або інша на базі процесора ESP8266 (Наприклад Wemos D1 mini, Lolin, і т.п.)
  • Комп'ютер з USB
  • Веб-переглядач для налаштування (наприклад Edge, Chrome, Mozilla, Safari, Opera ...)

Додаткові інструменти, якщо ви захочете переробити прошивку під більш складні задачі:

  • Visual Studio Code
  • Встановлена бібліотека Platformio

Прошивка

У папці Tools є утиліта для прошивки та безпосередньо сам файл прошивки. Для більшості користувачів цього є цілком достатньо. Виконавши декілька простих кроків, ви зможете перетворити плату у радіоапаратуру для керування моделями.

Покрокова інструкція

  1. Підключаєте плату до USB-порту вашого комп'ютера.
  2. Встановлюєте драйвер CH340 (якщо його ще немає)
  3. Заходите у диспетчер пристроїв і перевіряєте, чи всі драйвери встановлено і чи ваша плата розпізнається системою.
  • Відкриваєте панель керування комп'ютером. Call device manager
  • Переходите на пункт "Диспетчер пристроїв". Ймовірно, ваша плата буде називатися 'USB-Serial CH340 (COM_)' Model's Heart serial port
  • Запам'ятовуєте, який номер порта отримала ваша плата (у моєму випадку - №3) Call device manager
  1. Запускаєте Tools/upload.bat
  2. Після старту скрипт запитає номер порта, до якого під'єднано вашу плату
  3. Вводите номер (тільки цифру), натискаєте Enter
  4. Натискаєте кнопку Power на платі Model's Heart
  5. Чекаєте, поки завершиться процес завантаження

Все - плата прошита.

З цього моменту нею можна користуватись.

Встановлення поновлень

Поновлення відбувається аналогічно до прошивки. Завантажуєте нову версію репозиторію. А далі все по кроках...

Зважте на те, що прошивка повністю переписує все що є в пам'яті плати. Тобто, якщо ви завантажували в неї модифікації через файловий менеджер, то завантажте їх, щоб не втратити.

Налаштування елементів UI

Усі елементи користувацького інтерфейсу використовують абсолютну координатну сітку. Відлік координат починається у верхньому правому кутку.

Робоче поле має фіксовані пропорції 100:45

Розміри елементів інтерфейсу вказуються у відсотковому еквіваленті до ширини робочого поля.

Наприклад цей текстовий блок буде розміщений з відступом 10% з ліва, 20% з гори. Його ширина і висота відповідатимуть відповідно 30% ширини екрану та 40% ширини екрану. Зверніть увагу, що в обидвох випадках (ширина і висота блока) виміри прив'язані до % ширини екрану

    {
        "type":"text",
        "x": "10",
        "y": "20",
        "w": "30",
        "h": "40",
        "text":"текст"
    }

Елементи графічного інтерфейсу

Text

    {
        "type":"text",
        "x": int,
        "y": int,
        "w": int,
        "h": int,
        "text":string,
        "bg":string
    }

Button

    {
        "type":"button",
        "x": int,
        "y": int,
        "w": int,
        "h": int,
        "text": string,
        "cmd": string
    }

Slider

    {
        "type":"slider",
        "x": int,
        "y": int,
        "w": int,
        "h": int,
        "color": string,
        "cmd": string,
        "autocenter": bool,
    }

Image

    {
        "type":"image",
        "x": int,
        "y": int,
        "w": int,
        "h": int,
        "cmd": string,
        "src": string,
        "autocenter": bool,
    }

Toggle

    {
        "type":"toggle",
        "x": int,
        "y": int,
        "w": int,
        "h": int,
        "text": "Off|A|B|C",
        "values": "0|30|60|90",
        "cmd": string,
        "autocenter": bool,
    }

Редактор графічного інтерфейсу

Плата обладнана редактором інтерфейсу. З допомого якого можна вносити зміни в існуючий дизайн, або створититповністю новий унікальний вигляд на ваш смак. Model's Heart GUI Designer

Для кожного елемента графічного інтерфейсу передбачено редактор властивостей. Model's Heart GUI Designer

Графічний інтерфейс

Model's Heart GUI Designer

Сценарій

Сценарій визначає, як плата реагуватиме на команди користувача. У сценарію є лише одна властивість - "elements" (містить перелік команд)

{
    "elements" : [ {"cmd": string, ..}, {..}, ..]
}

Команди активуються у результаті взаємодії користувач з UI. Поки команда активна - її дії обробляються, інакше - ігноруються.

Структура команди:

  • cmd - назва команди.
  • type - тип команди
    • toggle - кожна активація команди вмикає/вимикає її стан
    • click - команда активна поки користувач утримує її значення відмінним від 0
    • none - команда не потребує активації. Вона активна завжди.
  • actions - перелік дій, що будуть виконуватись поки команда активна.
{
    "cmd": string,
    "type": "toggle/click/none",
    "actions": 
        [
            {
                "type": 
                "cmd": string,
            },
            {
                "type": "motor",
                "speed": string (source of speed value for full H bridge). When set - a+b ignored
                "a": string (source of A half bridge values),
                "b": string (source of B half bridge values),
                "weight": int (in grams)
            },
            {
                "type": "blink",
                "points": [
                    {"pin": "1", "offset":"0", "value":"0"},
                    {"pin": "1", "offset":"500", "value":"255"},
                    {"pin": "1", "offset":"1000", "value":"0"}
                ]
            }
        ...
        ]
}

Дії сценаріїв

Маячок

Дія перемикає виходи у заданій часовій точці.

  • type - blink
  • points - масив точок

Точка:

  • pin - номер виходу
  • offset - точка часу у мілісекундах. Відлік починається від старту дії
  • value - PWM значення виходу
{
    "type": "blink",
    "points": [
        {"pin": "1", "offset":"0", "value":"0"},
        {"pin": "1", "offset":"500", "value":"255"},
        {"pin": "1", "offset":"1000", "value":"0"}
    ]
}

Мотор

Дія використовується для керування мотором.

  • type - motor
  • speed - назва команди яка використовуються для швидкості мотора
  • weight - вага уявного маховика мотора. Використовується для імітації інерції
{
    "type":"motor",
    "speed":"motor_x",
    "weight": "80000"
}

Приклади сценаріїв

Керування гвинтовим літаком

ui.json

{
  "bg": "url('img/bg.jpg')",
  "elements": [
    {
      "type": "toggle",
      "x": 31,
      "y": 40.5,
      "w": 42,
      "h": 4,
      "text": "Max|Mid|Min|Off|Min|Mid|Max",
      "cmd": "motor_x",
      "values": "100|60|30|0|-30|-60|-100"
    },
    {
      "type": "slider",
      "x": 57.5,
      "y": 17.5,
      "w": 26.5,
      "h": 6,
      "cmd": "motor",
      "autocenter": "y"
    },
    {
      "type": "button",
      "x": 0,
      "y": 10,
      "w": 27,
      "h": 4,
      "text": "Хвостовий маячок",
      "cmd": "beacon"
    },
    {
      "type": "button",
      "x": 0,
      "y": 15,
      "w": 27,
      "h": 4,
      "text": "Габаритні маяки",
      "cmd": "strobe"
    },
    {
      "type": "button",
      "x": 0,
      "y": 20,
      "w": 27,
      "h": 4,
      "text": "Габарити",
      "cmd": "position"
    },
    {
      "type": "button",
      "x": 0,
      "y": 25,
      "w": 27,
      "h": 4,
      "text": "Посадкові вогні",
      "cmd": "navigation"
    },
    {
      "type": "button",
      "x": 0,
      "y": 30,
      "w": 27,
      "h": 4,
      "text": "Двигуни",
      "cmd": "ignition"
    },
    {
      "type": "text",
      "x": 31,
      "y": 37.5,
      "w": 18,
      "h": 3,
      "text": "Forward speed",
      "cmd": ""
    },
    {
      "type": "text",
      "x": 59.5,
      "y": 37.5,
      "w": 13.5,
      "h": 3,
      "text": "Reverse speed",
      "cmd": ""
    },
    {
      "text": "null",
      "cmd": "motor_x",
      "type": "image",
      "x": 46.5,
      "y": 14,
      "w": 10,
      "h": 10,
      "src": "img/green.png"
    },
    {
      "text": "null",
      "cmd": "motor_x",
      "type": "image",
      "x": 78.5,
      "y": 2,
      "w": 10,
      "h": 10,
      "src": "img/green.png"
    }
  ]
}

scripts.json

{
  "elements": [
    {
      "cmd": "beacon",
      "type": "toggle",
      "actions": [
        {
          "type": "blink",
          "points": [
            {
              "pin": "1",
              "offset": "0",
              "value": "0"
            },
            {
              "pin": "1",
              "offset": "0",
              "value": "0"
            },
            {
              "pin": "1",
              "offset": "100",
              "value": "20"
            },
            {
              "pin": "1",
              "offset": "200",
              "value": "50"
            },
            {
              "pin": "1",
              "offset": "300",
              "value": "90"
            },
            {
              "pin": "1",
              "offset": "400",
              "value": "50"
            },
            {
              "pin": "1",
              "offset": "500",
              "value": "20"
            },
            {
              "pin": "1",
              "offset": "600",
              "value": "0"
            },
            {
              "pin": "1",
              "offset": "1000",
              "value": "0"
            }
          ]
        }
      ]
    },
    {
      "cmd": "strobe",
      "type": "toggle",
      "actions": [
        {
          "type": "blink",
          "points": [
            {
              "pin": "4",
              "offset": "0",
              "value": "0"
            },
            {
              "pin": "4",
              "offset": "0",
              "value": "255"
            },
            {
              "pin": "4",
              "offset": "100",
              "value": "0"
            },
            {
              "pin": "4",
              "offset": "300",
              "value": "255"
            },
            {
              "pin": "4",
              "offset": "400",
              "value": "0"
            },
            {
              "pin": "4",
              "offset": "1000",
              "value": "0"
            }
          ]
        }
      ]
    },
    {
      "cmd": "position",
      "type": "toggle",
      "actions": [
        {
          "type": "blink",
          "points": [
            {
              "pin": "3",
              "offset": "0",
              "value": "0"
            },
            {
              "pin": "3",
              "offset": "0",
              "value": "255"
            },
            {
              "pin": "3",
              "offset": "1000",
              "value": "255"
            }
          ]
        }
      ]
    },
    {
      "cmd": "navigation",
      "type": "toggle",
      "actions": [
        {
          "type": "blink",
          "points": [
            {
              "pin": "2",
              "offset": "0",
              "value": "0"
            },
            {
              "pin": "2",
              "offset": "0",
              "value": "255"
            },
            {
              "pin": "2",
              "offset": "1000",
              "value": "255"
            }
          ]
        }
      ]
    },
    {
      "cmd": "ignition",
      "type": "toggle",
      "actions": [
        {
          "type":"motor",
          "speed":"motor_x",
          "weight": "80000"
        }
      ]
    }
  ]
}

Підключення

Чи можна розрізати плату?

Плата достатньо мініатюрна і необхідно постаратись її так прилаштувати, щоб не довелось її розрізати. Проте, якщо є необхідність "запакувати" по максимуму, то плату можна розрізати на 3 окремі частини. Після розрізання, їх можна об'єднати провідниками, або використовувати плату без них. Кожна із 3-ох частин є завершеним блоком.

How to cut PCB Model's Heart in correct way

Підключення окремих блоків плати Model's Heart

Плата зарядки

Плата зарядки - може використовуватись як зарядний пристрій Li-Ion акумуляторів.

Charging chunk

Плата програматора

Плату програматора можна використовувати як окремий USB<->TTL перетворювач.

Alt text

Основна плата

Підключення акумулятора

Alt text

Підключення мотора

Alt text

Підключення кнопки вкл./викл.

Alt text

Підключення світлодіода до виходу #1

Alt text

Підключення світлодіода до шини живлення #2

При підключенні світлодіода до шини живлення необхідно обмежити струм з допомогою резистора. Типовий струм для світлодіодів - 2мА

Опір обмежувального резистора можна розрахувати за законом Ома

Закон Ома

  I = U/R 

Де:
  I - струм, що протікає через коло в Амперах
  U - напруга на кінцях кола у Вольтах
  R - опір кола у Омах

Знаходимо R

  R = U/I 

  U = 4.2V
  I = 2mA = 0.002A

  R = 4.2V / 0.002A 
  R = 2100 Ом => 2.1KOм

Alt text

Web API

Взаємодія web інтерфейсу та плати відбувається по WIF з допомогою HTTP запитів.

Плата Model's Heart дозволяє одночасне керування з кількох клієнтів. Для того, щоб надіслані команди відпрацьовувались платою - необхідна авторизація (GET api/EventSourceName). У відповідь ми отримаємо endpoint з допомогою якого можна підписатись на HTTP Events (GET /api/events), щоб отримувати інформацію від плати. Також, щоразу як користувач змінив стан поля відбувається пересилка цього стану у плату (POST api/post)

GET api/EventSourceName

Метод повертає Endpoint (адресу джерела Events) по якому транслюється інформація з плати на web-UI. Одним із параметрів є ID клієнта

GET /api/events

Встановлюється як EventSource для сторінки Web інтерфейсу Детальніше тут -> https://developer.mozilla.org/en-US/docs/Web/API/EventSource

POST api/post

Надсилаємо інформацію про поле на плату

{
  client:"random string id of client"
  format:[field1, field2, field, ... fieldN],
  values:['v1', 'v2', 'v3', .. 'vN']
}
  • client - ID клієнта
  • format - назви полів які наявні у інтерфейсі. Надсилається лише один раз. Всі інші рази ігнорується. Цього формату має притримуватись додаток при комунікації з приладом, і в такому ж форматі має відповідати плата. (це для того, щоб мінімізувати трафік і одночасно забезпечити підтримку стрих версій додатку у яких може бути інша конфігурація елементів керування)
  • values - значення полів у посортовані відповідно до format.

Алгоритм взаємодії

  1. Авторизація
  2. Налаштовуємо EventSource.
  3. POST api/post формат даних
  4. По Event source каналу отримуємо від плати масив значень і розставляємо їх по елементах керування у відповідності до обговореного формату
  5. Якщо користувач змінив якийсь параметр - надсилаємо платі пакет у обговореному наперед форматі. (Повертаємось до п4)
  6. Якщо зв'язок втрачено - запускаємо зворотній відлік на 3 секунди і пробуємо відновити зв'язок (Повертаємось до п1)

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors