Книга «Изучаем Arduino. 65 проектов своими руками»
Плата Arduino поможет на практике раскрыть некоторые секреты электроники. Cозданная Массимо Банци и Дэвидом Куартиллье, система Arduino предлагает бюджетный способ создания интерактивных проектов и объектов, таких как дистанционно управляемые роботы, системы записи пройденного маршрута на основе GPS и электронные игры.
В этой книге обзор 65 проектов. Пример одного проекта под катом.
Глава 10. Сенсорные экраны
В этой главе вы:
• узнаете, как подключить резистивный сенсорный экран к плате Arduino;
• научитесь читать значения, которые может возвращать сенсорный экран;
• сконструируете простой выключатель, срабатывающий от прикосновения;
• сконструируете выключатель с функцией регулировки света.
Сенсорные экраны окружают нас со всех сторон: смартфоны, планшетные компьютеры и карманные игровые устройства. Так почему бы и нам не использовать сенсорный экран для взаимодействий с пользователем?
Сенсорные экраны
Сенсорные экраны могут стоить очень дорого, но мы будем использовать недорогую модель, выпускаемую компанией SparkFun (артикул LCD-08977 и BOB-09170), первоначально разработанную для игровой консоли Nintendo DS.
Этот сенсорный экран имеет размеры 5×7 см и изображен на рис. 10.1, где он смонтирован на макетной плате.
Обратите внимание, что сенсорный экран соединен шлейфом с маленькой печатной платой в правом верхнем углу (обведена на рис. 10.1). Этот адаптер используется для соединения сенсорного экрана с макетной платой и Arduino; на рис. 10.2 показано увеличенное изображение адаптера.
Подключение сенсорного экрана
Адаптер сенсорного экрана подключается к плате Arduino, как показано в табл. 10.1. Таблица 10.1. Подключение адаптера сенсорного экрана к плате Arduino
Проект № 34: Определение области касания на сенсорном экране
Резистивный сенсорный экран состоит из стеклянной панели и гибкой пластиковой мембраны, между которыми расположены два слоя резистивного покрытия. Одно резистивное покрытие действует как ось X, а другое — как ось Y. Сопротивление резистивного покрытия изменяется в зависимости от точки касания, то есть, измеряя напряжение на каждом слое, можно определять координаты X и Y области касания.
В этом проекте мы с помощью платы Arduino определим напряжение на каждом слое и преобразуем его в целочисленные координаты точки касания.
Оборудование
Ниже перечислено оборудование, которое понадобится для этого проекта:
• Сенсорный экран с адаптером.
• Один подстроечный резистор с номиналом 10 кОм.
• Один жидкокристаллический индикатор с размером экрана 16×2 символа.
• Несколько отрезков провода разной длины.
• Одна макетная плата.
• Плата Arduino и кабель USB
Подключите сенсорный экран в соответствии с табл. 10.1 и жидкокристаллический индикатор, как показано на рис. 7.2.
Скетч
Введите и загрузите следующий скетч. Наиболее важные участки скетча снабжены комментариями:
Проект 34 — Определение области касания на сенсорном экране
#include
LiquidCrystal lcd(4,5,6,7,8,9);
int x,y = 0;
void setup()
{
lcd.begin(16,2);
lcd.clear();
}
int readX() // возвращает координату X на сенсорном экране
{
int xr=0;
pinMode(A0, INPUT);
pinMode(A1, OUTPUT);
pinMode(A2, INPUT);
pinMode(A3, OUTPUT);
digitalWrite(A1, LOW); // подать низкий уровень на A1
digitalWrite(A3, HIGH); // подать высокий уровень на A3
delay(5);
xr=analogRead(0); // сохранить координату X
return xr;
}
int readY() // возвращает координату Y на сенсорном экране
{
int yr=0;
pinMode(A0, OUTPUT); // A0
pinMode(A1, INPUT); // A1
pinMode(A2, OUTPUT); // A2
pinMode(A3, INPUT); // A3
digitalWrite(14, LOW); // подать низкий уровень на A0
digitalWrite(16, HIGH); // подать высокий уровень на A2
delay(5);
yr=analogRead(1); // сохранить координату Y
return yr;
}
void loop()
{
lcd.setCursor(0,0);
lcd.print(" x = ");
x=readX();
lcd.print(x);
y=readY();
lcd.setCursor(0,1);
lcd.print(" y = ");
lcd.print(y);
delay (200);
}
Функции readX () и readY () ( и ) читают напряжение на резистивных покрытиях сенсорного экрана с помощью analogRead () и возвращают полученное значение. Скетч постоянно вызывает эти две функции для обеспечения определения координат области касания сенсорного экрана в режиме реального времени и их вывода на экран ЖКИ ( и ). (Задержка delay (5) в каждой функции необходима, она дает время аналоговым входам/выходам изменить свое состояние.)
Тестирование скетча
В процессе тестирования скетча понаблюдайте за изменением показаний на экране ЖКИ, выполняя касания сенсорного экрана, и обратите внимание, как изменяются значения X и Y в зависимости от позиции точки касания. Обратите также внимание, какие значения отображаются на экране ЖКИ, когда вы не касаетесь экрана (рис. 10.3).
Запомните эти значения — они пригодятся вам в том случае, если в скетче вы будете определять факт отсутствия прикосновения к экрану.
Калибровка сенсорного экрана
Коснувшись сенсорного экрана в углах, как показано на рис. 10.4, и записав полученные значения, вы фактически откалибруете его. В простейшем случае координат углов экрана будет вполне достаточно. Имея эти значения, вы сможете поделить сенсорный экран на небольшие области и использовать их для управления.
Откалибровав сенсорный экран и поделив его на небольшие области, вы сможете с помощью функций readX () и readY () определять факт прикосновения к разным управляющим областям на экране и затем использовать инструкции if-then для выполнения определенных операций, как показано в проекте 35.
Проект № 35: Двухзонный выключатель
В этом проекте мы создадим на основе сенсорного экрана простой выключатель. Для начала поделим экран на две зоны по горизонтали, как показано на рис. 10.5: слева находится зона «включить», а справа — «выключить».
Сравнивая координаты точки касания с границами зон, плата Arduino будет определять зону, в которой произошло касание. После определения зоны можно установить высокий или низкий уровень напряжения на цифровом выходе, но в данном скетче мы просто выведем в монитор порта название зоны.
Скетч
Введите и загрузите следующий скетч:
// Проект 35 — Двухзонный выключатель
int x,y = 0;
void setup()
{
Serial.begin(9600);
pinMode(10, OUTPUT);
}
void switchOn()
{
digitalWrite(10, HIGH);
Serial.print("Turned ON at X = ");
Serial.print(x);
Serial.print(" Y = ");
Serial.println(y);
delay(200);
}
void switchOff()
{
digitalWrite(10, LOW);
Serial.print("Turned OFF at X = ");
Serial.print(x);
Serial.print(" Y = ");
Serial.println(y);
delay(200);
}
int readX() // возвращает координату X на сенсорном экране
{
int xr=0;
pinMode(A0, INPUT);
pinMode(A1, OUTPUT);
pinMode(A2, INPUT);
pinMode(A3, OUTPUT);
digitalWrite(A1, LOW); // подать низкий уровень на A1
digitalWrite(A3, HIGH); // подать высокий уровень на A3
delay(5);
xr=analogRead(0);
return xr;
}
int readY() // возвращает координату Y на сенсорном экране
{
int yr=0;
pinMode(A0, OUTPUT);
pinMode(A1, INPUT);
pinMode(A2, OUTPUT);
pinMode(A3, INPUT);
digitalWrite(A0, LOW); // подать низкий уровень на A0
digitalWrite(A2, HIGH); // подать высокий уровень на A2
delay(5);
yr=analogRead(1);
return yr;
}
void loop()
{
x=readX();
y=readY();
// Касание в зоне "включить"?
if (x<=900 && x>=500)
{
switchOn();
}
// Касание в зоне "выключить"?
if (x<500 && x>=100)
{
switchOff();
}
}
Принцип действия
Две инструкции if в функции void loop () определяют зону, в которой произошло касание. Если точка касания находится в левой зоне, то прикосновение интерпретируется как команда «включить» . Если точка касания находится в правой зоне, то прикосновение интерпретируется как команда «выключить».
Примечание
Координата Y в этом проекте игнорируется, потому что сенсорный экран условно разбит вертикальной границей на две зоны по горизонтали. Если бы мы определили еще и горизонтальные границы, тогда необходимо было бы проверять и координату Y, как мы увидим в проекте 36.
» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — Arduino По факту оплаты бумажной книги отправляем на e-mail электронную версию книги.
Комментарии (1)
18 октября 2016 в 14:20
0↑
↓
Большое спасибо за книгу, очень много исчерпывающей информации в одном месте — давно искал что-то подобное!
Что радует — цена файла почти в два раза ниже бумаги, очень правильная тенденция, а со скидкой совсем замечательно выходит.