ラベル Raspberry Pi の投稿を表示しています。 すべての投稿を表示
ラベル Raspberry Pi の投稿を表示しています。 すべての投稿を表示

Day24 Raspberry Piカメラモジュールでタイムラプス撮影

今回はRaspberry Piカメラモジュールでタイムラプス撮影を行います。ハードウェアの構成は最後の写真参照。

本稿は以下のサイトを参考にしています。

###タイムラプス撮影###

まずは、Raspberry piにログインします。

#Macからログイン(-P以降はSSH用に設定したポート番号。192.168.11.7は家庭内のLanで固定したpiの無線LANのポート番号)
ssh  pi@192.168.11.7 -p XXXXX

#タイムラプス撮影(大量のjpgファイルが生成される)
mkdir /home/pi/Pictures
raspistill -o /home/pi/Pictures/image-%04d.jpg -tl 6000 -t 600000 -w 1920 -h 1080

#ログアウト
exit

#Macの任意のディレクトリにすべてのファイルをダウンロード
scp  -P XXXXX    pi@192.168.11.7:/home/pi/test ~/Pictures



####生成したファイルから動画を作る。mencoderを使用。####
#mencoderのインストール
sudo apt-get -y install mencoder

#mencoderに与えるファイルリストを生成
ls *.jpg > stills.txt

#タイムラプス画像のファイル群から動画を生成
mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=8000000 -vf scale=1920:1080 -o tlcam.avi -mf type=jpeg:fps=24 mf://@stills.txt

#動画のダウンロード
scp  -P XXXXX    pi@192.168.11.7:/home/pi/tlcam.avi  ~/Pictures

#VLCで動画再生
open -a "VLC" tlcam.avi


###raspistillの文法解説####
raspistill -o /home/pi/Pictures/image-%04d.jpg -tl 6000 -t 600000 -w 1920 -h 1080
とは

-o /home/pi/Pictures/image-%04d.jpg
連番のファイルを生成

 -tl 6000
6000ミリ秒(6sec)のタイムラプスで
-t 600000
600000ミリ秒(600sec = 10min)の間 

-w 1920
横が1920pixel

 -h 1080
縦が1080pixel

という指定をしている。





Day24 Raspberry Pi専用カメラモジュールを使う

Raspberry Pi専用カメラモジュールを使って写真撮影を試みた。

#Raspberry Piのカメラを有効化する
sudo raspi-config

設定が終わると再起動される。

静止画の撮影にはデフォルトでインストールされているraspistillコマンドを使用する。

#撮影
raspistill -o image.jpg

CUIで画像を表示させるには、
fbiかimg2txtというアプリケーションを使用すれば良いが、ssh接続ではどちらもうまく行かない。手元にダウンロードしてしまうのがよいだろう。

#ログアウト
exit

#ダウンロード
scp  -P xxxxx    pi@192.168.11.7:/home/pi/image.jpg ./image.jpg

#画像表示
open image.jpg


ピントを合わせるのに一苦労だった。どうやってこのカメラモジュールを使いこなすかは、今後の課題だ。

林和孝『Raspberry Piで遊ぼう』ラトルズ 2014

Day23 ルータのポート解放を行い、サーバーを外部に公開(びびりなのですぐにポートを閉じたが。。)

WAN側から特定のポートでアクセスがあったとき、LAN側の特定のIPアドレスにつなぐようにルータの設定をすることができる。
私のbuffalo airstationでは以下の通りである。



普段、raspberry piをインターネットに接続させず、家の中のLANだけで遊んでいるときは以下の様な環境になっている。ルーターも含めて、LAN内のすべてのデバイスにはプライベートIPアドレス(192.168.11で始まる番号)が割り当てられている。


WANとLANの関係を考慮すると以下のようになる。ルーターがプライベートとグローバルのIPアドレスを同時に持っていて、LANとWANの仲立ちをしていることに注意。



ssh用にポートを解放してssh接続したときのイメージ図。手元にあるiphoneなどのスマートフォンで4G回線などの外部回線で外から、raspberry piにアクセスする時のイメージ。

ルーターはポート番号ごとにアクセスの制限をかけていることを認識する事が一番大事である。


【参考文献】
画像は以下のサイトから頂いた。
素材のデータベース
Digipot



Day22 SSHの公開鍵認証設定の続き

Day21では、鍵の作成をMacでおこなってハマってしまった。そこで見方を変えて、Raspberry Piで鍵を作成して、秘密鍵をMacに渡すという方針を取った。

