Raspberry pi の覚え書き(前半 NOOBS_v1_3_4  後半 NOOBS_v1_5_0)

初版作成  2015.8
最終更新  2018.09.08


◆◆ 凡例 ◆◆

  $  または %  は pi の権限で実行する。
  #  は root の権限で実行することを示す。

  root 権限を得るには

  $ sudo -s


◆◆ micro SD カードへの Raspian のインストール NOOBS_v1_3_4 ◆◆

(参照) 日経 Linux  2015.7  p.65-

https://www.raspberrypi.org/ から
download ---> NOOBS

NOOBS  Download ZIP を選択して zip ファイルを
ダウンロードする。

展開し、すべてのファイルとディレクトリを
micro SD カードにコピーする。

その micro SD カードを Raspberry Pi に差し、
電源を入れると起動する。

NOOBS が起動したら、Language は English のまま、
Raspbian にチェックを入れて install

インストール完了後 Raspbian が起動する。

4 Internatilnalization Options -- I2 Change Timezone -- Asia -- Tokyo
4 Internatilnalization Options -- I3 Change Keyboard Layout
  -- Generic 105-key (Intel PC) -- Japanese - Japanese (OADG 109A)
  -- The default for the keyboard layout -- No compose key
4 Internatilnalization Options -- I1 Change Locale -- ja_JP.UTF-8 UTF-8


◆◆ login ◆◆

id: pi
pass: raspberry


◆◆ 管理者モード ◆◆

  % sudo -s


◆◆ GPIO ◆◆

「Raspberry Pi」で作る電子工作 工学社 p.104 に以下の記述がある。

  GPIO を司る BCM2835 の端子の入出量は、起動直後は 8mA である。
  これを超えると故障する恐れがある

GPIO を操作するプログラムは root 権限が必要 (sudo)。

◆◆ システム設定 ◆◆

  # raspi-config


◆◆ X ◆◆

  起動  startx
  終了  ctrl + alt + BS

(注意!!)
 login 直後の bash の状態で startx すること。
 tcsh を起動してから startx を実行すると、LXterminal で日本語が
 文字化けする。


◆◆ パッケージのインストール ◆◆

  # apt-get update         パッケージのリストの更新    まず、これを行うこと
  # apt-get updrade        アップグレードする

  # apt-cache search tcsh  パッケージ名の検索

  # apt-get install tcsh   インストール
  # apt-get remove tcsh    設定ファイルは残す
  # apt-get purge tcsh     全て消す

  # dpkg -l                インストール済パッケージのリスト

パッケージの管理は GUI ツールの方が楽

  # apt-get install synaptic

  % sudo synaptic  あるいは「menu」--->「設定」--->「synaptic」



◆◆ ctrl と caps の入れ替え ◆◆

  $ setxkbmap -option ctrl:swapcaps

.bashrc に書き込む


◆◆ 「esc」と「全角半角」の入れ替え ◆◆

  % xev

でキー番号を調べる

半角/全角  49
ESC        9


  % xmodmap key-file

で設定する。key-file の中身は

keycode 49 = Escape
keycode  9 = Zenkaku_Hankaku


ターミナルを 1 個新規に立ち上げる
たびに、元に戻ってしまう。

.bashrc に書き込む。


◆◆ 日本語入力 ◆◆

  # apt-get install ibus ibus-anthy

startx の直後は IME が動いていない。

menu ---> 設定 ---> Ibus の設定

でデーモンが起動する。


日本語フォントを入れる(役に立っているか否か分からない)

  # apt-get install fonts-vlgothic


◆◆ GUI 版 emacs のオプション ◆◆

-fn fontname
-lsp
-fg
-bg


◆◆ 端末や emacs でのカラー表示をやめる ◆◆

% setenv TERM vt100


◆◆ python で日本語を使う ◆◆

2 行目で

# coding: UTF-8
# coding: EUC-JP
# coding: SHIFT_JIS
# -*- coding: utf-8 -*-

など


◆◆ web から制御するソフトのインストール(未使用) ◆◆

# apt-get install i2c-tools
# apt-get install libgd-gd2-perl
# apt-get install libgd-graph-perl
# apt-get install python-dev
# apt-get install python-pip

% wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
% tar xvf WebIOPi-0.7.1.tar.gz
% cd WebIOPi-0.7.1
% patch -p1 < ../WebIOPi-0.7.1-RPiAll.patch
% sudo ./setup.sh


◆◆ C のライブラリ wiringPi のインストール ◆◆

なぜか、

  % git clone git://git.drogon.net/wiringPi
    (綴り注意  dragon ではなく drogon)

はエラーが出て失敗する。

