ハードウェアエンジニアの備忘録

電子工学(半導体物性)→応用光学・半導体プロセス→アナログ回路→C/C++→C#/.NETと低レイヤーから順調に(?)キャリアを登ってきているハードウェアエンジニアの備忘録。ブログ開始時点でiOSやサーバーサイドはほぼ素人です。IoTがマイブーム。

motion-mmalをストリーミングで見るときにパスワード認証をかける

今はまだローカルでRaspberry Piが閉じている環境なので、セキュリティに関してシビアではないが、いずれ外部ネットワークからも観れるようにする予定である。

それに備え、motion-mmalcam-both.confを書き換えてID認証を導入する。

①motion-mmalcam-both.confの書き換え

$ cd /opt/motion-mmal/
$
sudo vi motion-mmalcam-both.conf

ファイルを開いたら下記箇所を変更する。viで/stream_authと打つとすぐ見つかる。

stream_auth_method 1
stream_authentication newid:newpassword

これで、次回からストリーミング配信を見ようとすると、ID認証を求められるようになる。

f:id:tosh419:20160417202644p:plain

iPhone側の実装も変更

ほぼここのコピペだが、、、FirstViewControler.swiftを変更する。

import UIKit

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        // loadCamView()
        loadCamViewWithAuth()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBOutlet weak var MonitorWebView: UIWebView!
    
    func loadCamView(){
        var url: String = "http://192.168.10.102:8081/?action=snapshot"
        let requestURL = NSURL(string: url)
        let req = NSURLRequest(URL: requestURL!)
        
        MonitorWebView.loadRequest(req)
    }
    
    func loadCamViewWithAuth(){
        var url_with_basic_auth = "http://192.168.10.102:8081/?action=snapshot"
        var url = NSURL(string: url_with_basic_auth)
        var req = NSMutableURLRequest(URL: url!)
        
        var username = "newid"
        var password = "newpassword"
        var authStr = "\(username):\(password)"
        var data = authStr.dataUsingEncoding(NSUTF8StringEncoding)
        
        var authData = data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions())
        var authValue = "Basic \(authData)"
        
        req.setValue(authValue, forHTTPHeaderField: "Authorization")
        
        MonitorWebView.loadRequest(req)
    }
    
    @IBOutlet weak var ReloadWebView: UIButton!
    
    @IBAction func ReloadWebView_pressed(sender: UIButton) {
        // loadCamView()
        loadCamViewWithAuth()
    }    
}

 loadCamViewWithAuth関数を追加し、そちらに実装を書いた。NSDataBase64EncodingOptions.allZerosは現在のSwiftのバージョンではなくなったようだ。かわりにNSDataBase64EncodingOptions.allZeros()としておいて問題なかった。

 

しかし、C#C++などの古い言語しか触ってない人からみると、Swiftなどの新しい言語の仕様はすごく変化が早い。開発者は大変だな。

Raspberry Pi 3でGoogle Cloud Visionを使う

Googleの画像認識エンジンである、Cloud VisionをRaspberry Pi 3で使ってみたので、その備忘録。参考にしたのは、以下。

①Node.jsをRaspberry Pi 3に導入する

まずはnvm(Node Version Manager)の導入。

$ git clone https://github.com/creationix/nvm.git ~/.nvm

 次にパスを通す

$ source ~/.nvm/nvm.sh

 これでnvmコマンドが使えるようになったので、Node.js公式を見て、最新バージョンのNode.jsをインストールする。最新バージョンの確認は下記nvm ls-remoteコマンドでもわかる。

$ nvm ls-remote
$ nvm install v5.10.1

次にNode.jsの使用バージョンのデフォルト設定を行う。

$ nvm alias default v5.10.1

バージョンを確認してみる。

$ node -v
v5.10.1

 動いていそうだ。

.bash_profileにNode.js周りの設定を書いておく。

$ vi .bash_profile

ここを参考にした。

# nvm設定
[[ -s ~/.nvm/nvm.sh ]] && . ~/.nvm/nvm.sh
nvm use default
npm_dir=${NVM_PATH}_modules
export NODE_PATH=$npm_dir

 次に以下コマンドを打ち設定を反映させる。

