digirakuda ようこそ!  コンピュータの世界へ!

RaspberryPi2で電光掲示板を作ろう!

RaspberryPiという小型のコンピュータを使って、電光掲示板を製作します。

完成図

用意するもの

名称 個数 金額 型番 リンク
RaspberryPi2 1 \5,589 Link
microSDカード 1 \648 SP008GBSTHBU1V10-SP(8GB以上あればなんでも可) Link
microSDカードライタ 1 \1,200 Link
無線LANドングル 1 \800 Link
Adafruit RGB matrix 1 \3,200 Link
ジャンパ線 30 \1,000 Link
スイッチング電源 1 \500 定格5V 4A Link

RaspberryPiのセットアップ

セットアップは下記を行いましょう.
  1. OS(Raspbiann)インストール
  2. 言語、キーボードレイアウトの設定
  3. 無線LAN設定

今回は、この手順の説明は省略します。
セットアップをしていない方は、コチラに記載していますのでどうぞ。

必要なツールのインストール

Python,GCC,Gitのインストール

OSは,Raspbiannを選択しましたので,aptというパッケージ管理ツールを使って、ツールを入れていきます。
下記のコマンドで、Python,Gcc(C,C++のコンパイラ群)とGit(バージョン管理ツール)をインストールします。

  
$ sudo apt-get update
$ sudo apt-get install git
$ sudo apt-get install gcc
$ sudo apt-get install g++
$ sudo apt-get install python
$ sudo apt-get install python-imaging
  

pipの導入

Pythonのライブラリを簡単にインストールするために、pipというものをインストールします。
下記のコマンドを入力しましょう。
  
$ sudo apt-get install python-pip
  
  
$ sudo apt-get install python-pip
  
その後、pipで、下記ライブラリをいれておきます。
  
$ sudo pip install Pillow
$ sudo pip install feedparser
  

フォントのインストール

フォントは、電光掲示板に表示する文字のフォントをインストールします。(ここでは、takao-mincho)
  
$ sudo apt-get install ttf-takao-mincho
  
これで、必要なソフトはインストールできました。

Adafruitライブラリの導入

さて、RaspberryPiでAdafruit社のmatrixを制御するにはライブラリが必要です。
まずは、ホームディレクトリに、作業用のディレクトリを作成しましょう。

  
$ cd ~
$ mkdir work
  
作業ディレクトリを作成後、そのディレクトリに移動し、ライブラリをGit cloneコマンドでクローンします。
  
$ cd work
$ git clone https://github.com/hzeller/rpi-rgb-led-matrix
  
rpi-rgb-led-matrixというディレクトリができているはずなので、移動します。
  
$ ~/work:cd rpi-rgb-led-matrix
  
その後、直下で makeを実行します.
  
$ make
  
これで、ライブラリを動かす準備は整いました。

Adafruit 回路の組み立て

ライブラリ本家の接続図を参考に作成しております。コチラ→https://github.com/hzeller/rpi-rgb-led-matrix/blob/master/wiring.md
回路のピン配置を図にしていますので、参考にどうぞ。
電光掲示板の方に、RaspberryPiのピン番号を記載していますので、そのとおりに接続すれば問題ないはずです。
左側:電光掲示板 右側:RaspberryPi

回路の接続表は以下のとおりです。(画像では、G1,B1,R1→G0,B0,R0 G2,B2,R2→G1,B1,R1になっています。)

Connection(matrix) Pin(Rasberry Pi) Pin(Rasberry Pi) Connection(matrix)
1 2
3 4
5 6 GND
STB 7 8 -
- 9 10 -
CLK 11 12 OE-
G1 13 14
A 15 16 B
17 18 C
B2 19 20
G2 21 22 D
R1 23 24 R2
25 26 B1
27 28
29 30
31 32
33 34
35 36
37 38
39 40

※1 私が買った時は、STB->LATになっていましたので、読みかえてください。
※2 Dのピンは、32×32以上でないと必要ありませんので、今回は使用しません。

電光掲示板を動かそう!

Adafruitのライブラリは、様々なことができるようになっております。
その中でも,デモとして使われているppmファイルの読み込みを利用した電光掲示板を紹介します。

Adafruitライブラリの導入の章では、最後にmakeをして終わりました。
その続きからです。
makeをしたら、led-matrixという名のバイナリファイル(実行形式ファイル)が作成されています。
作業用フォルダに移動して、確認しましょう。

    
$ cd ~/work/rpi-rgb-led-matrix
$ ls
    
