Блог

● Проект 29: Работа с Интернетом на примере Arduino Ethernet shield W5100

Опубликовано: 23.04.2018
В этом эксперименте мы покажем, как нашей плате Arduino получить доступ к сети Интернет с помощью модуля Ethernet shield W5100.

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

контроллер Arduino UNO R3;
плата для прототипирования;
модуль Ethernet shield W5100;
светодиод – 2 шт.;
резистор 220 Ом – 2 шт.;
провода папа-папа.

Ethernet Shield позволяет легко подключить вашу плату Arduino к локальной сети или сети Интернет. Он предоставляет возможность Arduino отправлять и принимать данные из любой точки мира с помощью интернет-соединения. Например, можно реализовать удаленное управление вашими исполнительными устройствами, подключенными к реле, через веб-сайт или создать устройство, которое с помощью звукового сигнала оповестит вас о новом электронном письме.
В первой части эксперимента рассмотрим использование платы Arduino с подключенным Ethernet Shield в качестве сервера, выдающего клиенту (браузеру) веб-страницу и позволяющего запросами с браузера изменять состояния подключенного к Arduino светодиода.
Подключаем к плате Arduino Ethernet shield, а к выводам D7, D8 – светодиоды через резистор 220 Ом (см. рис. 29.1).

Схема подключения модуля Ethernet shield и светодиодов
Рис. 29.1. Схема подключения модуля Ethernet shield и светодиодов

При написании скетча используем встроенную в Arduino IDE библиотеку Ethernet.
Содержимое скетча показано в листинге 29.1.

#include <SPI.h>
#include <Ethernet2.h>
// mac-адрес платы и ip-адрес сервера
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,7);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
int pins[] = { 7, 8}; // Пины для светодиодов
int pinState[] = {0, 0}; // Состояние пинов
String getData="";
boolean startGet=false;
void setup()
{
Serial.begin(9600);
for(int i=0;i<2;i++)
{
pinMode(pins[i],OUTPUT); // контакты подключения светодиодов
digitalWrite(i,LOW); // выключить светодиоды
}
// инициализации библиотеки Ethernet server
Ethernet.begin(mac, ip);
server.begin();
}
void loop()
{
// ожидание подключения клиентов
EthernetClient client = server.available();
if (client)
{
boolean currentLineIsBlank = true;
while (client.connected())
{
if (client.available())
{
char c = client.read();
if(startGet==true) // данные после '?'
getData+=c;
if(c == '?') // начало сбора данных после '?'
startGet=true;
if (c == '\n' && currentLineIsBlank) // окончание получения
{
if(getData.length()<1) // запрос без get-данных
{
pinState[0]=0;
pinState[1]=0;
}
else
{
pinState[0]=int(getData[5])-48;
pinState[1]=int(getData[12])-48;
}
// отправка заголовков клиенту
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// формирование страницы ответа
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<h3>Ethernet shield + LEDS</h3>");
client.println("<form method='get'>");
// светодиод 1
client.print("<div>");
client.print("led1 off<input type='radio' name='led1' value=0 onclick='document.getElementById(\"submit\").click();' ");
if (pinState[0] == 0)
client.print("checked");
client.println(">");
client.print("<input type='radio' name='led1' value=1 onclick='document.getElementById(\"submit\").click();' ");
if (pinState[0] == 1)
client.print("checked");
client.println("> on");
client.println("</div>");
// светодиод 2
client.print("<div>");
client.print("led2 off<input type='radio' name='led2' value=0 onclick='document.getElementById(\"submit\").click();' ");
if (pinState[1] == 0)
client.print("checked");
client.println(">");
client.print("<input type='radio' name='led2' value=1 onclick='document.getElementById(\"submit\").click();' ");
if (pinState[1] == 1)
client.print("checked");
client.println("> on");
client.println("</div>");
client.println("<input type='submit' id='submit' style='visibility:hidden;' value='Refresh'>");
client.println("</form>");
client.println("</html>");
break;
}
if (c == '\n')
{currentLineIsBlank = true;}
else if (c != '\r')
{currentLineIsBlank = false;}
}
}
}
// задержка для получения клиентом данных
delay(1);
// закрыть соединение
client.stop();
for(int i=0;i<2;i++) // светодиоды включить или выключить
{digitalWrite(pins[i],pinState[i]);}
startGet=false;
getData="";
}

 

