🗊Презентация Программирование в среде RobotC

Категория: Технология
Нажмите для полного просмотра!
Программирование в среде RobotC, слайд №1Программирование в среде RobotC, слайд №2Программирование в среде RobotC, слайд №3Программирование в среде RobotC, слайд №4Программирование в среде RobotC, слайд №5Программирование в среде RobotC, слайд №6Программирование в среде RobotC, слайд №7Программирование в среде RobotC, слайд №8Программирование в среде RobotC, слайд №9Программирование в среде RobotC, слайд №10Программирование в среде RobotC, слайд №11Программирование в среде RobotC, слайд №12Программирование в среде RobotC, слайд №13Программирование в среде RobotC, слайд №14Программирование в среде RobotC, слайд №15Программирование в среде RobotC, слайд №16Программирование в среде RobotC, слайд №17Программирование в среде RobotC, слайд №18Программирование в среде RobotC, слайд №19Программирование в среде RobotC, слайд №20Программирование в среде RobotC, слайд №21Программирование в среде RobotC, слайд №22Программирование в среде RobotC, слайд №23Программирование в среде RobotC, слайд №24Программирование в среде RobotC, слайд №25Программирование в среде RobotC, слайд №26Программирование в среде RobotC, слайд №27Программирование в среде RobotC, слайд №28Программирование в среде RobotC, слайд №29Программирование в среде RobotC, слайд №30Программирование в среде RobotC, слайд №31Программирование в среде RobotC, слайд №32Программирование в среде RobotC, слайд №33Программирование в среде RobotC, слайд №34Программирование в среде RobotC, слайд №35Программирование в среде RobotC, слайд №36Программирование в среде RobotC, слайд №37Программирование в среде RobotC, слайд №38Программирование в среде RobotC, слайд №39Программирование в среде RobotC, слайд №40Программирование в среде RobotC, слайд №41Программирование в среде RobotC, слайд №42Программирование в среде RobotC, слайд №43Программирование в среде RobotC, слайд №44Программирование в среде RobotC, слайд №45Программирование в среде RobotC, слайд №46Программирование в среде RobotC, слайд №47

Содержание

Вы можете ознакомиться и скачать презентацию на тему Программирование в среде RobotC. Доклад-сообщение содержит 47 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





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

Слайд 2





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

Слайд 3





Загрузка операционной системы
1. Тип контроллера 
Меню Robot -> Platform Type->Lego Mindstorms->EV3
2. Ядро
Меню Robot -> Download EV3 Linux Kernel-> Standart File
Выполнять при включенном EV3, в процессе загрузки не трогать (до 4 мин)
3. Прошивка
Меню Robot -> Download Firmware> Standart File
Выполнять при включенном EV3, занимает 1-2 секунды
Описание слайда:
Загрузка операционной системы 1. Тип контроллера Меню Robot -> Platform Type->Lego Mindstorms->EV3 2. Ядро Меню Robot -> Download EV3 Linux Kernel-> Standart File Выполнять при включенном EV3, в процессе загрузки не трогать (до 4 мин) 3. Прошивка Меню Robot -> Download Firmware> Standart File Выполнять при включенном EV3, занимает 1-2 секунды

Слайд 4





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

Слайд 5





Загрузка и отладка программы
F7 — компиляция и проверка
F5 — загрузка программы
Start — запуск программы на NXT/EV3
Step — пошаговое выполнение
Не отключать кабель USB при открытом окне дебаггера!
Описание слайда:
Загрузка и отладка программы F7 — компиляция и проверка F5 — загрузка программы Start — запуск программы на NXT/EV3 Step — пошаговое выполнение Не отключать кабель USB при открытом окне дебаггера!

Слайд 6





