備忘録: Raspberry Pi 3 + OpenCV + Camera V2.1 (Sony) 環境立ち上げメモとトラブルメモ

# Raspberry Pi 3 関連
   * SDCard 相性問題(Sandisk microSDXC UHS-I 64GB) がだめ、SONY class 10 16GB (SR-16UYA)を利用してＯＫ。
   * SDカードの容量を増やす試行。東芝microSDXC UHS-I 64GB 購入。
   * Windows に WinDiskImager をインストール
   * SONY 16GB のバックアップ --> Windows PC by WinDiskImager Read コマンド
   * 新しい64GB 東芝に元データをコピー Windows PC --> 東芝 64GB by WinDiskImager by Write コマンド
   * 新しい東芝 64GB で ラズパイを reboot
   * df -h   ==> 16GB しか使われていない
   * sudo fdisk /dev/mmcblk0
   * SD カードのパーティションツール gparted をインストール (sudo apt-get install gparted)、unallocated領域に新たな Partition を作成。
   * どのようにＯＳに領域を認識させる？？
     --> 2016/12/28 Disk image を焼くところからやり直し
           RASPBIAN JESSIE WITH PIXEL をダウンロード unzip で 1.54G --> 4.3G
           東芝 64GB を Mac に挿し、　

　　　　　　 ``` > diskutil list ```
 で SDCard名を特定、

``` 
> diskutil eraseDisk FAT32 RASPI /dev/disk2  
> diskutil unmountDisk /dev/disk2 
> sudo dd bs=1m if=2016-11-25-raspbian-jessie.img of=/dev/disk2 
```
50分程度で終了。rasppi に差込み、無事ブート


# Raspberry Pi 3 ネットワーク関連
   * SSH を有効にする。 sudo raspi-config で  9.Advance Options --> A4 SSH --> enable

   
   * 無線LAN 設定 (raspi> ip addr, mac>sudo arp-scan --localnet,)

    ```     > shdo sh -c 'wpa_passphrase SSID PASSPHRASE >> /etc/wpa_supplicant.conf'  ```

# 各種アップデート
　 以下を事項

```
     > sudo rpi-update
     > sudo reboot
     > sudo apt-get update
     > sudp apt-get upgrade
```

# Raspberry Pi セキュリティ向上
   * 初期ユーザ pi のパスワードを変更、その後いくつか作業の後、特定アカウントを作成し、この pi アカウントは削除
   
```
    > sudo passwd root
    > sudo adduser  <NEW_USERXXXX>
    > groups pi
    > sudo usermod -G pi,adm, 省略(piに順ずる) <NEW_USER>
    > sudo userdel -r pi
```
   * ファイアーフォールの設定 
   
      ``` > sudo apt-get -y install iptables-persistent ```

(iptablesのコマンドで設定。Rebootのたびに設定が初期状態に戻るため、iptables-persistentを使う)および各種設定。
   * Root のログインを禁止。 /etc/ssh/sshd-config の PermitRootLogin no, PasswordAuthentication no
   * SSH port の変更の仕方
       /etc/ssh/sshd_config を変更

```
  > sudo /etc/init.d/ssh restart
```
   その後の login
      ssh NewUser\@192.xxx.xxx.xx -p \<Port番号\>      
   
# OpenCV 3.1 インストール関連
ここを参照。
 http://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/

 ```  
 > sudo apt-get install build-essential cmake cmake-qt-gui
 > sudo apt-get install libgtk2.0-dev  libjasper-dev libopenexr-dev python-dev 
 > sudo apt-get purge wolfram-engine
 > sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev  libpng12-dev
 > sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
 > sudo apt-get install libxvidcore-dev libx264-dev
 > sudo apt-get install libatlas-base-dev gfortran
 > sudo apt-get install python2.7-dev python3-dev
 > wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
 > unzip opencv.zip
 > wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
 > unzip opencv_contrib.zip

 > cd opencv-3.1.0; mkdir build; cd build 
 > cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=/XXX/opencv_contrib-3.1.0/modules -D ENABLE_NEON=ON -D ENABLE_VFPV3=ON -D INSTALL_C_EXAMPLES=OFF .. 
```


INSTALL_C_EXAMPLES=OFF にしないと、cmake で sys/videoio.h が無いという Error に遭遇する。上記は　cmake-gui　で GUI上でも各種設定できる模様。

 ```  
 > make -4
 > sudo make install
 > sudo ldconfig  
 ```  

