Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Arduino_labs

.pdf
Скачиваний:
159
Добавлен:
01.03.2016
Размер:
828.21 Кб
Скачать

31

//посылаем запрос на измерение температуры датчикам по Wire-шине sensors.requestTemperatures();

//выводим данные, полученные от датчика Dallas

//так как по Wire-шине подключено только одно устройство, то его //индекс равен нулю

Serial.print(sensors.getTempCByIndex(0));

Serial.print("\n\n");

}

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

Схема подключения:

Рисунок 3.5 – Схема подключения

Пример №2. В данном примере используется один светодиод и датчик Dallas 18b20. Яркость светодиода зависит от значения температуры, которое снимается с датчика. Значения преобразований сигналов подобраны таким образом, что если вы возьмёте в кулак датчик температуры и подержите его около 1-2 минут, то светодиод начнет плавно включатся и увеличивать яркость свечения.

#include <OneWire.h>

#include <DallasTemperature.h>

32

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire);

const int analogOutPin = 9;//Аналоговый выход, к которому подключен светодиод

//На аналоговые выходы подаются значения от 0 до 255. 0 соответствует //отсутствию напряжения, 255 – максимальному напряжению 5В. Данная функция //преобразует значение val из одного диапазона (from; to) пропорционально в //значение другого диапазона (rFrom; rTo)

float ConvertMap(float val, float from, float to, float rFrom, float rTo){ float d1, d2, vval;

float res;

d1 = to - from;

d2 = rTo - rFrom; vval = val - from;

res = vval / d1 * d2 + rFrom; if (res < rFrom){

return rFrom;

}

else if (res > rTo){ return rTo;

}

else{

return res;

}

}

void setup(void)

{

//start serial port Serial.begin(9600);

Serial.println("Dallas Temperature IC Control Library Demo");

//Start up the library

sensors.begin();

}

void loop(void)

{

//call sensors.requestTemperatures() to issue a global temperature

//request to all devices on the bus

Serial.print(" Requesting temperatures...\n"); sensors.requestTemperatures(); // Send the command to get temperatures

Serial.print("Temperature for Device is: ");

float t = sensors.getTempCByIndex(0); Serial.print(sensors.getTempCByIndex(0));

//Преобразуем полученные с датчика данные с диапазона от 30 до 80 градусов //по Цельсию в диапазон значений аналогового выхода (0; 255)

int outputValue = ConvertMap(t, 30, 80, 0, 255); Serial.print("\n");

Serial.print(outputValue);

analogWrite(analogOutPin, outputValue);

delay(10);

}

33

Схема подключения для данной программы:

Рисунок 3.6 – Схема подключения к примеру №2

Важно! К земле подключается короткая ножка светодиода. Также

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

Яркость светодиода в основном определяется небольшим приростом напряжения от нуля до 1.5-3В, в зависимости от типа применяемого светодиода. Дальнейшее увеличение яркости слабозаметное.

3.7 Газометр GazSensorV1.3.

Данный датчик используется для определения концентрации СО2 в воздухе. Датчик считывает значение через аналоговый выход (AOUT). При значение СО2 = 100 на датчике загорается лампочка.

34

Схема подключения к плате ARDUINO: Vcc 5V

Gnd Gnd

AOUTA0

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

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

const int ledPin = 13; /*

AnalogReadSerial

Reads an analog input on pin 0, prints the result to the serial

monitor.

Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

This example code is in the public domain. */

// the setup routine runs once when you press reset:

void setup() {

// initialize serial communication at 9600 bits per second: Serial.begin(9600);

pinMode(ledPin, OUTPUT);

}

// the loop routine runs over and over again forever: void loop() {

//read the input on analog pin 0: int sensorValue = analogRead(A0);

//print out the value you read: if (sensorValue >= 600)

{

digitalWrite(ledPin, HIGH);

}

else

{

digitalWrite(ledPin, LOW);

}

Serial.println(sensorValue);

delay(1000);

// delay in between reads for stability

}

3.8 Порядок выполнения работы

1)Ознакомиться с теоретическими сведениями.

2)Ознакомится со своим вариантом задания на лабораторную работу. Варианты заданий перечислены в таблице 3.1. вариант выбирается по последней цифре номера зачетки.

 