#piにて
#鍵作成
ssh-keygen -t rsa

これで、~/.ssh/以下に、公開鍵(id_rsa.pub)と秘密鍵(id_rsa)が追加される。
#まずは、公開鍵の内容を~/.ssh/authorized_keysに追記
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

#追記が終われば公開鍵は消去してよい
rm ~/.ssh/id_rsa.pub

#次に、~/.sshのディレクトリに対するアクセス権を700、~/.ssh/authorized_keysのアクセス権を600に変更する。これにより、他のユーザからはこれらのディレクトリやファイルを閲覧できなくなる。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

最後にMacの~/.ssh/に秘密鍵'(~/.ssh/id_rsa)を移動する。
ログアウトしてMacに戻ってから、

#-Pのpを大文字にしないとハマる

#Macのホームディレクトリ(~)にサーバー(pi)の~/.ssh/をダウンロード
scp -P hogenumber pi@192.168.11.7:~/.ssh/authorized_keys ~/



あとは、piにログインして、鍵の後始末と、パスワードによるログインを禁止するだけ。
#再度piにログイン
ssh -p hogenumber pi@192.168.11.7

#追記が終われば秘密鍵も消去してよい
rm ~/.ssh/id_rsa

#パスワードによるログインを禁止する
sudo vim /etc/ssh/sshd_config

52 PasswordAuthentication yes
52 PasswordAuthentication no
に変更

#sshサーバを再起動
sudo /etc/init.d_ssh restart


あとは接続のテストだけ。
勿体ぶるようだが、確実に鍵の効果を検証するため、一度~/.ssh/id_rsaをホームディレクトリに入れておいて、エラーになるかを見てみる。デフォルトで~/.sshの鍵を探すようになっているので、この方法をとった。

あらかじめ、鍵のアクセス権は600に変更しておく
sudo chmod 600 ~/id_rsa

#id_rsaを指定せずにログインを試みる
ssh -p hogenumber pi@192.168.11.7
Permission denied (publickey).

それでは、鍵を指定しみる。
ssh -p hogenumber -i ~/id_rsa pi@192.168.11.7

すると、以下のウィンドウが開くので、piで鍵を作成するときに入力したパスワードを入力する。
すると、ログインに成功する。
Last login: Mon Mar 31 08:59:43 2014 from 192.168.11.2

pi@raspberrypi ~ $ 
exit


Macの~/.ssh以下にid_rsaをおいておけば、いちいち指定しなくても自動で読みにいく。そこで、~/id_rsaを~/.ssh/に移動させる。
mv ~/id_rsa ~/.ssh

ログインのテスト


ssh -p hogenumber  pi@192.168.11.7
Last login: Mon Mar 31 08:59:43 2014 from 192.168.11.2

pi@raspberrypi ~ $ 


うまくいった。



iphoneのiOS用SSHクライアントであるpromptからパスワードログインを試みるとはじかれることを確認してみる。


ばっちり。

promptでssh接続したいときは、Macの時と同様、サーバーで鍵を作成し、公開鍵の内容をサーバーの~/.ssh/authorized_keysへ追記、秘密鍵をpromptに登録すればよい。

piで作った秘密鍵をMacに落としておいて、
itunesを開いて、AppsのPromptを選択肢、id_rsaをAddで追加すればよい。
あとは、iphone上でpromptを開いて、ipアドレス、ポート番号、ユーザ名、パスワード(この場合、鍵作成時のパスワード)を入力して、最後に鍵マークをクリックして先ほどアップロードしたファイルを選択すればok。
あとはお好みで、他のパソコンにも鍵を入れておいても良い。
これでサーバーのセキュリティに関しての、一通りの作業は終了した。


###############################################################

最後にひとつ議論しておく。
鍵の作成を今回のようにサーバーで行うか、クライアントで行うかというのは実はどちらでもよいそうだ。

以下のサイトが詳しい。
秘密鍵と公開鍵は、サーバー側(ssh接続される側)で作ろうがクライアント側(sshコマンドを打って接続しに行く側)で作ろうが、どっちでもいいそうな。

通常は、クライアントで作成して、サーバーに公開鍵を送信する事が多いようだが、大量に鍵を作成するときは面倒なので、サーバー側で作成して、クライアントに配布するという形式を取る事もあるそうだ。






Day21 sshのルートログインの禁止とSSHの公開鍵認証設定

ここまでの作業
Day19:rootとpiのパスワードを設定
Day20:sshのポート番号の変更

今回は、sshのルートログインの禁止とSSHの公開鍵認証設定を行います。

#####sshのルートログインの禁止#####
sudo vim /etc/ssh/sshd_config

27 PermitRootLogin yes

27 PermitRootLogin no
に変更

#sshサーバの再起動

vim /etc/ssh/sshd_config

これでrootログインはできなくなった。



#####SSHの公開鍵認証設定####

日経Linux『誰でもできる! Raspberry Piで楽しもう』日経BP社 2013のp62 - 66を参考にした。

まずは、手元のMacで鍵を生成する。
kappa$ ssh-keygen -t rsa

デフォルトのままでEnterを2回押すと、~/.ssh/に公開鍵(id_rsa.pub)と秘密鍵(id_rsa)が生成する。
kappa$ ls ~/.ssh

id_rsa      id_rsa.pub  known_hosts


これから、この公開鍵(id_rsa.pub)をサーバーの自分がいつもログインするpiユーザの支配下に送り込み、そして、piの~/.ssh/authorized_keysに公開鍵の内容を追記する。

#サーバーに公開鍵を送信(piユーザーのホームディレクトリ)
kappa$ scp -P hogenumber id_rsa.pub pi@192.168.11.7:~/ 



ここからはRasPiにログインしてからの操作。
#~/.ssh/の作成し、公開鍵を移動させる。
mkdir ~/.ssh
mv ~/id_r~/.ssh/


#公開鍵の内容を追記(authorized_keysファイルがなければ新規作成される)
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

#####パスワードログインを無くして、いよいよ公開鍵認証のみでログインできる状態にする####
sudo vim /etc/ssh/sshd_config

 51 #PasswordAuthentication yes
 52 PasswordAuthentication no

これでok.
#サーバー再起動
 sudo /etc/init.d/ssh restart
あとは、Macからログインしてみるだけだ!
と思ったらハマった。
以前サーバー構築した時も同様のところでハマったのでピンと来た。
そこで、raspiはモニターにつないでスタンドアロンの環境で以下の作業をして、いろいろ考えてみる事にした。
(続く)


Day20 sshポートの変更

sshのデフォルトポートは22番だが、このまま世界に公開すると、たくさんの悪い人から狙われます。そこで、49152–65535番の間は動的/プライベートポート番号と言われるように、こちらの自由に割り当てることができる。そこで、この間のどれかをsshの接続用に割り当てることにする。

cd /etc/ssh

#バックアップ作成
sudo cp sshd_config sshd_config_backup

#sshサーバーの設定ファイル(sshd_conf)の編集
sudo vim sshd_config


 4 # What ports, IPs and protocols we listen for

 5 Port 22

# What ports, IPs and protocols we listen for

 5 Port hogenumber(49152–65535番)

に書き換える。

#sshサーバーの再起動
sudo /etc/init.d/ssh restart

#ログアウトして動作チェック
exit


# 開発機(mac)から、デフォルトポート(22)でssh接続を試みる
kappa$ ssh pi@192.168.11.7
ssh: connect to host 192.168.11.7 port 22: Connection refused

# -p 設定したポート番号 のオプションを付けてで接続してみる。
kappa$ ssh -p hogenumber(49152–65535番 pi@192.168.11.7 
pi@192.168.11.7's password: 

うまくいった。

Day19 Raspberry Piのセキュリティ設定

今回から、Raspberry Piを自宅サーバーとして外部に公開することを意識した作業を開始する。

まずは、Raspberry Piのセキュリティ設定をしなくてはならない。セキュリティといっても、内容は多岐にわたるが、まず行うべきなのがユーザアカウントに関するものである。rootのパスワードはないわ、piユーザのパスワードはみんな知っているわ、sshでパスワードの総当たりに脆弱だわと、問題が多く、デフォルトではとても外部に公開はできません。そこで、最低限抑えておきたいところを設定してきます。

まず、ネットで情報を収集。

#このサイトはとてもまとまっている


#SSH接続に関しての設定

#sshの設定ファイルのセキュリティに関しての細かい設定方法
IT備忘録


############## rootのパスワード設定 #################

#rootのパスワード設定
sudo passwd root
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

############## piのパスワード設定 #################

sudo passwd pi
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

##############piユーザのsudo使用時に常にパスワードが必要にする###############
piユーザはデフォルトではsudoコマンドでパスワードが必要とされていません。これは危険なので変更します。まずは、visudoで使用するエディタをvim(3番)に変更します

#visudoのエディタ変更
sudo update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode

Press enter to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in manual mode

#visudoでsudoの設定を変更
sudo visudo
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL                                       

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
pi ALL=(ALL) NOPASSWD: ALL              #ここをコメントアウトして、新たに設定を付け足す。

こんな感じ
#pi ALL=(ALL) NOPASSWD: ALL
pi ALL=(ALL) PASSWD: ALL

:wq

#テスト
$ sudo su

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
[sudo] password for pi: 

これでうまくいった。


Day18 Raspberry PiのIPアドレス固定方法

Raspberry PiのIPアドレス固定を行う方法には次の二つがある。
(1)Raspberry Piの/etc/network/interfacesファイルの設定
(2)ブロードバンドルータのdhcpの設定


(1)Raspberry Piの/etc/network/interfacesファイルの設定
/etc/network/interfacesをルート権限にて編集を行う。dhcpはコメント合うとして、新たにstaticを割り当てる。
この場合、モバイルルータの設定は行わないので、DHCPにより他機に対してリースされたアドレスがRaspberry Pi自身で定めたIPアドレスとバッティングしないように、Raspberry Pi自身の設定は、できるだけ大きいものにするのがよい。さらには、DHCPで割り当てるIPアドレスの範囲を限定するような設定をモバイルルータ内で行う事ができれば、raspberry piとの衝突は避ける事が可能である。

(2)ブロードバンドルータのdhcpの設定(オススメ)
DHCPにおいて特定のコンピュータに固定のIPアドレスを割り当てたい場合は、IPアドレス払い出しの予約が可能である場合が多い。具体的な方法は、ルータごとに異なる。
http://www.atmarkit.co.jp/fwin2k/win2ktips/542dhcpaddr/dhcpaddr.html
WHR-G301NではDHCPリースの画面の中に「手動割当に変更」があるので、それをクックする事で、IPアドレスを選択的に固定することができる。または「リース情報の新規追加」で、IPアドレスとMACアドレスを追加すればよいです。
【参考文献】
日経Linux『誰でもできる! Raspberry Piで楽しもう』日経BP社 2013

Day17 Raspberry PiでLチカ(Python GPIOライブラリ)

今回はRaspberry Piを使ったハックで、頻用されるPythonのGPIOライブラリを用いたLチカを紹介する。このライブラリはRaspbianならデフォルトでインストールされている。
ハマった点は二つ。
1 ソースにGPIO.setmode(GPIO.BOARD)を入れないとエラーがでる。ちなみにユーザーガイドには入っていない(不思議)。
2 GPIO.cleanup()を最後に実行しないと、GPIOピンが解放されず、次回実行時にピンが使用されていると警告が出る。GPIOの解放は、どのような言語を用いるにせよ、必須であると考えられる。解放しない場合、割り込みとして、エラーメッセージがでる。

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, True)
time.sleep(5)
GPIO.output(7, False)
time.sleep(5)
GPIO.output(7, True)
time.sleep(5)
GPIO.output(7, False)
time.sleep(5)
GPIO.cleanup

【参考文献】
http://www.thirdeyevis.com/pi-page-2.php
Japanese Raspberry Pi Users Group『Raspberry Pi[実用]入門』技術評論社 2013

Day16 CapslockをCtrlに変える

RaspbianでCapslockをCtrlキーに変える方法を書く。なお、もとあるCtrlキーの機能はそのまま。

$ sudo vim /etc/default/keyboard

XKBOPTIONS="terminate:ctrl_alt_bksp"

XKBOPTIONS="terminate:ctrl_alt_bksp, ctrl:nocaps"

あとは、リブートして設定ファイルを読み込むだけ。
$ sudo reboot
なお、この方法はDebianで通用するようである。

【参考文献】
http://gaobin.hatenablog.com/entry/2013/05/18/232617

Day15 Raspberry PiでLチカ(WiringPi)

C言語のWiringPiライブラリを用いてLチカを行う。330Ωの抵抗とLEDを直列に接続している。WiringPiは独自のピンの指定方法があるため、注意が必要である。詳しくは、こちらのサイトを参照されたい(https://projects.drogon.net/raspberry-pi/wiringpi/pins/
/* led.c */
#include<wiringPi.h>
#define PIN 7 //using 7 pin(GPIO4)
int main(void){
//setup
wiringPiSetup();
pinMode(PIN, OUTPUT);

//Blinking the LED
while(1){
// turn the led on
digitalWrite(PIN, 1);
//wait for 1000 msec
delay(1000);
// turn the led off
digitalWrite(PIN, 0);
//wait for 1000 msec
delay(1000);
}
return 0;
}

コンパイルでは、wiringPiをリンクするようにオプションを付加する。
$ gcc -o led led.c -lwiringPi

ルートで実行
$ sudo ./led

【参考文献】
http://mas-home.hatenablog.com/entry/2013/01/06/204616
林和孝『Raspberry Piで遊ぼう』ラトルズ 2014

Day14 Raspberry PiでLチカ(WiringPiに付属のgpioユーティリティ)

WiringPiに付属のgpioユーティリティでLチカをする方法。
#WiringPiのインストール
#まずは、libi2c-devというI2Cの開発用ライブラリが必要
$ sudo apt-get install  libi2c-dev

#次にgitをインストール
$ sudo apt-get install git-core

#WiringPiのソースファイルをダウンロード
$ git clone git://git.drogon.net/wiringPi

#コンパイル
$ cd wiringPi
$ ./build

#動作確認
$ gpio -v


ここからいよいよwiringPiを用いたLチカを行う。
#モード設定(-gの指定によりSoCのGPIOポート番号が使用可能)
$ gpio  -g mode 4 out

LEDを点灯させる
$ gpio -g  write 4 1

Day13 Raspberry PiでLチカ(シェルスクリプト)

Raspberry PiでLチカをした。抵抗は330Ωを使用。


ルート権限でコマンドを実行しないとGPIOポートにアクセスできない。
$ su

GPIO4を使用する。以下のコマンドで、/sys/class/gpio/gpio4が生成する
#  echo 4 > /sys/class/gpio/export

GPIO4の入出力の設定をする。今回はoutにする。
# echo out > /sys/class/gpio/gpio4/direction

/sys/class/gpio/gpio4/valueに1(点灯) 、0(消灯)を書き込むことでLEDの挙動を制御できる
# echo 1 > /sys/class/gpio/gpio4/value
# echo 0 > /sys/class/gpio/gpio4/value

GPIOの使用が終わったら、終了を宣言する。以下のコマンドで、/sys/class/gpio/gpio4が消失する
# echo 4 > /sys/class/gpio/unexport


# exit

この過程をシェルスクリプトにすると以下のようになる。


#!/bin/bash
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
while :
do
echo "1" > /sys/class/gpio/gpio4/value
sleep 0.5
echo "0" > /sys/class/gpio/gpio4/value
sleep 0.5
done

複数回このシェルスクリプトを実行するときは、あらかじめ、
$ echo "4" > /sys/class/gpio/unexport

を実行しておかないと、リソースビジーというエラーが出る事に注意。


【参考文献】
林和孝『Raspberry Piで遊ぼう』ラトルズ 2014

Day12 Rasbianのディスクイメージのバックアップ

Raspbianの設定をいろいろいじる前に、要所要所でバックアップしてイメージディスクにしておき、後でリストアする方法を書く。

まずは、手元のMacに外付けでRaspbianの入ったSDカード(8G)を接続する。

#######SDカードの名前を確認(この作業は、母機を壊さないために一番大事)#######
#ディスクをチェク
$ df -h
Filesystem      Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk0s2   238Gi  105Gi  132Gi    45% 27682929 34621941   44%   /
devfs          188Ki  188Ki    0Bi   100%      649        0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%        0        0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%        0        0  100%   /home

/dev/disk1s1    56Mi   19Mi   37Mi    34%      512        0  100%   /Volumes/boot

#マウントをチェック
$ mount
/dev/disk0s2 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)

/dev/disk1s1 on /Volumes/boot (msdos, local, nodev, nosuid, noowners)

#Macならdiskutilコマンドが便利。ちゃんと8GBのSDカードが/dev/disk1に割り当てられていることが確認できる。
$ sudo diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *256.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            255.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *8.0 GB     disk1
   1:             Windows_FAT_32 boot                    58.7 MB    disk1s1

   2:                      Linux                         7.9 GB     disk1s2


#####SDカードの内容をddコマンドによりディスクイメージにまとめる#####

