Arduino と Raspberry Pi の違い - 移植編

# はじめに

自分の Project で Arduino で実装していた機能を Raspberry Pi3 Model Bへ移植する過程をまとめていくメモである。これまでいろいろな Project を Arduino で実装していたが、次第にInternet への接続、Data の保存、GUI、画像処理などの新規の要件が出てきたため、Raspberry Pi3 へ変更することにした。これらの新規要件は Arduino でも実現できるものもあるが、Raspberry Pi3 の方が実装が容易で、拡張しやくかつ高性能であろうと判断した。

大きな流れとして、Arduino で実装していた機能を移植する部分[MUST]と、それ以上の新規の拡張を Raspberry Pi3 に実装する部分[WANT]および[NEW]に分けて記載する。

# 想定読者
- 開発中と将来の自分 ➡　効率的に進められるように、また修理などにに困らないようにメモ
- Raspberry Pi に興味がある人 ➡ 後半の準備のところなど一般的な情報をまとめています。

# 必須の機能 [MUST]
下記は、Arduino で動作していた機能であり、これらは最低限できないと困るものである。
Arduino でやっていたことをまずは Raspberry Pi でできるようにする。これらの機能の集合により、全体として動作しているが、何が動いているかは本質ではないので省略する。

|機能|Arduino|Raspberry Pi3|
|:---:|:---:|:----:|
|スイッチの制御 (手で押すスイッチの代替)|フォトカプラ | [別記事へ](https://qiita.com/KZ2/items/6280dfed0570bc06a520) | 
|モータOn/Off制御 | リレー| [別記事へ](https://qiita.com/KZ2/items/7a7a8c3c7074d511e843)| 
|Push Switch のOff/Off検出| Hi/Low検出 | [別記事へ](https://qiita.com/KZ2/items/91beaab44fdc4758f7b8)| 
|ステータス表示| OLED (u8g2 library)| [HDMI - GUI編 *1 (別記事へ)](https://qiita.com/KZ2/items/2a3befb27336020ae8b2) | 
|自動起動| 自動 *2| [別記事へ](https://qiita.com/KZ2/items/5e0e79f84e4dd26bd373#%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95) | 

*1 : ステータスの表示に使っていた小型OLEDの代替である。Raspberry Piでは、HDMI 出力でテレビなどに接続できるので GUI を作る。

*2 : Arduinoでは、setup(), loop() と実行されるので何もしなくてよい。一方、Raspberry Pi では、プログラムを自動で動作するようにトリガをかけないと Arduino みたいに運用できない。

**統合テスト**
これらの最低限の機能がシステムとして動作することを確認した。(Apr 23, 2018) 　よって、WANTの機能へ進むことにする。

# 欲しい機能 [WANT]
これまで実装していた Arduino と同様の使い勝手を実現するために必要な機能だが、GUI でもいい気がするので優先度を下げる。まずは Raspberry Pi へ移植してシステムとして使えるようにすることを優先する。

|機能|Arduino|Raspberry Pi3|
|:---:|:---:|:----:|
| Shutdown |電源を落とすだけ | [ Shutdown switch (別記事へ)](https://qiita.com/KZ2/items/a142ba1126f224d23283)|
| Boot |電源を入れるだけ | [Boot switch (別記事へ)](https://qiita.com/KZ2/items/a142ba1126f224d23283) |
| ステータス表示 *1 | OLED | [OLED (別記事へ)](https://qiita.com/KZ2/items/ebfcb90406d1a4ba539f) |
| パラメータ調整 *2 | Rotary Encoder [済み]| UIで数値設定 (別記事へ)|

Arduinoの個別記事は今は省略する。

*1 : ステータス表示
- Raspberry Pi3
 + 接続動作Ok.
 + GUIでなくてもconsole表示でもいい気がしてきた...が、HDMI displayがなくても、あるいは見なくても status が分かるのはよいので実装した。

*2 : パラメータ調整
Arduino では、Rotary Encoder の取りこぼしが発生し、うまく動かすのに実装に手間取った。一方、Raspberry Pi3 では、HDMI で display に出力ができるものの、動作のstatusはOLEDに表示する方が分かりやすい気もする。

# 追加する機能 [NEW]
これらをやりたかったので Arduino から Raspberry Pi への移植を進めた。

|機能|Arduino|Raspberry Pi3|
|:---:|:---:|:----|
|処理の完了通知 *1| OLED| [別記事へ] (https://qiita.com/KZ2/items/ccafbc834b9123d71978) |
|温湿度センサー| BME280 | [別記事へ](https://qiita.com/KZ2/items/68076fa6a086d89f668e) |
|歪みセンサー| load cell | May 12, 2018 [別記事へ](https://qiita.com/KZ2/items/5492e15cc15f766ca9bd) |
|データの保存と読み出し (CSV, JSON)| - |June 16, 2018 [別記事へ](https://qiita.com/KZ2/items/0d8a92cbd0500bb517bf) |

*1 処理の完了通知
- これまで処理が完了したことは、OLEDへの表示のみで、分かりにくく放置されることもあった。
- そのため、利用ユーザに確実に通知するようにしたい。常時スマホを持っているので、LINE で通知することにした。これなら気がつく。
これで、ようやくArduinoからRaspberry PiへPlatformを変更した恩恵を受けることができた。[処理の完了通知の別記事](https://qiita.com/KZ2/items/ccafbc834b9123d71978)

# 準備
- Raspberry Pi 本体と電源だけではなくて、最初に Raspberry Pi の OSを書き込むPCの準備が必要である。IO Data からは、OS インストール済みの Micro SDカードも発売されているようだ。手軽にはじめたい人はいいかもしれない。
- PC は、Mac でも Windows でもよいが、ここでは Mac での setup を記載する。

- 最初の二つは正規代理店の RS Components で購入。その他は手持ちのものを使う。MicroSDカードは amazon で購入した。

1. Raspberry pi3　Model B
1. 純正電源アダプタ 
1. USB Keyboard
1. USB Mouse
1. MicroSD Card　32GB (おすすめのサイズ)
 + 16GB ではすぐ容量不足になったので 32GB に変更した。値段も大して変わらない。1290円 2018年６月現在 [amazon](https://www.amazon.co.jp/gp/product/B01M4OHE66/ref=oh_aui_detailpage_o03_s00?ie=UTF8&th=1) 
 + 16GBのものは、 1月から一度も問題なく動作している。2枚用意してbackupして利用中。
 + 64GB以上を利用する場合には、FAT32 で format する必要があるとのこと。[FORMATTING AN SDXC CARD FOR USE WITH NOOBS](https://www.raspberrypi.org/documentation/installation/sdxc_formatting.md)

## 初期設定
最初の**セットアップ**について比較してみる。Arduino は IDE からソフトウェアを書き込むだけで準備は不要であるが、Raspberry Pi はそうはいかない。それはRaspberry PI は OS を利用するという大きな違いがあるためである。

|            | Arduino    | Raspberry Pi3 |
|:-----------|:----------:|:------------:|
| セットアップ | IDEをdownloadする | MicroSDカードにOSを書き込む |
| 起動後の設定 | 不要       | キーボードの設定など |
| 時間        | 即時       | 結構時間かかる |

1. Raspberry Pi に USB Mouse, USB Keyboard を接続する。
2. Raspberry Pi に HDMI display またはテレビを接続する。
1. PC で MicroSD Card を format する。Mac の場合は、標準の disk utility で MS-DOS format する。
1. [Download](https://www.raspberrypi.org/downloads/) した Raspberry Pi の software を書き込む。1.78GB のサイズだった。(June 23, 2018)
    - Mac では　terminalのunzipで失敗したので　[The Unarchiver](https://theunarchiver.com/)を使ってzipを展開した。その後、MacOSをHigh Sierra に update したらあっさり unzip で展開できた。
1. Raspberry Pi に MicroSD cardを挿入してから電源を接続する。
1. すると、起動して HDMI 出力でデスクトップ画面が表示される。

下記は、Macでの詳細で、手順としては、unmount してから dd で image を書き込むという意味になる。

MicroSDカードの名前を確認する。

```Mac.terminal

$ df -hk

Filesystem  1024-blocks Used Available Capacity iused  ifree %iused Mounted on
/dev/disk1  243915264 222719140  20940124    92% 55743783 5235031   91%  /
devfs             192       192         0   100%      666       0  100%  /dev
map -hosts          0         0         0   100%        0       0  100%  /net
map auto_home       0         0         0   100%        0       0  100%  /home
/dev/disk4s1 30708384   2592  30705792     1%        0       0  100%  /Volumes/R
```

unmountしておく。ddのため。

```
$ sudo diskutil umount /dev/disk4s1

Volume R on disk4s1 unmounted
```

書き込み。

```
$ sudo dd bs=1m if=2018-04-18-raspbian-stretch.img of=/dev/rdisk4
```

ddの動作中、Ctrl + T で進捗を確認することができる。

### 時刻同期　- ntp で合わせる
ntp の clinet を入れて NTPサーバと時刻を同期させる。

```bash:インストール

$ sudo apt-get install ntp
```

```bash:時刻を確認する

$ date
Sat Jun  2 11:56:12 UTC 2018
```

ずれてる...

```bash:日本時間に変更する
$ sudo timedatectl set-timezone Asia/Tokyo

$ date
Sat Jun  2 20:56:45 JST 2018
```

ok!


# Hardware

## Architecture
Raspberry Piって何かと言うと、Linux PC にGPIOの入出力がついたもの、ととらえることができると思う。つまり、Arduino と異なり Operation System が存在し、かつその入出力を制御できる。

## 消費電力

Arduinoの時は、乾電池で長時間駆動できたが、Raspberry Pi3だと、パワーの比較的強いACアダプタが必要になってくる。カメラでdeep learningで画像認識をしたときには、ファンで冷却しないと落ちてしまうこともあった。

|       　 | Arduino     | Raspberry Pi3 |
|:--------|:------------:|:------------:|
| 電源  　 | USB経由、9V乾電池など | USB経由(2.5A) |
| 消費電力　| 長持ち | 普通のPCと比較すれば少ないが、Arduinoよりは大きい |

って、数字が欲しいがArduinoのplatformによっても違う。


## 入出力
Raspberry Pi3のハードウェアでは、ボード番号ではなくGPIO番号で指定する設定のせいかもしれないが、GPIOピンの対応が分かりにくい。

|            | Arduino     | Raspberry Pi3 |
|:-----------|:------------:|:------------:|
| Pinラベル     | 記載あり | 記載なし |
| 判断方法　　| Boardのラベルを直接見る | Pinoutを参照する |
| 時間       | 瞬時 | GPIOのPinoutを参照するため時間かかる |

Raspberry Pi3 の Pinout を覚えればいいのか..
[GPIO: MODELS A+, B+, RASPBERRY PI 2 B AND RASPBERRY PI 3 B]
(https://www.raspberrypi.org/documentation/usage/gpio/README.md)

ここに分かりやすいピン配置の解説がある。
[Raspberry Pi Pinout - https://pinout.xyz/](https://pinout.xyz/) 

また出力する電圧が異なる。
Arduinoで動かしていた Relay をRaspberry Pi3に用いたら動作しないという状況になり、理由が分かるまでに30分は時間がかかってしまった。5V の Relay だったため、Raspberry Pi3 の 3.3V の低い電圧出力では直接駆動できないためである。

ちなみに Raspberry Pi にはアナログ入力がないのだが、今回使っていないので問題ない。アナログ入力が必要な場合は、Analog-Digitalの変換を適当なICを追加すればよい。

|            | Arduino     | Raspberry Pi3 |
|:-----------|:------------:|:------------:|
| アナログ入力    | あり | なし(自分でADしてから処理する) |



# Software


## 開発環境

開発言語は、まだ慣れていないが Python を使って移植中である。言語仕様が違って面白い。

|       | Arduino     | Raspberry Pi3 |
|:------|:------------:|:------------:|
| 言語  | C/C++| Python |
| 負担   | 普通 | 自分には軽い |
| 時間    | 普通 | 簡単で早い気がする |

Arduino では、専用のIDEを用いての開発が想定されているが、Raspberry Piではいくつか方法がある。HDMI 対応Displayが接続されていれば、localで普通のLinuxマシンとしてIDLEなどを使って開発してもよいし、ssh で remote loginして、terminalでcodeを書くこともできる。

|       | Arduino     | Raspberry Pi3 |
|:------|:------------:|:------------:|
| 開発環境  | 専用IDE | IDLE, console, remote login |

### IP Address

Raspberry Pi3 に割り当てられているIPアドレスをRemoteのMacやPCから調べるには次の3段階が必要である。それぞれのコマンドの意味は書略する。

1.

```
$ ifconfig | grep broadcast
	inet 192.168.1.8 netmask 0xffffff00 broadcast 192.168.1.255
```

2.

```
$ ping 192.168.1.255
PING 192.168.1.255 (192.168.1.255): 56 data bytes
64 bytes from 192.168.1.8: icmp_seq=0 ttl=64 time=0.113 ms
64 bytes from 192.168.1.19: icmp_seq=0 ttl=128 time=115.823 ms
64 bytes from 192.168.1.5: icmp_seq=0 ttl=64 time=212.963 ms
^C
```

3.

```
$ arp -a | grep b8:27:eb
? (192.168.1.22) at b8:27:eb:1c:ea:ae on en0 ifscope [ethernet]
```
192.168.1.22と分かった。


### Remote login
Raspberry Pi3 にHDMI対応のDisplay, USB Keyboard, USB Mouseを接続することなく、PC から操作したい。それも　GUI で操作したい。

#### console編：ssh
まず remote loginして、vi や emacs を使いたい。
ここでは、ssh で Raspberry Pi3 へ remote login する方法を選択するが、毎回password を入力するのが面倒なので sshpass を導入した。local network での開発なので security を考慮していない。本当はだめだと思うが..

```
$ wget http://downloads.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz
$ tar zxvf sshpass-1.05.tar.gz 
$ cd sshpass-1.05
$ ./configure 
$ make
$ make install
```

で、一発 login できるようになる。これは便利である。security弱いついでにpasswordも初期設定のままである。

```bash:sspassのあとにpasswordをつけてssh実行
$ sshpass -p raspberry ssh pi@192.168.1.22
```

ちなみに MicroSDカードを別途用意して同様に設定しようとすると、”Host key verification failed”のエラーが発生して、手元のPCで次の処理が必要かもしれない。

```bash:known_hostの更新
k$ ssh-keygen -R 192.168.1.18
# Host 192.168.1.18 found: line 2 type RSA
/Users/k/.ssh/known_hosts updated.
Original contents retained as /Users/k/.ssh/known_hosts.old
```

そしたらいつも通り、

```
$ ssh pi@192.168.1.18
```

とすればよい。下記が passwordを打たずに楽かも。

```
$ sshpass -p raspberry ssh pi@192.168.1.18
```

#### Remote Desktop編: VNC

- Server

 + リモートデスクトップでは、アクセスされる側、つまりRaspberry Pi 側がサーバとなる。クライアントはPCとなる方が典型的な使い方になるかと思う。

```shell
# まずは、Raspberry Pi側で RealVNC の Server を installする。
$ sudo apt-get install realvnc-vnc-server

# そして、config で VNCのサーバを有効にしておく。
$ sudo systemctl start vncserver-virtuald.service

```

- Client

 + クライアントとなるPC側でのセットアップは、viewer を download して、アクセスするサーバのIP address を指定する流れになる。

 + これまで HDMI 入力の TV や PC display に表示されていた内容が PC に表示されるようになる。これで GUI のある Application の開発がぐっとやりやすくなる。

 + Server の IP アドレスを調べる方法は先に記載した ssh でのremote loginのところと同様である。
 

### ATOM を使う 
ssh で login して、vi や emacs を使うのは手軽ではあるが、見にくいし、できれば rich な text editor を使いたい。例えば最近の超強力な text editor の ATOM を使ったほうがいろいろと幸せなのは間違いない。
しかし、Raspberry Pi3 で ATOM を動かす気には速度の問題でやろうとも思わないので、PC で ATOM を動かす。PC上でファイルを編集して、毎回sFTPで転送するか、下記のように File Sharing してしまうかである。

#### ATOM + python の開発で便利な plug in
- symbols-tree-view: package 変数名、クラス名や関数名が表示されて素早く移動できる。標準のsymbols-view (Command+r) は検索できるだけて関数一覧は出てこない。
- todo-show: TODO: などを書いておくとそれを抽出して表示してくれるとても便利。一気に見通しがよくなる。おすすめ。

### ATOM + File Sharing (samba)
ファイル転送はいちいち面倒くさいのでfile sharingから直接編集する方法もある。
sambaをインストールすれば直接、PCからRaspberry Pi3上のファイルを編集することができる。これが一番便利かと思う。

まずはsambaをインストールし、設定ファイルを編集する。

```shell

$ sudo apt-get install samba
$ sudo vi /etc/samba/smb.conf
```

環境に合わせて、confingurationする。ポイントは主にsecurityで
どのNetwork interfaceで、どの端末から、どのユーザの、どのdirectoryを共有するか、などを決めるという考え方である。何でも誰にでも共有してしまったら危ないので。

```conf:/etc/samba/smb.conf-WirelessLanでの設定を追加
[Gloabal]
interfaces = 192.168.1. 127.0.0.1/8 wlan0
hosts allow = 192.168.1. fe80::10
securiry = user
```

```conf:/etc/samba/smb.conf-追加
[public]
  comment = Public
  path = /home/samba/public
  public = yes
  read only = no
  browsable = yes
  force user = pi
```

```shell:準備
$ sudo mkdir /home/samba;/home/samba/public
$ sudo mkdir /home/samba
$ sudo mkdir /home/samba/public
$ sudo chown pi /home/samba/public

```

password設定

```
$ sudo smbpasswd -a pi
New SMB password:
Retype new SMB password:
Added user pi.
```

サービスを再起動する。

```shell:service_restart
$ sudo systemctl restart smbd
```

これで PC network から直接 File にアクセスできるようになるので、ATOM から直接編集できることになる。


## 実行環境

実行時に Arduino では、compile して、firmware を転送して、実行が始まるという流れになるが、一方、Raspberry Pi3 で python を利用している場合、code は即時実行されるので Arduino のような手間が省けて開発の効率という意味でも自分には楽な感じがしている。

特にちょっとしたパラメータの修正のときにいちいち firmware を転送するまでの時間を待たなくてよいので非常に開発がはかどる。パラメータをrotary encoderなどで調整するように作ればよいのだが、最終的に不要であるならばそういうものを作るのは無駄であると思う。

|            | Arduino     | Raspberry Pi3 |
|:-----------|:------------:|:------------:|
| 方法        | compile & download | interrupter |
| 時間        | 待ち時間あり | 即時 |


### DEBUG

ArudinoもRaspeberry Pi3(Python)もprintメッセージのon/offで簡単なチェックはできる。小さいプロジェクトの場合は、これでよいだろうが、少し大きなプログラムになってくると、これだけぐちゃぐちゃになりがちなので工夫が必要かと思う。Raspberry Pi3ではpythonのloggerが用意されているので、こちらを使うことにした。　

- Arduino
 + Debug 用のメッセージの表示は、if (DEBUG) 処理という書き方で
#define DEBUG 1 または #define DEBUG 0 というようにon/offのみで処理していた。こうすれば、consoleへのon/offを比較的簡単に切り替えられる。

```cpp

#define DEBUG 1

if (DEBUG) Serial.println(sensorVal);
```
メッセージを消すときは、define を変えて次のように 0 にすればよい。

```cpp

#define DEBUG 0

if (DEBUG) Serial.println(sensorVal);
```
自分にはこの程度で十分だったが、規模が大きくなる場合は、Macroを使って、どこの関数とか、どの行などを表示することもできるので、Arduino Debugなどのkeywordで調べてみるとよいかと思う。

- Raspberry Pi
 + 処理がいろいろと増える分、これでは対応できないと思ってloggerを使うことにした。(記事整理中)

### 実行前のチェック

実行前に文法のerrorを知る方法

```
$ python -m py_compile foo.py 
```

正しければ何も表示されない。GUI applicationなど処理がそこまで進まないと実行されない部分があるときは、先にチェックしておいたほうがよいと感じた。


## Backup

Arduino では、IDE から upload する仕組みなので PC 側の backup ができていればそれでよいが、Raspberry Pi では少し違う。何もしないと Raspberry Pi の MicroSDカードそのものに source code を書いていることになる。いつ Micro SDカードが壊れるかも分からないので backup は必要かと思う。

現在は、組み合わせで利用しており、開発中は、git で version 管理しつつ、さらにSDカードを複数枚持って、丸ごとコピーで環境を保存している。

|                  | Arduino    | Raspberry Pi3 |
|:-----------------|:----------:|:------------:|
| source codeの場所 |  PC側       | RBPi 側 |



### SSH File Transfer Protocol (SFTP)

とりあえず、SFTP client の [FileZilla] (https://filezilla-project.org/) を使って、Raspberry Pi からファイルを PC 側に持ってくることにした。Raspberry Pi側ではサーバの設定など不要である。

### SD Cardを丸ごとバックアップする
なんと Raspberry Pi には、`SD Card Copier` という MicroSDカード丸ごとバックアップするアプリケーションが標準で用意されている。場所は、Main menu ➡ Accessories である。
つまり、これを使うと今現在動作している MicroSDカードを USB で接続されたカードリーダの MicroSDカードに丸ごとコピーできるという超お手軽なbackupである。

- PC用の SD カード Reader/Writer を Raspberry Pi3 に USB で接続すればすぐ認識される
- Copy 元と、Copy 先を指定して backup する
- その際、`sudo parted -l` すると　copy　先のデバイスが分かる

方向を間違うと悲惨なのでよく見る。私の環境でははこうなった。挿入前後でよく確認する。

|                  | device    | 
|:-----------------|:----------:|
| Copy From Device |  SPCC (/dev/mmcblk0) |
| Copy To Device |  Generic Storage Device (/dev/sdc) | 


測っていないけどCopyには結構時間かかる。方法は手軽だが、毎日行うbackup方法ではないと思う。


```bash:backup用のmicroSDカードを挿入する前

$ sudo parted -l
Model: SD SPCC (sd/mmc)
Disk /dev/mmcblk0: 15.7GB
...省略

```

```bash:backup用のmicroSDカードをUSB接続のReader/writerで接続して挿入した後

$ sudo parted -l
Model: Generic STORAGE DEVICE (scsi)
Disk /dev/sdc: 15.5GB
...省略


Model: SD SPCC (sd/mmc)
Disk /dev/mmcblk0: 15.7GB
...省略

```

以上である。Operating Systemや設定など環境ごと保存されるのでとても楽である。backup が完了したら、日付と時間を分かるように書いておく。

### Dropbox

Raspberry Pi3 から Dropbox に folder を指定して upload することができる script が用意されている。

[Dropbox Uploader](https://github.com/andreafabrizi/Dropbox-Uploader/)

BASH の script で記載されており、upload だけではなく、download, delete などにも対応する。インストールは、上記のページを見ればよいが、ポイントは、自分の Dropbox で login して、この使い方専用の token を発行して、scriptのインストール時にその token を指定することである。
あとは、自動起動するようにして、定期的に実行すれば、ある程度随時のファイル更新のbackupに対応できることになる。(通常のDropbox clientnのようにreal-timeでsyncはしないという意味)

### git

一人で開発するにせよ、複数人で開発するにせよ、構成管理、Version 管理があると楽である。というわけで、今回は　git を使う。

git のサーバは、cloud サービスを使う方が自前のサーバよりbackupの面で安心だろう。Github の private 版は有料だったので、まずは非公開の private repository が無料で使える [Bitbucket](https://bitbucket.org/product) を使っていた。しかし、2019年1月7日に Github の Private repository も無料で利用できる変更がされたため、Github の設定を追記する。[New year, new GitHub: Announcing unlimited free private repos and unified Enterprise offering
](https://blog.github.com/2019-01-07-new-year-new-github/)

#### GitHub編
すでにGitHubにrepositoryがあるという前提で、github の repository を Setting から Private に変更する

```text
Settings > Danger Zone > Make this repository private
```

あとは、

```bash
$ git clone "既存の repository URL"
$ git commit -m "my comment"
$ git push
```

ということでいつもと同じである。つまり設定は特に必要なかった。

##### 追加設定　text editor の変更1

```console:viに変更する
[pi@Pi3 home]$ git config --global core.editor 'vim -c "setfenc=utf-8"'
```

##### 追加設定　text editor の変更2

```console:viに変更する
[pi@Pi3 home]$ sudo update-alternatives --config editor
There are 5 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    15        manual mode
  5            /usr/bin/xemacs21   -100       manual mode
```

ここで、3を選んでviにしておく。


#### Bitbucket編
Bitbucket は、アカウントを作ればすぐ使えるようになる。下記のコマンドで編集して更新まで対応できる。

0. Bitbucket のアカウントを作る。
1. Bitbucket の Web 上で repository を作る。READMEを作っておくとよい。
2. Raspberry Pi3 の shellで $ git clone YOUR_REPOSITORY_NAME　で local に持ってくる。そこに README が含まれる。
3. その local に directory に自分のsource codeをcopyして、gitの管理下に加える。

```bash

$ git add .
```

4. そうすれば、以下、下記のコマンドで使えるようになる。source code を編集して、

```bash

$ git status
$ git diff
$ git commit -m "my comment"
$ git push
```

#### 新しいMicro SDカードを作り、それを使うとき
16GBのMicroSDカードだと容量不足になってきたので32GBに変更した。その際、自分の repository から git clone myURL して新しくsource code を持ってきた後、修正して、commit, pushしようとすると error になるので下記を実行する。

```
$ git config --global user.email onamae@gmail.com
$ git config --global user.name "onamae"
```

この後は、いつも通り修正したらcommit, pushすればよい。


#### git 実行時の password を不要にする
git 実行時の password を不要にするためには、ssh key を git のweb siteで足すのと、local で git host との通信方式をsshにするという二つのステップがある。

1. ssh keyを足す。詳しくはこちら。書いてある通りに key を生成して、web で貼り付ければよい。https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html
2. localの処理

最初はこうなっている。

```bash:最初
$ git remote -v
origin	https://YOURID@bitbucket.org/YOURID/REPOPOSITORY_NAME.git (fetch)
origin	https://YOURID@bitbucket.org/YOURID/REPOPOSITORY_NAME.git (push)
```

次のコマンドで ssh通信に変更する。

```bash:変更のコマンド

$ git remote set-url origin git@bitbucket.org:YOURID/REPOPOSITORY_NAME.git
```

変更を確認する

```bash:変更後
$ git remote -v
origin	git@bitbucket.org:YOURID/REPOPOSITORY_NAME.git (fetch)
origin	git@bitbucket.org:YOURID/REPOPOSITORY_NAME.git (push)
```

これで git pushとかしたときに password を聞かれなくなった。


## 自動起動
Arduinoでは、setup(), loop()が順に自動的に実行される仕組みだが、Raspberry Piでは何を実行するか自分で設定しないと、単にdesktopが画面が表示されるだけになる。あるいはCUIにしていればconsoleが表示されるだけになる。

自動起動の方法として、UNIX では一般に利用される /etc/rc.local ではなくて、GUIアプリなのでWindow Managerの機能を使うことにした。


最後の行に@からはじめてコマンドを書き足す。

```shell-session:.config/lxsession/LXDE-pi/autostart
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@point-rpi
@/usr/bin/python /home/pi/myproject.py
```

## 運用

Raspberry Pi は、標準のOSではLinuxベースなので運用を普通にしていると log がたまって disk 100% になって動作しなくなることがある。login できても bash の補完が聞かないなどまともに使えなくなる。cronで定期実行するようにしているものも動作がとまってしまう。

そんなときは、df を使って disk (Micro SD) の状況を見る。下記は解決済みの状況ではあるが、当初 /dev/root が100%となっていた。

```下記をチェックする
pi@rp:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        13G  6.8G  5.3G  57% /
devtmpfs        426M     0  426M   0% /dev
tmpfs           430M     0  430M   0% /dev/shm
tmpfs           430M   12M  419M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           430M     0  430M   0% /sys/fs/cgroup
/dev/mmcblk0p6   66M   23M   44M  34% /boot
tmpfs            86M     0   86M   0% /run/user/1000
/dev/mmcblk0p5   30M  782K   27M   3% /media/pi/SETTINGS1
```

syslogなどが巨大になっていないかを見てみる。

$ ls -l
とかで。

$sudo mv /var/log/daemon.log /var/log/foo
$sudo mv /var/log/daemon.log.1 /var/log/bar
$sudo rm /var/log/foo /var/log/bar
削除するには、rm ではなくて、mv を用いて一旦 rename し、その後rmで削除する。これが早くて確実。理由は rm で消しても実際にはすぐには消えず disk 容量に反映されないから。原理はここでは省略する。


【注意】
後半の準備以降では、Arduino と Raspberry Pi の一般的な違いも書いていますが、必要最小限の情報であり、すべての違いを網羅しているわけではないです。あと、Raspberry Pi3のみで動作を確認しています。

# 参考web site
[1] RASPBERRY PI FOUNDATION, https://www.raspberrypi.org/
[2] GPIO, https://www.raspberrypi.org/documentation/usage/gpio/README.md
[3] Arduino cc, https://www.arduino.cc/

---

[4] DOCUMENTATION > INSTALLATION > INSTALLING-IMAGES,https://www.raspberrypi.org/documentation/installation/installing-images/README.md
[5] 64GB以上のMicroSDを利用する場合には FAT32 で format する必要がある。[FORMATTING AN SDXC CARD FOR USE WITH NOOBS](https://www.raspberrypi.org/documentation/installation/sdxc_formatting.md)