КОТ++
Прикладное программирование
Системное программирование
Программирование микроконтроллеров

Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования. (c) Линус Торвальдс

Поиск по тегам

Опубликовано
Комментарии 0

Splinter Jump – вторая игра моего авторства. Вдохновлённый игрой Doodle Jump, а она была очень популярная почти 8 лет назад, я решил сделать свою игру с похожей механикой. Кроме паскаля я тогда ничего не знал, соответственно, и эта игра была написана на паскале, в среде PascalABC.NET. Суть игры заключается в том, чтобы прыгать по платформам и добраться до верха и найти телевизор. На уровне разбросаны сыр и напитки. Сыр нужно собирать для зарабатывания очков, напитки дают улучшенный прыжок на ограниченное время. Игра полностью завершённая, в ней реализованы все задуманные уровни, в игре 10 уровней, в некоторых уровнях присутствуют боссы. Персонаж игры может атаковать, соответственно механика не ограничена только прыжками по платформам.

Через пару лет, когда изучил flash, то я решил переписать эту же игру на нём и загрузить её во ВК. Но к сожалению, ВК больше не поддерживают flash игры и они отключили мою игру. Первые четыре скрина – версия для windows, написанная на pascal, последние четыре скрина – flash версия для ВК, написанная в среде FlashDevelop, как видно по скрину была добавлена возможность поставить игру на паузу.

Исходный код pascal версии: https://bitbucket.org/Eg0r/splinter-jump




Теги , , , ,
Автор

Опубликовано
Комментарии 0

Не так давно мне поступил заказ на написание программы для windows, которая будет управлять по Ethernet ЧПУ контроллером PLCM от purelogic. Нужно было сделать не готовый софт, а все основные модули для работы с контроллером. Обязательно на Borland Delphi 7, что меня не могло не расстроить – это же старьё, ну так как человек, который после будет работать с моим кодом ничего другого не знает, то куда деваться то.

Протокол для работы с устройством был предоставлен. Связь по UDP, соответственно отслеживание потери пакетов перекладывается на мои плечи, для этого в протоколе предусмотрена нумерация каждого пакета, контроллер периодически говорит какой номер у последнего принятого пакета. Первые и последние байты – длина пакета, второй – нумерация, остальное – команда и данные.

Научив программу считать контрольную сумму (CRC16), уже удалось убедиться что контроллер принимает и понимает отправленные ему пакеты. Но, конечно, не обошлось без Wireshark, так как документация по протоколу не была полной, пришлось смотреть некоторые каверзные моменты протокола вживую, я изучал то что шлёт программа Mach3. Были реализованы команды: управление пинами, сброс (для обозначения начала связи), ручное перемещение осей, поиск базы, остановка, авария, траекторные данные, установка текущих координат, настройка ограничений перемещений, настройка портов ввода-вывода, умножитель скорости.

Команда управления пинами подразумевает управление пинами на трёх портах, по историческим причинам ЧПУ станков эти порты повторяют LPT, что изначально я не знал, поэтому были сложности. Ручное перемещение осей сделал с управлением клавиатурой, нажимая клавиши можно перемещать оси. Самое главное нужно было сделать интерпретацию G кода. И большим разочарованием для меня стало то, что контроллер этого делать оказывается не умеет. Поэтому пришлось сделать парсер G кодов, класс математических расчётов траекторий и интерпретатор (который посылал расчитанные траектории контроллеру и следил за выполнением каждой строчки кода).

Как уже можно было догадаться, самая большая сложность как раз в правильных математических расчётах траекторий. Учитывая то, что нужны разгоны и торможения осей, соответственно может быть два вида такого движения – ось успела полностью разогнаться и затормозить (график трапеция), ось не успела разогнаться и уже пора тормозить (график треугольник). Очень не хотелось изобретать велосипед, и я начал искать решение в интернете. Как только я понял, что в гугле ничего нормального не находится, то решил покопаться в arduino библиотеках, там же наверняка реализованы разгоны для шаговых двигателей, но вскоре стало ясно, что разобраться в этом arduino коде не получится. Поискал я книги по ЧПУ и тоже не нашёл нужной мне информации, всё только очень обобщённо. И было решено всё же изобрести этот велосипед. Алгоритм я разработал отталкиваясь от физического смысла движения, то есть работал по формулам с ускорениями и скоростями, мне кажется этот подход правильным. С математикой было очень много проблем, потому что с первого раза алгоритм корректно не работал, пришлось сделать unit тесты, которые очень помогли отладить алгоритм и исправить ошибки. На скрине пример работы тестовой программы, графики отображают движение осей, таким образом я синхронизировал оси.