$ source ~/.bash_profile

これでNode.jsの準備は完了。

Google Cloud Visionの設定

https://cloud.google.com/vision/にアクセスして、登録をすませる。

f:id:tosh419:20160417060030p:plain

左上のハンバーガーメニューから、API Managerを選択し、新しい認証情報→APIキー

f:id:tosh419:20160417060209p:plain

その後サーバーキーを選択して、作成。

そうそう、無料試用期間とはいえ、万が一が恐いので、請求のアラート設定をしておく。例えば、APIキーが漏れてしまった時などでも、被害を最小限にとどめられる。お支払い→予算とアラート→予算を作成から適当な金額を設定する。AWS破産とか冗談にならないからね。

f:id:tosh419:20160417060445p:plain

③node-cloud-vision-apiをRaspberry Pi 3に導入する

適当なディレクトリに移動し、フォルダを作る

$ cd home/pi/projects/
$
mkdir cloudvision

npm initして、node-cloud-vision-apiをインストールする

$ npm init
$
npm install --save node-cloud-vision-api

JavaScriptを実行してみる

'use strict'
const vision = require('node-cloud-vision-api')

// init with auth
// Your API Keyのところを②で取得したAPIキーに変える。
// これは公開すると他人に使われる恐れがあるので公開しないように!!
vision.init({auth: 'Your API Key'})

// construct parameters
const req1 = new vision.Request({
// ローカルにあるイメージを指定。
image: new vision.Image('/home/pi/Pictures/summerfruits.jpg'),
features: [
new vision.Feature('FACE_DETECTION', 4),
new vision.Feature('LABEL_DETECTION', 10),
]
})

// 2nd image of request is load from Web
const req2 = new vision.Request({
image: new vision.Image({
// インターネット上のイメージを指定。
url: 'https://scontent-nrt1-1.cdninstagram.com/hphotos-xap1/t51.2885-15/e35/12353236_1220803437936662_68557852_n.jpg'
}),
features: [
new vision.Feature('FACE_DETECTION', 1),
new vision.Feature('LABEL_DETECTION', 10),
]
})

// send multi requests by one API call
vision.annotate([req1, req2]).then((res) => {
// handling response for each request
console.log(JSON.stringify(res.responses))
}, (e) => {
console.log('Error: ', e)
})

上記コードをcloudvision_samplecode.jsとして保存する。

$ node cloudvision_samplecode.js

 として実行すると、下記がターミナルに出力される。(見やすくするためにインデントをつけている)

{
"labelAnnotations":
[
{
"mid":"/m/036qh8",
"description":"produce",
"score":0.97685134
},
{
"mid":"/m/02wbm",
"description":"food",
"score":0.94573361
},
{
"mid":"/m/05s2s",
"description":"plant",
"score":0.94254869
},
{
"mid":"/m/02xwb",
"description":"fruit",
"score":0.90469909
},
{
"mid":"/m/0dxb5",
"description":"berry",
"score":0.88049006
},
{
"mid":"/m/0gqbt",
"description":"shrub",
"score":0.53203881
},
{
"mid":"/m/0463nlw",
"description":"west indian raspberry",
"score":0.50897217
}
]
},

