W10IoT&RPI3 – Wyświetlacz 7-segmentowy

Właściwie to 8-segmentowy, bo jeszcze kropka. Ale zacznijmy od początku. Co to jest za wyświetlacz? Jak należy go wysterować? Jak to zrobić za pomocą W10Iot&RPI3? A na koniec wnioski które wyciągnąłem z własnej implementacji obsługi takiego wyświetlacza. Wyświetlacze 7-segmentowe zbudowane są z reguły z 7 pojedynczych ledów, bądź 7 grup ledów. Na co przede wszystkim należy zwrócić uwagę? Według mnie na to, że zazwyczaj nie posiadają żadnego sterownika, tylko sterujemy pojedynczymi ledami bezpośrednio z mikrokontrolera. Dla porównania popularne wyświetlacze 2×16 steruje się za pomocą HD44780, natomiast większość graficznych wyświetlaczy bazuje na SPI lub I2C, ewentualnie UART.

Teraz na szybko powinienem podać dwa proste pojęcia, by później uniknąć nieporozumień:

  • Segment – jeden led lub jedna grupa ledów
  • Moduł – Cała cyfra składająca się z 7,8, 9, 14 lub 16 segmentów

Common_segment_displays.svg.png

W dalszej części będę mówił o wyświetlaczu 4-cyfrowym zbudowanym z 4 8-segmentowych modułów. Warto podkreślić ze takie wyświetlacze bardzo często mają połączone wspólnie anody lub katody, by była możliwość łatwego multipleksowania.

7seg

7-segment-4-digit-display-common-anode-12-pin--pinout

Kolejne informacje generują kolejne pytania

  • Czym jest multipleksacja?
  • Dlaczego przy multipleksacji należy użyć tranzystorów?
  • Co to jest anoda/katoda?
  • Jak zrozumieć pinout takiego typu wyświetlacza?

Ale na powyższe pytania jednak nei odpowiem. Dlaczego? Gdyż chciałem skupić się na jak najprostszej obsłudze tego typu wyświetlaczy, a nie tłumaczeniu zasady działania.

Przyznam się że w sumie to nie lubię tych wyświetlaczy, gdyż obsługa ich zajmuje nie tylko dużo pinów, ale również dużo czasu pracy procesora. A taki na przykład HD44780 możemy raz ustawić i kompletnie o nim zapomnieć, a sterownik sam zadba by utrzymać obraz do czasu zmiany wyświetlanego obrazu bądź utraty zasilania. Dlaczego więc pokusiłem się o obsługę tego wyświetlacza? No po prostu ze zwykłej ciekawości, chciałem sprawdzić jak można to w wygodny sposób zaimplementować. 😀

Po tak długim wstępnie w końcu przechodzimy do sedna 😉

Zainteresowani mogą zajrzeć do źródła biblioteki  SosnusIotLib.MiscLib.DigitDisplay.cs, poniżej jednak pokażę tylko przykładowe użycie:

Kod MainPage.xaml.cs:

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using SosnusIotLib.MiscLib;

namespace LedDisplaySimpleUsing
{
    public sealed partial class MainPage : Page
    {
        DigitDisplay wyswietlacz; 

        public MainPage()
        {
            this.InitializeComponent();
            wyswietlacz = new DigitDisplay(4);
            int[] modulesArg = new int[] {04, 17, 27, 22}; //pins GPIO from RPI for modules
            int[] segmenstArg = new int[] {20, 16, 21, 05, 06, 13, 19, 26}; //pins GPIO from RPI for segments
            wyswietlacz.Setup(modulesArg, segmenstArg, 50);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            int liczbaTemp;
            if(int.TryParse(tbDigitsEnter.Text,out liczbaTemp)) //bad convert protection
                wyswietlacz.Set(liczbaTemp);
        }
    }
}
Wow. Tylko 27 linijek. Zbyt mało by pisać więcej niż trzy komentarze w kodzie. Najpierw deklarujemy obiekt, potem go inicjalizujemy, na koniec używamy przy pomocy metody . Set();
Dla formalności zawartość grida z pliku MainPage.xaml:
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Width="300">
            <TextBox Name="tbDigitsEnter"/>
            <Button Content="Write" HorizontalAlignment="Center" Click="Button_Click"/>
        </StackPanel>
To by było na tyle jeżeli chodzi o obsługę wyświetlacza 7-segmentowego. Na koniec jednak kilka uwag do biblioteki, i jej stan na dzień dzisiejszy (22.05.2017):
  • Biblioteka nie jest dokończona, będę poprawiał między innymi kwestię odświeżania
  • Oczywiście kod nie jest w pełni zgodny z ogólnie przyjętymi normami, ale w miarę czasu mam nadzieję że to poprawię
  • Pomimo tego że przewiduję zmiany wewnątrz biblioteki, to rzeczy związane z obsługą biblioteki powinny zostać bez zmian, więc powyższy kod MainPage.xaml.cs powinien śmigać bez względu na wszystko 😉
  • W konstruktorze podajemy liczbę segmentów (wyswietlacz = new DigitDisplay(4);) ale jak na razie bez względu na argument tworzą się cztery obiekty odpowiadające za 4 moduły wyświetlacza, mam nadzieję że w wolnej chwili to poprawię

Wpatrując się w wyświetlacz widać że co jakiś czas ledy lekko mrugają, teoretycznie oko ludzkie nie powinno tego widzieć przy tak szybkiej multipleksacji. Co więc jest nie tak? Wygląda na to że timerCallback nie wywołuje się w idealnie równych interwałach. Pomimo wszystko wyświetlacz działa, i mam nadzieję że w przyszłości poprawię całą bibliotekę, a przede wszystkim część odpowiedzialną za nieregularny callback.

Jaki wyciągnąłem więc wniosek z testów wyświetlacza pod malinką? Z powodu nieregularnych interwałów i dużego obciążenia procesora spowodowanego obsługą tego wyświetlacza, w sumie do większych projektów warto by przerzucić obsługę 7-segmentowca z Raspberry na jakiś mniejszy procesor (AVR/PIC/ARM/Inne) by niepotrzebnie nie tracić mocy RPI3.

Jeden komentarz na temat “W10IoT&RPI3 – Wyświetlacz 7-segmentowy”

  1. Pingback: dotnetomaniak.pl

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google

Komentujesz korzystając z konta Google. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s