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

пятница, 5 января 2018 г.

Зона Ардуино: Организация памяти микроконтроллера

Большинство современных микроконтроллеров имеют Гарвардскую архитектуру и содержат 3 вида  памяти:
  • память программ FLASH;
  • оперативная память (ОЗУ) SRAM (Static RAM);
  • энергонезависимая память данных EEPROM.
Адресные пространства указанных видов памяти, как правило, разделены. Способы адресации и доступа к этим областям памяти также различны. Такая структура позволяет центральному процессору работать одновременно как с памятью программ, так и с памятью данных, что существенно увеличивает производительность. Каждая из областей памяти данных (SRAM и EEPROM) также расположена в своем адресном пространстве.
Память программ
Память программ представляет собой электрически стираемое ППЗУ (FLASH) и может поддерживать команды с разрядностью больше 8 бит. В некоторых микроконтроллерах память программ разделена на 2 секции:
  • секцию загрузчика (Boot Program);
  • секцию прикладных программ (Application Program).
Память программ чаще всего является электрически перепрограммиру­емой, количество циклов перезаписи превышает 10 тысяч.
Большинство микроконтроллеров поддерживают внутрисхемное программирование, т. е. загрузку программы в микроконтроллер можно осуществлять после монтажа на плату посредством специального разъема программирования.
Для адресации памяти программ используется счетчик команд (Program Counter – PC).
В памяти программ также находится вектор сброса - в момент подачи питания микроконтроллер начинает выполнение программы с этого адреса, и здесь размещается команда перехода к началу исполняемой программы. Кроме того, память программ содержит таблицу векторов прерываний. При возникновении прерывания после сохранения в стеке текущего значения счетчика команд происходит выполнение команды, расположенной по адресу соответствующего вектора. Поэтому по данным адресам располагаются команды перехода к подпрограммам обработки прерываний.
Положение вектора сброса и таблицы векторов прерываний может быть перенесено из секции прикладных программ в секцию загрузчика.
В некоторых случаях память программ может использоваться не только для хранения кода программы, но и для хранения различных констант.
Оперативная память
Оперативная память, как правило, содержит 3 области:
  • регистры общего назначения;
  • служебные регистры;
  • память для хранения данных.
Регистры общего назначения (РОН) находятся в непосредственной близости к АЛУ. Однако в микроконтроллерах некоторых фирм (в частности, PIC фирмы Microchip) имеется только один рабочий регистр, играющий роль одного из операндов в командах.
Применение набора регистров общего назначения в сочетании с конвейерной обработкой позволяет АЛУ выполнять одну операцию (извлечение операндов из набора регистров, выполнение команды и запись результата обратно в регистр) за один такт.
Служебные регистры имеют свои имя, адрес и назначение. Они предназначены для конфигурации и обслуживания периферийных узлов микроконтроллера. Краткая характеристика служебных регистров должна быть приведена в руководстве по использованию микроконтроллера (Data Sheet).
Среди служебных регистров есть, как правило, один регистр, используемый наиболее часто в процессе выполнения программ. Это регистр состояния. Он содержит набор флагов, показывающих текущее состояние микроконтроллера. Большинство флагов автоматически устанавливаются в «1» или сбрасываются в «0» при наступлении определенных событий (в соответствии с результатом выполнения команд). Все биты этого регистра доступны как для чтения, так и для записи. Эта информация анализируется при выполнении условных переходов. При возникновении прерываний содержимое регистра состояния необходимо сохранять программно (чаще всего это является "заботой" компилятора).
Остальная часть оперативной памяти предназначена для хранения пользовательских данных.
Энергонезависимая память данных
Энергонезависимая память данных (EEPROM) организована таким образом, что содержимое каждого байта отдельно может быть считано или записано. Количество циклов перезаписи энергонезависимой памяти превышает 100 тысяч. Энергонезависимая память предназначена для хранения настроек и конфигурации программы, то есть тех данных, которые должны сохраняться при пропадании питания.
Чтение и запись данных в EEPROM, как правило, осуществляется посредством использования соответствующих регистров из области служебных регистров SRAM. Как правило, это:
  • регистр адреса при обращении к EEPROM;
  • регистр данных, считанных/записанных в EEPROM;
  • регистр управления чтением-записью EEPROM.

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