{
"faceAnnotations":
[
{
"boundingPoly":
{
"vertices":
[
{"x":112},
{"x":724},
{"x":724,"y":510},
{"x":112,"y":510}
]
},
"fdBoundingPoly":
{
"vertices":
[
{"x":193},
{"x":638},
{"x":638,"y":399},
{"x":193,"y":399}
]
},
"landmarks":
[
{
"type":"LEFT_EYE",
"position":{"x":342.14697,"y":77.257805,"z":0.0010066124}
},
{
"type":"RIGHT_EYE",
"position":{"x":524.90961,"y":100.77812,"z":0.84962881}
},
{
"type":"LEFT_OF_LEFT_EYEBROW",
"position":{"x":285.53159,"y":30.352997,"z":25.532389}
},
{
"type":"RIGHT_OF_LEFT_EYEBROW",
"position":{"x":395.71207,"y":32.727783,"z":-25.809153}
},
{
"type":"LEFT_OF_RIGHT_EYEBROW",
"position":{"x":484.55322,"y":44.141739,"z":-25.38883}
},
{
"type":"RIGHT_OF_RIGHT_EYEBROW",
"position":{"x":591.29803,"y":69.55114,"z":26.930927}
},
{
"type":"MIDPOINT_BETWEEN_EYES",
"position":{"x":434.99573,"y":73.941544,"z":-36.170986}
},
{
"type":"NOSE_TIP",
"position":{"x":423.93985,"y":167.91109,"z":-111.36714}
},
{
"type":"UPPER_LIP",
"position":{"x":411.80557,"y":241.09036,"z":-82.791382}
},
{
"type":"LOWER_LIP",
"position":{"x":405.9841,"y":306.68048,"z":-82.744064}
},
{
"type":"MOUTH_LEFT",
"position":{"x":337.35049,"y":267.53821,"z":-39.726524}
},
{
"type":"MOUTH_RIGHT",
"position":{"x":487.37915,"y":290.97012,"z":-37.928776}
},
{
"type":"MOUTH_CENTER",
"position":{"x":410.22937,"y":273.30365,"z":-75.321}
},
{
"type":"NOSE_BOTTOM_RIGHT",
"position":{"x":471.14438,"y":202.10455,"z":-44.104683}
},
{
"type":"NOSE_BOTTOM_LEFT",
"position":{"x":371.49542,"y":186.17801,"z":-44.648823}
},
{
"type":"NOSE_BOTTOM_CENTER",
"position":{"x":419.42804,"y":201.44179,"z":-75.345909}
},
{
"type":"LEFT_EYE_TOP_BOUNDARY",
"position":{"x":343.91556,"y":62.291443,"z":-9.4704609}
},
{
"type":"LEFT_EYE_RIGHT_CORNER",
"position":{"x":378.49484,"y":83.426445,"z":0.63221854}
},
{
"type":"LEFT_EYE_BOTTOM_BOUNDARY",
"position":{"x":340.5495,"y":88.847572,"z":-4.0131183}
},
{
"type":"LEFT_EYE_LEFT_CORNER",
"position":{"x":304.99127,"y":76.559814,"z":16.381186}
},
{
"type":"LEFT_EYE_PUPIL",
"position":{"x":339.22885,"y":75.820984,"z":-4.330039}
},
{
"type":"RIGHT_EYE_TOP_BOUNDARY",
"position":{"x":526.98669,"y":85.809883,"z":-8.6181784}
},
{
"type":"RIGHT_EYE_RIGHT_CORNER",
"position":{"x":560.83966,"y":109.43663,"z":17.566591}
},
{
"type":"RIGHT_EYE_BOTTOM_BOUNDARY",
"position":{"x":523.4292,"y":112.47009,"z":-3.1689837}
},
{
"type":"RIGHT_EYE_LEFT_CORNER",
"position":{"x":485.92252,"y":100.39104,"z":0.7664215}
},
{
"type":"RIGHT_EYE_PUPIL",
"position":{"x":527.13208,"y":100.01988,"z":-3.736815}
},
{
"type":"LEFT_EYEBROW_UPPER_MIDPOINT",
"position":{"x":343.1142,"y":7.1320877,"z":-7.4442763}
},
{
"type":"RIGHT_EYEBROW_UPPER_MIDPOINT",
"position":{"x":541.75824,"y":32.65345,"z":-6.5013323}
},
{
"type":"LEFT_EAR_TRAGION",
"position":{"x":207.46692,"y":196.30023,"z":203.98279}
},
{
"type":"RIGHT_EAR_TRAGION",
"position":{"x":623.50317,"y":249.52588,"z":205.91609}
},
{
"type":"FOREHEAD_GLABELLA",
"position":{"x":440.61343,"y":34.804077,"z":-31.940067}
},
{
"type":"CHIN_GNATHION",
"position":{"x":395.04126,"y":391.9465,"z":-74.228394}
},
{
"type":"CHIN_LEFT_GONION",
"position":{"x":215.1674,"y":298.48297,"z":105.92882}
},
{
"type":"CHIN_RIGHT_GONION",
"position":{"x":590.98389,"y":346.83713,"z":107.62403}
}
],
"rollAngle":7.2499251,
"panAngle":0.27318951,
"tiltAngle":11.967749,
"detectionConfidence":0.577574,
"landmarkingConfidence":0.19900249,
"joyLikelihood":"POSSIBLE",
"sorrowLikelihood":"VERY_UNLIKELY",
"angerLikelihood":"VERY_UNLIKELY",
"surpriseLikelihood":"VERY_UNLIKELY",
"underExposedLikelihood":"VERY_UNLIKELY",
"blurredLikelihood":"VERY_UNLIKELY",
"headwearLikelihood":"VERY_UNLIKELY"}],
"labelAnnotations":
[
{"mid":"/m/01k74n","description":"facial expression","score":0.86115927},
{"mid":"/m/068hy","description":"pet","score":0.80557323},
{"mid":"/m/017ftj","description":"sunglasses","score":0.72584444},
{"mid":"/m/0sgh53y","description":"selfie","score":0.71132851}
]
}
]

 