35

Таблица 3.1 – Варианты заданий

Задание

1, 2

Разработать устройство, которое зажигает один светодиод, когда

 

температура воздуха падает ниже определенного значения и

 

зажигает второй светодиод, когда температура превышает

 

некоторое значение. Значения выбирать самостоятельно.

3, 4

Разработать устройство, которое выводит на ЖК-дисплей текущую

 

влажность и температуру воздуха.

5, 6

Разработать устройство, которое считывает температуру с датчика

 

Dallas и концентрацию CO2 с газомера. В случае превышения

 

некоторого значения температуры и значения концентрации газа,

 

подать сигнал тревоги пожара. Сигнал тревоги мигание

 

светодиода.

7, 8

Разработать устройство, которое считывает температуру человека и

 

в случае ее значения выше 38 градусов по Цельсию подавать

 

сигнал тревоги (мигание светодиодом с периодом 1 сек). Для

 

демонстрации работы значение пороговой температуры можно

 

потом поменять.

9, 0

Разработать устройство, которое замеряет температуру и влажность

 

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

 

предыдущее значение. Если разница температуры или влажности

 

превышает некоторое значение (выбрать самостоятельно), вывести

 

на ЖК-дисплей сообщение «Soon the weather will change».

3)Импортировать и подключить к проекту нужные для работы библиотеки. Это будут одни из следующих библиотек: DHT11, OneWire, DallasTemperature.

4)Разработать и спроектировать схему устройства.

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

6)Произвести компиляцию проектов.

7)

Собрать разработанную схему и загрузить программу в контролер.

Проверить правильность работы устройства.

8)

Сделать отчет по выполненной работе.

3.9 Содержание отчета

Отчёт о выполнении лабораторной работы должен содержать:

номер и название работы;

цель работы;

краткие теоретические сведения;

порядок выполнения работы;

постановка задачи;

схему спроектированного устройства с пояснениями;

36

текст программы, содержащий необходимые комментарии и пояснения;

выводы.

3.10Контрольные вопросы

1)Какие особенности необходимо учитывать при питании платы Arduino от внешних источников?

2)Что такое калибровка датчиков? Как производится калибровка и для чего она нужна?

3)Характеристики и особенности датчика DHT11.

4)Где можно применять датчики DHT11?

5)Какие преимущества и недостатки датчика DHT11?

6)Характеристики датчика температуры Dallas 18b20. Подключение датчика к плате.

7)Что такое «паразитное питание», где оно используется?

8)Какие особенности интерфейса 1-Wire? Где используется данный интерфейс и каковы его преимущества?

9)Во втором примере используется функция ConvertMap, которая преобразует значения из одного диапазона в другой. Какое ее назначение? В чем опасность использования такой функции и как ее можно доработать, чтобы сделать ее более безопасной?

10)Предназначение датчика Gas sensor.

37

4 ЛАБОРАТОРНАЯ РАБОТЫ №4

ОБМЕН ДАННЫХ МЕЖДУ УСТРОЙСТВАМИ ARDUINO

4.1 Цель работы

Изучить принципы работы с UART для обмена данных между устройствами Arduino.

4.2 Краткие теоретические сведения

Протокол UART (Universal asynchronous receiver/transmitter) – самый

распространенный на сегодняшний день физический протокол передачи данных. Наиболее известен из семейства UART протокол RS-232).

Изначально интерфейс УАПП появился в США как средство для передачи телеграфных сообщений, и рабочих бит там было пять (как в азбуке Морзе). Для передачи использовались механические устройства. Потом появились компьютеры, и коды ASCII, которые потребовали семь бит. В начале 60-х на смену пришла всем известная 8-битная таблица ASCII, и тогда формат передачи стал занимать полноценный байт, плюс управляющие три бита.

В 1971 году, когда уже начался бум микросхем, Гордон Белл для компьютеров PDP фирмы Western Digital сделал микросхему UART WD1402A. Примерно в начале 80-х фирмой National Semiconductor был создан чип 8520. В 90-е был придуман буфер к интерфейсу, что позволило передавать данные на более высоких скоростях. Этот интерфейс, не претерпев практически никаких изменений, дошел и до наших дней. Последовательный порт или интерфейс стандарта RS-232это одно из многих средств передачи информации между устройствами.