下記の url をクリックする。

  https://git.drogon.net/?p=wiringPi;a=summary

shortlog と書いてあるの行の次の行の右端の
「snapshot」をクリックすると

  wiringPi-5edd177.tar.gz

がダウンロードできる。

  $ tar zxf wiringPi-5edd177.tar.gz
  $ cd wiringPi-5edd177
  $ ./build

で構築される。

ルートの権限を持っていないにもかかわらず、
なぜか /usr/local/lib に

  libwiringPi.so@       libwiringPiDev.so@
  libwiringPi.so.2.25   libwiringPiDev.so.2.25

ができている。makefile の中で sudo している
ようだ。リンクは

  -lwiringPi
  -lwiringPiDev

である。makefile のサンプルが ここ にある。

examples ディレクトリにサンプルプログラムがある。

wiringPi のピン番号とラズベリーパイの GPIO 番号は異なる

  % gpio readall

で確認する。

---------------------------- 端 --------------- 端 -------------------------------+
   +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+ |
   | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM | |
   +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ |
   |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     | |
   |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     | |
   |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     | |
   |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  | | 端
   |     |     |      0v |      |   |  9 || 10 | 0 | OUT  | RxD     | 16  | 15  | |
   |  17 |   0 | GPIO. 0 |  OUT | 1 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  | |
   |  27 |   2 | GPIO. 2 |  OUT | 1 | 13 || 14 |   |      | 0v      |     |     | |
   |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 1 | OUT  | GPIO. 4 | 4   | 23  | |
   |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  | |
   |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     | |
   |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  | | 端
   |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   | |
   |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   | |
   |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   | |
   |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     | |
   |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  | |
   |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     | |
   |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 1 | OUT  | GPIO.27 | 27  | 16  | |
   |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  | |
   |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  | |
   +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ |
   | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM | |
   +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+ |
                                                                                  |

------------------------------------- 端-----------端-----------------------------+
   +-----+-----+---------+------+---+-Model B2-+---+------+---------+-----+-----+ |
   | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM | |
   +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ |
   |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     | |
   |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     | |  端
   |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     | |
   |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  | |
   |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  | |
   |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  | |  端
   |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     | |
   |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  | |
   |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  | |
   |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     | |
   |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  | |
   |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   | |
   |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   | |
   +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ |
   |  28 |  17 | GPIO.17 |   IN | 0 | 51 || 52 | 0 | IN   | GPIO.18 | 18  | 29  | |
   |  30 |  19 | GPIO.19 |   IN | 0 | 53 || 54 | 0 | IN   | GPIO.20 | 20  | 31  | |
   +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ |
   | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM | |
   +-----+-----+---------+------+---+-Model B2-+---+------+---------+-----+-----+ |
                                                                                  |

ライブラリの中身を見ると
digitalRead ではシステムコール lseek( ) read(  ) を呼んでいる。
digitalWrite では何らかのアドレス(ポインタ型変数)に値を代入している。


◆◆ C 言語の改行記号 ◆◆

emacs で UTF-8 で ¥ の半角は c2(194)  a5(165) の 2 バイトであり、
\ の 5c(92) とは異なる。

ゆえに改行してくれず、¥ と n が出力される。


◆◆ 画面の設定 ◆◆

1920 x 1080 の画面の周囲に黒い領域がある。
これを解消したい。

  # raspi-config

8. ---> A1

で disable に設定する。

リブートすると画面全体を使うようになった。


◆◆ リモートログイン ◆◆

  % ssh -l user-name machine-name
  % ssh  user-name@machine-name

  % sftp user-name@machine-name

◆◆ LXTerminal の設定 ◆◆

フォントサイズ 10 --> 11
foreground color 灰色 ---> 白


◆◆ ssh サーバを有効にする ◆◆

  % sudo -s
  # raspi-config

  8. Advanced Options

  A4  SSH を選択し、enable を選ぶ


◆◆ 有線 LAN を固定 ip にする ◆◆

  /etc/network/interfaces を書き換える。

以下のようにすると、有線 LAN が固定 ip になった。

auto eth0
allow-hotplug eth0
#iface eth0 inet manual
iface eth0 inet static
address 192.168.xx.yy
netmask 255.255.255.0
gateway 192.168.xx.1

/etc/resolv.conf にネームサーバーの情報を書き込む

nameserver 202.236.xx.yy

これを怠ると、外部が見えなくなり、$ sudo apt-get update で
エラーが発生する。

再動起すると固定 ip が有効になる。


◆◆ 無線LANの設定 ◆◆

色々な無線 LAN ルータに接続する場合、DHCP にしておき、
ルータ側で DHCP の固定 IP 割り当て機能を使うのがよい。

