Микроконтроллеры и электроника

Устраняем программно дребезг кнопок и переключателей

Кнопки и прочие переключатели — являются неотъемлемой частью, практически любого устройства. Однако, реализация этих устройств приводит к такому нежелательному явлению для микроконтроллерной техники, как дребезг контактов. Что такое дребезг? Давайте разбираться!

(далее…)

Микроконтроллеры и электроника

Arduino: работаем с SD картами

Здравствуйте, уважаемые! Снова я пишу пост про Arduino – это связано с тем, что на днях мне по почте пришёл, заказанный мною в начале июля, модуль для работы с SD-картами.  Поэтому, в этом посте я расскажу, как усовершенствовать, сделанный нами в прошлом, датчик для измерения температуры, а именно – мы избавим себя от надобности копирования данных из консоли вывода в Excel для дальнейшего анализа, заставив Arduino сохранять данные на SD-карту в виде csv-файла.  Данные будут записываться в файл в два столбца – в первом будут единицы времени (или просто номер строки), а во втором значение напряжения на термисторе или ином датчике, которое, как Вы помните, пропорционально температуре.

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

Собираем схему

Описывать схему сборки измерителя температуры я не буду, если Вы забыли или не знаете как его собирать – обратитесь к посту, ссылка на который указана в предыдущем разделе этого поста. (Картинка) Рассмотрим схему подключения SD модуля. Каждый модуль имеет следующие контакты: GND, 5V, 3V (3.3V), CS, MOSI, SCLK (SCK), MISO, GND. Подключим некоторые из этих контактов к следующим контактам Arduino:

  • GND – к земле с Arduino
  • 5V разъём к 5 вольтовому разъёму Arduino. (Аналогично 3.3V) Подключать оба разъёма одновременно – бессмысленно, я подключаю только 5V.
  • CS – к 4 разъёму (все разъёмы SD модуля подключаются ТОЛЬКО к цифровым выходам – никаких аналоговых здесь быть не должно!)
  • MOSI – к 11 разъёму
  • SCLK (SCK) – к 13 разъёму
  • MISO – к 12 разъёму
  • Ещё один GND – никуда не подключаем

На этом наше подключение окончено. Для подключения можете использовать макетную плату – просто втыкаете туда SD модуль и в правильном порядке протягиваете провода от соответствующих дорожек к нужным разъёмам.

Подготавливаем SD-карту

SD модуль работает только с SD картами, отформатированными под файловую систему FAT16 или FAT32. Карту необходимо заранее отформатировать на компьютере. БУДЬТЕ ВНИМАТЕЛЬНЫ! При форматировании все данные, находящиеся на носителе, будут уничтожены! Не забудьте переписать их в другое место перед форматированием!

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

// Подключаем библиотеку для работы с шиной SPI (необходима для работы библиотеки SD)
#include <SPI.h>
// Подключаем библиотеку для работы с SD-картами
#include <SD.h>

File myFile;
// Задаём начальное время (точку отсчёта)
int time = 0;
// Указываем номер аналогового разъёма для считывания данны
int tempPin = 0;

void setup()
{
 // Открываем serial порт
  Serial.begin(9600);
  // Выдаём сообщение о том, что начинается инициализация SD-карты
  Serial.print("Initializing SD card...");
   pinMode(10, OUTPUT);
   // Проверяем готовность SD модуля. Если модуль не готов - выдаём сообщение
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  // Проверяем, существует ли на карте файл data.csv, если существует, то удаляем его.
  if(SD.exists("data.csv")) {
    SD.remove("data.csv");
  }
  // Выводим сообщение о том, что инициализация прошла успешно
  Serial.println("initialization done.");
}

void loop()
{
    // Считываем данные (напряжение) с нулевого аналогового разъёма.
    int temp = analogRead(tempPin);
    // Увеличиваем значение времени (номер строки) на единицу. Если вы будете записывать данные раз в минуту, но хотите чтобы время записывалось в секундах - прибавляйте не единицу, а 60.
    time = time + 1;
  // Открываем файл data.csv для записи
  myFile = SD.open("data.csv", FILE_WRITE);
  // Если удалось открыть файл для записи, то записываем данные
  if (myFile) {
    // Выводим данные на экран
    Serial.print(time);
    Serial.print("; ");
    Serial.println(temp);
    // Записываем время
    myFile.print(time);
    // Добавляем точку с запятой
    myFile.print(";");
    // Добавляем температуру и добавляем перенос строки
    myFile.println(temp);
    // закрываем файл
    myFile.close();
  } else {
    // Выводим сооб щение о том, что открыть файл не удалось
    Serial.println("error opening data.csv");
  }
  // Повторяем считывание данных с датчика и запись на флэш-карту через одну секунду
  delay(1000);
}

Загружаем наш скетч в Arduino, запускаем консоль (ctrl+shift+M) в среде Arduino и видим на экране каждую секунду две пары значений – номер строки (или же время) и значение напряжение, соответствующее данной температуре. Подождите, например, 10 секунд и отключите питание от Arduino. Извлеките карточку и вставьте её в компьютер. На карте у вас будет файл data.csv, открыв который в Excel вы увидите 2 столбика значений, что и в консоли Arduino. Теперь вы можете построить график или рассчитать среднее значение температуры в вашей комнате за какой-то промежуток времени.

