Pull to refresh

Книга «Изучаем Arduino. 65 проектов своими руками»

Reading time5 min
Views25K
image Приходилось ли вам, разглядывая какое-нибудь устройство, задумываться над тем, как оно работает в действительности? Возможно, это был катер с дистанционным управлением, лифт, автомат по продаже напитков или электронная игрушка? А может быть, вам хотелось самому создать робота, придумать электронное управление для модели железной дороги? Или у вас вдруг возникало желание организовать получение и анализ долгосрочного прогноза погоды? Как и с чего вы могли бы начать собственный проект?

Плата Arduino поможет на практике раскрыть некоторые секреты электроники. Cозданная Массимо Банци и Дэвидом Куартиллье, система Arduino предлагает бюджетный способ создания интерактивных проектов и объектов, таких как дистанционно управляемые роботы, системы записи пройденного маршрута на основе GPS и электронные игры.

В этой книге обзор 65 проектов. Пример одного проекта под катом.

Глава 10. Сенсорные экраны


В этой главе вы:

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

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

Сенсорные экраны
Сенсорные экраны могут стоить очень дорого, но мы будем использовать недорогую модель, выпускаемую компанией SparkFun (артикул LCD-08977 и BOB-09170), первоначально разработанную для игровой консоли Nintendo DS.

Этот сенсорный экран имеет размеры 5 х 7 см и изображен на рис. 10.1, где он смонтирован на макетной плате.

image

Обратите внимание, что сенсорный экран соединен шлейфом с маленькой печатной платой в правом верхнем углу (обведена на рис. 10.1). Этот адаптер используется для соединения сенсорного экрана с макетной платой и Arduino; на рис. 10.2 показано увеличенное изображение адаптера.

image

Подключение сенсорного экрана
Адаптер сенсорного экрана подключается к плате Arduino, как показано в табл. 10.1. Таблица 10.1. Подключение адаптера сенсорного экрана к плате Arduino

image

Проект № 34:  Определение области касания на сенсорном экране
Резистивный сенсорный экран состоит из стеклянной панели и гибкой пластиковой мембраны, между которыми расположены два слоя резистивного покрытия. Одно резистивное покрытие действует как ось X, а другое — как ось Y. Сопротивление резистивного покрытия изменяется в зависимости от точки касания, то есть, измеряя напряжение на каждом слое, можно определять координаты X и Y области касания.

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

Оборудование

Ниже перечислено оборудование, которое понадобится для этого проекта:

• Сенсорный экран с адаптером.
• Один подстроечный резистор с номиналом 10 кОм.
• Один жидкокристаллический индикатор с размером экрана 16 х 2 символа.
• Несколько отрезков провода разной длины.
• Одна макетная плата.
• Плата Arduino и кабель USB

Подключите сенсорный экран в соответствии с табл. 10.1 и жидкокристаллический индикатор, как показано на рис. 7.2.

Скетч
Введите и загрузите следующий скетч. Наиболее важные участки скетча снабжены комментариями:

Проект 34 — Определение области касания на сенсорном экране

#include <LiquidCrystal.h>
      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).

image

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

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

image

Откалибровав сенсорный экран и поделив его на небольшие области, вы сможете с помощью функций readX() и readY() определять факт прикосновения к разным управляющим областям на экране и затем использовать инструкции if-then для выполнения определенных операций, как показано в проекте 35.

Проект № 35:  Двухзонный выключатель
В этом проекте мы создадим на основе сенсорного экрана простой выключатель. Для начала поделим экран на две зоны по горизонтали, как показано на рис. 10.5: слева находится зона «включить», а справа — «выключить».

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

image

Скетч
Введите и загрузите следующий скетч:
  // Проект 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
Tags:
Hubs:
Total votes 15: ↑13 and ↓2+11
Comments6

Articles

Information

Website
piter.com
Registered
Founded
Employees
201–500 employees
Location
Россия