<参考サイト>
http://momijiame.tumblr.com/post/91958442191/raspberry-pi-%E3%81%A7%E7%84%A1%E7%B7%9A-lan-%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%82%92%E4%BD%BF%E3%81%86

% sudo -s

# lsusb

  usb に接続されているデバイスの状況を調べる。
 
  Bus 001 Device 009: ID 0411:01a2 BUFFALO INC. ... Wireless LAN Adapter
  と表示される。

# ip link show

 現在の netowrk の接続状況を見る。

 lo  eth0  wlan0 の 3 つが見つかる。lo は自機、etho0 は有線、
  wlen0 は無線を表す。wlen0 は state DOWN となっている。

# cat /etc/network/interfaces

 インターフェースの設定ファイル。
 USB 無線 LAN アダプタを接続すると、自動的に項目が追加されるようだ。

そのままでよい。なお、固定 IP にするときは、以下のようにする。

有線の部分も含めて、以下のようにした。xx, yy, zz は
数値が入る。

--------- 固定 IP の場合 ここから -----------------
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
#iface eth0 inet manual
iface eth0 inet static
address 192.168.xx.yy
netmask 255.255.255.0
gateway 192.168.xx.1

allow-hotplug wlan0
#iface wlan0 inet manual
iface wlan0 inet static
address 192.168.xx.zz
netmask 255.255.255.0
gateway 192.168.xx.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

当初、wlan0 の部分を書くのに eth0 の部分をコピーし、
iface の行を wlan0 に書き換えるのを忘れていたたため、
うまくいかなかった。書き換え忘れに注意。
--------- 固定 IP の場合 ここまで -----------------

/etc/wpa_supplicant/wpa_supplicant.conf
の中に暗号の情報を書き込む。

  % wpa_passphrase <ssid> <passphrase>

の出力を上記のファイルに付け足す。
タイプミスに注意!!!
何回もタイプミスのために接続できないという現象に苦しんだ。

wpa_supplicant.conf の内容は以下の通り。

------- ここから -------
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="my-ssid"
        #psk="pass phrase"
        psk=xxxxxxxxxxxxxxxxx
}
------- ここまで -------

  # ifdown wlan0
  # ifup wlan0
    ( しばらく時間をおく )
  # ifconfig

複数の設定を記述することができる。
この場合、上から順番にトライしてゆくようだ。


◆◆ telnet クライアントのインストール ◆◆

  # apt-get install telnet

◆◆ nmap のインストール ◆◆

ポートの状況を調査するためのツールが nmap である。

  # apt-get install nmap

  % nmap localhost


◆◆ X server に外部から接続する ◆◆

setenv DISPLAY :0.0                          OK

unset  DISPLAY                            NG
setenv DISPLAY localhost:0.0              NG
setenv DISPLAY 127.0.0.1:0.0              NG
setenv DISPLAY 192.168.xx.yy:0.0  (自分)     NG

setenv DISPLAY 192.168.xx.zz:0.0  (自分以外) OK

X が 6000 番台の port を listen しないようだ。

cygwin の X とはオプションが異なるので、
startx を書き換える方法はダメ。

raspberry pi  X server  listen tcp option で検索すると、
www.raspberrypi.org のサイトに答えが書いてある。

2 つの方法があると書いてある。

1. 非公式なオプション -nolisten tcp が
  書かれているスクリプトを見つける。

   /etc/X11/xinit/xserverrc

   exec /usr/bin/X -nolisten tcp "$@"
   ---> exec /usr/bin/X "$@"

2. socat を使う。エレガントな方法とある。

  # apt-get install socat

alias so 'socat -d -d -d -d TCP-LISTEN:6000,fork,reuseaddr,range=192.168.xx.0/24 UNIX-CONNECT:/tmp/.X11-unix/X0'

X は inet ドメインの通信はできず、unix ドメインのソケット
の通信しか行わない。socat が 6000 番台の通信を受けて、
unix ドメインで接続した X とソケットに流し込むという
しくみらしい。

通信ののたびに、大量のログが端末に出力される。
コマンドの末尾に > /dev/null &  をつけてもダメ。
標準エラー出力のようだ。

1. の方法を用いることにする。


◆◆ telnetd サーバーのインストール ◆◆

  # apt-get install telnetd

でインストールされ、必要な設定を行い、
inetd を再起動する。

telnetd に関する設定は /etc/inetd.conf のようだ。


◆◆ ftp クライアントのインストール ◆◆

  # apt-get install ftp


◆◆ 無線 LAN アダプタ ◆◆

接続実績があるのは以下の 3 つ

Buffalo  型番不明
IO DATA  WN-G150UMK
Planex   GW-USNANO2A

Buffalo の無線 LAN アダプタは滅茶苦茶熱くなる。
ネットでも多くの人がそう言っている。
ワットチェッカーを取り付けると、LAN アダプタなしで 1W,
LAN アダプタありで 3W となる。私が使用している
5V の AC アダプタは 2A まで
出せるので、10W までは OK である。

IO Data のと Planex のはそれほど熱くならないので、
これらの方が良さそうにみえる。

◆◆ opencv ◆◆

  # apt-cache search opencv
  # apt-get install libcv2.4
  # apt-get install libcv-dev
  # apt-get install libopencv-photo2.4
  # apt-get install libopencv-photo-dev

カメラの画像を表示するだけのプログラム、makefile を
ここ に置く。


◆◆ Arduino, Studuino とのシリアル通信 ◆◆

Arduino は 5V, Studuino (アーテック社製) は 3.3V なので、
Studuino の方が簡単である。直結できる。

Arduino はプルアップ抵抗の罠があり、非常に苦労した。

(1) 準備作業

ログインシェルがシリアルポートを使わない
ように設定する。

これを怠ると、奇妙な現象に悩まされるので、忘れないよう注意!!!

# raspi-config

8 Advanced Options --- A8 Serial を no

以上の結果

/boot/cmdline.txt

が変更される。

(2) 送信

機能  ピン
 Tx    8
 Rx   10
 Gnd  9, 25, 39, 6, 14, 20, 30, 34

Rapberry Pi と Studuino を接続するケーブルは、
常時接続することはできない。

Studuino に PC から USB 経由でプログラムを書き込む
ときは、Pi ---- Studuino の接続を物理的に切断する
必要がある。そうでないと、書き込みエラーが発生する。

レベル変換回路を挿入した場合、Pi --- Arduino を接続したままで、
PC から書き込みができることもある
(外したほうがよいかもしれない)。

(3) 内蔵プルアップ抵抗の無効化

Raspberry Pi の Rx 端子はデフォルトで 40kΩ 程度の
プルアップ抵抗が入っている。

ゆえに、10k と 20k で分圧して Rx に入力すると、
0 を入力するとき、0V にならず 0.5V 程度になる。

10k と 20k の並列で 7k。7k と40k で 3.3V を分圧するので、
3.3 × 7 / ( 7 + 40 ) = 0.5V

これで動くので問題ないが、オペアンプによるバッファを
入れるか、内蔵プルアップ抵抗を無効化した方が良いかも
しれない。

C から wiringPi を使う場合、

    pullUpDnControl(16, PUD_OFF);

でプルアップ抵抗を無効化できる。

    pinMode(16, INPUT);

は入れてはならない。これを入れると、Rx 端子からの入力を
受け取らなくなる。pinMode(16, OUTPUT); もダメ。
今のところ、リブートするしか方法がない。

GPIO は INPUT, OUTPUT, ALT0 の 3 つのモードがあり、
シリアル通信を行うには ALT0 のモードにする必要があるらしい。

python から import RPi.GPIO を使う場合、プルアップ抵抗を
無効化する方法が分からない。

GPIO.setup(15, xxxx , pull_up_down = GPIO.PUD_OFF)

として、xxxx の部分をシリアル通信モードに設定したいのだが、
GPIO.IN, GPIO.OUT のどちらかしか設定できない。
ソースファイルを見ると、py_gpio.c の中に、

   if (direction != INPUT && direction != OUTPUT) {
      PyErr_SetString(PyExc_ValueError, "An invalid direction was passed to setup()");
      return 0;
   }

とあるので、シリアルモードに設定できないようだ。

wiringPi の python 版を使うとできそうだが(C 版ではできる)
なぜか、インストールしても使えない。謎

◆◆ index ◆◆

Pi に samba をインストールし、外付けハードディスクを接続する
  日経 Linux  2015.10  p.68


◆◆ GPIO に関する注意事項 ◆◆

出典  日経Linux 2015.10 p.77

GPIO にはデフォルトでプルアップ・プルダウン抵抗が入っている。

2 -- 8   プルアップ
9 -- 26  プルダウン

2,3    1.8 k ohm
4 以降  50 k ohm

Vcc --- R --+-- sw --- Gnd
Vcc --- sw -+--- R --- Gnd

というパターンで + の電圧を入力するとき、
R = 10 k に設定しておけば、プルアップ・プルダウンの
区別なく入力できるように思われる。
R に大きな抵抗を使ってはいけないようだ。


◆◆ インストール NOOBS_v1_5_0   2015.12.29 ◆◆

Raspberry Pi B にインストールする。

(参考) 日経Linx 2015.12  p.64-

記事の通りにインストールする。

有線 LAN で DHCP 接続してパッケージをインストールする。
無線 LAN の設定は最後に回す。

以下のパッケージをインストールする

tcsh
emacs
ftp
telnet
telnetd   ----- 設定不要  すぐ使える

以前インストールした raspberry pi から以下のファイルを
取ってくる。

.cshrc   .emacs  .emacs.fundmode

.bashrc はだいぶ異なるので、上書きはしない。
.bashrc の先頭に

  setxkbmap -option ctrl:swapcaps
  xmodmap /home/pi/xkey

の 2 行を付加する。
なお、コンソールでは setxkbmap は効かない。
X を起動してからである。

◆◆ 日本語環境 ◆◆

   # apt-get install fonts-takao ibus-mozc

Menu ---- Preferences --- iBus Preferences --- Input Method

Add ---- Anthy

半角/全角  キーで日本語が使えるようになる。
私の場合は esc と入れ換えているので、esc で変換する。

◆◆ apache2 で cgi を使う ◆◆

インストール

   # apt-get install apache2

(参照)  http://qiita.com/aryoa/items/2c28b466e911a3dd101d

デフォルトの設定

ルートディレクトリ   /var/www/html
cgi 用ディレクトリ   /usr/lib/cgi-bin/   <---- ? 実行できない

は使いにくいので、以下のようにする。

(1) ユーザーディレクトリを可能にする

$ sudo -s
# a2enmod userdir

(2) cgi を使えるようにする

# cd /etc/apache2/mods-enabled
# ln -s ../mods-available/cgi.load .

(3) 設定ファイルの編集

/etc/apache2/sites-available/000-default.conf

  // 以下のコメントを外す
  Include conf-available/serve-cgi-bin.conf

  ServerName  のコメントを外し設定する
  ServerAdmin を設定する

/etc/apache2/mods-available/mime.conf

   AddHandler cgi-script .cgi .py .pl

/etc/apache2/conf-available/serve-cgi-bin.conf

   ScriptAlias /cgi-bin/ /home/pi/public_html/cgi-bin/
   <Directory "/home/pi/public_html/cgi-bin">

(4) リスタート

# /etc/init.d/apache2 restart  あるいは
# apachectl restart

(5) おまけ

サーバーの名前でアクセスしたときのために、

/var/www/html/index.html

の内容を以下のようにする。/~pi/ のトップディレクトリ
へジャンプする。

<html>
  <head>
  <meta http-equiv="Refresh" content="0;URL=/~pi/">
    <title>top page</title>
  </head>
  <body>
  </body>
</html>

◆◆ apache で php を使う ◆◆

(1) インストール

  # apt-get install php5
  # apt-get install libapache2-mod-php5

(2) apache2 の設定変更

  $ cd /etc/apache2/mods-enabled
  # vi mime.conf

  AddHandler php5-script .php

  # vi php5.conf

  末尾の <IfModule mod_userdir.c> ..... </IfModule> をコメントアウトする。

  # /etc/init.d/apache2 restart

(3) php の設定ファイル

  $ cd /etc/php5/apache2
  $ sudo -s
  # vi php.ini

date.timezone = "Asia/Tokyo"


◆◆ apache2 の自動起動の停止と復活 ◆◆

  # update-rc.d -f apache2 remove      自動起動停止  /etc/rc2.d/... が削除
  # update-rc.d apache2 defaults       自動起動復活

ログ

  /var/log/apache2


◆◆ cgi の実行権限 ◆◆

cgi は www-data というユーザー名で実行され、実行時のカレント
ディレクトリはデフォルトでは ~pi/public_html/cgi-bin/  である。

ファイルを作成するときは、以下の方法がある。

(1) ファイルを作成するディレクトリの許可情報を 777 に
  しておく。ファイルの所有者は www-data になる。

(2) suexec を可能にすると、ファイルの所有者の権限で
  実行される。suexec を可能にする方法は以下の通り。

  # apt-get update
  # apt-get install -y apache2-suexec-custom
  # a2enmod suexec
  # systemctl restart apache2

ファイルを作成するディレクトリのパーミッションは 755 としておく。
apache2 のバージョン(設定?)によっては 777 ではエラーが出る。

◆◆ cgi で GPIO を操作する ◆◆

(1) GPIO にアクセスするコマンドは root 権限が必要である。
    2 つの方法がある。

  (a) ユーザ www-data が sudo でコマンドを実行するときに、
      パスワードを必要としないよう設定しておく。

      $ sudo visudo

      で最後の行に以下の記述を加える

      www-data ALL=(ALL) NOPASSWD: ALL

  (b) 実行するコマンドの所有者を root にして、sticky bit をたてる。

     # chown root filename
     # chmod u+s filename

(2) cgi から実行する「コマンドの標準出力」の扱い

perl と python からコマンドを実行する場合、微妙な違いがある。

(a) perl

perl から system 関数でプログラムを実行すると、
system 関数で実行したプログラムが
標準出力に出した文字は、ブラウザへ送られる。
ゆえに、perl の cgi は以下のようになる。

print "Content-type: text/html\n";
print "\n";
print "<html>\n";
print "<head>\n";
print "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n"\
;
print "<title>cgi のテスト</title>\n";
print "</head>\n";
print "<body>\n";
print "<p>\n";

$ret = system("ここにコマンドを書く");

print "<p> return code = %ret</p>\n";
print "</body>\n";
print "</html>\n";

(b) python

python から同様に os.system(cmd) とすると、apache2 は
# Bad header: yyyy
というエラーを発生させる。command.getoutput(cmd) を使って、
出力を一旦変数に入れる必要がある。

print "Content-type: text/html"
print ""
print "<html>"
print "<head>"
print "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"
print "<title>cgi のテスト</title>"
print "<style>"
print "body,p { font-size: x-large; margin: 20px; }"
print "</style>"
print "</head>"
print "<body>"

cmd = "ここに実行したいコマンドを書く"
print "<p>コマンド: " + cmd + "<br>"
ret = commands.getoutput(cmd)
print ret

print "</body>"
print "</html>"

◆◆ Teraterm の設定 ◆◆

raspberry pi は遠隔ログインして使うことも多い。
teraterm で接続すると、カラーがかかって見づらいこと
が多い。

恐らく (3) が効いていると思われるが、以下の設定をした。

(1) tcsh において setenv TERM vt100

(2) teraterm.ini において TermType=vt100
  ちなみに行間を空ける方法は  VTFontSpace=0,0,6,0

(3)「表示」→「その他の設定」→「表示」で右下の
  チェックボックスを全て外す。

◆◆ wifi の設定(GUI) ◆◆

wpa_gui というソフトがあるらしい。

(情報源)
http://s2jp.com/2013/12/raspberry-pi-with-internet/


◆◆ SD カードのフォーマット ◆◆

Raspberry Pi で使った SD カードは windows では使えないらしい。
SD Card Association の SD Card Formatter を使う。
詳しくは以下のサイトへ。

(情報源)
http://s2jp.com/2013/11/reuse-raspbian-sdcard/

◆◆ X Window System の終了 ◆◆

shutdown を選ぶと、shutdown / exit to command line / reboot の
3 つが選べる。


◆◆ 日本語表示 ◆◆

.bashrc の中に以下のように書くとメニューが日本語化される

LANG=ja_JP.UTF-8

その一方で、LXTerminal の表示がずれる。
しかし、これを怠ると EUC ファイルが化ける。

startx は bash から起動する。
LXTermial から tcsh を起動し、.cshrc の中に

setenv LANG ja_JP.UTF-8

を書く。

◆◆ (micro) SD card のコピー (Win32DiskImager 使用) ◆◆

Win32DiskImager を使う。

Read 時にファイル名を指定するとき、フォルダマークを
クリックしてフォルダを選び、絶対パスで指定すること。
相対パスで指定すると、終わった後、ファイルがどこにもない。

同じ容量の SD カードでも微妙な差があるらしい。
16GB 同士でコピーを試みた。

A:  Silicon Power microSDHC  16GB class10
B:  GreenHouse microSDHC 16GB class4
C:  SanDisk Extreme midroSDHC  16GB  1の記号

A から image ファイルを作り、B, C にコピーしようと
したところ、B は NG、C は OK だった。

Raspberry Pi で使う micro SD カードは統一しておいた方が良い。

8GB ---> 16GB は OK である。
16GB の SD カードを 8GB の容量として使うことになるが、
raspi-config を使うと、16GB に拡張できるらしい。

8GB SD ---> 8GB micro Sd では
Trancend ---> Kingston はダメだった。

容量が異なる場合でも、正しくコピーする方法は
別の項目で示す。

◆◆ マシン名を変更する ◆◆

/etc/hostname
/etc/hosts

を編集する。


◆◆ (micro) SD カードのコピー(容量が異なる場合も OK, dd 使用) 2016.2.1 ◆◆

8GB の SD カードを別の 8GB SD カードにコピーしようとして、
Win32DiskImager を使うと、コピー先のディスクの容量が小さいと
言って怒られ、コピーできない。同じ 8GB の SD カードでも
微妙な差があるようだ。8GB --> 16GB ならコピーできるが、
その次に 16GB をコピーするときに困る。

Linux マシン (ubuntu) で操作する

(1) 容量を縮める

   # apt-get install gparted

