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świetlacz | Arduino |
---|---|
5V | 5V |
GND | GND |
LCD_RD | A0 |
LCD_WR | A1 |
LCD_RS | A2 |
LCD_CS | A3 |
SCL | SCL |
SDA | SDA |
DB5 | 13 |
DB3 | 11 |
DB2 | 10 |
LCD_D1 | 9 |
LCD_D0 | 8 |
LCD_D7 | 7 |
LCD_D6 | 6 |
SD_CS | RESET |
LCD_D4 | 4 |
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.