ДО курс по робототехнике

17 марта 2014 г.

​Робот-стрелок из комплекта Lego Mindstorm 2.0 NXT. Пошаговая инструкция по сборке

(C)DIY
Введение:

В этой инструкции мы постараемся показать вам, в меру своих возможностей, как сделать робота Lego Mindstorm Turret Shooter, и главным образом мы будем использовать только фотографии, потому что это легко и наглядно. Все необходимые детали для этого робота вы найдете в комплекте 2,0 Mindstorm NXT.

DIY, lego-робот, nxt, nxt - LEGO роботы - Robotics

DIY, lego-робот, nxt, nxt - LEGO роботы - Robotics

1 марта 2014 г.

Запуск моторов в C программе на EV3

(C)
В прошлой статье мы разобрали как создать, закачать и запустить простую программу на С. Данная инструкция покажет, как можно использовать аппаратные ресурсы в 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;
}


Следующие файлы должны быть скопированы в папку с программой: lms2012.h,bytecodes.h и lmstypes.h.
После создания motor.c и добавления всех необходимых файлов, код может быть скомпилирован:
arm-none-linux-gnueabi-gcc motor.c -o motor

Данная программа взаимодействует с модулем ядра d_pwm. Больше деталей о том, как можно управлять моторами, можно узнать из файла d_pwm.c в функции Device1Write.

Процедура загрузки программы на EV3 блок и ее запуска была приведена впрошлой статье.

Данная статья является переводом оригинальной статьи "Using the Motors" Lauro Ojeda с согласия автора.

Пятиминутка 2

(C)
pdf

 Finished

ROBOTC: эволюция языков программирования

(C)
Вчера в блоге 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 Virtual Worlds и среда программирования NXT-G

(C)NiNoXT
Просматривая материалы на сайте RobotC можно обнаружить интересную "старую" новость - создатели популярной среды программирования сообщают о возможной будущей поддержке Виртуальными Мирами (RobotC Virtual Worlds - RVW) другой популярной среды программирования - NXT-G. Неожиданно, не так ли?!
Что это значит? А то, что теперь познавать основы программирования LEGO роботов смогут даже те школьники, у которых нет своего собственного NXT набора. Или даже еще лучше - целые робототехнические классы могут тренироваться в работе в среде NXT-G без необходимости иметь большое количество реальных роботов: к ним будут допускаться те ребята, кто сначала научил свой "виртуальный" механизм решению заданной задачи. 

EV3: можно ли использовать С++ программы на WRO? Часть I

(C)NiNoXT
Использование открытой операционной системы 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 - более-менее эффективное решение задачи кубик-рубика и выражение решения в терминах переворота кубика и поворота одной из граней. Написан он на языке высокого уровня С++, и скомпилирован по той же технологии, что описаны здесьздесьили здесь

"Третье" касается взаимодействия двух параллельно запущенных процессов и обмена данными между ними. Об этом подробнее в следующей части.