#ディスクのアマウント
$ diskutil umountDisk /dev/disk1s1

#イメージの作成(カレントディレクトリにファイルは生成する)
$ sudo dd if=/dev/rdisk1 of=raspbian_140323.img bs=1m

#ファイルサイズの確認
$ du -h raspbian_140323.img  
7.4G raspbian_140323.img

#圧縮
$ tar -zcvf raspbian_140323.img.tar.gz raspbian_140323.img

#ファイルサイズの確認
$ du -h raspbian_140323.img.tar.gz
934M raspbian_140323.img.tar.gz
  

#####別のSDカードにリストアする####

#圧縮したイメージを解答
$ tar zxvf raspbian_140323.img.tar.gz

#デバイス情報を調べる
$ diskutil list

#アマウント
$ sudo diskutil umount /dev/disk1s1

#先ほどのイメージを用いてリストア
$ sudo dd if=raspbian_140323.img of=/dev/rdisk1 bs=1m

#アマウント
$ sudo diskutil umount /dev/disk1s1

【参考文献】
http://shokai.org/blog/archives/7943

Day11 キーボード設定

Day10までは、家庭内LANを介してsshでRaspberry piに接続していた。今回、わけがあってキーボードとディスプレイを直接本体に接続してスタンドアロンで操作を行う必要があった。そこで日本語キーボードの設定が必要となったため、手順をまとめておく。


# raspi-configに接続
$ sudo raspi-config

「4 Internationalisation Option」
「13 Change Kyboard Layout」
「Generic 105-key (Int) PC」
「Japanese」
「The default for the keyboard layout」
「No compose key」
「Yes」

の順番に設定を行う。最後に、「Finish」で終了すると、設定が日本語キーボードに対応するようになる。


【参考文献】
http://www.orsx.net/blog/archives/4314
http://www.raspberrypi.org/forum/viewtopic.php?f=82&t=48522

PCボードとマイコンボード

最近、日経Linuxなどのコンピュータ雑誌を見ているとお目にかかる機会が増えたRaspberry PiやArduinoだが、これらの分類はどのように行われているのだろうか。

格安ボードには大きく「PCボード」と「マイコンボード」の二つに分けられる。

#PCボード
Linuxが動く程度に大きな容量のメモリと能力のあるCPを積んだボード。普段使用するPCと同じく、OSが稼働するため、スタンドアロンで様々な処理が可能である。OSが介在するため、きめ細かいI/Oの制御にはマイコンボードに比べて劣る。
・Raspberry Pi http://www.raspberrypi.org
・BeagleBone Black http://beagleboard.org
・Cubieboard http://cubieboard.org
・Wandboard http://www.wandboard.org

#マイコンボード
メモリやCPU(マイクロコンピュータ)が非力(省エネ)、OSが動作せず、アプリケーションが直接ハードウェアを操作する。きめ細かいI/Oの制御が可能。
・Arduino http://arduino.cc
・mbed https://mbed.org

PCボードにしてもマイコンボードにしてもここに挙げた以外にも種類がある上、それぞれ特徴があるので、しっかりと吟味した上で購入したい。
【参考文献】
『格安pcボードで始める電子工作超入門』日経BP社 2014

インターフェイスを用いて、ハードウェアを使う事

Raspberry PiやArduinoをいじっているうちに、OSの本質が少し見えてきたように感じた。それを書き綴りたい。



まずはじめに、人間が道具を使う事の構造について考えてみた。そもそも、ハードウェアなどの「道具」を使うとは、以下のように集約されるのではないだろうか。ユーザが行いたい意図があり、それをユーザーが直接ハードウェアに働きかけることで、意図が達成される。
コンピュータのシステムというのは、このユーザーとハードウェアという二者の関係の間に、「インターフェイス」と呼ばれる仕組みを組み込むことであると言ってもよさそうだ。

インターフェイスは、何も一つの実体を指す物ではない。コンピュータのシステムでは様々なプログラムが階層的な構造を取り、ハードウェアとの間の橋渡しを行うことが普通である。


さて、この考えを元にOS(Operation System)とはどのようなものであるかを考えていく。まずは、OSが無いシステムを考える。このようなシステムではアプリケーションがユーザとハードウェアの間に入って直接ハードウェアを制御することとなる。下には、OSなしで動作するシステムの実例として、Arduinoを挙げた。

