Разработка

Делаем светофор с Arduino

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

Необходимые компоненты:

  • 3 светодиода (зелёный, жёлтый и красный)
  • Push-кнопка
  • 3 резистора на 220 [Ом]
  • Резистор на 10 [кОм]

Собираем плату

Электрическую схему можете посмотреть кликнув по изображению. (Цветной провод, в том месте, где он пересекается с чёрным на картинке, не имеет никакой связи с чёрным)

Соединяем 13 разъём (далее – порт) с Arduino с длинной ногой зелёного светодиода (не забывайте, что короткая нога светодиода ВСЕГДА соединяется с Землёй), а короткую ногу через резистор в 220 [Ом] соединяем с Землёй. Аналогично соединяем жёлтый светодиод через 12 порт  и красный через 11 порт.

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

При установке кнопки есть некоторая хитрость — кнопку надо устанавливать на разделительную полосу между двумя половинками брэдборда.

Теперь подключаем кнопку. Тут всё очень просто – кнопка проводит в обоих направлениях, в отличие от различных диодов, поэтому нет никакой разницы, какой из контактов будет соединён с землёй. Соедините один контакт кнопки с портом №7 Arduino  и этот же контакт соедините через резистор в 10 [кОм] с Землёй, а другой с питанием в 5 [В] — рельса со значком +.

ВАЖНО!! Во всех схемах Земля должна быть всегда одна – для всех подключаемых элементов, по крайней мере, до тех пор, пока вы не используете внешний источник питания в цепи Arduino.

Сборка на этом закончена! Приступаем к программированию Arduino!

Программируем Arduino

// Задаём номера портов для светодиодов
int GPin = 13; // Зелёный
int YPin = 12; // Жёлтый
int RPin = 11; // Красный
int switchPin = 7; // Порт кнопки
boolean lastButton = LOW; // Устанавливаем последнее значение кнопки - выключено
boolean currentButton = LOW; // Устанавливаем текущее значение кнопки - включено
boolean ledOn = false; // Состояние светофора: false - выключен (мигает жёлтый), true - включен
boolean yellowOn = LOW; // Мигающий жёлтый.
unsigned long loopTime; // Вспомогающая переменная для цикла
unsigned long currentTime; // Переменная хранящая текущее значение времени

void setup() {
  // Устанавливаем 3 порта как выход для светодиодов и один как вход для отслеживания кнопки
  pinMode(GPin, OUTPUT);
  pinMode(YPin, OUTPUT);
  pinMode(RPin, OUTPUT);
  pinMode(switchPin, INPUT);
  currentTime = millis();
  loopTime = currentTime;
}

// Функция для лучшего отрабатывания нажатия на кнопку - ждёт установившегося значения, а затем передаёт его в программу.
boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin);
  if(last != current)
  {
    delay(5);
    current = digitalRead(switchPin);
  }
  return current;
}

void loop() {
  currentButton = debounce(lastButton);
  if(lastButton == LOW && currentButton == HIGH) // При нажатии на кнопку включаем\выключаем светофор
  {
    ledOn = !ledOn;
  }
  lastButton = currentButton;
  currentTime = millis();

  // Цикл действий при выключенном светофоре
  if(currentTime >= (loopTime + 500) && ledOn == false)
  {
    yellowOn = !yellowOn; // Инвертируем значение переменной.
    digitalWrite(GPin, LOW);
    digitalWrite(YPin, yellowOn);
    digitalWrite(RPin, LOW);
    loopTime = currentTime;
  }

  // Цикл действий при включенном светофоре
  if(ledOn == true) {
    // Горит зелёный
    if(currentTime >= loopTime && currentTime < (loopTime + 10000)) {       digitalWrite(GPin, HIGH);       digitalWrite(YPin, LOW);       digitalWrite(RPin, LOW);     }     
// Зелёный начинает мигать     

if(currentTime >= (loopTime + 10000) && currentTime < (loopTime + 10500)) {
       digitalWrite(GPin, LOW);     
}      
if(currentTime >= (loopTime + 10500) && currentTime < (loopTime + 11000)) {
       digitalWrite(GPin, HIGH);     
} 
if(currentTime >= (loopTime + 11000) && currentTime < (loopTime + 11500)) {
      digitalWrite(GPin, LOW);     
}
if(currentTime >= (loopTime + 11500) && currentTime < (loopTime + 12000)) { 
      digitalWrite(GPin, HIGH);     
}     
if(currentTime >= (loopTime + 12000) && currentTime < (loopTime + 12500)) {
       digitalWrite(GPin, LOW);     
}     
if(currentTime >= (loopTime + 12500) && currentTime < (loopTime + 13000)) {
       digitalWrite(GPin, HIGH);     
}     
if(currentTime >= (loopTime + 13000) && currentTime < (loopTime + 13500)) {
       digitalWrite(GPin, LOW);     
}     
if(currentTime >= (loopTime + 13500) && currentTime < (loopTime + 1400)) {
       digitalWrite(GPin, HIGH);     
}     
if(currentTime >= (loopTime + 14000) && currentTime < (loopTime + 14300)) {
       digitalWrite(GPin, LOW);     
}
// Загорается жёлтый 
if(currentTime >= (loopTime + 14300) && currentTime < (loopTime + 17500)) {
       digitalWrite(YPin, HIGH);     
}
// Загорается красный 
if(currentTime >= (loopTime + 17500) && currentTime < (loopTime + 27500)) {
       digitalWrite(YPin, LOW);       digitalWrite(RPin, HIGH);     
}
// Загорается красный с жёлтым     
if(currentTime >= (loopTime + 27500) && currentTime < (loopTime + 30500)) {
       digitalWrite(YPin, HIGH);     
}
// Загорается зелёный 
if(currentTime >= (loopTime + 30500)) {
      digitalWrite(GPin, HIGH);
      digitalWrite(YPin, LOW);
      digitalWrite(RPin, LOW);
      loopTime = currentTime;
    }
  }

}

