LCD nokia 5110 aansluiting. Voordelen van het gebruik van Arduino Uno. Schets in actie

Waarschijnlijk had ik, net als alle Arduino-bouwers, een gek idee in mijn hoofd. Ik heb alle benodigde onderdelen uit China besteld. We hebben heel lang moeten wachten, maar toen werden een kloon van het Arduino Uno-bord en een Nokia 5110 LCD-scherm eerder dan gepland geleverd. Omdat ik nog niet eerder bekend was met elektronica en programmeren, besloot ik geen tijd te verspillen en begon ik te leren hoe ik informatie op deze module kon weergeven.

Het eerste wat ik deed was Google en kwam de publicatie “Arduino, Nokia 5110 LCD-module en Cyrillisch alfabet” van de auteur tegen. En toen besefte ik dat alles wat ik eerder had gepland niet zo gemakkelijk zou zijn.

Ik heb het Cyrillische alfabet ontdekt, alles is daar eenvoudig, ik zal het laatste bericht niet kopiëren en plakken, maar er is een echt probleem met de afbeeldingen. De taak is: u moet een afbeelding tekenen en deze naar het scherm uploaden. Geconfronteerd met het eerste probleem, woensdag ingelogd Arduino-programmering Ik zag dat er niet zoiets bestaat als "Invoegen - Afbeeldingen", maar je moet de afbeelding opschrijven met een bepaalde code in het hexadecimale nummersysteem. Ik heb verschillende editors gevonden, maar dat was niet het geval. Het beeld wordt niet goed weergegeven. Ik begon te zoeken naar problemen die er zouden kunnen zijn.

Via een reeks experimenten, pogingen en tests heb ik een algoritme bedacht dat ik met jullie zal delen:

1) Je hebt de afbeelding zelf nodig, in zwart-wit .bmp-formaat met een extensie van 84 x 48 pixels.
Dit kan voor bijna iedereen op verschillende manieren worden gedaan. grafische editor Er is een functie “Opslaan als” waarin we de benodigde parameters specificeren.
Ik deed het in CorelDRAW. Wij krijgen iets soortgelijks. Het is noodzakelijk om te verduidelijken dat de naam van de afbeelding moet worden opgeslagen Latijnse lay-out toetsenborden, omdat volgende programma zal het niet kunnen openen.

2) Indien nodig kun je de afbeelding in verf bewerken, vreemd genoeg zijn daar verschillende eenvoudige en interessante hulpmiddelen voor.

3) Hiermee krijgen we de hexadecimale code van de afbeelding.

4) Invoegen deze code V programmacode Arduino en upload het naar het bord:

// SCK - Pin 8 // MOSI - Pin 9 // DC - Pin 10 // RST - Pin 11 // CS - Pin 12 // #include LCD5110 mijnGLCD(8,9,10,11,12); extern uint8_t OKO; zweven y; uint8_t* bm; int-ruimte; void setup() ( myGLCD.InitLCD(); ) void loop() ( myGLCD.clrScr(); myGLCD.drawBitmap(0, 0, OKO, 84, 48); myGLCD.update(); delay(2000); )

#erbij betrekken const uint8_t OKO PROGMEM=( //Gekopieerde hexadecimale code GLCD-tools);

Bij het assembleren van apparaten op Arduino worden we vaak geconfronteerd met de behoefte aan autonome uitvoer van informatie. En zoals altijd wil ik dat de oplossing goedkoop is. En hier blijkt dat de keuze aan goedkope apparaten niet erg rijk is.

Als er weinig informatie wordt weergegeven, is het handig om indicatoren met zeven segmenten te gebruiken. Ze zijn erg helder en contrastrijk. Dergelijke linialen van 4 cijfers en 0,36 inch hoog op de TM1637 worden voor 70 cent verkocht en worden bestuurd door slechts 2 pinnen. Zoals je misschien wel raadt, zijn ze voornamelijk ontworpen voor het weergeven van de tijd, hoewel ze bijvoorbeeld gemakkelijk temperatuur, druk en andere parameters kunnen weergeven, waarvoor 4 cijfers voldoende zijn.

Maar als er veel uitvoerinformatie is, zullen ze niet werken. In dergelijke gevallen worden het vaakst "folk" LCD 1602-displays gebruikt, die de mogelijkheid hebben om 2 regels van 16 tekens weer te geven voor een prijs van anderhalve dollar. Zo kun je veel meer informatie weergeven.

Zijn geavanceerdere 4-regelige broer zal nog meer informatie weergeven, maar is al merkbaar duurder, zo'n 5 dollar, en zijn formaat is al behoorlijk groot.

Al deze apparaten hebben hun voor- en nadelen. De belangrijkste nadelen zijn onder meer het gebrek aan ondersteuning voor de Russische taal, omdat de codetabel nauw in de chip is verankerd, en het onvermogen om afbeeldingen weer te geven. Strikt genomen is het mogelijk om Cyrillische firmware in dergelijke apparaten te hebben, maar deze worden voornamelijk in Rusland verkocht en tegen onredelijke prijzen.
Als deze nadelen doorslaggevend zijn voor gebruik in het apparaat dat wordt gemaakt en de resolutie van 84x48 pixels in zwart-witafbeeldingen bij je past, dan moet je op het Nokia 5110-scherm letten. Er was er eens een, maar die was erg onvolledig , en op sommige plaatsen verouderd. Daar werd met name verklaard dat het onmogelijk was het Cyrillische alfabet weer te geven. Tegenwoordig bestaat een dergelijk probleem niet.

