2014/10/06 RaspberryPiで16*32matrix制御
Linux ShellScript Python
こんにちは、です。
今回は、RaspberryPiという小さいマシンを使って、Adafruit社16*32のドットマトリクスを光らせます。
セットアップ環境
- OS - Windows8 64bit
- RaspberryPi TYPE B+
必要なもの
- RaspberryPi TYPE B(+)
- SD or microSDカード(8GB以上) (SD - TYPE B以下) (microSD - TYPE B+)
- SDカードリーダ(ライタ)
- Adafruit 16*32 RGB matrix
- ジャンパ線 40本ほど
- スイッチング電源 5V4A ~ 5V10A
- USB無線ドングル(BUFFALO...etc)
大まかな流れ
- RaspberryPiの設定(OSインストール、Pythonインストール、無線接続の設定)
- RaspberryPiとAdafruit社RGBmatrixの接続
- Pythonプログラムの変更
- C++プログラムの変更
- シェルスクリプトプログラムの製作
- Crontabの登録
1.RaspberryPi設定
OSインストール
ここでLinuxOSを選べます。
私は、色々と入っているRaspbianをインストールしました。
こだわりがあるのであれば、他のディストリビューションを入れてみましょう。
インストール,初期設定
- OSダウンロード(Raspbiannの場合) こちらのサイトからRaspbianの最新版をDLします。
- OSをSD(microSD)に書き込む。 OSを書き込む作業は「Win32 Disk Imager」というソフトを使用します。
- 言語、キーボードレイアウトの設定 初期設定では、英国の言語、キーボード、時間となっています。
- 言語のインストール
- キーボードレイアウトの設定
- 無線LAN設定 無線LAN設定に関しても、説明を割愛します。
- Pythonインストール Pythonをインストールしましょう。
http://www.raspberrypi.org/downloads/
下記のサイトからダウンロードしてください。
http://sourceforge.jp/projects/sfnet_win32diskimager/
使い方については割愛します。
やるべきこと
以下のコマンドでインストールできます。
sudo apt-get install python
2.Adafruit社の回路を組む
接続図、セットアップは公式のドキュメントが充実しておりますので、チュートリアルを実行することをおすすめします。
Adafruit RGB matrix
3.Pythonプログラムの変更
Pythonプログラムを変更します。目的としてはRSSフィードを取得してニュースを表示させるようなプログラムにします。
RSSフィードの解析にはfeedparserというライブラリがあるのでそちらを使います
#encoding:UTF-8
import os
import feedparser
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
#encoding:UTF-8
import feedparser
import sys #モジュールargv
import time
argvs = sys.argv #コマンドライン引数を格納したリストの取得
argc = len(argvs) #引数の長さ min:1
#print argvs
#print argc
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から取得する.
#1,実行時引数を取り、ニュースサイトを変更する.
#2,crontab + shellscriptで自動実行
#3,タイマーで自動消灯
#引数を見て、ニュースサイトをセレクト
if argc==1:
fd = feedparser.parse('http://rss.dailynews.yahoo.co.jp/fc/rss.xml')
else:
fd = feedparser.parse(urlSelector(int(argvs[1])))
#サイト名を表示
#print fd.feed.title
#記事タイトルとリンクURLを表示
#for i in range(3):
# print fd.entries[i].title
#最新記事の更新時間
#updatetime = time.strftime('%Y/%m/%d %X',fd.entries[0].updated_parsed)
#print updatetime
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
#print(all_text)
width, ignore = font.getsize(all_text)
#print(width)
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]
#print("t=" + t + " " + str(c) + " " + str(x))
draw.text((x, 0), t, c, font=font)
x = x + font.getsize(t)[0]
im.save("test.ppm")
4.C++プログラムの変更
main.ccを変更します。ここを追加という箇所です。
main.cc
RGBMatrixManipulator *updater = new DisplayUpdater(&m);
updater->Start(10); // high priority
image_gen->Start();
// Things are set up. Just wait for to be pressed.
//ここを追加
for(;;){}
printf("Press to exit and reset LEDs\n");
getchar();
// Stopping threads and wait for them to join.
delete image_gen;
delete updater;
// Final thing before exit: clear screen and update once, so that
// we don't have random pixels burn
m.ClearScreen();
m.UpdateScreen();
return 0;
5.シェルスクリプトを書く
autoUpdate.sh#!/bin/sh sudo pkill led-matrix arg1=$(( $(od -vAn -N4 -tu4 < /dev/random) % 10 )) #ARG1=1 cd ~/display1_32/rpi-rgb-led-matrix python message.py ${arg1} sudo ./led-matrix 1 test.ppm
autoUpdateKill.shsudo reboot
6.Crontabの登録
*/3 9-20 * * 1-5 /home/pi/display1_32/rpi-rgb-led-matrix/autoUpdate.sh
#21:10 reboot
00 21 * * 1-5 /home/pi/display1_32/rpi-rgb-led-matrix/autoUpdateKill.sh
7.動作結果
その1 RSSニュース表示中
その2 更新中の表示部
その3 更新後のRSSニュース表示