KAmduino UNO (lub Arduino) + LCD + HC-SR501

Jak zapewne wiecie od jakiegoś czasu, dzięki uprzejmości firmy Kamami w moim warsztacie gości KAmduino. Z tego też powodu postanowiłem dodać kilka artykułów dotyczących tej właśnie platformy. Omówimy dzisiaj po krótce wyświetlacz LCD z Noki 5110, czyli jeden z najpopularniejszych (i najtańszych) LCD, który na allegro możemy zakupić już za 10zł! Opowiem także o wykorzystaniu czujnika HC-SR501. Nie będę tu omawiał wszystkich aspektów związanych z tymi elementem, postaram się tylko przedstawić proste przykłady wykorzystania tych podzespołów.

baner11

[LCD] Podstawowe informacje i podłączenie

Zaczniemy od omówienia samego wyświetlacza. Na rynku możemy znaleźć wiele modułów z wbudowanym LCD 5110, ja zaopatrzyłem się w ten (chyba) najpopularniejszy, bez zbędnych dodatków, który zakupiłem za kilkanaście złotych (zdjęcie poniżej). Cechuje się on ośmioma wyprowadzeniami, które zresztą są podpisane: RST (reset); CE; DC; DIn; CLK; VCC (zasilanie); BL (Podświetlenie); GND (oczywiście masa).

? Sprawdź to:


KAmduino UNO – recenzja i najważniejsze parametry

Podstawowe parametry:

  • Rozdzielczość 84 x 48 px 
  • Zgodny z PCD8544
  • Podświetlenie niebieskie
  • Interfejs SPI
  • Wymiary 45mm x 45mm

Podłączenie: Z racji, iż we Fritzing’u nie znalazłem elementu, który mógłby obrazować LCD z Noki 5110 zmuszony jestem do „podyktowania” całego schematu:

RST –> Pin 11
CE –> Pin 12
DC –> Pin 10
Din –> Pin 9
CLK –> Pin 8
Vcc –> +5V (zasilanie wyświetlacza)
BL –> +3V (zasilanie dla diod podświetlających)
Gnd –> Gnd 😉 

IMG_20151103_181248

[LCD] Przykładowy program

Wiemy już, jakie są parametry wyświetlacza oraz jak go podłączyć. Zajmiemy się teraz oprogramowaniem. Z racji, że nie jest to żaden kurs, a sam artykuł miał być stosunkowo krótki, postanowiłem po prostu przedstawić kilka (2) przykładowych programów, wraz z krótkim wyjaśnieniem.

Aby było nam łatwiej skorzystamy z gotowej biblioteki przygotowanej dla LCD 5110. Można ją bez problemu znaleźć w internecie, ale na wszelki wypadek udostępniłem ją również na serwerze – można ją bezpiecznie pobrać: LCD5110_Graph. Wystarczy pobrać ją, a następnie (po włączeniu Arduino IDE) kliknąć: szkic –> importuj bibliotekę –> dodaj bibliotekę –> wybrać pobrany plik zip. –> kliknąć ok.

W dostępnych przykładowych programach znajdziemy kilka interesujących pozycji. Pierwszy przykład pozwoli nam wyświetlić dowolny tekst, który będzie przewijał się po ekranie.

#include <LCD5110_Graph.h>
LCD5110 myGLCD(8,9,10,11,12);
extern uint8_t SmallFont[];
int y;

void setup()
{
 myGLCD.InitLCD();
 myGLCD.setFont(SmallFont);
 randomSeed(analogRead(0));
}

void loop()
{
 y = random(0, 40);
 for (int i=84; i>=-(34*6); i--)
 {
 myGLCD.print("Tutaj wpisz tekst, który ma się wyświetlać na LCD", i, y);
 myGLCD.update();
 delay(50);
 }
}

Drugą ciekawą pozycją jest Graph Demo, czyli po prostu testowa animacja, którą możemy wgrać do naszego KAmduino. Program prezentuje się w tak:

#include <LCD5110_Graph.h>

LCD5110 myGLCD(8,9,10,11,12);

extern unsigned char SmallFont[];
extern unsigned char TinyFont[];
extern uint8_t arduino_logo[];
extern uint8_t The_End[];
extern uint8_t pacman1[];
extern uint8_t pacman2[];
extern uint8_t pacman3[];
extern uint8_t pill[];

float y;
uint8_t* bm;
int pacy;

void setup()
{
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  randomSeed(analogRead(7));
}

void loop()
{
  myGLCD.clrScr();
  myGLCD.drawBitmap(0, 0, arduino_logo, 84, 48);
  myGLCD.update();

  delay(2000);
  
  myGLCD.clrScr();
  myGLCD.print("LCD5110_Graph", CENTER, 0);
  myGLCD.print("DEMO", CENTER, 20);
  myGLCD.drawRect(28, 18, 56, 28);
  for (int i=0; i<6; i++)
  {
    myGLCD.drawLine(57, 18+(i*2), 83-(i*3), 18+(i*2));
    myGLCD.drawLine((i*3), 28-(i*2), 28, 28-(i*2));
  }
  myGLCD.setFont(TinyFont);
  myGLCD.print("(C)2015 by", CENTER, 36);
  myGLCD.print("Henning Karlsen", CENTER, 42);
  myGLCD.update();
  
  delay(5000);
  
  myGLCD.clrScr();
  for (int i=0; i<48; i+=2)
  {
    myGLCD.drawLine(0, i, 83, 47-i);
    myGLCD.update();
  }
  for (int i=83; i>=0; i-=2)
  {
    myGLCD.drawLine(i, 0, 83-i, 47);
    myGLCD.update();
  }

  delay(2000);
  
  myGLCD.clrScr();
  myGLCD.drawRect(0, 0, 83, 47);
  for (int i=0; i<48; i+=4)
  {
    myGLCD.drawLine(0, i, i*1.75, 47);
    myGLCD.update();
  }
  for (int i=0; i<48; i+=4)
  {
    myGLCD.drawLine(83, 47-i, 83-(i*1.75), 0);
    myGLCD.update();
  }

  delay(2000);
  
  myGLCD.clrScr();
  for (int i=0; i<8; i++)
  {
    myGLCD.drawRoundRect(i*3, i*3, 83-(i*3), 47-(i*3));
    myGLCD.update();
  }

  delay(2000);
  
  myGLCD.clrScr();
  for (int i=0; i<17; i++)
  {
    myGLCD.drawCircle(41, 23, i*3);
    myGLCD.update();
  }

  delay(2000);
  
  myGLCD.clrScr();
  myGLCD.drawRect(0, 0, 83, 47);
  myGLCD.drawLine(0, 23, 84, 23);
  myGLCD.drawLine(41, 0, 41, 47);
  for (int c=0; c<4; c++)
  {
    for (int i=0; i<84; i++)
    {
      y=i*0.017453292519943295769236907684886;
      myGLCD.invPixel(i, (sin(y*6)*20)+23);
      myGLCD.update();
      delay(20);
    }
  }

  delay(2000);

  for (int pc=0; pc<3; pc++)
  {
    pacy=random(0, 28);
  
    for (int i=-20; i<84; i++)
    {
      myGLCD.clrScr();
      for (int p=4; p>((i+20)/20); p--)
        myGLCD.drawBitmap(p*20-8, pacy+7, pill, 5, 5);
      switch(((i+20)/3) % 4)
      {
        case 0: bm=pacman1;
                break;
        case 1: bm=pacman2;
                break;
        case 2: bm=pacman3;
                break;
        case 3: bm=pacman2;
                break;
      }
      myGLCD.drawBitmap(i, pacy, bm, 20, 20);
      myGLCD.update();
      delay(25);
    }
  }

  for (int i=0; i<25; i++)
  {
    myGLCD.clrScr();
    myGLCD.drawBitmap(0, i-24, The_End, 84, 24);
    myGLCD.update();
    delay(100);
  }
  myGLCD.setFont(SmallFont);
  myGLCD.print("Runtime (ms):", CENTER, 32);
  myGLCD.printNumI(millis(), CENTER, 40);
  myGLCD.update();
  for (int i=0; i<5; i++)
  {
    myGLCD.invert(true);
    delay(1000);
    myGLCD.invert(false);
    delay(1000);
  }
}

