Orangepi PCでInternet Radioを構築する

lcd表示プログラム


OrangePi PCでインターネットラジオを構築する手順を紹介します。
インターネットラジオとしては以下の機能を持っています。
・ラジオステーションの選択やスピーカボリュームの変更を赤外線リモコンを使って行う
・再生中のアーティスト名と曲名をリアルタイムにLCDに表示する

今回は、再生中のアーティスト名と曲名をリアルタイムにLCDに表示する手順を紹介します。
LCDとしては、HD44780のコントローラを搭載した一般的な16文字2行表示のLCDを使用します、
秋月電子で売られているSUNLIKE社製のSC1602BSLB(バックライト付き)/SC1602BS*B(バックライト無し)などもこれに 該当します。
私はもっぱらAliExpressから購入していますが、$2以下で購入することができます。

【wiringOPのインストール】

こちらで RaspberryPi+wiringPiでの制御を紹介していますが、OrangePi PCでもwiringPi(wiringOP)が使えます。
最初にOrangePi PC用のwiringPi(wiringOP)をインストールします。
$ git clone https://github.com/zhaolei/WiringOP.git -b h3
$ cd WiringOP/
$ sudo ./build
$ gpio -v
gpio version: 2.20
Copyright (c) 2012-2014 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Banana Pro Details:
  Type: Banana Pro, Revision: 1.2, Memory: 1024MB, Maker: LeMaker

【LCDとの接続】

LCDとOrangePi PCとの接続は以下の通りです。
結線図のボードは他のページの図を流用したのでRaspberryPiになっています。




LCDのピン番号 LCDのピンのSymbol OrangePiのピン番号 WringPi番号
1 Vss(GND) GND
2 Vdd(※1) 5V
3 Vo(Contrast Adj)(※2) 可変抵抗(10KΩ)の出力
4 RS(Register Select) 16 4
5 R/W(Read/Write)(※3) GND
6 Enable Signal(Clock) 18 5
7 DB0 N/C
8 DB1 N/C
9 DB2 N/C

10 DB3 N/C
11 DB4 11 0
12 DB5 12 1
13 DB6 13 2
14 DB7 15 3
15 BackLight A(※4) 5V
16 BackLight K GND

(※1)駆動電圧が3.3Vのモジュール(低電圧版)と5Vのモジュールが有ります。5V版は3.3Vでは動きません
(※2)個体差があるかもしれませんがGNDでも大丈夫なぐらい低電圧です。
(※3)今回はWriteしかしないのでGNDに落としています。
(※3)低電圧版は3.3V、5Vモジュールは5Vが基本ですが、5Vモジュールでも3.3Vで点灯するものとしないものがあります。

【LCDの動作確認】

以下のコード(lcd-gpio.c)で簡単な動作テストを行います。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <lcd.h>

int main(int argc, char **argv) {
        if(wiringPiSetup() == -1) {
                printf("Setup Fail\n");
                return 1;
        }
        int fd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0);
        lcdCursor(fd,0);
        lcdCursorBlink(fd,0);

        lcdClear(fd);
        lcdPosition(fd,0,0);
        lcdPuts(fd,"ABCDEFGHIJKLMNOP");
        lcdPosition(fd,0,1);
        lcdPuts(fd,"abcdefghijklmnop");
        return 0;
}

コンパイル、実行するとLCDに文字が表示されます。
$ c -o lcd-gpio lcd-gpio.c -lwiringPi -lwiringPiDev
$ sudo ./lcd-gpio

LCDに文字が表示されないときは接続を見直してください。

次に、以下のコード(lcd-gpio2.c)を実行します。
17文字以上表示すると、回り込んで別の行に表示されるので、16文字までの表示に制限しています。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <lcd.h>

int main(int argc, char **argv) {
        if(wiringPiSetup() == -1) {
                printf("Setup Fail\n");
                return 1;
        }
        int fd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0);
        lcdCursor(fd,0);
        lcdCursorBlink(fd,0);

        char buf[17] = {0};
        lcdClear(fd);
        if (argc >= 2) {
                strncpy(buf, argv[1], 16);
                lcdPosition(fd, 0, 0);
                lcdPuts(fd, buf);
        }
        if (argc >= 3) {
                strncpy(buf, argv[2], 16);
                lcdPosition(fd, 0, 1);
                lcdPuts(fd, buf);
        }
        return 0;
}

コンパイル、実行するとLCDに文字が表示されます。
$ c -o lcd-gpio2 lcd-gpio2.c -lwiringPi -lwiringPiDev
$ sudo ./lcd-gpio2 aaaaaaa bbbbbbb

これでLCDに再生中のアーティスト名と曲名を表示する準備が整いました。

こちらで は、PCF8574を使ったLCDの表示を紹介していますが、PCF8574を使うと、ボードとLCD間の配線は4本で済みます。

こちら
では、74HC595を使ったLCDの表示を紹介していますが、74HC595を使うと、ボードとLCD間の配線は5本で済み ます。
74HC595への給電は5Vで問題ありません。

こちらで は、LCDのバックライトの制御を紹介しています。
何も表示していなくても、バックライトに通電していると、LCDはぼんやりと光っているので、夜間は気になります。
バックライトの制御をすることで、LCDは真っ暗になります。
OrangePi PCのPin#22とトランジスタを使ってバックライトの制御を行う場合、以下のコード(lcd-gpio3.c)となります。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <lcd.h>

#define BACKLIGHT 6

int main(int argc, char **argv) {
        if(wiringPiSetup() == -1) {
                printf("Setup Fail\n");
                return 1;
        }
        pinMode(BACKLIGHT,OUTPUT);
        int fd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0);
        lcdCursor(fd,0);
        lcdCursorBlink(fd,0);

        lcdClear(fd);
        if(argc == 1) {
                digitalWrite(BACKLIGHT,0);
        } else {
                char buf[17] = {0};
                digitalWrite(BACKLIGHT,1);
                lcdClear(fd);
                if (argc >= 2) {
                        strncpy(buf, argv[1], 16);
                        lcdPosition(fd, 0, 0);
                        lcdPuts(fd, buf);
                }
                if (argc >= 3) {
                        strncpy(buf, argv[2], 16);
                        lcdPosition(fd, 0, 1);
                        lcdPuts(fd, buf);
                }
        }
        return 0;
}

引数付きで実行するとバックライトに通電して、LCDに文字を表示します。
引数無しで実行するとLCDを消してバックライトも消します。
$ c -o lcd-gpio3 lcd-gpio3.c -lwiringPi -lwiringPiDev
$ sudo ./lcd-gpio3 aaaaaaa bbbbbbb
$ sudo ./lcd-gpio3

続く...