"Вы читаете о роботах и программировании и думаете: «Было бы здорово сделать что-то подобное самому!» Теми, кем эта идея овладевает чуть больше просто мыслей смотрят кто и как делал своего робота. Читают статьи, смотрят видео. На картинках все понятно. В видеороликах тоже обычно показываются уже готовые продукты, а также сжато показываются технологии их изготовления. И вроде бы то же всё понятно: отпилил, прикрутил, припаял, соединил, запрограммировал вон на той программе вот этим кодом."

пятница, 28 декабря 2018 г.

Практическая работа №5

Используя планшет с рисунком-1 заполнить верхнюю таблицу на рисунке 2. Затем составить и записать маршрут движения робота по координатным точкам сплошной линией. Записать его ниже верхней таблицы как показано на рисунке 2.
рисунок 1
рисунок 2

Затем в программе Skratch2 оформим алгоритм из таблицы


вторник, 18 декабря 2018 г.

среда, 12 декабря 2018 г.

Основы рисования

Компьютерная программа выполняет ваши приказы, а не ваши желания. (Закон Грида).

Виртуальный робот - та же компьютерная программа, следовательно рисование происходит согласно алгоритма движения вашего робота. Линия нарисованная роботом это след его перемещений или движений. Для того чтобы написать алгоритм создания рисунка нам потребуются дополнительные команды входящие в БЛОК ПЕРО.
  1. ОЧИСТИТЬ
  2. ОПУСТИТЬ ПЕРО
  3. ПОДНЯТЬ ПЕРО
Кроме этого в тетради нужно будет оформить планшет для снятия координат вашего рисунка. Размер вашего планшета 20 см на 14 см, область которую он захватывает на сцене - красный прямоугольник. Длинна и ширина одной клетки соответствует 10 шагам робота.
Порядок работы;

  1. На планшете нарисовать рисунок, так чтобы узловые точки рисунка лежали на пересечении линий планшета
  2. Каждой точке планшета присвоить имя
  3. Записать координаты каждой точки планшета по X и Y (длинна и высота каждой клетки 10 шагов, например левая красная граница на пересечении с горизонтальной красной линией (осью Х) имеет координаты -200,0)
  4. Записать маршрут движения робота по точкам для создания рисунка
  5. Определить расстояния между точками и способы перехода в заданную точку
  6. Написать алгоритм движения робота для создания рисунка




Далее оформляется алгоритм. Пример показан ниже, где в параметрах вместо буквенных значений необходимо вставить ваши параметры 

Ошибка в определении расстояния между точками становиться видна после запуска программы 

воскресенье, 9 декабря 2018 г.

Программа управления светодиодом


Программа должна при каждом нажатии кнопки менять состояние светодиода, т.е. включать и выключать его. В этой программе надо:
  • считать состояние кнопки;
  • сравнить его с предыдущим состоянием;
  • если предыдущее состояние было отжата, а текущее состояние нажата – инвертировать состояние светодиода.
Т.е. программа должна отлавливать фронт кнопки или перепад состояния сигнала. Есть два фронта сигнала:
  • с высокого состояния в низкое ( --_ );
  • с низкого состояния в высокое (_--).
Нажатие кнопки будет соответствовать перепаду сигнала из высокого в низкое. Это событие мы и должны выделить.
/*  Программа sketch_6_1 урока 6 
 *  На каждое нажатие кнопки инвертирует состояние светодиода
 *  Работает неправильно из-за дребезга контактов */ 
   
#define LED_PIN 13     // номер вывода светодиода равен 13
#define BUTTON_PIN 12  // номер вывода кнопки равен 12
boolean buttonState;      // состояние кнопки 
boolean buttonPrevState;  // предыдущее состояние кнопки 
boolean ledState;         // состояние светодиода
void setup() {
  pinMode(LED_PIN, OUTPUT);        // определяем вывод 13 (светодиод) как выход
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // определяем вывод 12 (кнопка) как вход
}
void loop() {
  buttonState= digitalRead(BUTTON_PIN); // записываем состояние кнопки в переменную buttonState
  
  if ( (buttonPrevState == HIGH) && (buttonState == LOW) ) {
    
    // предыдущее состояние кнопки - отжата, а текущее - нажата
    ledState= ! ledState;             // инверсия состояния светодиода
    digitalWrite(LED_PIN, ledState);  // запись состояния светодиода из переменной нв выход    
  }
  
  buttonPrevState= buttonState;         // предыдущее состояние кнопки = текущему
}
Выделение события происходит в конструкции
if ( (buttonPrevState == HIGH) && (buttonState == LOW) )
&& это логическое И, производимое над условными выражениями. В результате его применения будет выработано условие истинно, если оба выражения истинны. В данном случае блок оператора if будет выполнен, если одновременно предыдущее состояние кнопки = HIGH и текущее состояние кнопки = LOW. Т.е. если кнопка была отжата в предыдущей проверке, а  сейчас нажата.
По этому условию инвертируется состояние светодиода.
В принципе, несложная программа. Но загрузите ее в плату Ардуино и проверьте, как она работает.
Неправильно она работает. Иногда, на нажатие кнопки, она инвертирует состояние светодиода, иногда нет. Часто светодиод мерцает в момент нажатия. Происходит это потому, что сигнал с кнопки совсем не такой, как мы его представляем.
по материалам  http://mypractic.ru/urok-6-obrabotka-drebezga-kontaktov-knopki-interfejs-svyazi-mezhdu-programmnymi-blokami.html
Проанализируем в ИС ДРАКОН предложенный вариант (функцию void loop()) так как предложенный выше вариант рассчитан скорее на работу программы с компьютером, чем с контроллером. 
 альтернативный вариант предусматривает защиту от долгого нажатия кнопки, которое может перевести к миганию светодиода. Кроме того экономиться оперативная память, что для контроллера очень значимо.
программный  код представлен ниже

    // ИС Дракон. Маршрутный транслятор.
    // Y:\home\deniska\Документы\др длкр\Новый_17.drt
    // 33. Схема - Гном, Изменение 09.12.2018 13:41:08
    // 37. Модуль, Начало

void setup()
{

pinMode(13, OUTPUT);        // определяем вывод 13 (светодиод) как выход
pinMode(12, INPUT);  // определяем вывод 12 (кнопка) как вход

pinMode(13, INPUT);  // определяем вывод 13 (светодиод) как вход
}
    // Y:\home\deniska\Документы\др длкр\Новый_17.drt
    // 4. Схема - процедура, Изменение 09.12.2018 14:52:18, Начало

void loop()
{

    // ==================== Шампур
    // 5. Заголовок / альтернатива
    // 38. Вопрос / digitalRead(12) == HIGH == Да

    // -19. Левый комментарий / предыдущее состояние кнопки - отжата, а       текущее - нажата
if (digitalRead(12) == HIGH) goto L42; 
    // 6. Конец / Конец
goto L_end4; 
    // ==================== Шампур
L42: ;
    // 42. Вопрос / digitalRead(13)== LOW == Да
if (digitalRead(13)== LOW &&  digitalRead(12) == HIGH) goto L20; 
    // 21. Полка / запись состояния светодиода на выход / digitalWrite(13, LOW);
digitalWrite(13, LOW);
L40: ;

    // 40. Вопрос / digitalRead(12) == HIGH == Да
    // -24. Левый комментарий / пока конопка нажата

if (digitalRead(12) == HIGH) goto L_end4;
goto L_end4; 

    // ==================== Шампур
L20: ;
    // 20. Полка / запись состояния светодиода на выход / digitalWrite(13, HIGH);
digitalWrite(13, HIGH);
goto L40; 

    // 4. Схема, Конец
L_end4: ;
//
}
    // 37. Модуль, Конец
//

тоже самое в скретче виртуальной лаборотории
void setup()
{
  pinMode(12, INPUT);
  pinMode(13, INPUT);
  pinMode(13, OUTPUT);
}

void loop()
{
  if (digitalRead(12) == HIGH) {
    if (digitalRead(13) == LOW) {
      digitalWrite(13, HIGH);
    } else {
      digitalWrite(13, LOW);
    }
    while (digitalRead(12) == HIGH) {
    }
  }
  
}

Структура программы Ардуино и типы данных


Структура программы Ардуино  достаточно проста и в минимальном варианте состоит из двух частей setup() и loop().

void setup()  { 
//  код выполняется один раз при запуске программы 
}
void loop()  {
// основной код, выполняется в цикле 
}

