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のセットアップ
セットアップは下記を行いましょう.- OS(Raspbiann)インストール
- 言語、キーボードレイアウトの設定
- 無線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を実行しておくこと)完成です!