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

четверг, 24 января 2019 г.

Изучаем набор робота


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



Плата arduino 3 UNO
Контактная плата расширения портов - шилд
Серводвигатель
Описание:
Название: Tower Pro
Модель: SG92R
Вес: 9г
Размеры: 23х12.2х27мм
Крутящий момент: 2.5кг/см(при напряжении 4.8V)
Рабочая скорость: 0.1сек/60о(при напрядении 4.8v)
Рабочее напряжение: 4.2V~6V
Рабочая температура: 0 °C~55 °C
Мертвая зона: 10мкс

Особенности:Цифровой микро сервопривод
Нейлоновый редуктор
Длина провода - 25 см
Тип соединения: JR
Ультрозвуковой дальномер
1. Принцип действия

На этот раз мы разберем работу одного из самых популярных датчиков — ультразвукового (УЗ) дальномера. Существует много разных модификаций подобных устройств, но все они работают по принципу измерения времени прохождения отраженного звука. То есть датчик отправляет звуковой сигнал в заданном направлении, затем ловит отраженное эхо и вычисляет время полета звука от датчика до препятствия и обратно.
Из школьного курса физики мы знаем, что скорость звука в некоторой среде величина постоянная, но зависящая от плотности среды. Зная скорость звука в воздухе и время полета звука до цели, мы можем рассчитать пройденное звуком расстояние по формуле:

s = v*t

где v — скорость звука в м/с, а t — время в секундах.  Скорость звука в воздухе, кстати, равна 340.29 м/с.

Чтобы справиться со своей задачей, дальномер имеет две важные конструктивные особенности. Во-первых, чтобы звук хорошо отражался от препятствий, датчик испускает ультразвук с частотой 40 кГц. Для этого в датчике имеется пьезокерамический излучатель, который способен генерировать звук такой высокой частоты. Во-вторых, излучатель устроен таким образом, что звук распространяется не во все стороны (как это бывает у обычных динамиков), а в узком направлении. На рисунке представлена диаграмма направленности типичного УЗ дальномера.
Как видно на диаграмме, угол обзора самого простого УЗ дальномера составляет примерно 50-60 градусов. Для типичного варианта использования, когда датчик детектирует препятствия перед собой, такой угол обзора вполне пригоден. Ультразвук сможет обнаружить даже ножку стула, тогда как лазерный дальномер, к примеру, может её не заметить.

Если же мы решим сканировать окружающее пространство, вращая дальномер по кругу как радар, УЗ дальномер даст нам очень неточную и шумную картину. Для таких целей лучше использовать как раз лазерный дальномер.

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

Второй недостаток связан со скоростью звуковой волны. Эта скорость недостаточно высока, чтобы сделать процесс измерения более частым. Допустим, перед роботом есть препятствие на удалении 4 метра. Чтобы звук слетал туда и обратно, потребуется целых 24 мс. Следует 7 раз отмерить, прежде чем ставить УЗ дальномер на летающих роботов.

2. Ультразвуковой дальномер HC-SR04

В этом уроке мы будем работать с датчиком HC-SR04 и контроллером Ардуино Уно. Этот популярный дальномер умеет измерять расстояние от 1-2 см до 4-6 метров. При этом, точность измерения составляет 0.5 — 1 см.
Итак, попробуем приказать датчику отправить зондирующий ультразвуковой импульс, а затем зафиксируем его возвращение. Посмотрим как выглядит временная диаграмма работы HC-SR04.
На диаграмме видно, что для начала измерения нам необходимо сгенерировать на выводе Trig положительный импульс длиной 10 мкс. Вслед за этим, датчик выпустит серию из 8 импульсов и поднимет уровень на выводе Echo, перейдя при этом в режим ожидания отраженного сигнала. Как только дальномер почувствует, что звук вернулся, он завершит положительный импульс на Echo.

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

int echoPin = 2; 
int trigPin = 3; 

void setup() { 
    Serial.begin (9600); 
    pinMode(trigPin, OUTPUT); 
    pinMode(echoPin, INPUT); 

void loop() { 
    int duration, cm; 
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2); 
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trigPin, LOW); 
    duration = pulseIn(echoPin, HIGH); 
    cm = duration / 58;
    Serial.print(cm); 
    Serial.println(" cm"); 
    delay(100);
}
Функция pulseIn замеряет длину положительного импульса на ноге echoPin в микросекундах. В программе мы записываем время полета звука в переменную duration. Как мы уже выяснили ранее, нам потребуется умножить время на скорость звука:

s = duration * v = duration * 340 м/с

Переводим скорость звука из м/с в см/мкс:

s = duration * 0.034 м/мкс

Для удобства преобразуем десятичную дробь в обыкновенную:

s = duration * 1/29 = duration / 29

А теперь вспомним, что звук прошел два искомых расстояния: до цели и обратно. Поделим всё на 2:

s = duration / 58

Теперь мы знаем откуда взялось число 58 в программе!

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






Шасси
Шасси состоят из рамы двух электродвигателей, поворотного колеса и двух больших колес.

 DC 3V - 6В 

Спецификация:

Сильный магнитный с анти-помех
Двухместный ось мотор-редуктор
Передаточное отношение: 1:48
Рабочее напряжение: 3V ~ 6В
Выгрузка ток: ≤ 200 мА @ 6В, ≤ 150 мА @ 3V
Выгружает скорость: 200 ± 10% RPM @ 6В, 90 ± 10% RPM @ 3В

  

понедельник, 14 января 2019 г.

Самостоятельная работа №6

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

пятница, 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. Работать будет, но операция займет больше памяти данных и программ, потребует больше времени.