IMG_20151103_181129

[HC-SR501] Podłączenie

Teraz zajmiemy się czujnikiem ruchu HC-SR501. W tym wypadku nie będę już omawiał samego modułu, a przejdziemy od razu do podłączenia, a następnie do programowania. Zacznijmy od „schematu” – grafika poniżej.

Niestety z racji, iż nie znalazłem czujnika HC-SR501 w domyślnej bibliotece Fritzing, zmuszony byłem zastosować inny element o podobnym/takim samym pinoucie – w tym wypadku jest czujnik IR TSOP.

"Schemat" podłączenia czujnika ruchu (zastąpiony odbiornikiem IR) do Arduino.
„Schemat” podłączenia czujnika ruchu (zastąpiony odbiornikiem IR) do Arduino.

Osoby niezaznajomione z tematem mogą zapytać po co tu tranzystor? Gdyby go nie było prawdopodobnie zniszczylibyśmy naszą płytkę, ponieważ buzzer pobierało o wiele więcej niż dopuszczalne 40mA, tak więc bez tranzystora się nie obejdzie, no chyba że na przykład zastosujemy prostą diodę w formie alarmu.

[HC-SR501] Program

int pirPin = 8;
int val;

void setup() {
  Serial.begin(9600);
}

void loop() {
  val = digitalRead(pirPin); //odczytywanie wyniku pomiaru 
  if (val == LOW) {digitalWrite(7, LOW);} //jeżeli wynik = LOW, to stan pinu 7 ustaw na LOW
  else { //w innym wypadku
    println("UWAGA! Wykryto ruch!"); 
    digitalWrite(7, HIGH);
    delay(120);
    digitalWrite(7, LOW);
    delay(100);
    digitalWrite(7, HIGH);
    delay(120);
    digitalWrite(7, LOW);
    delay(100);
    digitalWrite(7, HIGH);
    delay(120);
    digitalWrite(7, LOW);
    delay(100);
  }
  delay(100);
}

Jak możecie się domyślić program spowoduje, że po wykryciu ruchu na pinie 7 (gdzie przez tranzystor podłączony jest buzzer) ustawiony zostanie stan wysoki i niski na zmianę kilka razy.

Ten prosty układ daje już ciekawy efekt i możemy go użyć chociażby jako banalny alarm.


Właściwie to już koniec tego artykułu. Wiele osób może być zawiedziona i nieusatysfakcjonowana tym jak mało wytłumaczyłem i jak mało pokazałem, aczkolwiek uspokajam – to miał być tylko krótki wpis, dla tych którzy po zakupieniu Arduino/Kamduino chcieliby „na szybko” przygotować układ z wyświetlaczem, czy też czujnikiem ruchu. Prawdopodobnie za około 2 tygodnie na stronie pojawi się kolejna część kursu Arduino, w której tym razem opiszę właśnie jeden z tych elementów.

Na ten moment to koniec, chciałbym jeszcze zaprosić do komentowania, udostępniania, a także zaproponować Wam dołączanie do Mechatrobotowej grupy na facebooku – „Nastoletni elektronicy„.

Karol Wojsław

Karol Wojsław -- licealista, założyciel i redaktor Mechatrobot.pl. Interesuje się robotyką i elektroniką oraz informatyką. Z racji swojego wieku nie ma ogromnej wiedzy, ale wytrwale dąży do tego, aby artykuły, które publikuje były coraz lepsze.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *