Неделю назад, 27 мая в Нижнем Новгороде проходил Linux Install Fest, проводимый активистами Нижегородской группой пользователей Linux. Цель мероприятия - ознакомить участников фестиваля с последними новинками среди Свободного Программного Обеспечения (СПО), в том числе с последними дистрибутивами ОС Linux. |
Одной из презентаций на данном мероприятии, был доклад, посвященный LEGO. Основной задачей доклада было рассказать, что в ОС Linux, тоже существует возможность программировать LEGO роботов. Особенно актуально это может быть для преподавателей таких школ, где в целях экономии было принято решение перейти на СПО, таким образом становятся недоступными такие среды программирования, как NXT-G, LabView, RobotC и т.п.
Помимо краткого ознакомления с конструктором LEGO Mindstorms NXT, в ходе презентации участниками были продемонстрированы:
- возможность программировать на языке Not eXactly C (NXC) в редакторе nxcEditor. В качестве "живого экспоната" здесь выступал робот-сканер, собранный на базе широко известного Sudoku Solver (инструкции по сборке доступны здесь)
Программу на языке NXC можно посмотреть в конце заметки. - возможность запускать виртуальных роботов в среде nxcSimulator
- возможность управлять роботами с компьютера или ноутбука с помощью программ, написанных на скриптовом языке Python, с использованием модуля nxt-python. Тексты демонстрированных программ - в конце заметки.
Текст программы робота-сканера:
#define WIDTH 720
#define SCR_W 100
#define STEP 45
#define SHIFT 3
task main() {
SetSensorColorRed(S3);
ClearScreen();
//Move the head to the right position
RotateMotor(OUT_B, 50, WIDTH/2);
//Perform calibration
int Light=Sensor(S3);
int x = 0;
int y = 63;
int Pos;
while (y>=0) {
//Start moving the head to left
OnRev(OUT_B, 50);
Pos=abs(MotorTachoCount(OUT_B));
//Check in the loop if the head achieved
//the left boundary
while(Pos<WIDTH) {
//if somthing dark is under the sensor, draw a point
if (Sensor(S3) < (Light-10)) {
x=SCR_W-(Pos*SCR_W)/WIDTH+SHIFT;
PointOut(x,y, DRAW_OPT_NORMAL);
}
Pos=abs(MotorTachoCount(OUT_B));
}
Off(OUT_B);
//Perform one step by the robot to
//start scanning the next line
y = y - 1;
RotateMotor(OUT_A, 80, STEP);
//Start moving the head to right
OnFwd(OUT_B, 50);
Pos=MotorTachoCount(OUT_B);
//Check in the loop if the head achieved
//the right boundary
while(abs(Pos)<WIDTH) {
//if somthing dark is under the sensor, draw a point
if (Sensor(S3) < (Light-10)) {
x=((Pos*SCR_W)/WIDTH)-SHIFT;
PointOut(x,y, DRAW_OPT_NORMAL);
}
Pos=MotorTachoCount(OUT_B);
}
Off(OUT_B);
//Perform one step by the robot to
//start scanning the next line
y = y - 1;
RotateMotor(OUT_A, 80, STEP);
}
//Move the head at start position
RotateMotor(OUT_B, -50, WIDTH/2);
PlayTone(440, 500);
Wait(10000);
}
Тексты программ на языке PythonПрограмма первая - движение моторами.
#!/usr/bin/env python import nxt.locator from nxt.motor import * b = nxt.locator.find_one_brick() back = Motor(b, PORT_A) back.turn(-100, 1080*3) back.turn(100, 1080*3) head = Motor(b, PORT_B) head.turn(-100, 540) head.turn(100, 1080) head.turn(-100, 540) back.idle() head.idle()
Программа вторая - работа с цветовым сенсором.
#!/usr/bin/env python import nxt.locator from nxt.sensor import * from time import sleep b = nxt.locator.find_one_brick() sens = Color20(b, PORT_3) i = 0; while (i<10): print 'Light:', sens.get_reflected_light(Type.COLORBLUE) sleep(1) i = i + 1 sens.set_light_color(Type.COLORRED) sleep(1) sens.set_light_color(Type.COLORBLUE) sleep(1) sens.set_light_color(Type.COLORGREEN) sleep(1) sens.set_light_color(Type.COLORNONE)
Комментариев нет:
Отправить комментарий