で gparted をインストールする。

コピー元 SD カードを接続し、df コマンドで接続されたことを
確認する。

   # tcsh
   # setenv DISPLAY unix:0.0
   # /usr/sbin/gparted

あるいは、ubuntu の場合「アプリケーション」→「システムツール」
→「GParted パーティション編集ツール」

右端のアイコンの ▲▼ をクリックして SD カードにする。

全ての領域を「右クリック」→「アンマウント」

(a) /dev/sdc?  ext4  のサイズを、少し減らす (ex. 200MiB )。
(b) その領域を含むパーティションのサイズを減らす (ex. 199MiB)。
    200 MiB 減らすよう指定しても、自動的に
    199 MiB に訂正されてしまう。

「チェックのマーク」をクリックして、その変更を
適用する。

(2) 容量の確認

gparted で容量を確認する。
パーティションごとに、領域を右クリックする。
今回の SD カードの場合、以下のようになった。

未使用領域   4MiB
/dev/sdc1    1145 MiB
/dev/sdc2    6347 MiB
未使用領域   残り

バックアップ対象となるサイズは 4 + 1145 + 6347 = 7496 MiB である

(3) バックアップ

  # dd if=/dev/sdc of=./rasp.img bs=1048576 count=7500

  1024 * 1024 = 1048576
  count は 7496 よりちょっと多め
  約 8 分

(4) リストア

  # dd if=./rasp.img of=/dev/sdd bs=1048576 count=7500

   約 14 分

gparted で見ると、元の SD カードのように、第 2 パーティションは
いくつかに分割されておらず、1 つのパーティションとして見える。

しかし、一旦外して、差し直すと、第 2 パーティションの中の
分割の様子も再現される。

SD カードをラズパイに差すと正常に動作する。

これで良さそうである。

◆◆ Wifi が頻繁に切断されるのを防ぐ ◆◆

ラズパイ上で動作させている web サーバにアクセスすると、
応答しない。

何回か ping すると、復活する。

原因は wifi アダプタがデフォルトでは省電力モードで動作し、
スリープ状態にはいることのようだ。
解決法が

http://denshikousaku.net/fix-sluggish-response-of-raspberry-pi-wifi-adaptor
http://forums.adafruit.com/viewtopic.php?f=50&t=44171&p=220622#p220593

に書いてあった。

/etc/modprobe.d/8192cu.conf

というファイルを作成し、その中に以下のように書き込む。

# Disable power saving
options 8192cu rtw_power_mgnt=0


◆◆ WiringPi-Python のインストール ◆◆

$ sudo -s
# apt-get install git-core
# apt-get install python-setuptools
# apt-get install python-dev

$ git clone https://github.com/WiringPi/WiringPi-Python.git
$ cd WiringPi-Python
$ git submodule update --init

$ sudo python setup.py install

   C 版のインストールは以下の通り
   $ cd WiringPi/
   $ ./build
   $ cd ../

インストールしたが、使ってみると、反応しない。謎。


◆◆ シングルユーザーモードで起動 ◆◆

/etc/rc.local  に自作アプリの起動を書き込み、
最後に & をつけるのを忘れると、
起動途中で止まるようになってしまった。

^C  ^D  ^Z なども効かない。

シングルユーザーモードで操作して、解消する。

起動時に shift を押し、cmdline.txt を編集する。
以下の設定を加える。

  init=/bin/sh

シングルユーザーモードで起動直後は、ファイルシステムが read-only なので、
以下のコマンドを実行する。

  # mount -o rw,remount /

その後、/etc/rc.local を vi で編集する。


◆◆ 自作アプリの自動起動 ◆◆

/etc/rc.local に書き込むときは、最後に絶対に & を忘れないように。
これを怠ると、起動途中で止まる。
シングルユーザーモードにして復旧作業をする羽目になる。

正統派のやりかたは以下の通り。ただし、煩雑である。

(情報源)http://mower.hateblo.jp/entry/2015/05/08/111025

(1) sysv-rc-conf が入っていない場合は

  # apt-get install sysv-rc-conf

でインストールしておく。

(2) 自動起動用のファイルを作成する。

   # cd /etc/init.d
   # cp skeleton my-program
   # chmod 755 my-program

my-program の中身を編集する。
全てコメントアウトし、最後の 1 行に
自作のプログラム名を記述する。

(3) 自動起動するよう設定する。

   # sysv-rc-conf my-program on

/etc/rc[2345].d  の中に S20my-program というファイルが作成され、
/etd/init.d/my-program へのシンボリックリンクが作成される。

◆◆ 簡易 web サーバ ◆◆

