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

четверг, 26 декабря 2019 г.

Общие сведения о портах микроконтроллеров AVR

Порты микроконтроллеров AVR — это устройства ввода/вывода, позволяющие микроконтроллеру передавать или принимать данные. Стандартный порт микроконтроллера AVR содержит восемь разрядов данных, которые могут передаваться или приниматься параллельно. Ножки микроконтроллера также называют пинами, контактами или выводами. Порты обозначаются латинскими буквами А, В, С и т.д. Количество портов зависит от конкретной модели микроконтроллера.
Kонфигурирование каждой линии порта (задание направления передачи данных) может быть произведено программно в любой момент времени. Входные буферы портов построены по схеме триггера Шмитта. Для линий, сконфигурированных как входные, также имеется возможность подключения внутреннего подтягивающего резистора сопротивлением 35…120 кОм между входом и проводом питания. Kроме того, если вывод (вход) с подключенным внутренним подтягивающим резистором подключить к общему проводу, он может служить источником тока.
Обращение к портам производится через регистры ввода/вывода, причем под каждый порт в адресном пространстве ввода/вывода за-резервировано по 3 адреса. По этим адресам размещаются три регистра: регистр данных порта PORTx, регистр направления данных DDRx и регистр выводов порта PINx. Разряды этих регистров имеют названия: Px7…Px0 — для регистров PORTx, DDx7…DDx0 — для регистров DDRx и PINx7…PINx0 — для регистров PINx.
Действительные названия регистров (и их разрядов) получаются подстановкой названия порта вместо символа «x», соответственно для порта A регистры называются PORTA, DDRA, PINA, для порта B — PORTB, DDRB, PINB и т.д.
Следует заметить, что «регистры» PINx на самом деле регистрами не являются, по этим адресам осуществляется доступ к физическим значениям сигналов на выводах порта. Поэтому они доступны только для чтения, тогда как регистры PORTx и DDRx доступны и для чтения, и для записи.
Таким образом, запись в порт означает запись требуемого состояния для каждого вывода порта в соответствующий регистр данных порта PORTx. А чтение состояния порта выполняется чтением либо регистра данных порта PORTx, либо регистра выводов порта PINx. При чтении регистра выводов порта PINx происходит считывание логических уровней сигналов, присутствующих на выводах порта. А при чтении регистра данных порта PORTx происходит считывание данных, находящихся в регистре-защелке порта – это справедливо как для входных, так и для выходных контактов.
Любой порт микроконтроллера AVR можно сконфигурировать как вход или как выход. Для этой цели используется регистр DDRx. На вход или выход можно сконфигурировать сразу весь порт или только отдельный его вывод (контакт, пин).
Регистр DDRx определяет, является тот или иной вывод порта входом или выходом. Если некоторый разряд регистра DDRx содержит логическую единицу, то соответствующий вывод порта сконфигурирован как выход, в противном случае — как вход. Буква x в данном случае должна обозначать имя порта, с которым вы работаете. Таким образом, для порта A это будет регистр DDRA, для порта B — регистр DDRB и т. д.

по материалам "Мир микроконтроллеров" https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/upravlenie-portami-avr-na-yazyke-c/

среда, 25 декабря 2019 г.

Три условия для желающих освоить микроконтроллер

