Pollife.ru

Стройка и ремонт
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Записки электронщика

Записки электронщика

Блог посвящен радиоэлектронике, микроконтроллерам, платформе Arduino, а также частично программированию.

суббота, 19 февраля 2011 г.

Arduino: изучаем протокол 1-Wire и iButton

Потёр площадку фломастером и становится видна заветная надпись:

iButton.com
00000F67CE41
1-Wire
0744 UB1 DS1990A #F5

Ага! 1-Wire!
Так что же это за интерфейс?
Это однопроводной интерфейс, разработан фирмой Dallas Semiconductor (ныне MAXIM) в конце 90-х годов.

Этот интерфейс интересен тем, что для двустороннего обмена требуется всего одна линия! (отсюда и название 🙂

Подробнее об интерфейсе здесь.

Возвращаемся к нашему ключу 🙂 На самой таблетке указан тип устройства и, похоже, уникальный номер микросхемы 😉

DS1990A – это и есть название нашего устройства.

Смотрим варианты iButton-ов на сайте производителя
Наш ключ — это самая первая модель в списке 🙂
DS1990A — 64 Bit ID — уникальный серийный номер-ключ
Страничка этого ключика здесь, а здесь можно скачать датащит 😉

Число после # определяет форм-фактор ключа – у меня F5.

Итак, наш ключ хранит 64 бита уникальной информации
Питается от 2.8V до 6.0V
К центральной контактной площадке подключается линия данных, а к боковой каёмке – землю.
Ключ может работать в диапазоне температур от -40°C до +85°C – впрочем, это нам не нужно 🙂

Читаем датащит далее 🙂

Величина подтягивающего резистора рекомендуется в 2.2k
Так… запомним 🙂

Каждый DS1990A прошивается уникальным 64-битным номером

первые 8 бит — номер серии устройства (01h)следующие 48 бит — уникальный серийный номер
последние 8 бит — CRC-код предыдущих 56 бит информации 🙂

(Cyclic redundancy code, CRC — циклический избыточный код) — способ цифровой идентификации некоторой последовательности данных, который заключается в вычислении контрольного значения её циклического избыточного кода.

Далее в датащите перечислены команды, которые понимает ключ:
33h — считать ROM — команда позволяет считать заветные 64-бита данных ключа
F0h — поиск ROM — т.к. к сети 1-wire может быть подключено несколько устройств данная команда используется для идентификации подключённых устройств.
55h — соответствие ROM / CCh — пропуск ROM
— данные команды входят в минимальный набор необходимых команд 1-wire-устройств. Т.к. в ключе DS1990A эти команды не требуются — он на них не отвечает.

Arduino может работать с 1-Wire, используя библиотеку Jim Studt-а – OneWire.

Настало время пообщаться с нашим ключиком! 🙂

Схема подключения – крайне проста (это ведь 1-Wire! 🙂

Далее нужно скачать библиотеку OneWire и поместить её в свою директорию libraries.

Взаимодействие Arduino с датчиком звука и управление устройствами с помощью хлопков

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

Читайте так же:
Включение выключателя под нагрузкой

Взаимодействие Arduino с датчиком звука и управление устройствами с помощью хлопков Взаимодействие Arduino с датчиком звука и управление устройствами с помощью хлопков

Вы знаете, как работают электретные микрофоны?

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

Рисунок 1 – Работа электретного микрофона

Когда вы говорите в микрофон, звуковые волны, создаваемые вашим голосом, ударяют диафрагму, заставляя ее вибрировать.

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

При изменениях емкости изменяется и напряжение на пластинах, что позволяет измерить амплитуду звука.

Обзор аппаратного обеспечения

Звуковой датчик представляет собой небольшую плату, которая объединяет микрофон (50 Гц – 10 кГц) и схему обработки для преобразования звуковых волн в электрические сигналы.

Этот электрический сигнал подается на встроенный высокоточный компаратор LM393 для его оцифровки и выводится на выход (вывод OUT).

Рисунок 2 Регулировка чувствительности датчика звука и компаратора Рисунок 2 – Регулировка чувствительности датчика звука и компаратора

Для регулировки чувствительности выходного сигнала модуль содержит встроенный потенциометр.

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

Эта настройка очень полезна, когда вы хотите запустить какое-то действие при достижении определенного порога. Например, когда амплитуда звука пересекает пороговое значение (при обнаружении стука), вы можете активировать реле для управления освещением. Вот вам идея!

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

Рисунок 3 Светодиодные индикаторы питания и состояния Рисунок 3 – Светодиодные индикаторы питания и состояния

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

Распиновка звукового датчика

У данного датчика звука только три вывода:

Рисунок 4 Распиновка модуля звукового датчика Рисунок 4 – Распиновка модуля звукового датчика

Вывод VCC подает питание на датчик. Рекомендуется питать датчик напряжением от 3,3 до 5 В.

GND для подключения земли.

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

Подключение звукового датчика с Arduino

Давайте подключим звуковой датчик к Arduino. Подключение довольно простое. Для начала подключите вывод VCC на модуле к выводу 5V на Arduino, а вывод GND на модуле – к выводу GND Arduino. Теперь подключите вывод OUT к цифровому выводу 7 на Arduino. Вот и всё!

Читайте так же:
Выключатель врн 400 а3794 с азур

На следующем рисунке показана схема соединений.

Рисунок 5 Подключение датчика звука к Arduino Рисунок 5 – Подключение датчика звука к Arduino

Калибровка датчика звука

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

Для калибровки цифрового выхода (OUT) модуль содержит встроенный потенциометр.

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

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

Теперь ваш датчик откалиброван и готов к использованию.

Простой пример: обнаружение звука

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

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

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

Рисунок 6 Вывод работы скетча обнаружения хлопков Рисунок 6 – Вывод работы скетча обнаружения хлопков

Объяснение

Скетч начинается с объявления вывода Arduino, к которому подключен вывод OUT датчика.

Затем мы определяем переменную с именем lastEvent , которая хранит время с момента обнаружения хлопка. Это поможет нам устранить ложные срабатывания.

В функции setup() мы определяем сигнальный вывод, к которому подключен датчик, как входной. А также настраиваем последовательную связь с компьютером.

В функции loop() мы сначала читаем состояние цифрового вывода датчика.

Когда датчик обнаруживает какой-либо звук, достаточно громкий, чтобы пересечь пороговое значение, логический уровень выходного сигнала становится низким. Но мы должны убедиться, что звук вызван хлопками, а не случайным фоновым шумом. Итак, мы ждем 25 миллисекунд. Если логический уровень на выводе остается низким в течение более 25 миллисекунд, мы заявляем, что обнаружен хлопок.

Управление устройствами с помощью хлопков

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

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

Схема соединений

Схема соединений в этом проекте очень проста.

Предупреждение:
Данная схема взаимодействует с ВЫСОКИМ переменным напряжением сети 220 В. Неправильное подключение или использование может привести к серьезным травмам или смерти. Поэтому данный проект предназначен для людей, имеющих опыт работы и знающих о мерах техники безопасности при работе с высоким переменным напряжением.

Сначала необходимо подать питание на датчик и модуль реле. Подключите их выводы VCC к выводу 5V на Arduino, и выводы GND к выводу GND на Arduino.

Читайте так же:
Автоматические выключатели 2053 100а

Затем подключите выходной вывод (OUT) звукового датчика к цифровому выводу 7 на Arduino, а управляющий вывод (IN) на модуле реле к цифровому выводу 8 Arduino.

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

Схема соединений показана на следующем рисунке.

Рисунок 7 Схема подключения датчика звука и модуля реле к плате Arduino Рисунок 7 – Схема подключения датчика звука и модуля реле к плате Arduino

Код Arduino

Ниже приведен скетч для управления устройствами с помощью хлопков.

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

Объяснение

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

В начале мы объявляем вывод Arduino, к которому подключен вывод управления реле (IN). Мы также определили новую переменную relayState для хранения состояния реле.

В функции setup() мы настраиваем вывод relayPin как выходной.

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

Исправление проблем

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

Кодовой замок на Ардуино: подключение

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

Кодовой замок на Ардуино: принцип работы

кодовой замок на Ардуино

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

Что нужно для сборки

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

  1. Пучок провод для бреборда, 30 штук будет более чем достаточно.
  2. Далее нужно купить две вилки и розетки RJ45.
  3. L293D.
  4. Актуатор центрального замка. Можно использовать с ВАЗа – это оптимально по цене и функциональности.
  5. Геркон – его можно взять со старого окна, здесь сложностей нет.
  6. Нам еще понадобиться блок питания от хаба D-LINK на 12 Вольт.
  7. Пульт управления от охранной сигнализации, его можно найти в любом магазине с электроникой.
  8. Arduino protoshield + breadboard.
  9. Arduino UNO.
  10. Также не обойтись без шпингалета. Он должен иметь внушительный размер, чтобы не сделать ошибку во время его выбора смотрите фото дальше.
Читайте так же:
Как рассчитывается автоматический выключатель

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

Программирование кодового замка

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

  1. Password password= Password( “0000” );
  2. constbyte ROWS = 4;
  3. constbyte COLS = 3;
  4. charkeys[ROWS][COLS] = <
  5. <
  6. ‘1’,’2′,’3′ >
  7. ,
  8. <
  9. ‘4’,’5′,’6′ >
  10. ,
  11. <
  12. ‘7’,’8′,’9′ >
  13. ,
  14. <
  15. ‘*’,’0′,’#’ >
  16. >;
  17. byte rowPins[ROWS]= <
  18. 3, 4, 5, 6>;
  19. byte colPins[COLS]= <
  20. 7, 8, 9>;
  21. Keypad keypad=Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
  22. byte Closed=0;
  23. byte Gerkon=2;
  24. byte LedRed=12;
  25. byte LedGreen=13;
  26. byte MotorPin1=0;
  27. byte MotorPin2=1;
  28. byte MotorPinGo=11;
  29. boolean programMode=false;
  30. intspeakerPin= 10;
  31. voidsetup() <
  32. pinMode(MotorPin1,OUTPUT);
  33. pinMode(MotorPin2,OUTPUT);
  34. pinMode(LedRed,OUTPUT);
  35. pinMode(LedGreen,OUTPUT);
  36. pinMode(speakerPin,OUTPUT);
  37. pinMode(Gerkon,INPUT);
  38. digitalWrite(Gerkon,HIGH);
  39. digitalWrite(LedRed,LOW);
  40. digitalWrite(LedGreen,LOW);
  41. digitalWrite(MotorPin1,LOW);
  42. digitalWrite(MotorPin2,LOW);
  43. digitalWrite(MotorPinGo,LOW);
  44. addEventListener(keypadEvent);
  45. setDebounceTime(100);
  46. startupSound();
  47. >
  48. voidloop() <
  49. char key = getKey();
  50. if (Closed==1) <
  51. digitalWrite(LedRed,HIGH);
  52. digitalWrite(LedGreen,LOW);
  53. >
  54. else <
  55. digitalWrite(LedRed,LOW);
  56. digitalWrite(LedGreen,HIGH);
  57. >
  58. >
  59. voidkeypadEvent(KeypadEvent key) <
  60. switch (getState()) <
  61. case PRESSED:
  62. switch (key) <
  63. case ‘#’:
  64. guessPassword();
  65. digitalWrite(LedRed,LOW);
  66. break;
  67. case ‘*’:
  68. CloseBolt();
  69. digitalWrite(LedRed,LOW);
  70. digitalWrite(LedGreen,LOW);
  71. break;
  72. default :
  73. if (key != NO_KEY) <
  74. >
  75. append(key);
  76. digitalWrite(LedRed,HIGH);
  77. analogWrite(speakerPin,128);
  78. break;
  79. >
  80. break;
  81. case RELEASED:
  82. switch (key) <
  83. default :
  84. digitalWrite(LedRed, LOW);
  85. analogWrite(speakerPin, 0);
  86. break;
  87. >
  88. break;
  89. >
  90. >
  91. voidguessPassword() <
  92. if (evaluate()) <
  93. if (Closed==1) <
  94. digitalWrite(LedGreen,HIGH);
  95. OpenBolt();
  96. digitalWrite(LedGreen,LOW);
  97. reset();
  98. >
  99. >
  100. else <
  101. digitalWrite(LedGreen,LOW);
  102. reset();
  103. errorSound();
  104. >
  105. >
  106. voidstartupSound()
  107. <
  108. int note = (1/33)*500000;
  109. for (int _=0;_<100000/note;_++) <
  110. delayMicroseconds(note);
  111. digitalWrite(speakerPin, HIGH);
  112. delayMicroseconds(note);
  113. digitalWrite(speakerPin, LOW);
  114. >
  115. note = (1/25)*500000;
  116. for (int _=0;_<100000/note;_++) <
  117. delayMicroseconds(note);
  118. digitalWrite(speakerPin, HIGH);
  119. delayMicroseconds(note);
  120. digitalWrite(speakerPin, LOW);
  121. >
  122. note = (1/26)*500000;
  123. for (int _=0;_<100000/note;_++) <
  124. delayMicroseconds(note);
  125. digitalWrite(speakerPin, HIGH);
  126. delayMicroseconds(note);
  127. digitalWrite(speakerPin, LOW);
  128. >
  129. >
  130. voiderrorSound()
  131. <
  132. int n = 2000;
  133. for (int vez=0;vez<2;vez++) <
  134. for (int _=0;_<30;_++) <
  135. delayMicroseconds(n);
  136. digitalWrite(speakerPin, HIGH);
  137. delayMicroseconds(n);
  138. digitalWrite(speakerPin, LOW);
  139. >
  140. delay(50);
  141. >
  142. >
  143. voidopenSound()
  144. <
  145. int n = 300;
  146. for (int vez=0;vez<3;vez++) <
  147. for (int _=0;_<100;_++) <
  148. delayMicroseconds(n);
  149. digitalWrite(speakerPin, HIGH);
  150. delayMicroseconds(n);
  151. digitalWrite(speakerPin, LOW);
  152. >
  153. delay(100);
  154. >
  155. >
  156. voidOpenBolt()
  157. <
  158. if (Closed == 1) <
  159. digitalWrite(MotorPin1, LOW);
  160. digitalWrite(MotorPin2, HIGH);
  161. digitalWrite(MotorPinGo, HIGH);
  162. delay(30);

    digitalWrite(MotorPin1, LOW);

    1. digitalWrite(MotorPin2, LOW);
    2. digitalWrite(MotorPinGo, LOW);
    3. Closed=0;
    4. openSound();
    5. >
    6. >
    7. voidCloseBolt()
    8. <
    9. if (Closed == 0) <
    10. closeSound1();
    11. do
    12. <
    13. delay(1);
    14. > while (digitalRead(Gerkon)==1);
    15. delay(3000); //wait 3 seconds
    16. digitalWrite(MotorPin1, HIGH);
    17. digitalWrite(MotorPin2, LOW);
    18. digitalWrite(MotorPinGo, HIGH);
    19. delay(30);
    20. digitalWrite(MotorPin1, LOW);
    21. digitalWrite(MotorPin2, LOW);
    22. digitalWrite(MotorPinGo, LOW);
    23. Closed=1;
    24. closeSound2();
    25. >
    26. >
    27. voidcloseSound1()
    28. <
    29. int n = 200;
    30. for (int vez=0;vez<2;vez++) <
    31. for (int _=0;_<100;_++) <
    32. delayMicroseconds(n);
    33. digitalWrite(speakerPin, HIGH);
    34. delayMicroseconds(n);
    35. digitalWrite(speakerPin, LOW);
    36. >
    37. delay(100);
    38. >
    39. >
    40. voidcloseSound2()
    41. <
    42. int n = 450;
    43. for (int _=0;_<110;_++) <
    44. delayMicroseconds(n);
    45. digitalWrite(speakerPin, HIGH);
    46. delayMicroseconds(n);
    47. digitalWrite(speakerPin, LOW);
    48. >
    49. >

    Процесс сборки: фото и видео

    Изначально покажем вам несколько фото о том, как его собирать и устанавливать.

    кодовой замок на Ардуино подключение

    Вот так выглядит кодовой замок в сочетании с актуатором.

    блок питание кодогового замка

    Подключаем блок питания.

    шпингалет на кодовый замок

    Шпингалет, который и будет закрывать всю нашу конструкцию.

    Как подключить кодовый замок Arduino: видео


    Также читайте: как спрятать провода от компьютера.

    Много кнопок на одном пине. Урок 20. Ардуино

    Много кнопок на одном пине

    Привет! Как контролировать много кнопок на одном пине Ардуино. И как много кнопок можно подключить. Как разделить нажатия разных кнопок. Попробуем собрать схему и написать программу для такого разделения.

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

    Резисторы

    Дребезг кнопки

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

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

    Принципиальная схема исключения дребезга кнопки График нажатия кнопки через конденсатор

    Подключим несколько кнопок

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

    Принципиальная схема подключения многих кнопок и график нажатий

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

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

    График нажатий на кнопки

    Прерывание

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

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

    Напишем функцию, которая определит показания на аналоговом пине и выведет в монитор порта соответствующую подпись.

    Показания для каждой кнопки вы можете посмотреть в мониторе порта.

    Полный текст программы

    Финальная схема будет выглядеть таким образом.

    Принципиальная схема с прерыванием

    А программа таким

    Заключение

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

    голоса
    Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector