Расширения для 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.)
     
  8. AbaddoN__S

    AbaddoN__S Нерд

    Наконец то дошли руки до модуля I2C.
    Сделал на основе своего расширения LiquidCrystallRus новое - LiquidCrystalRus_I2C, для управления дисплеем с модулем I2C соответственно. Функции практически не изменились, библиотеку LiquidCrystal_I2C взял отсюда iarduino.ru. Я не уверен что перечислил в расширении все возможные адреса для дисплеев, если имеющихся окажется недостаточно - добавить не проблема - просто добавляем пункты в меню:
    Код (C++):
    "addr":["0x20","0x27","0x30","0x38","0x3F"],
    Все рекомендации отсюда актуальны и для данного расширения.

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

    AbaddoN__S Нерд

    Готово расширение для радиомодулей RF 315, 433 MHz (у них много названий MX-05V, XD-RF-5V, XY-FST, XY-MK-5V, FS1000A).
    rf433_1.jpg
    У меня имеется такая пара на 433 МГц, на ней и проверял работоспособность, но работать должно и на прочих подобных.

    Из особенностей:
    - Приемник нужно подключать к пинам 2 или 3 (используются соответствующие прерывания №0 и №1). Данные пины выбираются в меню блока инициализации, самостоятельно написать туда другой пин нельзя. Данные прерывания совпадают для Mega, Uno и Nano - поэтому их и оставил (у меги их конечно поболее будет).
    - Передавать данные достаточно одним блоком, а вот при получении нужно знать следующее - при получении нового сигнала блок Буфер обмена01.jpg становится True и будет в таком состоянии до тех пор пока его не сбросить Буфер обмена02.jpg (при сбросе текущие принятые данные очищаются), после сброса блок "сигнал принят" будет False до тех пор пока не придут новые данные от передатчика; блок отвечающий за принятые данные Буфер обмена03.jpg всегда содержит последнее принятое число, ели не использовался блок сброса, т.е. если послать несколько чисел с передатчика, а на Ардуине с приемником не сбрасывать данные, то блок принятых данных будет содержать последнее принятое число на момент проверки, новые числа буду записываться поверх старых (буфера хранения нет).
    - При использовании разных моторов естественно возникнет много помех, во время экспериментов опытным путем выяснено, что при питании Ардуины и всего оборудования о компьютера (USB кабель был всегда подключен) - сбои при передаче данных возникают часто, после того как начал отключать USB и запитывать оборудование от повербанка - передача данных стала стабильнее, если повесить на мотор керамический конденсатор 100 нФ - помех также становится меньше.
    - Для увеличения радиуса действия однозначно нужно повышать напряжение передатчика (до 10-11 В). При стандартных 5 вольтах радиус действия передатчиков был не более 2 метров, даже если припаять на модули антенны (использовал штыревые 175 мм длинной в виде куска проволоки UTP) то радиус увеличивается на полметра максимум. Но после того как поднял напряжение передатчика до 10 В - радиус увеличился до 10 м - в квартире, через одну кирпичную стену.

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

    "Scratch и Arduino для юных программистов и конструкторов"
    http://www.bhv.ru/books/book.php?id=199351

    "Игровая робототехника для юных программистов и конструкторов: mBot и mBlock"
    http://www.bhv.ru/books/book.php?id=201381

    Расширение AdvancedArduino (позволяет включать в программу блоки с фрагментами текстового кода, определять и использовать числовые переменные произвольного типа, одномерные и двумерные массивы, и многое другое)
    http://www.lab169.ru/mblock/advanced-arduino-extension/