1. Желание и настойчивость в достижении поставленной цели
Этот пункт, на мой взгляд, — самый главный. Не будет желания, а еще хуже — настойчивого желания, то и не будет результата. Главное не пасовать и не останавливаться, проявите настойчивость — и все получится (и не только в деле освоения микроконтроллеров).
2. Знание устройства микроконтроллера.
Немаловажный фактор. Ведь, согласитесь, не зная как устроен микроконтроллер, что он имеет в своем распоряжении, как это все работает, — мы не сможем использовать все возможности микроконтроллера, выжать из него все, на что он способен.
Возможно и не стоит очень глубоко копаться во «внутренностях» микроконтроллера, но основное, так сказать — азы, мы знать должны (этим мы и будем заниматься на страницах сайта — изучать азы работы с микроконтроллером).
3. Знание команд управления микроконтроллерам.
Микроконтроллер, как собака (такое вот интересное сравнение), будет смотреть на нас умными глазами и вилять своим хвостом, пока не подадим ему команду на выполнение каких-то действий.
В отличие от умной собаки, микроконтроллер понимает намного больше команд — более 130 штук.
Так вот, чтобы микроконтроллер не только вилял хвостом, но и выполнял нужную нам работу,  — необходимо знать команды управления им.
Сразу хочу сказать, для начала не надо зубрить все 130 команд, достаточно будет знания и половины (и даже меньше). К тому же, многие команды дублируют друг-друга. Но чем больше команд мы будем знать, тем эффективней мы сможем управлять микроконтроллером и тем красивее и элегантнее будут выходить из-под нашего пера программы.
Итого, если у вас есть настойчивое желание освоить микроконтроллер, тогда продолжаем.

Что такое программа

Какие задачи вы возлагаете на микроконтроллер, и как он будет их выполнять, определяется заложенной в него программой – программой которую для микроконтроллера составляете вы сами.
Программа (в переводе это слово означает – “предписание”) – предварительное описание предстоящих событий или действий.
 К примеру, мы хотим, чтобы микроконтроллер помигал светодиодом. Довольно простая задача, но тем не менее, для того, чтобы микроконтроллер выполнил ее, мы, предварительно, должны шаг за шагом описать все действия микроконтроллера — написать программу, которую он должен выполнить для получения нужного нам результата – мигающий светодиод.
Что-то вроде такого:
♦ Зажечь светодиод:
— настроить вывод микроконтроллера,к которому подключен светодиод, для работы на вывод информации
— подать на этот вывод логический уровень, который позволит зажечь светодиод
♦ Подождать некоторое время:
— перейти к подпрограмме формирующей паузу (которую тоже нужно “прописать”)
— по выполнению подпрограммы паузы вернуться в основную программу
♦ Погасить светодиод:
— подать на вывод микроконтроллера логический уровень, гасящий светодиод
и так далее.

Что такое алгоритм

Алгоритм – набор инструкций, описывающих порядок действия для достижения нужного результата.
Если в программе мы подробнейшим образом прописываем все действия микроконтроллера, то в алгоритме, — мы определяем порядок действий микроконтроллера, на основе которых мы потом создадим программу. По аналогии с вышеприведенном примером:
♦ Зажечь светодиод
♦ Подождать некоторое время
♦ Погасить светодиод
и так далее.
Таким образом, алгоритм – это предшественник программы. И чем тщательно и продумано будет создан алгоритм, тем проще будет создавать программу.


Язык программирования

К сожалению, если любимой собачке мы можем подавать команды на человеческом языке, то общение с микроконтроллером должно происходить на языке, который понятен ему — языке микроконтроллерных команд.
Команды для микроконтроллера имеют вид набора единичек и нулей, типа:
00110101 011000100
так называемые – коды команд, а коды команд – это язык который понимает микроконтроллер. А для того, чтобы перевести наш язык общения на язык микроконтроллера – в эти самые наборы нулей и единичек, существуют специальные программы.
Эти программы позволяют описать порядок работы для микроконтроллера на более-менее понятном для нас языке, а затем перевести этот порядок на язык понятный микроконтроллеру, в результате чего получается так называемый машинный код – последовательность команд и инструкций (те самые нули и единички) которые только и понимает микроконтроллер. Текст программы, написанный программистом, называется исходным кодом. Перевод программы с языка программирования (исходного кода) на язык микроконтроллера (машинный код) производится трансляторами. Транслятор превращает текст программы в машинные коды, которые потом записываются в память микроконтроллера.
В таких программах порядок работы микроконтроллера описывается специальным языком – языком программирования.

