
Arduino & Pi
Гусеничное шасси своими руками. Часть 2
Приветствую всех!!! На днях выдалась свободная минутка (если быть точным, пару часиков) для продолжения постройки очередного монстра))). Добавлены двигателя пришедшие от дядюшки Ляо из поднебесной. Под них сделано крепление.
С соосностью намучился, и пришла идея заказать карданчики для RC моделей. Приводные звездочки еще не закончены. Как сделаю "гусянку" так и сделаю зубья.
Привод в сборе.
Как собрал, руки зачесались все проверить, но гусянка пока в процессе создания (очень трудоемкая работа), на глаза попался армированный коврик для ванны (продают погонными метрами). Вырезал с него гусянку временную без направляющих и склеил.
Да вам не показалось)))) Движки стоят чуть чуть криво)))) Все потому что собиралось на коленке с минимумом инструментов. (Надеюсь когда нибудь куплю гараж и будет мне "Щастье") Ну и конечно видос как это все крутится))))
Сильно не пинайте))))) Делаю как могу.... Продолжение как всегда следует.... Всем добра!!!))))
P.S Без Контроля качества не обошлось))))
Рубрика "Вопросы и ответы" вновь к вашим услугам :)
Совсем забылась наша традиционная рубрика "ВиО", нужно это исправлять.. Надеюсь, за это время у вас накопилось много вопросов, а так же большое желание помочь другим ;)
Тем, у кого возникает вопрос по поводу картинки, сюда. А у вас была какая-то тактика с самого начала? :)
Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих
И снова здравствуйте! :)
Это седьмая видео-статья из цикла «Основы Arduino для начинающих» и сегодня мы поговорим о таком важном понятии, как логические операции, без которых не обойтись при решении практически любой задачи.
Предыдущие выпуски вы найдете здесь: 0,1,2,3,4,5,6
Видеоверсия поста:
Начнем с определения в википедии – логическая операция в программировании, это операция над выражениями логического (булевского) типа, соответствующая некоторой операции над высказываниями в алгебре логики. На первый взгляд – ничего не понятно, давайте подробнее разберемся, что такое логический или булевский тип, а так же алгебра логики.
Фраза логический (он же булевский) тип выражения означает, что это выражение может принимать только два значения – ложь или истина, 0 или 1. Если мы укажем переменной, что она имеет тип bool (boolean), то, как ни крути, значения, которые она сможет в себе нести, будут либо 0, либо 1. Помните, в предыдущих выпусках мы составляли условия, в зависимости от истинности или ложности которых происходили какие-либо действия – как раз тогда мы уже работали с булевыми выражениями.
Итак, кажется, теперь становится более понятной первая строчка определения – логическая операция, это операция над выражениями логического (булевского) типа. Теперь со второй частью об операциях алгебры логики.
Каждый из вас помнит уроки математики в школе, где мы работали с числами в привычной для нас, десятичной системе счисления – то есть с цифрами от 0 до 9. Но мир логики, если так можно сказать, отличается от нашего, ведь там все значения имеют только два состояния - 0 или 1, отсюда и возникает потребность в специальной математике для работы с логическими выражениями. Эта математика носит название «алгебра логики».
В этой алгебре есть три основных операции – сложение, умножение и отрицание, позволяющих реализовать любые логические функции. Давайте разберемся на примерах для микроконтроллера, где нам может понадобиться каждая из этих операций.
Операция сложения, она же операция дизъюнкции либо логическое ИЛИ. Многие из вас помнят, что в прошлом выпуске, при изучении циклов и условий, мы брали примеры с автобусами и остановкой, давайте снова разберем такой пример – наверное, вы замечали, что в относительно новых автобусах по салону распределены кнопки требования остановки. При нажатии на такую кнопку у водителя на приборной панели загорается лампочка и звучит сигнал требования остановки.
Давайте попробуем реализовать такую же систему на Arduino – возьмем, например, три кнопки и подключим их к микроконтроллеру, а так же добавим в схему светодиод и, при наличии, пьезо-извещатель.
Алгоритм работы такой системы достаточно прост и схож с тем, что мы писали для одной кнопки и светодиода, но, в данном случае возникает одна проблема - у нас не одна кнопка, для которой можно написать условие, а целых три. И при нажатии любой из кнопок у нас должен звучать сигнал и гореть светодиод. Что же делать? Можно, конечно, написать три отдельных условия для контроля каждой из кнопок, но код в таком случае выглядит нагроможденным и при увеличении количества кнопок становится жутко не удобным.
Здесь нам на помощь и приходят логические операции, позволяющие составлять не одиночные условия, как мы это делали раньше, а достаточно гибкие и удобные совмещенные.
В нашей задаче необходимо включить оповещение при срабатывании первой или второй или третьей кнопки и, если вы помните, операция сложения так и называлась – логическое ИЛИ.
Давайте создадим три переменных типа boolean, в которые будем сохранять считанный сигнал от каждой из кнопок, и объединим эти переменные в одном условии, поставив между ними логическое ИЛИ. Эта операция записывается в виде двух вертикальных черточек и, что бы понять логику ее работы, давайте взглянем на так называемую таблицу истинности, где указываются операнды, над которыми совершается операция.
Два первых столбца это возможные значения на входах - например, если бы у нас было две кнопки и между ними мы производили дизъюнкцию. Как видите, при комбинации 00 итогом логического сложения так же будет 0. А вот следующая комбинация - 0 или 1 уже дает на выходе логическую единицу, так же, как и оставшиеся комбинации. Нижняя строка 11 так же выдаст единицу, поскольку мы производим сравнение двух положительных значений.
В итоге мы можем сделать вывод, что логическая операция ИЛИ выдаст единичный результат, если на любом из ее входов появится хоть одна единица. Для нашей системы мы можем составить таблицу из трех колонок и перебрать все возможные нажатия кнопок, логика останется прежней – если существует хоть одна единица – ответ будет равен одному.
Это отлично подходит к нашей задаче, ведь нам как раз и требовалось при нажатии любой из кнопок запускать оповещение, а при отпущенных кнопках ничего не делать. Давайте взглянем на получившийся программный код..
Надеюсь, цикл for, находящийся в теле условия, после прошлого выпуска теперь не вызывает у вас трудностей в понимании. Как видите, при нажатии на любую кнопку условие становится истинным и выполняется цикл for, написанный в теле условия.
Переходим к следующей логической операции – это конъюнкция или логическое И, иначе говоря – умножение. Если предыдущая операция делала условие истинным при любой нажатой кнопке, то операция умножения потребует нажатия сразу всех кнопок и только тогда выдаст нам логическую единицу.
Более наглядно это можно увидеть по таблице истинности. Как можно заметить, если в комбинации присутствует хотя бы один ноль, то вся функция становится равной нулю.
Эта операция записывается в виде двойного амперсанда (&&), и, такой символ - &, по сути, заменяет слово И (от английского and). Таким образом, если вам понадобится сделать условие истинным при одновременно нескольких истинных событиях, то этот оператор то, что нужно.
Это можно увидеть, если заменить в предыдущем коде ИЛИ на И.
Загрузив код, мы увидим, что нажатие одной кнопки никак не влияет на истинность условия и теперь от нас требуется нажать сразу все кнопки.
Также мы можем комбинировать операции сложения и умножения в одной функции. Например, нам необходимо включать оповещение только при одновременном наличии сигнала с 1-й и 2-й кнопки, или со 2-й и 3-й. Тогда условие примет вот такой вид:
Скобками осуществляется разграничение между отдельными условиями и, по сути, сейчас у нас два условия в одном: первое – нажатие 1-й и 2-й кнопки, второе – нажатие 2-й и 3-й кнопки, что бы учесть выполнение одного из этих двух условий мы ставим между ними логическое ИЛИ.
И, наконец, нам осталось разобраться с третьей логической операцией, пожалуй, самой простой из всех – это логическое отрицание или логическое НЕ. Единственная его задача - менять значение переменной или функции на противоположное.
Обозначается операция восклицательным знаком, который ставится впереди переменной или функции. Например, первая переменная кнопки при считывании значения с порта микроконтроллера стала равна нулю, но, добавив впереди нее восклицательный знак, это значение становится обратным – то есть теперь эта связка равна единице.
Когда может понадобиться отрицание? Например, когда в условии нужно проверить не истинность какой-либо функции или переменной, а, наоборот, ее ложность. Но, как вы помните, например, оператор if разрешит нам попасть в тело условия, только если условие в его круглых скобках будет истинно, а не ложно, для ложного значения мы использовали else.
Так вот, что бы условие выполнилось при нормально-ложном значении чего-либо и пригодится отрицание. Допустим, мы хотим выполнить тело условия только если кнопка отпущена, то есть в переменной находится ноль, поэтому к переменной, указанной в условии, мы добавляем восклицательный знак. Теперь при отпущенной кнопке связка переменной и отрицания равна единице и условие выполняется.
Модернизировать наш прошлый алгоритм можно добавив условие, что, одна из кнопок должна быть обязательно отпущена. Иначе условие срабатывает при, например, нажатых первой и второй кнопках, но при этом не учитывает в каком положении находится третья. Указав, что третья кнопка должна быть равна нулю, мы задаем более точное условие срабатывания алгоритма.
Как и в обычной математике, у алгебры логики есть свои законы, советую самостоятельно подробно с ними ознакомиться.
Ну а в качестве домашнего задания, попробуйте добавить к нашей схеме еще пару кнопок и применить свои условия срабатывания оповещения - здесь важно отточить навык использования сразу всех операторов – сложения, умножения и отрицания.
Для тех, кому трудно придумать свои условия, я составил небольшую таблицу зависимостей выходного сигнала от состояния 4 кнопок. Попробуйте реализовать каждое из этих условий:
Так же, для тех, кто не состоит в нашем сообществе Вконтакте, сообщаю, что теперь после каждого выпуска с задержкой в один-два дня будет выкладываться небольшой тест, в котором вы сможете проверить свои остаточные знания по изученному материалу и восполнить возможные пробелы. Тест к предыдущему выпуску можно найти здесь.
Ну а на этом про логические операции, пожалуй, все, не забывайте оценивать материал и писать свои пожелания и замечания, надеюсь, что вам было интересно :) Всем добра!
Нужна помощь в переводе
Собираю вот такую штуку:
Заботливый китаец прислал кучу ссылок на инструкции по сборке, видео, драйвера и много чего хорошего.
Разобрался почти со всем, но описание контроллера на китайском меня поставило в тупик.
Вот ссылка на pdf`ку:
http://en.mail.qq.com/cgi-bin/ftnExs_download?t=exs_ftn_down...
К сожалению, движок Пикабу позволяет опубликовать пост только в одном из сообществ, но я надеюсь, что среди ардуинщиков найдётся человек, знакомый с китайским языком.
Перезалил на другой файлообменник:
Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих
Привет начинающим ардуинщикам! :)
Прошу прощения за возникшую задержку в выпусках - болело горло и не мог записывать видео. Сегодня мы разберемся с такими понятиями как условные операторы и циклы, поговорим о том, как ими пользоваться и разберем несколько примеров их применения.
Предыдущие выпуски вы найдете здесь: 0,1,2,3,4,5
Видеоверсия поста:
Предлагаю начать наш разговор с условных операторов, или, как их еще называют, операторов выбора. Данные операторы всегда имеют какое-то условие, и это условие в процессе работы проверяется на истину или ложь.
Если условие верно, то есть истинно, то выполняется специально указанный для этого случая фрагмент кода. Если же условие не верно, то есть ложно, то выполняется либо другая специально указанная часть кода, либо не выполняется ничего и работа микроконтроллера продолжается дальше по коду.
Если взять за пример человека, то мы с вами каждый день выполняем огромное множество подобных условий на подсознательном уровне, не замечая этого. Допустим, вы решили попить чаю и пришли на кухню что бы поставить чайник. Перед тем, как его включить или зажечь газ, вы проверяете, есть ли в чайнике вода. Если воды достаточно, то можно включать чайник, если нет, то необходимо её долить. Как раз условием в данном случае и является проверка вашего чайника на достаточное количество воды. И при истинности либо ложности этого условия вы выполняете определенные действия. Тоже самое делает и микроконтроллер, если вы задаете ему какое-то условие. Например, в прошлом выпуске мы рассматривали условие нажатия кнопки и зажигали в зависимости от этого светодиод.
Такой условный оператор носит название if, что в переводе означает «если». И частично его конструкция вам уже должна быть знакома – это непосредственное указание оператора, затем необходимое условие в круглых скобках и какой-либо код, выполняющийся при истинности этого условия. Но, в случаях, когда важно учитывать не только истинность, но и ложность, то есть не выполнение заданного вами условия, после фигурных скобок пишется слово else, что в переводе означает «иначе», и ставятся такие же фигурные скобки, только уже код в них будет выполняться при ложности заданного условия.
Например, к нашему прошлому коду можно добавить условие, что при нулевом сигнале, то есть отпущенной кнопке, подать на пин 13 постоянный сигнал высокого уровня. И тогда, если кнопка не нажата, наш светодиод будет постоянно гореть, а при нажатии, мигать с указанной частотой.
Так как микроконтроллер работает с числами и различными значениями, то в условии мы можем проверять не только абсолютное равенство двух значений, но так же делать различные выводы о том, больше ли это значение чем заданное, больше или равно, меньше, меньше или равно либо просто не равно.
Согласитесь, оператор if очень прост и удобен в использовании, но здесь стоит оговориться, ведь удобно с ним работать, только если нам необходимо проверить какое-либо одно условие. А что если их будет несколько? Представьте, что вам дали задание, например, разложить научные статьи по году их публикации, и вы, проверяя год каждой статьи, кладете их в соответствующую папку.
Но как этот процесс будет выглядеть с точки зрения алгоритма для микроконтроллера и оператора if? Давайте запишем. Очевидно, что вам потребуется сделать такое количество алгоритмов, какое количество годов будет у ваших статей. Ведь каждый раз мы должны проверить год на соответствие и в случае совпадения, положить документ в папку, либо же отправить его на проверку другому алгоритму.
Такой каскад из условий со стороны микроконтроллера не создаст для него никаких проблем, но с точки зрения восприятия человеком такого большого количества однотипных условных операторов – это крайне неудобно.
И здесь нам на помощь приходит еще один оператор выбора, имеющий название switch, что в переводе означает коммутатор или переключатель. Его удобство заключается в том, что нам не нужно теперь создавать каждый раз новое условие, чтобы проверить одно и тоже значение, а всего лишь необходимо указать в круглых скобках оператора переменную, которая будет принимать это значение, а сам оператор осуществит поиск из возможных вариантов нужного нам значения, и выполнит соответствующий ему код.
Что бы стало понятно, вернемся к нашей задаче распределения статей. В качестве постоянно изменяющейся переменной мы можем указать оператору значение года публикации статьи, а в возможных вариантах существующие года публикации. И, таким образом, получив очередное значение года, оператор выберет необходимый год из вариантов и выполнит действия, указанные в пределах от оператора case до оператора break, а затем выйдет из оператора switch. Break в нашем случае переводится как выход, а case - это возможный случай или вариант. Если же необходимый год в списке не найдется, то в конце оператора возможно указание значения ключевого слова default, то есть по умолчанию, и в таком случае мы не просто выйдем из оператора, а сначала выполним код, указанный после default.
Объясняя принцип работы этого оператора, я упомянул такое слово как переменная, которой присваивалось какое-то значение года публикации. Переменной называется область памяти микроконтроллера, имеющая определенное имя. В переменные можно сохранять какие-либо значения и использовать эти значения в дальнейшем. В зависимости от типа переменной, она может хранить числа или символы, а так же быть или не быть знаковой, то есть отрицательной. Чтобы не затягивать статью, я советую вам изучить какие бывают переменные и их типы по этой ссылке или любой другой из поиска.
В дальнейшем, научившись сообщать микроконтроллеру различные данные и значения, мы обязательно опробуем оператор switch в действии, ну а пока вам важно изучить и понять логику его работы.
Итак, подводя итог, можно сказать, что существует два условных оператора, или оператора выбора – это if и switch. Оператор if больше подходит для одиночных проверок условия, а switch подойдет для случаев с большим количеством возможных вариантов и одним проверяемым значением.
Идем дальше. Теперь у нас на очереди операторы циклов. Любой цикл представляет собой повторяющееся несколько раз действие. Операторы циклов бывают трех видов: for, while и do while - давайте остановимся поподробнее на каждом из них.
Оператор цикла while.
Представим себе простую ситуацию: вы стоите на остановке и ждете автобус под номером 25. В данный момент вы задаетесь условием проверки каждого номера автобуса на совпадение с цифрой 25. Если номер не подходит, то вы продолжаете стоять и ждать нужный - именно так и действует цикл while, который проверяет условие, указанное в его круглых скобках.
Цикл while переводится как «пока» и до тех пор, пока его условие выполняется, он бесконечно долго выполняет код, указанный в его фигурных скобках. Например, на каком-либо этапе работы микроконтроллера, нам важно получить сигнал с какого-нибудь пина Arduino, и, пока сигнала нет, программа не должна ничего выполнять. Как раз в этом случае нам и поможет while, если в условии мы укажем считывание пина и его проверку на равенство нулю.
Важно еще раз отметить, что while будет выполняться до тех пор, пока условие будет истинным, и как только оно станет ложным, при очередной проверке условия произойдет выход из цикла.
Оператор цикла do while.
Оператор цикла do while называется оператором цикла с постусловием и работает практически по тому же принципу, но с одной лишь разницей: сперва происходит выполнение тела цикла, а уже затем проверка условия. Этот цикл используется, когда необходимо хотя-бы один раз выполнить код, указанный в фигурных скобках независимо от истинности или ложности условия, указанного ниже. В случае с обычным циклом while при изначально ложном условии микроконтроллер переходит сразу же к выполнению кода, написанного после фигурных скобок цикла и, таким образом, минует код, указанный в теле цикла.
Прошу обратить ваше внимание на синтаксис оператора do while – возможно, кто-то уже заметил, что после условия в круглых скобках ставится точка с запятой, поскольку тело цикла уже было описано в фигурных скобках выше.
Оператор цикла for.
И, наконец, нам осталось познакомиться с еще одним, не менее важным оператором цикла под названием for. Давайте вернемся к нашей остановке и автобусу. Допустим, что мы дождались нужный нам автобус, зашли внутрь и теперь нам необходимо заплатить за проезд. Билет стоит 22 рубля, рассчитываться мы будем наличными, поэтому достаем кошелек и начинаем отсчитывать монетки, пока не достигнем нужной нам суммы. Как только нужная сумма будет набрана - можно расплачиваться за проезд. Как вы могли догадаться, цикл for действует по тому же принципу: в условии мы указываем действие, которое выполнится в начале цикла, затем само условие работы и действие, выполняемое в конце каждого прохода цикла.
Давайте возьмем конкретный пример для микроконтроллера и посмотрим, как работает этот цикл. Не за горами наступление нового года, поэтому предлагаю сделать с помощью нашей Arduino упрощенную гирлянду. Подключим со 2-го по 11-й пин 10 светодиодов и напишем цикл их включения.
Если описывать алгоритм работы словесно, то у нас получится следующая последовательность: сперва назначаем переменную, которая будет отвечать за номер пина, и затем говорим микроконтроллеру, что нужно изменять эту переменную от 2 до 11 с небольшой задержкой, последовательно подавая высокий потенциал на каждый пин. В итоге мы получим поочередное зажигание всех светодиодов по нарастающей.
Теперь опишем это с помощью программы.
Сперва укажем имя оператора – for. Затем, в открывающейся скобке, указываем действие в начале цикла - в нашем случае это инициализация переменной pin и присваивание ей значения 2, так как ко второму пину подключен первый светодиод. Кстати, если мы не укажем чему изначально равна переменная pin, то компилятор по умолчанию присвоит ей нулевое значение. Затем ставим точку с запятой и указываем условие, при котором цикл должен выполняться - в нашем случае это работа цикла пока переменная pin меньше или равна 11. После чего мы снова ставим точку с запятой и указываем шаг увеличения или уменьшения значения pin. Запись pin++ означает увеличение переменной pin на единицу, такая операция носит название инкремент и равносильна записи pin = pin+1. А запись pin--наоборот, уменьшит значение pin на один, эта операция называется декрементом.
После указания циклу, что ему делать перед каждым новым проходом, ставится закрывающая скобка – обратите внимание, точка с запятой здесь не нужна. Затем по традиции мы открываем фигурные скобки и пишем знакомые нам строки: digitalWrite(pin, HIGH); и delay(100);
Прошу не забывать, что функция задержки рассматривается нами как простейшая, и через несколько выпусков мы поговорим о том, как ее можно заменить, чтобы не замораживать работу микроконтроллера. Данный пример ориентирован на понимание работы алгоритма, поэтому на этапе обучения мы можем себе позволить такие допущения.
На этом наш код готов. Как он работает? Опишем по пунктам:
1. Объявление переменной pin и присваивание ей значения 2
2. Проверка условия, что 2 меньше или равно 11
3. Выполнение тела цикла: зажигаем светодиод на 2-м пине и ждем 100 мс.
4. Инкремент переменной pin, теперь она будет содержать в себе цифру 3, то есть 3-й пин
5. Снова проверяем условие, что 3 меньше или равно 11
6. И выполняем подачу высокого потенциала на пин 3 с задержкой
Аналогично зажигаются остальные светодиоды. Когда значение pin будет равно 12, условие 12 меньше или равно 11 не выполнится, и будет осуществлен выход из цикла. Таким образом, мы зажжем последовательно все 10 светодиодов.
Загрузив наш код в микроконтроллер, мы увидим, что нам придется постоянно нажимать кнопку сброса, что бы погасить все светодиоды и зажечь их вновь. Если мы можем сделать цикл, который будет последовательно зажигать светодиоды, то, что нам мешает сделать такой же цикл, который будет эти светодиоды последовательно гасить? Давайте добавим еще один цикл в наш код, только теперь в теле цикла мы будем не подавать высокий потенциал на выход, а наоборот, снимать его. Исправляем HIGH на LOW, снова компилируем код и загружаем его..
После загрузки наши светодиоды будут постоянно включаться и выключаться, что выглядит гораздо интереснее :) Код примера, а так же схему подключения, вы найдете здесь - это ссылка на проект в симуляторе circuits, в нем можно сразу же посмотреть на работу кода.
В качестве домашнего задания попробуйте настроить циклы таким образом, что бы светодиоды загорались не со 2-го по 11-й, а, наоборот, с 11-го по 2-й. Подумайте, как можно включать светодиоды не подряд, а через один, или через два, а так же запускать работу кода по нажатию кнопки, как мы это делали в прошлом видео. Обязательно напишите о своих успехах и возникших вопросах в комментарии.
Ну а на этом я прощаюсь с вами до следующего выпуска, в котором мы поговорим о логических операциях и их применении. Надеюсь, что сегодня вы узнали для себя что-то новое, спасибо, что дочитали до конца, успехов и добра вам! :)
Программирование Arduino в Xcode
Приветствую уважаемое сообщество, появился такой вопрос, гугл не помог. Есть задача подтянуть язык С и С++, для программирования микроконтроллеров, я знаю что ардуино не совсем принимается сообществом серьезных программистов, но у меня нету другого, да и по ардуине много информации, считаю что на первое время она подойдет. Так вот в чем заключается вопрос, я не так хорошо в этом разбираюсь (и очень хочу начать разбираться). Как я понял, Arduino IDE (Среда разработки) хоть и похожа на С, но это не торт, хочу учится писать код сразу (как будто) под нормальные микроконтроллеры, и как я понял это делается на чистом языке С, с добавлением разных библиотек, возможно ли писать под ардуиновскую плату, через Xcode (знаю что можно) но при этом, что бы можно было обратится к командам стандартных ардуиновских библиотек (нравятся они мне, много инфы по ним, да и другого сейчас ничего не могу позволить себе).
В общем задача изучать С и С++ по книге дейтела, на базе ардуины (Выполнять вычисления на ее процессоре, и допустим выводить информацию на экран, и иметь возможность использовать разные вкусняшки в виде кнопок и тд и тп, и все это под маком)
В общем юный падаван, просит помощи у высших сил. Т.к. познать силу большое желание.









