De held van onze recensie, geprijsd op minder dan een paar dollar, kwam naar me toe in een duurzame kartonnen doos met een beschermfolie op het scherm, waarvoor veel dank aan de verkoper. Het apparaat heeft een printplaat van 45x45 mm rode printplaat en een LCD-scherm met een resolutie van 84x48 pixels en een formaat van 40x25 mm. Het apparaat weegt 15 g. Het heeft een blauwe achtergrondverlichting die kan worden uitgeschakeld. Voor Arduino bijt dit display 5 digitale pinnen af, de voeding niet meegerekend. Het bord heeft 2 rijen pinnen die parallel lopen, waardoor je slechts één rij kunt gebruiken. Hiervan zijn er 5 voor bediening, 2 voor stroom en één voor het inschakelen van de achtergrondverlichting. Om de achtergrondverlichting in te schakelen, moet je de LIGHT-pin kortsluiten met aarde (er is een andere versie van dit display, zoals ze zeggen - op het blauwe bord, waar deze pin is aangesloten op de voeding). Het bord wordt ongesoldeerd geleverd, twee kammen zijn inbegrepen in de set.
We verbinden dus de SCLK-, DIN-, DC-, CE- en RTS-pinnen met de Arduino-pinnen, bijvoorbeeld 3, 4, 5, 6, 7. De VCC-pin op 3,3 V (precies 3,3, niet 5!), sluit de grond en download de bibliotheek.
Met functies uit deze bibliotheek kunt u grafische primitieven (lijn, cirkel, rechthoek, etc.), rasterafbeeldingen en tekst weergeven. De bibliotheek bevat een voorbeeld dat de mogelijkheden ervan laat zien. Ik raad u aan ernaar te kijken. Maar om de tekst in het Russisch weer te geven, moet u het lettertype aanpassen. Maar gelukkig hebben goede mensen al alles voor ons gedaan en is het vervangende bestand te downloaden.
Ik zal hieronder een voorbeeld geven van de schets en het resultaat van de tekstuitvoer in het Russisch is hierboven te zien. Het is eenvoudig te berekenen dat u bij de kleinste lettergrootte (nr. 1) 84 tekens (14 in 6 regels) kunt weergeven, wat voldoende is om bijvoorbeeld uitgebreide diagnostische berichten weer te geven. Lettertype #2 is twee keer zo groot.
Dankzij de schermresolutie kunt u redelijk goede tweekleurige rasterafbeeldingen weergeven, die als pictogrammen in het programma kunnen worden gebruikt.

Het maken van dergelijke pictogrammen is heel eenvoudig. Onder de spoiler laat ik zien hoe je dit doet.

Hoe u snel een rasterafbeelding kunt maken met behulp van het voorbeeld van het MYSKU-websitelogo

Laten we eerst een screenshot maken van het logoscherm (Print Screen-toets).
Start Paint vanuit standaardprogramma's en druk op Ctrl+V. Het volledige scherm met het logo staat tot onze beschikking.


Selecteer het gewenste fragment en druk op de TRIM-knop. Laten we ons fragment pakken.

Nu moeten we dit fragment in twee kleuren veranderen. Verf zelf kan dit aan. Klik op “Opslaan als” en selecteer het type “Monochrome afbeelding (*.bmp)”. We negeren de waarschuwing van de redacteur en klikken op OK en zien de volgende afbeelding:

Nu moeten we deze set pixels omzetten in een reeks codes voor Arduino. Ik heb er een gevonden die deze taak aankan.
Hij moet een bmp-bestand als invoer indienen, maar het moet 256 kleuren hebben! We klikken dus opnieuw op "Opslaan als" en selecteren het type "256 kleuren bmp-kunst". Laten we nu de afmetingen van de zijkanten van het resulterende bestand onthouden, u zult ze in de schets moeten aangeven (kijk in Paint onderaan in de statusbalk of door Bestandseigenschappen te openen -> tabblad Details) en ga naar de online converter .


Laten we ons bestand selecteren, het vakje met hexadecimale getallen aanvinken en op CONVERTEREN klikken.
Laten we de array nemen die we nodig hebben:


We kopiëren deze array naar de schets, compileren deze en kijken wat er gebeurt.


Laten we nu de achtergrondverlichting uitschakelen en kijken hoe de afbeeldingen er zonder zullen uitzien.


Zoals u kunt zien, zijn zowel de tekst als de pictogrammen leesbaar. Bovendien geldt: hoe helderder het licht, hoe beter de leesbaarheid (oh, ik herinner me hoe prettig het was om de Nokia 1100 op een zonnige dag te gebruiken, terwijl mensen hun handsets met kleurenmatrices in de schaduw verborgen om een ​​nummer te bellen). Over het algemeen kunt u het display in deze modus gebruiken als er voldoende licht is of als de achtergrondverlichting interfereert, of om de batterij te sparen. Als iemands scherm moeilijk te zien is, speel dan met het contrast in de schets. Het beste contrast met en zonder tegenlicht wordt verkregen bij verschillende waarden, hier moet rekening mee gehouden worden.

Een voorbeeldschets voor het weergeven van tekst en afbeeldingen

#erbij betrekken #erbij betrekken // pin 3 - Seriële klok uit (SCLK) // pin 4 - Seriële data uit (DIN) // pin 5 - Gegevens/opdrachtselectie (D/C) // pin 6 - LCD-chipselectie (CS) // pin 7 - LCD-reset (RST) Adafruit_PCD8544 weergave = Adafruit_PCD8544(3, 4, 5, 6, 7); const statische niet-ondertekende char PROGMEM ku59x39 = ( 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x3, 0xf0, 0xfc, 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0x87, 0xc0, , 0x0, 0x0, 0x7f, 0xc0, 0xff, 0xe3, 0xff, 0x0, 0x0, 0x7f, 0xff, 0x90, 0xff, 0xf1, 0xfc, 0x0, 0x7, 0xff, 0xff, 0x30, 0xff, 0xf8, 0xf0, 0x0, 7f , 0xff, 0xfe, 0x30, 0xff, 0xfc, 0x40, 0x3, 0xff, 0xff, 0xfc, 0x70, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xff, 0xf8, 0xf0, 0xff, 0xff, 0x0, 0x7f, 0xf0 , 0xf0, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xe1, 0xf0, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xe3, 0xf0, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe3, 0xff, 0xff, 0xff, 0x83, 0xf0, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x87, 0xf0, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x87, , 0xff, 0xf, 0, 0xff, 0xff , 0xff, 0x87, 0xf0, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0x1f, 0x87, 0xf0, 0xff, 0xff, 0xf8, 0x7f, 0x0, 0x0, 0x7, 0xf0, 0 xff, 0xfc, 0x38, 0x0, 0x0, 0x1, 0xf0, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0xbf, 0xf0, 0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xfe, 0x0, 0 x3f, 0xe1, 0xff, 0xf0, 0xff, 0xff, 0xfe, 0x3, 0xf0, 0x0, 0x1, 0xf0, 0xff, 0xff, 0xfe, 0xf, 0x80, 0x0, 0x0, 0xf0, 0xff, 0xff, 0xff, 0xe, 0x0, 0x 3f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xc, 0x3, 0xff, 0xe1, 0xf0, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xc0, 0xf0, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x9c, 0xf0, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0x38, 0xf0, 0xff, 0xff, 0xff, 0xc3, , 0xff, 0x19, 0xf0, 0 xff, 0xff, 0xff , 0xf0, 0xff, 0xff, 0x3, 0xf0, 0xff, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0x87, 0xf0, 0xff, 0xff, 0xff, 0xce, 0x7f, 0xdf, 0xf0, 0xff, 0xff, 0 xff, 0xce, 0x7f , 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x9e, 0x7f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff 0, xf0, 0xff, 0xff, 0xff, , 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xf0); void setup() ( display.begin(); display.setContrast(50); display.setTextSize(1); display.setTextColor(BLACK); // stel de tekstkleur in ) void loop() ( display.clearDisplay(); display .drawBitmap(10, 5, ku59x39, 59, 39, BLACK); display.display(); display.setCursor(0,0); ; weergave.weergave(); vertraging(2000);


Nou, en aangezien Arduino (processor+RAM+Bootloader-BIOS)+station (EEPROM) + invoer/uitvoersysteem (IRDA Remote en Nokia 5110) in feite een volwaardige computer is, waarom dan niet een volwaardige computer schrijven? spel ervoor? Natuurlijk kan onze Arduino-computer een spel als GTA niet aan, maar een eenvoudig speelgoedje kan hij wel aan! Laten we een spel aller tijden schrijven: Tetris.
Voor elke programmeur is dit een ochtendoefening: een gemakkelijke oefening voor de hersenen, dus ga je gang! En het is alsof dit nog nooit eerder is gebeurd op muska. En de game zal het potentieel van het onderwerp onthullen.
Als invoersysteem besloot ik de IRDA-afstandsbediening vanaf ELK apparaat te gebruiken. Met deze oplossing hebben we er maar één nodig, voor een prijs van 4 roebel per stuk. En in elk appartement is een IR-afstandsbediening te vinden. Voor stemacteren zullen we ook een piëzo-tweeter van een oud moederbord gebruiken - dit zal onze budgetanaloog van multimedia zijn)). Er komt nu een coolere versie naar mij toe, maar dit verhoogt de prijs van onze supercomputer al met een hele dollar! We komen er voorlopig wel uit. Het zal al bij hem zijn.
Op het breadboard verbinden we uitvoer- en invoerapparaten en onze “multimedia”. Het bleek zo:


Ik heb Arduino Uno gebruikt, omdat deze al de 3,3 V heeft die we nodig hebben, maar als je de Mini gebruikt, zul je de vereiste 3,3 moeten halen uit de 5 volt voor het scherm. De eenvoudigste manier vanaf internet is om twee siliciumdiodes in serie te zetten (selecteer).
Om geen elektrisch schema te tekenen, zal ik eenvoudigweg de Arduino-pinnen aangeven die ik heb gebruikt.
Het Nokia 5110-scherm aansluiten:
pin 3 - Seriële klok uit (SCLK)
pin 4 - Seriële data uit (DIN)
pin 5 - Gegevens/opdrachtselectie (D/C)
pin 6 - LCD-chipselectie (CS)
pin 7 - LCD-reset (RST)
Om de LIGHT-pin van het display te verlichten, gooien we deze naar GND van de Arduino. (Alleen voor rood bord!). Plus voeding op 3,3V. Aarding naar GND.
Aansluiting IR-ontvanger:
pin 8 - IR (bediening). Voeding op respectievelijk +5V en GND.
De piëzo-tweeter aansluiten:
pin 9 - luidspreker, aarde naar GND.
Upload na de installatie de schets

Schets van Tetris-spel

//// © Klop 2017 #include #erbij betrekken #erbij betrekken #erbij betrekken #define rk 4 // breedte van het vierkant #define rz 5 // breedte van de zitting #define smeX 1 #define smeY 1 #define MaxX 10 // glas aantal zitplaatsen horizontaal #define speaker 9 #define RECV_PIN 8 // voet op IRDA-ontvanger // pin 3 - Seriële klok uit (SCLK) // pin 4 - Seriële data uit (DIN) // pin 5 - Data/Commandoselectie (D/C) // pin 6 - LCD-chipselectie (CS) // pin 7 - LCD-reset (RST) Adafruit_PCD8544 weergave = Adafruit_PCD8544(3, 4, 5, 6, 7); IRrecv irrecv(RECV_PIN); decode_results resultaten; byte mstacan; byte Lst,SmeH, midden, NumNext; byte MaxY; // glas aantal verticale plaatsen int dxx, dyy, FigX, FigY, Victory, myspeed,tempspeed; niet ondertekend lang ok, links, pravo, vniz, mijnrecord; niet-ondertekende lange flfirst=1234; // eerste startlabelbyte fig= ((0,0,0,0), (0,0,0,0), (0,0,0,0), (0,0,0,0)) , ((0,1,0,0), (0,1,0,0), (0,1,0,0), (0,1,0,0)), ((0,0,0 ,0), (0,1,1,0), (0,1,1,0), (0,0,0,0)), ((0,1,0,0), (0,1 ,1,0), (0,0,1,0), (0,0,0,0)), ((0,1,0,0), (0,1,0,0), (0 ,1,1,0), (0,0,0,0)), ((0,1,0,0), (0,1,1,0), (0,1,0,0), (0,0,0,0)), ((0,0,1,0), (0,1,1,0), (0,1,0,0), (0,0,0,0 )), ((0,0,1,0), (0,0,1,0), (0,1,1,0), (0,0,0,0)), ((0,0 ,0,0), //8 (0,0,0,0), (0,0,0,0), (0,0,0,0)) ); //=============================================== ============= void mybeep () // geluid (analogWrite(luidspreker, 100); vertraging(100); analogWrite(luidspreker, 0); ) //======= =============== ======================== void figmove(byte a, byte b) (voor (bytei=0;i<4;i++) for (byte j=0;j<4;j++) fig[a][i][j]=fig[b][i][j]; } //============================================== void figinit(byte a) { for (byte i=0;i<4;i++) for (byte j=0;j<4;j++) { fig[i][j]=fig[i][j]; if (fig[a][j][i]==1) // покажем след фигуру display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, BLACK); else display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, WHITE); } display.display(); NumNext=a; tempspeed=myspeed-(Victory/30)*50; // через каждые 30 линий увеличим скорость падения; dxx=0; for (byte i=0;i0) display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk, rk, ZWART); anders display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, WIT);<4;i++) for (j=0;j<4;j++) if (fig[j][i]==1) if (i+FigX+dx<0 || i+FigX+dx>ds(Overwinning,1);<4;i++) for (j=0;j<4;j++) if (fig[j][i]==1) {mstacan=1; dxx=0; } } // переместили фигуру на новые координаты else { if (pov) figmove(0,8); for (i=0;i<4;i++) // восстановили фигуру for (j=0;j<4;j++) if (fig[j][i]==1) mstacan=1; } return(flag); } //================================================ void clearstacan() { for (byte i=0;iweergave.weergave(); ) //============================================== ================ = void ds(int aa, int b) ( display.fillRect(55, 10, 29, 10, WIT); display.setCursor(55,b* 10); display.println(aa) //=== =============================== ========================== bool iffig(int dx , int dy) (int i,j; bool vlag=true; bool pov=false ; voor (i=0;i
En je kunt vechten. Het spel ondersteunt binding met elke afstandsbediening. Om dit te doen, drukt u aan het begin van het spel, wanneer u wordt gevraagd "Druk op OK", op de knop op de afstandsbediening die verantwoordelijk is voor het draaien van de figuur. Als de afstandsbediening van het spel al bekend is, start het spel onmiddellijk. Als de afstandsbediening nieuw is, komt de code voor de OK-knop niet overeen met de opgeslagen code en moet je in het spel achtereenvolgens op de knoppen "Links", "Rechts" en "Omlaag" drukken. Deze knoppen worden opgeslagen in het niet-vluchtige geheugen van de Arduino en vervolgens wordt deze specifieke afstandsbediening onmiddellijk herkend zodra u op de “OK”-knop drukt.


Wanneer u “faald” op de verzamelde lijn, wordt er een piep gespeeld. Het is geïmplementeerd op basis van verschillende Arduino-pinnen (in ons geval 9) om PWM op een bepaalde frequentie te produceren.
Het spel ondersteunt alle kenmerken van een normaal spel. Er is ook een hint voor het volgende figuur en de huidige score. Het spel houdt records bij. Deze waarde wordt opgeslagen in het niet-vluchtige geheugen van Arduino. Om het record te resetten, wijzigt u gewoon de waarde flfirst=1234 in de schets naar een andere waarde. Het spel verhoogt ook automatisch de valsnelheid elke 30 afgeschreven regels, zodat je niet voor onbepaalde tijd kunt spelen). De schets is niet geoptimaliseerd of zorgvuldig uitgevoerd, maar voor de lol geschreven. Als iemand een fout vindt, schrijf dan. Over ©. Je mag de schets naar eigen wens bewerken. Alleen als u uw opties ergens publiceert, geef dan een link naar de originele bron aan).
Waarom deed ik het - lange weekenden + “uit liefde voor kunst.” Als mijn dochter klein was, zou ik voor 8 maart waarschijnlijk, net op tijd, een minigokautomaat voor haar poppenkamer maken. Ik zou een paar spellen toevoegen, zoals Snake en Arkanoid, en waarschijnlijk de behuizing uit de PCB snijden. Alleen mijn dochter verdedigt dit jaar al haar doctoraat, dus het is een misser, maar misschien is dit idee nuttig voor iemand anders).