Язык программирования – это способ передачи команд, инструкций, чёткого руководства к действию для микроконтроллера.
Из множества языков программирования можно выделить два типа:
языки программирования низкого уровня
языки программирования высокого уровня
Чем они отличаются. А отличаются они своей близостью к микроконтроллеру.
На заре зарождения микропроцессорной техники, программы писали в машинных кодах, то есть весь алгоритм работы последовательно прописывали в виде нулей и единичек. Вот так, примерно, могла выглядеть программа:
01010010
01000110
10010011
Трудно, даже профессионалу, разобраться в такой комбинаций из двух цифр. Для облегчения своей жизни, программисты стали создавать первые языки программирования. Так вот, чем ближе язык программирования к такому набору нулей и единиц тем больше он “низкого уровня”,  а чем дальше от них – тем больше “высокого уровня”.
Самые распространенные языки программирования для микроконтроллеров:
— язык низкого уровня – Ассемблер
— язык высокого уровня – С (Си)
Давайте посмотрим на примере их различия (эти примеры абстрактные).
Допустим нам надо сложить два числа: 25 и 35.
В машинных кодах эта команда может выглядеть так:
00000101 1101001
На языке низкого уровня:
ADD Rd, Rr
На языке высокого уровня:
25+35
Различие языков низкого и высокого уровня видны невооруженным глазом.
Но давайте копнемся в этих примерах поглубже. Пример машинного кода разбирать не будем, так как он идентичен примеру на Ассемблере. По своей сути, Ассемблерные команды это те же машинные коды (команды) которым просто, чтобы не заблудиться в нулях и единицах, присвоены буквенные аббревиатуры. Ассемблерной командой ADD Rd, Rr мы ставим микроконтроллеру задачу сложить два числа, которые находятся (а для этого мы должны их туда предварительно записать) – первое в Rd, второе в Rr, а результат сложения поместить в Rd. Как видите мы ставим очень конкретную задачу микроконтроллеру: где взять, что с этим сделать и куда поместить результат. В этом случае мы работаем напрямую с микроконтроллером.
 Команда на языке высокого уровня: 25+35, привычная для нас математическая запись, радующая наш глаз. Но в этом случае мы не работаем напрямую с микроконтроллером, мы просто ставим ему задачу сложить два числа. Результат и последовательность действий в данном случае будет тот-же, что и при выполнении ассемблерной команды: сначала эти два числа будут куда-то записаны, затем сложены а результат куда-то помещен.
И вот тут кроется главное отличие языков высокого уровня и низкого уровня. Если в Ассемблере мы контролируем весь процесс (хотим мы того, или нет): мы знаем где записаны эти два числа, и мы знаем где будет находиться результат, то в языке высокого уровня мы процесс не контролируем. Программа сама решает куда предварительно записать числа и куда поместить результат. В большинстве случаев нам это и не надо знать, ведь для нас главное итог – число 60 на выходе. Как результат, программы на языках высокого уровня более читаемы (спорный вопрос), приятны для глаза (спорный вопрос) и меньше по размеру – ведь нам не приходится “лезть во все дыры” и расписывать каждый шаг микроконтроллера, программа это делает потом за нас, когда компилирует ее – переводит в машинные коды. Но тут есть и минус. Два одинаковых алгоритма написанных на Ассемблере и на Си, после преобразования их в машинные коды будут иметь разный размер: программа написанная на Ассемблере будет на 20-40% короче программы написанной на Си – черт его знает, каким путем идет Си для достижения нужного нам результата. И бывают случаи, когда нет доверия к языку высокого уровня и в программе на Си делают вставки кода, написанные на Ассемблере.
Продвинутые программисты, как правило, знают несколько языков программирования, творчески соединяя их возможности и преимущества в одной программе. Ну а нам, любителям, надо знать хотя бы один язык (для начала), и начинать надо (а я в этом твердо уверен)с языка низкого уровня – Ассемблера.

ПО МАТЕРИАЛАМ "Программирование микроконтроллеров AVR — первый шаг"
https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/programmirovanie-mikrokontrollerov-avr-pervyiy-shag/



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

суббота, 30 ноября 2019 г.

Мнение

Профессии будущего. Чему учить новые поколения?

Профессии будущего. Чему учить новые поколения?

Опасное будущее


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

Этот тренд уже давно царствует в Европе. В Германии, к примеру, вообще в автосалоне невозможно купить машину за наличные деньги. С одной стороны, такой подход позволяет тотально контролировать движения денежных масс, а с другой заставляет коррупционеров покупать квартиры для хранения сотен килограммов наличности. В отдаленном будущем ситуация может серьезно осложниться – рабочих мест для постоянно растущего населения Земли просто не останется. Ведь даже сейчас, если по всей России перевести организации на настоящий электронный документооборот и электронные базы данных, то четверть, а то и треть служащих можно будет смело увольнять. А в будущем придется для страдающего праздностью населения придумывать искусственные профессии, результативность которых никому не интересна. Государство во многом держится за класс трудящихся в своей стране: если они массово забастуют, экономика рухнет. Это, кстати, было в основе всех революций, и правителям приходилось прислушиваться к голосу трудящихся. Если же от миллионов граждан ничего не будет зависеть, их руки будут не нужны, то и государству в них особой надобности особо нет.


К каким это приведет последствиям, думаю, фантазировать излишне. Сейчас даже название для этой прослойки людей придумали – useless class, или «бесполезный класс». Но спешу успокоить, это лишь самый пессимистичный сценарий развития предполагаемого будущего. Все-таки большая часть футурологов сходится на принципах серьезной трансформации рынка труда, а не его исчезновения.


Самой главной особенностью всех изменений в будущем будет их неимоверная быстрота. К примеру, глобальный трафик интернета с 2005 по 2021 годы должен вырасти в 127 раз! Он распространяется не только на гаджеты и ПК, но и на вещи, окружающие нас: холодильники, телевизоры и так далее. Пройдет пара-тройка лет, и на каждого жителя Земли будет приходиться не менее трех устройств, подключенных к Всемирной паутине. Естественно, это напрямую касается и рабочих мест. «Умные устройства» вытеснят людей из сферы массового производства раз и навсегда, заставляя искать новые сферы применения своего личного времени и потенциала. Здесь у человека есть одно неоспоримое преимущество даже перед самым совершенным роботом или программой: он способен творчески мыслить. Так называемая кастомизация промышленного производства, сферы услуг и экономики знаний пока дает надежду, что человек где-то будет нужен. Кажется, что инженеру будущего вообще без надобности будет знать базовые физические законы – за него все рассчитает искусственный интеллект, а одушевленный творец лишь добавит несколько штрихов, «очеловечивающих» итоговый продукт. Либо ему просто будет достаточно сгенерировать идею, а условный компьютер все сделает дальше сам.



Кривая Аутора
В этой связи очень интересно выглядит анализ американского экономиста Дэвида Аутора, который отследил изменения в занятости в промышленности Соединенных Штатов с 1980 по 2005 гг. Краткое изложение его работы можно встретить в сборнике «Навыки будущего. Что нужно знать и уметь в новом сложном мире».

Аутор выявил двадцатипятилетний тренд на снижение занятости специалистов среднего уровня квалификации, с одновременным ростом потребности в высококвалифицированных работниках. Грубо говоря, менять высшее звено на роботов и программы очень дорого, творческий потенциал человека пока обходится гораздо дешевле. При этом наблюдается рост потребности в низкоквалифицированном труде – здесь также широкое внедрение автоматизации окупится только через десятилетия, если не позже. Конечно, в этой ситуации серьезно спасают потоки трудовых мигрантов, готовыхработать за низкую заработную плату. А что делать, когда экономический эффект от внедрения роботов в сектор гастарбайтеров в один прекрасный момент перевесит все издержки? Уже сейчас роботы Kiva, которых у гиганта Amazon более 50 тысяч, вполне себе заменяют низкоквалифицированных складских рабочих. Нам в России, кстати, пока в этой связи можно быть спокойными – в стране на 10000 рабочих мест всего 1 промышленный робот приходится. А вот в США это число достигло 176, в Японии 305, а в Корее вообще 531.



