[074] Arduino i lokomotywa - cz. 3

[074] Arduino i lokomotywa - cz. 3

Sterowanie modelami za pomocą myszy

Niedawno pisałem o użyciu komputerowej myszy w środowisku Arduino. Czas na przykład praktyczny, a model lokomotywy tak sterowany na pewno nim będzie. Przy okazji będzie to też świetny przykład użycia myszy w nieoczywisty sposób i jak się okazuje, znakomicie się ona tam sprawdzi. Ale to już trzeba wypróbować praktycznie, bo żaden opis nie przekaże wygody takiego rozwiązania.


Mysz łączymy tak samo, jak to przedstawiłem w artykule o myszy, a więc DATA – pin 5, CLOCK – pin 6, zasilanie do pięciu woltów i masa. Przypomnę, że pracujemy z myszą standardu PS/2. Wykorzystamy tylko jeden kierunek pracy, w osi Y. Nie ma żadnych przeciwwskazań do wykorzystania pozostałych elementów – to już pozostawiam wyobraźni czytelników. Przesuwając mysz do przodu będziemy zwiększać szybkość jazdy, przesuwając do siebie – zwalniać aż do zmiany kierunku.

#include <Wire.h>                                                      // Biblioteka obsługująca magistralę I2C
#include <hd44780.h>                                                   // Biblioteka obsługująca wyświetlacze 44780
#include <hd44780ioClass/hd44780_I2Cexp.h>                             // Dodatek obsługujący wyświetlacze podłączone do ekspandera I2C
#include <PS2MouseHandler.h>                                           // Biblioteka obsługi myszy PS/2
#define MOUSE_DATA 5                                                   // Linia DATA
#define MOUSE_CLOCK 6                                                  // Linia CLCK
hd44780_I2Cexp lcd(0x20, I2Cexp_MCP23008, 7, 6, 5, 4, 3, 2, 1, HIGH);  // Konfiguracja połączeń wyświetlacza LCD
PS2MouseHandler mouse(MOUSE_CLOCK, MOUSE_DATA, PS2_MOUSE_REMOTE);      // Inicjuj bibliotekę.
const byte lokomotywa = 11;                                            // Port zasilający lokomotywę.
const byte kierunek = 12;                                              // Port zasilający przekaźnik kierunku.
int szybkosc;                                                          // Zmienna przechowująca aktualną szybkość lokomotywy.

void setup() {
  lcd.begin(16, 2);               // Inicjuj wyświetlacz LCD
  pinMode(lokomotywa, OUTPUT);    // Zadeklaruj port zasilający lokomotywę jako wyjście.
  pinMode(kierunek, OUTPUT);      // Zadeklaruj port zasilający przekaźnik kierunku jako wyjście.
  if (mouse.initialise() != 0) {  // Inicjuj mysz.
  }
}
void loop() {
  mouse.get_data();  // Pobierz status myszy.

  szybkosc = szybkosc + 10 * mouse.y_movement();  // Dodaj do zmiennej szybkość dane o szybkości myszy w osi Y
  if (szybkosc > 16383) {                         // Pilnuj by nie przekroczyć dopuszczalnej wartości dla delayMicroseconds.
    szybkosc = 16383;                             // Jeśli została przekroczona - ustaw ją na maksimum, czyli 16383
  } else if (szybkosc < -16383) {                 // Pilnuj by nie przekroczyć dopuszczalnej wartości dla delayMicroseconds.
    szybkosc = -16383;                            // Jeśli została przekroczona - ustaw ją na maksimum, czyli 16383
  }

  if (szybkosc > 0) {           // Dekoduj kierunek jazdy zgodnie ze znakiem zmiennej szybkosc.
    digitalWrite(kierunek, 0);  // Jeśli jest dodatni, wyłącz przekaźnik.
  } else {                      // W przeciwnym razie...
    digitalWrite(kierunek, 1);  // Włącz przekaźnik.
  }

  digitalWrite(lokomotywa, 1);       // Włącz napięcie dla lokomotywy.
  delayMicroseconds(abs(szybkosc));  // Zaczekaj przez wartość bezwzględną zmiennej szybkosc.
  digitalWrite(lokomotywa, 0);       // Wyłącz napięcie lokomotywie.
  delay(40);                         // Dobierz czas do charakteru silnika.

  lcd.setCursor(0, 0);         // Ustaw kursor na początku wyświetlacza.
  lcd.print(F("Szybkosc: "));  // Wyświetl napis.
  lcd.print(szybkosc);         // Wyświetl wartość szybkości.
  lcd.print(F("    "));        // Wyświetl cztery spacje.
}

W szkicu połączymy deklaracje „kolejkowe” oraz „myszowe”. Te rzeczy omawiałem, więc je pominę. W głównej pętli za pomocą instrukcji mouse.get_data() zaczytujemy dane z myszy, a następnie modyfikujemy naszą dyżurną zmienną szybkosc, dodając do niej dane przychodzące z osi Y, powiększone dziesięciokrotnie. Współczynnik powiększenia można sobie dobrać do własnych upodobań i czułości myszy. Następnie zastawiamy pułapki na przekroczenie wartości funkcji delayMicroseconds, przy czym zostawiamy także wartości ujemne, nielegalne dla tej funkcji, ale przydatne nam.

W kolejnym bloku, na podstawie znaku będziemy sterować przekaźnikiem kierunku w możliwie najprostszy sposób. Szybkość dodatnia – jedziemy do przodu, ujemna – cofamy się. W końcu mamy tam sprawdzony już wielokrotnie algorytm sterowania silnikiem. Nie różni się on niczym poza tym, że bierzemy wartość bezwzględną szybkości, by pozbyć się znaku. Dopisałem jeszcze procedurę wysyłającą na wyświetlacz stan szybkości, co może się nam przydać podczas eksperymentowania. Możemy też dodać pułapki na martwe zakresy i pozostałe elementy z poprzednich szkiców.

I to już na razie wszystko. Zawsze w takich miejscach przypominam, że nie chodzi tu o zabawę kolejką, a ujarzmienie świata rzeczywistych mechanizmów za pomocą elektroniki cyfrowej. Wykorzystując takie elementy jak bezwładność i obserwując ruch urządzeń możemy dobierać sposoby sterowania nimi do oczekiwanych przez nas rezultatów.

Powiązane tematy

Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2024 arduino.pl