Чтобы понять, что роднит и отличает разные UART-интерфейсы,

разберем принцип работы самого популярного и любимого нами протокола

RS-232.

Основные рабочие линии – RXD и TXD, или просто RX и TX.

Передающая линия – TXD (Transmitted Data), а порт RXD (Received Data) –

принимающая.

Эти линии СОМ-порта задействованы при передаче без аппаратного управления потоком данных. При аппаратном потоке задействованы еще дополнительные интерфейсные линии (DTS, RTS и пр.). Выход передатчика TX соединен с входом приемника RX и наоборот. Электрический принцип работы RS-232 отличается от стандартной 5-вольтовой TTL логики. В этом протоколе логический нуль лежит от +3 до +12 вольт, а единица от -3 до -12, соответственно. Промежуток от -3 до +3 вольт считается зоной

38

неопределенности. Все напряжения указаны относительно корпуса компьютера, или земли (см. рисунок 4.1)

Рисунок 4.1 – Физика интерфейса

Видов UART существует великое множество. Главное отличие интерфейсов состоит в среде и способе передаче данных. Данные могут передаваться даже по оптоволокну.

Второй по распространению интерфейс после RS-232это RS-485. Он является промышленным стандартом, и передача в нем осуществляется по витой паре, что дает ему неплохую помехоустойчивость и повышенную скорость передачи до 4 мегабит в секунду. Длина провода тут может достигать 1 км. Как правило, он используется на заводах для управления разными станками.

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

В SMART-картах (SIM, спутниковое телевиденье, банковские карты) – тех самых устройствах, которые мечтает похачить каждый уважающий себя фрикер тоже используется UART. Правда, там полудуплексная передача данных, и логика работы может быть 1,8/3,3 и 5 вольт. Выглядит так, будто RX запаян с TX на одном конце и на другом в результате, один передает, другой в этот момент слушает, и наоборот. Это регламентировано стандартом смарт-карт.

Все СОМ-порты обладают несколькими свойствами: Полнодуплексный обмен данными. Означает, что можно одновременно

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

39

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

Набор сервисных сигналов. Сервисные сигналы, предусмотренные стандартом RS-232c, позволяют организовать обмен данными между двумя устройствами одновременно в обоих направлениях. Сервисные сигналы представлены отдельными цифровыми входами и выходами с памятью.

Программная независимость. Для реализации этой независимости используется UART (Universal Asynchronous Receiver-Transmitter). UART –

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

полностью реализован аппаратно и не зависит от программного обеспечения и ОС.

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

4.2.1 Библиотека SoftwareSerial

В Arduino реализована аппаратная поддержка интерфейса последовательной передачи данных через выводы 0 и 1 (которые также используются для связи с компьютером посредством USB). Аппаратная

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

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

Библиотека SoftwareSerial позволяет реализовать последовательный интерфейс на любых цифровых выводах Arduino с помощью программных средств, дублирующих функциональность UART (отсюда и название «SoftwareSerial»). Библиотека позволяет программно создавать несколько последовательных портов, работающих на скорости до 115200 бод. Для устройств, работающих с инвертированным сигналом, в библиотеке предусмотрен соответствующий параметр, включающий инвертирование.

Начиная с версии 1.0, SoftwareSerial основывается на библиотеке

NewSoftSerial автора Mikal Hart.

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

40

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

На платах Arduino Mega и Mega2560 некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. В силу этого, на данных платах в качестве вывода RX могут использоваться только следующие выводы: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).

На Arduino Leonardo некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. Поэтому, на этой плате в качестве вывода RX могут использоваться только следующие выводы: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

4.2.2 Пример передачи данных

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

Тот, кто с датчиком:

#include <SoftwareSerial.h> #include <OneWire.h>

#include <DallasTemperature.h>

SoftwareSerial mySerial(10, 11); // RX, TX #define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire);

void setup()

{

//Open serial communications and wait for port to open: Serial.begin(9600);

Serial.println("Hello!");

//set the data rate for the SoftwareSerial port mySerial.begin(9600);

sensors.begin();

}

void loop() // run over and over

{

if (mySerial.available()){ byte c = mySerial.read(); if(c!=255)

{

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]