Робот Kiva в империи Amazon
Кроме вытеснения рабочих с промышленных предприятий, автоматизация создает еще одно благо – исключение целого ряда посредников между производителем товара и его потребителем.  Пример «Яндекс.Такси» тому самое яркое подтверждение – вылетел в трубу целый класс координаторов, менеджеров и диспетчеров, заметно поднимавших среднюю стоимость услуги.

Учиться по-новому?


В связи с надвигающейся на нас волной тотальной автоматизации пора бы задуматься о том, какие навыки нужны нашим детям. Об этом, кстати, задумался гораздо раньше (в 50-х годах прошлого столетия) профессор педагогики Чикагского университета Бенджамин Блум. Он предложил ранжировать по уровню сложности и востребованности шесть мыслительных (когнитивных) задач по возрастанию: помнить, узнавать, применять, анализировать, оценивать и создавать. То есть классический постулат «зубрежка в школе решает всё» еще в прошлом веке оказался ущербным. Сейчас на вершине тренда у детей должны быть способности вычленять из системы составные части и описывать, как части соотносятся друг с другом и с целым. На следующем уровне — умение оценивать, то есть выносить собственные суждения, основанные на внешних или внутренних критериях. Наконец, самым важным видятся способности создавать принципиально новое, определять компоненты новой структуры, соединять существующие части для возникновения нового. Собственно, вот на этих трех китах и должно строиться образование будущего. Вопрос только в том — как?

Оставим проблемы создания новых школ педагогам, а сами рассмотрим, что еще нового готовят нам футурологи в недалеком будущем на рынке труда. На первый план выходит востребованность человеческого воображения, которое пока на несколько порядков превосходит машинное. И есть предположение, что компьютер никогда не станет равным человеку в этой категории. Поэтому в индустрии игр, видео, музыки, сценариев и всего подобного можно вполне искать своим потомкам «тёплое» местечко. Кроме этого, ожидается спрос на профессии, в которых роботизация не сможет заменить общения человека с человеком. К примеру, педагог, наставник, ментор, коучер (называйте как хотите) никогда не выйдут из тренда. При этом на первый план выйдет глубокая индивидуализация процесса научения. Чувствуете современную востребованность репетиторов? Это первые ласточки будущего.

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


Сейчас в связи с описанными проблемами всерьез рассматриваются возможности введения в будущем безусловного основного дохода (handsome fellowship), который бы гарантированно обеспечивал базовые потребности всех членов общества. И это не пособие по безработице – в Финляндии с 1 января 2017 года 2000 безработным выплачивали по 560 евро, при этом не прекращали выплаты при трудоустройстве человека. В далеко идущем варианте рассматривается даже перестройка всего сознания человека: теперь ему не нужно будет заботиться о заработке, а освободившееся время будет расходоваться на общение, помощью ближним, удовольствия и самореализацию.

Автор:Евгений Федоров
Использованы фотографии: sunmag.me, atlas100.ru, robotrends.ru





среда, 27 ноября 2019 г.

Ардуино на чистом С

Поднимем вопрос программирования Arduino на языке Си. Зачем это может понадобиться, ведь на языке Arduino писать значительно проще? Во-первых, код на Си весит намного меньше, чем на Arduino (насколько меньше увидите дальше). Во-вторых, он может выполняться быстрее (для задач, где критична высокая скорость). Кроме того, это может стать первым шагом при освоении собственно микроконтроллеров. Как всегда здесь не будет теории, только практика.
Для начала необходимо подключить библиотеку, позволяющую отправлять-принимать сигналы. Делается это командой
 
#include <avr/io.h>
 
