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.