確認できましたか?
作成されていれば、下記のコマンドを実行しましょう。(電光掲示板の電源を入れておくことを忘れずに)
16*32の場合
  
$ sudo ./led-matrix -t 300 –r 16 -c 1 -D 1 runtext16.ppm
最新だと以下になると思います。
$ sudo ./led-matrix -t 300 --led-rows=16 --led-chain=1 -D 1 test.ppm
  
16*64の場合
  
$ sudo ./led-matrix -t 300 –r 16 -c 2 -D 1 test.ppm
最新だと以下になると思います。
$ sudo ./led-matrix -t 300 --led-rows=16 --led-chain=2 -D 1 runtext16.ppm
  
引数の、-c(--led-chain)が変わります。
デモが流れるはずです。

流れていない場合、もしくは表示がおかしい場合は下記が考えられます。
・電光掲示板の回路接続がピンアサインどおりになっていない。
・電光掲示板の電源を、RaspberryPiから取ってきてしまっている。(電圧が足りてない)

※現在の最新ライブラリのバージョンでは、この記事のコマンドは使用できない可能性があります。
GitHubのhttps://github.com/hzeller/rpi-rgb-led-matrix/tree/master/examples-api-useを参照してください。

電光掲示板にニュースを流そう!

電光掲示板を動かすために、ppmファイルを読み込んで、電光掲示板に表示させるということをやりました。
次は、それを応用してニュースを表示できるようにしましょう。
RSSフィード取得→取得した文字をppmファイルにする→電光掲示板に表示という流れになります。

PythonでRSSフィードを取得

ニュースを表示させるために、Pythonを使って、RSSフィードというものを取得します。
RSSは、Webサイトの更新情報/見出しなどをXMLにまとめているものです。
Pythonを使って、このRSSフィードを取得しましょう。
まず、下記のコマンドを実行して、feedparser(RSSフィードをいい感じに解析してくれるライブラリ)を導入します。

      
$ pip install feedparser
      
    
では、feedparserを使ってみます。
その前に、作業用ディレクトリに移動します。
      
$ cd ~/work/rpi-rgb-led-matrix
$ nano feed.py
      
    
下記のプログラムを作成しましょう。

feed.py
      
# coding: utf-8
import feedparser
url = "http://news.yahoo.co.jp/pickup/economy/rss.xml"
fd = feedparser.parse(url)

print fd.feed.title
print fd.feed.link
      
    
Yahoo!のニュース(経済)から、見出しを取ってきて、それを表示しています。
Yahoo!の公開しているRSSフィード一覧は、http://headlines.yahoo.co.jp/rss/listです。
表示したいニュースの見出しのリンクを、url引数に入れましょう。

ppmファイルを生成する

Pythonを使って、RSSフィードの取得ができました。
次に、電光掲示板に表示するppmファイルを生成しましょう。
作業用ディレクトリに移動し、message.pyというプログラムを作成します。
      
$ cd ~/work/rpi-rgb-led-matrix
$ nano message.py
      
    
message.py
      
#encoding:UTF-8
import os
import feedparser
import sys #モジュールargv
import time
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw

argvs = sys.argv #コマンドライン引数を格納したリストの取得
argc = len(argvs) #引数の長さ min:1

def urlSelector(arg):
    if arg==0:#top
        return ('http://rss.dailynews.yahoo.co.jp/fc/rss.xml')
    elif arg==1:#domestic
        return ('http://rss.dailynews.yahoo.co.jp/fc/domestic/rss.xml')
    elif arg==2:#world
        return ('http://rss.dailynews.yahoo.co.jp/fc/world/rss.xml')
    elif arg==3:#economy
        return ('http://rss.dailynews.yahoo.co.jp/fc/economy/rss.xml')
    elif arg==4:#entertainment
        return ('http://rss.dailynews.yahoo.co.jp/fc/entertainment/rss.xml')
    elif arg==5:#sports
        return ('http://rss.dailynews.yahoo.co.jp/fc/sports/rss.xml')
    elif arg==6:#computer
        return ('http://rss.dailynews.yahoo.co.jp/fc/computer/rss.xml')
    elif arg==7:#science
        return ('http://rss.dailynews.yahoo.co.jp/fc/science/rss.xml')
    elif arg==8:
        return ('http://rss.dailynews.yahoo.co.jp/fc/local/rss.xml')
    else:
        return ('http://rss.dailynews.yahoo.co.jp/fc/rss.xml')

#テキスト出力する。
#yahooRSSから取得する.
#引数を見て、ニュースサイトをセレクト
if argc==1:
    fd = feedparser.parse('http://rss.dailynews.yahoo.co.jp/fc/rss.xml')
else:
    fd = feedparser.parse(urlSelector(int(argvs[1])))

news1 = unicode(fd.entries[0].title)
news2 = unicode(fd.entries[1].title)
news3 = unicode(fd.entries[2].title)
text = ((u"    " + news1,(255,0,255)),(u"    " + news2,(0,255,255)),(u"    " + news3,(0,255,0)))

font = ImageFont.truetype("/usr/share/fonts/truetype/takao-mincho/TakaoMincho.ttf", 16)
all_text = ""
for text_color_pair in text:
    t = text_color_pair[0]
    all_text = all_text + t

width, ignore = font.getsize(all_text)

im = Image.new("RGB", (width + 30, 16), "black")
draw = ImageDraw.Draw(im)

x = 0;
for text_color_pair in text:
    t = text_color_pair[0]
    c = text_color_pair[1]
    draw.text((x, 0), t, c, font=font)
    x = x + font.getsize(t)[0]

im.save("test.ppm")
      
    
プログラムを作成したら、早速実行してみます。
  
$ python message.py
  
フォルダに、test.ppmというファイルができているはずです。
確認してみましょう
  
$ ls
  
ありましたか?
できているならば、電光掲示板に表示してみましょう。
※赤字の部分が、デモを動かしたときのコマンドから変更した部分です。(-D はデモでしか使用しないため削除しています。)
  
$ sudo ./led-matrix -t 300 –r 16 -c 2 test.ppm
最新だと以下になると思います。
$ sudo ./led-matrix -t 300 --led-rows=16 --led-chain=2 test.ppm
  

電光掲示板を自動的に更新するようにしよう!

これを実現するためには、Linuxに標準で搭載されているcronというものを使用します。
Cronは、設定ファイルを基にコマンドやシェルスクリプト等を定期的に実行してくれるものです。

シェルスクリプトの作成

作業用ディレクトリに移動し、下記のシェルスクリプトを作成します。
  
$ cd ~/work/rpi-rgb-led-matrix
$ nano Update.sh
  
Update.sh
  
#!/bin/sh

arg1=$(( $(od -vAn -N4 -tu4 < /dev/random) % 10 ))
cd ~/work/rpi-rgb-led-matrix
python message.py ${arg1}
sudo pkill led-matrix
sudo ./led-matrix –t 300 –r 16 –c 2 –D 1 test.ppm
  
このシェルスクリプトは、0~9までのランダムな数字を、ppmファイル生成プログラムの引数として渡します。
その後、電光掲示板のプロセスを終了させ、新たに電光掲示板のプロセスを生成します。

再起動するスクリプトも用意しておきましょう。
Reboot.sh
  
#!/bin/sh

sudo reboot
  
シェルスクリプトを実行させるには、実行権限を付与する必要があるので下記コマンドを入力します。
  
$ sudo chmod +x Update.sh
$ sudo chmod +x Reboot.sh
  

Crondが起動しているかの確認。
下記コマンドで起動しているかを確認します。
  
$ etc/rc.d/init.d/crond status
  
Crond (pid xxx)を実行中・・・
と表示されていれば実行されています。
そうでなければ、下記コマンドで起動させましょう。
  
$ etc/rc.d/init.d/crond start
  
また、OS起動時にcronが自動実行されるように下記コマンドを入力しましょう。
  
$ sudo chkconfig --level 2345 crond on
  

Crontabの登録

  
$ crontab –e
  
Crontabに以下のように登録します。
月曜日から金曜日の 9 – 20時の間で,Update.shが実行されます。
また、21:10にRaspberry Piを再起動するように仕込んできます。
  
*/5 9-20 * * 1-5 /home/pi/work/rpi-rgb-led-matrix/Update.sh
10 21 * * 1-5 /home/pi/work/rpi-rgb-led-matrix/Reboot.sh
  
(Update.shを実行可能にするために、sudo chmod +x Update.shを実行しておくこと)
完成です!