コンパイルしている際はチップの温度が上昇しています。その具合は以下のコマンドで分かります。
  ` > vcgencmd measure_temp 
    temp=49.4'C `
動作周波数は以下
   ` > vcgencmd get_config int `

参照 : http://www.elinux.org/RPI_vcgencmd_usage


# Camera V2.1 (Sony IMX219PQ)
  * Vision Processing community に登録
  　　 https://www.visionproc.org/index.php
  * Interface 2016/12 ～ 2017/02 の ラズパイカメラ特集に沿って作業
  * 以下を実行

    ```
       > sudo apt-get update
       > sudo apt-get upgrade
       > sudo apt-get rpi-update
       > sudo reboot
       > sudo emacs -nw /boot/config.txt
            dtoverlay=i2c1-bcm2708,sda1_pin=44,scl1_pin=45,pin_func=6
       > sudo emacs /etc/ld.so.conf.d/libssp.conf
             /XXX/lib/libssp/1.0.1/lib
       > sudo ldconfig
       > sudo apt-get install libopencv-dev
       > sudo apt-get install libgl1-mesa-dri
```

  * VisionProcessingFramework/src にて make でエラーに遭遇
  * save_as_image_wnd.cpp　の　cv::imwrite(file_path, *image) で imwrite is not a member of cv のエラー
     --> 解決 : 2016/12/31
             save_as_image_wnd.cpp に  ` #include <opencv2/highgui/highgui.hpp> ` を追加

     --> リンク時にエラー発生 : 2016/12/31
        sudo apt-get install libopencv-dev と OpenCV 3.1 のインストールで conflict のエラー

       ```  /usr/bin/ld: warning: libopencv_video.so.2.4, needed by /usr/lib/arm-linux-gnueabihf/libopencv_contrib.so, may conflict with libopencv_video.so.3.1     ```

     以下のコマンドで include path, library path を取得し、コンパイル時に渡せばＯＫ

      ``` pkg-config --cflags opencv; pkg-config --lib opencv ```

     Makefile で以下を追加
```
       RAS_OPENCV := $(shell pkg-config --cflags opencv) $(shell pkg-config --libs opencv) 
       OPENCV_LIB  = $(RAS_OPENCV)
```

  * VisionProcessingFramework/src/Plugins にて make でエラーに遭遇
　　　以下の対応を実施し、OKとなった。
        EdgeEnhancement/edge_enhancement.h : #include <opencv2/opencv.hpp> を追加
        Demosaic/demosaic.h :   #include <opencv2/opencv.hpp> を追加
        ResizeImage/resize_image.h :   #include <opencv2/opencv.hpp> を追加

  * Web Manual によると、` sudo ./VisionProcessingFramework ` での実行とのこと。
     sudo 実行で、以下のエラーに遭遇。
     ` X11 connection rejected because of wrong authentication. `

     以下を実行

```
> sudo su
> xauth merge /home/<ログインしていたユーザアカウント>/.Xauthority
```

 なお、rasp Pi には、以下のように -Y オプションの X forwarding で remote login

` ssh -Y <アカウント>@192.168.0.xx `


  * C11 関連？のエラーに遭遇
   
  ```
  　　 logger.h:94:69: error: cannot pass objects of non-trivially-copyable type 'class wxCStrData' through '...'
      Logger::LogWrite(kLogWarning, MODULE_NAME, wxT(fmt), ##__VA_ARGS__);
```

