Raspbian

2016/10/30更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3のGPIOを制御するWiringPiライブラリを導入する手順を示す。

WiringPiにはC言語ライブラリの他にgpioコマンドも含まれるのでこれを使ってLチカしてみる。

インストール

まずソースコード一式を入手してbuildする。

% git clone git://git.drogon.net/wiringPi
% cd wiringPi

% ./build
:
NOTE: To compile programs with wiringPi, you need to add:
    -lwiringPi
  to your compile line(s) To use the Gertboard, MaxDetect, etc.
  code (the devLib), you need to also add:
    -lwiringPiDev
  to your compile line(s).

% which gpio
/usr/local/bin/gpio

% gpio -v
gpio version: 2.32
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 3, Revision: 02, Memory: 1024MB, Maker: Embest
  * Device tree is enabled.
  * This Raspberry Pi supports user-level GPIO access.
    -> See the man-page for more details
    -> ie. export WIRINGPI_GPIOMEM=1

% cd ..
% rm -rf wiringPi

以下のファイルがインストールされる。

/usr/local/lib/libwiringPi.so -> libwiringPi.so.2.32
/usr/local/lib/libwiringPi.so.2.32
/usr/local/lib/libwiringPiDev.so -> libwiringPiDev.so.2.32
/usr/local/lib/libwiringPiDev.so.2.32

/usr/local/bin/gpio

/usr/local/include/ads1115.h
/usr/local/include/drcSerial.h
/usr/local/include/ds1302.h
/usr/local/include/gertboard.h
/usr/local/include/lcd.h
/usr/local/include/lcd128x64.h
/usr/local/include/max31855.h
/usr/local/include/max5322.h
/usr/local/include/maxdetect.h
/usr/local/include/mcp23008.h
/usr/local/include/mcp23016.h
/usr/local/include/mcp23017.h
/usr/local/include/mcp23s08.h
/usr/local/include/mcp23s17.h
/usr/local/include/mcp3002.h
/usr/local/include/mcp3004.h
/usr/local/include/mcp3422.h
/usr/local/include/mcp4802.h
/usr/local/include/pcf8574.h
/usr/local/include/pcf8591.h
/usr/local/include/piFace.h
/usr/local/include/piGlow.h
/usr/local/include/piNes.h
/usr/local/include/scrollPhat.h
/usr/local/include/sn3218.h
/usr/local/include/softPwm.h
/usr/local/include/softTone.h
/usr/local/include/sr595.h
/usr/local/include/wiringPi.h
/usr/local/include/wiringPiI2C.h
/usr/local/include/wiringPiSPI.h
/usr/local/include/wiringSerial.h
/usr/local/include/wiringShift.h
/usr/local/include/wpiExtensions.h

gpio readallコマンドを使うとGPIOピンの状態が一覧表示される。

% gpio readall
+-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
| BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
|     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
|   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5V      |     |     |
|   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
|   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT5 | TxD     | 15  | 14  |
|     |     |      0v |      |   |  9 || 10 | 1 | ALT5 | RxD     | 16  | 15  |
|  17 |   0 | GPIO. 0 |   IN | 1 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
|  27 |   2 | GPIO. 2 |  OUT | 1 | 13 || 14 |   |      | 0v      |     |     |
|  22 |   3 | GPIO. 3 |  OUT | 1 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
|     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
|  10 |  12 |    MOSI | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
|   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
|  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT  | CE0     | 10  | 8   |
|     |     |      0v |      |   | 25 || 26 | 1 | OUT  | 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 | 0 | IN   | 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 |
+-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+

後述のスクリプトの中でLEDの点灯・消灯切替のタイミングを0.5秒にしているが、sleepコマンドは1秒以下のスリープ時間が指定できないためマイクロ秒単位でスリープ時間を指定できるsleepenhパッケージもインストールしておく。

% sudo apt install sleepenh

% sleepenh
sleepenh -- an enhanced sleep program.
         -- $Revision: 1.2 $
         -- $Date: 2003/02/24 17:17:48 $

Copyright (C) 2003 - Pedro Zorzenon Neto
Distributed under the conditions of FSF/GPL2 License.
See the source code for more copyright and license information.

Usage: sleepenh timetosleep
   or: sleepenh initialtime timetosleep

timetosleep is in seconds, microsecond resolution. Ex: 80.123456
initialtime is the output value of a previous execution of sleepenh.

% date && sleepenh 0.5 && date
2016年 10月 30日 日曜日 14:31:27 JST
1477805487.833714
2016年 10月 30日 日曜日 14:31:27 JST

プログラミング

以下の資料にてLチカさせた時のコードをgpioコマンドを使って書き直してみる。

関連資料・記事

従来のRPi.GPIOライブラリ使用
#!/usr/bin/env python

import RPi.GPIO as GPIO
from time import sleep

PIN = 25

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)

try:
    while True:
        GPIO.output(PIN, GPIO.HIGH)
        sleep(0.5)
        GPIO.output(PIN, GPIO.LOW)
        sleep(0.5)

except KeyboardInterrupt:
    pass

GPIO.cleanup(PIN)
gpioコマンド使用
#!/bin/sh

PIN=25
HIGH=1
LOW=0

gpio -g mode ${PIN} out

trap 'gpio -g mode ${PIN} in; exit' 2 15

while [ 1 ]
do
  gpio -g write ${PIN} ${HIGH}
  sleepenh 0.5 > /dev/null
  gpio -g write ${PIN} ${LOW}
  sleepenh 0.5 > /dev/null
done
見て分かる通り、コマンド(メソッド)が違うだけで書き方は同じ、違いは例外の書き方くらいである。

この例外処理はtrapというシェルの組込関数を使ってスクリプト実行中に[Ctrl] + [c]かkillコマンドによって処理が中断された時のシグナルをキャッチしてピンモードを入力(IN)に戻してリセットするという処理を行っている。

2(SIGINT) ... [Ctrl] + [c]
15(SIGTERM) ... 「% kill <pid>」

関連資料・記事

参考サイト

2016/11/28更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspbian Jessie Liteでパスフレーズ(パスワード)なしのWi-Fiアクセスポイントに接続するには/etc/wpa_supplicant/wpa_supplicant.confのnetworkセクションを以下のように設定する。

network={
	ssid="<ESSID>"
	key_mgmt=NONE
}

ただしアクセスポイントの周囲にある任意のデバイスから容易に接続できる状態であることを十分認識した上で通信は最低でもSSHやTLS/SSLによって暗号化すべきである。

関連資料・記事

参考サイト

2016/12/18更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3とMONOSTICKを使ってTWE-LITE-2525A(加速度センサー内蔵無線タグ)からデータを読み取る」でTWE-LITE-2525Aのデータが読み出せるようになったが、Twitter投稿やメール送信などと簡単に連携させるためNode.jsでも読み出してみる。

serialportモジュールインストール

同モジュールの公式GitHubリポジトリは以下で、npmで簡単にインストールできる。

% sudo npm install -g serialport

読み出しプログラム

以下のような簡単なプログラムにてTWE-LITE-2525Aのデータを読み取る。

get_twelite.js
var serialport = require('serialport');

// シリアルポート設定
var port = new serialport('/dev/ttyUSB0', {
  baudRate: 115200,
  parser: serialport.parsers.readline("\n")
});

// TWE-Liteからデータ受信
port.on('data', function(input) {
  var devid    = ' 1: 0x' + input.slice( 1, 3) + '       device id';
  var comm     = ' 2: 0x' + input.slice( 3, 5) + '       command';
  var packetid = ' 3: 0x' + input.slice( 5, 7) + '       packet id';
  var proto    = ' 4: 0x' + input.slice( 7, 9) + '       protocol version';
  var lqi      = ' 5: 0x' + input.slice( 9,11) + '       LQI';
  var src      = ' 6: 0x' + input.slice(11,19) + ' source id';
  var dst      = ' 7: 0x' + input.slice(19,21) + '       destination id';
  var time     = ' 8: 0x' + input.slice(21,25) + '     time stamp';
  var relay    = ' 9: 0x' + input.slice(25,27) + '       relay flag';
  var volt     = ' a: 0x' + input.slice(27,31) + '     supply voltage';
  var na       = ' b: 0x' + input.slice(31,33) + '       N/A';
  var di       = ' c: 0x' + input.slice(33,35) + '       DI status';
  var di_chg   = ' d: 0x' + input.slice(35,37) + '       DI change status';
  var ad       = 'ex: 0x' + input.slice(37,45) + ' AD value';
  var ad_corr  = 'ef: 0x' + input.slice(45,47) + '       AD correction value';
  var chksum   = ' g: 0x' + input.slice(47,49) + '       check sum';

  console.log(input);
  console.log(' ^1^2^3^4^5^^^^^^^6^7^^^8^9^^^a^b^c^de1e2e3e4ef^g');
  console.log('---');
  console.log(devid);
  console.log(comm);
  console.log(packetid);
  console.log(proto);
  console.log(lqi);
  console.log(src);
  console.log(dst);
  console.log(time);
  console.log(relay);
  console.log(volt);
  console.log(na);
  console.log(di);
  console.log(di_chg);
  console.log(ad);
  console.log(ad_corr);
  console.log(chksum);
  console.log('-------------------------------------------------');
});

これを実行してTWE-LITE-2525Aに変化を与えると以下のような結果が得られる。

% node get_twelite.js
:78811501A2810F0508008EF4000B4000000F3E3E425A1AA4
 ^1^2^3^4^5^^^^^^^6^7^^^8^9^^^a^b^c^de1e2e3e4ef^g
---
 1: 0x78       device id
 2: 0x81       command
 3: 0x15       packet id
 4: 0x01       protocol version
 5: 0xA2       LQI
 6: 0x810F0508 source id
 7: 0x00       destination id
 8: 0x8EF4     time stamp
 9: 0x00       relay flag
 a: 0x0B40     supply voltage
 b: 0x00       N/A
 c: 0x00       DI status
 d: 0x0F       DI change status
ex: 0x3E3E425A AD value
ef: 0x1A       AD correction value
 g: 0xA4       check sum
-------------------------------------------------
:78811501AB810F0508008EFC000B4000000F3E3E425A1A93
 ^1^2^3^4^5^^^^^^^6^7^^^8^9^^^a^b^c^de1e2e3e4ef^g
---
 1: 0x78       device id
 2: 0x81       command
 3: 0x15       packet id
 4: 0x01       protocol version
 5: 0xAB       LQI
 6: 0x810F0508 source id
 7: 0x00       destination id
 8: 0x8EFC     time stamp
 9: 0x00       relay flag
 a: 0x0B40     supply voltage
 b: 0x00       N/A
 c: 0x00       DI status
 d: 0x0F       DI change status
ex: 0x3E3E425A AD value
ef: 0x1A       AD correction value
 g: 0x93       check sum
-------------------------------------------------

このデータを利用して他の処理と組み合わせればいろいろな用途に使える。

尚、データ仕様はMONO-WIRELESSの公式サイトにて定義されている。

関連資料・記事

参考サイト

2016/12/17更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3のUSB端子に無線PANモジュールのMONOSTICKを差し、加速度センサー内蔵無線タグのTWE-LITE-2525Aと通信させることでセンサーデータを簡単に読み取ることができるのでその手順を示す。

TWE-LITE-2525A組み立て

まずTWE-LITE-2525Aを組み立てる。購入時は左のように分割状態で梱包されているので2枚を重ねてボタン電池を入れ右のようにする。

MONOSTICK認識

続いてMONOSTICKをRaspberry Piから使えるようにする。

MONOSTICKをRaspberry PiのUSB端子に差し込むと標準のUSBドライバで認識され、/dev/ttyUSB0が作られる。

% sudo journalctl -f
12月 09 01:21:02 p1 kernel: usb 1-1.4: new full-speed USB device number 5 using dwc_otg
12月 09 01:21:02 p1 kernel: usb 1-1.4: New USB device found, idVendor=0403, idProduct=6001
12月 09 01:21:02 p1 kernel: usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
12月 09 01:21:02 p1 kernel: usb 1-1.4: Product: MONOSTICK
12月 09 01:21:02 p1 kernel: usb 1-1.4: Manufacturer: MONOWIRELESS
12月 09 01:21:02 p1 kernel: usb 1-1.4: SerialNumber: MWEJJQG
12月 09 01:21:03 p1 kernel: usbcore: registered new interface driver usbserial
12月 09 01:21:03 p1 kernel: usbcore: registered new interface driver usbserial_generic
12月 09 01:21:03 p1 kernel: usbserial: USB Serial support registered for generic
12月 09 01:21:03 p1 kernel: usbcore: registered new interface driver ftdi_sio
12月 09 01:21:03 p1 kernel: usbserial: USB Serial support registered for FTDI USB Serial Device
12月 09 01:21:03 p1 kernel: ftdi_sio 1-1.4:1.0: FTDI USB Serial Device converter detected
12月 09 01:21:03 p1 kernel: usb 1-1.4: Detected FT232RL
12月 09 01:21:03 p1 kernel: usb 1-1.4: FTDI USB Serial Device converter now attached to ttyUSB0

% lsusb
Bus 001 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 004: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

% ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 12月  9 01:21 /dev/ttyUSB0

見て分かるとおり/dev/ttyUSB0にアクセスできるのはrootユーザあるいはdialoutグループに属するユーザのみであるが、デフォルトのpiユーザは最初からdialoutグループに属しているので特に何も設定しなくてもこのデバイスが使える。

もしdialoutグループに属していないユーザでこのデバイスを使用したい場合は以下のようにして対象ユーザをdialoutグループに追加する。

% sudo gpasswd -a <user> dialout

MONOSTICK接続

MONOSTICKがRaspberry Piで認識できたらcuコマンドを使ってシリアル通信を行ってみる。

% sudo apt install cu

cuコマンドの引数としてボーレートを115200、接続先を上記で作成されたUSBデバイスにする。

% cu -s 115200 -l /dev/ttyUSB0
Connected.

接続されたら「+」を3回入力するとメニューが出るので接続されたことが確認できる。「+」を素早く入力するとキーが認識されない場合があるのでゆっくり入力する。

--- CONFIG/MONO WIRELESS TWELITE DIP APP V1-08-1/SID=0x810e0964/LID=0x00 ---
 a: set Application ID (0x67720102) 
 i: set Device ID (121=0x79) 
 c: set Channels (18) 
 x: set Tx Power (03) 
 t: set mode4 sleep dur (1000ms) 
 y: set mode7 sleep dur (10s) 
 f: set mode3 fps (32) 
 z: set PWM HZ (1000,1000,1000,1000) 
 o: set Option Bits (0x00000020) 
 b: set UART baud (38400) 
 p: set UART parity (N) 
---
 S: save Configuration
 R: reset to Defaults

接続を切るには「~」+「.」を入力する。

Disonnected.

設定内容の詳細は以下を参照のこと。

TWE-LITE-2525A認識

再びcuコマンドでMONOSTICKに接続し、最初に組み立てたTWE-LITEを近くに置いてMONOSTICKでデータが取得できることを確認する。

% cu -s 115200 -l /dev/ttyUSB0
Connected.

なお、MONOSTICK上で「+」を3回入力してメニューを出している状態(インタラクティブモード)の場合、再び「+」を3回入力してインタラクティブモードを抜けないとTWE-LITEからデータが受信できない。

(インタラクティブモードから抜けた時のメッセージ)

!INF EXIT INTERACTIVE MODE.

TWE-LITEからデータを取得すると以下のような出力が得られる。

:78811501F6810F050800276C000B4000080F3D3C435A173C
:78811501F6810F0508002774000B4000020F3E3E385A0851
:

取得したデータを加工したり他の用途に使用する場合は各種スクリプト言語によるデータ取得ツールが利用できるがここではTWE-LITE公式サイトで配布されているPythonスクリプトを使用してみる。

まずpyserialパッケージをインストールする。

% sudo apt install python-dev
% sudo apt install python-pip
% sudo pip install pyserial

次にTWEアプリ用スクリプトのサイトで配布されているツールをダウンロードして実行してみる。

% mv twelite_read.txt twelite_read.py
% chmod +x twelite_read.py 
% ./twelite_read.py /dev/ttyUSB0
open serial port: /dev/ttyUSB0

:78811501ED810F050800282C000B4000080F403C375A0A9A
  command   = 0x81 (data arrival)
  src       = 0x78
  src long  = 0x810f0508
  dst       = 0x00
  pktid     = 0x15
  prtcl ver = 0x01
  LQI       = 237 / -15.55 [dbm]
  time stmp = 160.688 [s]
  relay flg = 0
  volt      = 2880 [mV]
  DI1=0/1  DI2=0/1  DI3=0/1  DI4=1/1
  AD1=1032 AD2=0968 AD3=0880 AD4=1440 [mV]

:78811501ED810F0508002854000B4000000F3F3D3A5A364B
  command   = 0x81 (data arrival)
  src       = 0x78
  src long  = 0x810f0508
  dst       = 0x00
  pktid     = 0x15
  prtcl ver = 0x01
  LQI       = 237 / -15.55 [dbm]
  time stmp = 161.312 [s]
  relay flg = 0
  volt      = 2880 [mV]
  DI1=0/1  DI2=0/1  DI3=0/1  DI4=0/1
  AD1=1016 AD2=0980 AD3=0940 AD4=1440 [mV]
:

上記のようなデータが取得できれば正常に動作している。

各データの意味は以下の通り。詳しくはMONO-WIRELESS公式資料の「相手端末からの状態通知:ステータス0x81」を参照のこと。

command = 0x81 (data arrival)

コマンド(1バイト)

0x81はデータの到着を表す。

src = 0x78

送信元の論理デバイスID(1バイト)

0x78は子機であることを表す。

src long = 0x810f0508

送信元の個体識別番号(4バイト)

製造時に一意に割り当てられる識別番号。変更不可。

dst = 0x00

宛先の論理デバイスID(1バイト)

pktid = 0x15

パケット識別子(1バイト)

アプリケーションIDより生成される。

prtcl ver = 0x01

プロトコルバージョン(1バイト)

0x01固定。

LQI = 237 / -15.55 [dbm]

LQI値(1バイト)

受信電波品質(0x00〜0xFF)を表し、以下の計算式でdBmに変換できる。

dBm = (7 * LQI - 1970) / 20

品質の目安は以下の通り。

50未満(悪い)
50〜100(やや悪い)
100〜150(良好)
150以上(アンテナ近く)

time stmp = 161.312 [s]

タイムスタンプ(2バイト)

1/64秒カウント。0xFFFFまでいくと0に戻る。

relay flg = 0

中継フラグ(1バイト)

0x00 中継なし
0x01 中継あり

volt = 2880 [mV]

電源電圧(2バイト)

DI1=0/1 DI2=0/1 DI3=0/1 DI4=0/1

デジタル入力(DI1〜4)の値(1バイト)

各スイッチの現在の状態と変更状態を(x/x)で表す。変更状態は一度でもLowになったら1とする。

尚、データは以下のようにDTI毎に1ビットで表される。

0x01 = DI1がON
0x02 = DI2がON
0x04 = DI3がON
0x08 = DI4がON
0xFF = 全てのスイッチがON

AD1=1016 AD2=0980 AD3=0940 AD4=1440 [mV]

アナログ入力(AI1〜4)の変換値(各1バイト)を補正した値

補正ビットを含めた計算式は以下の通り。

AD[mV] = (AI値 * 4 + 補正ビット) * 4

関連資料・記事

参考サイト

2016/11/23更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3には電源ボタンがないのでシャットダウンするにはOS上でシャットダウン用のコマンドを入力するか電源ケーブルを抜くしか方法がない。

コマンドを入力するのは面倒だが、かといってOS稼動中にいきなり電源ケーブルを抜くのもファイルシステム損傷などの恐れがあるのでタクトスイッチを長押しすることでシャットダウンするようなスクリプトを書いてみる。

ここでは5秒長押しするとhaltコマンドを実行してシャットダウンする仕様とし、サービスとして常時稼動しておくようにする。

結線とプログラム

まず結線は以下の通りで、タクトスイッチとGNDの間に10kΩのプルダウン抵抗を挟む。タクトスイッチのON/OFFはGPIOポート18ピン(GPIO 24)を使って取得し、スイッチが5秒連続で押されたらhaltコマンドを発行するようなシェルスクリプトを組む。

takthalt.sh
#!/bin/sh

wait_max=5	# wait sec

PIN=24
HIGH=1
LOW=0

gpio -g mode ${PIN} in

while [ 1 ]
do
  sts=`gpio -g read ${PIN}`

  if [ ${sts} -eq ${HIGH} ]; then
    cnt=`expr ${cnt} + 1`
  else
    cnt=0
  fi

  if [ ${cnt} -ge ${wait_max} ]; then
    logger "shutdown by takt switch"
    sudo halt
    exit
  fi

  sleep 1
done

※gpioコマンドはWiringPiライブラリに含まれるので必要があればインストールしておく。

関連資料・記事

サービス化

作成したスクリプトを以下の手順でサービス化して常時稼動させておく。スクリプトは「/usr/local/bin/takthalt.sh」に配置するものとし、サービス名は「takthalt」とする。

サービス定義
% sudo vi /etc/systemd/system/takthalt.service
[Unit]
Description=Halt by Takt Switch(long press)

[Service]
ExecStart=/usr/local/bin/takthalt.sh

[Install]
WantedBy=multi-user.target
サービス有効化 & 起動
% sudo systemctl enable takthalt

% sudo systemctl start takthalt

% sudo systemctl status takthalt
● takthalt.service - Halt by Takt Switch(long press)
   Loaded: loaded (/etc/systemd/system/takthalt.service; enabled)
   Active: active (running) since 水 2016-11-23 17:06:50 JST; 4s ago
 Main PID: 1399 (takthalt.sh)
   CGroup: /system.slice/takthalt.service
           ├─1399 /bin/sh /usr/local/bin/takthalt.sh
           └─1415 sleep 1

11月 23 17:06:50 p1 systemd[1]: Started Halt by Takt Switch(long press).

ここまで設定できたら作業完了である。

タクトスイッチを長押しすればsyslogに「shutdown by takt switch」というメッセージを出力してシャットダウンする。

関連資料・記事

参考サイト

2016/10/10更新

対応バージョン: Raspbian Jessie Lite - September 2016

PWMを使ってLEDの明るさを変えてみる。

pigpioライブラリでPWMを使うには以下のメソッドを利用する。

set_PWM_frequency(GPIO番号, PWM周波数)

PWMの周波数(Hz)を指定。デフォルトは800。

set_PWM_range(GPIO番号, PWM最大値)

PWM値(μs)の最大値を指定。指定可能な値は25〜40000。デフォルトは255。

set_PWM_dutycycle(GPIO番号, デューティ比)

デューティ比(率ではなく値)を指定。0〜set_PWM_range()で指定した範囲の値を指定できる。

3メソッドとも、set_と対になるget_も存在する。

PWM関連のメソッドは他にもあるがここでは割愛する。詳しくはpigpioライブラリ公式サイトを参照のこと。

実装

ここではPWM周波数を50Hz、デューティを0〜100μsまで10μs刻みで増減させてみる。

結線は単純なGPIOポート22ピン(GPIO 25) → 抵抗(330Ω) → LEDのアノード(+) → LEDのカソード(-) → GPIOポート6ピン(GND)とする。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pigpio
from time import sleep

PIN = 25
FREQ = 50
RANGE = 100

pi = pigpio.pi()

pi.set_mode(PIN, pigpio.OUTPUT)
pi.set_PWM_frequency(PIN, FREQ)
pi.set_PWM_range(PIN, RANGE)

try:
    d = 0
    r = 10
    while True:
        pi.set_PWM_dutycycle(PIN, d)
        sleep(0.1)
        d += r
        if d >= RANGE or d <= 0:
            r *= -1

except KeyboardInterrupt:
    pass

pi.set_mode(PIN, pigpio.INPUT)
pi.stop()

関連資料・記事

参考サイト

2016/10/10更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3のGPIOを制御するにはRPi.GPIOライブラリがよく使われるが、リモートからの制御も可能になるpigpioというライブラリもあるので導入手順を示す。

後半でRPi.GPIOライブラリを使ったコードとpigpioライブラリを使ったコードを比較する。

尚、リモートから接続する際のホストとしてUbuntu 16.04を使用するものとし、Raspberry Piとはネットワーク的に接続できる状態にあるものとする。

インストール

まずソースコード一式を入手してmake & make installする。これはRaspberry Pi、Ubuntu双方で実施する。

% wget abyz.co.uk/rpi/pigpio/pigpio.zip
% unzip pigpio.zip
% cd PIGPIO
% make
% sudo make install

以下のファイルがインストールされる。

/usr/local/lib/libpigpio.so
/usr/local/lib/libpigpiod_if.so
/usr/local/lib/libpigpiod_if2.so

/usr/local/lib/python2.7/dist-packages/pigpio-1.33.egg-info
/usr/local/lib/python2.7/dist-packages/pigpio.py
/usr/local/lib/python2.7/dist-packages/pigpio.pyc

/usr/local/bin/pig2vcd
/usr/local/bin/pigpiod
/usr/local/bin/pigs

/usr/local/include/pigpio.h
/usr/local/include/pigpiod_if.h
/usr/local/include/pigpiod_if2.h

/opt/pigpio/cgi/ (ディレクトリのみ)

サービス登録(systemd)

続いてサービスの登録を行い、pigpiodをデーモンとして動作させる。これはRaspberry Pi側のみで実施する。

サービス定義
% sudo vi /lib/systemd/system/pigpiod.service
[Unit]
Description=Gpio daemon

[Service]
ExecStart=/usr/local/bin/pigpiod
Type=forking

[Install]
WantedBy=multi-user.target
サービス有効化 & 起動
% sudo systemctl enable pigpiod

% sudo systemctl start pigpiod

% sudo systemctl status pigpiod
● pigpiod.service - Gpio daemon
   Loaded: loaded (/lib/systemd/system/pigpiod.service; enabled)
   Active: active (running) since 月 2016-10-10 14:28:07 JST; 6s ago
  Process: 1127 ExecStart=/usr/local/bin/pigpiod (code=exited, status=0/SUCCESS)
 Main PID: 1129 (pigpiod)
   CGroup: /system.slice/pigpiod.service
           └─1129 /usr/local/bin/pigpiod

10月 10 14:28:07 p1 systemd[1]: Started Gpio daemon.

サービスを起動すると8888番ポートが待受ポートとして使われているのが確認できる。

% ss -nat
State    Recv-Q Send-Q   Local Address:Port   Peer Address:Port 
:
LISTEN   0      100                  *:8888              *:*     
:

プログラミング

以下の資料にてLチカさせた時のコードをpippioライブラリを使って書き直してみる。

関連資料・記事

従来のRPi.GPIOライブラリ使用
#!/usr/bin/env python

import RPi.GPIO as GPIO
from time import sleep

PIN = 25

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)

try:
    while True:
        GPIO.output(PIN, GPIO.HIGH)
        sleep(0.5)
        GPIO.output(PIN, GPIO.LOW)
        sleep(0.5)

except KeyboardInterrupt:
    pass

GPIO.cleanup(PIN)
pigpioライブラリ使用(Raspberry Pi上で動かす場合)
#!/usr/bin/env python

import pigpio
from time import sleep

PIN = 25

pi = pigpio.pi()
pi.set_mode(PIN, pigpio.OUTPUT)

try:
    while True:
        pi.write(PIN, 1)
        sleep(0.5)
        pi.write(PIN, 0)
        sleep(0.5)

except KeyboardInterrupt:
    pass

pi.set_mode(PIN, pigpio.INPUT)
pi.stop()
見て分かる通り、呼び出すメソッドが違うだけで書き方は同じ、違いは最初にpigpiodに接続する部分だけである。

Raspberry Pi上でローカル接続する場合とUbuntuからリモート接続する場合の引数が違うところに注意すればローカルでもリモートでも同じようにGPIOポートが操作できる。

ローカル接続
pi = pigpio.pi()
リモート接続
pi = pigpio.pi('<pigpiodが動作するホストのホスト名かIPアドレス>')

関連資料・記事

参考サイト

2016/10/10更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3でタクトスイッチを使ってLEDを制御させてみる。

教本は金丸隆志さんの「カラー図解 最新 Raspberry Piで学ぶ電子工作」。

書籍のサポートページも参照しながら順を追って試してみる。

またブレッドボード図はFritzingを使って作成している。

ちなみにFritzingのインストール手順は簡単で、まず公式サイトから必要なバイナリ(*)をダウンロードし、任意の場所に展開してその中のFritzingを起動するだけである。

(*) Ubuntu 16.04ではfritzing-0.9.3b.linux.AMD64.tar.bz2

% tar xvf fritzing-0.9.3b.linux.AMD64.tar.bz2
% fritzing-0.9.3b.linux.AMD64/Fritzing

ドキュメントルートは~/Documents/Fritzingに設定される。

プルダウン抵抗を使った場合

教本P107 図5-6に従ってタクトスイッチ側に10kΩのプルダウン抵抗を使用する。電流の流れは以下の通り。

タクトスイッチ

GPIOポート1ピン(3.3V電源) → タクトスイッチ → 抵抗(10kΩ) → GPIOポート6ピン(GND)

LED

GPIOポート22ピン(GPIO 25) → 抵抗(330Ω) → LEDのアノード(+) → LEDのカソード(-) → GPIOポート6ピン(GND)

タクトスイッチのON/OFFはGPIOポート18ピン(GPIO 24)を使って取得し、スイッチが押されたらGPIO 25の状態をHIGHにすることでLEDが点灯する。

#!/usr/bin/env python

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)
GPIO.setup(24, GPIO.IN)

try:
    while True:
        if GPIO.input(24) == GPIO.HIGH:
            GPIO.output(25, GPIO.HIGH)
        else:
            GPIO.output(25, GPIO.LOW)
        sleep(0.01)

except KeyboardInterrupt:
    pass

GPIO.cleanup()

Raspberry Pi内部のプルダウン抵抗を使った場合

Raspberry Pi内部に用意されているプルダウン抵抗を使えば物理的な抵抗が不要になる。

教本P113 図5-9に従って上記回路からプルダウン抵抗を取り除くと以下のようにシンプルになる。

プログラムは前出の8行目を以下のように変更し、GPIO 24のプルダウン抵抗を有効にする。

(変更前)

8   GPIO.setup(24, GPIO.IN)

(変更後)

8   GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

スイッチが押されていない時は別のLEDを点灯させる

スイッチが押された時に赤色LEDが点灯するのに加え、押されていない場合は青色LEDを点灯させてみる。

タクトスイッチの回路はそのままに、青色LED用の回路をもう一本作る。

GPIOポート36ピン(GPIO 16) → 抵抗(330Ω) → 青色LEDのアノード(+) → 青色LEDのカソード(-) → GPIOポート6ピン(GND)

プログラムも簡単で、GPIO 16を使用可能にしたうえで赤色LEDを点灯させる時は青色LEDを消灯し、赤色LEDを消灯させる時は青色LEDを点灯させればよい。

#!/usr/bin/env python

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(25, GPIO.OUT)        # LED(Red)
GPIO.setup(16, GPIO.OUT)        # LED(Blue)

try:
    while True:
        if GPIO.input(24) == GPIO.HIGH:
            GPIO.output(25, GPIO.HIGH)
            GPIO.output(16, GPIO.LOW)
        else:
            GPIO.output(25, GPIO.LOW)
            GPIO.output(16, GPIO.HIGH)
        sleep(0.01)

except KeyboardInterrupt:
    pass

GPIO.cleanup()

関連資料・記事

参考サイト

2016/10/10更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3にLEDを接続して光らせ、点滅させてみる。

オススメの教本は金丸隆志さんの「カラー図解 最新 Raspberry Piで学ぶ電子工作」。

我々のようなインフラエンジニアにとってはOSのインストールやLinuxの使い方などより電気回路の仕組みやプログラムからの制御といった部分にフォーカスしているのでとても有益である。

また書籍のサポートページが開設されているのも親切で、様々な追加情報が手に入る。

Lピカ

まずは単純にLEDを光らせるだけの、いわゆるLピカ。

ブレッドボードを用意して教本P74に従いRaspberry PiのGPIOポート1ピン(3.3V電源) → 抵抗(330Ω) → LEDのアノード(+) → LEDのカソード(-) → GPIOポート6ピン(GND)の流れになるように結線すれば簡単にLEDが点灯する。

なお、用意したLEDは順電圧1.8〜2.4V、順電流20mA(0.020A)なので必要な抵抗値は以下のオームの法則に従って75〜45Ωとなるが、今回はそれより大きな330Ωを使用している。

電圧(V) = 抵抗(R) * 電流(I)
順電圧1.8Vの場合の必要な抵抗値
R = Vf / If
  = (3.3 - 1.8) / 0.020
  = 1.5 / 0.020
  = 75
順電圧2.4Vの場合の必要な抵抗値
R = Vf / If
  = (3.3 - 2.4) / 0.020
  = 0.9 / 0.020
  = 45

Lチカ

次にこの回路を使ってLチカをやってみる。

電源供給元をRaspberry PiのGPIOポート1ピン(3.3V電源)から22ピン(GPIO 25)に変更し、以下のPythonプログラムを書いて実行すればGPIO 25の状態(HIGHとLOW)が交互に切り替わってLEDが点滅する。

lchika.py
#!/usr/bin/env python

import RPi.GPIO as GPIO
from time import sleep

PIN = 25

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)

try:
    while True:
        GPIO.output(PIN, GPIO.HIGH)
        sleep(0.5)
        GPIO.output(PIN, GPIO.LOW)
        sleep(0.5)

except KeyboardInterrupt:
    pass

GPIO.cleanup(PIN)

Lマリオ

教本だけだと芸がないので点滅のタイミングに変化を持たせて「タラッタッ、タラッタッ」をやってみる。

消灯後のsleepのタイミングを外部ファイルに書いておいてそれを読み込んで一回一回の点滅タイミングを変えるとそれっぽい雰囲気になる(この画像だと分かりにくいが実際にやってみるとなんとなくそれっぽく見える)。

lmario.conf
0.1
0.25
0.25
0.1
0.3
0.6
lmario.py
#!/usr/bin/env python

import RPi.GPIO as GPIO
from time import sleep

PIN = 25

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)

f = open('lmario.conf', 'r')

for line in f:
    interval = float(line.rstrip())

    GPIO.output(PIN, GPIO.HIGH)
    sleep(0.15)
    GPIO.output(PIN, GPIO.LOW)
    sleep(interval)

f.close()

GPIO.cleanup(PIN)

このタイミングを決めるにあたって以下のサイトが参考になったので紹介しておく。シーン毎の楽譜・MIDIファイル・ビデオデモが用意されているので見ていてとても楽しい。

関連資料・記事

参考サイト

2019/10/23更新

対応バージョン: Raspbian Buster - September 2019

2016年、RaspbianがまだJessieだった頃に同じWaveshare Electronicsの3.2インチLCDをRaspberry Pi 3に接続する手順を書いたが、3年経ち久しぶりに使ってみたところ手順が非常に簡単になっていたので改めて記す。

物理的な接続は2016年の時と変わらないので以下の資料に譲る。

関連資料・記事

このLCDをRaspberry Piで使えるようにする手順は同社の製品ページで公開されているので細かい設定などは以下を参照してほしい。

LCDを物理的に接続しただけではOSを起動しても画面が真っ白なままなのは以前と変わらないが、ドライバのインストールと(タッチセンサーの設定を行わず)ひとまずLCDの出力ができればいいのであれば以下を実行するだけでよい。(この設定はHDMIディスプレイを接続するかSSHログインにて行う)

$ git clone https://github.com/waveshare/LCD-show.git
$ cd LCD-show
$ ./LCD32-show

これで必要なパッケージがインストールされ、LCD出力が有効になる。設定ファイルも作成されるので微調整はこのファイルを編集することで行う。

$ ls -l /usr/share/X11/xorg.conf.d
-rw-r--r-- 1 root root 1099  8月 23  2018 10-evdev.conf
-rw-r--r-- 1 root root 1350  6月  5 21:49 10-quirks.conf
-rw-r--r-- 1 root root 1429  3月 31  2019 40-libinput.conf
-rw-r--r-- 1 root root 1099 10月 23 00:39 45-evdev.conf
-rwxr-xr-x 1 root root  358 10月 23 00:42 99-calibration.conf
-rw-r--r-- 1 root root  647 10月 23 00:42 99-fbturbo.conf

尚、元のHDMI出力に戻したい場合は従来通りLCD32-hdmiを実行する。

$ ./LCD32-hdmi

参考サイト

情報

販売

コミュニティ

2016/10/10更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3にWaveshare Electronicsの3.2インチLCDを接続する手順を示す。

 

LCDをRaspberry Piで使えるようにする手順は同社の製品ページで公開されているのでそれに従って作業すれば簡単に接続できる。

物理接続

まずLCDをRaspberry Piに物理的に接続する。

右のようにRaspberry PiのGPIOポートの右端に揃うように接続する。

この時Raspberry Piの電源を切っておくことに注意する。

ドライバ導入

LCDが物理的に接続できたらRaspberry Piを起動するが、この段階ではまだLCDは使用できない(真っ白な状態)なのでHDMI接続したディスプレイを使うかSSH接続により作業する。

前述の製品ページよりドライバファイル(LCD-show-YYMMDD.tar.gz)をダウンロードするが、本記事執筆時点ではLCD-show-160811.tar.gzが最新だったのでここではこれを使用する。

% wget http://www.waveshare.com/w/upload/3/3d/LCD-show-160811.tar.gz
ドライバの設定ファイルが格納されるディレクトリ/usr/share/X11/xorg.conf.dを作成しておき、配布ファイルを展開してLCD-show/LCD32-showを実行するとOSが再起動されLCDに出力されるようになる。

LCD-showディレクトリには同社の別製品用と思われるファイル(インチ違いなど)も格納されているので同様の手順で使用できるものと思われる(未確認)。

% sudo mkdir /usr/share/X11/xorg.conf.d

% tar xvf LCD-show-160811.tar.gz
% rm LCD-show-160811.tar.gz

% cd LCD-show

% ls -1 *show
LCD101-1024x600-show
LCD32-show
LCD35-show
LCD4-800x480-show
LCD4-show
LCD43-show
LCD5-show
LCD7-1024x600-show
LCD7-800x480-show

% sudo ./LCD32-show

今まで通りHDMI出力に戻したい場合はLCD-hdmiを実行する。

% sudo ./LCD-hdmi

関連資料・記事

参考サイト

2019/03/31更新

対応バージョン: Raspbian Stretch Lite - November 2018

Raspberry Pi Zero WHにNTT docomoのUSBモデムL-05Aを繋いでSORACOM SIMを使う設定を示す。

設定についてはあっきぃさんのこの記事をそのまま実行すれば簡単に導入できる。

作業内容は以下の通り。

NetworkManegerインストール
% sudo apt install network-manager
USB_ModeSwitchの設定ファイルをオーバーライド(デフォルトの設定に1行追加したファイルを作成)
% cd /etc/usb_modeswitch.d

% sudo tar zxvf /usr/share/usb_modeswitch/configPack.tar.gz 1004:613a

% sudo vi 1004:613a
# LG L-05A
TargetVendor=0x1004
TargetProduct=0x6124
StandardEject=1
WaitBefore=2 <--- 追加
NetworkManegerで接続を追加

L-05AをUSBコネクタに挿し、しばらく待ってデバイスが認識されてから以下のコマンドで接続を追加する。

% sudo nmcli con add type gsm ifname "*" con-name soracom apn soracom.io user <APNユーザ名> password <APNパスワード>
接続 'soracom' (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) が正常に追加されました。
動作確認

ipコマンドでL-05AにIPアドレスが割り振られていればOKである。

% ip a show ppp0
4: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 3
    link/ppp 
    inet xxx.xxx.xxx.xxx/32 brd xxx.xxx.xxx.xxx scope global ppp0
       valid_lft forever preferred_lft forever

尚、OSのインストールや初期設定は以下を参照のこと。

関連資料・記事

参考サイト

2016/10/10更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3にインストールしたRaspbian Jessie LiteでCaps LockキーをCtrlキーにするには/etc/default/keyboardを以下のように設定してOSを再起動する。
XKBOPTIONS="ctrl:nocaps"

Caps LockキーとCtrlキーを入れ替えたい場合は"ctrl:swapcaps"と指定する。

XKBOPTIONSに設定できる内容は/usr/share/X11/xkb/rules/xorg.lstに記載されているので用途に応じて利用するとよい。

関連資料・記事

参考サイト

2019/10/24更新

対応バージョン: Raspbian Buster - September 2019

Raspbian BusterでIPv6を無効にするには/etc/sysctl.confに以下の行を追加し、sysctlコマンドで反映させるかOSを再起動する。

設定
net.ipv6.conf.all.disable_ipv6 = 1
反映
% sudo sysctl -p

反映後、ip aコマンドで「inet6」行が表示されなければIPv6は無効になっている。

(変更前)

% ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link tentative 
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet xxx.xxx.xxx.xxx/24 brd xxx.xxx.xxx.xxx scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever

(変更後)

% ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:6c:d5:1c brd ff:ff:ff:ff:ff:ff
    inet xxx.xxx.xxx.xxx/24 brd xxx.xxx.xxx.xxx scope global wlan0
       valid_lft forever preferred_lft forever

関連資料・記事

参考サイト

2019/03/31更新

対応バージョン: Raspbian Stretch Lite - November 2018

Raspberry Pi Zero WHにOSをインストールして最低限必要な設定(ローカル環境、Wi-Fi接続、SSHサーバ)を行う手順を示す。

OSはGUI環境を持たないRaspbian Stretch Liteを使用し、GUIに関する設定(フォントやインプットメソッドなど)は行わない。

尚、各種準備作業を行う母艦のOSはUbuntu 18.04とする。

設定(必須)

ロケール設定
タイムゾーン設定
キーボードレイアウト設定
Wi-Fi設定
SSHサーバ有効化
ソフトウェアアップデート

設定(任意)

ホスト名変更
デフォルトアカウントpiのパスワード変更
SSHのパスワードなしログイン設定

インストール

まずOSを書き込むmicroSDカードをFAT32でフォーマットする。ここでは32GBのメディアを使用し、デバイスは/dev/sdeであるものとする。

% umount /dev/sde1

% sudo mkfs.vfat -v -c -F 32 /dev/sde1
mkfs.fat 4.1 (2017-01-24)
/dev/sde1 has 64 heads and 32 sectors per track,
hidden sectors 0x2000;
logical sector size is 512,
using 0xf8 media descriptor, with 60743680 sectors;
drive number 0x80;
filesystem has 2 32-bit FATs and 32 sectors per cluster.
FAT size is 14848 sectors, and provides 1897311 clusters.
There are 32 reserved sectors.
Volume ID is f0eefcfd, no volume label.
Searching for bad blocks 92256... 184672... (略)

% sudo fdisk -l /dev/sde
ディスク /dev/sde: 29 GiB, 31104958464 バイト, 60751872 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x00000000

デバイス   起動 開始位置 最後から   セクタ サイズ Id タイプ
/dev/sde1           8192 60751871 60743680    29G  c W95 FAT32 (LBA)

次にRaspbianのダウンロードサイトからRaspbian Stretch Liteの「Download ZIP」をクリックしてイメージファイルをダウンロードする。

このイメージファイルを解凍してmicroSDカードに書き込む。

% unzip 2018-11-13-raspbian-stretch-lite.zip

% sudo dd if=2018-11-13-raspbian-stretch-lite.img of=/dev/sde bs=1024
1822720+0 レコード入力
1822720+0 レコード出力
1866465280 bytes (1.9 GB, 1.7 GiB) copied, 355.164 s, 5.3 MB/s
このmicroSDカードをRaspberry Pi Zero WHにセットして電源とディスプレイを繋げばRaspbianが起動する。

設定(必須)

ここから実際に設定を行っていくのでデフォルトアカウントのpi(パスワード:raspberry)でログインする。

設定は基本的にraspi-configというメニュー形式のツールで行い、一部はコマンドとエディタを使用する。

% sudo LANG=C raspi-config

ロケール設定

デフォルトで英国(en_GB.UTF-8)に設定されているロケールを日本語(ja_JP.UTF-8)に変更する。

[4 Localisation Options] > [I1 Change Locale]を選択するとロケール選択画面が表示されるのでデフォルトで選択されている[en_GB.UTF-8 UTF-8]のチェックの他に[ja_JP.UTF-8 UTF-8]をチェックして[OK]を押す。

デフォルトロケールを設定する画面が表示されるので[ja_JP.UTF-8]を選択して[OK]を押す。

タイムゾーン設定

タイムゾーンをAsia/Tokyoに設定する。

[4 Localisation Options] > [I2 Change Timezone]を選択すると地域選択画面が表示されるので[Asia]を選択し、次の都市/地域名で[Tokyo]を選択して[OK]を押す。

キーボードレイアウト設定

キーボードレイアウトを日本語キーボードに設定する。

まず[4 Localisation Options] > [I3 Change Keyboard Layout]を選択するとキーボードモデル選択画面が表示される。

一般的な日本語キーボードを使用している場合は[Generic 105-Key (Intel) PC]を選択する。

次のレイアウト選択画面では[Other]を、国選択では[Japanese]を、キーボードレイアウトでは[Japanese]をそれぞれ選択する。

最後にAltGrキーとComposeキーの設定画面が表示されるので必要に応じて設定する。

Wi-Fi設定(国設定)

Wi-Fiは国によって使用できるチャンネルが変わるので日本に設定する。

[4 Localisation Options] > [I4 Change Wi-Fi Country]を選択すると国選択画面が表示されるので[JP Japan]を選択して[OK]を押す。

Wi-Fi設定(接続設定)

[2 Network Options] > [N2 Wi-fi]を選択すると「Please enter SSID」と促されるのでSSIDを入力して[OK]を押す。次に「Please enter passphrase. Leave it empty if none.」と促されるのでパスフレーズを入力して[OK]を押す。パスフレーズがないアクセスポイントの場合は何も入力せず[OK]を押す。

SSHサーバ有効化

外部からSSHによるリモートアクセスができるようにSSHサーバを有効化する。

[5 Interfacing Options] > [P2 SSH]を選択すると「Would you like the SSH server to be enabled?」と聞かれるので[Yes]を選択する。

ここまで設定を終えてraspi-configのトップ画面で[Finish]を押すとログインプロンプトに戻るのでいったんOSを再起動する。

% sudo reboot

ログインプロンプトが出たら設定完了である。

Wi-Fiに接続してDHCPサーバから自動的にIP情報が割り当てられるのでiwconfigとip aコマンドで確認する。

% iwconfig wlan0
wlan0     IEEE 802.11  ESSID:"<ESSID>"  
          Mode:Managed  Frequency:2.462 GHz  Access Point: xx:xx:xx:xx:xx:xx
          Bit Rate=72.2 Mb/s   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on
          Link Quality=70/70  Signal level=-36 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

% ip a
:
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet xxx.xxx.xxx.xxx/xx brd xxx.xxx.xxx.xxx scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 xxxx:xx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global mngtmpaddr noprefixroute dynamic 
       valid_lft 2591860sec preferred_lft 604660sec
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever

ソフトウェアアップデート

ネットワークに接続できるようになったのでソフトウェアアップデートを実施する。

% sudo apt update
% sudo apt upgrade

設定(任意)

必須ではないが必要に応じて以下の設定も行う。

ホスト名変更

ホスト名はデフォルトで「raspberrypi」に設定されているので任意のホスト名に変更する。

% sudo LANG=C raspi-config

[2 Network Options] > [N1 Hostname]を選択すると「Please note: RFCs mandate that a hostname's labels may contain only the ASCII letters 'a' through 'z'...」としてホスト名の付与基準が示されるので[了解]を押す。

続いて「Please enter a hostname」として現在のホスト名が表示されるので任意のホスト名を入力して[了解]を押す。

デフォルトアカウントpiのパスワード変更

piアカウントのパスワードはデフォルトでは「raspberry」に設定されているので任意のパスワードに変更する。

[1 Change User Password]を選択すると「You will now be asked to enter a new password for the pi user」として新しいパスワードが設定できる旨が表示されるので[OK]を押す。

raspi-configの画面から抜けて「Enter new UNIX password:」と表示されるので任意のパスワードを入力する。

ここまで設定を終えてraspi-configのトップ画面で[Finish]を押すとOS再起動を促されるので再起動すれば設定完了である。

SSHのパスワードなしログイン設定

以下を参照して同設定を行う。SSHバージョン1のRSA鍵を作る方法にすればRaspberry Pi(SSHサーバ)側の設定(/etc/sshd/sshd_config)は変更しなくてよい。

関連資料・記事

参考サイト

2016/10/10更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3にOSをインストールして最低限必要な設定(ローカル環境、Wi-Fi接続、SSHサーバ)を行う手順を示す。

OSはGUI環境を持たないRaspbian Jessie Liteを使用し、GUIに関する設定(フォントやインプットメソッドなど)は行わない。

設定(必須)

ロケール設定
タイムゾーン設定
キーボードレイアウト設定
Wi-Fi設定
SSHサーバ有効化
ソフトウェアアップデート

設定(任意)

ホスト名変更
デフォルトアカウントpiのパスワード変更
SSHのパスワードなしログイン設定

インストール

まずOSを書き込むmicroSDカードをFAT32でフォーマットする。ここでは16GBのメディアを使用し、デバイスは/dev/sdeであるものとする。

% umount /dev/sde1
% sudo mkfs.vfat -v -c -F 32 /dev/sde1
% sudo fdisk -l /dev/sde
Disk /dev/sde: 14.9 GiB, 16013852672 bytes, 31277056 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x14c20151

デバイス   起動  Start 最後から セクタ  Size Id タイプ
/dev/sde1         8192   137215  129024   63M  c W95 FAT32 (LBA)
/dev/sde2       137216  7849983 7712768  3.7G 83 Linux

次にRaspbianのダウンロードサイトからRASPBIAN JESSIE LITEの「Download ZIP」をクリックしてイメージファイルをダウンロードする。

このイメージファイルを解凍してmicroSDカードに書き込む。

% unzip 2016-09-23-raspbian-jessie-lite.zip
% sudo dd if=2016-09-23-raspbian-jessie-lite.img of=/dev/sde bs=1024

このmicroSDカードをRaspberry Piにセットして電源とディスプレイを繋げばRaspbianが起動する。

 

設定(必須)

ここから実際に設定を行っていくのでデフォルトアカウントのpi(パスワード:raspberry)でログインする。

設定は基本的にraspi-configというメニュー形式のツールで行い、一部はコマンドとエディタを使用する。

% sudo raspi-config

ロケール設定

デフォルトで英国(en_GB.UTF-8)に設定されているロケールを日本語(ja_JP.UTF-8)に変更する。

[5 Internationalisation Options] > [I1 Change Locale]を選択するとロケール選択画面が表示されるのでデフォルトで選択されている[en_GB.UTF-8 UTF-8]のチェックの他に[ja_JP.UTF-8 UTF-8]をチェックして[OK]を押す。

デフォルトロケールを設定する画面が表示されるので[ja_JP.UTF-8]を選択して[OK]を押す。

タイムゾーン設定

タイムゾーンをAsia/Tokyoに設定する。

[5 Internationalisation Options] > [I2 Change Timezone]を選択すると地域選択画面が表示されるので[Asia]を選択し、次の都市/地域名で[Tokyo]を選択して[OK]を押す。

キーボードレイアウト設定

キーボードレイアウトを日本語キーボードに設定する。

まず[5 Internationalisation Options] > [I3 Change Keyboard Layout]を選択するとキーボードモデル選択画面が表示される。

一般的な日本語キーボードを使用している場合は[Generic 105-Key (Intel) PC]を選択する。

次のレイアウト選択画面では[Other]を、国選択では[Japanese]を、キーボードレイアウトでは[Japanese]をそれぞれ選択する。

最後にAltGrキーとComposeキーの設定画面が表示されるので必要に応じて設定する。

Wi-Fi設定(国設定)

国によってWi-Fiで使用できるチャンネルが変わるので国を日本に設定する。

[5 Internationalisation Options] > [I4 Change Wi-Fi Country]を選択すると国選択画面が表示されるので[JP Japan]を選択して[OK]を押す。

尚、実際の接続設定はCUIで行う必要があるので後述する。

SSHサーバ有効化

外部からSSHによるリモートアクセスができるようにSSHサーバを有効化する。

[9 Advanced Options] > [A4 SSH]を選択すると「Would you like the SSH server to be enabled?」と聞かれるので[Yes]を選択する。

ここまで設定を終えてraspi-configのトップ画面で[Finish]を押すとOS再起動を促されるのでいったん再起動する。

ログインプロンプトが出たら設定完了である。

Wi-Fi設定(接続設定)

先ほど国設定を行ったWi-Fiについて、実際の接続設定を行う。

ここでは認証方式をWPA2、IPアドレスの取得方法をDHCPとして説明する。Wi-Fiアクセスポイント、DHCPサーバはそれぞれ使用可能な状態にあるものとする。

まずWi-Fiのインタフェースが存在することを確認する。wlan0が見えていればOKである。

% sudo iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on

次にこのアクセスポイントに接続する設定を/etc/wpa_supplicant/wpa_supplicant.confに書き込む。

network={}行にESSIDと接続キーをそれぞれ指定し、暗号化方式に「WPA-PSK」を指定する。

% sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="<ESSID>"
	psk="<接続キー>"
	key_mgmt=WPA-PSK
}

尚、ESSIDがANY接続拒否(ステルスモード)になっている場合は「scan_ssid=1」を追記する。

またデフォルトでインタフェースのパワーマネジメントが有効になっている関係で動作が不安定になることがあるので/etc/network/interfacesに「wireless-power off」と記述してパワーマネジメントを無効にしておく。

% sudo vi /etc/network/interfaces
:
allow-hotplug wlan0
iface wlan0 inet manual
    wireless-power off <- 追記
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
:

ここまでできたらOSをいったん再起動すればWi-Fiに接続してDHCPサーバから自動的にIP情報が割り当てられる。

iwconfigとip aコマンドの結果はそれぞれ以下のようになる。

% sudo iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"<ESSID>"  
          Mode:Managed  Frequency:2.462 GHz  Access Point: xx:xx:xx:xx:xx:xx
          Bit Rate=65 Mb/s   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=44/70  Signal level=-66 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:2  Invalid misc:0   Missed beacon:0

% sudo ip a
:
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet xxx.xxx.xxx.xxx/xx brd xxx.xxx.xxx.xxx scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever

ソフトウェアアップデート

ネットワークに接続できるようになったのでソフトウェアアップデートを実施する。

% sudo apt update
% sudo apt upgrade

設定(任意)

必須ではないが必要に応じて以下の設定も行う。

ホスト名変更

ホスト名はデフォルトで「raspberrypi」に設定されているので任意のホスト名に変更する。

% sudo LANG=C raspi-config

[9 Advanced Options] > [A2 Hostname]を選択すると「Please note: RFCs mandate that a hostname's labels may contain only the ASCII letters 'a' through 'z'...」としてホスト名の命名基準が示されるので[了解]を押す。

続いて「Please enter a hostname」として現在のホスト名が表示されるので任意のホスト名を入力して[了解]を押す。

デフォルトアカウントpiのパスワード変更

piアカウントのパスワードはデフォルトでは「raspberry」に設定されているので任意のパスワードに変更する。

[2 Change User Password]を選択すると「You will now be asked to enter a new password for the pi user」として新しいパスワードが設定できる旨が表示されるので[了解]を押す。

raspi-configの画面から抜けて「Enter new UNIX password:」と表示されるので任意のパスワードを入力する。

ここまで設定を終えてraspi-configのトップ画面で[Finish]を押すとOS再起動を促されるので再起動すれば設定完了である。

SSHのパスワードなしログイン設定

以下を参照して同設定を行う。SSHバージョン1のRSA鍵を作る方法にすればRaspberry Pi(サーバ)側の設定(/etc/sshd/sshd_config)は変更しなくてよい。

関連資料・記事

参考サイト

2016/11/05更新

対応バージョン: Raspbian Jessie Lite - September 2016

vcgencmdコマンドを使うとCPUの温度や動作電圧などRaspberry Piの動作状況を調べることができる。

また通常のPCにおけるUEFI(BIOS)で指定する各種設定もvcgencmdコマンドで取得できる(Raspberry PiにはUEFI(BIOS)の機構がないので/boot/config.txtで指定する)。

以下、代表的な使用例を記す。

Raspberry Piの動作状況

ファームウェアのバージョン
% vcgencmd version
Sep 21 2016 13:13:29
Copyright (c) 2012 Broadcom
version 2eaf52cc53435b5ce67253af1487f9a4f9f96e2d (clean) (release)
CPUの温度
% vcgencmd measure_temp
temp=48.9'C
CPUの動作周波数
% vcgencmd measure_clock arm
frequency(45)=600000000
CPUの動作電圧
% vcgencmd measure_volts
volt=1.2000V
メモリ割当

Raspberry Pi 3 Model Bは1GBメモリをCPU(arm)とGPUで共用

% vcgencmd get_mem arm
arm=944M

% vcgencmd get_mem gpu
gpu=64M
フレームバッファ情報(height, width, depth)
% vcgencmd get_lcd_info
640 480 24

その他、利用可能なサブコマンドはvcgencmd commandsで確認できる。情報取得だけでなく設定のサブコマンドもあるので注意して使用すること。

% vcgencmd commands
commands="vcos, ap_output_control, ap_output_post_processing,
vchi_test_init, vchi_test_exit, pm_set_policy, pm_get_status,
pm_show_stats, pm_start_logging, pm_stop_logging, version,
commands, set_vll_dir, set_backlight, set_logging, get_lcd_info,
arbiter, cache_flush, otp_dump, test_result, codec_enabled,
get_camera, get_mem, measure_clock, measure_volts, scaling_kernel,
scaling_sharpness, get_hvs_asserts, get_throttled, measure_temp,
get_config, hdmi_ntsc_freqs, hdmi_adjust_clock, hdmi_status_show,
hvs_update_fields, pwm_speedup, force_audio, hdmi_stream_channels,
hdmi_channel_map, display_power, read_ring_osc, memtest,
dispmanx_list, get_rsts, schmoo, render_bar, disk_notify,
inuse_notify, sus_suspend, sus_status, sus_is_enabled,
sus_stop_test_thread, egl_platform_switch, mem_validate, mem_oom,
mem_reloc_stats, hdmi_cvt, hdmi_timings, file, vctest_memmap,
vctest_start, vctest_stop, vctest_set, vctest_get"

/boot/config.txtで指定する設定

OS起動時にconfig.txtで指定する設定はvcgencmdコマンドのget_configカテゴリに続けてパラメータの種類を指定することで取得できる。

vcgencmd get_config [config|int|str]

configに実際のパラメータを指定するとその設定の値が表示される。例えばarm_freqを指定するとCPU(arm)のクロックが1.2GHzであることが分かる。

% vcgencmd get_config arm_freq
arm_freq=1200

intあるいはstrを指定すると整数(int)あるいは文字列(str)で設定されている設定値が一覧で表示される(設定済のもののみ表示)。

% vcgencmd get_config int
arm_freq=1200
audio_pwm_mode=1
config_hdmi_boost=5
core_freq=250
desired_osc_freq=0x36ee80
disable_commandline_tags=2
disable_l2cache=1
enable_uart=1
force_eeprom_read=1
force_pwm_open=1
framebuffer_ignore_alpha=1
framebuffer_swap=1
gpu_freq=300
hdmi_force_cec_address=65535
hdmi_force_hotplug=1
init_uart_clock=0x2dc6c00
lcd_framerate=60
mask_gpu_interrupt1=0x10000
over_voltage_avs=0x10c8e
pause_burst_frames=1
program_serial_random=1
sdram_freq=450
temp_limit=85

% vcgencmd get_config str
device_tree=-

config.txtで指定可能なパラメータは公式ドキュメント(英語)を参照のこと。

関連資料・記事

参考サイト