Код достаточно прост. Если светофор выключен, то просто мигает жёлтым, иначе включаем и выключаем определённые светодиоды через определённые промежутки времени.

Конечно, вместо столько сложного метода мы могли бы использовать простую задержку методом delay(), однако в использовании функции delay() есть один очень большой минус, который не должна обладать наша программа. Во время паузы — процессор не реагирует на другие операции, таким образом, во время задержки, например, на горение красного светодиода, сколько кнопку не нажимай — светофор не выключиться. Чтобы выключить светофор — вам придётся попадать по кнопке в тот момент, когда изменяется состояние светодиода, что, согласитесь, очень неудобно. Поэтому мы используем метод millis(), которые возвращает количество миллисекунд, прошедшее с момента запуска приложения, и отсчитываем нужные нам интервалы времени.

Ну что, сохраняем нашу программу (скетч) и загружаем её в Arduino. Смотрим что у нас получилось.

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

Задавайте любые, интересующие Вас, вопросы, а я отвечу на них в комментариях к этому посту. До скорых встреч!

Разработка

Знакомство с Arduino

Знакомство с Arduino Приветствую! С недавних пор, а именно с моего прошедшего дня рождения у меня появилась такая популярная вещь, как Arduino. Кто не знает, Arduino — это инструмент для проектирования электронных устройств (электронный конструктор — почти как лего властелин колец) более плотно взаимодействующих с окружающей физической средой, чем стандартные персональные компьютеры, которые фактически не выходят за рамки виртуальности. Проще говоря, это микроконтроллер, которые легко можно программировать с компьютера через USB провод + набор резисторов и прочих датчиков.

Сегодня я покажу как реализовать простейший пример — мигающий светодиод с периодом в 1 секунду, и расскажу о том, как пользоваться макетной платой (брэдборд) и подключать её к ардуино.

Существует несколько версий платформы Arduino — я стал владельцем платы Arduino Uno (смотреть фото).

В комплекте с Arduino идут:

  1. Сама плата Arduino с микроконтроллером
  2. Макетная плата для сбора своих схем (на фото — белая планка внизу)
  3. Набор контактных проводов разной длинны.
  4. Набор пассивных элементов (резисторы, тиристоры, транзисторы, различные датчики и прочее)
  5. Ну и конечно же USB провод

Программируется Arduino очень просто, т.к. использует свой упрощённый язык. Чтобы написать простейшую программу (мигание встроенного в плату светодиода) вам понадобится лишь несколько строк кода.

На плате к 13 разъёму подключен встроенный светодиод. Наша задача — заставить этот светодиод мигать с периодичностью в одну секунду.

Подключаем Arduino к компьютеру и приступаем к написанию программы! Для этого вам понадобиться скачать среду разработки для Arduino — вот Вам ссылочка на страницу закачки. Среда разработки не требует установки — просто распакуйте архив и запустите исполняемый файл!

// Создаём переменную ledPin, где задаём номер выхода, к которому подключен светодиод
int ledPin = 13;

// Создаём первый обязательный метод с настройками платы

void setup() {
  // Указываем Arduino, что необходимый нам разъём будет выходом
  // Arduino может использовать одни и те же разъёмы как входы или как выходы.
  pinMode(ledPin, OUTPUT);
}

/*
* Теперь создаём "цикл" - это вторая обязательная часть программы будет непосредственно выполняться на Arduino и повторяться многократно.
*/
void loop() {
  // Задаём для соответствующего порта значение HIGH - напряжение есть (включаем светодиод)
  digitalWrite(ledPin, HIGH);
  // Одну секунду ждём
  delay(1000);
  // Убираем напряжение с 13 порта (выключаем светодиод)
  digitalWrite(ledPin, LOW);
  // и снова задержка на одну секунду
  delay(1000);
}

Вот и всё! Нажмите кнопку «загрузка» (со стрелочкой вправо) и дождитесь компиляции и загрузки программы в Ваш Arduino. Теперь вы наблюдаете как встроенный светодиод начнёт мигать. Всё просто!

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

Устройство и работа с макетной платой

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

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

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

