Расширения для mBlock (аналог S4A для детей)

Тема в разделе "Глядите, что я сделал", создана пользователем AbaddoN__S, 25 дек 2015.

Метки:
  1. AbaddoN__S

    AbaddoN__S Нерд

    Здравствуйте! Насмотревшись видео-уроков с Ардуиной для дошкольников - решил и своих чад приобщить к высокому!

    Заказал Starter Kit на Алиэкспрессе с платой UNO (CH340G), получил, начал проверять работоспособность совместно с S4A - в итоге большой радости не ощутил. Да, драйверы на CH340G нашлись быстро и встали без проблем, но связь с Ардуино оказалась нестабильной. Т.е. подключаем плату к S4A, ждем 2-5 минут и подключение пропадает - идет поиск платы, подключение восстанавливается и опять то же самое через 2-5 минут (при прошивке через IDE тоже иногда (не часто) происходят сбои и верификация прошитого скетча не проходит). Менял драйверы, USB кабель, операционку, компьютеры (благо есть комп и два ноута) - результат везде один. Есть мысль прошить загрузчик, но нет в наличии программатора (сейчас заказал еще одну Ардуину, буду пробовать шить через неё). Вот собственно на этой печальной мысли сделал пост в теме Ардуино для самых маленьких и получил совет от пользователя darkavenger попробовать mBlock. Как оказалось, в виду того, что обращение по COM порту в mBlock происходит только в нужный момент, а не проводит опрос постоянно - работа моей глючной UNO с этой софтиной получилась более менее стабильной. Ну и после этого понеслась!

    Итак, как мне показалось, mBlock практически полностью копирует S4A, но кроме функций подобных S4A - mBlock умеет генерировать код из стандартных блоков Скретча и передавать его в IDE (ну или прошивать его в Ардуину самостоятельно), а также поддерживает множество разных Arduino-подобных плат.

    За какое-то время мы с детьми выполнили видео-уроки Амперки по S4A, но далее, ввиду ограниченного набора блоков команд в скрэтч и обширного набора оборудования Starter Kit - процесс моделирования приостановился.

    Далее нужно было либо переходить на обучение детей wiring либо дорабатывать mBlock. Поскольку гениев среди моих детей обнаружено не было - был выбран второй вариант.

    Информации по mBlock, в отличие от S4A, в интернетах на русском не много. Из того что я смог нагуглить - это Создание расширений для mBlock на форуме MakeBlock и путь к файлу локализации (C:\Users\Abaddon\AppData\Roaming\com.makeblock.mBlock\Local Store\mBlock\locale\locale.xlsx - это на моем компьютере). Локализация выполнена в виде обычной экселевской таблицы, доперевести локализацию самому не составляет труда (вот что напереводил я: https://yadi.sk/d/8yorrBpz3MnvAU).

    Из того что написано по созданию расширений, я многого не понял, но промежуточный результат есть - далее напишу мой опыт создания расширения для работы с регистром сдвига 74HC595, постараюсь описать выявленные проблемы и возникшие в ходе работы вопросы.

    Здесь буду постить актуальные доработки:
    • Все работы по mBlock буду стараться складывать сюда: https://yadi.sk/d/MmQytgij3MnhSy
    • Автоматизировал перевод mBlock: ссылка
    • Нашел и как смог перевел официальную инструкцию по созданию расширений: ссылка
     
    Последнее редактирование: 19 сен 2017 в 23:23
  2. AbaddoN__S

    AbaddoN__S Нерд

    К Arduino мы уже подключали 7-сегментный индикатор и даже выводили на него цифирки, но это был 1 разрядный индикатор, а вот подключить 4 разрядный индикатор уже сложнее (ну то-есть подключить то не проблема, но вот количество блоков в скрэтч будет огромным и цифровых входов\выходов на Ардуине Уно почти не останется. Поэтому я начал объяснять своим чадам - что можно сделать всё проще - используя регистр сдвига, ну и параллельно делал расширение на базе доступных примеров (за неделю вроде управился).

    В начале изучал написание библиотек отсюда, код для работы с регистром сдвига отсюда и создание расширений отздесь. Схему подключения и описание работы регистра 74HC595 изучал тут, но подключив подобным образом и проведя испытания кода в IDE, выявил, что при попытке зажечь какой либо светодиод (или несколько, но статично) на выходе получались либо "бегущие огоньки", либо вообще ничего... Методом проб и загугливания выяснил, что входы 11 и 12 на регистре (clockPin и latchPin) нужно поменять местами. Вот так вот "сев в лужу" понял для себя, что нужно внимательнее читать документацию :).

    Было скачано Demo расширение с форума и изучено описание.
    Расширение представляет из себя обычный zip архив, в котором находятся следующие файлы:
    [​IMG]
    файл s2e: файл с описанием данного расширения (содержит описание блоков скрэтч и команды, которые будут генерироваться в wiring);
    директория src: содержит .h и .cpp файлы для компилирования на Arduino (я так понял что тут файлы дополнительных библиотек для компилирования);
    директория js: содержит файл с JavaScript кодами для управления платой в режиме online (при работе платы подключенной к mBlock по COM порту).

    Открываем demo.s2e блокнотом (например notepad++):
    Код (C++):
    {    "extensionName": "demo",
        "sort":0,
        "javascriptURL":"js/demo.js", // определяем путь к JavaScript файлу
        "firmware":"1.0",  // firmware version
        "extensionPort":0, // network port of extension, 0 for serial port
        "blockSpecs": [ // определяем массив и тип блоков
            ["h","Demo Program","runArduino"], // "h" определение блока СОБЫТИЕ
            [
                "w", // "w" определение блока ЗАПИСИ, "r" определение блока ЧТЕНИЯ
                "digitalWrite( %n , %d.digital )", // имя отображаемого блока, %n номер (вводимое значение), %d.digital меню со значениями из меню "digital"
                "digitalWrite", // вызывается javascript функция из файла demo.js
                "13", // значение первого параметра по умолчанию
                "HIGH", // значение по умолчанию второго параметра (если есть еще параметры - то перечисляем их просто по порядку
                {   // определяем программирование в Arduino
                    "setup":"pinMode({0},OUTPUT); \n", // код вставляемый в void setup{}, \n - это переход на следующую строку, {0}  - это порядковый номер (с нуля) значений присутствующих на созданном блоке
                    "inc":"", // подключается файл библиотеки, наподобие #include <Arduino.h>
                    "def":"", // определяются переменные, наподобие double _num = 0;
                    "work":"digitalWrite({0},{1});\n", // вывод сгенерированного кода, здесь {0} - это значение введеное в %n ,{1} - это значение введеное в  %d.digital
                    "loop":"" // код вставляемый в loop{}
                }
            ],
     
       
    [
           "w",         // "w" определение блока ЗАПИСИ
           "blink",    // имя отображаемого блока
           "blink",   // вызывается javascript функция из файла demo.js
           {
             "setup":"",
             "inc":"#include \"demo.h\"",     // подключается файл библиотеки demo.h
             "def":"DemoClass demo; \n",  // определяется класс DemoClass и выполняется переход на новую строку
             "work":"demo.blink(); \n",        // вывод сгенерированного кода и переход на новую строку
             "loop":""
           }
         ]
       
        ],
        "menus": {
            "digital":["HIGH","LOW"] // меню
        },
        "values":{ // определяем значения пунктов меню "HIGH" и "LOW"
            "HIGH":1,
            "LOW":0
        }
    }
    В файлах .h и .cpp содержится библиотека с определением классов и функций, насколько я понял - это стандартная библиотека для Arduino.

    В файле demo.js содержится ява-скрипт, в котором я не разобрался, кода в этом файле много, а комментариев мало, поэтому как его изменить в нужную сторону непонятно... Если кто может - подскажите пожалуйста - где и как вносить изменения, чтобы они касались только создаваемого нового блока из .s2e.

    Далее переходим к сделанному мною расширению - (ссылка на доработанную версию).

    Я тупо взял Demo и внёс свои изменения:
    Код (C++):
    {    "extensionName": "R74HC595",
        "sort":0,
        "javascriptURL":"js/R74HC595.js", // определяем путь к JavaScript файлу
        "firmware":"1.0",  // firmware version
        "extensionPort":0, // network port of extension, 0 for serial port
        "blockSpecs": [ // определяем блоки
            ["h","R74HC595 Program","runArduino"],  //незнаю, нужен ли вообще этот блок, потому что всё работает и с шапкой "программа на Arduino"
                 
            ["w", "ShiftOUT clockPin %n dataPin %n",  //определяем свой блок и запрашиваем 2 параметра
            "__",   // это вызываемая функция из ява-скрипта, поскольку моих функций там нет, я написал случайное имя
            "2",  // это параметр по умолчанию для clockPin
            "3", // это параметр по умолчанию для dataPin
            {"encode":"{d0}{d1}",  // этой строчки в demo нету, зачем она нужна я тоже не понял
            "setup":"pinMode({0},OUTPUT);\npinMode({1},OUTPUT);\n", // устанавливаем введеные в блоке пины в режим вывода,здесь {0} и {1} это порядковые номера вводимых значений в блоке, отсчет начинается с 0, \n прилегает вплотную к командам чтобы перед командами не было пробелов, это не принципиально, но так смотрится приятнее
            "inc":"",
            "def":"byte leds = 0;\n", // определяем переменную типа байт и присваиваем ей значение 0 по умолчанию
            "work":"shiftOut({1}, {0}, LSBFIRST, leds);\n", // ради этой команды shiftOut собственно и затевалось это расширение
            "loop":""}],
         
            ["w", "Leds %n", //определяем блок для записи и запрашиваем параметр для переменной Leds
            "___", "0",  // вызываем несуществующий ява-скрипт и присваиваем первой переменной в блоке значение 0 по умолчанию
            {"encode":"{d0}",
            "setup":"",
            "inc":"",
            "def":"",
            "work":"leds={0};\n", // присваиваем переменной leds введеное в блоке значение
            "loop":""}],

            /*
            [
            "w", "updateShiftRegister latchPin %n clockPin %n dataPin %n leds %n",
            "_", "2", "3", "4", "0",
            {
            "setup":"pinMode({0}, OUTPUT); \n pinMode({1}, OUTPUT); \n pinMode({2}, OUTPUT); \n",
            "inc":"#include \"R74HC595.h\"",
            "def":"byte leds = 0; \n R74HC595Class R74HC595({0}, {1}, {2}, leds); \n",
            "work":"leds = {3}; \n R74HC595.updateShiftRegister(); \n",
            "loop":""
            }
            ],
            */

    ],        
        "menus": {},
        "values":{}
    }
     
    Последнее редактирование: 19 сен 2017 в 23:25
  3. AbaddoN__S

    AbaddoN__S Нерд

    В коде строчка "encode":"{d0}{d1}" взята из стандартного Arduino.s2e идущего вместе с программой mBlock, находится этот файл в C:\Users\Abaddon\AppData\Roaming\com.makeblock.mBlock\Local Store\mBlock\libraries\arduino и в нем описано создание всех стандартных блоков для раздела offline программирования. Для чего этот encode нужен непонятно, но после него перечисляются по порядку вводимые переменные, я на всякий случай тоже включил эту строку в код.

    У меня отдельными блоками выполнены функции присвоения значения переменной leds и функция shiftOut. Сначала я это пробовал выполнить в одном блоке, следующей строкой "work":"shiftOut({1}, {0}, LSBFIRST, leds);\n leds={2};\n", но почему то, в случае выполнения 2-х команд в одной строке work - генерируемый код не соблюдал последовательность. Т.е. составляю простую схему установить цифровой вывод в 0 далее shiftOut далее установить цифровой вывод в 1 - и в генерируемом коде получалось что сначала выполняются установки пина в 0 потом в 1 и уже только потом выполняется shiftOut, долго не мог понять почему так - пока все не поразделял на кусочки.

    Я закоментил функцию updateShiftRegister - потому что она у меня так и не заработала, связываю я это с тем, что налажал в файлах библиотеки (собственно программировать в wiring я только учусь).

    Далее код R74HC595.h:
    Код (C++):
    /*
      R74HC595.h - библиотека для работы со сдвиговым регистром
    */


    #ifndef R74HC595_h
    #define R74HC595_h

    #include <Arduino.h>

    ///Объявляем класс
    class R74HC595Class
    {
        public:
            R74HC595Class(int latchPin, int clockPin, int dataPin, byte leds);
            void updateShiftRegister(); ///Функция передачи данных в сдвиговый регистр
        private:
            int _latchPin; ///Внутреняя переменная с номером пина "защелкивания", низкий уровень - запись в 74HC595, высокий уровень - вывод 74HC595 полученного байта
            int _dataPin; ///Внутреняя переменная с номером пина передачи данных в регистр сдвига
            int _clockPin; ///Внутреняя переменная с номером пина синхронизации передачи данных
            byte _leds; ///Байт информации передаваемый в регистр сдвига
    };
    #endif
    Далее код R74HC595.cpp:
    Код (C++):

    #include "Arduino.h"
    #include "R74HC595.h"

    R74HC595Class::R74HC595Class(int latchPin, int clockPin, int dataPin, byte leds)
    {
        pinMode(latchPin,OUTPUT);
        pinMode(clockPin,OUTPUT);
        pinMode(dataPin,OUTPUT);
       
        _latchPin = latchPin;
        _clockPin = clockPin;
        _dataPin = dataPin;
        _leds = leds;
    }
    void R74HC595Class::updateShiftRegister()
    {
       digitalWrite(_latchPin, LOW);
       shiftOut(_dataPin, _clockPin, LSBFIRST, _leds);
       digitalWrite(_latchPin, HIGH);
    }
    R74HC595.js - это demo.js внутри которого я на всякий случай поменял все встречающиеся слова "demo" на "R74HC595". Если не сложно - подскажите как туда добавить описание функций shiftOut и Leds из файла R74HC595.s2e.

    Еще замечание - если в коде R74HC595.s2e встречаются какие либо недочеты в виде пропущенных запятых или какие другие (не логические) ошибки - то при добавлении расширения в mBlock у вас ничего не произойдет, совсем ничего. Я тоже не сразу понял что из за пропущенной запятой - у меня не добавляется расширение, вродебы всё сделано как надо, никаких ошибок не выскакивает, но тем не менее расширение не добавляется.

    Далее планирую понаделать еще расширений для необходимых мне команд.
    Дети просят подключить LCD экран, который "IIC 1602", но стандартными средствами в mBlock или S4A этого сделать никак не получиться.
     
  4. AbaddoN__S

    AbaddoN__S Нерд

    Доделал расширение (на сколько смог) ВОТ ОНО - Яндекс.Диск.

    В итоге функции ShiftOUT и updateShiftRegister работают как нужно, проблемы с библиотеками были по причине того, что я не владею wiring-ом в нужной степени.

    Блок ShiftOUT работает совместно с блоком Leds, вот скриншеты с примером использования расширений и сгенерированным кодом:

    скрин.jpg скрин 2.jpg
    На скриншетах блоки созданного расширения переведены на русский - это я освоил применение перевода в файле .s2e.

    В работе функции ShiftOUT и updateShiftRegister нельзя использовать вместе, потому что они обе объявляют переменную Leds типа байт - т.е. будет двойное объявление одной и той же переменной - как от этого избавиться - разобраться сам не смог (опять-же если кто в теме как исправить - подскажите).

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

    Привожу листинг R74HC595.s2e, библиотеки приводить не буду - там ничего интересного по работе с mBlock нету, обычные библиотеки.
    Код (C++):
    {    "extensionName": "R74HC595",
        "sort":0,
        "javascriptURL":"js/R74HC595.js", // определяем путь к JavaScript файлу
        "firmware":"1.0",  // firmware version
        "extensionPort":0, // network port of extension, 0 for serial port
        "blockSpecs": [ // определяем свои блоки

    // "h" определение блока СОБЫТИЕ, "w" определение блока ЗАПИСИ, "r" определение блока ЧТЕНИЯ (в нашем случае обходимся без блока "h")

    // блоки "ShiftOUT clockPin %n dataPin %n" и "updateShiftRegister latchPin %n clockPin %n dataPin %n leds %n"
    // не использовать вместе, иначе будет два раза объявляться переменная leds.

            ["w", "ShiftOUT clockPin %n dataPin %n",   //определяем свой блок и запрашиваем 2 параметра
            "_",    // это вызываемая функция из ява-скрипта, поскольку моих функций там нет, я написал случайное имя
            "2", "3",    // это параметрs по умолчанию для clockPin и dataPin (перечисляем по порядку)
            {"encode":"{d0}{d1}",     // зачем нужна эта строчка я не понял, взята из стандартного Arduino.s2e, здесь просто перечисляются по порядку вводимые переменные,
            "setup":" pinMode({0},OUTPUT);\n pinMode({1},OUTPUT);\n",     // код вставляемый в void setup{}, \n - это переход на следующую строку, здесь устанавливаем введеные в блоке пины в режим вывода, здесь {0} и {1} это порядковые номера вводимых значений в блоке, отсчет начинается с 0
            "inc":"",
            "def":" byte leds = 0;\n",    // определяем переменную типа байт и присваиваем ей значение 0 по умолчанию
            "work":" shiftOut({1}, {0}, LSBFIRST, leds);\n",  // выполняемый код, ради этой команды shiftOut собственно и затевалось это расширение
            "loop":""}],
       
            ["w", "Leds %n",       //определяем блок для записи и запрашиваем параметр для переменной Leds (переменная, которая выводится в регистр сдвига)
            "__",     // это вызываемая функция из ява-скрипта, поскольку моих функций там нет, я написал случайное имя
            "0",      // это параметры по умолчанию для Leds
            {"encode":"{d0}",
            "setup":"",
            "inc":"",
            "def":"",
            "work":" leds={0};\n",   // выполняемый код, присваиваем переменной Leds значение с порядковым номером {0} из блока Leds
            "loop":""}],
       
            ["w", "updateShiftRegister latchPin %n clockPin %n dataPin %n leds %n",     //определяем блок для записи в регистр сдвига с использованием созданной библиотеки (запись в регистр выполняется одним блоком без лишних телодвижений)
            "___",                   // это вызываемая функция из ява-скрипта,
            "2", "3", "4", "0",      // это параметры по умолчанию для 4-х полей в созданном блоке
            {"encode":"{d0}{d1}{d2}{d3}",
            "setup":" pinMode({0}, OUTPUT); \n pinMode({1}, OUTPUT); \n pinMode({2}, OUTPUT); \n",  // код вставляемый в void setup{}, устанавливаем пины в режим вывода
            "inc":"#include \"R74HC595.h\"",                                      // подключается файл созданной библиотеки, для работы  с регистром сдвига
            "def":" byte leds = 0; \n R74HC595Class R74HC595({0}, {1}, {2}); \n",    // определяем переменную типа байт, создаем экземпляр класса описанного в библиотеке
            "work":" leds = {3}; \n R74HC595.updateShiftRegister(leds); \n",     // выполняемый код, вызываем функцию описанную в библиотеке, передаем ей параметр, который нужно вывести в регистр сдвига
            "loop":""
            }
            ],
       
       
    ],
       
           
           
        "menus": {},
        "values":{},

    "translators":{
            "ru-RU":{ // Перевод блоков на Русский, просто копируем названия блоков созданных выше и ставим в соответствие русские написания
                "ShiftOUT clockPin %n dataPin %n":"Запись в R74HC595, Пин-синхронизации %n Пин-данных %n",
                "Leds %n":"Данные для R74HC595 %n",
                "updateShiftRegister latchPin %n clockPin %n dataPin %n leds %n":"R74HC595, Пин-защелка %n Пин-синхр. %n Пин-данных %n Данные %n"
            // определение языка "ru-RU" необходимо взять из файла locale.xlsx - файла локализации mBlock, если требуется перевод на другой язык. Здесь также можно указывать перевод пунктов меню и возможно чегонибудь еще.
            }
        }
    }
    /* Расширение создавалось после изучения следующих ресурсов:
    http://arduino.ru/Hacking/LibraryTutorial
    http://lesson.iarduino.ru/lesson/arduino-urok-4-registr-sdviga-74hc595-i-vosem-svetodiodov/kod-dlya-arduino.html
    http://forum.makeblock.cc/t/how-to-add-an-extension-for-mblock/2280
    http://arduino.ru/Tutorial/registr_74HC595
    опубликовано впервые на: http://forum.amperka.ru/threads/%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-mblock-%D0%B0%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3-s4a-%D0%B4%D0%BB%D1%8F-%D0%B4%D0%B5%D1%82%D0%B5%D0%B9.6851/
    */
    В коде написал кучу комментов, теперь вижу что текст стал менее читабельным - зато более понятным.
     
    Последнее редактирование: 19 сен 2017 в 23:26
  5. AbaddoN__S

    AbaddoN__S Нерд

    Составил расширение для работы с часами реального времени в mBlock - ССЫЛКА.

    Готовую библиотеку и инструкции по работе с RTC взял с сайта iarduino.ru , в библиотеке всё подробно расписано и работа с ней довольно удобна.

    Листинга расширения не будет, поскольку текста набегает более 10000 символов.

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

    rtc_.jpg

    Проверял работу библиотеки на имеющемся DS1302, остальные варианты впринципе тоже должны работать, предлагаю сообщить об возможных ошибках при работе с другими модулями для исправления - либо исправить самостоятельно и обновить ссылку на расширение.

    Логика работы с модулями RTC следующая:
    - инициализируем девайс,
    - устанавливаем дату\время,
    - считываем время в "строку",
    - либо просто выполняем функию "пустого" считывания, после чего возможно будет использовать переменные "считать час", "считать минуты" и т.д. В библиотеке и примере идущем с библиотекой всё подробно расписано.

    Выявил особенности

    - В описании расширения в разделе значений пунктов меню,
    например: "values":{ "Mon":1, -можно указывать только числовые значения, в связи с чем не удалось сделать чтение отдельных составляющих (час, сек. мин и т.д.) в одном блоке через меню.

    - При вызове ява-скрипт функции для онлайн режима - в случае если название вызываемых функций одинаковы (я беру "случайные" названия и пару раз получалось оставить одинаковые названия в описаниях разных блоков) - так вот в случае одинаковых названий даже несуществующих функций - генерируемый код может странным образом вызывать команды из разных блоков и вставлять его в Вашу программу.

    Расширение предназначено для генерирования кода, для офф-лайн работы устройства. Файл RTC.js опять остался от демки. Кто может подсказать как запрограммировать онлайн функции расширения в этом файле - буду благодарен.
     
    Последнее редактирование: 30 дек 2015
  6. DrProg

    DrProg Вечный нерд

    Поставил эту систему пару недель назад для ознакомления, попробовал поработать. На мой взгляд, хорошее подспорье для переходя со Скретча на С++. Можно наглядно видеть в какой код превращаются блоки. В остальном, как мне показалось, вынос мозга похлеще чистого Си. Даже готовые библиотеки к модулям в виде блоков не очень спасают, получается громоздко и не гибко. Причем и в сгенерированном Сишном коде потом разобраться очень трудно, несмотря на обилие комментариев. И это не говоря уже про глюки и отсутствие многих возможностей.

    Может быть ошибаюсь, дело привычки, но вот что то не могу придумать как его использовать для реальной жизни.
     
    ИгорьК нравится это.
  7. AbaddoN__S

    AbaddoN__S Нерд

    Ну я вначале так и написал, что это аналог S4A, только более продвинутый. Для реальной жизни вижу только один сценарий - обучение дошкольников и школьников начальных классов азам программирования, далее (старше) мне кажется, нужно полюбому переходить на программирование в C++ (естественно это только моё мнение).

    Собственно так я его и использую, мелкому всего 6 лет - конечно ничего сложнее скрэтча он не поймет. Поскольку ребенок увидел ардуинку и заинтересовался, то я решил что хорошим делом будет - научить его собирать электрические схемы и программировать хотябы блочно. Вот вечерами после работы мы с детьми иногда садимся и что нибудь простецкое собираем/программируем - моя задача придумать что сделать и объяснить как, а они собирают и пишут программу (причем собирать схемы на макетке им легко и не менее интересно чем писать программу).

    S4A не подошел ввиду того что моя ардуинка с ним плохо работает, да и возможностей у него гораздо меньше чем у mBlock.

    Тему создал - потому что не смог найти готовых расширений к mBlock для различных устройств. Теперь сам разобрался и вот выкладываю. Если кто то еще заинтересуется - то разбираться что к чему не нужно - скачивай расширения и подключай девайсы к ардуине.

    А в остальном согласен - получается громоздко и не гибко.
     
  8. DrProg

    DrProg Вечный нерд

    У Скретча есть еще минус перед Блоком, он работает в ПК, а Ардуина лишь выполняет его команды. Автономно прошить не получится. То есть изготовить поделку на Ардуине для школьной выставки на S4A вряд ли удастся. Но для обучения он все же проще и удобнее, хотя бы потому, что показывает состояние портов онлайн.
     
    ИгорьК нравится это.
  9. tiger911

    tiger911 Нуб

    У mBlock есть режим не автономной работы, как у S4A?
    Кстати версия 3.2 работает с платой TETRA на основе Arduino Leonardo (Snap4Arduino не работает)
     
  10. AbaddoN__S

    AbaddoN__S Нерд

    Да, есть такой режим, если не ошибаюсь он и называется ОНЛАЙН режимом.

    Но в этом режиме не отображается состояние портов, если они нужны - то выполнить это можно отдельным скетчем.
     
  11. AbaddoN__S

    AbaddoN__S Нерд

    Расширение для работы с LCD экраном, протестировал на LCD 1602, всё работает. Ссылка.
    Использовал стандартную библиотеку LiquidCrystal.

    В расширении задействовал только необходимые функции.

    Пример минимальной программы выглядит так:
    Буфер обмена02.jpg

    Логика работы:
    Инициализируем дисплей, указав какие пины задействованы на Arduino.
    Далее определяем тип дисплея (количество строк\столбцов).
    Далее просто выводим на экран текст, либо назначаем какую либо переменную.
    При очистке экрана - с него стирается вся информация и курсор устанавливается в верхний левый угол.
    При установке курсора следует учитывать что отсчет строк идет с нуля.


    Расширение предназначено для генерирования кода, для офф-лайн работы устройства. Файл *.js опять остался от демки. Кто может подсказать как запрограммировать онлайн функции расширения в этом файле - буду благодарен.
     
    Serega2016 нравится это.
  12. AbaddoN__S

    AbaddoN__S Нерд

    Обновился до mBlock 3.2.2 , поправил перевод, вот ссылка (Новая версия перевода)
    У меня после установки на старую версию появился новый каталог:
    C:\Users\YOUR_NAME\AppData\Roaming\com.makeblock.mBlock.v3.2.2\Local Store\mBlock\locale

    Возможно, если устанавливать mBlock с нуля, то дирректория локализации будет следующей:
    C:\Users\YOUR_NAME\AppData\Roaming\com.makeblock.mBlock\Local Store\mBlock\locale

    Обновил перевод и немного доработал расширения (после инструкций include не было символа конца строки):
    LiquidCrystal https://yadi.sk/d/RO1tVp5XqY3yw
    R74HC595 https://yadi.sk/d/Bx-P7rmx3N48NJ
    RTC https://yadi.sk/d/px-zTx8rqY4Ba

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

    В новой версии mBlock 3.2.2 настойчиво предлагается выбрать расширение в виде файла с расширением .json , в типе выбираемых файлов, соответственно нужно изменить это на .zip
     
    Последнее редактирование: 19 сен 2017 в 23:28
    Serega2016 нравится это.
  13. AbaddoN__S

    AbaddoN__S Нерд

    Написал расширение для ИК ПДУ.
    Код (C++):
    {    "extensionName": "IRremote",
        "sort":0,
        "javascriptURL":"js/IRremote.js", // определяем путь к JavaScript файлу
        "firmware":"1.0",  // firmware version
        "extensionPort":0, // network port of extension, 0 for serial port
        "blockSpecs": [ // определяем свои блоки

    // "h" определение блока СОБЫТИЕ, "w" определение блока ЗАПИСИ, "r" определение блока ЧТЕНИЯ



            ["w", "IRremote pin ( %n )",   //Создаем объект класса IRrecv. Определяем подключение IR приемника
            "IRremote pin (pin)",         // это вызываемая функция из ява-скрипта (здесь - случайное имя)
            "11",                        // значение пина по умолчанию
            {"encode":"{d0}",
            "setup":" irrecv.enableIRIn();\n",                                // запускаем прием данных по ИК датчику
            "inc":" #include \"IRremote.h\" \n",                             //подключается файл библиотеки, для работы с модулем LCD
            "def":" IRrecv irrecv({0});\n decode_results results;\n",     // создаем экземпляр класса описанного в библиотеке. Указываем пин, к которому подключен приемник, создаем переменную для считывания в неё сигнала (тип из библиотеки)
            "work":"",
            "loop":""}],

                   
           
            ["B", "bulean result receive",          //переменная с результатом ДА или НЕТ - получены данные или нет.
            "bulean result receive",               // это вызываемая функция из ява-скрипта (здесь - случайное имя)
            {"encode":"",
            "setup":"",
            "inc":"",
            "def":"",
            "work":"irrecv.decode(&results)",
            "loop":""}],  

           
            ["r", "Value Results",            // полученные по ИК данные
            "results_value",                 // это вызываемая функция из ява-скрипта (здесь - случайное имя)
            {"encode":"",
            "setup":"",
            "inc":"",
            "def":"",
            "work":"results.value",
            "loop":""}],  
           
           
           
            ["w", "Resume IR receive",            // получаем следующую команду (порцию данных) по ИК
            "irrecv_resume",                     // это вызываемая функция из ява-скрипта (здесь - случайное имя)
            {"encode":"",
            "setup":"",
            "inc":"",
            "def":"",
            "work":" irrecv.resume();\n",
            "loop":""}]
           
           

    ],
           
               
               
        "menus": {
           
            },
       
        "values":{
           
            },

    "translators":{
            "ru-RU":{ // Перевод блоков на Русский
            "IRremote pin ( %n )":"Подключение ИК приемника, пин ( %n )",
            "bulean result receive":"получено - ДА-НЕТ",
            "Value Results":"полученные данные ИК",
            "Resume IR receive":"получить данные по ИК"
               
               


            // определение языка "ru-RU" необходимо взять из файла locale.xlsx - файла локализации mBlock, если требуется перевод на другой язык. Здесь также можно указывать перевод пунктов меню и возможно чегонибудь еще.
            }
        }
    }

     
    Скачать.
    Правила использования расширения:
    Буфер обмена02.png
    Этот блок подключает библиотеку "IRremote.h" и инициализирует работу ИК приемника.

    Далее в расширении есть блок с проверкой, получены ли данные с приемника (логическая переменная), и собственно блок с полученными данными, которые уже получены и которые можно использовать.
    Запрос на получение следующих данных с приемника выполняется также отдельным блоком, его использовать после всех необходимых операций с уже полученными данными.
     
    tesak47 и Serega2016 нравится это.
  14. tesak47

    tesak47 Нуб

    AbaddoN__S ты ваще красавчег!!! Воодушевленный твоими работами решил попробовать и получилось у меня неплохое расширения для работы с модулем матрицы 8*8 и делюсь своей работой. Матрица подключается так: DIN на 12, CS на 10, CLK на 11. Ты кстати случайно не решил как можно добавлять свои расширения в другие скрипты?
     

    Вложения:

    • matrix8x8.zip
      Размер файла:
      7,7 КБ
      Просмотров:
      55
    Последнее редактирование: 5 окт 2016
  15. AbaddoN__S

    AbaddoN__S Нерд

    У меня матрица без обвязки, вот пару месяцев назад только пришла парочка MAX7219. Поэтому я сначала пытался подключить матрицу напрямую к выходам ардуины (получится только с Мегой), но слишком громоздко и неудобно в использовании получалось.
    Я примерно с мая веду ремонт в квартире своими силами, поэтому времени на ардуинство катастрофически нет, к НГ думаю всё закончить, добить и выложить пару зависших в процессе проектов.
    Что ты имеешь ввиду про "свои расширения в другие скоипты"? Объясни поточнее.
     
  16. tesak47

    tesak47 Нуб

    В режиме ардуино доступны скрипты "Данные и блоки", "Контроль", "Операторы", "Ардуино". Так вот хотелось бы получить возможность редактировать эти скрипты, т.е. добавлять туда блоки, удалять их. И еще очень расстраивает то, что нет возможности выбирать тип данных для переменных. Дело в том что я занимаюсь образовательной робототехникой и в MBLOCK нашел очень хорошее подспорье в этом деле, но программа блин сырая, хотелось довести до ума все недоработки.
     
  17. AbaddoN__S

    AbaddoN__S Нерд

    Нашел на форуме MakeBlock новый нормальный мануал - https://yadi.sk/d/rqdi9CUO3MnuXt
    Жаль что на английском, но сложных описаний там нет, всё понятно.

    Скрипты для блока "Ардуино" лежат кстати здесь: C:\Program Files (x86)\mBlock\ext\libraries\arduino

    Ну а насчет переменных - можно сделать свой набор из разных типов,
    Код (C++):
    ["R", "Peremennaya_float_1", "_p1",
            {"setup":"","inc":"","def":"float Peremennaya_float_1; \n","work":"Peremennaya_float_1","loop":""}],
     
    Последнее редактирование: 19 сен 2017 в 23:34
  18. Prosperous

    Prosperous Нуб

    Уважаемый AbaddoN. Долго искал как обрабатывать кнопки пульта и забрел сюда. Но код к сожалению не работает. Что я делаю не так? Спасибо
     

    Вложения:

    • код.jpg
      код.jpg
      Размер файла:
      29,6 КБ
      Просмотров:
      23
  19. AbaddoN__S

    AbaddoN__S Нерд

    Всё дело в том что я не знаю JavaScript... поэтому в расширении файлик _ХХХ_.js я оставляю пустым (без изменений), а в нем должны быть описаны все блоки используемого расширения для работы в режиме Онлайн.
    Все сделанные мной расширения работают только для оффлайн режима.
    Т.е. программа должна начинаться с блока upload_2017-6-30_12-6-23.png , и далее программу нужно загрузить в Arduino. На компьютере работа программы видна не будет, кроме передачи данных через Serial COM порт.

    Давно уже не занимался ардуинствованием к сожалению, если что опять не будет работать (в режиме оффлайн) или найдутся какие ошибки - выкрою время, протестирую и исправлю.
     
  20. AbaddoN__S

    AbaddoN__S Нерд