Зона Ардуино: О функциях для программ управления


Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи. 
Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия.

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

Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.

 Определение функции


Каждая функция в языке Си должна быть определена, то есть должны быть указаны:
  • тип возвращаемого значения;
  • имя функции;
  • информация о формальных аргументах;
  • тело функции.
 
Определение функции имеет следующий синтаксис:
Тип Возвращаемого Значения Имя_Функции(СФА)
{
   ТелоФункции;
  ...
  return(ВозвращаемоеЗначение);
}
//СФА - (Список_Фактических_Аргументов)
Пример: Функция сложения двух вещественных чисел
float function(float x, float z)
{
  float y;
  y=x+z;
  return(y);
}

В указанном примере возвращаемое значение имеет тип float. В качестве возвращаемого значения в вызывающую функцию передается значение переменной y. Формальными аргументами являются значения переменных x и z.

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

Различают системные (в составе систем программирования) и собственные функции.

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

Собственные функции - это функции, написанные пользователем для решения конкретной подзадачи.

Разбиение программ на функции дает следующие преимущества:
  • Функцию можно вызвать из различных мест программы, что позволяет избежать повторения программного кода.
  • Одну и ту же функцию можно использовать в разных программах.
  • Функции повышают уровень модульности программы и облегчают ее проектирование.
  • Использование функций облегчает чтение и понимание программы и ускоряет поиск и исправление ошибок.
 
С точки зрения вызывающей программы функцию можно представить как некий "черный ящик", у которого есть несколько входов и один выход. С точки зрения вызывающей программы неважно, каким образом производится обработка информации внутри функции. Для корректного использования функции достаточно знать лишь ее сигнатуру.
Общий вид вызова функции:
 
Переменная = Имя_Функции(СФА); 



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

 Возврат в вызывающую функцию


По окончании выполнения вызываемой функции осуществляется возврат значения в точку ее вызова. Это значение присваивается переменной, тип которой должен соответствовать типу возвращаемого значения функции. Функция может передать в вызывающую программу только одно значение. Для передачи возвращаемого значения в вызывающую функцию используется оператор return в одной из форм:

return(Возвращаемое_Значение);
return Возвращаемое_Значение;

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

Оператор return также завершает выполнение функции и передает управление следующему оператору в вызывающей функции. Оператор return не обязательно должен находиться в конце тела функции.

Функции могут и не возвращать значения, а просто выполнять некоторые вычисления. В этом случае указывается пустой тип возвращаемого значения void, а оператор return может либо отсутствовать, либо не возвращать никакого значения:
return;

В языке Си нельзя определять одну функцию внутри другой.

В языке Си нет требования, чтобы семантика функции обязательно предшествовало её вызову. Функции могут определяться как до вызывающей функции, так и после нее. Однако если семантика вызываемой функции описывается ниже ее вызова, необходимо до вызова функции определить прототип этой функции, содержащий:
  • тип возвращаемого значения;
  • имя функции;
  • типы формальных аргументов в порядке их следования.
 
Прототип необходим для того, чтобы компилятор мог осуществить проверку соответствия типов передаваемых фактических аргументов типам формальных аргументов. Имена формальных аргументов в прототипе функции могут отсутствовать.

Рекурсивные функции
Функция, которая вызывает сама себя, называется рекурсивной функцией.

Рекурсия - вызов функции из самой функции.
Математические функции
Математические функции хранятся в стандартной библиотеке math.h. Аргументы большинства математических функций имеют тип double. Возвращаемое значение также имеет тип double.
Углы в тригонометрических функциях задаются в радианах.