Laten we het samenvatten voor het Nokia 5110-display:
Pluspunten
+Mogelijkheid om afbeeldingen weer te geven;
+Geen problemen met het Cyrillische alfabet;
+Laag gewicht;
+Uitstekende verhouding afmetingen/hoeveelheid weergegeven informatie;
+De voordelen van de gebruikte LCD-technologie zijn een laag energieverbruik en een goede leesbaarheid bij fel licht;
+ Schakelbare achtergrondverlichting;
+Prijs.

Nadelen
-De achtergrondverlichting is ongelijkmatig;
-De afbeelding is zwart-wit (geen tinten);
-De noodzaak om voor 3,3V te zorgen, niet elke Arduino heeft zo'n spanning.

Oordeel: Voor zijn geld, gebaseerd op het geheel van zijn kenmerken, bezet het vol vertrouwen zijn niche; het is niet voor niets dat het zo'n lange levensduur heeft onder de weergaveapparaten voor Arduino.

Ik ben van plan +102 te kopen Toevoegen aan favorieten Ik vond de recensie leuk +148 +269

Weet je nog die keren dat mobiele telefoons ‘oaky’ waren, ze een apart toetsenbord met drukknoppen hadden en een klein monochroom LCD-scherm?

Nu behoort deze markt tot allerlei soorten iPhones, Galaxy, enz., maar displays vinden een nieuwe toepassing: doe-het-zelf-projecten!

Het zwart-witscherm van 84x48 pixels dat we zullen beschouwen, werd gebruikt in Nokia 3310-telefoons. Hun belangrijkste voordeel is het bedieningsgemak. Zo'n display past perfect in uw project voor interactieve informatie-uitwisseling met de gebruiker.

In dit artikel zullen we kijken naar het besturen van dit grafische display met behulp van Arduino. Er wordt rekening gehouden met alle aansluitmogelijkheden, technische kenmerken van het display en het programma voor Arduino.

Benodigde materialen

  • Arduino of zijn kloon.
  • Connectoren.
  • Printplaat.

Nokia 5110 schermspecificaties

Voordat we het display aansluiten en de Arduino programmeren, laten we eerst wat algemene informatie erover bekijken.

Pin-out

Om gegevens op het display aan te sluiten en te verzenden, worden twee parallelle rijen van 8 connectoren gebruikt. Elke pin is gemarkeerd op de achterkant van het display.


Zoals reeds vermeld, zijn de pinnen parallel aan elkaar verbonden. Hieronder vindt u informatie over het doel van elke connector.


Voeding

U heeft al gemerkt dat het 5110 LCD-scherm twee stroomaansluitingen heeft. De eerste is de belangrijkste: het voeden van de displaylogica. In de datasheet staat dat deze moet worden geselecteerd in het bereik van 2,7 - 3,3 V. Bij normaal gebruik verbruikt het display 6 tot 7 mA.

De tweede voedingsconnector is voor de achtergrondverlichting van het display. Als je het display zelf van het bord verwijdert (dit is niet nodig, je kunt gewoon naar de onderstaande figuur kijken), zul je zien dat de achtergrondverlichting heel eenvoudig is geïmplementeerd: vier witte LED's, die zich in de hoeken van het bord bevinden. Houd er rekening mee dat er geen stroombegrenzende weerstanden zijn.


Je moet dus voorzichtiger zijn met je dieet. Bij het aansluiten van de "LED"-pin kunt u een stroombegrenzingsweerstand gebruiken of een maximale voedingsspanning van 3,3 V gebruiken. Vergeet niet dat LED's hoge stromen kunnen absorberen! Zonder beperking zullen ze ongeveer 100 mA verbruiken bij een voedingsspanning van 3,3 V.

Besturingsinterface

Het display heeft een ingebouwde controller: Philips PCD8544, die de enorme parallelle interface omzet in een handigere seriële interface. De PCD8544 wordt bestuurd met behulp van een synchroon serieel protocol, vergelijkbaar met SPI. Merk op dat er tijdteller (SCLK) en seriële data-invoer (DN) pinnen zijn, evenals active-low chip select (SCE).

Boven de beschouwde seriële connectoren is er nog een connector geïnstalleerd - D / C, waarmee informatie wordt ontvangen over de vraag of de gegevens die worden verzonden, kunnen worden weergegeven.

Voor een lijst met opdrachten raadpleegt u het gedeelte 'Instructies' van het PCD8544-gegevensblad (pagina 11). Er zijn opdrachten die het scherm leegmaken, pixels omkeren, de stroom uitschakelen, enz.

Het 5110-display monteren en aansluiten

Voordat u de schets uploadt en gegevens naar het display overbrengt, moet u de verbinding begrijpen. Om dit te doen, moet je het probleem van het monteren en aansluiten op Arduino oplossen.

Montage

Om het beeldscherm te “assembleren” heeft u mogelijk connectoren nodig. 8 stuks zijn voldoende. Je kunt rechte poten of 90 graden poten gebruiken. Afhankelijk van verder gebruik. Als u van plan bent een printplaat te gebruiken, is een rail met rechte connectoren waarschijnlijk de beste keuze.

LCD-scherm van Nokia 5110 gemonteerd op een miniprintplaat:


Je kunt de adapters ook rechtstreeks op het display solderen.

Een 5110-display aansluiten op Arduino

In dit voorbeeld zullen we een LCD-scherm aansluiten op een Arduino. Een vergelijkbare techniek kan eenvoudig worden aangepast aan andere borden en microcontrollers. Om de gegevensoverdrachtpinnen - SCLK en DN(MOSI) - aan te sluiten, gebruiken we Arduino SPI-pinnen, die een snelle gegevensoverdracht mogelijk maken. Chipselectie (SCE), reset (RST) en data/control (D/C) pinnen kunnen op elke digitale pin worden aangesloten. De output van de LED is verbonden met een pin op de Arduino, die PWM-modulatie ondersteunt. Hierdoor is een flexibele aanpassing van de helderheid van de achtergrondverlichting mogelijk.