ВНИМАНИЕ! Ни когда не производите каких либо действий с вашими цепями при включенном питании на Arduino и в цепи. Вы можете просто повредить Arduino.

  1. Сначала соедините выход с Arduino на 5V с положительным контактным рельсом, а землю с Arduino (выход с подписью GND), с отрицательным рельсом. Теперь весь продольный положительный рельс — это источник в 5V, а отрицательный — земля. (ВНИМАНИЕ! Соединять эти рельсы напрямую опасно!!)
  2. Теперь соедините светодиод с пятивольтным рельсом длинной ногой (длинная нога всегда к источнику, а короткая к земле), а короткую воткните в любой другой свободный поперечный рельс.
  3. Соедините резистором на 220 [Ом] короткую ногу светодиода с любым другим поперечным рельсом
  4. И наконец, замыкаем цепь — соедините свободную ногу резистора с 13 выходом Arduino.

Наша цепь готова! Подключаем к питанию и радуемся!

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

Жизнь

Картография тоже искусство?

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

Так может картография это тоже искусство на ровне с фотографией или картинами? Наверное это действительно так, ведь и фотограф и художник в своей работе «ловят» хороший пейзаж -показывая нам то или иное явление с их ракурса. Тогда и картографическое дело можно тоже отнести сюда же. Единственное отличие карты от фотографии — это ракурс, с которого мы видим объект. Цель картографа — запечатлеть городскую или какую-либо другую местность с высоты, причём он должен очень точно всё описать, и представить результат своих трудов нам.

Исходя из этого можно сделать вывод, что картография — тоже искусство.

А как считаете Вы?

Это интересно!

Доверие — один из важнейших факторов вашего проекта

Без доверия в наше время не куда. Ниже я приведу пример того, когда люди не серьёзно относятся к своему делу и, как следствие, теряют доверие.

Развитие электронных сервисов и представительств – одна из главных задач, которую ставит себе правительство в последнее время. Появился блог Президента, различные проекты типа Дума 2.0, недавно был запущен портал государственных услуг. Эти примеры подтверждают тот факт, что у власти, в данный момент, есть задача стать ближе к народу, а у народа такое желание есть испокон веков.

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

Выше я привёл пример того, как надо делать, а теперь приведу “плохой” пример – как делать нельзя.

Вчера мне принесли газету в которой была статья о государственном образовательном заказе. Читать статью мне было лент т.к. она большая – на всю страницу, поэтому её чтение я решил отложить на следующий день и быстро пробежался по статье глазами. “О_о нифига себе! Инопланетяне уничтожили их мозг?” – первая мысль в моей голове, когда я увидел в газете следующие строки. Цитирую.

Более подробная информация о Государственном образовательном заказе Правительства Ленинградской области находится на сайте www.goz.ucoz.ru

***Абзац пропущен из-за обилия мата и эмоций*** :mrgreen:

Ну, проще говоря, отожгли ребята. Такие вещи и размещают на домене 3 уровня, на бесплатном хостинге, так ещё и с рекламой в верхнем правом углу. Ну не стыдно им? Даже я, когда запускал этот блог в июне 2008, нашёл 250 рублей на хостинг и регистрацию доменного имени второго уровня, а тут Государственный заказ Правительства Ленинградской области и на укозе…. А почему не на народе или не в жж? Тут моднее.. Понятно..

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

Вывод данного поста таков: если вы хотите сделать что-то серьёзное, то подходите к делу серьезно со всех сторон. Особенно это касается такого не мало важного фактора как доверие, которое, в первую очередь, слагается из доменного имени и «места жительства» сайта.

___________________

Красивый и короткий номер ICQ (uin) — тоже вызывает некоторое доверие т.к. получить номер icq, например, 7 значный, можно только купив их. Это связано с большим количество пользователей, поэтому все номера до 9 знаков уже заняты и зарегистрировать их бесплатно не предоставляется возможным. Поэтому, повторюсь, единственный способ, получить uin длинной менее 9 символов — покупка. Тем более, если вы вложили деньги в покупку icq, то это значит что вы настроены более, чем серъёзно, раз вкладываете деньги.

Блогосфера

Эстафета «какими кошельками ты пользуешься?»

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

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

Из электронных кошельков я пользуюсь только Webmoney.

Теперь перейду к реальным кошелькам. Чтобы не описывать их я покажу фото моих кошельков. Их у меня два. Второй имеет «лучшую степень защиты», благодаря отвлекающему мысли «оформлению». :mrgreen:

Джинсы

Рваные джинсы

Проще говоря, я ношу все необходимые мне вещи в карманах. Обычно их не много и они все с лёгкостью вмещаются в стандартные 4 кармана джинс. Деньги и документы ношу там же.

Вот такой вот неожиданный поворот эстафеты. ;-)

Передаю эстафету «блогу в помощь блогерам«, «Антикорпоративу«, «Запискам лондонского бурундука-фрилансера» и всем желающим. Не забывайте ставить ссылку на того, от кого получили эстафету.

Блогосфера

Блогосфера сегодня