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

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

Метки:
  1. AbaddoN__S

    AbaddoN__S Нерд

    https://yadi.sk/d/v_K6mWte3NULZq - мой вольный перевод официальной инструкции для написания расширений. Здесь буду складывать доработанные инструкции в случае если что измениться или добавится.
    Исходник инструкции взял на официальном сайте, по адресу: http://www.mblock.cc/docs/create-extensions-for-mblock/
     
    Последнее редактирование: 4 окт 2017
  2. AbaddoN__S

    AbaddoN__S Нерд

    Наконец то автоматизировал перевод и привел всё в более-менее приличный вид! Теперь не нужно искать вручную файл локализации и что то копировать\перемещать думая подходят ли версии файла локализации и текущая версия mBlock.
    Ссылка на Я-Диск.

    Для выполнения перевода можно поместить файл в одну папку вместе с файлом локализации mBlock, располагается он обычно по адресу:
    C:\Users\Abaddon\AppData\Roaming\com.makeblock.mBlock\Local Store\mBlock\locale\locale.xlsx - это на моем компьютере
    Далее открыть excel файл перевода, нажать кнопку "Перевести" вверху страницы и в открывшейся форме нажать кнопку "Выполнить перевод".
    Это самый работоспособный вариант и здесь нужно самому искать файл локализации, но при данном варианте перевод гарантированно сработает.
    Но обычно всё работает проще: скачиваете базу, открываете форму перевода и жмакаете кнопку "Поиск" - файл локализации будет найден автоматически, далее жмакаете "Найти русский столбец" и далее уже "Выполнить перевод" - на этом всё!

    Да, для нормальной работы требуется разрешить выполнение макросов в Microsoft Office.

    Никаких защит паролем для доступа к изменениям Базы или скриптов не применял. Кому интересно - проводите доработку Базы своими силами, в скриптах старался всё закомментить - чтобы было понятно. Если сил или желания нет, пишите что добавить (в базу или функционал) - по возможности сделаю.

    На форме перевода для автоматизации выполнил кнопки:
    Поиск - найти расположение файла локализации
    Искать русский столбец - поиск столбца с русским переводом в файле локализации (иногда от версии к версии столбец меняется, по умолчанию принимает значение J, но можно его изменить вручную).

    Поиск файла локализации осуществляется по сопоставлению текущей версии ПО mBlock указанном в файле:
    C:\Program Files (x86)\mBlock\META-INF\AIR\application.xml
    и соответствующем текущей версии адресу рабочей дирректории ПО mBlock, например для версии 3.4.10 - рабочая папка с расположенным в ней файлом локализации находится здесь:
    C:\Users\Abaddon\AppData\Roaming\com.makeblock.Scratch3.4.10\Local Store\mBlock\locale\locale.xlsx - это на моем компьютере
    Для разных версий это правило может отличаться, но я не смог найти где в явном виде указывается текущая рабочая директория, поэтому такие костыли...


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


    В процессе работы для облегчения анализа и выполнения перевода добавил некоторые сервисные функции:
    (Базой или БД везде называю приложенный файл, где хранится сама база перевода и скрипты по переводу)
    1.Скопировать перевод в Базу. Здесь копируются все новые слова, не встречающиеся в базе - в конец списка и выделяются цветом, если слова в базе есть и имеющийся в файле локализации перевод отличается от перевода в Базе - то перевод имеющегося слова помещается в столбец правее основного перевода и выделяется цветом.
    2.Очистить столбец D. Удаляются слова и очищается цветовое выделение столбца с доп. переводом.
    3.Очистить цветовое выделение. Сбрасываются цветовые выделения всех рабочих ячеек, ничего из ячеек не удаляется.
    4.Добавить новые слова. Из файла локализации добавляются в конец списка Базы все найденные новые слова с переводом (если есть), если слово уже есть в базе то добавляться оно не будет несмотря на возможную разницу в переводе.
    5.Повторения в файле локализации. В файле проводится поиск дубликатов отдельно в английском столбце, отдельно в русском - все повторяющиеся выделяются одним и тем же цветом, файл локализации остается открытым, изменения не сохраняются.
    6.Повторения в Базе.В файле проводится поиск дубликатов отдельно в английском столбце, отдельно в русском - все повторяющиеся выделяются одним и тем же цветом.
    7.Сортировка по английскому столбцу. Сортировка проводится по всему диапазону рабочих ячеек, т.е. соответствия английских слов и русского перевода сохраняется, порядок слов в базе на функционал не влияют.
    8.Сортировка по русскому столбцу. Сортировка проводится по всему диапазону рабочих ячеек, т.е. соответствия английских слов и русского перевода сохраняется, порядок слов в базе на функционал не влияют.
     
    Последнее редактирование: 4 окт 2017
  3. AbaddoN__S

    AbaddoN__S Нерд

    Переделал под себя стандартное расширение "Arduino", и поскольку оно у меня работает только в Офф-лайн режиме, называется соответственно "Arduino-Offline".
    В расширение добавлена возможность работы с регистрами сдвига, работа с числами в двоичном виде, ну и некоторые вещи переделал в более удобоваримом для меня виде.
    Планирую в будущем дорабатывать расширение и возможно включать в него новые блоки, поэтому прямая ссылка на расширение при замене файла будет неактуальной... Для этого буду указывать ссылку на директорию с файлом (и название файла), а также буду разбираться с размещением расширений в онлайн библиотеке MakeBlock, чтобы была возможность своевременно обновляться до актуальной версии.

    Я-Диск\Расширения mBlock, файл расширения Arduino _ Offline.zip
    Расширение по его названию также можно найти в панели "Управление расширениями" программы mBlock или на оф.сайте. Оно будет в списке, доступным для скачивания онлайн вместе с расширениями других авторов.

    К написанным расширениям буду составлять хелп файл с описанием сделанных блоков. Размещать буду на Я-диске в отдельной директории, файл хелпа будет иметь схожее название с расширением. Посмотреть хелп - Soft#01-Arduino - Offline.docx.
    В файле с хелпом в конце будет список к карточкам, в которых имеются примеры работы расширения с различным оборудованием (составлял для своих детей, может кому это тоже поможет в обучении).
     
    Последнее редактирование: 4 окт 2017
  4. AbaddoN__S

    AbaddoN__S Нерд

    Как оказалось, с размещением расширения на сайте mBlock тоже не всё просто....
    Также как и при работе с программой - накладывается ряд дополнительных ограничений, выводится сообщение об ошибке, но где эта ошибка и как её интерпретировать - совершенно непонятно. Опытным путем выяснил, что при загрузке расширений на сайт - в тексте не должно быть комментариев.... вот так, программа их допускает, а на сайте нельзя.....
    Посмотрел уже загруженные, чужие расширения - действительно, комментариев ни у кого нет...

    P.S. Ввиду вышеописанной ситуации и того, что по моему мнению комменты в коде все-таки должны присутствовать, сделал небольшой скриптик на VBS для упрощения и автоматизации работы. Суть в следующем: поскольку файлы расширений .s2e являются обычными текстовыми файлами, то разработку расширения можно вести в обычном .txt с переименованием его в .s2e с последующей проверкой и использованием (а наличие в папке расширения mBlock постороннего .txt на функциональность никак не влияет и не запрещено), следовательно, проще всего вести разработку в .txt с нормальными комментами и после "конвертировать" в .s2e путем перетаскивания текстовика на скрипт мышкой (скрипт создаст .s2e файл с таким же именем как у текстовика и перепишет в него всё что есть внутри текстового файла, вырезая при этом комменты). Код скрипта довольно простой, в отдельные строковые переменные внес расширение создаваемого файла (вдруг в будущем чего поменяют) и комбинацию символов с которой начинаются комменты (просто "//" использовать нерационально, потому что данные символы могут встречаться в описании кода, генерируемого блоком, или в web адресах). Скрипт буду оставлять в архиве с расширением, комментов в скрипте много, кому интересно можно будет подогнать его под свои нужды.

    Код (Text):
    Dim objFS, objFileTXT, objFileS2E, strPath, fullPatch,  strTemp, intPos, strNew, WshShell, fileName, ext_mBlock, strFind

    'актуальное расширение файла расширения mBlock - вот такой вот каламбур))))
    ext_mBlock = ".s2e"

    'данное сочетание символов используется в тексте расширения для обозначения комментов которые нужно удалить
    strFind="//_"

    Set objArgs = WScript.Arguments
    'полный путь с именем перетащенного на скрипт файла
    fullPatch = objArgs(0)

    Set objFS = CreateObject("Scripting.FileSystemObject")
    'создание файла шаблона, для нахождения текущей директории при перетаскивании
    CreateObject("Wscript.Shell").CurrentDirectory = Mid(Wscript.ScriptFullName, 1, InStrRev(Wscript.ScriptFullName, "\") - 1)

    'текущая директория
    Set WshShell = WScript.CreateObject("WScript.Shell")
    strPath = WshShell.CurrentDirectory

    'получаем название файла, перетащенного на скрипт
    fileName = Replace(fullPatch,strPath & "\", "")

    'проверяем текстовый ли файл перетащен на скрипт
    if objFS.GetExtensionName(fullPatch)="txt" then
        'проверяем, если готовый файл расширения mBlock с расширением .s2e
        If not objFS.FileExists(Replace(fullPatch,".txt", ext_mBlock)) Then
            'открываем исходный файл для чтения, создаем файл с расширением .s2e для записи.
            Set objFileTXT = objFS.OpenTextFile(fullPatch)
            Set objFileS2E = objFS.CreateTextFile(Replace(fullPatch,".txt", ext_mBlock), True)
       
            'читаем исходный текстовик, пока не достигнем конца файла
            Do While Not objFileTXT.AtEndOfStream
                'читаем строчку
                strTemp = objFileTXT.ReadLine
                'находим позицию где начинается в строчке коммент
                intPos = InStr(1, strTemp, strFind, vbTextCompare)
                'если коммент есть, то....
                if intPos>0 then
                    'формируем новую строку от начала строки, до начала коментариев (минус один, потомучто функция работает по указанный номер ВКЛЮЧИТЕЛЬНО"
                    strNew = left(strTemp, intPos - 1)
                    'пишем в новый файл измененную строку
                    objFileS2E.Writeline strNew
                else
                    'пишем в новый файл строку как есть (потому что комментов в ней нет)
                    objFileS2E.Writeline strTemp
                end if
            loop
            'закрываем всё, работа сделана!
            objFileTXT.Close
            objFileS2E.Close
            WScript.Echo "Все операции выполнены успешно!"
        else
        WScript.Echo "Файл расширения с таким именем уже существует в текущей дирректории"
        end if
    else
    WScript.Echo "Используемый файл должен быть текстовым .txt"
    end if

    Set objFS = Nothing
    WScript.Quit 0
     

    upload_2017-10-4_11-29-16.png
     
    Последнее редактирование: 4 окт 2017
  5. AbaddoN__S

    AbaddoN__S Нерд

    В процессе работы с COM портом и составлением интерактивных примеров - столкнулся с тем, что не хватает блоков для работы с текстом... (конечно немного блоков уже есть в разделе "Операторы" mBlock, но их категорически не хватает!) Погуглив - узнал об объектах string и с чем их едят. Как следствие назрело еще одно расширение: Strings (Я-Диск\Расширения mBlock, файл расширения Strings.zip к нему составил карточку с хэлпом, ну и примеры работы с COM портом показывают как работать с блоками. Посмотреть хелп - Soft#03-Strings.docx.)
    В кратце:
    upload_2017-10-3_17-23-5.png - блок создает строковую переменную с указанным номером и присваивает ей значение (всё что присваивает переводится в текст). Код: string1= String("TEXT").
    upload_2017-10-3_17-23-34.png - блок для использования строковой переменной с указанным номером.
    upload_2017-10-3_17-24-18.png - блок выдает часть строковой переменной с указанным номером – часть формируется ОТ (номер байта) и ДО (номера байта). Код: string1.substring (0-1,1) - нумерация с нуля, поэтому в коде пишу (начальный№-1) чтоб нумерация символов начиналась с единицы.
    upload_2017-10-3_17-24-24.png - Код: String1.replace(String ("text1"), String("text2")).
    upload_2017-10-3_17-24-30.png - блок выдает символ с указанным номером. Код: char(36).

    В процессе работы с данными функциями выяснилось, что для английского языка 1 символ = 1 байт, русские буквы кодируются 2-мя байтами, поэтому при написании программы нужно тщательно рассчитывать – какой символ сколько байт занимает. Т.е. получаем по COM порту например русскую букву, считываем байт - смотрим его, а там сплошные кракозябры, т.е. нужно считать 2 байта, сложить их вместе в одну строку и можно выводить получившийся символ. Но я столкнулся с этим только при приеме сообщений, при отправке сообщений (когда в блоках пишешь по русски) - всё отправляется без замечаний.
    Ну или еще был такой момент, нужно было выделить из строки, допустим второе слово - рассчитываю его позицию исходя из того что, русские буквы 2 байта, но в результате первая буква - не читаемая... всё оказалось из за того, что между словами пробел, а пробел то - кодируется одним байтом, как и знаки препинания....
     
    Последнее редактирование: 4 окт 2017
  6. AbaddoN__S

    AbaddoN__S Нерд

    На днях переделал расширение IRremote для работы с инфракрасными приемниками\передатчиками. Добавил блоки для передачи ИК сигнала, обновил саму библиотеку IRremote (скачал посвежее у автора библиотеки).
    Протестировал её насколько смог. Не удалось проверить собственно саму функцию передачи сигнала, у меня есть только один ИК светодиод, который не удается нормально "раскачать" от Ардуины, а собирать схему усиления сигнала на транзисторе не из чего.....
    Расширение: IRremote (Я-Диск\Расширения mBlock, файл расширения IRremote.zip к нему составил карточку с хэлпом, и примеры работы с оборудованием при использовании блоков. Посмотреть хелп - Soft#04-IRemote.docx.)

    Из особенностей и ограничений:
    - переименовал файлы билиотеки IRremote, для того чтобы при компиляции небыло конфликтов со встроенной в mBlock библиотекой (да, в программе тоже лежит своя версия по управлению ИК сигналами).
    - в библиотеке для работы с ИК сигналами используется ардуиновский TIMER2, со всеми вытекающими.... т.е. если какие то другие библиотеки будут использовать этот же таймер, то из за конфликта скетч не загрузится в Ардуину. Кроме этого, по той же причине, при использовании расширения IRremote не будет работать функция TONE (вывод звука на пищалку).
    - в библиотеке возможно переключить таймеры: 1-5 для Меги, 1-2 для Уно и прочих (закомментить\раскомментить в IRemoteINTNEW.h).
    - в библиотеке жесткая привязка к пинам, с которых возможно отправить ИК сигнал, пины зависят от используемого таймера, в случае TIMER2 послать ИК сигнал можно с пина 9 Arduino Mega и с пина 3 прочих ардуин (UNO, Mini, Pro). Это отображено в блоках. Я пробовал сменить таймер на TIMER1 для UNO (в этом случае для UNO будет использоваться пин 9 и будет единообразие), но TIMER1 используется библиотекой Servo.h, поэтому, чтобы небыло лишних конфликтов - оставил TIMER2. Да, блоки для отправки ИК с Меги или с Уно - отличаются только названием, сделал 2 разных, чтобы показать какое подключение ИК передатчика требуется в разных случаях.
    - из за использования TIMER2 не будет работать модуляция ШИМ на пинах 9, 10 у Arduino Mega, а на остальных ардуинах на пинах 3 и 11, поскольку данные пины "привязаны" к этому таймеру.
    - и еще замечание: после использования расширения (и как следствие библиотеки) IRremote, mBlock может подглючивать, выдавая сообщения об ошибках и конфликтах даже при полностью отключенном расширении... в этом случае помогает перезагрузка mBlock и очистка временных файлов вручную (автоматически программа их не всегда подчищает).
    Временные файлы располагаются во первых в виндовой папке Temp, во вторых в папке временных файлов самой mBlock, у меня например здесь: C:\Users\AbaddoN\AppData\Roaming\com.makeblock.Scratch3.4.11\Local Store\scratchTemp
    - Передача ИК сигналов происходит только по протоколу NEC, сделал только этот протокол, как более универсальный и чтобы не городить лишних блоков (выбор протокола в одном блоке у меня сделать не получилось)
     
    Последнее редактирование: 4 окт 2017
  7. AbaddoN__S

    AbaddoN__S Нерд

    Переделал расширение для работы с LCD дисплеями типа 1602, 2004 и т.п. Добавил в расширение возможность написания русских букв (правда только заглавных) и создание любых своих собственных символов.
    В данном расширении поддерживается только полное подключение LCD дисплея (не i2c).

    Теперь особенности использования:
    - В указанных дисплеях есть память только под 8 пользовательских символов, поэтому в меню блоков 8 пунктов, если указать вручную номер больше 8-ми, работать не будет.
    - Библиотека для работы с LCD дисплеем переименована, для того чтобы не конфликтовать со встроенной библиотекой LiquidCrystall.
    - При создании своих символов следует помнить, что в соответствующие поля нужно вводить 5-битные двоичные числа, т.к. блоки в mBlock стандартные и не поддерживают ограничений на систему счисления, то ввести при желании в них можно любые десятичные цифры.
    upload_2017-10-9_0-57-10.png
    - При придумывании своих символов - удобно пользоваться программами для конструирования, например, LCD Character Creator (LCDCC) -данная программа бесплатна, её можно найти поиском и скачать, или скачать из дистрибутивов, складируемых мной на Я-Диске (lcdcc.rar).
    upload_2017-10-9_0-58-1.png

    Расширение: LiquidCrystalRus (Я-Диск\Расширения mBlock, файл расширения LiquidCrystalRus.zip к нему карточка с хэлпом, и примеры работы с оборудованием при использовании блоков. Посмотреть хелп - Soft#05-LiquidCrystalRus.docx.)