Если на Arduino было необходимо наличие функций loop и setup, то на Си должна быть функция main, возвращающая тип int. Внутри этой функции и будет находится наш код.
 
 int main (void) {
 
}
 
 Поставим себе простейшую задачу — зажечь светодиод на порту №13. И тут мы столкнемся с тем, что собственно на микроконтроллере нет 13 порта. Посмотрим распиновку (pinout) микроконтроллера, установленного в Ардуино (atmega328p).
 
 
 
http://studrobots.ru/wp-content/uploads/2016/12/atmega328w_pinout.png 
 
 Тут обращаем внимание на PB0 — PB7, PC0 — PC6, PD0 — PD7. Это и есть порты для подключения устройств, с ними и предстоит работать. Посмотрим, как эти порты соотносятся с портами Arduino.
 
 
http://foros.giltesa.com/otros/arduino/fc/docs/pinout/uno.jpg 
 
 
Мы задались целью зажечь светодиод на 13 порту. По распиновке Arduino мы видим, что там находится порт PB5. Собственно, правильнее сказать, что порт B, 5 бит. В программе будем работать сразу со битами порта B (0-7), но постараемся не затрагивать биты кроме 5.
Сначала нужно обозначить B5 как выход, то, что на Ардуино делалось командой pinMode (13, OUTPUT).
На Си для этого существует команда DDRB, где B — порт (соответственно, могло быть DDRC и DDRD).
У порта B 8 битов, каждый из которых может быть настроен на выход (1) и вход (0). Поэтому, мы можем задать двоичное число, где каждому биту соответствует 0 или 1.
Например, запись
 
DDRB = 0b00000001


говорит о том, что 0 бит порта B, т.е. PB0 (8 порт Ардуино) будет выходом (OUTPUT), остальные — входом (INPUT). 0b перед числом позволяет указывать двоичную запись числа.
Так как мы работает с PB5, то 1 мы должны поставить в 5 бит

 DDRB = 0b00100000

 Теперь нужно подать напряжение на данный порт. Делается это командой PORTB, где B — снова порт. Напряжение подается единицей, отсутствие напряжения — 0. По аналогии запишем команду

PORTB = 0b00100000

 чтобы подать напряжение на 5 бит.
Код целиком:
#include <avr/io.h>
 
int main (void) {
 
 DDRB = 0b00100000;
 
 PORTB = 0b00100000;
 
}
 
 Что в этом коде нехорошо, так это то, что мы указывали сразу все биты одного порта. Иногда мы не знаем заранее, подается питание на тот или иной бит и изменять мы его не должны, а значит, мы не можем сами подавать туда 0 или 1. Поэтому важно уметь настраивать нужный бит, без изменения остальных.
Для этого потребуется знание логических операций и операций над битами.
Логическое ИЛИ (|)
 Результат ИЛИ равен 1 если хотя бы один из операндов равен 1.

Логическое И (&)
Результат И равен 1 если оба операнда равны 1.


Побитовые сдвиги влево и вправо (<< и >>)
Данные операции сдвигают все биты числа вправо или влево на заданное количество позиций.
Например, запись 1<<2 означает, что биты изначального числа 00000001 сдвинутся влево на 2 позиции и получится 00000100.
Воспользуемся данными операциями, чтобы работать только с необходимыми битами портов.
Мы должны PB5 настроить на выход. Сделаем это так:

DDRB |= (1<<5);


1<<5 это 1 в 5 бите, т.е. 0b00100000. Применяем логическое ИЛИ для текущего состояния порта B и данного числа. Так как 1 находится только в 5 бите, то и в результате изменится лишь 5 бит порта B (станет 1), остальные биты останутся без изменений. Результат операций перезаписывается в DDRB.
Тоже самое проделаем и для отправки сигнала:

PORTB |= (1<<5);


Вновь, благодаря данным операциям изменится состояние лишь 5 бита порта B.
Код программы:

#include <avr/io.h>
 