Форматированный вывод
task main()
{
  float a=5, b=4, c=1;
  int a=5, b=4;
  displayTextLine(0, "a=%d b=%d",a,b);
  displayTextLine(1, "%d+%d=%d",a,b,a+b);
  displayTextLine(4, "%f/%f=%4.2f",a,b,a/b);
  for(int i=1;i<=b;i++)
    c=c*a;
  displayTextLine(5, "%d^%d=%d",a,b,c);
  wait1Msec(10000);
}
Описание слайда:
Форматированный вывод task main() { float a=5, b=4, c=1; int a=5, b=4; displayTextLine(0, "a=%d b=%d",a,b); displayTextLine(1, "%d+%d=%d",a,b,a+b); displayTextLine(4, "%f/%f=%4.2f",a,b,a/b); for(int i=1;i<=b;i++) c=c*a; displayTextLine(5, "%d^%d=%d",a,b,c); wait1Msec(10000); }

Слайд 7





Команды ожидания
wait1Msec(1);
sleep(1);

wait1Msec(N);	
sleep(N);

wait10Msec(N);

while(УСЛОВИЕ);
while(УСЛОВИЕ) sleep(1);
Описание слайда:
Команды ожидания wait1Msec(1); sleep(1); wait1Msec(N); sleep(N); wait10Msec(N); while(УСЛОВИЕ); while(УСЛОВИЕ) sleep(1);

Слайд 8





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

Слайд 9





Поворот с помощью гироскопического датчика
task main()
{
  int angle=SensorValue[Gyro];  // Запомнили текущее
	while (true)                  // значение угла   
	{
		  motor[motorLeft] = 20;
		  motor[motorRight] = -20;
     angle=angle+90;     // Увеличим угол по часовой 
		  while (SensorValue[Gyro] < angle) 
       sleep(1);
		  motor[motorLeft] = 40;
		  motor[motorRight] = 40;
		  sleep(2000);
	}
}
Описание слайда:
Поворот с помощью гироскопического датчика task main() { int angle=SensorValue[Gyro]; // Запомнили текущее while (true) // значение угла { motor[motorLeft] = 20; motor[motorRight] = -20; angle=angle+90; // Увеличим угол по часовой while (SensorValue[Gyro] < angle) sleep(1); motor[motorLeft] = 40; motor[motorRight] = 40; sleep(2000); } }

Слайд 10





Управление скоростью
task main()
{
  for (int i=1; i<=100; i++) // разгон 1 секунду
  {
    motor[motorB]=i; 
    motor[motorC]=i;
    wait1Msec(10);   
  }
  wait1Msec(1000);   
  // Добавить плавное торможение
 
}
Описание слайда:
Управление скоростью task main() { for (int i=1; i<=100; i++) // разгон 1 секунду { motor[motorB]=i; motor[motorC]=i; wait1Msec(10); } wait1Msec(1000); // Добавить плавное торможение }

Слайд 11





Параллельное управление скоростью
int mB=0, mC=0, step=5; //Скорости моторов и шаг
task motors()
{
  while(true)
  {
    int b=mB-motor[motorB];
    motor[motorB]=motor[motorB]+sgn(b)*step;
    // То же с мотором C – добавить самостоятельно
    wait1Msec(10);   
  }
}
task main()
{
  startTask(motors);  // Запуск параллельной задачи
  mB=mC=100;          // Задаем любую скорость
  wait1Msec(2000);    
  mB=mC=-100;
  wait1Msec(2000);    
  ...
  stopTask(motors);
}
Описание слайда:
Параллельное управление скоростью int mB=0, mC=0, step=5; //Скорости моторов и шаг task motors() { while(true) { int b=mB-motor[motorB]; motor[motorB]=motor[motorB]+sgn(b)*step; // То же с мотором C – добавить самостоятельно wait1Msec(10); } } task main() { startTask(motors); // Запуск параллельной задачи mB=mC=100; // Задаем любую скорость wait1Msec(2000); mB=mC=-100; wait1Msec(2000); ... stopTask(motors); }

Слайд 12





Контроль управления скоростью
Необходимо ограничение модуля скорости не более 100
На малых отклонениях необходимо повышение точности
int mB=0, mC=0, step=25;
task motors()
{
  while(true)
  {
    if (abs(mB)>100) mB=sgn(mB)*100;
    int b=mB-motor[motorB];
    if (abs(b)>step)
      motor[motorB]=motor[motorB]+sgn(b)*step;
    else
      motor[motorB]=mB;
    // То же с мотором C – добавить самостоятельно
    wait1Msec(10);   
  }
}
Описание слайда:
Контроль управления скоростью Необходимо ограничение модуля скорости не более 100 На малых отклонениях необходимо повышение точности int mB=0, mC=0, step=25; task motors() { while(true) { if (abs(mB)>100) mB=sgn(mB)*100; int b=mB-motor[motorB]; if (abs(b)>step) motor[motorB]=motor[motorB]+sgn(b)*step; else motor[motorB]=mB; // То же с мотором C – добавить самостоятельно wait1Msec(10); } }

Слайд 13





Доступ к энкодерам без обнуления
К энкодерам и моторам нельзя обращаться из разных задач
Задаем глобальные переменные, которые содержат актуальные значения энкодеров
int mB=0, mC=0, step=25, enB=0, enC=0;
task motors()
{ ...
  { enB=nMotorEncoder[motorB];
    // То же с мотором C – добавить самостоятельно
    ...
    wait1Msec(10);   
  }
} task main()
{ ...
  int enB_cur=enB;
  mB=50;
  mC=-50;
  while(enB < enB_cur + 239) sleep(1); // Поворот по энкодеру
  ...
}
Описание слайда:
Доступ к энкодерам без обнуления К энкодерам и моторам нельзя обращаться из разных задач Задаем глобальные переменные, которые содержат актуальные значения энкодеров int mB=0, mC=0, step=25, enB=0, enC=0; task motors() { ... { enB=nMotorEncoder[motorB]; // То же с мотором C – добавить самостоятельно ... wait1Msec(10); } } task main() { ... int enB_cur=enB; mB=50; mC=-50; while(enB < enB_cur + 239) sleep(1); // Поворот по энкодеру ... }

Слайд 14





Доступ к энкодерам с обнулением
В основной задаче для обнуления задаем enB_null=1
int mB=0, mC=0, step=25, enB=0, enC=0, enB_null=0, ...;
task motors()
{ ...
  { if (enB_null)
    {
      nMotorEncoder[motorB]=0;
      enB_null=0;
    }
    enb = nMotorEncoder[motorB];
    // То же с мотором C – добавить самостоятельно
    sleep(10);   
  }
}
task main()
{  ...
   enB_null=1; sleep(11);
   while(enB<239) sleep(1);
   
}
Описание слайда:
Доступ к энкодерам с обнулением В основной задаче для обнуления задаем enB_null=1 int mB=0, mC=0, step=25, enB=0, enC=0, enB_null=0, ...; task motors() { ... { if (enB_null) { nMotorEncoder[motorB]=0; enB_null=0; } enb = nMotorEncoder[motorB]; // То же с мотором C – добавить самостоятельно sleep(10); } } task main() { ... enB_null=1; sleep(11); while(enB<239) sleep(1); }

Слайд 15





Подключение датчика
Меню Robot -> Motors and Sensors Setup ->
Sensors
Описание слайда:
Подключение датчика Меню Robot -> Motors and Sensors Setup -> Sensors

Слайд 16





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

Слайд 17





Вывод показаний датчиков на экран
...
while(SensorValue[Rasst]>25) 
{
  displayBigTextLine(0, "%d", SensorValue[Rasst]);
  sleep(10);
}
...
while(nMotorEncoder[motorB]>-400) 
{
  displayBigTextLine(2, "%d", nMotorEncoder[motorB]);       
  sleep(10); 
}
Описание слайда:
Вывод показаний датчиков на экран ... while(SensorValue[Rasst]>25) { displayBigTextLine(0, "%d", SensorValue[Rasst]); sleep(10); } ... while(nMotorEncoder[motorB]>-400) { displayBigTextLine(2, "%d", nMotorEncoder[motorB]); sleep(10); }

Слайд 18





Пропорциональный регулятор: синхронизация моторов
Пусть 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);
}
Описание слайда:
Пропорциональный регулятор: синхронизация моторов Пусть 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); }

Слайд 19





Синхронизация при путешествии по комнате
Для синхронизации движения вперед необходимо перед циклом ожидания объекта обнулить энкодеры:
int v=50, k=2, u;
while(true){
  nMotorEncoder[motorB]=0;
  nMotorEncoder[motorC]=0;
  while(SensorValue[Rasst]>25)
  {
    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; while(true){ nMotorEncoder[motorB]=0; nMotorEncoder[motorC]=0; while(SensorValue[Rasst]>25) { int e2=nMotorEncoder[motorB]; int e3=nMotorEncoder[motorC]; u=k*(e3-e2); motor[motorB]=v+u; motor[motorC]=v-u; wait1Msec(1); } ... }

Слайд 20





Параллельное управление моторами
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; 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); // Остановка параллельной задачи }

Слайд 21





Параллельное управление моторами
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); wait1Msec(2000); DELTA=DELTA+450; // Изменение разности энкодеров wait1Msec(2000); DELTA=DELTA+450; stopTask(preg); }

Слайд 22





Параллельное управление моторами
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; // Изменение разности энкодеров
  }
}
Описание слайда:
Параллельное управление моторами 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; // Изменение разности энкодеров } }

Слайд 23





Управление шагающим роботом
Описание слайда:
Управление шагающим роботом

Слайд 24





Управление шагающим роботом с датчиком расстояния
Описание слайда:
Управление шагающим роботом с датчиком расстояния

Слайд 25





Шагающий робот на линии
Описание слайда:
Шагающий робот на линии

Слайд 26





Графика на экране
NXT: 
100х64 пикселя
8 текстовых строк (0..7)

EV3: 
178х128 пикселей
16 текстовых строк (0..15)
Идентичные команды
Описание слайда:
Графика на экране NXT: 100х64 пикселя 8 текстовых строк (0..7) EV3: 178х128 пикселей 16 текстовых строк (0..15) Идентичные команды

Слайд 27





Отображение громкости звука на экране NXT
#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;
    drawCircle(x,y,d);
    wait1Msec(40);
    eraseRect(x,y,x+d+1,y-d-1);
  }     
}
Описание слайда:
Отображение громкости звука на экране NXT #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; drawCircle(x,y,d); wait1Msec(40); eraseRect(x,y,x+d+1,y-d-1); } }

Слайд 28





Подключение датчика
Меню Robot -> Motors and Sensors Setup ->
Sensors
Описание слайда:
Подключение датчика Меню Robot -> Motors and Sensors Setup -> Sensors

Слайд 29





Подключение датчика EV3
Меню Robot -> Motors and Sensors Setup ->
Sensors
Описание слайда:
Подключение датчика EV3 Меню Robot -> Motors and Sensors Setup -> Sensors

Слайд 30





График показаний датчика
Составьте алгоритм вывода на экран графика показаний датчика света.
Частота 10 замеров в секунду
Длительность 17,8 секунд (178 замеров)
Масштабирование 127/100
Используйте цикл
Вывод точки
Вывод линии
drawLine(x1,y1,x2,y2);
Описание слайда:
График показаний датчика Составьте алгоритм вывода на экран графика показаний датчика света. Частота 10 замеров в секунду Длительность 17,8 секунд (178 замеров) Масштабирование 127/100 Используйте цикл Вывод точки Вывод линии drawLine(x1,y1,x2,y2);

Слайд 31





Отображение показаний датчика в виде изменяющегося эллипса
#pragma config(Sensor, S1, Light,    sensorEV3_Color)
task main()
{
  int d=0, x,y;
  while(true)
  {
    d=SensorValue[Light];
    x=88-d/2;
    y=63+d/2;
    drawCircle(x,y,d);
    sleep(40);
    eraseRect(x,y,x+d+1,y-d-1);
  }     
}
Описание слайда:
Отображение показаний датчика в виде изменяющегося эллипса #pragma config(Sensor, S1, Light, sensorEV3_Color) task main() { int d=0, x,y; while(true) { d=SensorValue[Light]; x=88-d/2; y=63+d/2; drawCircle(x,y,d); sleep(40); eraseRect(x,y,x+d+1,y-d-1); } }

Слайд 32





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

Слайд 33





Пропорциональный регулятор
Описание слайда:
Пропорциональный регулятор

Слайд 34





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

Слайд 35





Пропорциональный регулятор: вычисление коэффициента усиления
Базовая скорость робота v 
Максимальная скорость vmax 
Минимальная vmin 
Минимальное значение скорости влияет на крутизну поворотов
1. Найти максимальное управляющее воздействие umax
для получения предельной скорости на моторе - это наибольшее из чисел vmax-v и v-vmin
2. Найти максимальную ошибку
emax = (white - black) / 2
3. Найти ориентировочное значение коэффициента усиления k.
k = umax / emax
Описание слайда:
Пропорциональный регулятор: вычисление коэффициента усиления Базовая скорость робота v Максимальная скорость vmax Минимальная vmin Минимальное значение скорости влияет на крутизну поворотов 1. Найти максимальное управляющее воздействие umax для получения предельной скорости на моторе - это наибольшее из чисел vmax-v и v-vmin 2. Найти максимальную ошибку emax = (white - black) / 2 3. Найти ориентировочное значение коэффициента усиления k. k = umax / emax

Слайд 36





Параллельные задачи
task line()  // Объявление задачи
{
  while(true) 
  {
     // Здесь должен быть регулятор для движения по линии
  }
}

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

Слайд 37





Параллельные задачи - 2
task line()  // Объявление задачи
{
  while(true) 
  {
     // Здесь должен быть регулятор для движения по линии
  }
}

task main()  // Основная задача
{
  startTask(line); // Запуск параллельной задачи
  for(int x=0; x<178; x++) 
  { 
    ...              // Рисование графика 17,8 с
    wait1Msec(100);
  }
  stopTask(line);  // Остановка параллельной задачи
  wait1Msec(30000); // Посмотреть график
}
Описание слайда:
Параллельные задачи - 2 task line() // Объявление задачи { while(true) { // Здесь должен быть регулятор для движения по линии } } task main() // Основная задача { startTask(line); // Запуск параллельной задачи for(int x=0; x<178; x++) { ... // Рисование графика 17,8 с wait1Msec(100); } stopTask(line); // Остановка параллельной задачи wait1Msec(30000); // Посмотреть график }

Слайд 38





Параллельные задачи - 3
int svalue=0;    // Глобальная переменная
task line()
{
  while(true) 
  {
     svalue=SensorValue[S1];  // Показания датчика в переменную
     // Здесь должен быть регулятор для движения по линии
  }
}
task main()  // Основная задача
{
  StartTask(line); // Запуск параллельной задачи
  for(int x=0; x<178; x++) 
  { 
    y=svalue;     // Защита от коллизий
    ...              
  }
  StopTask(line);  // Остановка параллельной задачи
  motor[motorB]=motor[motorC]=0;   // Остановить моторы
  wait1Msec(30000); // Посмотреть график
}
Описание слайда:
Параллельные задачи - 3 int svalue=0; // Глобальная переменная task line() { while(true) { svalue=SensorValue[S1]; // Показания датчика в переменную // Здесь должен быть регулятор для движения по линии } } task main() // Основная задача { StartTask(line); // Запуск параллельной задачи for(int x=0; x<178; x++) { y=svalue; // Защита от коллизий ... } StopTask(line); // Остановка параллельной задачи motor[motorB]=motor[motorC]=0; // Остановить моторы wait1Msec(30000); // Посмотреть график }

Слайд 39





Параллельные задачи – 4 – массивы
int mas[178];    // Массив в RobotC объявляется глобально
task line()
  ...
