Zaloguje się
or
Tel +48 698 615 740

Sterowanie silnikiem przy pomocy dotykowego ekranu LCD 3.2″

29 sierpnia, 2022

W artykule zostanie przedstawione połączenie i zaprogramowanie ekranu dotykowego, modułu silnika jak i silnika. Przy pomocy ekranu będziemy mogli zmieniać prędkość obrotu oraz włączać silnik.

Spis treści

  • Wykorzystane komponenty
  • Podłączenie
  • Zaprogramowanie
  • Wykorzystanie w praktyce

Wykorzystane komponenty

  • Dotykowy Wyświetlacz LCD TFT przekątna 3.2″
  • Arduino UNO R3 / Mega2560 / Leonardo
  • Zasilacz 70W 12V 6A
  • L298N – dwukanałowy sterownik silników
  • Silnik Wrzeciono 12-24V
  • Przewody
  • Płytka stykowa

Podłączenie

Podłączenie wyświetlacza do arduino

WyświetlaczArduino
5V5V
GNDGND
LCD_RDA0
LCD_WRA1
LCD_RSA2
LCD_CSA3
SCLSCL
SDASDA
DB513
DB311
DB210
LCD_D19
LCD_D08
LCD_D77
LCD_D66
SD_CSRESET
LCD_D44

Podłączenie modułu i silnika

Zaczynamy od zasilania, 5V i GND podłączamy do płytki stykowej, ponieważ będziemy musieli również podłączyć wyświetlacz. Do A Enable (zielony przewód na schemacie) podłączamy 3 odpowiedzialny za PWM. Do pinu IN1 podłączamy z 2, do pinu IN2 podłączamy z 3. Następnie do IN 1 i IN2 podłączamy silnik do IN1 czerwony przewód (+), a do IN2 czarny (-). Ostatnie co robimy to podłączamy zasilanie 12V do pinów 12V i GND. GND podłączamy również z Arduino.

Zaprogramowanie

Tak na prawdę, to tutaj dzieje się najwięcej, ponieważ cała obsługa jest zrobiona przez ekran dotykowy. Obsługą ekranu wzorowałem się na artykule z naszego bloga https://ajmaker.pl/2022/01/20/dotykowe-ekran-lcd-3-2-wykorzystanie-w-praktyce/. Można również pobrać z niego potrzebne biblioteki do wyświetlacza.

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>
MCUFRIEND_kbv tft; // Stworzenie obiektu pełniącego rolę wyświetlacza
/* Zmienne do obsługi ekranu dotykowego */
uint8_t YP = A1;
uint8_t XM = A2;
uint8_t YM = 7;
uint8_t XP = 6;
/* --------------------------------- */
int16_t BOXSIZE; // zainicjowanie zmiennej służącej nam do tworzenia przycisków
/* Definicja poszczególnym boków ekranu */
uint16_t TS_LEFT = 880;
uint16_t TS_RT  = 170;
uint16_t TS_TOP = 950;
uint16_t TS_BOT = 180;
/* --------------------------------- */
#define MINPRESSURE 20 // Minimalna wartość jaką może odczytać program aby uznać, że dotknęliśmy ekranu
#define MAXPRESSURE 500 // Maksymalna wartość jaką może odczytać program aby uznać, że dotknęliśmy ekranu

#define PWM 3
#define IN1 2
#define IN2 5
/* --------------------------------- */
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 250); // Stworzenie obiektu pełniącego rolę ekranu dotykowego
TSPoint tp; // Stworzenie obiektu do ustalania aktualnego punktu na ekranie
/* przypisanie do nazw kolorów odpowiadających im wartości w systemie szesnastkowym*/
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

bool mieszanie =  true;
bool pompa = true;
int obroty = 100;
int value = 255;

void setup() {
  Serial.begin(9600); // Rozpoczęcie transmisji szeregowej

  pinMode(PWM, OUTPUT); //ustawienie PWM jako wyjście
  pinMode(IN1, OUTPUT); //ustawienie IN1 jako wyjście
  pinMode(IN2, OUTPUT); //ustawienie IN2 jako wyjście

  analogWrite(PWM, 0); //ustawienie prędkości obrotów

  digitalWrite(IN1, LOW); //ustawienie stanu niskiego na IN1
  digitalWrite(IN2, LOW); //ustawienie stanu niskiego na IN2

  tft.begin(0x9327); // Rozpoczęcie pracy ekranu o id 0x9327 ( odpowiada naszemu modelowi ekranu)
  tft.fillScreen(BLACK); // Wypełnienie ekranu kolorem czarnym
  tft.setRotation(1); // ustawienie rotacji ekranu na poziomą
  tft.setTextColor(WHITE); // Ustawienie koloru tekstu na czarny
  BOXSIZE = tft.height() / 3;
  /*------------kwadraty-które-ułatwią-ustawienie-tekstu-----------*/
  //  tft.fillRect(BOXSIZE * 0, 0, BOXSIZE, BOXSIZE, YELLOW);
  //  tft.fillRect(BOXSIZE * 1, 0, BOXSIZE, BOXSIZE, GREEN);
  //  tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE);
  //  tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, MAGENTA);
  //  tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE);
  //  tft.fillRect(BOXSIZE * 4, BOXSIZE, BOXSIZE, BOXSIZE, YELLOW);
  //  tft.fillRect(BOXSIZE * 3, BOXSIZE, BOXSIZE, BOXSIZE, GREEN);
  //  tft.fillRect(BOXSIZE * 2, BOXSIZE, BOXSIZE, BOXSIZE, WHITE);
  //  tft.fillRect(BOXSIZE * 1, BOXSIZE, BOXSIZE, BOXSIZE, RED);
  //  tft.fillRect(BOXSIZE * 0, BOXSIZE, BOXSIZE, BOXSIZE, BLUE);
  /*----------------------------------------------------------------*/
  tft.setTextSize(1); //ustawienie rozmiaru tekstu
  tft.setCursor(10, 35); //ustawienie pozycji kursora
  tft.print("CISNIENIE"); //wyświetlenie tekstu

  tft.setCursor(100, 35); //ustawienie pozycji kursora
  tft.print("0.0 bar"); //wyświetlenie tekstu

  tft.setCursor(255, 55); //ustawienie pozycji kursora
  tft.print("MIESZANIE"); //wyświetlenie tekstu

  tft.setTextSize(2); //ustawienie rozmiaru tekstu
  tft.setTextColor(RED); //ustawienie koloru tekstu
  tft.setCursor(265, 25); //ustawienie pozycji kursora
  tft.print("OFF"); //wyświetlenie tekstu

  tft.setTextSize(1); //ustawienie rozmiaru tekstu
  tft.setTextColor(WHITE); //ustawienie koloru tekstu
  tft.setCursor(345, 55); //ustawienie pozycji kursora
  tft.print("POMPA"); //wyświetlenie tekstu

  tft.setTextSize(2); //ustawienie rozmiaru tekstu
  tft.setTextColor(RED); //ustawienie koloru tekstu
  tft.setCursor(347, 25); //ustawienie pozycji kursora
  tft.print("OFF"); //wyświetlenie tekstu

  tft.setTextSize(1); //ustawienie rozmiaru tekstu
  tft.setTextColor(WHITE); //ustawienie koloru tekstu
  tft.setCursor(10, 115); //ustawienie pozycji kursora
  tft.print("PREDKOSC"); //wyświetlenie tekstu
  tft.setCursor(12, 125); //ustawienie pozycji kursora
  tft.print("OBROTOW"); //wyświetlenie tekstu

  tft.setCursor(100, 118); //ustawienie pozycji kursora
  tft.print("100"); //wyświetlenie tekstu

  tft.setCursor(255, 135); //ustawienie pozycji kursora
  tft.print("ZWIEKSZ"); //wyświetlenie tekstu

  tft.setTextSize(2); //ustawienie rozmiaru tekstu
  tft.setTextColor(GREEN); //ustawienie koloru tekstu
  tft.setCursor(270, 105); //ustawienie pozycji kursora
  tft.print("+"); //wyświetlenie tekstu

  tft.setTextSize(1); //ustawienie rozmiaru tekstu
  tft.setTextColor(WHITE); //ustawienie koloru tekstu
  tft.setCursor(345, 135); //ustawienie pozycji kursora
  tft.print("ZMNIEJSZ"); //wyświetlenie tekstu

  tft.setTextSize(2); //ustawienie rozmiaru tekstu
  tft.setTextColor(YELLOW); //ustawienie koloru tekstu
  tft.setCursor(360, 105); //ustawienie pozycji kursora
  tft.print("-"); //wyświetlenie tekstu
}

void loop() {

  uint16_t xpos, ypos; // inicjacja zmiennych służących do ustalenia składowych x i y pozycji kursora
  tp = ts.getPoint(); // przypisanie do zmiennej tp aktualnego punktu na ekranie
  /*ustawienie na wyjście pinów służących do obsługi ekranu dotykowego*/
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  pinMode(XP, OUTPUT);
  pinMode(YM, OUTPUT);
  /* --------------------------------- */
  if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) { // sprawdzanie czy punkt znajduje się w granicach ustalonych na początku programu
    xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); // rozdzielenie zmiennej tp na składową x poprzez funkcję mapowania
    ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); // rozdzielenie zmiennej tp na składową y poprzez funkcję mapowania
    if (xpos > 240) // jeżeli składowa x punktu jest większa od 240, czyli znajdujemy się w pierwszym wierszu
    {
      if (ypos > 144 && ypos < 188) // jeżeli składowa y punktu jest większa od 144 i mniejsza od 188, czyli znajdujemy się w obszarze przycisku mieszanie
      {
        if (mieszanie == true)
        {
          tft.setTextColor(GREEN, BLACK); //ustawienie koloru tekstu i tła, pierwszy parametr kolor tekstu, drugi tła
          tft.setTextSize(2); //ustawienie rozmiaru tekstu
          tft.setCursor(265, 25); //ustawienie pozycji kursora
          tft.print("ON "); //wyświetlenie tekstu
          mieszanie = false; //ustawienie zmiennej mieszanie na false
          analogWrite(PWM, value); //zmiana prędkości obrotów na wcześniej ustawioną
          digitalWrite(IN1, HIGH); //zmiana stanu IN1 na wysoki
          digitalWrite(IN2, LOW); //zmiana stanu IN2 na niski
          delay(500);
        }
        else
        {
          tft.setTextColor(RED, BLACK); //ustawienie koloru tekstu i tła, pierwszy parametr kolor tekstu, drugi tła
          tft.setTextSize(2); //ustawienie rozmiaru tekstu
          tft.setCursor(265, 25); //ustawienie pozycji kursora
          tft.print("OFF"); //wyświetlenie tekstu
          mieszanie = true; //ustawienie zmiennej mieszanie na true
          analogWrite(PWM, 0); //zmiana prędkości obrotów
          digitalWrite(IN1, LOW); //zmiana stanu IN1 na niski
          digitalWrite(IN2, LOW); //zmiana stanu IN2 na niski
          delay(500);
        }
      }
      else if (ypos < 250 && ypos > 202) // jeżeli składowa y punktu jest mniejsza od 250 i większa od 202, czyli znajdujemy się w obszarze przycisku pompa
      {
        if (pompa == true)
        {
          tft.setTextColor(GREEN, BLACK); //ustawienie koloru tekstu i tła, pierwszy parametr kolor tekstu, drugi tła
          tft.setTextSize(2); //ustawienie rozmiaru tekstu
          tft.setCursor(347, 25); //ustawienie pozycji kursora
          tft.print("ON "); //wyświetlenie tekstu
          pompa = false; //ustawienie zmiennej pompa na false
          delay(500);
        }
        else
        {
          tft.setTextColor(RED, BLACK); //ustawienie koloru tekstu i tła, pierwszy parametr kolor tekstu, drugi tła
          tft.setTextSize(2); //ustawienie rozmiaru tekstu
          tft.setCursor(347, 25); //ustawienie pozycji kursora
          tft.print("OFF"); //wyświetlenie tekstu
          pompa = true; //ustawienie zmiennej pompa na true
          delay(500);
        }
      }
    }
    if (xpos > 120 && xpos < 240) // jeżeli składowa x punktu jest większa od 120, czyli znajdujemy się w drugim wierszu
    {
      if (ypos > 144 && ypos < 188) // jeżeli składowa y punktu jest większa od 144 i większa od 188, czyli znajdujemy się w obszarze przycisku zwiększ
      {
        if (obroty < 100) //jeżeli obroty są mniejsze od 100
        {
          obroty += 2; //dodaj 2
        }

        value = map(obroty, 0, 100, 0, 255); //zmapowanie ustawionych obrotów na value
        tft.setTextSize(1); //ustawienie rozmiaru tekstu
        tft.setTextColor(WHITE, BLACK); //ustawienie koloru tekstu i tła, pierwszy parametr kolor tekstu, drugi tła
        tft.setCursor(100, 118); //ustawienie pozycji kursora
        tft.print(obroty); //wyświetlenie tekstu
        tft.print(" "); //wyświetlenie tekstu
        delay(100);
      }
      else if (ypos < 250 && ypos > 202) // jeżeli składowa y punktu jest mniejsza od 240 i większa od 192, czyli znajdujemy się w obszarze przycisku nr 2.
      {
        if (obroty > 0) //jeżeli obroty większe od zera
        {
          obroty -= 2; //odejmij 2
        }
        value = map(obroty, 0, 100, 0, 255); //zmapowanie ustawionych obrotów na value
        tft.setTextSize(1); //ustawienie rozmiaru tekstu
        tft.setTextColor(WHITE, BLACK); //ustawienie koloru tekstu i tła, pierwszy parametr kolor tekstu, drugi tła
        tft.setCursor(100, 118); //ustawienie pozycji kursora
        tft.print(obroty); //wyświetlenie tekstu
        tft.print(" "); //wyświetlenie tekstu
        delay(100);
      }
    }
  }
}

Po wgraniu programu na wyświetlaczu powinno wyświetlić się całe menu oraz po wciśnięciu przycisków powinny się zmienić z ON na OFF i na odwrót, a prędkość obrotów powinna się zmniejszać i zwiększać wraz z wciskanymi przyciskami. Prędkość obrotów nie zmienia się podczas włączonego silnika, należy wyłączyć silnik ustawić wartość i włączyć go ponownie, a wtedy zmiana prędkości zostanie zastosowana. Do całego układu można podłączyć również czujnik ciśnienia i w miejsce stałych barów dać zmienną, która na bieżąco będzie pokazywała ciśnienie.

Wykorzystanie w praktyce

Pliki do pobrania

Sticky
Możliwość komentowania Sterowanie silnikiem przy pomocy dotykowego ekranu LCD 3.2″ została wyłączona
Adrian Wojtala

Adrian Wojtala

Ma 21 lat. Studiuje informatykę na Uniwersytecie DSW, ukończył technikum o profilu technik-informatyk. Interesuje się programowaniem i w przyszłości ma plan zostać back-end developerem. Swoją przygodę z Arduino rozpoczął podczas praktyk od września 2021 r.

Comments are closed.

Strona korzysta z plików cookies w celu realizacji usługi i zgodnie z Polityką Plików Cookies. Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.