воскресенье, 17 марта 2013 г.

Урок 1: iBoard Pro и дисплейный модуль - калибровка тачскрина, работа с RTC (часы).

Для сегодняшнего урока нам потребуется:
В результате нашего урока должно получиться примерно следующее:


Обратите внимание, что для корректной работы модулю часов реального времени (RTC) обязательно требуется резервная батарейка (очень желательно иметь "свежую" батарейку, чтобы не отлавливать "глюки" в работе часиков, связанную с разряженным резервным источником питания). 
Для установки этого резервного источника питания RTC на плате iBoard Pro предусмотрен соответствующий слот. Подходит батарейка CR1225 или CR1220.

Плата iBoard Pro с установленным дисплеем является серьезным потребителем электричества (и питания от USB-порта точно не хватит) - возьмите подходящий блок питания (например, от ноутбука с подходящим напряжением и разъемом).

В анонсе мы озвучили, что будем использовать дисплей ITDB02-2.4E, но при подготовке было решено, что для большей наглядности (и чтобы не ломать глаза мелким шрифтом), воспользуемся другим, более крупным дисплеем ITDB02-3.2S (по возможностям он полностью идентичный: то же разрешение 320*240, но обладает экранчиком в 3.2 дюйма по диагонали).
В скетчах будут присутствовать строки для подключения как "маленького", так и "большого" дисплея - достаточно будет закомментировать одну строчку и раскомментировать - другую.

Итак, начинаем.

Подготовка

Сначала необходимо скачать и установить необходимые библиотеки:
  • UTFT - библиотека для работы с TFT-дисплеем
  • UTouch - библиотека для работы с тач-скрином
  • RTC - библиотека для модуля часов реального времени
Установка библиотек очень простая - загруженные файлы с библиотеками нужно распаковать (появятся одноименные папки) и эти папки поместить в каталог libraries внутри каталога arduino  (со средой разработки). Если Arduino IDE был запущен в процессе установки - то необходимо будет его перезапустить, чтобы библиотеки "подхватились".

Если все сделали правильно, то в IDE через меню "File"-"Examples" (Файл - Примеры) будут доступны примеры соответствующих библиотек.

Теперь можно подключить к компьютеру USB-кабель и к нему - программатор FOCA. Система автоматически определит оборудование и установит необходимые драйвера (для Windows, в MacOS никакой дополнительной установки драйверов не требуется). 

Можно установить дисплейный модуль на плату iBoard Pro (обращайте внимание на совпадение нумерации на плате дисплея и на "материнской" плате).

Калибровка тачскрина

Для калибровки необходимо открыть пример UTouch_Calibration ("File"-"Examples" - "UTouch" - "Arduino").
В примере присутствуют строчки:
UTFT        myGLCD(ITDB32S,38,39,40,41);   
UTouch      myTouch(6,5,4,3,2);
В первой строке указываются параметры инициализации дисплея, во второй - модуля тачскрина.

В нашем случае их необходимо изменить следующим образом:
Для дисплея ITDB02-3.2S:
UTFT myGLCD(ITDB32S,38,39,40,41);
UTouch  myTouch(6,5,48,3,2);

Для дисплея ITDB02-2.4E (8 битный режим):
UTFT myGLCD(ITDB24E_8,38,39,40,41);
UTouch  myTouch(6,5,48,3,2);

 Для дисплея ITDB02-2.4E (16 битный режим):
UTFT myGLCD(ITDB24E_16,38,39,40,41);
UTouch  myTouch(6,5,48,3,2);
После корректировки скетч можно залить в плату. Если все сделано верно - на экране появится инструкция, как произвести калибровку (потребуется тонкий стилус или можно воспользоваться, например, деревянной зубочисткой.).

Результатом работы скетча будет примерно следующее изображение на экране:

В нижней части отображаются калибровочные коэффициенты (зависящие от конкретного экземпляра дисплейного модуля). Эти данные необходимо ввести в файл UTouchCD.h (файл находится в папке \arduino\libraries\UTouch). В файле есть соответствующие строчки - там просто необходимо скорректировать значения на те, что появятся на вашем экране после калибровки.

Если этот шаг пропустить или проигнорировать - в дальнейшем экран будет неправильно реагировать на прикосновения.

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

Часы реального времени (RTC)

Сразу проверим, что все работает правильно. Для этого откроем в Arduino IDE пример для DS1307 ("File"-"Examples" - "RTClib" - "ds1307"). 
Никаких изменений в этом примере производить не требуется. 
После загрузки скетча в нашу плату можно открыть монитор последовательного порта и если все сделано правильно (и модуль часов работает правильно) - появятся строчки типа:
2013/3/16 17:36:52
 since midnight 1/1/1970 = 1363455412s = 15780d
 now + 7d + 30s: 2013/3/23 17:37:22
Таким образом, видно, что часы уже идут (в первой строчке должны отображаться правильные данные о времени и дате) и можно производить с этими данными различные вычисления.

Основа

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

Для удобства мы разобьем наш проект на несколько файлов, чтобы можно было проще ориентироваться. Делается это следующим образом:
  1. Создаем в Arduino IDE новый скетч (File - New)
  2. Сохраняем его (пусть он пока будет пустой). Имя файла произвольное (пусть будет "iBoardPro")
  3. Создадим в нашем проекте еще несколько файлов (rtc, graphics) - для этого проще всего воспользоваться клавиатурным сокращением Ctrl+Shift+N и ввести соответствующее имя файла.
Если все сделано правильно, то ваша среда разработки будет выглядеть примерно так:

