Arduino и google объявили о запуске нового научного набора – arduino+

Как ускорить загрузку скетчей в Arduino | РОБОТОША

Существует простой способ в два раза увеличить скорость загрузки скомпилированного кода в микроконтроллер при использовании Arduino IDE.

Заходим в в Arduino IDE, снимаем галочку с пункта Проверка кода после загрузки и жмем . Вот и все что нужно сделать. Не верите? Откроем большой скетч, который занимает около 30 килобайт во флеш-памяти микроконтроллера. С выбранным пунктом проверки, загрузка файла занимает примерно 24 секунды. Сняв отметку, мы выполним это же действие примерно за 13 секунд.

Что при этом происходит? По умолчанию, Arduino IDE проверяет, что все было записано правильно:

Загрузка:

Arduino IDE: ЭйМикроконтроллер: О, приветArduino IDE: У меня есть для тебя немного нового кодаМикроконтроллер: Отлично! Отправляй его мнеArduino IDE: Вот скомпилированный код… [30 килобайт]Микроконтроллер: Получил. Спасибо!

Проверка:

Arduino IDE: ЭйМикроконтроллер: О, приветArduino IDE: Я не уверен, что ты получил все правильно. Перешли полученный код.Микроконтроллер: Хорошо, вот он… [30 килобайт]Arduino IDE: [Сравнивает байты в Arduino с оригинальными байтами кода]             Выглядит нормально. Продолжай.

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

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

Одна на уровне загрузчика — каждый блок данных загрузчика STK500 имеет, так называемый циклический избыточный код (Cyclic redundancy check, CRC), который представляет из себя алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных.

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

Почему это важно?

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

Но сколько раз вы загружаете скетч, когда вы работаете над проектом? 10 раз? 50? И над сколькими проектами вы могли бы работать? Некоторые, наверное, загрузили уже десятки тысяч скетчей.

Теперь умножьте на казалось бы незначительную экономию при загрузке и вы получите внушительное количество сэкономленного времени. В любом случае, будет точно не хуже, если вы меньше времени будете тратить на наблюдение за миганием светодиодов на TX и RX.

Случаи, при которых проверка не помешает

Так выглядит ошибка при проверке в Arduino IDE

В некоторых случаях вы, возможно, все же захотите проверить свой ​​код. Если вы собираетесь поместить Arduino в спутник или в какой-либо другой ответственный проект, вы можете спать спокойнее, зная, что загруженный в него код является корректным.

Если вы подкючаетесь к Arduino при помощи 15-метрового USB-кабеля или у вас провод длиной 2 км при передаче через интерфейс RS485, вы, возможно, захотите произвести проверку после загрузки своего скетча.

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

На каких платах этот трюк работает?

Это работает с любой платой Arduino, которая использует соединение последовательное USB-соединение (Uno, Mega, Pro Mini, LilyPad Simple, Fio и т.д.). Эти все платы используют один и тот же загрузчик avrdude, в котором по умолчанию устанавливается флаг проверки.

Любые платы, использующие загрузчик Catarina (Leonardo, Micro и т.д.) или загрузчик Halfkay (платы Teensy) имеют гораздо более быстрее загрузчики, и для них преимущество в скорости неочевидно.

Еще раз повторюсь, что вероятность пропуска ошибки в процессе минимальна, а поэтому, вполне можно довериться компилятору и снять этот флажок!

Источник: Sparkfun

 

Источник: http://robotosha.ru/arduino/highspeed-upload-into-arduino.html

Почему не Arduino (На примере Energia для TI MSP430)

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

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

Внимание! Не смотря на то, что в заголовке речь идет про Arduino, все таки ниже написанное относится к среде Energia для TI MSP430, что с одной стороны заставляет помнить об отличиях архитектур, а с другой идеи заложенные в Arduino используются и в среде Energia (при старте так и написано Wiring/Arduino IDE for MSP430), что позволяет с некоторыми допусками делать выводы о платформе в целом. Также следует участь, что в реальности от описываемых событий прошло уже 1.5-2 года, так что просьба простить за некоторые неточности, кое-что уже забылось, да сам проект Arduino/Energia не стоит на месте и потихоньку совершенствуется.

Предисловие

Электроникой я увлекся давно, в году 2007 ну и юзал себе AVR через AVRStudio. Но, если кто помнит, то несколько лет назад TI разродилась акцией — отладки MSP430G25XX c 2 МК и отладчиком /программатором всего за 5 баксов. Федексом, до дверей :-). Кто ж против такого устоит :-). Да и новую платформу пощупать было интересно.

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

Хотя в целом, архитектура и доки для данного МК мне очень понравились, а потому мысль, что он будет валяться бесхозным меня не устраивала. Короче, из всего доступного для данного МК софта, оставалась не тронутой только Ардуиноподная среда Energia. Поставил, помигал светодиодиком – работает.

А потому, на данном МК решено было немедленно собрать какой-нибудь простой проект. Хорошим кандидатом для данного проекта оказалась домашняя метеостанция (ну не часы же :-)). Для чего из закромов были извлечены SHT21(датчик влажности/температуры),BMP085(датчик давления), DS18B20 в качестве выносного датчика температуры.

Ну и выводить все это предполагалось на экран HD44780. Все просто, никаких изысков и даже кнопок, просто читаем и выводим. А ну еще питание от батареек.

Короче на основе первых впечатлений, и гугла, подсказывающего, что в среде Ардуинщиков выше названная троица датчиков не пустой звук, я сделал смелое предположение что написание кода займет 2-3 дня. Ну что же, поехали.

Первые впечатления

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

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

И принялся дальше разбираться, так что не заметил что в тестовом коде допустил опечатку, ну что то вроде ldcwrite, вместо lcdwrite.

Код, конечно, не скомпилировался и IDE выдала ошибку. Я по привычке на нее кликнул, что бы перейти к месту ошибки. И…, ничего.

То есть сообщение об ошибке есть, а как узнать где она нельзя, ни тебе номера строки с ошибкой (как в Basic еще бородатых версий), ни подсветки места ошибки (справливости ради в «родной» версии Arduino IDE подная урезанная функция есть). Конечно, когда кода 20 строк, найти ошибку и визуально не проблема.

А если его куда больше, или ошибка где то в библиотеке, да не одна. Лично я не вижу тут никакого упрощения для новичка. Ну да ладно у меня то код, точнее скетч будет не большой переживу.

Знание архитектуры не требуется