Helaas kan de maximale voedingsspanning van het 5110-display 3,6 volt bereiken, waardoor deze niet rechtstreeks op de standaard 5 V-uitgang van de Arduino kan worden aangesloten. De spanning moet worden aangepast. Dienovereenkomstig verschijnen er verschillende verbindingsopties.

Directe verbinding met Arduino

De eenvoudigste optie is om rechtstreeks verbinding te maken met Arduino. In dit geval moet u gebruiken Arduino-borden Pro 3,3V/8MHz of 3,3V Arduino Pro Mini.


De hieronder voorgestelde optie werkt met Arduino 5V-kaarten. Dit is een werkende optie, maar de levensduur van het scherm kan enigszins worden verkort.


Pinnen zijn als volgt verbonden: Een goede en goedkope optie om extra bescherming te bieden is het installeren van weerstanden tussen de gegevensoverdrachtpinnen van de Arduino naar de LCD 5110. Als u gebruik maakt van Arduino Uno


De aansluiting is hetzelfde als in het eerste voorbeeld, maar in elk signaalcircuit is een weerstand geïnstalleerd. Er zijn weerstanden van 10 kOhm geïnstalleerd tussen de SCLK-, DN-, D/C- en RST-pinnen. Tussen de SCE-pinnen en pin 7 zit een weerstand van 1 kOhm. Er blijft 330 Ohm over tussen pin 9 en de pin met de LED. en pin 7.

Niveau-omzetters

De derde aansluitmogelijkheid is het gebruik van niveauconverters om te schakelen tussen 5 en 3,3 V. Voor deze doeleinden kunt u gebruik maken van Bi-Directional Logic Level Converter of TXB0104-modules.


Helaas zijn er op het display vijf ingangen voor een 3,3 V-signaal, en vier op de niveauconverters. Je kunt de RTS-uitgang hoog laten (door deze aan te sluiten met een weerstand van 10k ohm). Als gevolg hiervan kunt u niet langer bepalen hoe het beeldscherm opnieuw opstart, maar zijn alle andere functies beschikbaar.

Eerste Arduino-schetsvoorbeeld: LCD-demo

Na een succesvolle verbinding kunt u doorgaan met het downloaden van de schets en het weergeven van de gegevens op het display!

Programma voor Arduino

De opmerkingen in de bovenstaande code moeten u helpen het programma te begrijpen. Het grootste deel van de actie vindt plaats binnen de functie lcdFunTime().

Schets in actie

Na het uploaden naar de Arduino begint de schets te werken en wordt een demo gelanceerd: een reeks standaardanimaties en het testen van grafische functies. Laten we eerst een paar pixels weergeven. Daarna gaan we verder met het weergeven van lijnen, rechthoeken en cirkels, het laden van een bitmap, enz.


Na voltooiing van de schets schakelt de monitor via het seriële protocol over naar de gegevensoverdrachtmodus. Open de seriële monitor (met een baudrate van 9600 bps). Wat u op de seriële monitor afdrukt, verschijnt op de LCD-monitor.

Als u geïnteresseerd bent in de weergavemogelijkheden van rasterafbeeldingen, lees dan verder. We zullen precies bekijken hoe u uw eigen 84x48 bitmapafbeelding kunt importeren en op het scherm kunt weergeven.

Tweede voorbeeld Arduino-schets: bitmaps laden en weergeven

In dit voorbeeld maken we een nieuwe 84x48 bitmap, integreren deze in de Arduino-code en sturen deze naar de LCD-monitor.


Zoek/maak/wijzig een bitmap

Zoek eerst de afbeelding die u op het 5110 LCD-scherm wilt weergeven. U kunt deze niet te veel uitbreiden naar 84x48 pixels, maar het is nog steeds mogelijk. Hier zijn enkele voorbeelden:

Nadat u een afbeelding hebt geselecteerd, moet u deze corrigeren: maak deze monochroom (2-bit kleur); houd het formaat 84x48 pixels aan. Hiervoor kunt u de meeste afbeeldingseditors gebruiken. Inclusief Paint, als je Windows hebt. Sla de resulterende afbeelding op.

Een bitmap converteren naar een array

De volgende stap is het converteren van dit bestand naar een tekenarray van 504 bytes. Om dit te doen, kunt u verschillende programma's gebruiken. Bijvoorbeeld LCD-assistent.

Om een ​​afbeelding in LCD Assistant te laden, gaat u naar Bestand > Afbeelding laden. Er zou een venster met een voorbeeldafbeelding moeten openen. Zorg ervoor dat de afbeelding de juiste grootte heeft: 84 pixels breed, 48 pixels hoog, en dat de byte-oriëntatie is ingesteld op Verticaal en de grootte-endianness op Klein. De rest van de standaardinstellingen moeten correct zijn ingesteld (8 pixels/byte)

Ga hierna naar het tabblad Bestand > Uitvoer opslaan om een ​​tijdelijk tekstbestand te genereren. Open dit tekstbestand om uw prachtige nieuwe array te bekijken. Wijzig het arraytype in char (niet unsigned of const). Zorg er ook voor dat de array de juiste naam heeft (geen streepje, niet begint met een getal, enz.).

Importeer in schets en teken!

Kopieer de gemaakte array naar de Arduino-schets. U kunt de schets uit het eerste voorbeeld gebruiken. Plak uw array waar dan ook. Om nu uw schets weer te geven, vervangt u setup() en loop() in uw schets door de onderstaande regels (houd de andere functies en variabelen hetzelfde):