Порядок подключения:
1. Подключаем Ethernet shield к плате Arduino, с помощью кабеля RJ45 подключаем Ethernet shield к сети.
2. Подключаем светодиоды по схеме на рис. 29.1.
3. Загружаем в плату Arduino скетч из листинга 29.1.
4. Открываем браузер на любом компьютере данной сети и в адресной строке набираем http://192.168.0.214 (тот адрес, который вы присваиваете Arduino в скетче).
5. На странице (рис. 29.2), изменяя статус элементов input radio, видим изменение состояния светодиодов, подключенных к плате Arduino.


Рис. 29.2. Веб-страница, формируемая Arduino-сервером

Листинги программ скачать

Для работы шилда на W5500, потребуется установка библиотеки Ethernet2 (https://www.arduino.cc/en/Reference/Ethernet).



 

Читать далее

● Проект 28: Считыватель RFID на примере RC522. Принцип работы, подключение

Опубликовано: 23.04.2018
В этом эксперименте мы покажем, как плата Arduino получает доступ к данным RFID-карт и брелоков Mifare с помощью RFID-считывателя RC522C.

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

контроллер Arduino UNO R3;
плата для прототипирования;
RFID-считыватель RC522;
брелок;
карта;
провода папа-папа.

Радиочастотная идентификация (RFID) – это технология автоматической бесконтактной идентификации объектов при помощи радиочастотного канала связи. Базовая система RFID состоит из:

• радиочастотной метки;
• считывателя информации (ридера);
• компьютера для обработки информации.

Идентификация объектов производится по уникальному цифровому коду, который считывается из памяти электронной метки, прикрепляемой к объекту идентификации. Считыватель содержит в своем составе передатчик и антенну, посредством которых излучается электромагнитное поле определенной частоты. Попавшие в зону действия считывающего поля радиочастотные метки «отвечают» собственным сигналом, содержащим информацию (идентификационный номер товара, пользовательские данные и т. д.). Сигнал улавливается антенной считывателя, информация расшифровывается и передается в компьютер для обработки. Подавляющее большинство современных систем контроля доступа (СКД) использует в качестве средств доступа идентификаторы, работающие на частоте 125 кГц. Это проксимити-карты доступа (только чтение), самыми распространенными являются карты EM-Marin, а также HID, Indala. Карты этого стандарта являются удобным средством открывания дверей и турникетов. Но не более. Эти карты не обладают никакой защищенностью, легко копируются и подделываются и, соответственно, ничего не дают для защиты объекта от несанкционированного проникновения.

Настоящую защиту от копирования и подделки обеспечивают такие идентификаторы, в чипах которых реализована криптографическая защита. Это бесконтактные смарт-карты, работающие на частоте 13,56 МГц, наиболее распространенными из них являются карты Mifare®. В картах этих стандартов криптозащита организована на высоком уровне, и подделка таких карт практически невозможна.

Модуль RC522 – RFID-модуль 13,56 МГц с SPI-интерфейсом. В комплекте к модулю идут 2 RFID-метки – в виде карты и брелока.

Основные характеристики:

• основан на микросхеме MFRC522;
• напряжение питания: 3,3 В;
• потребляемый ток: 13–26 мА;
• рабочая частота: 13,56 MГц;
• дальность считывания: 0~60 мм;
• интерфейс: SPI, максимальная скорость передачи 10 МБит/с;
• размер: 40×60 мм;
• чтение и запись RFID-меток.

Схема подключения модуля к плате Arduino показана на рис. 28.1.
Схема подключения модуля RFID-считывателя RC522C к Arduino
Рис. 28.1. Схема подключения модуля RFID-считывателя RC522C к Arduino

Напишем скетч считывания с карты и вывода в последовательный порт Arduino UID (уникальный идентификационный номер) RFID-метки (карты или брелока). При написании скетча будем использовать библиотеку MFRC522 (https://github.com/miguelbalboa/rfid). Содержимое скетча показано в листинге 28.1.

// Подключение библиотек
#include <SPI.h>
#include <MFRC522.h>
// константы подключения контактов SS и RST
#define RST_PIN 9
#define SS_PIN 10
// Инициализация MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
void setup()
{
Serial.begin(9600); // инициализация последовательного порта
SPI.begin(); // инициализация SPI
mfrc522.PCD_Init(); // инициализация MFRC522
}
void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// чтение карты
if ( ! mfrc522.PICC_ReadCardSerial())
return;
// показать результат чтения UID и тип метки
Serial.print(F("Card UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print(F("PICC type: "));
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
delay(2000);
}
// Вывод результата чтения данных в HEX-виде
void dump_byte_array(byte *buffer, byte bufferSize)
{
for (byte i = 0; i < bufferSize; i++)
{
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}

Порядок подключения:

1. Подключаем модули RFID-считывателя RC522 к плате Arduino по схеме на рис. 28.1.
2. Загружаем в плату Arduino скетч из листинга 28.1. Открываем монитор последовательного порта.
3. Подносим метку (карту или брелок) к считывателю и видим вывод в последовательный порт данных метки UID и тип (рис. 28.2).

Рис. 28.2. Вывод в последовательный порт информации о метках


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

// Подключение библиотек
#include <SPI.h>
#include <MFRC522.h>
// константы подключения контактов SS и RST
#define RST_PIN 9
#define SS_PIN 10
// Инициализация MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
MFRC522:MIFARE_Key key;
byte sector = 1;
byte blockAddr = 4;
byte dataBlock[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte trailerBlock = 7;
byte status;
byte buffer[18];
byte size = sizeof(buffer);
void setup()
{
Serial.begin(9600); // инициализация последовательного порта
SPI.begin(); // инициализация SPI
mfrc522.PCD_Init(); // инициализация MFRC522
// Значение ключа (A или B) – FFFFFFFFFFFFh значение с завода
for (byte i = 0; i < 6; i++)
key.keyByte[i] = 0xFF;
}
void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// чтение карты
if ( ! mfrc522.PICC_ReadCardSerial())
return;
// показать результат чтения UID и тип метки
Serial.print(F("Card UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print(F("PICC type: "));
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
// Чтение данных из блока 4
Serial.print(F("Reading data from block "));
Serial.print(blockAddr);
Serial.println(F(" ..."));
Serial.print(F("Data for count ")); Serial.print(blockAddr);
Serial.println(F(":"));
dump_byte_array(buffer, 2); Serial.println();
Serial.println();
for (byte i = 0; i < 16; i++) // запись в buffer[]
dataBlock[i]=buffer[i];
// получение байт счетчика (0 и 1)
int count1=(buffer[0]<<8)+buffer[1];
Serial.print("count1=");Serial.println(count1);
count1=count1+1; // инкремент счетчика
dataBlock[0]=highByte(count1);
dataBlock[1]=lowByte(count1);
// Аутентификация key B
Serial.println(F("Authenticating again using key B..."));
// Запись данных в блок
Serial.print(F("Writing data into block "));
Serial.print(blockAddr);
Serial.println(F(" ..."));
dump_byte_array(dataBlock, 2); Serial.println();
}
// Вывод результата чтения данных в HEX-виде
void dump_byte_array(byte *buffer, byte bufferSize)
{
for (byte i = 0; i < bufferSize; i++)
{
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}


Порядок подключения:

Рис. 28.3. Вывод в последовательный порт информации о счетчике на метках
 
Листинги программ скачать


Читать далее

● Проект 27: SD-карта. Чтение и запись данных

Опубликовано: 23.04.2018
В этом эксперименте мы покажем, как к плате Arduino подключить SD-карту.

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

контроллер Arduino UNO R3;
плата для прототипирования;
модуль SD-card;
модуль часов реального времени DS1307 с батарейкой;
• датчик температуры LM335;
резистор 2,2 кОм;
провода папа-папа.

Если вашим Аrduino-проектам не хватает памяти, а объем энергонезависимой памяти EEPROM в платах Arduino совсем небольшой, можно использовать внешние носители. Один из самых простых по подключению к платам Arduino – это SD-карта. Можно подсоединиться к SD-карте напрямую, а можно использовать модули.
Подсоединим модуль SD-card к плате Arduino и напишем пример сохранения на SD-карте данных аналогового датчика температуры LM335. Для анализа данных температуры потребуется знать и время измерения данных, поэтому будем использовать и модуль часов реального времени RTC. Соберем схему, показанную на рис. 27.1.

Рис. 27.1. Схема подключения модулей SD-card и DS1307 к Arduino

При написании скетча используем библиотеку SD для работы с SD-картой, а также библиотеки Time и DS1307 для работы с модулем RTC. Содержимое скетча показано в листинге 27.1. Каждые 5 минут мы считываем данные с датчика LM335, подключенного к аналоговому входу A0, и заносим время измерения и данные температуры в файл вида d-m-Y. В начале суток создаем новый файл на новый день.

Листинг 27.1

// подключение библиотек для RTC
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
// подключение библиотеки для SD
#include <SD.h>
File myFile;
String sfilename;
char filename[20];
const int LM335=A0; // для подключения LM335
tmElements_t tm;
unsigned long millis1=0;
void setup()
{;}
void loop()
{
// проверка прошло 5 минут?
if(millis()-millis1>5*60*000)
{
millis1=millis();
// получить имя файла для текущего дня
sfilename=get_file_name();
sfilename.toCharArray(filename,20);
// открыть файл или создать
myFile = SD.open(filename, FILE_WRITE);
// получить температуру
double val = analogRead(lm335); // чтение
double voltage = val*5.0/1024; // перевод в вольты
double temp = voltage*100 - 273.15; // в градусы Цельсия
// получить время H:m
// создать запись для файла
record=get_time();
record+=" ";
record+=String(temp);
myFile.println(record);
myFile.close();
}
// получение времени дня
String get_time()
{
String time1;
RTC.read(tm);
if(tm.Hour()<10)
time1="0"+String(tm.Hour(),DEC);
else
time1=String(tm.Hour(),DEC);
if(tm.Minute()<10)
time1+=":0"+String(tm.Minute(),DEC);
else
time1+=":"+String(tm.Minute(),DEC);
return time1;
}


Порядок подключения:

1. Подключаем модули SD card, DS1307 и датчик температуры LM335 к плате Arduino по схеме на рис. 27.1.
2. Загружаем в плату Arduino скетч из листинга 27.1. Ждем продолжительное время, затем вынимаем карту, вставляем в компьютер, открываем файл, соответствующий текущему дню, и смотрим его содержимое – по строкам времени замера и показания температуры.

Листинги программ скачать




 
Читать далее

● Проект 26: Часы реального времени. Принцип работы, подключение, примеры

Опубликовано: 23.04.2018
В этом эксперименте мы рассмотрим модуль часов реального времени на микросхеме DS1307.

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

контроллер Arduino UNO R3;
плата для прототипирования;
модуль часов реального времени DS1307;
батарейка CR2032 3 В;
ЖКИ WH1602;
• потенциометр 10 кОм;
резистор 51 Ом;
провода папа-папа.
внешний блок питания +5 В.

Микросхема Dallas DS1307 представляет собой часы реального времени с календарем и дополнительной памятью NW SRAM (56 байт). Микросхема подключается к микроконтроллеру при помощи шины I2C. Количество дней в месяце рассчитывается с учетом високосных лет до 2100 г. В микросхеме DS1307 имеется встроенная схема, определяющая аварийное отключение питания и автоматически подключающая резервную батарейку. При этом отсчет времени продолжается, и после восстановления питания часы показывают правильное время. Также в этой микросхеме имеется программируемый генератор прямоугольных импульсов, позволяющий вырабатывать одну из четырех частот (1 Гц, 4096 Гц, 8192 Гц или 32768 Гц).

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

• Uno, Nano – A4 (SDA), A5 (SCL);
• Mega2560 – 20 (SDA), 21 (SCL);
• Leonardo – 2 (SDA), 3 (SCL).

Вывод SDA часов подключается к выводу SDA контроллера. SDL часов – соответственно, к SDL контроллера. В нашем эксперименте мы будем выводить дату и время, получаемые с микросхемы DS1307, на экран LCD индикатора WH1602. Схема подключения показана на рис. 26.1.
Рис. 26.1. Схема подключения модуля DS1307 и WH1602 к Arduino

При написании скетча используем библиотеку Time, которая является «оберткой» для библиотеки DS1307, и библиотеку Wire для работы с I2C-устройствами. Для работы с ЖКИ используем библиотеку LiquidCrystal. Содержимое скетча показано в листинге 26.1.

 
// подключение библиотек для RTC
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
// подключение библиотеки для lcd
#include <LiquidCrystal.h>
// инициализация с указанием контактов подключения
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
void setup()
{
lcd.begin(16, 2); // установить размерность дисплея
}
void loop()
{
tmElements_t tm;
if (RTC.read(tm)) // получение времени
{
print2digits(tm.Hour,0,0);
lcd.print(":");
print2digits(tm.Minute,3,0);
lcd.print(":");
print2digits(tm.Second,6,0);
print2digits(tm.Day,0,1);
lcd.print("/");
print2digits(tm.Month,3,1);
lcd.print("/");
lcd.print(tmYearToCalendar(tm.Year));
}
else
{
if (RTC.chipPresent())
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DS1307 is stopped");
}
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DS1307 read error");
}
delay(9000);
}
delay(1000);
}
// процедура вывода на дисплей с добавлением до двух цифр
void print2digits(int number,int col, int str)
{
lcd.setCursor(col, str);
if (number >= 0 && number < 10)
{lcd.print("0");}
lcd.print(number);
}


Порядок подключения:

1. Подключаем модуль DS1307 и ЖКИ к плате Arduino по схеме на рис. 26.1.
2. Загружаем в плату Arduino скетч из листинга 26.1.
3. Смотрим на экране ЖКИ меняющееся ежесекундно время и дату. Однако на экране дисплея мы видим неверное время и неверную дату. Дело в том, что при отсутствии питания значение времени в микросхеме DS1307 сбрасывается на 00:00:00 01/01/2000. Чтобы при отключении питания время не сбрасывалось, предусмотрено аварийное питание модуля от батарейки 3 В.
Для установки времени в библиотеке есть функция RTC.write (tmElements_t tm). Добавим в скетч возможность установки данных RTC по последовательному порту отправкой строки вида «dd/mm/ YYYY hh:mm:ss».
Содержимое скетча показано в листинге 26.2.

Листинг 26.2

// подключение библиотек для RTC
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
// подключение библиотеки для lcd
#include <LiquidCrystal.h>
// инициализация с указанием контактов подключения
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
// строка, собираемая из данных, приходящих в последовательный порт
String inputString = "";
boolean stringComplete = false; // флаг комплектности строки
void setup()
{
Serial.begin(9600); // запустить последовательный порт
lcd.begin(16, 2); // установить размерность дисплея
}
void loop()
{
tmElements_t tm;
// ожидание конца строки для анализа поступившего запроса:
if (stringComplete)
{
tm.Day=(int(inputString[0])-48)*10+(int(inputString[1])-48);
tm.Month=(int(inputString[3])-48)*10+(int(inputString[4])-48);
tm.Year=CalendarYrToTm((int(inputString[6])-
48)*1000+(int(inputString[7])-48)*100+
(int(inputString[8])-48)*10+(int(inputString[9])-48));
tm.Hour=(int(inputString[11])-48)*10+(int(inputString[12])-48);
tm.Minute=(int(inputString[14])-48)*10+(int(inputString[15])-48);
tm.Second=(int(inputString[17])-48)*10+(int(inputString[18])-48);
RTC.write(tm); // записать время в RTC
// очистить строку
inputString = "";
stringComplete = false;
}
if (RTC.read(tm))
{
print2digits(tm.Hour,0,0);
lcd.print(":");
print2digits(tm.Minute,3,0);
lcd.print(":");
print2digits(tm.Second,6,0);
print2digits(tm.Day,0,1);
lcd.print("/");
print2digits(tm.Month,3,1);
lcd.print("/");
lcd.print(tmYearToCalendar(tm.Year));
}
else
{
if (RTC.chipPresent())
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DS1307 is stopped");
}
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DS1307 read error");
}
delay(9000);
}
delay(1000);
}
// процедура вывода на дисплей с добавлением до двух цифр
void print2digits(int number,int col, int str)
{
lcd.setCursor(col, str);
if (number >= 0 && number < 10)
{lcd.print("0");}
lcd.print(number);
}
// получение данных по последовательному порту
void serialEvent()
{
while (Serial.available())
{ // получить очередной байт:
char inChar = (char)Serial.read();
// добавить в строку
inputString += inChar;
// /n - конец передачи
if (inChar == '\n')
{stringComplete = true;}
}
}

Теперь установим время из монитора последовательного порта отправкой строки «dd/mm/YYYY hh:mm:ss» и увидим на экране дисплея отображение верной даты и времени.

Листинги программ скачать







 
Читать далее

Главное меню

Каталог

Полезные ссылки

Цена
от
до