Программирование в среде RobotC Сергей Александрович Филиппов Президентский Физико-математический лицей 239.

Презентация:



Advertisements
Похожие презентации
Алгоритмы управления мобильным LEGO-роботом. Движение по линии Сергей Александрович Филиппов, Санкт-Петербургский Физико-математический лицей 239.
Advertisements

Манипулятор. Ханойские башни Сергей Александрович Филиппов Санкт-Петербургский Физико-математический лицей 239.
Основы робототехники Сергей Александрович Филиппов Президентский Физико-математический лицей 239.
Машурина Юлия Германовна Гусева Арина Александровна Руководитель: Сапожникова Наталья Владимировна Робот LEGO рисует геометрические фигуры.
1. a=? b=? c=? {int a, b, c; a=(b=2+3)/2 - 4+(c=5%2); printf("%d %d %d \n", a, b, c); }
- - команды действия ; - - команды ожидания ; - - управляющие структуры ; - - модификаторы.
Часть 1: «Основы программирования». Содержание Основные понятия. Структура программы. Ввод-вывод Программирование циклов. Операторы цикла while, for и.
Защита от взлома Лекция 10Защита от взлома Лекция 10.
Основы программирования В качестве базового языка взят обычный BASIC позволяющий в простой и наглядной форме выполнять основные конструкции программирования.
Алгоритмизация и программирование. Типы алгоритмов: -алгоритмы, в которых символы выполняются последовательно друг за другом. -алгоритм, в который включены.
«Робототехнический комплект-конструктор» 1 МОСКВА Автор: Иванов Олег Александрович, · · Государственное бюджетное образовательное учреждение.
ПРОГРАММИРОВАНИЕ ПОВТОРЕНИЙ. НАЧАЛО AB A, B, C A = A + C F = B + C F КОНЕЦ B = B + C F = A + B B < C A = A + B F = A + C нет да A = 1, B = 1, C = 4 F=?
Главное меню позволяет выбрать один из трёх разделов : АДМИНИСТРАТОР ПРОГРАММИСТ ИССЛЕДОВАТЕЛЬ.
1. a=? b=? c=? {int a, b, c; a=(b=2+3)/2 - 4+(c=5%2); printf("%d %d %d \n", a, b, c); }
НЕКОТОРЫЕ АЛГОРИТМЫ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ. Табулирование функции одной переменной Составить алгоритм и программу вычисления таблицы значений функции.
Применение метода представления функции переходов с помощью абстрактных конечных автоматов в генетическом программировании Царев Ф. Н. Научный руководитель.
Введение в Lego Mindstorms NXT Преподаватель Большаков Александр Павлович.
Одномерный массив. Цель урока: познакомить учащихся с понятием одномерный массив Задачи: дать определение массива дать представление: об описании массива.
ЕГЭ информатика Алгоритмизация и программирование Консультация 3.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 2 Томский политехнический.
Транксрипт:

Программирование в среде RobotC Сергей Александрович Филиппов Президентский Физико-математический лицей 239

План занятий Введение в RobotC Вывод данных Графика Датчики Моторы Применение регуляторов Воспроизведение по памяти

Загрузка операционной системы Меню Robot -> Download Firmware-> - >Standart File -> F/W Download Выполнять при включенном NXT, в процессе загрузки не трогать (до 1 мин)

Простейшая программа task main() { nxtDisplayTextLine(0, "Hello, world!"); wait1Msec(10000); } Меню File -> Save as... сохранение F7 проверка F5 загрузка на NXT

Загрузка и отладка программы F7 компиляция и проверка F5 загрузка программы Start запуск программы на NXT Step пошаговое выполнение

