В этой инструкции мы постараемся показать вам, в меру своих возможностей, как сделать робота Lego Mindstorm Turret Shooter, и главным образом мы будем использовать только фотографии, потому что это легко и наглядно. Все необходимые детали для этого робота вы найдете в комплекте 2,0 Mindstorm NXT.
В прошлой статье мы разобрали как создать, закачать и запустить простую программу на С. Данная инструкция покажет, как можно использовать аппаратные ресурсы в Linux. Во время старта ядра Linux, оно загружает несколько модулей, которые дают доступ к "железу". После того, как эти модули были загружены, пользователь может "общаться" с "железом", используя стандартные файловые операции записи и чтения. Эта инструкция не имеет целью рассказать обо всех доступных функциях работы с аппаратными ресурсами.
Модули, доступные в EV3 блоке, могут быть отображены с помощью командыlsmod. Модули Lego, относящиеся к "железу", имеют префикс d_Имя в своем названии. Пример, представленный ниже, показывает один из способов управления моторами. Для того, чтобы скомпилировать этот код, я использовал переменные, объявленные в исходном коде прошивки EV3.
Как и в прошлой инструкции, надо создать папку для программы, файл программы motor.c и скопировать в нее следующий код: Этот код - экспериментальный, используйте его на свой риск!
#include <fcntl.h> #include “lms2012.h” // Motor power 0..100 const int SPEED = 50; // The motor operations use a single bit (or a combination of them) // to determine which motor(s) will be used // A = 0×1, B = 0×2, C = 0×4, D = 0×8 // AC = 0×5 const char MOTOR = 0×1; int main() { char motor_command[5]; int file; //Open the device file if((file = open(PWM_DEVICE_NAME, O_WRONLY)) == -1) return -1; //Failed to open device // For most operations, the second byte represent the motor(s) motor_command[1] = MOTOR; // Start the motor motor_command[0] = opOUTPUT_START; write(file,motor_command,2); // Set the motor power motor_command[0] = opOUTPUT_POWER; motor_command[2] = SPEED; write(file,motor_command,3); // Run the motor for a couple of seconds sleep(2); // Stops the motor motor_command[0] = opOUTPUT_STOP; motor_command[1] = MOTOR; write(file,motor_command,2); // Close the device file close(file); return 0; }
После создания motor.c и добавления всех необходимых файлов, код может быть скомпилирован:
arm-none-linux-gnueabi-gcc motor.c -o motor
Данная программа взаимодействует с модулем ядра d_pwm. Больше деталей о том, как можно управлять моторами, можно узнать из файла d_pwm.c в функции Device1Write.
Процедура загрузки программы на EV3 блок и ее запуска была приведена впрошлой статье.
Данная статья является переводом оригинальной статьи "Using the Motors" Lauro Ojeda с согласия автора.
Вчера в блоге RobotC появилось интересное сообщение, что в новой версии данной среды программирования создатели готовят свой графический язык программирования, чем-то напоминающий язык программирования Scratch.
До сих пор, среда программирования RobotC поддерживала только два языка: непосредственно RobotC - особый диалект C и Natural Language(иногда его называют "естественный язык").
Первый используется уже опытными программистами, основная аудитория второго - школьники, кто только начинает программировать на текстовых языках программирования. Carnegie Mellon University и RobotC позиционировали язык Natural Language, как переходный от графического языка NXT-G к текстовым языкам. По сути, в нем позволяется вместо низкоуровневых команд управления моторами и опроса датчиков использовать процедуры, название которых говорит о действии, которое робот будет выполнять:forward(), stop(), startMotor(), pointTurn(), untilRotations(), untilDark() и т.п. Полный список поддерживаемых функций с их описанием можно посмотреть здесь.
task main(){
forward(63);//Включить моторы с мощностью в 63%
untilLight(500);//Ждать до тех пор, пока на сенсоре освещенности//не станет светлее, чем 500 единиц
stop();//Остановить моторы}
Кстати, данный диалект поддерживается, как для программирования NXT/VEX роботов, так и для RobotC Virtual Worlds.
Сейчас же компания, производящая среду программирования, объявляет о поддержке еще одного диалекта - графического языка программирования.
Язык с точки зрения пользовательских операций очень похож на Scratch - программирование осуществляется перетаскиванием графических блоков и соединенением их в пазл.
У блоков можно конфигурировать параметры, которые влияют на поведение робота.
Каждый графический блок однозначно определяет текстовую конструкцию из языка Natural Language (NL). Там даже есть функция сгенерировать текстовую программу на NL.
Заинтересовавшиеся, могут посмотреть процесс программирования в этом небольшом ролике:
На видео видно, что количество поддерживаемых функций из Natural Language пока не велико. Авторы активно работают над пополнением библиотеки стандартных вызовов и обещают показать BETA версию продукта в январе 2014. Ждем с нетерпением! А пока полный текст анонса (на английском) можно увидеть на сайте RobotC.
Просматривая материалы на сайте RobotC можно обнаружить интересную "старую" новость - создатели популярной среды программирования сообщают о возможной будущей поддержке Виртуальными Мирами (RobotC Virtual Worlds - RVW) другой популярной среды программирования - NXT-G. Неожиданно, не так ли?!
Что это значит? А то, что теперь познавать основы программирования LEGO роботов смогут даже те школьники, у которых нет своего собственного NXT набора. Или даже еще лучше - целые робототехнические классы могут тренироваться в работе в среде NXT-G без необходимости иметь большое количество реальных роботов: к ним будут допускаться те ребята, кто сначала научил свой "виртуальный" механизм решению заданной задачи.
Использование открытой операционной системы Linux на EV3 блоках - несомненно шаг вперед для LEGO-робототехников. Для них стали доступны следующие возможности: 1) исходные коды EV3 firmware выложены в репозиторий GitHub, а, значит, каждый желающий может ознакомиться с ними и, при необходимости, внеся изменения, собрать свою собственную версию прошивки для блока 2) есть возможность писать C/С++ приложения под Linux платформу и исполнять их на блоке - освоить библиотеку стандартных функций не так сложно.
При желании, это сможет сделать любой человек, увлекающийся программированием.
Следовательно, каждый может добавлять свои новые функции в firmware и эффективно использовать их непосредственно в Linux окружении, без ограничений вводимых средами программирования EV3-G и другими.
Ровно это и сделал Девид Гилдей, создатель нового робота из набора 31313 (LEGO Mindstorms EV3 Home edition), собирающего кубик-рубика за 101 секунду:
Чтобы понять, как такое удалось Девиду, необходимо разобраться, что же онсделал: Итак, первое - изменение стандартной firmware (1.05M). Девид сделал небольшие улучшения, касающиеся работы с датчиком цвета. А также внедрил новую функциональность - автозапуск - теперь, если после загрузки проекта, созданного в среде EV3, на блок, в директории с проектом находится файлautorun.rtf, то он запускается на исполнение перед запуском непосредственно проекта.
Файл autorun.rtf может быть любым исполняемым файлом, и даже, в том числе, скриптом на языке Shell. Данный язык является стандартом для любого Linux дистрибутива, и поэтому его знает любой уважающий себя программист, работающий под этой операционной системой.
В примере данного конкретного проекта, файл autorun.rtf - скрипт и выглядит следующим образом:
#!/bin/sh
if [ -x mc3solver-v1p1.rtf ]
then
./mc3solver-v1p1.rtf &
fi
Делает он простейшую вещь: проверяет есть ли исполняемый файлmc3solver-v1p1.rtf и если есть, то он запускается, как фоновый процесс. Это значит, что после запуска этого процесса, его завершение не ожидается, а вместо этого управление передается обратно в скрипт, который завершает свою работу. После чего запускается непосредственно EV3 программа.
Второе: Функция исполняемого файла mc3solver-v1p1.rtf - более-менее эффективное решение задачи кубик-рубика и выражение решения в терминах переворота кубика и поворота одной из граней. Написан он на языке высокого уровня С++, и скомпилирован по той же технологии, что описаны здесь, здесьили здесь
"Третье" касается взаимодействия двух параллельно запущенных процессов и обмена данными между ними. Об этом подробнее в следующей части.