// ...variabelen, constanten en bitmaparrays zijn hierboven gedefinieerd

lcdBegin(); // Pinnen configureren en het LCD-scherm initialiseren

setContrast(60); // Pas het contrast aan (voorkeursbereik is van 40 tot 60)

setBitmap(vlamBitmap); // flameBitmap moet worden vervangen door de naam van uw array

updateDisplay(); // Update het display om de array weer te geven

// Functies voor bediening en grafische weergave op het LCD-scherm worden hieronder gedefinieerd...

Echt, het is cool geworden? Je kunt onder andere meerdere afbeeldingen importeren en kleine animaties maken! Probeer het, ik weet zeker dat je het leuk zult vinden!

Links voor het downloaden van extra programma's, bibliotheken en datasheets

Gegevensbladen voor LCD-scherm en stuurprogramma's
  • LCD-gegevensblad – Niet precies hetzelfde als de 5110, maar qua specificaties zeer vergelijkbaar
Arduino-bibliotheken en schetsen
  • PCD8544 Arduino-bibliotheek – Bibliotheek voor werkende Arduino met PCD8544 LCD-stuurprogramma
Programma's voor het maken van rasterafbeeldingen
  • TheDotFactory – Geweldige tool voor het maken van aangepaste lettertype-arrays

Laat hieronder uw opmerkingen, vragen achter en deel uw persoonlijke ervaringen. Nieuwe ideeën en projecten ontstaan ​​vaak in discussies!

Nieuwe artikelen

● Project 16: Grafische indicator. Verbinding Nokia-scherm 5110

In dit experiment zullen we kijken naar het Nokia 5110 grafische display, dat in Arduino-projecten kan worden gebruikt om grafische informatie weer te geven.

Benodigde componenten:

Het Nokia 5110 liquid crystal display is een monochroom beeldscherm met een resolutie van 84×48 op een PCD8544-controller, ontworpen om grafische en tekstinformatie weer te geven. De voeding van het beeldscherm moet tussen 2,7 en 3,3 V liggen (maximaal 3,3 V; als er 5 V wordt geleverd aan de VCC-pin, kan het beeldscherm beschadigd raken). Maar de controllerpinnen zijn +5V-tolerant, dus ze kunnen rechtstreeks op de Arduino-ingangen worden aangesloten. Een belangrijk punt is het lage verbruik, waardoor je het display vanaf het Arduino-bord kunt voeden zonder een externe voedingsbron.
Het aansluitschema voor de Nokia 5110 met Arduino wordt getoond in Fig. 16.1.

Rijst. 16.1. Aansluitschema voor Nokia 5110 naar Arduino

Om met het Nokia 5110-display te werken, zullen we de Adafruit_GFX-bibliotheek gebruiken, die uitgebreide mogelijkheden heeft voor het weergeven van afbeeldingen en tekst. In ons experiment zullen we verlichtingsgegevens ontvangen van een fotoresistor die is aangesloten op de analoge ingang van Arduino A0 en de verlichtingsgegevens uitvoeren in numerieke en grafische weergave. Het aansluitschema wordt getoond in Fig. 16.2.

Rijst. 16.2. Aansluitschema van Nokia 5110 en fotoresistor naar Arduino

De code voor onze experimentschets wordt weergegeven in Listing 16.1. We lezen de gegevens van de fotoresistor en geven de numerieke waarde weer, evenals grafisch (voortgangsbalk) de verlichtingssterkte als percentage van de maximale waarde. We nemen de waarden van minimale en maximale verlichting uit experiment 13.

// De bibliotheek verbinden #erbij betrekken #erbij betrekken // PIN 7 - RST Pin 1 op LCD // PIN 6 - CE Pin 2 op LCD // PIN 5 - DC Pin 3 op LCD // PIN 4 - DIN Pin 4 op LCD // PIN 3 - CLK Pin 5 op LCD Adafruit_PCD8544 weergave = Adafruit_PCD8544(3, 4, 5, 6, 7); const int LICHT=A0; // Pin A0 voor fotoresistoringang const int MIN_LIGHT=200 ; // Lagere verlichtingsdrempel const int MAX_LIGHT=900 ; // Bovenste verlichtingsdrempel // Variabele voor het opslaan van fotoresistorgegevens int val1,val2 = 0 ; ongeldige instellingen()(weergave.begin(); // stel het achtergrondcontrast van het scherm in // zeer belangrijke parameter! display.setContrast(60); display.clearDisplay(); // helder scherm vertraging(2000); ) lege lus()(val1 = analoogLezen(LICHT); // Lees de fotoresistorwaarden drawText(val1,1); // tekst weergeven // schaal van de potentiometerwaarde naar 0-75 val2= kaart (val1, MIN_LIGHT, MAX_LIGHT, 0, 75); // uitvoer zwarte rechthoek in% display.fillRect(5, 25, val2, 10, 1); // voer het witte deel van de rechthoek uit display.fillRect(5 +val2,25, 75 -val2, 10, 0); weergave.weergave(); vertraging(1000); // pauzeren vóór nieuwe meting drawText(val1,2); // tekst wissen) // tekstuitvoerprocedure void drawText( niet-ondertekend lang nummer, int kleur)( display.setTextSize(2); // lettergrootte display.setCursor(20,5); // cursorpositie if (kleur==1) display.setTextColor(ZWART); // druk de waarde af anders display.setTextColor(WIT); // wissen (wit op wit) display.print(num); )
Aansluitvolgorde:

1. Sluit de displaysensor en de fotoresistor van de Nokia 5110 aan volgens het diagram in Afb. 16.2.
2. Laad de schets uit Listing 16.1 op het Arduino-bord.
3. Blokkeer de lichtstroom met uw hand en kijk naar de verandering in de verlichtingswaarden op het beeldscherm.

Programmavermeldingen

Eerder in deze blog kwamen verschillende LCD-displays/indicatoren en hun gebruik vanuit Arduino aan bod. Hun belangrijke nadeel is hun vrij grote omvang en gewicht. Vaak is dit geen probleem. Als u bijvoorbeeld een doe-het-zelf-soldeerstation in een zelfgemaakte behuizing monteert, maakt het op de een of andere manier niet uit hoe groot het display is. Aan de andere kant, als je een display nodig hebt op bijvoorbeeld een quadcopter, dan worden gewicht en grootte van cruciaal belang. Daarom zullen we vandaag leren werken met een heel klein en licht scherm van de Nokia 5110-telefoon.

Opmerking: Andere berichten over het onderwerp schermen - Geleerd om tekst weer te geven op een LCD-indicator van Arduino, Over het gebruik van 1602-schermen met een I2C-adapter, Werken met LCD gebaseerd op HD44780 zonder bibliotheken, en Digitale thermometer van een LCD-matrix, TMP36 en Arduino.

Maak je geen zorgen, je hoeft de Nokia 5110, die vandaag de dag feitelijk niet bestaat, niet te kopen, het scherm eruit te halen en alle andere onderdelen weg te gooien. Het Nokia 5110-scherm is een veelgebruikte zelfstandige module voor radioamateurs en kost tussen de $ 2 en $ 5, afhankelijk van de winkel. In Rusland kan de module bijvoorbeeld worden gekocht op tpai.ru, arduino-kit.ru, amperkot.ru, compacttool.ru, chipster.ru of electromicro.ru. En natuurlijk worden de schermen op AliExpress voor de laagste prijs verkocht, maar je zult wel een maand of twee moeten wachten tot ze uit China arriveren.

Zoals vaak gebeurt in de Arduino-wereld, zijn er al kant-en-klare bibliotheken voor de module, en meer dan één. Ik vond de LCD5110-bibliotheek leuk die op de website rinkydinkelectronics.com werd geplaatst. Deze bibliotheek heeft twee versies. De eerste heet LCD5110_Basic. Het is eenvoudiger en kan alleen tekst weergeven in lettertypen van verschillende groottes. Het is mogelijk om uw eigen lettertypen te maken. De tweede versie heet LCD5110_Graph. Het heeft alle mogelijkheden van de eerste bibliotheek en kan daarnaast segmenten, rechthoeken, cirkels, enzovoort tekenen.

Voor de doeleinden van dit bericht wordt de LCD5110_Basic gebruikt. Beide bibliotheken zijn goed gedocumenteerd en bevatten veel gebruiksvoorbeelden, dus als u LCD5110_Graph nodig heeft, kunt u dit eenvoudig zelf uitzoeken. Het is echter vermeldenswaard dat ik, om LCD5110_Basic zonder waarschuwingen te laten compileren, een paar kleine wijzigingen in de code moest aanbrengen.

Een voorbeeld van het gebruik van de bibliotheek:

#erbij betrekken

extern uint8_t BigNumbers ;
extern uint8_t MediumNumbers ;
extern uint8_t SmallFont ;

/* SCK / CLK, MOSI / DIN, DC, RST, CS */
LCD5110lcd(2, 3, 4, 6, 5);

ongeldige instellingen()
{
lcd.InitLCD();
}

int ctr = 0;
lege lus()
{
lcd.clrScr();

LCD.setFont(BigNumbers) ;
lcd.printNumI(ctr, RECHTS, 0);

LCD.setFont(MediumNumbers) ;
lcd.printNumF(12.34, 2, RECHTS, 24);

LCD.setFont(Klein lettertype) ;
lcd.print ("Lijn 1" , 0 , 8 * 0 );
lcd.print("Lijn 2", 0, 8 * 1);
lcd.print ("Lijn 3" , 0 , 8 * 2 );
lcd.print ("L 4" , 0 , 8 * 3 );
lcd.print ("L 5" , 0 , 8 * 4 );
lcd.print ("0123456789ABCD" , 0 , 8 * 5 );

Ctr + = 5;
als (ctr >= 1000 )
ctr = 0;

Vertraging(500);
}

Hoe het eruit ziet in actie:

Ik hoop dat het niet nodig is om op de code te kauwen. Houd er rekening mee dat de module wordt gevoed door 3,3 V, maar dat hij normaal gesproken commando's van Arduino begrijpt zonder enige logische niveau-omzetters. Dienovereenkomstig verbinden we de VCC (stroom) en BL (achtergrondverlichting) pinnen met 3,3 V, verbinden we GND met aarde en verbinden we de resterende vijf pinnen met de digitale pinnen van Arduino. We geven de pincodes door aan de klasseconstructor LCD5110 in overeenstemming met de opmerkingen in de gegeven code.

Eenvoudig, nietwaar? Je kunt de volledige broncode voor dit bericht vinden in deze GitHub-repository. Aanvullingen en vragen zijn, zoals altijd, op alle mogelijke manieren welkom.

Toevoeging: De auteur van de bibliotheek voor het werken met het Nokia 5110-scherm is ook de auteur van de OLED_I2C-bibliotheek, ontworpen om te werken met even populaire OLED-schermen met een I2C-interface. Een voorbeeld van het gebruik van OLED_I2C vind je in het bericht Een Sega Genesis-joystick gebruiken in Arduino-projecten. Zoals je zou verwachten, hebben de twee bibliotheken een vergelijkbare interface.