task main()  // Основная задача
{
  StartTask(line); // Запуск параллельной задачи
  for(int x=0; x<178; x++) 
  { 
    mas[x]=svalue;     // Запись в массив без рисования
    sleep(100);              
  }
  StopTask(line);  // Остановка параллельной задачи
  motor[motorB]=motor[motorC]=0;   // Остановить моторы
  for(int x=0; x<178; x++) 
  { 
    y=mas[x];     //  Рисование графика после остановки
    ...              
  }
  wait1Msec(30000); // Посмотреть график
}
Описание слайда:
Параллельные задачи – 4 – массивы int mas[178]; // Массив в RobotC объявляется глобально task line() ... task main() // Основная задача { StartTask(line); // Запуск параллельной задачи for(int x=0; x<178; x++) { mas[x]=svalue; // Запись в массив без рисования sleep(100); } StopTask(line); // Остановка параллельной задачи motor[motorB]=motor[motorC]=0; // Остановить моторы for(int x=0; x<178; x++) { y=mas[x]; // Рисование графика после остановки ... } wait1Msec(30000); // Посмотреть график }

Слайд 40





Параллельные задачи – 5 – массивы
int mas[178];    // Массив
task line()
  ...
task main()  // Основная задача
{
  StartTask(line); // Запуск параллельной задачи
  for(int x=0; x<178; x++) 
  { 
    mas[x]=SensorValue[S1];     // Запись в массив без рисования
    sleep(100);              
  }
  StopTask(line);  // Остановка параллельной задачи
  motor[motorB]=motor[motorC]=0;   // Остановить моторы
  while(!getButtonPress(buttonEnter)) sleep(1); // Жди нажатия
  for(int x=0; x<178; x++) 
  { 
    y=mas[x];     //  Рисование графика после остановки
    ...              
  }
  wait1Msec(30000); // Посмотреть график
}
Описание слайда:
Параллельные задачи – 5 – массивы int mas[178]; // Массив task line() ... task main() // Основная задача { StartTask(line); // Запуск параллельной задачи for(int x=0; x<178; x++) { mas[x]=SensorValue[S1]; // Запись в массив без рисования sleep(100); } StopTask(line); // Остановка параллельной задачи motor[motorB]=motor[motorC]=0; // Остановить моторы while(!getButtonPress(buttonEnter)) sleep(1); // Жди нажатия for(int x=0; x<178; x++) { y=mas[x]; // Рисование графика после остановки ... } wait1Msec(30000); // Посмотреть график }

Слайд 41





Параллельное управление моторами
int v=50, delta=0;         // Глобальные переменные
task preg()            // Параллельная задача
{
  float e, u, k=2; 
  while(true)  {          // Синхронизация моторов на П-регуляторе
    e=nMotorEncoder[mC]-nMotorEncoder[mB]+delta;
    u=e*k;
    motor[mB]=v+u;
    motor[mC]=v-u;
    wait1Msec(1);
  }
}
task main()                // Основная задача
{
  nMotorEncoder[motorB]=nMotorEncoder[motorC]=0;
  startTask(preg);     // Запуск параллельной задачи 
  for (int i=0;i<4;i++) {  // Движение по квадрату
    wait1Msec(2000);
    delta=delta+500;
  }
  v=0;
}
Описание слайда:
Параллельное управление моторами int v=50, delta=0; // Глобальные переменные task preg() // Параллельная задача { float e, u, k=2; while(true) { // Синхронизация моторов на П-регуляторе e=nMotorEncoder[mC]-nMotorEncoder[mB]+delta; u=e*k; motor[mB]=v+u; motor[mC]=v-u; wait1Msec(1); } } task main() // Основная задача { nMotorEncoder[motorB]=nMotorEncoder[motorC]=0; startTask(preg); // Запуск параллельной задачи for (int i=0;i<4;i++) { // Движение по квадрату wait1Msec(2000); delta=delta+500; } v=0; }

Слайд 42


Программирование в среде RobotC, слайд №42
Описание слайда:

Слайд 43


Программирование в среде RobotC, слайд №43
Описание слайда:

Слайд 44


Программирование в среде RobotC, слайд №44
Описание слайда:

Слайд 45


Программирование в среде RobotC, слайд №45
Описание слайда:

Слайд 46


Программирование в среде RobotC, слайд №46
Описание слайда:

Слайд 47





Благодарю за внимание!
Описание слайда:
Благодарю за внимание!



Похожие презентации
Mypresentation.ru
Загрузить презентацию