　　　ここいらを調査中
　　　　http://stackoverflow.com/questions/5588855/standard-alternative-to-gccs-va-args-trick

   --> 解決 2016/12/30
      上記は、SDCard 64GB へ移行した際に、インストールをしなおすと、消えた。GCC のバージョンに関連しているのかな？ gcc のバージョンは gcc version 4.9.2 (Raspbian 4.9.2-10)


  * stillsample.c をコンパイルして、動作させる。
      ./stillsample IMX219_1280x720_60Hz.xml test.raw
  　　if((retval = ssp_start_streaming(handle)) != SSP_SUCCESS){
    　のコードに行くと、以下を出力して、ハングアップ。

       ```
        Running on Pi 3 Model B
        PowerOn Reset...Done.
       ```

     初期化設定で Power On Rest が発生？？ ★

     * ドライバの登録など
       デバイスドライバがロードされているかの確認。
       `  > lsmod   `
  　　 デバイスドライバのロードは
       ` > sudo modprobe i2c-dev `
       ` > sudo modprobe i2c-bcm2708 `

        ブート時に自動的に読み込ませるために /etc/modules に i2c-dev と i2c-bcm2708 を追加

    
　　　* Linux ドライバの関係を整理 (書籍: Raspberry Pi で学ぶ ARM デバイスドライバープログラミング参照)
          - ユーザーランド : sysfs or /dev/i2c* が関係
          - カーネルモード : I2Cクライアントドライバー i2c-dev, I2Cアダプタドライバ i2c-bcm2708
          - Raspbain では曽木設定でI2Cアダプタドライバが無効化されている。P1ヘッダの３番、５番ピンがGPIOとして使えなくなるからとのこと。 ` /etc/modprobe.d/raspi-blacklist.conf ` をコメントアウトする



     * カメラの接続確認
        ` > vcgencmd get_camera `

     * test comand
        ` > raspistill -o output.jpg `

ロードの確認は以下。

```
 > sudo cat /etc/modules
 > dmesg | grep i2c
 > sudo apt-get install i2c-tools
 > i2cdetect -y 1 
 > ls /dev/i2c-1
```

    アドレスが拾えず、何かがおかしい。


```
 > i2cdetect -y 1 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: 10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- 64 -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
```
　　が観測され、stillsampe も動作.

   しかし、動かないときもある。解析必要★

  -->  2017/01/01
      ` /var/log/syslog ` を見ると、
    ` Jan  1 09:41:13 raspberrypi kernel: [31580.602100] i2c i2c-1: transfer timed out `
 のようなタイムアウトがレポートされている。 同様の現象が以下でも報告されている。
http://raspberrypi.stackexchange.com/questions/43697/i2cdetect-on-raspberry-pi-kernel-4-1-18-v7-takes-115-seconds

https://github.com/raspberrypi/linux/issues/1379


 * I2C のボーレートの下げ方
    /boot/config.txt に 以下のよう記載し、reboot

```
   dtparam=i2c_baudrate=20000
```
 
    異なるサイトでは、 ` /etc/modprobe.d/i2c.conf ` に　` options i2c_bcm2708 baudrate=50000 ` と書けばよいとも・・・ 


    現在のスピードの確認
`> sudo cat /sys/module/i2c_bcm2708/parameters/baudrate `


# 64GB SDCard に以降後、再度まっさらな状態から 各種インストールして、・・・
   * Interface 2016/12 の Vision Processing Framework をトライ
      コンパイルエラーに遭遇

```
base/././include.h:14:25: fatal error: wx/bmpbuttn.h: No such file or directory
 #include <wx/bmpbuttn.h>
                         ^
```

何かが足りない。　wxWidgets　かな？
https://www.raspberrypi.org/forums/viewtopic.php?t=8935&p=292883

```
sudo apt-get install libwxgtk2.8-dev
```

wx/bmpbutth.hのエラーは解消。


# Raspberry pi Camera V2.1 情報
   センサーの情報
https://android.googlesource.com/kernel/bcm/+/android-bcm-tetra-3.10-lollipop-wear-release/drivers/media/video/imx219.c
https://android.googlesource.com/kernel/bcm/+/android-bcm-tetra-3.10-lollipop-wear-release/drivers/media/video/imx219.h

# GPIO
    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 | 0 |  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 | 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 | 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---+---+------+---------+-----+-----+

```


# Wifi 状況
   以下のコマンド
   ` > iwconfig `

# カメラ操作
  * Still　: １分間間隔で、１時間撮影、画質レベル 90 
` > sudo raspistill -w 800 -h 600 -t 3600000 -tl 60000 -q 90 -o timelapse_%04d.jpg ` 

   * 動画 : 10秒 H264 撮影
    ` sudo raspivid -w 1600 -h 1200 -t 10000 -o video.h264 `

   * H264 を MPEG4 変換
   　` > sudo apt-get install gpac `
     ` > MP4Box -fps 30 -add video.h264 video.mp4 `


 # 各種ログ
    * /var/log/messages チェック
       大量に  ` http://www.rsyslog.com/e/2007 ` へアクセス。
　　　　参考
https://www.netfort.gr.jp/~tosihisa/notebook/doku.php/raspberrypi/log20151101_rsyslogd-2007
       ' /etc/rsyslog.conf ' のxconsoleの設定をコメントアウトします。

```
daemon.*;mail.*;
       news.err;
       *.=debug;*.=info;
       *.=notice;*.=warn       |/dev/xconsole
```
そのあと、restart ` > sudo /etc/init.d/rsyslog restart `