Функция setup() выполняется один раз, при включении питания или сбросе контроллера. Обычно в ней происходят начальные установки переменных, регистров. Функция должна присутствовать в программе, даже если в ней ничего нет.
После завершения setup() управление переходит к функции loop().  Она в бесконечном цикле выполняет команды, записанные в ее теле (между фигурными скобками). Собственно эти команды и совершают все алгоритмические действия контроллера.
Первоначальные правила синтаксиса языка C.

точка с запятой  Выражения могут содержать сколь угодно много пробелов, переносов строк. Признаком завершения выражения является символ ”точка с запятой ”.
z = x + y; 
z = x      
+ y     ;
{   }  фигурные скобки определяют блок функции или выражений. Например, в функциях setup() и loop().
/* … */ блок комментария, обязательно закрыть.
/* это блок      комментария  */
// однострочный комментарий, закрывать не надо, действует до конца строки.
// это одна строка комментария

Переменные и типы данных.

Переменная это ячейка оперативной памяти, в которой хранится информация. Программа использует переменные для хранения промежуточных  данных вычислений. Для вычислений могут быть использованы данные разных форматов, разной разрядности, поэтому у переменных в языке C есть следующие типы.

Типы данных выбираются исходя из требуемой точности вычислений, форматов данных и т.п. Не стоит, например, для счетчика, считающего до 100, выбирать тип long. Работать будет, но операция займет больше памяти данных и программ, потребует больше времени.

воскресенье, 2 декабря 2018 г.

Защита проекта 6-х классов Глебом Глотовым и Максимом Шерстневым

30 ноября 2018 проходила защита проекта робота "Автоматическое устройство контроля доступа в помещения" для представлении на конкурсе "Инженеры и изобретатели" под эгидой главнокомандующего ВМФ РФ. http://engineers-nvmu.tilda.ws/

Выбор данного проекта был обусловлен в первую очередь отсутствием за последние три года поступления в распоряжение клуба робототехники робото-технических наборов и других комплектующих, а также возможностью создания в виртуальном режиме полноценной системы управления к данному проекту, которой в принципе состоит из электромагнитного замка и автоматической системы управления для него. Электромагнитный замок может быть любым, а система управления разработанная участниками проекта легко реализуется материально по выработанным материалам проекта.

Система управления представленного проекта представлена в виде трёх устройств - центрального блока управления, блока для помещения 1 типа блока для помещения 2 типа. Помещение 1 типа это это те которые в течении рабочего дня должны быть открыты, а в нерабочее время закрыты. Управление открытием и закрытие доступа с центрального устройства. Помещения 2 типа могут быть закрыты в рабочее время, но обязательно закрыты в нерабочее время, поэтому закрытие доступа как с местного(локального) устройства, так и централизованно с центрального устройства управления. 
Центральное устройство управления, как локальное устройство для помещений 1 типа имеет только дежурный режим работы, а локальное устройство для помещений 2 типа дежурный и рабочий режимы работы.
В рабочем режиме действия датчиков движения отключено, а в дежурном режиме для (помещений 2 типа) заблокированы все клавиши наборной панели кроме (*).
Для открытия доступа необходимо ввести код доступа через набор кода с соответствующей панели ввода устройства(код для центрального устройства управления один, для локальных каждому устройству присвоен свой код открытия/закрытия доступа) начиная с клавиши (*) и заканчивая (#). 

Нажатие каждой разрешённой режимом работы устройства клавиши сопровождается звуковым сигналом.
Для примера ниже приведен алгоритм работы с локальным устройством доступа.

Возможность создания виртуальной системы управления предоставлена виртуальной лаборатории TinkerCad, которая правда вводит некоторые условности, на пример так как в ней нет элемента соответствующего электромагнитному замку этот элемент заменен на элемент лампа накаливания, в другом случае пришлось вместо устройства связи основанного на применении локальной сети на основе электрической силовой сети пришлось разработать виртуальное проводное устройство передачи сигнала от центрального устройства управления на локальные.
принципиальная схема локального устройства
для помещений 2 типа

Для каждого из устройств был создан свой алгоритм управления, а затем по этому алгоритму был создан программный код, который загружался в виртуальной лаборатории в каждое конкретное устройство. Программный код, как и сам алгоритм разрабатывался в программе ИС ДРАКОН.

Кроме непосредственно самого устройства была разработана техническая документация робота, презентация представления проекта.
Видео отчёт по защите