Форматированный вывод task main() { float a=5, b=4, c=1; int a=5, b=4; nxtDisplayTextLine(0, "a=%d b=%d",a,b); nxtDisplayTextLine(1, "%d+%d=%d",a,b,a+b); nxtDisplayTextLine(4, "%f/%f=%4.2f",a,b,a/b); for(int i=1;i

Управление моторами task main() { motor[motorB]=100; // полный вперед motor[motorC]=100; wait1Msec(2000); // по времени motor[motorB]=-50; // поворот налево motor[motorC]=50; nMotorEncoder[motorB]=0; // по инкодеру while(nMotorEncoder[motorB]>-239); motor[motorB]=0; // остановка motor[motorC]=0; }

Управление скоростью task main() { for (int i=0; i

Подключение датчика Меню Robot -> Motors and Sensors Setup -> Sensors #pragma config(Sensor, S1, Rasst, sensorSONAR) while(SensorValue[S1]>25); // или while(SensorValue[Rasst]>25);

Путешествие по комнате #pragma config(Sensor, S1, Rasst, sensorSONAR) task main() { while(true) { motor[motorB]=100; // полный вперед motor[motorC]=100; while(SensorValue[Rasst]>25) wait1Msec(1); motor[motorB]=-50; // отъезд с разворотом motor[motorC]=-10; nMotorEncoder[motorB]=0; // по инкодеру while(nMotorEncoder[motorB]>-400) wait1Msec(1); }

Пропорциональный регулятор: синхронизация моторов Пусть e2 и e3 – показания датчиков оборотов моторов B и C. Их надо будет обнулить перед началом движения. Регулятор определяется следующим образом: int v=50, k=2, u; nMotorEncoder[motorB]=0; nMotorEncoder[motorC]=0; while(true) { int e2=nMotorEncoder[motorB]; int e3=nMotorEncoder[motorC]; u=k*(e3-e2); motor[motorB]=v+u; motor[motorC]=v-u; wait1Msec(1); }

Параллельное управление моторами int v=50, k=2, u; task preg() // Объявление задачи { nMotorEncoder[motorB]=0; nMotorEncoder[motorC]=0; while(true){ int e2=nMotorEncoder[motorB]; int e3=nMotorEncoder[motorC]; u=k*(e3-e2); motor[motorB]=v+u; motor[motorC]=v-u; wait1Msec(1); } task main() // Основная задача { StartTask(preg); // Запуск параллельной задачи wait1Msec(10000); // Здесь могут быть полезные действия StopTask(preg); // Остановка параллельной задачи }

Параллельное управление моторами int v=50, k=2, u, DELTA=0; task preg() // Объявление задачи {... u=k*(e3-e2 + DELTA);... } task main() // Основная задача { StartTask(preg); wait1Msec(2000); DELTA=DELTA+450; // Изменение разности инкодеров wait1Msec(2000); DELTA=DELTA+450; StopTask(preg); }

Параллельное управление моторами int v=50, k=2, u, DELTA=0; task preg() // Объявление задачи {... u=k*(e3-e2 + DELTA);... } task main() // Основная задача { StartTask(preg); while(true) { wait1Msec(2000); DELTA=DELTA+450; // Изменение разности инкодеров }

Отображение громкости звука на экране #pragma config(Sensor, S1, Zvuk, sensorSoundDBA) task main() { int d=0, x,y; while(true) { d=SensorValue[Zvuk]; x=50-d/2; y=32+d/2; nxtDrawCircle(x,y,d); wait1Msec(40); nxtEraseRect(x,y,x+d+1,y-d-1); } Составьте аналогичный алгоритм с использованием функций nxtFillEllipse и nxtEraseEllipse

Подключение датчика Меню Robot -> Motors and Sensors Setup -> Sensors #pragma config(Sensor, S1,, sensorLightActive)

График показаний датчика Составьте алгоритм вывода на экран графика показаний датчика света. Частота 10 замеров в секунду Длительность 10 секунд (100 замеров) Масштабирование 64/100 Используйте цикл Вывод точки Вывод линии nxtDrawLine(x1,y1,x2,y2); for(int x=0; x

Релейный регулятор: движение вдоль границы черного и белого с помощью датчика освещенности int grey=45; // Приближенное значение серого task main() { while (true) // Бесконечное повторение { if (SensorValue[S1]>grey) // Проверка { Motor[MotorB]=100; // Направо по дуге Motor[MotorC]=0; } else { Motor[MotorB]=0; // Налево по дуге Motor[MotorC]=100; } wait1Msec(1); }

Пропорциональный регулятор В задачах автоматического регулирования управляющее воздействие u(t) обычно является функцией динамической ошибки – отклонения e(t) регулируемой величины x(t) от ее заданного значения x 0 (t): e(t)=x 0 (t)-x(t) Пропорциональный регулятор – это устройство, оказывающее управляющее воздействие на объект пропорционально его отклонению от заданного состояния. u 0 (t)=ke Здесь k – это коэффициент усиления регулятора.

Пропорциональный регулятор: движение по линии Также как и в релейном регуляторе, необходимо определить среднее значение grey между черным и белым. Это будет то состояние датчика освещенности s1, к которому должна стремиться система. while(true) { u=k*(SensorValue[s1]-grey); motor[MotorB]=50+u; motor[MotorC]=50-u; wait1Msec(1); }

Параллельные задачи task line() // Объявление задачи { while(true) { // Здесь должен быть регулятор для движения по линии } task main() // Основная задача { StartTask(line); // Запуск параллельной задачи wait1Msec(10000); // Здесь могут быть полезные действия StopTask(line); // Остановка параллельной задачи }

Параллельные задачи - 2 task line() // Объявление задачи { while(true) { // Здесь должен быть регулятор для движения по линии } task main() // Основная задача { StartTask(line); // Запуск параллельной задачи for(int x=0; x

Параллельное управление моторами int v=50, delta=0; // Глобальные переменные task vcontrol() // Параллельная задача { for (int i=0;i

task line() { while(flag) { // П-регулятор //движения по линии } task preg() { while(flag2) { // П-регулятор // положения моторов } task main() { // Обнулить инкодеры StartTask(line); for(int i=0;i

for(int j=0;j100) mb=100; // Ограничение скорости if (mc>100) mc=100; motor[motorB]=mb; motor[motorC]=mc; wait1Msec(1); } Совмещенный регулятор воспроизведения

while(i100) mc=100; motor[motorB]=mb; motor[motorC]=mc; wait1Msec(1); } Воспроизведение на предельной скорости

Благодарю за внимание! Сергей Александрович Филиппов Физико-Математический лицей 239 Санкт-Петербург