RaspberryPiをセットアップ&Webサーバを立てて、ブラウザアクセスでLEDを光らせるところまで

f:id:j74th:20141229234258j:plain

スマホで赤外線機器を操作したいと思って、RaspberryPiが安くて簡単に無線LAN化もできるし、Debianも入るよと聞き、早速秋月電子Raspberry Pi Type B+を買ってきた。

ARMだけど、Debianが動けばなんでもできる気になるよね!

RaspberryPiのセットアップ

NOOBS LITE を使って、Debianを構築

ツールも付いてるっぽいので、NOOBS LITEを使ってインストールすることにする。

http://www.raspberrypi.org/downloads/

NOOBS LITEをダウンロード。

付属の、 INSTRUCTIONS-README.txt を見ると、SDカードのフォーマットについて記載があり、そのとおりにする。

SDカードフォーマットプログラムをダウンロード。

https://www.sdcard.org/downloads/formatter_4/eula_mac/

モードを"上書きフォーマット"に変更し、フォーマットを実施。16GのSDカードで1時間近くかかった。

SDカード内に、ダウンロードしたプログラムをすべてコピーする。このZIP、23MBしかないので、このコピーは一瞬。

その後、RaspberryPiにSDカードを挿入し、HDMIケーブル、キーボード、LANケーブルを接続し、電源ケーブルを接続して電源ONにする。

すると、RaspberryPiが起動し、インストールするOSを選択する画面が出てきた。

キーボードの"l"を押して、"日本語"を選択すると、一部だけ日本語になった。LanguageDebianマークの"Raspbian"を選択し、インストールを継続。

DHCPでネットワーク接続もでき、ネットワークインストールが始まる。2時間ほどで完了。

初回起動では"Raspberry Pi Software Configuration Tool"が立ち上がったが、特に設定せず、そのまま"Finish"を選択した。

有線ネットワーク設定

固定IPに変更する。

元のネットワーク設定

$ sudo vi /etc/network/interfaces
auto lo

iface lo inet loopback
iface eth0 inet dhcp

"eth0"の部分を変更する。IPアドレスは"192.168.1.100"とする。 ちなみに、うちは内部DNSサーバを立てているので、それを設定している。

$ sudo vi /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.100
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.50

DNSはこちらに設定しなければならないらしい。

$ sudo vi /etc/resolv.conf
nameserver 192.168.1.50
$ sudo service networking restart 

これでRaspberryPiにキーボードを接続しなくても、ユーザ名:pi、パスワード:raspberry でログインできる。 さらにはじめからsshdが起動しているため、すぐにPCからsshでアクセスできる

$ ssh pi@192.168.1.100

このあとは、すべてsshで操作する。

ユーザの作成

$ sudo adduser j74th

電子回路を扱う操作はスーパーユーザでなければ扱えないらしい。sudoで新しいユーザを扱えるようにする。

$ export EDITOR=vi
$ visudo
pi ALL=(ALL) NOPASSWD: ALL
atsushi ALL=(ALL) NOPASSWD: ALL

その他

自分のvimrcを適用して、vimを起動したところ、以下の様なエラーが出た。

$ vi
E319: Sorry, the command is not available in this version: let g:j74VimRepoPath = '~/dotfiles/vimrc/'

vimではなく、viが動いているという話らしい。.vimrcなのに。 vimをインストールしたところ、正常に動作した。

$ sudo aptitude install vim

LEDを光らせる

ブレッドボードとか、抵抗とか触ったの、大学3年の実験の授業以来だ。

配線!

秋月電子通商秋葉原店で、わけもわからず、以下のものを買ってきた。

買った本に書いてあった抵抗を購入。 ジャンパーワイヤはRaspberryPiにはメスが必要だと調べていたので、オス-メスも購入。 家に帰ってから、LEDが割高な高輝度のものだったことを知る。

試しに、以下のように配線して光ることを確認。

  • 1ピン(3.3V) -> LEDの陽極
  • LEDの陰極 -> 抵抗68Ω ->> 6ピン(GND)

制御するために、以下のように配線。

  • 11ピン(GPIO) -> LEDの陽極
  • LEDの陰極 -> 抵抗68Ω ->> 6ピン(GND)

サンプル程度を動かす

Pythonで簡単に光らせられるということで、サンプルソースをいじってみる。

mport RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)

def tikatika():
    for i in range(50):
        GPIO.output(11,True)
        time.sleep(0.2)
        GPIO.output(11,False)
        time.sleep(0.2)

tikatika()

GPIOにアクセスするには、スーパーユーザ権限が必要。

$ sudo python3 test.py

おー、光った光った。 やってることは、11ピンを0.2秒ごとにオン、オフしているだけ。

Webサーバにする

どうせなので、Webサーバにして、ひからせましょう。

from http.server import HTTPServer, SimpleHTTPRequestHandler
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)

def tikatika():
    for i in range(50):
        GPIO.output(11,True)
        time.sleep(0.03)
        GPIO.output(11,False)
        time.sleep(0.03)

class HTTPHandler(SimpleHTTPRequestHandler):
    def do_GET(self):
        res = b'TikaTika!'
        self.send_response(200)
        self.end_headers()
        self.wfile.write(res)
        tikatika()

server = HTTPServer(('192.168.1.100', 8000), HTTPHandler)
server.serve_forever()

簡易的なサーバを作のもPythonだと楽。これで、iPhoneからhttp://192.168.1.100:8000/にアクセスすると、ちかちかLEDが点滅するシステムが出来た。

この先

  • Wi-Fi
  • LEDを、赤外線LED化し、iPhoneからテレビ消したりできるようにしたい。

参考書籍

[asin:B00O2NQS4I:detail]

訳本。RaspberryPiのセットアップ画面の説明とか、電子回路のIO部分のそれぞれの説明とか書かれていて、RaspberryPiとはどんな機能を備えているのかがわかった。 最終的にはモータ駆動まで扱っているが、電子回路の理論や、プログラミングの詳細までは扱えていない。電子工作サンプルは少ない。 Linux経験者には、まずDebianサーバとしてとっつきやすい。

スイッチのために電子回路をどうすべきとか、Pythonプログラミングで使えるGPIO関数の説明とか、少しずつステップで記載されていて、電子回路をちゃんと勉強している気になる。