воскресенье, 31 декабря 2017 г.

Зона Ардуино: Отладка программы управления робота и модернизация формул управления

На прошлом занятии мы добились работы всех рассмотренных узлов нашего робота, но правильного исполнения заложенного алгоритма не добились. Возможно ошибка в формулах управления. Попробуем упростить их. Итак на рисунке показана таблица возможных состояний.
Зеленым выделены наборы значений при которых черный ящик выдаст управляющие сигналы на моторы для движения вперед. Из шести наборов только два управляют возможным поворотом робота. Более того в четырех наборов присутствует 0 сигнал от препятствия спереди, что противоречит заданным условиям алгоритма, по которому черный ящик управления поворотом получает управляющие сигналы на вход, только в случае обнаружения препятствия спереди (1). Значит для упрощения формул управления мы можем исключить ненужные наборы.
BACM1M2
11100
11010
10111
10011
01101
01000
00111
00011
Таким образом формулы управления примут вид:
M1 = B & A & noC
M2 = noB & A & C
Применительно к нашей программе
M1 = BBBB & AAAA & CCC;
M2 = BBB & AAAA & CCCC;

пятница, 29 декабря 2017 г.

С Новым годом дорогие кружковцы и их родители!

Новогодний рейтинг клуба Робототехника



ФАМИЛИЯбалл
Основной состав
Шерстнев Максим Сергеевич ✮✮✮✮73
Старшинов Натан Владиславович ✮✮✮65
Рязанцев Андрей62
Глотов Глеб Андреевич ✮✮58
Свириденко Михаил Антонович ✮46
Науменко Егор Виталевич45
Ростинин Марк Ильич35
Скамейка запасных
Ровенских Дарья32
Антонов Илья Антонович32
Тентлер Никита Ильич20
Яровицын Олег Антонович17
Кравчук Лев Олегович✮16
Втюрин Ярослав12
Селезнев Андрей8
Веселов Федор7

пятница, 22 декабря 2017 г.

ЗОНА АРДУИНО: Логические формулы сборка скетча

На прошлом занятии мы рассмотрели алгоритм управления робота, с возможностью обходить препятствия при помощи поворота дальномера.
Вспомним основной алгоритм
Он основан на зацикливании блока движения-остановки и блока выбора поворота, при этом блок поворота запускается только тогда когда моторы движения робота на стопе.
Как отмечалось ранее блок движения-остановки был отработан на предыдущих уроках, блок выбора поворота мы начали писать на прошлом, сегодня мы должны закончить и разобраться с логикой управления моторами при выборе стороны поворота. Решающий блок выбора поворота можно представить, как черный ящик на входы которого подаются сигналы о наличии препятствия слева, спереди и справа, а на выходе сигналы о запуске моторов в ту или иную сторону вращения.
С помощью таблицы состояний мы можем составить законы управления выбора поворота. Управление левым мотором (М1) и правым мотором (М2) будет происходить по формуле основанной на законах математической логики, где 1 вращение по часовой, а 0 против часовой стрелки.
Приведем получения из таблицы состояний логическую формулу левого мотора:
 аналогично поступаем с правым мотором. 

   

среда, 20 декабря 2017 г.

Новогодний рейтинг

Вот и подошел незаметно 2018 год. Время подводить итоги, формировать основной состав команды первого года обучения и скамейку запасных. Количественный состав команды 8 человек. Есть команда, значит есть и капитан, которого вы выберете сами из основного состава, прямым тайным онлайн голосованием. Предварительно новогодний рейтинг будет опубликован 26.12.17 после проверки последнего онлайн  теста. Тогда же будет опубликован и окончательный состав команды клуба робототехники и скамейка запасных. Критерии отбора это же конечно рейтинг и почетные награды клуба (звезда робототехника) и ваше голосование за капитана команды.