На этом всё, задавайте свои вопросы мне в комментариях к этому посту, до скорых встреч!

Микроконтроллеры и электроника

Измеритель температуры с Arduino

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

Для этого нам понадобятся следующие компоненты нашего Arduino

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

  • Резистор 10 [кОм]
  • Резистор 220 [Ом]
  • Термистор
  • Светодиод

Собираем схему

Схема подключение будет такая же, как и в предыдущем посте, контакт A подключаем к 5 вольтовому разъёму Arduino, контакт B к земле, а контакт b к первому аналоговому разъёму Arduino (A0). Вместо первого резистора подключаем термистор, а второй так и оставляем — резистор на 10 [кОм]. Кроме того, нам необходимо ещё подключить светодиод — запитываем его из 11 порта и соединяем через резистор 220 [Ом] с землёй.

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

// Указываем номер порта для датчика температуры (А0)
int tempPin = 0;
// Указываем номер порта для светодиода
int ledPin = 11;

//  Описываем настройки программы
void setup() {
  // Устанавливаем порт ledPin как выход
  pinMode(ledPin, OUTPUT);

  // Запускаем чтение данных с сериал порта со скоростью 9600 бод\сек (стандартная скорость)
  Serial.begin(9600);
}

//  Описываем цикл программы
void loop() {
  // Считываем значение с аналогового порта
  int temp = analogRead(tempPin);
  // Выводим на монитор считанное значение (ctrl+shift+M для просмотра консоли)
  Serial.println(temp);
  // Делаем задержку на 1 секунду
  delay(1000);

  // "обрезаем" значения температуры в пределах от 316 до 336. Всё что меньше нижнего предела станет равно 316, а всё что больше - 336
  temp = constrain(temp, 316, 336);
  // Соотносим шкалы: при значении переменной temp 316 - значение ledLevel будет равно 0, ну а при 336 - 255.
  int ledLevel = map(temp, 316, 336, 0, 255);

  // Передаём значение на светодиод
  analogWrite(ledPin, ledLevel);
}

Вот и всё! Таким образом, мы каждую секунду будем получать циферку в консоли (ctrl+shift+M), соответствующую изменению температуры, и в определённом интервале температуры наш светодиод будет гореть тем интенсивнее (или не гореть вообще), чем ближе температура к верхней границе этого интервала.

Аналогичным образом можно сделать простой ночник, который будет регулировать яркость светодиода в зависимости от освещённости в комнате. Всё что надо будет для этого поменять, так это заменить термистор на фоторезистор, и в функции map пере обозначить соответствие шкал — при увеличении освещённости — уменьшать к нулю яркость светодиода, и наоборот.

А какие результаты получились у вас? Пишите ваши комментарии, вопросы, пожелания и предложения в комментариях к этому посту — я обязательно на них отвечу.  И не забывайте рассказать о серии моих постов об Arduino вашим друзьям. До скорых встреч!

Микроконтроллеры и электроника

Всё о делителях напряжения

Всё о делителях напряжения

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

Название говорит само за себя — делитель напряжения позволяет имея одно напряжение на входе цепи — разделить его на части. Как он работает? Очень просто! Чтобы собрать делитель напряжения нам понадобиться:

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

  • 2 Резистора на 10 [кОм]
  • Ручка
  • Листок бумаги 🙂

Схема и принцип работы делителя напряжения


Взгляните на схему. Допустим, между точками А и С приложено напряжение Up. Согласно второму закону Кирхгофа, вытекающего из закона сохранения энергии и «баланса мощностей» в данной цепи возникнет ток. Второй закон Кирхгофа говорит, что сумма падений напряжения на каждом элементе цепи равно сумме ЭДС в этой цепи.
Выразим отсюда ток, протекающий в нашей цепи.
Идём дальше! Зная ток, протекающий через резисторы, мы в два счёта находим  падения напряжения на этих элементах. Напишу формулу для расчёта падения напряжения на резисторе R1:

 

Аналогично напишите сами для резистора R2 (полезно для понимания). Подсказка: ответ будет тот же, но решение иным. Как мы видим, на первом резисторе падает половина напряжения и вторая половина на втором резисторе.  Отсюда следует, что в точке В мы имеем половину напряжения Up, что можно выразить также двумя способами. Первый способ — взять потенциал в точке C (Uc) и прибавить к нему падение напряжения UR2 на резисторе R2. Тут мы полагаем, что потенциал точки С нулевой, а точки А соответствует нашей ЭДС цепи.

Второй способ: взять потенциал в точке А и вычесть из него падение напряжения UR1 на резисторе R1


Поскольку резисторы у нас одинаковые, то и результат мы получаем одинаковый — половина ЭДС. Но что будет, если взять резистор R2 = 2R1 = R? Расписываем по аналогии  с самого начала и получаем

 

R в правой части сократятся и мы получим потенциал в точке В равный 2/3 от ЭДС.

Зачем это надо?

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

Также, можно просто понизить напряжение, например, если вам надо измерить напряжение в цепи +12 В с помощью АЦП микроконтроллера, который может измерять лишь в диапазоне от 0 до +5В. Собираете делитель, так чтобы при максимально возможном напряжении в цепи, в его средней точке напряжение не превышало максимально возможного для АЦП.

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

 

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