一方、OSが存在する場合は、OSがアプリケーションとハードウェアとの間に位置する。そして、OSがハードウェアの直接的な制御を担うこととなる。アプリケーションは、OSとの連絡を通して間接的にソフトウェアを制御する。言わば、OSがアプリケーションとハードウェアに対して、インターフェイスを提供していると言うができる。

OSの存在するシステムの例として、GNU/Linuxシステムを考える。GNUとは、ここまで議論してきたアプリケーションに相当するものと言っても大きな間違いは無いだろう。Linuxと呼ばれるプログラムは、狭義の意味でのOSと言われる。それはここまでの議論の通り、ハードウェアを直接制御するアプリケーションであるからである。一方、GNUが提供しているソフトウェアは、アプリケーション自身であったり、アプリケーションがカーネルと情報のやり取りを行う際に利用するAPI(Application programming interface)であったりする。ユーザーが触れているのは、アプリケーションであって、カーネルではないので、Linuxカーネル単独ではユーザーの意思を実現することができない。GNUの提供するプログラムが必要なのである。(下の例ではGNU/Linuxが働くハードウェアの実例として、Raspberry Piを挙げた)


GNUとLinuxカーネルの双方にリスペクトを払うという意図で、一般に「Linux」と呼ばれるシステムを、「GNU/Linux」と呼ぶ人も多い。

以上が、私がRaspberry PiやArduinoをいじっているうちに、OSの本質が少し見えてきたように感じたことのまとめである。人間と道具(ハードウェア)という二者の関係に始まって、ソフトウェアがインターフェイスを提供したり、ハードウェアとのやりとりを一手に引き受けるOSのあるシステムまで見てきた。
今後は、OSがあることの利点についてより具体的に考えていきたいと考えている。





Day10 手動でLチカ

Raspberry PiでLチカ(LEDチカチカ)を行う前に、乾電池を電源とした原始的なシステムを構築して、Lチカを行ってみました。


【道具】
SWITCH SCIENCEの「Arduinoをはじめようキット」に付属
・ブレッドボード x1
・ジャンパーワイヤー(オス-オス)x2
・赤色LED x1
・330Ωの抵抗

イオンのトップバリュー
・アルカリ乾電池(1.5V) x2

回路図は以下の通り。(※抵抗の数値が誤っている)
そして、これがブレッドモードを利用して、実際に電子回路を構成したところ。ジャンパーワイヤーが乾電池の陽極に接していないので、LEDが点灯する事は無い。
ジャンパーワイヤーを電池の陽極に接触させることで、LEDに通電し、LEDが光を発する。



乾電池の陽極にジャンパーワイヤーを接触させたり、させなかったりを手動で繰り返せばLチカになるわけだ。
一方、Raspberry PiでLチカを行う場合、ソフトウェアのレベルで回路を制御して、LEDに通電する場合と通電しない場合を決定している。
素手で行う事が可能な作業を、ソフトウェアが肩代わりしてくれるのである。これがコンピュータシステムの本質的な部分である。ソフトウェアは、私たちの大脳と、ハードウェアの間のインターフェースと考えるとよいかもしれない。

【参考文献】
Massimo Banzi (著), 船田 巧 (翻訳)『Arduinoをはじめよう 第2版』2012


Day9 Raspberry Piで無線LAN

前回(Day8)、CUIによる設定に挫折したため、GUIにより無線LANの設定を行い、成功したことを書きました。
今回は、GUIの設定で成功した状態の設定ファイルを"カンニング"して、CUIだけで、無線LAN接続の設定を行う方法を記します。




