Jump to content

Андрей Гараж

Members
  • Posts

    39
  • Joined

  • Last visited

Posts posted by Андрей Гараж

  1. Спасибо за ответ. Оказалось так глубоко копать не надо.
    Внес изменения в библиотеку "micromenu-v2" как на скринах. Удалил все, что связано с PROGMEM, и связанными с ней командами ("pgm_read_blablabla"). После этого сделал двухуровневое меню за полчаса. Видимо для ESP32 это работает только так, несмотря на то, что она понимает команды PROGMEM. Может проблема в разрядности "word"? Для AVR и ESP32 они 1 и 4 байта соответственно.
    Правда #include "MicroMenu.h"  в теле скетча не работает, ошибки: undefined reference to `Menu_SetGenericWriteCallback(void (*)(char const*))'

    Если сделать так,

    extern "C"
    
    {
    
    #include "MicroMenu.h"
    
    }

    то все норм. Я не знаю почему так, но надеюсь кому-то пригодится.

    1693456530_2.JPG.dfe02cb8cc673f2f9f08fa0ec2c2fb13.JPG

    875584253_.JPG.8e70a16a12589c9afd89dda03a2a939d.JPG

  2. Здравствуйте!

    Есть такой макет (на фото), есть библиотека "micromenu-v2":
    https://github.com/abcminiuser/micromenu-v2
    есть другая версия этой же библиотеки с описанием на русском
    http://easyelectronics.ru/organizaciya-drevovidnogo-menyu.html
    есть мой код:
    https://github.com/Andrew-Garage/menu
    Одна задача опрашивает кнопки, другая работает с дисплеем. При нажатии кнопки посылается соответствующее сообщение в задачу управления экраном.

    Объясните мне как работает эта библиотека, чтобы я смог сделать меню по образцу как на фото. У меня проблема с пониманием дефайна, с помощью которого создаются все пункты меню ("micromenu-v2/MicroMenu.h" строки 21-29 и 41-46).

    строки 21-29:

        typedef const struct Menu_Item {
            const struct Menu_Item *Next; /**< Pointer to the next menu item of this menu item */
            const struct Menu_Item *Previous; /**< Pointer to the previous menu item of this menu item */
            const struct Menu_Item *Parent; /**< Pointer to the parent menu item of this menu item */
            const struct Menu_Item *Child; /**< Pointer to the child menu item of this menu item */
            void (*SelectCallback)(void); /**< Pointer to the optional menu-specific select callback of this menu item */
            void (*EnterCallback)(void); /**< Pointer to the optional menu-specific enter callback of this menu item */
            const char Text[]; /**< Menu item text to pass to the menu display callback function */
        } Menu_Item_t;

     

    строки 41-46:
     

    #define MENU_ITEM(Name, Next, Previous, Parent, Child, SelectFunc, EnterFunc, Text) \
    
    extern Menu_Item_t MENU_ITEM_STORAGE Next; \
    
    extern Menu_Item_t MENU_ITEM_STORAGE Previous; \
    
    extern Menu_Item_t MENU_ITEM_STORAGE Parent; \
    
    extern Menu_Item_t MENU_ITEM_STORAGE Child; \
    
    Menu_Item_t MENU_ITEM_STORAGE Name = {&Next, &Previous, &Parent, &Child, SelectFunc, EnterFunc, Text}

    Да, я не очень в программировании, только учусь, чур не бросаться учебником. А если можно переведите на "пальцы" что тут написано?)
    Про первый блок:
    1) Это определен тип данных структура Menu_Item... из структур этой же структуры Menu_Item?
    2) void (*SelectCallback) (void) а это как понять?
    3) Menu_Item_t зачем нужен? Почему нельзя обращаться через .Next или .Parent?
    Про второй блок:
    1) Почему нельзя обращаться через .Next или .Parent?
    2) Как слово "Name" (последняя строка) может объединять все предыдущие определения? По ссылкам?
    3) И что вообще за значения передаются в MENU_ITEM? Где я должен их определить?

    MENU_ITEM_STORAGE это задефайненый PROGMEM.
    extern означает, что переменная определена где-то еще (что бы это не значило).

    меню.jpg

    20230304_162326.jpg

  3. По теме: кривая осциллограмма датчика походу была из-за плохого контакта в проводе щупа осциллографа. пересобрал тестовую схемку заново, все перевоткнул и сигнал стал норм - красный и зеленый именно такой как я писал в самом начале. 3их левых пакетов не обнаружено.
    621668585_.png.e2f4ecb5b8c2388004399d8acf90637c.png17930023_.png.a2efa10df2ad6ad1968d72bb9f346ea3.png


    А вот с цифрой фигня, если снимать со светодиодного пина то, что считала ардуина, происходит вот что:


    1588535804_.png.dbf057aa8a2403ce3b80b08041095e1f.png

     

    1094813121_.png.338c7b2094e9f79d3b7aa6c12f3daa81.png

    Считывается не то, и к тому же часть данных теряется. А ложные срабатывания ушли, когда на вторую ногу компаратора кинул 3.3 В, что видимо стоило сделать сразу. Но я следовал схеме платы и собрал как на ней.
    Набрел на ардуиновскую либу
    https://alexgyver.ru/directadc/

    На ней можно завести программное прерывание, без него видимо никак. Не знаю как ардуиновский freeRTOS будет работать с программными прерываниями (и будет ли), я хотел обойтись без них. Завтра буду пробовать что-нибудь.

  4. 1 час назад, korsaj сказал:

    А зачем тогда вторичка намотана литцендратом, ещё и такой толщины?

    На такие вопросы тут отвечают те, кто их и задает. Разве это еще не понятно? Или вы не уловили? Меня терзают сомнения...

  5. 1 час назад, Огонёк сказал:

    Как на перекрёстке повернуть направо?

    Если синий соленоид поднят, то его шрифт как бы продолжает  магнитное поле оранжево-зеленого контура и перехватывает поводок. Если опущен, то зелёный контур его подхватит снова, пару сантиметров машинка может проехать прямо. Иногда правда это не срабатывает) На фотке под трассой, где контура, его даже видно. Он прямо под светофором- серый цилиндр в круглом отверстии. Тоже ещё не влезал туда, да и смысл? Там все намертво врезано и залито термоклеем.

    3c4591fc-e08a-4235-9dfe-9d7e09e324bf.png

  6. 1 минуту назад, Огонёк сказал:

    а датчики случаем не на ней же?

    не) они как бы на "бампере"

    2 минуты назад, Огонёк сказал:

    контур не только зарядка, но ещё и рулилка

    вроде того. может быть он не столько магнитится, сколько держит свое магнитное поле по полю контура. тк другие металлические предметы к дороге не притягиваются

  7. 3 минуты назад, Огонёк сказал:

    А как машинка понимает, что надо поворачивать, где этот кусок кода?

    Это как-то завязано на адрес, который в исходнике в самом начале закомментирован. Такой-то адрес - такой-то маршрут. Но у зрителя создается впечатление что машинки ездят рандомно.  На передней оси машинки латунный поводок - направляющая, на нем магнитик, и он примагничивается к контуру под дорогой. Так поворачиваются колеса. На перекрестке что-то типо железнодорожной стрелки, только переводит магнитный поток по которому следует машинка. Я еще не дошел до этого момента) Так что это дорога перестраивается, а машинка тут просто как ведомый элемент.

    // номер - минСкор - махСкор - маршрут + Kstart =
    //
    //
    // СПб - 214 - 174 - 101
    // 0047 - СПб - едит через мост - 174 адр
    // 0089 - СПб - НЕ едит через мост - 214 адр
    //
    // 0093 - автоб зеленый - 90-180-197(был) - стал 60-137-174 СПб
    // 1078 - Груз - 60-160-113 - Псков
    // 1022 - ПАЗ - 80-180-182
    // 0002 - автоб-МСК - 95-180-101 - // 157 адрес
    // 0097 - автоб МСК - 75-180-197 - короткий - малый круг

  8. 2 минуты назад, korsaj сказал:

    какая частота в проекте прописана

    Я ж скинул исходник, и уже говорили что там частота задефайнена на 1МГц. исходников светофоров нет. Я хотел исходя из пакетов передаваемых светофором отследить логику программы машинок по их исходнику. Сигнал такой какой на последних фотках, и по нему не понятно с какой частотой но задается.

  9. Собрал такую схемку на ардуине нано.
    463810132_.png.daf6c9db6b2b874d865c86a8ca413a91.png
    С таким кодом:
      digitalWrite(13, ACSR&0b00100000);
      if(ACSR&0b00100000) Serial.println("1");
      else Serial.println("0");
    Осциллограмма на 13пине вышла такая:
    2060933319_.png.80c964a43f43a7640ebdce7a21bc2c39.png

    Откуда-то берутся ложные срабатывания. Ок, подключился к самому датчику:


    1355166287_.png.a840dae5f244968c285abde21f1b7e9a.png

    Все вроде четко, никаких лишних сигналов. Увеличил:

    1261350933_.png.307ee585962a0cee8c8c047fc0f9c0fc.png

  10. 1 час назад, Огонёк сказал:

    А что за восьминожка справа сверху так затейливо включена?

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

  11. 9 минут назад, korsaj сказал:

    Сделайте простую моргалку и узнаете частоту

    Не, моргалка не дает ничего. Пакеты шлются каждые 500 мс, сегодня осциллографом мерил. А сами сигналы не различишь, весь пакет 40-50 мсек это 21 бит (пока у меня так получается). Видно просто как один мырг)

  12. 13 часов назад, Огонёк сказал:

    Я бы, разбираясь с такой задачей, начал бы с анализа архитектуры железа машинки.

    314596062_.png.9d40a5d6fc4c4eb15810bf6e4ec8999e.png
    Это первое с чего я начал, перерисовал обвязку avr-ки 328р. Помогает эта схема только в определенной степени, естественно. Надо ж всё в совокупности смотреть.

     

    12 часов назад, korsaj сказал:

    Алгоритм был следующим; ловим синхроимпульс (любой фронт) и начинаем складывать в n-разрядный буфер бит за битом.

    Тоже уже склоняюсь к такому варианту, сделать отдельно из датчика и ардуины что-то, что писало бы в лог ком-порта пойманные байты. Сейчас вот пробовал прошить машинку, чтоб зацепиться за зеленый/красный сигнал светофора. Исходя из осциллограммы написал код, чтоб понимать 101 или 010. А машинка чтоб отмыргивала стопарями и поворотниками то, что получает. Тк вот оказалось там еще 3й вид пакетов периодически приходит.
    685856567_.png.e7f8e555b9c5a491b2566bf9fe48a2ac.png

     

    6 часов назад, optima сказал:

    у вас во всех условиях проверяется один и тот же бит!

    Это регистр внутреннего компаратора, он определяется этим битов в регистре. Потому он всегда и один и тот же. Вот эта точка:
    1115967908_.png.fcc9c35c3b1f15895e775165f57dcf88.png
    1333507502_.png.2334ee6816af8f09a52980dcb3e4ab0f.png

     

     

    4 часа назад, IMXO сказал:

    цифры в делаях ни какого отношения к реальности не имеют


    Тоже верно. На кварце платы машинки написано 4 ORG8 7J (может ORC8, все в говнище, не понятно). Не бьется в инете.

  13. 39 минут назад, Огонёк сказал:

    там есть проверка переменной

    Кажется начинаю вникать в этот сизIFов код... Открыл нотпадом++, получается то, что подсвечено красным слева (продублировал красными стрелками), это есть входной if. А на выходе мы должны получить только то, что я выделил желтым? А именно 10101010, adress, 10010110 или 255 (т.е. 1111 1111). Больше всего похоже на сигнал красного светофора.
    459516567_.png.a255ec5992e5e226f9120f572c2baa1e.png

     

    16 минут назад, Огонёк сказал:

    А оно намигивает и намигивает со всех сторон

    Еще посетители снимают на телефон постоянно)

  14. 1 час назад, LiVit сказал:

    а какую последовательность машинка назад передает, чтобы в нее не врезались?

    Как говорили коллеги, да и по коду так похоже, что задний ИК просто светит или не светит. (строки 698 - 707) И еще в паре мест он включается, но там тоже тупо на on/off.

    // STOP RED SIGNALS *****************************************************************************    
    if ((clcstopsignals==0)&&(stopsignalson==0))
    {
        PORTD&=0b11111101; // Stop RED led OFF
    }    
    if ((clcstopsignals>=stopsignals)||(stopsignalson==1))
        {
        PORTD|=0b00000010;    // Stop RED led ON
        clcstopsignals=stopsignals;
        }
     

    1 час назад, LiVit сказал:

    как подобное реализовано в пультах управления

    Отличная мысль! Прочитал сейчас статью на вики, и да, очень похоже на то, что вы написали в разделе "Кодирование". Только этих кодировок сейчас на одной вики, вон, штук 15 написано. Но все равно спасибо, надо глянуть.

     

    1 час назад, Огонёк сказал:

    Если светофор крутит свой сигнал в непрерывном цикле, то первая часть сигнала может быть идентификатором, типа "стартового байта", а вторая часть сигнала может нести информацию о состоянии.

    И да. Светофор посылает пакеты с частотой примерно 3 Гц. Конечно логично иметь какой-то байт синхронизации, т.к. если машинка выезжает из за поворота, то может поймать только кусок пакета. Но я в упор не нахожу по коду место, где он определяется как "стартовый" или как-либо еще. Тут очень здорово, что код написан чисто на регистрах, безо всяких кастомных библиотек, исходники которых ушли вместе с челом который это придумывал) По коду я вижу вот что (строки 226 - 259):

    while (1) {                                                                                                                                                                              // НАЧИНАЕМ БЕСКОНЕЧНЫЙ ЦИКЛ

        y=ACSR&0b00100000;  // IR start Read FrontIR ********************************************************      // ПОДСКАЗКА ЧТО НАЧИНАЕМ ЧИТАТЬ ПЕРЕДНИЙ ПРИЕМНИК НА ТАЧКЕ
          if (y==0) {                                          // НАЧИНАЕМ ЗДОРОВЕННЫЙ if (НА 300 СТРОК, НО ЭТО НЕ ВАЖНО)

        adr=0;                                                 // ОБНУЛЯЕМ ПЕРЕМЕННУЮ adr В КОТОРУЮ БУДЕМ СОХРАНЯТЬ ПОЛУЧЕННЫЕ БИТЫ
         x1=0;                                                  // х1 и х2 ПОТОМ СКЛЕЯТСЯ В ОДИН (х1 - СТАРШИЙ БИТ HIGH, х2 - МЛАДШИЙ LOW)
         x2=0;
         _delay_us(19775);                              // ЗАДЕРЖКА 20 мс КРАТНА 2мс, Т.Е. МЫ ПРОПУСКАЕМ "СТАРТОВЫЕ" 10 БИТ? ТАК ЧТО ЛИ?

        y=ACSR&0b00100000;  // bit 0        // ВООБЩЕ НА СКОЛЬКО Я ПОНЯЛ ASCR ЭТО РЕГИСТР ВНУТРЕННЕГО КОМПАРАТОРА, МЫ ЕГО ЧИТАЕМ...
        if (y==0) adr|=0b00000001;            // И ЕСЛИ ОН РАВЕН НУЛЮ, ТО ЗАПИСЫВАЕМ 1 В НУЛЕВОЙ БИТ БАЙТА adr? А ЕСЛИ НЕ РАВЕН, ТО ЧТО? НЕ ПОЙМУ
        _delay_us(7910);                               // ТУПО ЖДЕМ 8 мс (ПРИ ДЛИТЕЛЬНОСТИ 1 БИТА В 2 мс ЭТО КАК-ТО МНОГОВАТО). ТОЖЕ НЕ ПОНЯТНО.
        
        y=ACSR&0b00100000;    // bit 1     // НУ И ТАК ЕЩЕ 7 РАЗ
        if (y==0) adr|=0b00000010;
        _delay_us(7910);
        y=ACSR&0b00100000;    // bit 2
        if (y==0) adr|=0b00000100;
        _delay_us(7910);
        y=ACSR&0b00100000;   // bit 3
        if (y==0) adr|=0b00001000;
        _delay_us(7910);
        y=ACSR&0b00100000;     // bit 4
        if (y==0) adr|=0b00010000;
        _delay_us(7910);
        y=ACSR&0b00100000;     // bit 5
        if (y==0) adr|=0b00100000;
        _delay_us(7910);
        y=ACSR&0b00100000;   // bit 6
        if (y==0) adr|=0b01000000;
        _delay_us(7910);
        y=ACSR&0b00100000;    // bit 7
        if (y==0) adr|=0b10000000;

    2 часа назад, LiVit сказал:

    Посмотрите, может быть ваша запись неверна.

    127672732_.png.a55199441eb8ce50ff9462ecce27a447.png

    Я курсорами осциллографа прополз всю осциллограмму, четко шаг по 2 мс получается по дельта-Т :mellow:

  15. 43 минуты назад, LiVit сказал:

    Поставьте другую развертку на осциллографе, чтобы было пошире. А лучше - возьмите анализатор сигналов.

    Пока делал заметил, что при зеленом светофоре 7 пиков, а при красном 6. Анализатора сигналов нет. В один пик действительно могут "залезть" две единицы, если по развертке посмотреть.
    1605400723_.png.93c9f4196750a9b1de78894a323e5900.png

    1146945059_.png.c68b448ca218e735ca84cbd6926708f9.png
    Я пытаюсь хоть как-то сопоставить то, что я вижу с программой.
    Написано (строки 236 - 238):
    y=ACSR&0b00100000;  // bit 0
        if (y==0) adr|=0b00000001;
        _delay_us(7910);
    Т.е. как я понимаю считывание бита, потом задержка 7910 мкс. А тут первая 1 и 0 (поставил курсоры), длительностью 6 мс. И все остальное считывание байта тоже в задержках 7910 мкс. К концу считывания сигнал уже "убежит". Так?
    И сама запись не очень понятна. Если с регистра ACSR считали 0, то записали 1 в нулевой бит байта adr. И в следующие биты тоже записываем всегда 1, если у=0. Как так? Считывание получается срабатывает не по прерыванию, а определяется только задержкой _delay_us?

  16. 21 минуту назад, korsaj сказал:

    PS. Из вашего текста напрашивается вывод, что вы не знаете что делаете..

    Неужели в глаза бросается?)
    Исходников светофора нет, увы( Есть плата управления светофором.
    2126167987_.png.65c7cf4b382b643381ba78d620610d37.png
    Самое умное что мне пришло в голову, это снять сигнал с самого датчика передатчика светофора. Ибо от дороги жуткие наводки на приемнике - частота контура дороги 30 кГц. Как машинка различает там сигнал вообще.

  17. Здравствуйте! Помогите решить загадку. Есть маленькая модель машинки, она гоняет по дороге, под которой проложен провод (колебательный контур). Под брюхом у машинки другой колебательный контур, так она заряжается. В машинке стоит плата с одной аттини13 и одной 328р. По дороге установлены светофоры и рядом с ними ИК-приемники и ИК-передатчики (на машинке соответственно тоже). Общаясь с ними машинка демонстрирует некоторое поведение: стоит или проезжает светофоры, поворачивает включая соответствующий поворотник, старается не въехать в зад другой машинке (у них сзади тоже ИК-передатчик). Машинок много и они постоянно глючат: устраивают "пробки", сталкиваются друг с другом, неправильно ведут себя на светофорах, разряжаются. Моя задача исправить это) Я хочу переписать код с использованием freeRTOS и arduinoIDE так, чтобы решить эти проблемы и чтобы другому новичку, вроде меня, была понятна логика работы. Есть исходный код обоих чипов, монтажная схема, тестовая машинка и тестовый полигон (на фото). Пока удалось заставить ее ехать и моргать освещением, проблемы с зарядкой ушли. Осталось научить ее общаться со светофорами, и вот тут у меня неуспех. 2026675017_.png.67a80c7ac3d331e789e1117365d72c98.png

    Не пойму. Со светофора приходит 6 бит, а по коду считываться должно 8. Осциллограмму снимал и с ИК-передатчика светофора.
    282400904_.png.4f621fbd7fd62b8fea52dba4b6dbb5e7.png

    decoder(328p).cpp encoder(ATiny).cpp

  18. 22 часа назад, Стальной сказал:

    Всё собралось.

    у меня почему-то тоже... но не пойму почему) сделал так:
    - создал новый проект, появилась папка middlewares (1)
    - вручную добавил папки (2) сюда (3) и сюда (4)
    2039774452_.png.8e22e9d11da366e5cbef5e02c61784f6.png
    - получилась такая штука. а эта (1) папка почему-то сама то подключается, то нет. на этот раз добавил сам. в ней лежит FreeRTOSConfig.h

    676570617_.png.cd08ad02e3f056c340752cb64b495d0c.png
    - после сборки начинает ругаться на multiple definition of `SystemCoreClockUpdate', multiple definition of `SystemInit'
    298862480_.png.5d1da91ca99703bcb92fe1f3b098eee8.png
    - удаляю этот файлик и все собирается
    89095192_.png.6c5c44f8c3962055e6360ec85824400e.png
    1169890715_.png.29a4e453683ca7cfa96b8280d357f7b5.png
    вот такая лапша. RTOS работает. почему так - мне не понятно)

  19. 38 минут назад, Стальной сказал:

    Я собирал в версии 5 6 1

    тоже думал про версии, но пробовал экспортировать ваш проект и в том виде как есть и с пересборкой под мою 6ю версию. все равно виснет на coping library files. попробовал сейчас собрать другой проект, новый и без FreeRTOS, сборка завершается нормально.
    может конечно я усложняю, но вдруг mx что то пытается подскачать? у "парней с ютуба" это происходит неявно, потому они об этом и не говорят. но сам куб ide и мх я скачивал через браузерный vpn, тк st-шники заблокировали российские ip в связи с "событиями" (выводится сообщение что файлы не доступны). а на самом компе vpn-а нет, вот mx и ide не могут достучаться куда надо.

×
×
  • Create New...