python で cgi も使える簡易 web server をたてることができる。

  $ cd
  $ cd public_html
  $ sudo python -m CGIHTTPServer 80

起動したディレクトリがルートディレクトリになる。

http://192.168.xx.yy

に接続すると

/home/pi/public_html/index.html

を読み込む。以前に、同じサイトで /~pi/ を見ていたとき、ブラウザが
勝手に /~pi/ を付け加えるので、ファイルがないというエラーが出る。
そのときは、

http://192.168.xx.yy/index.html

と指定する。cgi は cgi-bin というディレクトリに置く。
cgi から command.getoutput(cmd) で外部コマンドを実行すると、
nobody の権限で実行されるので GPIO, Serial に
アクセスするときは、sudo visudo で以下のように設定する。

      nobody ALL=(ALL) NOPASSWD: ALL

/etc/rc.local に自動起動の記述する。

( cd /home/pi/public_html; python -m CGIHTTPServer 80 >> /var/tmp/web.log 2>&1 & )

/tmp に書き込むとブート時に削除されるが、/var/tmp は残る。
ログの位置は /home/pi/public_html でも良いかもしれない。


◆◆ motion のインストール ◆◆

(1) インストール

# apt-get install motion

(2) 設定ファイルの書き換え

/etc/default/motion

  start_motion_daemon=yes

/etc/motion/motion.conf

  daemon = on
  webcam_localhost off

(3) 起動

# sudo service motion start

(4) ブラウザからアクセス

192.168.xx.yy:8081

なぜか、IE からは見れない。
Firefox か Chrome のみ。

リアルタイム性はかなり低い。

opencv の方が良いかも。


◆◆ パスワード無しで sudo する ◆◆

$ sudo visudo

  www-data ALL=(ALL) NOPASSWD: ALL     ユーザー限定 全てのコマンド
  www-data ALL=(ALL) NOPASSWD: /home/pi/public_html/cgi-bin/action.py
                                       ユーザー限定 コマンド限定

◆◆ ファイル・ポートを開いているプロセスを調べる ◆◆

  $ lsof -p 1010        pid=1010 のプロセスが開いているファイル
  $ lsof /home/pi/file  /home/pi/file を開いているプロセス
  $ lsof -i 6000        6000 番ポートを開いているプロセス

◆◆ 実行されているサービスを調べる ◆◆

  # service --status-all

  + 記号が付いているのが起動されているサービス


◆◆ Raspberry Pi 3 でシリアル通信端子 Tx, Rx が使えない ◆◆

Raspberry Pi 3 にバージョンが新しい Raspbian
(uname -a を実行し、4.4.11 以降は新しい。4.1.17 は古いとみなす)を
インストールした場合、Tx, Rx 端子が使えない。
Tx, Rx 端子を使ってシリアル通信をする(UART を使う)には
以下の操作が必要。

/boot/config.txt

の末尾に以下の行を追加

dtoverlay=pi3-miniuart-bt


◆◆ リモートデスクトップ ◆◆

Windows から Raspbian の画面に接続することができる。
Raspberry Pi に xrdp をインストールする。
インストールすると xrdp が起動し、起動時にも自動的に xrdp が
起動するよう設定されるようだ。

  $ sudo -s
  # apt-get install xrdp

Windows からリモートデスクトップで接続する。

Windows8 の場合
 タイル状のスタート画面の ↓ を押す
 アプリのリストの中の「リモートデスクトップ接続」

Windows7 の場合
 スタートボタン --- 全てのプログラム --- アクセサリ
 --- リモートデスクトップ接続

キーボードが英語配置になっている。日本語配置にするには
以下のように操作する。

  $ cd /etc/xrdp
  $ sudo -s
  # wget http://w.vmeta.jp/temp/km-0411.ini
  # chown root:root km-0411.ini
  # ln -s km-0411.ini e0200411.ini
  # ln -s km-0411.ini e0010411.ini
  # service xrdp restart


◆◆ tex のインストール(失敗) ◆◆

  # apt install texlive-lang-cjk xdvik-ja latexmk
  # apt install texlive

ところが、何が原因か分からないが、デスクトップが
ゴミ箱だけになってしまった。

リブートして startx すると、デスクトップはのっぺらぼう
になってしまった。

もう一度リブートして

  # apt remove gnome-panel
  # apt install gnome-panel

する。

root で startx するとパネルは表示されるが、
pi で startx するとのっぺらぼうである。

  .gconf
  .local

をリネームしてもダメ。

df すると、/dev/root が満杯になっており、Available が 0 に
なっている。

  # apt remove texlive-base

すると、400 MB 空きが生じた。この状態で startx すると、
パネルが表示された。tex のインストールにより空き容量が
0 になったことが原因のようだ。