Следующим пунктом программы был датчик SHT21. Соответствующая библиотека довольно быстро нагуглилась и я собрал тестовый проект. Ура, все скомпилилось без ошибок, я быстренько нажал кнопку Upload. Программа запустилась, но на экране дисплея пусто :-(.

И что тут должен делать новичок?
Я, конечно, не расстроился и начал лепить, то там, то тут, сначала в своем коде, потом в библиотеке Serial.Write. И убив весь вечер таки понял, что у меня не работает модуль I2C. Пришлось лезть в гугль, и таки через некоторое время ответ нашелся на профильном форуме forum.43oh.com.

Читайте также:  Поделки с микроконтроллерами avr: примеры решений

Причем проблема оказалась, не столь сложной, сколь недружелюбной к новичку. Короче, в «встроенной» библиотеке twi была не правильно прописана конфигурация модуля USI контроллера, а решение так вообще порадовало.

Открыть библиотечный файл, найти сроки (например 203-207, ну то есть вручную посчитаете, ведь в IDE нет нумерации строк), и заменить в них следующий код*:
UCB0CTL1 = UCSWRST; // Enable SW reset UCB0CTL1 |= UCSSEL_2; // SMCLK UCB0CTL0 |= (UCMST | UCMODE_3 | UCSYNC); // I2C Master, synchronous mode UCB0CTL1 |= UCTR; // Configure in transmit mode UCB0I2CSA = address; // Set Slave Address UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation UCB0I2CIE |= (UCALIE|UCNACKIE|UCSTPIE); // Enable I2C interrupts UC0IE |= UCB0TXIE; // Enable I2C interruptsВот так, вот не успел я сделать шаг влево, от папки Example как опять вернулся к регистрам. Да, может в AVR Arduino ситуация лучше, да и саму эту ошибку исправили в новых версиях. Но, меня не покидаем мысль: «А что бы я (новичок) делал, если бы на форуме не нашлось гуру?». Ну и другая: “А вот если бы у меня был Avr Симулятор…”. Нет, действительно, digital write спасет новичка, от вывода мусора на целый порт, но никак не ограничит его от ошибки в программе (например, не тот PIN в функции указал) в результате которой сгорит, например, Н мост. А так хоть симулятором по выводу предварительно пройтись можно. Ниже на картинке, для примера, можно убедится что PORTB2 действительно перейдет в 1 на отмеченной строке кода:

Отладка

После того как проблемы SHT21 были побеждены, настало время BMP085. Тут все обещало быть еще проще, I2C работает, сама либа BMP085, в отличии от предыдущей имеет #define Debug, и облеплена тестовым выводом в UART. Однако и тут я умудрился застопорится. Все вроде работает, но на выходе какая то ерунда, а не нужное значение.

Тут уж я оказался виноват, при копировании кода не правильно вписал константу в формулу. Ну что ж бывает. Но, опять я вылавливал проблему «туплением» в код, а ведь в плату LaunchPad встроен отладчик, который позволяет ставить BreakPoint (точки останова), и посмотреть значение переменных, что называется в реальной работе.

Опять же, на картинке ниже, можно увидеть «прямо в чипе», что переменная с действительно принимает правильное значение:

Неужели концепция debugger так сложна для новичка, что ее не захотели встроить в IDE? Ну ладно с AVR исторически с этим была проблема. А тут…

Понимание

Таким образом, пробиваясь через преграды, я наконец то добрался до датчика DS18B20. Не на что уже не надеясь, я загрузил тестовый код. Ура все заработало как надо… пока я не засунул датчик в морозиловку холодильника. Чудесным образом датчик отказывался работать при -14 градусов. Искал проблему долго, и датчик менял, и в код тупил.

Пока наконец не прицепил к датчику простенький логический анализатор от Saleae. Ситуация тут же прояснилась, тайминги 1-wire жили своей жизнью от посылки к посылке. А потому пришлось пристальнее глянуть на код.

Проблема оказалось в том, что автор либы сделал задержки вот так: time1=micros(); while (micros()-time1 < 500){}; Кто не знает, функция micros() показывает время в микросекундах сначала старта системы. То есть код предельно ясен. Берем текущее значение и грузим в time1. И дальше ждем пока разница между micros() и time1 не станет больше 500.

Все правильно, если вы программист компьютера, то ваше обращение к системному таймеру логично. Но давайте глянем на код этой функции: unsigned long micros() { return (1000 * wdtCounter) / WDT_TICKS_PER_MILISECOND; } Программисту МК не надо даже разбираться, что это за переменная wdtCounter, и константа WDT_TICKS_PER_MILISECOND.

Что бы в голове прикинуть, что при 16МГц тактовой частоты у нас на 1us, всего-навсего 16 тактов, и что бы добиться микросекундой точности, строка выше должна за это время выполнятся. Но тут умножение, и деление (которое не аппаратное) :'(. Реальность еще печальнее, так как wdtCounter обновляется раз в 500 мк секунд.

Теперь все стало на места, конечный автомат датчика при низких температурах также начинал работать чуть хуже, и уже не справлялся с таким ужасными таймингами. Конечно, код выше прекрасно работал для 70МГц платы Stellaris (тоже отладка TI), но не понимание программистом поведения МК привело, вот к такой проблеме.

Короче заменил на библиотечную же delayMicroseconds(), которая суть ассемблерные вставки пустых циклов.

Гибкость В процессе написания этого скетча, я таки созрел до того что, неплохо бы не только на экранчик выводить инфу, но и куда-то пересылать или хранить. Но, тут меня ожидал облом, мой скетч на 20-30 строк уже занимал в памяти 10К из 16, и попытка добавить еще какую-то функциональность тут же раздувала прошивку за 16 килобайт. Тут бы вспомнить про настройки оптимизации, линковщика, компилятора и т.д., но к стыду своему работу с make файлом я так и не освоил, а все советы с интернета по правке файлов настроек IDE, тоже не сработали. Тем же завершилась попытка сменить частоту на более низкую, дабы уменьшить потребление энергии. Но увы, код не компилировался, а ошибки вели куда-то в глубины стандартных библиотек, и от этого пришлось отказаться.

Возможности

Но ладно, код написан и работает, вроде все? Ан нет, я ж забыл про батарейное питание. Негоже вот так вот миллиампер часами раскидываться. Ничего, подумал я сейчас допишу какой ни будь sleep_ms() и дело в шляпе. Или нет? Нет такой функции** ни в Energia, ни в Arduino.

Вот как так, а как же классная брошюра от TI про 6 режимов сна на данном контроллере, и вообще позиционирование его как low energy. Опять за советами пришлось лезть на форум, которые снова советовали магические вставки в библиотеки, так что пришлось в них зарыться.

Давайте обратим внимание на функцию delay: /* (ab)use the WDT */ void delay(uint32_t milliseconds) { uint32_t wakeTime = wdtCounter + (milliseconds * WDT_TICKS_PER_MILISECOND); while(wdtCounter < wakeTime) /* Wait for WDT interrupt in LMP0 */ __bis_status_register(LPM0_bits+GIE); } В частности на последнюю строчку. Вот за это не могу не похвалить разработчиков.

Вместо того что бы долбить новичкам, что delay это плохо – используйте режимы сна. Они просто взяли и встроили режим сна в функцию delay. Так что, вызывая ее, вы фактически переводите МК в сон. Правда режим выбран самый простой, чтобы остальные функции других библиотек работали, и экономии потребления почти не дает.

Пришлось написать свою функцию для более глубоко режима сна: void delay_m()// сон порядка 30 сек { /* Wait for WDT interrupt in LMP3 */ BCSCTL1 |= DIVA_2; WDTCTL = WDT_ADLY_1000; __bis_status_register(LPM3_bits+GIE); enableWatchDog(); }
Выводы:
Начну, пожалуй, с плюсов.

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

Честно говоря, никакого упрощения входа в программирование контроллеров я не заметил. Современные IDE тоже user friendly, а их quickstart (коих полно в интернете) не больше этой статьи, и при этом они дают такие удобные функции как debugger или симулятор.

Так зачем себя ограничивать блокнотом? А еще у меня сложилось впечатление, что библиотеки (особенно стандартные) писаны с применением «взрослых IDE», что как бы намекает… Более того потратил я времени на написание программы не меньше, чем я бы делал это в профессиональной среде. Опять же зачем откладывать, если к ней все равно рано или поздно придется обратится.

Да, несколько упрощенный подход функций типа digitalwrite(), дает быстрый результат, но если нужно сделать что то посложнее, вам таки придется заглянуть в даташит, и разобраться с регистрами как получилось у меня выше. Вообщем, пожелание к разработчикаv arduino только одно. Раз аудитории уже не 1 год, то пора бы ей дать нормальные инструменты.

Читайте также:  Arduino fm-радио: создание приемника своими руками

Ведь arduino пишется на С++, что позволяет перегружать функции и конструкторы, то почему бы их не сделать 2 уровней, для совсем новичков и опытных. А то получается, что кусок важного функционала МК может быть просто «зарезан» как с функциями сна выше.
В качестве эпилога Использую ли я ардуино? Да, вот пришла серва с алиекспресс, разбираться некогда, а отзыв поставить надо. Взял ардуино запустил скетч – работает. Но вот что то более серьезное я на ней вряд ли снова буду делать.

*Само решение сейчас я уже не нашел, так что код для примера.
** Сейчас такая функция уже появилась.

Источник: http://we.easyelectronics.ru/Arduino/pochemu-ne-arduino-na-primere-energia-dlya-ti-msp430.html

Processing vs Arduino

Пожалуй, одной из наиболее популярных задач для Arduino является сопряжение с “большим братом” – иными словами, обмен данными с компьютером (и вовсе не обязательно с тем, на котором создается скетч).

Самый простой способ – использовать библиотеку Serial, которая доступна по умолчанию.

При помощи операторов Serial.print() можно передать произвольные данные через USART МК ATmega в реальный или виртуальный COM-порт (текущие модели Arduino/Freeduino используют  USB-to-TTL мост на чипе FT232RL).

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

Написание собственного протокола обмена, пусть даже не очень сложного – весьма скучное занятие. В поисках того, как реализовать его просто и непринужденно, вы обязательно наткнетесь на Processing: он примечателен тем, что именно от его IDE была унаследована ArduinoIDE.

Что же такое Processing?

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

Скачав, распаковав и запустив последнюю версию PDE (Processing Development Evironment), вы найдете сходство с ArduinoIDE настоль очевидным, что руки сами начнут автоматически набирать “setup”:

Здесь программы тоже называются скетчами. Однократно выполняемая часть оформляется в setup, повторяемая циклически – в draw (аналог loop). Меню Sketch | Run вызывает компиляцию скетча в полноценное Java-приложение и его запуск в отдельном окне, куда оно старательно отображает свою картинку. После окончательной отладки можно нажать Export (соответствует пиктограмме Upload для ArduinoIDE) – и тогда создается html-код страницы с java-апплетом, готовый к размещению в www.
Для быстрого ознакомления с различиями Processing и Wiring создана вот эта страничка. По большому счету, все сводится к отличиям C++ от Java, которые обычно подробно описываются в любом учебнике по Java.

Вернемся к Arduino, точнее к его библиотеке Firmata. Она берет на себя “черную работу” по поддержке механизма обмена между скетчем и программой на “большом брате”.

Разработчику остается только продумать логику работы этого небольшого АПК, определить поведение нужных callback-функций и вставить вызовы библиотеки в setup и loop.

 Если вы уже пробовали реализовывать интерактив средствами Serial – попробуйте как-нибудь с Firmata – должно получиться проще, лучше и быстрее.

Именно с помощью Firmata можно “прикрутить” Arduino к Processing-у, для этого:

  • скачайте библиотеку для Processing-а и распакуйте ее в папку libraries/arduino в каталоге для скетчей Processing (создайте каталоги при необходимости) – но имейте ввиду, что в версии 1.1 она уже включена в состав дистрибутива, так что скорее всего можно обойтись без этого шага;
  • запустите ArduinoIDE, откройте скетч из Examples | Firmata | StandardFirmata, откомпилируйте и загрузите его в свою Arduino-совместимую плату (и не отключайте её после этого);
  • запустите Processing, откройте пример из папки libraries/arduino/examples/arduio_output через File | Open;
  • запустите скетч на выполнение.

Если в ответ на попытку компиляции Processing ругается на невозможность найти cc.arduino.*, сходите в меню Sketch | Add file…, добавьте файл libraries/arduino/library/Arduino.jar и повторите попытку компиляции.

Результатом работы скетча является вот такое нехитрое окно состояния цифровых выходов: 

Каждый кубик обозначает один цифровой выход от 13 до 0. Щелкая по нему, мы переключаем состояние межу HIGH и LOW. Как минимум, к выходу 13 подключен светодиод L, так что изменение его состояния можно наблюдать вполне визуально. Вот как это выглядит внутри скетча Processing:import processing.serial.*; import cc.arduino.*; Arduino arduino; color off = color(4, 79, 111);
color on = color(84, 145, 158); int[] values = { Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW,
 Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW,
 Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW, Arduino.LOW }; void setup() {
  size(470, 200);
  
  println(Arduino.list());
  arduino = new Arduino(this, Arduino.list()[0], 57600);
  
  for (int i = 0; i

Источник: http://mk90.blogspot.com/2010/06/processing-vs-arduino.html

Arduino старт | Первая программа на Arduino

Платформа Arduino исполняет программы на языке, основанном на C/C++, поэтому, имея опыт работы с указанными языками, программирование платы не составит для вас большого труда.

Если же вы не сталкивались с языками C и C++ или никогда не программировали вообще, то не пугайтесь — в большинстве программ вы будете использовать весьма ограниченный набор команд, с которыми вы быстро разберетесь.

Первой программой на Arduino традиционно рассматривают Blink. Чтобы найти ее нажмите «Файл», затем выберите «образцы», «01. Basics» и «Blink».

Загрузите программу и посмотрите на плату. Если код успешно загрузился, то вы увидите, что светодиод на Arduino мигает с частотой 1с.

Давайте разберем программу и поймем, каким образом она управляет светодиодом.

Для начала обратите внимание на то, что часть текста написана серым цветом.

Это комментарии. Эта часть кода не исполняется программой и нужна для пояснения.

Есть два способа оставить комментарий. Первый — закомментировать одну строку, используя символы “//”. Таким образом, все что будет находиться в данной строке после этих символов будет считаться комментариями.

Второй способ — закомментировать часть кода. Для этого используются символы “/*” и “*/”. Этим способом вы сможете оставить комментарии объемом в несколько строк. Комментарий начинается соответственно символами “/*” и заканчивается “*/”.

В программе представлены оба способа.

В программе отчетливо выделяются два блока — setup и loop. Что же они означают? Setup переводится как “настройка”. Loop — “петля”, “цикл”. Команды блока “setup” выполняются один раз сразу после запуска программы. Команды блока “loop” выполняются бесконечно друг за другом.

То есть, после запуска программы сначала выполняются команды в блоке “setup” и далее происходит переход к блоку “loop”, который повторяется бесконечно (по крайней мере пока подается питание).

Фигурные скобки нужны для того, чтобы ограничить команды, относящиеся именно к блоку setup. Мы видим, что внутри фигурных скобок находится только одна команда — pinMode. Как и прежде, попробуем перевести эту команду на русский язык.

Pin — “пин”, “порт”, mode — “режим”. Arduino должна знать, как ей работать с тем или иным устройством, посылать на него сигналы или считывать, и указывается это командой pinMode.

Так как сигналы мы можем либо посылать, либо считывать, то и режимов работы существует два — OUTPUT и INPUT соответственно.

В данном примере идет работа со светодиодом, на него сигналы посылаются (зажечь либо погасить), поэтому стоит OUTPUT. Осталось разобраться, что такое led в команде pinMode(led, OUTPUT). Для этого посмотрим на самую первую команду в программе:

int led = 13;

Данная запись содержит в себе создание переменной и присвоение ей значения. Более подробно о переменных можно прочитать здесь, пока запомним, что этой командой мы создали целочисленную переменную с именем led и присвоили ей значение 13. Теперь мы можем расшифровать команду pinMode(led, OUTPUT) — установка 13 порта в режим отправки сигналов (установка 13 порта как выхода).

Далее перейдем к блоку loop.

В этом блоке прописаны сами действия со светодиодами.

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

digitalWrite состоит из двух слов: digital – «цифровой» и write – «писать». То есть, перевести мы можем эту команду как «цифровая запись». Цифровой говорит о том, что мы можем выбирать из двух состояний — включено и выключено.

Рассмотрим параметры (то, что находится в скобках) этой команды. Вновь нам встретилась переменная led, которая, как мы помним, равна 13 и обозначает порт, к которому подключен светодиод. Второй параметр в наших командах представлен двумя значениями: HIGH и LOW. Переводятся они соответственно как «высокий» и «низкий» и, как вы догадываетесь, включают и выключают светодиод.

Читайте также:  Программирование детям: рекомендации, основные языки

А как задать время горения или негорения светодиода? В этом нам поможет команда delay, которая переводится как «отложить, задержать». То есть, delay приостанавливает программу на определенное время. В качестве параметра указывается время задержки в миллисекундах. 1000 миллисекунд = 1 секунда. Таким образом, условно наши команды можно обозначит следующим образом:

Включить 13 светодиод;

Подождать 1 секунду;

Выключить 13 светодиод;

Подождать 1 секунду;

А так как эти команды расположены в блоке loop, то эти команды будут повторяться, пока на Ардуино подается питание.

Теперь вы имеете представление о структуре программы на Ардуино, знаете некоторые команды.Более подробно программирование светодиодов мы разберем в следующем уроке.

Источник: http://studrobots.ru/arduino-first-program/

Мое первое знакомство с Arduino

  • Магазины Китая
  • TINYDEAL.COM
  • Радиоуправляемые модели

В какой-то момент жизни я осознал, что темное пятно в понимании микроконтроллеров не дает мне жить спокойной размеренной жизнью.

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

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

Вместо пролога

Тема использования Arduino глубоко раскрыта в статьях уважаемых участников форума Spc, Sanja и Bim_Sony. Данная статья не претендует на полноту описания, но показывает опыт человека, никоим образом ранее не сталкивавшегося ни с электроникой, ни с микро контролерами в частности. Отчетливо понимая, что мир микроконтроллеров не начинается с Arduino и то, что данная платформа скроет от меня многие премудрости работы с ними (равно как и уберет многие грабли для начинающего) я запасаюсь терпением и желанием открыть для себя что-то, что окружает ежедневно, но спрятано за стеной непонимания, а скорее просто не заметно глазу.

Первым шагом стала покупка Arduino Duemilanove. Почему именно эта модель? Абсолютно спонтанное решение — просто подвернулась в списке новинок магазина.

Техническая информация

Микроконтроллер: ATmega168
Рабочее напряжение 5 В
Входное напряжение (рекомендуемое) 7-12 В
Входное напряжение (предельное) 6-20 В
Цифровые Входы/Выходы 14 (6 из которых могут использоваться как выходы ШИМ)
Аналоговые входы 6
Постоянный ток через вход/выход 40 мА
Постоянный ток для вывода 3.3 В 50 мА
Флеш-память 16 Кб (ATmega168) или 32 Кб (ATmega328) при этом 2 Кб используются для загрузчика
ОЗУ 1 Кб (ATmega168) или 2 Кб (ATmega328)
EEPROM 512 байт (ATmega168) или 1 Кб (ATmega328)
Тактовая частота 16 МГц

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

Все оказалось не сложно и вдоволь наигравшись миганием светодиодов было решено пойти немного далее.

Кстати, забегая вперед скажу, что под Ubuntu среда разработки видеть плату без бубна не захотела — пункт последовательный порт не был активен в меню «Сервис». Решение подсказал гугл.

Следующим шагом стала покупка платформы с четырьмя моторами, и motor driver shield.

Дополнительная информация о шасси

Количество моторов: 4

Количество колес: 4
Цвет: черный или прозрачный
Крепления: платформа содержит множество отверстий, предназначенных для крепления датчиков, кроме того возле каждого колеса есть посадочное место под датчик прерывания (для получения обратной связи по скорости вращения колеса)

Дополнительная информация о LM293D

Motor Shield – силовой модуль управления двигателями для микроконтроллеров серии Freeduino/Arduino. Модуль предназначен для упрощения разработки моторизированных и робототехнических устройств.

Технические возможности позволяют реализовать разнообразные проекты, связанные с подключением и управлением слаботочными двигателями следующих типов: * четырёх двигателей постоянного тока (DC motors); * двух шаговых двигателей униполярных или биполярных с одинарной или * двойной обмоткой (stepper motors); * двух 5В сервоприводов.

Технические характеристики

напряжение питания: +7…+ 24 В;
количество силовых каналов: 4;
максимально-продолжительный ток каждого канала: 0,6 А;
напряжение питания сервоприводов: 5 В;
возможность реверса каждого двигателя;
возможность независимого управления каждым каналом;
Отверстия на платформе оказались не приспособленными для крепления Arduino-подобных, но это не смутило. Вооружившись стяжками удалось закрепить на ней Duemilanove, поверх которого тут же был водружен motor shield:Еще одним неприятным моментом стало отсутствие припаянных проводов к моторам. Пришлось потратить какое-то время на лужение и припаивание проводов из тех что были в наличии.

Совет

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

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

Совет

Мне, как новичку, показалось удобным на этапе сборки платформы пронумеровать пары проводов и сами моторы, чтобы не путаться в дальнейшем при написании кода. Моторы:И пары проводов:Кроме того, чтобы не путать полярность при отключении проводов от моторов, плюсовые провода и зажимные контакты шилда были также помечены красным маркером:Конечно, если вы будете использовать провода разных цветов, помечать провода не имеет смысла. Мне же было удобно, так как все использованные мною провода были черного цвета.Чтобы закончить с материальной составляющей, осталось лишь обеспечить питание для моторов. Источником, по-началу, была выбрана сборка из четырех элементов AAA:Но такого запаса хватало не на долго и немного позже была добавлена сборка из 6 AA элементов, которая в отличии от первой не имела кнопки включения/выключения, поэтому в разрез плюсового проводника был вставлен переключатель:Обе батареи решил оставить для чистоты эксперимента — разделить по питанию Ардуино и мотор шилд и оценить разницу.

Справка

Для написания кода (т.н. скетчей) используется одноименная среда разработки “Arduino IDE”.

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

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

Код скетча

#include #define MAX_SPEED 255 // Maximum motor speed #define LEFT 33 #define RIGHT 44 #define TURN_TIME 660 //Создаем объекты для двигателей AF_DCMotor frontLeftMotor(1); //канал М1 – передний левый AF_DCMotor frontRightMotor(2); //канал М2 – передний правый AF_DCMotor rearLeftMotor(3); //канал М3 – задний левый AF_DCMotor rearRightMotor(4); //канал М4 – задний правый void setup() {} void setSpeed(int newSpeed) { frontLeftMotor.setSpeed(newSpeed); rearLeftMotor.setSpeed(newSpeed); frontRightMotor.setSpeed(newSpeed); rearRightMotor.setSpeed(newSpeed); } void turn(int dir) { switch(dir) { case LEFT: frontLeftMotor.run(BACKWARD); rearLeftMotor.run(BACKWARD); frontRightMotor.run(FORWARD); rearRightMotor.run(FORWARD); break; case RIGHT: frontLeftMotor.run(FORWARD); rearLeftMotor.run(FORWARD); frontRightMotor.run(BACKWARD); rearRightMotor.run(BACKWARD); break; default: break; } delay(TURN_TIME); } void move(int dir) { switch (dir) { case FORWARD: frontLeftMotor.run(FORWARD); rearLeftMotor.run(FORWARD); frontRightMotor.run(FORWARD); rearRightMotor.run(FORWARD); break; case BACKWARD: frontLeftMotor.run(BACKWARD); rearLeftMotor.run(BACKWARD); frontRightMotor.run(BACKWARD); rearRightMotor.run(BACKWARD); break; default: frontLeftMotor.run(RELEASE); rearLeftMotor.run(RELEASE); frontRightMotor.run(RELEASE); rearRightMotor.run(RELEASE); } delay(500); } void loop() { setSpeed(MAX_SPEED); move(FORWARD); turn(RIGHT); move(FORWARD); move(BACKWARD); delay(500); turn(RIGHT); move(FORWARD); turn(LEFT); move(FORWARD); delay(80); turn(LEFT); move(RELEASE); delay(9500); }
После компиляции и заливки в Ардуино машинка прошла боевое крещение:И даже вызвала интерес у домашнего любимца:

И напоследок несколько фото агрегата.

Эпилог

К моменту написания статьи на импорте отметилась посылка с рядом датчиков, среди которых: ультразвуковые дальномеры, ИК дальномеры, датчики обхода препятствий и sensor shield для удобного подключения всего вышеперечисленного. Кроме этого были заказаны 2 радио модуля для беспроводного управления платформой. Так что веселое времяпрепровождение мне обеспечено еще на долго.

Резюме

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

Плюсы:

Огромное комьюнити, тонны видео и статей Открытая архитектура Легкое макетирование

Минусы:

Цена некоторых шилдов кусается.

Upd: Магазин снизил цену с $13.49 до $10.99

Планирую купить +86 Добавить в избранное Обзор понравился +103 +187

Источник: https://mysku.ru/blog/china-stores/18729.html

Ссылка на основную публикацию
Adblock
detector