今回は以下のハードウェアを使用します。
・Raspberry Pi model B R2
・Buffaloの無線LAN子機(WLI-UC-GNM : http://www.amazon.co.jp/BUFFALO-%E7%84%A1%E7%B7%9ALAN%E5%AD%90%E6%A9%9F-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%83%A2%E3%83%87%E3%83%AB-11n%E6%8A%80%E8%A1%93%E3%83%BB11g-WLI-UC-GNM/dp/B003NSAMW2/ref=sr_1_1?ie=UTF8&qid=1392612374&sr=8-1&keywords=WLI-UC-GNM)

無線LANの子機は様々な会社から様々なブランドのものが販売されています。しかし、その核となるコントローラチップを製造している肝心のベンダーの数はずっと少ない。そこで、WLI-UC-GNMの採用しているチップを調べて、それに合わせてファームウェアをインストールすれば、無線LAN子機のコントロールが可能となるのである。結果から言うと、今回はralinkという会社のチップが使用されており、デフォルトでralink社のコントローラ対応のファームウェアはインストールされていた。そのため、特に新たにファームウェアを入れる必要はなかった。

###############ファームウェアの確認#####################

まずは、Raspberry Piに無線LAN子機:WLI-UC-GNMを接続します。次に、電源アダプタを接続して通電します。
次に、MacからSSHで接続します。
$ ssh 192.168.11.3

カーネルが子機をどのように認識したかを調べるため、カーネリングバッファというカーネルの作業履歴を参照する。
$ dmesg | less
ここで、
[    3.371218] usb 1-1.3: Manufacturer: Ralink
という一行を見つけた。これがWLI-UC-GNMで使用されているコントローラーチップである。
Ralink社のチップに対応したファームウェアがインストール済みであるかを調べる。
$ sudo dpkg -l
すると、

という一行を見つける。これがRalink wireless cardsのファームウェアであるfirmware-ralinkというパッケージがインストールされていることの証拠である。



################################################


###############無線LANの設定#####################
あとは、具体的に無線LANの設定を行えば良い。

まずは、現在の部屋の中に飛んでいる無線LANの一覧を表示する
もしも、この作業でエラーがでるようなら、子機が正しく使用されていないことになる。
自身がいつも使用している無線LANのIDが表示されることを確認する
$ sudo iwlist scan | less

ここから、2つの設定ファイルを編集していく
#/etc/network/interfaces の編集
$ sudo vi /etc/network/interfaces




auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp



#/etc/wpa_supplicant/wpa_supplicant.confを編集
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf


ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="MYID"
        psk="MYPASS"
        proto=WPA
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
}


これで無線LANの設定は完了する。リブートせずに無線LANを接続するには以下のコマンド。
$ sudo down
$ sudo ifup wlan0

リブートなら、
$ sudo reboot

あとは、
・有線LANを抜いてもつながること。
・再起動しても自動で無線LANに接続すること。
の二点を確認したら終わり。
################################################


【参考文献】
Eben Upton、Gareth Halfacree著、株式会社クイープ訳『Raspberry Piユーザーガイド』インプレスジャパン 2013

Day8 Raspberry Piと無線LAN

Raspberry PiにUSB無線LANを接続する方法を書きます。

今回は以下のハードウェアを使用します。
・Raspberry Pi model B R2
・Buffaloの無線LAN子機(WLI-UC-GNM : http://www.amazon.co.jp/BUFFALO-%E7%84%A1%E7%B7%9ALAN%E5%AD%90%E6%A9%9F-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%83%A2%E3%83%87%E3%83%AB-11n%E6%8A%80%E8%A1%93%E3%83%BB11g-WLI-UC-GNM/dp/B003NSAMW2/ref=sr_1_1?ie=UTF8&qid=1392612374&sr=8-1&keywords=WLI-UC-GNM)

無線LANの子機は様々な会社から様々なブランドのものが販売されています。しかし、その核となるコントローラチップを製造している肝心のベンダーの数はずっと少ない。そこで、WLI-UC-GNMの採用しているチップを調べて、それに合わせてファームウェアをインストールすれば、無線LAN子機のコントロールが可能となるのである。結果から言うと、今回はralinkという会社のチップが使用されており、デフォルトでralink社のコントローラ対応のファームウェアはインストールされていた。そのため、特に新たにファームウェアを入れる必要はありませんでした。

次は、無線LANの設定についてです。実は、CUIで巷に出回っている情報を元に、かなりトライしましたが、はまってしまい、結局成功しませんでした。

結局、VNC接続で一度GUIでログインして
「WiFi Config」-> 「Scan」-> 表示されたネットワークリストの中で自分が接続したいものをダブルクリック -> 「PSK」に無線LANのパスワードを入力 -> トップ画面で「Connect」をクリック。

あとは、再起動すれば、有線LANを抜いた状態でも自動的に無線LANで接続できるようになっています。

【参考文献】
『お手軽ARMコンピュータ ラズベリー・パイでI/O』CQ出版株式会社 2013
Eben Upton、Gareth Halfacree著、株式会社クイープ訳『Raspberry Piユーザーガイド』インプレスジャパン 2013
Japanese Raspberry Pi Users Group『Raspberry Pi[実用]入門』技術評論社 2013
nekosan『「Raspberry Pi」でつくる電子工作』工学社 2013