Итог в этой публикации.

В заключении хотел сказать, что на рынке сейчас очень много различных ЧПУ контроллеров и ПО к ним, о чём я раньше не знал. Из этого можно сделать вывод, что всевозможные бесплатные решения на arduino, raspberry pi с grbl, LinuxCNC не покрывают все требования к ЧПУ.
И ещё: LPT порт пережиток прошлого (на мой взгляд), но всё равно от него есть следы в современных контроллерах ЧПУ. Как я понимаю раньше драйверы шаговых двигателей подключали к компьютеру через LPT порт, и теперь когда люди подключают драйверы уже в отдельный контроллер, то видимо всем удобней, чтобы входы-выходы на этих контроллерах повторяли LPT порты.

Теги , , ,
Автор

Опубликовано
Комментарии 0

Классы были написаны на Delphi 7. Имеют в функционале: интерпретацию G-кода, расчёт траекторий для совместного движения осей (траектории строятся с учётом ускорений и торможений), низкоуровневый обмен пакетами с контроллером PLCM через UDP.

Основные классы в проекте:
TPLCM – обмен пакетами с контроллером
TMathTrajectory – расчёт траекторий
TCRC – вспомогательный класс для расчёта контрольной суммы пакета
TGCodeInterpreter – класс, который интерпретирует G-код
TPackageBuffer – буфер пакетов
TTrajBuffer – буфер траекторий

Так как расчёт траекторий процесс довольно не простой, то для класса, который считает траектории были написаны unit тесты, а также дополнительная программа для визуального отображения траекторий на графиках.
Так как связь по UDP, то было реализовано отслеживание потери пакетов и повторная отправка в случае потери. Документация протокола от разработчика контроллера не включала всех деталей, поэтому некоторые детали протокола были выяснены самостоятельно через программу Wireshark. С помощью Wireshark был пронализирован трафик, который шлёт ПО Mach3.
На скринах представлены небольшие программы, которые демонстрируют работу с данным набором классов.

Теги , , ,
Автор

Опубликовано
Комментарии 0

TMNT Nightmare Dreams – самая первая игра, которую я сделал, была написана ещё в школьные годы, а это примерно 8 лет назад с момента написания поста. Игра написана в среде PascalABC.NET. Для вывода графики использовались стандартные PascalABC и .NET Framework наборы классов. Для проигрывания аудио была использована библиотека Bass.NET. Именно в процессе работы над этой игрой я узнал и освоил ООП.
Игра содержит всего два уровня, 4 персонажа, 3 вида врагов, 3 удара, прыжки. Жанр игры – beat em up. До конца доделана она не была, я лишь написал основной функционал.




Теги , , ,
Автор

Опубликовано
Комментарии 0

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

Чтобы реализовать данную задачу будем использовать возможности платформы .NET

Как это работает: используем класс System.Diagnostics.Process для создания нового процесса с командной строкой. В командную строку на вывод перенаправляем простой echo вместе с командой clip.
Например:

echo yo | clip

скопирует в буфер обмена «yo»

Чтобы работать с несколькими строками будем использовать несколько echo (каждый echo переносит строку), чтобы отдать команде clip все наши echo будем использовать скобочки, например:

(echo yo & echo niga) | clip

И в завершение данного поста предлагаю посмотреть как это можно удобно упаковать в отдельные функции и использовать в своих программах:

var strClip: string;

procedure ClipStartOut();
begin
strClip := 'echo ';
end;

procedure ClipWriteLn(s: string);
begin
strClip += s + '& echo ';
end;

procedure ClipWriteLn(s: integer);
begin
strClip += s + '& echo ';
end;

procedure ClipExitOut();
begin
strClip := strClip.Remove(strClip.LastIndexOf('& echo'), 6);
var proc := new System.Diagnostics.Process();
proc.StartInfo := new System.Diagnostics.ProcessStartInfo('cmd', '/C (' + strClip + ') | clip');
proc.Start();
end;

begin
ClipStartOut();
ClipWriteLn(66);
ClipWriteLn(99);
ClipExitOut();
end.

Для начала работы с буфером надо вызвать процедуру ClipStartOut, для отправки текста в буфер - ClipWriteLn, для помещения всех данных отправленных через ClipWriteLn в буфер - ClipExitOut.

Всем clipboard, пасаны!

Теги ,
Автор