Настраиваемое ядро для Arduino

Тема в разделе "Глядите, что я сделал", создана пользователем DIYMan, 20 дек 2017.

  1. DIYMan

    DIYMan Guest

    Обновил, добавил поддержку медленного режима для термопары под Due. Заодно навёл порядок в именах файлов - теперь все файлы, имеющие отношение к ядру - имеют префикс "Core", дабы не путаться в проекте. Думаю, в конкретном проекте файлы логики можно будет именовать с префиксом "Logic" - тогда всё будет прозрачно и понятно, пмсм.
     
  2. DIYMan

    DIYMan Guest

    Потихоньку перетаскиваю в ядро всё, что под руку подвернётся :D А если серьёзно - то многие вещи нужны в конкретных проектах, типа обработки кнопки и энкодера. Ну и, собственно, их есть у меня - CoreButton.h и CoreEncoder.h - если надо, то можно в логике легко получить кнопку с программным антидребезгом и энкодер без использования прерываний ;)

    З.Ы. Класс для мигания светодиодом мы писать не будем :D Тем более, что класс сценариев смены состояний на пине - уже есть в коробке :D
     
    Последнее редактирование модератором: 24 фев 2018
  3. alex_rnd61

    alex_rnd61 Нерд

    Ну тогда к ним в придачу ili9341 и игру какую-нибудь. :)
     
  4. DIYMan

    DIYMan Guest

    Не, передумал я китайские джойстики вводить: фигня непредсказуемая :) Там с калибровкой возни, если хочется по-серьёзному, а не коня в вакууме - и то, работают шумно очень. Короче, я пока их щупаю, если окажется, что можно хоть как-то нормально откалибровать - тогда посмотрим ;)

    Насчёт поддержки дисплеев - уже думаю, довольно давно ;)
     
  5. DIYMan

    DIYMan Guest

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

    Короче: в составе ядра теперь есть CoreJoystick.cpp и CoreJoystick.h - там простенький класс для работы с двухосевым джойстиком, с блекджеком и девушками. Поддержки клика на кнопку в классе джойстика - вводить не стал, т.к. есть класс Button, который великолепно справляется с дребезгом и пр. шелухой. Класс джойстика без проблем выкусывается в любой проект. Ниже - пример использования:
    Код (C++):
    #include "CoreJoystick.h"

    Joystick joy;

    void setup()
    {
      uint8_t xPin = A9; // куда подключена ось X
      uint8_t yPin = A10; // куда подключена ось Y
      int16_t midPointX = 500; // центральное значение оси Х в покое
      int16_t midPointY = 490;  // центральное значение оси Y в покое
      uint8_t zeroHisteresis = 20; // гистерезис для фильтрации шумов

      joy.begin(xPin, yPin, midPointX, midPointY, zeroHisteresis);
    }
    void loop()
    {
        joy.update();

        // значения X и Y в диапазоне [-1.0,1.0]
        float x = joy.getX();
        float y = joy.getY();

        Serial.print(x);
        Serial.print(",");
        Serial.println(y);

        // сырые значения потенциометров
        int16_t rawX = joy.getXRaw();
        int16_t rawY = joy.getYRaw();

        Serial.print(rawX);
        Serial.print(",");
        Serial.println(rawY);

        // значения углов по осям (по умолчанию степень свободы - 180 градусов, центральное положение - 90 градусов)
        float xAngle = joy.getXAngle();
        float yAngle = joy.getYAngle();

        Serial.print("X angle = ");
        Serial.println(xAngle);

        Serial.print("Y angle = ");
        Serial.println(yAngle);

        // полярные координаты (0-360 градусов)
        float polarAngle = joy.getPolarAngle();

        Serial.print("Polar angle = ");
        Serial.println(polarAngle);


        Serial.println();
    }
    Всё настраивается - и центральные точки (каждый джойстик нужно калибровать, очевидно), и гистерезис, и степень свободы по осям, в общем - ляпота. Единственное, чего пока нет - это подстройки крайних положений, т.к. очевидно, что 0 и 1023 - редко когда выпадет с потенциометра, но пока это для меня - некритично.

    При помощи такого класса можно управлять как двумя сервами, т.к. есть отдельные данные по осям, так и одной полнооборотной сервой, т.к. есть данные в полярных координатах, так и делать, что хочешь, т.к. есть относительные положения осей в условных единицах диапазона [-1.0,1.0]. Короче - пляши как хочешь.

    Сейчас джойстик подключен, в мониторе порта шумов - 0, когда он в покое:
    Покрутил по двум осям:

    Вывод: ля-по-та :D
     
  6. DIYMan

    DIYMan Guest

    Ненавижу, когда в *.ino-файле - кучу всего свалено и грязища :) Короче - почистил его максимально, теперь вся логика конкретного проекта живёт в паре файлов CoreLOGIC.h и CoreLOGIC.cpp. В CoreLOGIC.cpp сверху пустые заглушки всяких событий, с комментариями, что почём. Собственно, это просто небольшой классец, который делает минимальную обвязку для старта ядра, предоставляя доступ к событиям, и всё. Т.е. его можно в конкретном проекте дописывать как хочешь, ну и юзать события, которые в этот класс приходят.

    В *.ino-файле остался только конфиг по умолчанию, и это радует ;)
     
  7. alex_rnd61

    alex_rnd61 Нерд

    "Писец подкрался не заметно..." Загрузил последнюю версию в 2560, в CoreConfig.h отключил некоторые датчики, часы включены. Отключены CORE_ESP_TRANSPORT, CORE_LORA_TRANSPORT, CORE_MQTT_TRANSPORT, CORE_THINGSPEAK_TRANSPORT. Открываю конфигуратор и вижу тот самый "писец". SD карта, модем, RS485 запускаются, не вижу запроса дополнительных фич. Датчиков нет и добавить не возможно. В меню "Контроллер" только "Данные" и "Датчики конфига". Хотя раньше датчики подхватывались из EEPROM.
     
  8. DIYMan

    DIYMan Guest

    Щас попытаюсь воспроизвести.
     
  9. DIYMan

    DIYMan Guest

    @alex_rnd61 - отключил CORE_ESP_TRANSPORT, CORE_LORA_TRANSPORT, CORE_MQTT_TRANSPORT, CORE_THINGSPEAK_TRANSPORT, залил - работает всё. SD-карта у мну закомментирована.
     
  10. DIYMan

    DIYMan Guest

    Раскомментировал SD-карту, сама карточка не вставлена - вижу, что есть ошибка инициализации, при этом реально дальше не идёт, потому что - отпускает Serial, т.к. команд не было 5 секунд ;) Щас инициализации SD сделаю побыстрее и выложу обновы.
     
  11. DIYMan

    DIYMan Guest

    @alex_rnd61 - обновил, запускается теперь даже при сбое инициализации SD, пробуйте.
     
  12. alex_rnd61

    alex_rnd61 Нерд

    Щаз! Тут ещё по модему вопрос. Посылает AT получает OK, потом пишет шо нет ответу и в ребут. И так по кругу, это так задумано?
     
    DIYMan нравится это.
  13. DIYMan

    DIYMan Guest

    Не, так не задумано. После AT должен писать дебаг-информацию "Modem answered and available". Лог с монитора порта поможет сильно ;) Плюс - настройки модема надо подбирать - на некоторые команды там 70 секунд по даташиту ответ может задерживаться, так что... Поставьте в настройках подольше время для принятия решения, что модем завис.
     
  14. DIYMan

    DIYMan Guest

    Плюс ещё с модемом тонкости: у вас какой, SIM800? Он обязан в порт при старте пихать строку Call Ready, по наличию этой строки определяется готовность модема к работе. Плюс учтите - я использую управление питанием модема, т.е. при старте прошивки питание пересбрасывается: возможно, в этом дело - если у вас выключено управление питанием, может на этом деле реально спотыкаться, щас логику пересмотрю ещё раз.

    Короче, всё поправимо, это и есть - отладка ;) У мну просто плата спаяна уже с управлением питанием, мог в логике без управления питанием накосячить, ессно. Поправим ;)
     
  15. alex_rnd61

    alex_rnd61 Нерд

    SIM800L. плата SIM800L EVB V2.0 управления питанием нет.
     
  16. DIYMan

    DIYMan Guest

    Так я и думал - есть ошибка в логике. Я обновил, перекачивайте, пробуйте. Надеюсь, вы с гитхаба качаете? https://github.com/Porokhnya/ArduinoCore - там всегда самое актуальное ;)
     
  17. DIYMan

    DIYMan Guest

    @alex_rnd61 - огромное вам спасибо за помощь, как видите - вдвоём косячки обнаруживаются на раз ;)
     
  18. DIYMan

    DIYMan Guest

    Пойду пока в конфигураторе сделаю кнопку "Управление пинами", чтобы можно было команды на пины подавать - пригодится для целей тестирования ;)
     
  19. alex_rnd61

    alex_rnd61 Нерд

    Может сделать подключение к пинам альтернативных функций? Например выход PWM, RELAY или ещё что-то.
     
  20. DIYMan

    DIYMan Guest

    Пока подождём - как видите, косяки выплывают, и чтобы в них не утонуть - надо для начала всё хорошенько погонять ;)

    Обновил конфигуратор - добавил кнопку "Управление пинами" - там можно теперь команду на пин подавать с выставлением уровня. В прошивке давно уже есть команда руления пинами извне - вот и задействовали наконец-то :)