2014/10/06 RaspberryPiで16*32matrix制御

Linux ShellScript Python

こんにちは、です。
今回は、RaspberryPiという小さいマシンを使って、Adafruit社16*32のドットマトリクスを光らせます。

セットアップ環境

必要なもの

大まかな流れ

  1. RaspberryPiの設定(OSインストール、Pythonインストール、無線接続の設定)
  2. RaspberryPiとAdafruit社RGBmatrixの接続
  3. Pythonプログラムの変更
  4. C++プログラムの変更
  5. シェルスクリプトプログラムの製作
  6. Crontabの登録

1.RaspberryPi設定

OSインストール

ここでLinuxOSを選べます。
私は、色々と入っているRaspbianをインストールしました。
こだわりがあるのであれば、他のディストリビューションを入れてみましょう。

インストール,初期設定
  1. OSダウンロード(Raspbiannの場合)
  2. こちらのサイトからRaspbianの最新版をDLします。
    http://www.raspberrypi.org/downloads/
  3. OSをSD(microSD)に書き込む。
  4. OSを書き込む作業は「Win32 Disk Imager」というソフトを使用します。
    下記のサイトからダウンロードしてください。
    http://sourceforge.jp/projects/sfnet_win32diskimager/
    使い方については割愛します。
  5. 言語、キーボードレイアウトの設定
  6. 初期設定では、英国の言語、キーボード、時間となっています。
    やるべきこと
    • 言語のインストール
    • キーボードレイアウトの設定
    こちらに関しては、説明を割愛します。
  7. 無線LAN設定
  8. 無線LAN設定に関しても、説明を割愛します。
  9. Pythonインストール
  10. Pythonをインストールしましょう。
    以下のコマンドでインストールできます。
    	            				  	 
    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.sh
								
sudo 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ニュース表示