Теперь можно переключаться между файлами проекта с помощью закладок, расположенных под панелью инструментов.
В дальнейшем наш проект расширится другими дополнительными файлами (о чем мы расскажем в следующих уроках). 

Результатом нашего первого урока должен стать скетч, который бы красиво отображал текущее время (которое мы получим от модуля RTC) на экране в любом месте. Аналогичная задача у нас стоит и по отображению текущей даты.

Время 

В нашей графической библиотеке создадим функцию time2display с несколькими входными параметрами:
  • смещение по x
  • смещение по y
  • секунды (флаг, указывающий, нужно ли выводить секунды)
  • цвет (составляющая R)
  • цвет (составляющая G)
  • цвет (составляющая B)
Таким образом, вызов этой функции с соответствующими параметрами позволит нам в дальнейшем выводить часы на текущем фоне нужного цвета и желаемого вида (с секундами или без).
Для большего эффекта добавим "моргание" разделителя между часами и минутами.
void time2display(int x, int y, boolean seconds, int r, int g, int b) {
  myGLCD.setColor(r, g, b);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumI(hour_now, x, y, 2, '0');
  // обеспечим "моргание" разделителя часов и минут
  if (sec_now % 2) {
    myGLCD.setColor(myGLCD.getBackColor());
  }
  // поскольку в шрифте нет "двоеточия" для разделения часов и минут - нарисуем это сами
  myGLCD.fillCircle(x+74, y+35, 4);
  myGLCD.fillCircle(x+74, y+14, 4);
  myGLCD.setColor(r, g, b);
  myGLCD.printNumI(min_now, x+85, y, 2, '0');
  myGLCD.setFont(BigFont);
  // если требуется вывести секунды
  if (seconds) {
    myGLCD.setFont(BigFont);
    myGLCD.printNumI(sec_now, x+150, y+34, 2, '0');
  }
}

Дата 

Аналогично сделаем функцию date2display. Входные параметры следующие:
  • смещение по x
  • смещение по y
  • день недели (флаг, указывающий, нужно ли выводить день недели)
  • цвет (составляющая R)
  • цвет (составляющая G)
  • цвет (составляющая B)
  • шрифт (SmallFont или BigFont)
void date2display(int x, int y, boolean weekday, int r, int g, int b, uint8_t* font) {
  char buffer[30];
  myGLCD.setColor(r, g, b);
  myGLCD.setFont(font);
  if (weekday){
    sprintf(buffer,"%s %2d %s %4d",wDay[dow_now-1], day_now,wMonth[month_now-1],year_now);
  }
  else {
    sprintf(buffer,"%2d %s %4d",day_now,wMonth[month_now-1],year_now);
  } 
  myGLCD.print(buffer, x, y);
}

Экран

Для отрисовки экрана создадим функцию myDisplay. Временно эту функцию сделаем предельно простой - включим туда вызовы наших функций для вывода времени и даты в разных вариантах. Позже мы эту функцию модифицируем.
void myDisplay() {
  time2display(50, 0, false, 255, 255, 255);
  time2display(20, 60, true, 0, 255, 0);
  date2display(30, 150, false, 255, 0, 255, BigFont);
  date2display(70, 180, true, 255, 255, 0, SmallFont);
}  

Результат 1 урока

Теперь достаточно написать простую функцию setup(), где производим инициализацию всей используемой периферии:
void setup() {
  Serial.begin(9600);
    myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  Wire.begin();
  RTC.begin();
    if (! RTC.isrunning()) {
    Serial.println("NO RTC!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(0, 0, 0);
}
И простую функцию loop() - основной цикл:
void loop() {
  // прочитаем текущее время
  readRTC();
  // отрисуем дисплей
  myDisplay();  
}

Если все сделано правильно, увидим картинку, схожую с этой:

Как видно, с помощью наших функций мы уже можем выводить информацию о текущем времени и дате в произвольном месте экрана и с различными вариациями.

Материалы по нашему уроку (тестовые и результирующий скетч) можно скачать по ссылке.

Продолжение следует...
Следите за обновлениями!

3 комментария:

  1. Здравствуйте. Подскажите, пожалуйста, как подключить программатор FOCA к платам iBoard Pro и iBoard (какими выводами на программаторе к каким выводам на платах. Спасибо

    ОтветитьУдалить
  2. Все очень просто - на указанных платах для подключения программатора есть соответствующий разъем. Подключаете так, чтобы сигналы DTR на плате и программаторе совпали, при этом остальные необходимые пины будут на своих местах).
    Не забудьте на программаторе выбрать напряжение 3.3В (именно это напряжение является питающим для плат iBoard и iBoard Pro).

    ОтветитьУдалить
  3. Здраствуйте, подскажите пожалуйста, есть ITDB02-5.0 и Iboard Pro, при считывании координат, например в стандартном примере рисования - после того как считались верные координаты и появилась в нужном месте точка, с некоторой вероятностью появляется еще одна точка (повторное считывание) с абсолютно левыми координатами. В итоге использовать экран как сенсорный невозможно, постоянно идут левые срабатывания. Замена экрана ничего не дала, кроме невозможности калибровки в библиотеке utouch из за того что крайние правые (при альбомной ориентации) координаты не считываются. Библиотеки используются стандартные UTFT и UTouch, + еще были попытки использовать считывание напрямую с пинов (по сути аналог utouch только самописный, на момент тестирования первого экрана utouch неподдерживал экраны 5"), ситуация одна и та же. ps. также неработает RTC, все стандартные программы и данные пример говорят ошибку no rtc, хотя при замене экрана сказали что все хорошо и все работает.

    ОтветитьУдалить