int main (void) {
 
  DDRB |= (1 << 5);
 
  PORTB |= (1 << 5);
 
}


Теперь посмотрим, сколько памяти требует данный код и аналогичный код на Ардуино.

 http://studrobots.ru/wp-content/uploads/2016/12/%D1%81%D0%B8.jpg

 http://studrobots.ru/wp-content/uploads/2016/12/ard.jpg


 На языке Си код занимает 144 байта, на Ардуино — 710, т.е. разница почти в 5 раз и это всего при двух командах.



 по материалам http://studrobots.ru/arduino-c-1/










 
 
 

пятница, 15 ноября 2019 г.

Тригер на электромагнитном реле


Схема простого триггера на одном реле (схема включения и выключения одной кнопкой).

Вашему вниманию очень простая электрическая схема триггера на одном реле. Для тех, кто не знает, что это такое, поясню. Допустим имеется задача организовать схему, которая бы замыкала контакты, управляющие той или иной нагрузкой, с помощью всего одной кнопки (без фиксации). То есть, один раз нажали на кнопку – реле сработало и включилось, второй раз нажали на кнопку – реле выключилось, перейдя в исходное состояние. Ну, а примером применения такого электрического переключателя на реле может быть вариант проходного выключателя. Это когда включение и выключения освещения можно осуществлять из различных мест, где установлены кнопки схемы. Количество кнопок вкл/выкл может быть различным, и все они подключаются параллельно друг другу. Думаю смысл этого понятен.

Теперь давайте разберем как именно работает данная схема, состоящая всего из нескольких элементов. Сразу можно увидеть, что схему можно разделить на две части по вертикали. Неким мостом этих частей выступают электрические переключатели (нефиксируемая кнопка S1 и одна рабочая группа контактов самого реле K1). Итак, на схему подано напряжение питания (используется постоянный ток). В начальный момент с реле ничего не происходит, а вот поданное на схему питание идет на зарядку конденсатора C1. Причем, скорость процесса заряда ограничивается резистором R1.

 Конденсатор заряжается достаточно быстро. После чего с этой схеме никаких токов не протекает, данный триггер на реле находится в состоянии покоя и ожидания. Далее когда мы нажмем на кнопку S1, то накопленный конденсатором электрический заряд через эту кнопку пойдет на катушку реле, что спровоцирует кратковременное срабатывание этого реле. При этом рабочая группа контактов K1 данного реле переключится. То есть, плюс питания уже присоединиться к резистору R3, что обеспечивает постоянное питание катушки реле от источника питания этой схемы. Реле перешло в режим самоподхвата (поддерживает внешним питанием само себя).

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

Поскольку плюс питания переключен на катушку реле, то в это время процесс заряда конденсатора отсутствует, а тот, который был до этого был израсходован на старт включения катушки реле. А то остаточное количество электрического заряда, что могло остаться на конденсаторе быстро разрядится через параллельно стоящий резистор R2. Итак, как известно разряженный конденсатор имеет практически нулевое сопротивление. Как только мы второй раз нажмем на кнопку S1, то получится что этот конденсатор на короткое время закоротит катушку реле. Это равносильно, что мы на короткий промежуток времени поставим перемычку на эту обмотку реле.

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

А зачем нужны резисторы R1 и R3? Стоящие последовательно конденсатору и катушке реле. Ведь они только ограничивают силу тока. Дело в том, что если не будет резистора R1 на конденсаторе, то при подаче напряжения питания для его зарядки в начальный момент возникнет некоторая просадка напряжение в самой питающей цепи. Поскольку, как я ранее упомянул, в разряженном состоянии конденсатор имеет практически нулевое сопротивление. Именно это кратковременное падение напряжения в цепи питания схемы может отрицательно влиять на стабильность работы триггера, что приведет к нестабильным срабатывания данной схемы.

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

по материалам  https://electrohobby.ru/shem-prost-trig-rele-vvz.html

вторник, 26 февраля 2019 г.

четверг, 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