画像の一枚目は下のフルーツの画像で、

f:id:tosh419:20160417211241j:plain

   {
  "mid":"/m/036qh8",
"description":"produce",
"score":0.97685134
},
{
"mid":"/m/02wbm",
"description":"food",
"score":0.94573361
},
{
"mid":"/m/05s2s",
"description":"plant",
"score":0.94254869
},
{
"mid":"/m/02xwb",
"description":"fruit",
"score":0.90469909
},
{
"mid":"/m/0dxb5",
"description":"berry",
"score":0.88049006
},
{
"mid":"/m/0gqbt",
"description":"shrub",
"score":0.53203881
},
{
"mid":"/m/0463nlw",
"description":"west indian raspberry",
"score":0.50897217

とあるので、大体は合っていそう。

 

画像の2枚目はTaylor Swiftである。

f:id:tosh419:20160417211328j:plain

        "joyLikelihood":"POSSIBLE",
"sorrowLikelihood":"VERY_UNLIKELY",
"angerLikelihood":"VERY_UNLIKELY",
"surpriseLikelihood":"VERY_UNLIKELY",
"underExposedLikelihood":"VERY_UNLIKELY",
"blurredLikelihood":"VERY_UNLIKELY",
"headwearLikelihood":"VERY_UNLIKELY"}],
"labelAnnotations":
[
{"mid":"/m/01k74n","description":"facial expression","score":0.86115927},
{"mid":"/m/068hy","description":"pet","score":0.80557323},
{"mid":"/m/017ftj","description":"sunglasses","score":0.72584444},
{"mid":"/m/0sgh53y","description":"selfie","score":0.71132851}
]

sorrow,anger,などがunlikelyなのであっている。サングラスや自撮りであることも認識していそうである。

 

結構面白い。月に1000回ぐらいしか無料のAPIコール枠はないのでやりすぎないように注意。

Xcodeで自作アプリを無料で実機に入れる方法

今更新しい情報ではないが、あとで忘れそうなので、自分用にメモ。参考にしたのは以下。

iPhoneアプリ開発では、Developers登録をしていないと実機に自作アプリを入れる事は出来なかったが、XCode7からはDevelopers登録をしていなくても大丈夫になった。

 

f:id:tosh419:20160417044743p:plain

やりかたは、上の写真のようにiPhoneを接続し、ビルド先のオプションで実機を選択するだけ。

 

署名できないエラーで、Fix Issueの画面が出てきたが、メインで使っているApple IDはなぜか使えず。そこで、Developer用に新たにアカウントを取り直したらいけた。

 

また、最初、XCodeのバージョンが古く、iOS9.3.1に対応していなかったためビルドは成功したものの、実機へのインストールのところでこけた。XCodeのバージョンを7.3にアップデートすることでこの問題は解決。

 

トラブったのはこの辺り。あと、変なライトニングケーブルを使っているとiPhoneが認識されなかったりして余計な時間を取られる。純正を使おう。

Raspberry Pi Jessie(8.0)を使っていて、libavformat.so.53がないと怒られる問題の対策

Raspberry Pi 3を使って監視カメラを作ろうと頑張っていたときにライブラリのインストールで問題があり時間を取られたのでメモ。この問題に関して、日本語の情報は見つからないし、英語の情報も結構探すのに時間が掛かった。

motion-mmalのセットアップ

を参考に、Raspberry Pi 3 (Raspbian Jessie)にmotion-mmalを使えるように準備していた。ちなみに、Raspberry Piの標準カメラモジュールを使うのにはmotionではなく、有志が開発したmotion-mmalを使う必要がある。もしUSBポートに刺すカメラを使う場合はmotionで構わないようだ。

 

$ cd /opt/motion-mmal/
$ sudo ./motion -n -c motion-mmalcam.conf
./motion: error while loading shared libraries: libavformat.so.53: cannot open shared object file: No such file or directory

 

 上のリンク先を参考に各種パッケージもインストールし、いざ起動しようとすると、上のエラーで止まった。libavformat.so.53がないようだ。

ちょこっと調べてみると、RaspbianのOSバージョンが、8.0(Jessie)以降で出る不具合らしく、7.0(Wheezy)に戻せば問題ないらしい。ちなみに、自分のRaspberry PiにどのバージョンのOSがインストールされているかは以下のコマンドで確認できる。

$ cat /etc/debian_version

 さて、OSをロールバックすれば良いらしいのだが、色々環境を設定してしまったし、面倒くさい。なんとか、ロールバックせずにこの問題を解決する方法を探してみた。

 

参考にしたのは以下リンク。

何でも、lowflyerという人が、修正してくれたらしい。

$ sudo apt-get install -y libjpeg-dev libavformat56 libavformat-dev 
 libavcodec56 libavcodec-dev libavutil54 libavutil-dev libc6-dev
 zlib1g-dev libmysqlclient18 libmysqlclient-dev libpq5 libpq-dev
$ wget https://www.dropbox.com/s/6ruqgv1h65zufr6/motion-mmal-lowflyerUK-20151114.tar.gz
$ tar -zxvf motion-mmal-lowflyerUK-20151114.tar.gz
$ ./motion -c motion-mmalcam-both.conf

これで自分の場合は動いた。

 

$ ifconfig

 

 でRaspberry Pi 3のIPアドレスを確認し、MacBook AiriPhoneSafariのURL欄に

192.168.10.102:8081

などと入れると、

 

f:id:tosh419:20160412024736p:plain

このようにストリーミングで確認できる。ストリーミングを中止する場合はターミナルからCtrl + Cで終われば良い。

 

コマ速や解像度、写真を保存するディレクトリなどはmotion-mmalcam-both.confを編集すれば良い。

 

参考

あと、motion-mmalcam-both.confがデフォルトのmotion-mmalcam.confと何が違うのかをDIFFを使ってリストアップしてみた。

 

デフォルト(motion-mmalcam.conf) -> lowflyer版(motion-mmalcam-both.conf)

  1. logfile /home/pi/motion.log  ->  #logfile /run/shm/motion.log (コメントアウト)
  2. log_level 5  ->  log_level 7
  3. width 1024  ->  width 640
  4. height 576  ->  height 480
  5. framerate 2  ->  framerate 4
  6. #mmalcam_control_params  ->  mmalcam_control_params --exposure night (アンコメントアウト)
  7. mmalcam_secondary_buffer_upscale 4 (追加)
  8. mmalcam_secondary_buffer_jpeg    50 (追加)
  9. lightswitch 0  ->  lightswitch 25
  10. minimum_motion_frames 1  ->  minimum_motion_frames 5
  11. pre_capture 0  ->  pre_capture 4
  12. post_capture 0  ->  post_capture 4
  13. event_gap 60  ->  event_gap 10
  14. output_pictures on  ->  output_pictures best
  15. output_secondary_pictures on (追加)
  16. output_both_pictures on (追加)
  17. quality 75  ->  quality 80
  18. ffmpeg_output_secondary_movies off (追加)
  19. ffmpeg_variable_bitrate 0  ->  ffmpeg_variable_bitrate 10
  20. ffmpeg_deinterlace off  ->  (削除)
  21. extpipe_secondary on (追加)
  22.  extpipe mencoder -demuxer rawvideo -rawvideo w=1280:h=960:i420 -ovc x264 -x264encopts bframes=4:frameref=1:subq=1:scenecut=-1:nob_adapt:threads=1:keyint=1000:8x8dct:vbv_bufsize=4000:crf=24:partitions=i8x8,i4x4:vbv_maxrate=800:no-chroma-me -of   avi -o %f.avi - -fps %fps (アンコメントアウト&変更)
  23. snapshot_interval 0  ->  snapshot_interval 10
  24. locate_motion_style box  ->  locate_motion_style redbox
  25. text_changes off  ->  text_changes on
  26. text_double on  ->  text_double off
  27. exif_text "Test exif" (アンコメントアウト&変更)
  28. target_dir /home/pi  ->  target_dir /run/shm
  29. snapshot_filename %v-%Y%m%d%H%M%S-snapshot  ->  snapshot_filename lastsnap
  30. picture_filename %v-%Y%m%d%H%M%S-%q  ->  picture_filename preview
  31. movie_filename %v-%Y%m%d%H%M%S  ->  movie_filename %Y%m%d%H%M%S
  32. stream_secondary off (追加)
  33. stream_maxrate 1  ->  stream_maxrate 4
  34. webcontrol_localhost on  ->  webcontrol_localhost off

1.は普通にログファイルを残さないようにするという意味だろう。

2はログメッセージのレベル設定。ERR:Error, WRN:Warning, ALL:Allとかかな?5のWRNから7のINFに変更されている。

3、4は画像の解像度。

5はフレームレート。

6は露出の設定が変更されているようだ。

7の設定を0以外にすることで、secondary bufferが有効になるとのこと。secondary bufferが何かというと、ストリーミングなどで動かしているときに写真を撮るときにupscaleして保存してくれる仕組みらしい。要するにprimary imageは上記3、4の解像度で動き例えば動体検知などに使われる。動体検知をトリガとして、いざ画像を保存するときには上記3、4で決めた解像度をupscaleして(この場合、width: 640*4=2560, height: 480*4=1920)高精細な画像を撮れるということだ(多分)。

8はsecondary bufferにエンコードするときのクオリティ設定。

9は撮像エリアの何%の光量が変わったときに無視するかという設定。

10は最小の動画フレーム設定。

11は動画検知が行われる前にバッファとして持っておくフレーム数の設定。

12は動画検知が行われなかったときに過去のフレームを何フレームまで持っておくかという設定。

13は動画の保存間隔設定。60で1分おきのタイムラプスが撮れる。0にするとリアルタイム動画になる。

14はファイルを保存するタイミング設定。onで動体検知時の写真保存。

15は7の設定のところで触れたsecondary bufferを使った高精細画像を出力するかという設定。

16をオンにするとsecondary bufferの高精細画像とprimary bufferの標準画像が共に出力される。

17はjpegの圧縮率。

18をオンにするとsecondary bufferを使った動画作成をffmpegを使い行う。

19はffmpegエンコード時の動画ビットレート設定。

20はインターレースに関わるffmpegの設定。必要ないので削除されている。

21はビデオエンコーディングに関わる設定に見えるが、詳しいコメントが書いてないので不明。22も同様。

23はスナップショットの間隔設定。

24は動体検知時のボックス表示を変更するオプション。

25は変化した画素の数?を表示するかの設定かな?

26は25を2回表示するかの設定?

27はEXIFにコメントを何と入れるかの設定。

28は保存するディレクトリ。

29はスナップショットのファイルネームの設定。

30は写真のファイルネームの設定。

31は動画のファイルネームの設定。

32はseconfary bufferをストリームの画像として使うかの設定。

33はストリームの最大レート設定。

34はコントロールコネクションをlocalhostに限定するかの設定。

 

