На самом деле я немного наврал в теме и предлагаемый подход не является таким уж и новым с точки зрения компьютерных технологий, но при этом почему-то не получил должного развития в области встраиваемых систем.
Название предлагаемого подхода - Remote Procedure Call (http://ru.wikipedia.org/wiki/Remote_Procedure_Call). Его смысл заключается в том, что мы можем вызывать функции одного адресного пространства (микроконтроллера) из другого адресного пространства (компьютера).
Это означает, что фактически вам не нужно задумываться о протоколе обмена между компьютером и роботом, вы просто пишете функции и помечаете их как "удаленно вызываемые".
После этого нажать волшебную кнопку RPC и для вас будет создан файл для C# в котором будет создан специальный класс, предназначенный для удаленного вызова помеченных процедур.
Вложения
Arduino.png (11.53 КиБ) Просмотров: 5767
Последний раз редактировалось Виталий 25 авг 2010, 16:02, всего редактировалось 2 раз(а).
Я думаю тема крайне полезная в ряде случаев, а не получила должного развития, потому что ИМХО чаще всего людям хочется вообще избавиться от программирования такого низкого уровня, и работать уже с готовым протоколом или его оберткой в виде DLL-ки.
Я не думаю что причина именно в этом. Ничто не мешает прокидывать "наверх" не такие функции как я показал, а функции работы с периферией. А DLL-ка по-сути у нас и формируется, даже лучше чем DLL-ка. =)
По той же логике ничто не мешает и частный случай протокола RPC самому написать под такие функции. Я говорю - большинству надо не RPC, а готовый набор функций, лишь бы не разбираться, как это на низком уровне делается. Поэтому скорее всего и не прижилось. Всё это конечно моё скромное ИМХО
похожий подход используется в Urbi. Cоздаётся urbi-объект UObject, который выполняет роль драйвера(промежуточного слоя) между Urbi и роботом(Arduino). Получается, что промежуточный слой берёт на себя протокол общения с роботом, предоставляя внешнему слою прозрачные интерфейсы(значения величин, вызов методов/функций).
По той же логике ничто не мешает и частный случай протокола RPC самому написать под такие функции.
В том-то и дело, что мы избавляемся от необходимости написания (расширения) каждый раз протокола обмена. Написал функцию, объявил что ее можно вызвать через RPC, получил возможность вызова данной функции с компьютера.
Я говорю - большинству надо не RPC, а готовый набор функций, лишь бы не разбираться, как это на низком уровне делается.
А такой набор функций есть в Ардуино.
похожий подход используется в Urbi. Cоздаётся urbi-объект UObject, который выполняет роль драйвера(промежуточного слоя) между Urbi и роботом(Arduino). Получается, что промежуточный слой берёт на себя протокол общения с роботом, предоставляя внешнему слою прозрачные интерфейсы(значения величин, вызов методов/функций).
Это не совсем так. Urbi не может самостоятельно создать этот промежуточный слой, вам его придется реализовать самостоятельно, расширять, дополнять. Вот здесь вам может помочь наша разработка. Вы напишете необходимые функции, автоматически сгенерируете для них привязку к C# и с легкостью реализуете UObject, т.к. уже будете иметь готовый класс для "общения" с роботом посредством вызова его функций.
Виталий писал(а):В том-то и дело, что мы избавляемся от необходимости написания (расширения) каждый раз протокола обмена. Написал функцию, объявил что ее можно вызвать через RPC, получил возможность вызова данной функции с компьютера. А такой набор функций есть в Ардуино.
Да я понял, я говорю что раз вы даёте более универсальный механизм - значит пользователю всё равно надо заморочиться и выбрать нужные функции, собрать прошивку и т.п. И в целом - теряется смысл Ардуино тогда - зач ем совместимость с этим загадочным форм-фактором, если не надо гибкости в программировании и миллиона примеров? А если вы за юзера выбрали нужные ему функции - тогда зачем ему после этого универсальный RPC? В общем с точки зрения технологии - крутая фича ваш RPC, с точки зрения маркетинга - мне сомнительно, что аудитория будет широка.
Да я понял, я говорю что раз вы даёте более универсальный механизм - значит пользователю всё равно надо заморочиться и выбрать нужные функции, собрать прошивку и т.п.
Да, на данный момент это так. Но можно делать и стандартные сборки, если будет необходимость.
теряется смысл Ардуино тогда - зач ем совместимость с этим загадочным форм-фактором, если не надо гибкости в программировании и миллиона примеров?
Смысл Ардуино остается, т.к. не все функции можно вынести на ПК в связи с временем их выполнения или критичностью. В этом смысле Ардуино остается автономным узлом на котором могут быть реализованы простейшие, но необходимые функции (например защита от перегрузок, реакция на сработавшие концевики).
Забавная финьга, только здается мне что она эффективна в случае тормозных либо перегруженных процессоров (привет языки высокого уровня)и быстрых линий передачи между ними.
Зачет. Но эт все здорово, пока не начались треды, реентерабельность, сборщики мусора, и всякие прочие "области видимости", "времена жизни", "создания объектов"... (не говоря уже о дебаге например) Боюсь, что полноценный RPC - очень непростая в реализации штука.
Че-то я не очень понимаю как ПК поймет где находится контроллер и как к нему подключится. И как МК поймет что от него хотят? Тогда на нем надо поднимать ОС, способную к RPC. А это все уже не так просто... По мне так куда проще протокол обмена сделать, который так-же будет вызывать функции и возвращать их значения.
Зачет. Но эт все здорово, пока не начались треды, реентерабельность, сборщики мусора, и всякие прочие "области видимости", "времена жизни", "создания объектов"... (не говоря уже о дебаге например) Боюсь, что полноценный RPC - очень непростая в реализации штука.
Ну что я могу сказать, да, такие проблемы могут возникнуть, но только на стороне ПК, где они уже решаются более-менее цивилизованными средствами. Не думаю, что понадобится реализация этого на контроллера. У нас простая задача - вызвать на контроллере определенную функцию и вернуть результат.
Че-то я не очень понимаю как ПК поймет где находится контроллер и как к нему подключится.
Ну для доступа к контроллеру автоматически создается класс RemoteObject, в конструкторе которого и указывается тот последовательный порт к которому подключен контроллер.
RemoteObject arduino = new RemoteObject("COM20", 57600);
И как МК поймет что от него хотят? Тогда на нем надо поднимать ОС, способную к RPC. А это все уже не так просто... По мне так куда проще протокол обмена сделать, который так-же будет вызывать функции и возвращать их значения.
В том то и дело, что ничего не надо поднимать. Ты просто пишешь функцию для МК, помечаешь ее как remotable и она автоматом добавляется в класс RemoteObject(), а протокол обмена и его реализация генерируются автоматически.
А к Processing ее прикрутить можно?
Да, можно.
P.S. Добавил короткое видео в заглавное сообщение.