うーん、confをlowflyer氏のバージョンに変更することで改善しそうな点は見当たらないな…。ソースそのものが変わっているのだろう。

 

そのうちmotion-mmalcam.confの解読もしっかりやろう。 

Raspberry Pi 3を買ってからやった事の備忘録①

f:id:tosh419:20160327220056j:plain

Raspberry Pi 3(ラズパイ3)を購入した。eBayで6000円弱。1週間ほどで到着した。

HDMIで外付けのモニタに写すのも、キーボードやマウスをいちいちラズパイ3に刺して使うのも面倒なので、MacBook Airからリモートで操作する事を考える。

参考にしたのはこの辺りのサイト。というかほぼ一緒。

Raspberry Pi開封から無線LAN経由でSSH接続して初期設定するまでのマイ・ウェイ(モニタ・キーボード無し) - Qiita

まず準備するものだが、

  • Raspberry Pi 3本体
  • microSDカード
  • microSDカードリーダー
  • USB⇔有線LANケーブル
  • LANケーブル

microSDカードはRaspberry Pi 3にOSをインストールするのに不可欠。相性問題もあるようだが、今回はあまり調べずに東芝製の64Gのものを使った。USB⇔有線LANケーブルはMacBook AirにLANポートが付いていないため購入した。有線LANケーブルでPCとラズパイ3を繋げれば方式はLightningケーブルでも問題ない。

 

①Raspberry Pi専用OSのRaspbianイメージを書き込む

Raspbianのダウンロードにはそれなりの時間がかかるので、先にダウンロードしておく。リンク先からRASPBIAN→Download ZIPを選べば良い。

MacBook Airの準備としては、microSDを差し込み端末を立ちあげる。

$ diskutil list

とすると、disk一覧が取得できるので、microSDがどのdiskになっているかを把握しておく。

$ diskutil unmountDisk /dev/disk2

でdiskをアンマウントする。自分の場合、disk2がmicroSDだったが、環境によってこれは異なる。external,64GBなどとなっているものを探せば良い(自分のmicroSDは64GBだったため)

ダウンロードしたRaspbianのイメージファイルをmicroSDに書き込む。

$ sudo dd bs=1m if=2016-03-18-raspbian-jessie.img of=/dev/disk2

ダウンロードディレクトリに移動し上記コマンドを打つ。of=以降にはイメージを書き込むパスを指定している。間違えないように注意!

****+0 records in
****+0 records out
********** bytes transferred in ****.****** secs (******* bytes/sec)

書き込みが始まると、書き込みが終了するまで端末は応答しなくなる。環境にもよるが1時間程度見ておく必要がある。途中経過を見たい場合、Ctrl + Tを押すと上記のような画面になり進捗が見える。records inの前の数字が4000程度になると書き込みは終了する。

②Raspberry Pi 3にSSHでログインする

microSDをいよいよRaspberry Pi 3に差し込み、microUSBの電源供給を始める。電源供給がされていると、赤いLEDが点灯する。緑色のLEDが時々点滅していれば、Raspbianは動いていると考えて良い。

さて、次にUSB⇔有線LANケーブルを用いて、Raspberry Pi 3とMacBook Airを接続する。MacBook Airの環境設定を開き、共有を開く。

f:id:tosh419:20160327225346p:plain

Raspberry Pi 3を接続しているUSBのハードウェアが見えるので、それを選択し、インターネット共有を有効にする。この場合、AX88179...がそれにあたる。

$ arp -a
$ (192.168.2.2) at b8:27:eb:ce:07:75 on bridge100 ifscope [bridge]

 

arp -aと打つと、インターネット共有したRaspberry Pi 3が見える。どのIPかは共有をオンオフし消えたものを選択すれば良い。

いよいよ、ここまでくれば、sshでRaspberry Pi 3にログインする事が可能になる。

$ ssh pi@192.168.2.2

と打ち、ログインする。初期設定ではユーザ名pi、パスワードはraspberryだ。

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~ $

 

 

ここまでがMacBook AirでRaspberry Pi 3にSSH接続するまでの手順になる。この続きはまた次回。