GrovePi+ のファームウェアアップデート手順

#◆ はじめに
Raspberry Pi3(Raspbian Stretch) と GrovePi+ の組み合わせで各種センサーの値を取得したい。
製品コンセプトとしては、RaspberryPiへGrovePi+をマウントするだけですぐ使える、コネクタが統一されており、センサーと基盤を電子工作しなくてもすぐ使える、ということが売り。
ところが、I2Cなどのデジタルセンサーの利用に関しては問題は無いが、アナログセンサーは素の状態では使えなかった。

残念ながらこちらにまとめてくださっている手順は現時点では成功しなかった。
**a-r-iさんの記事**
[Grove Piで光量の取得エラー。ファームウェアのアップデートで解決](https://qiita.com/a-r-i/items/080875d13d92d4fc2a9a)
そもそもファームのアップデートがまともに通らなくなっている。

調べたところ、GrovePi+のファームウェアが古いとアナログ値の取得に失敗するようだ。
本記事はGrovePi+のファームウェアアップデートの手順を記すもの。
ハードコピーなどは一切無いが、成功する手順を端的に記録する。

#◆ GrovePi+ とは
- [スイッチサイエンス様製品ページ](https://www.switch-science.com/catalog/2129/)
- [メーカー(DexterInd)公式 Firmwareアップデートチュートリアル] (https://github.com/DexterInd/GrovePi/tree/master/Firmware)
- [メーカー(DexterInd)公式 GrovePi全体のチュートリアル] (https://github.com/DexterInd/GrovePi)

#◆ ファームウェアアップデート手順 2018.04.25時点
悲しい話だが、メーカー公式のFirmwareアップデートチュートリアルに記載の手順どおりに進めても成功しない。
下記非公式ではあるが、自分で編み出した手順に沿って進めることでアップデートに成功した。
まず最初に **`センサー類を全て取り外した状態のGrovePi+`** をRaspberryPiへマウントしておく。
続いて下記を実行する。

```shell
$ cd ~
$ git clone https://github.com/DexterInd/GrovePi.git
$ cd GrovePi/Script/
$ sudo chmod +x install.sh
$ sudo ./install.sh
$ sudo git fetch origin
$ sudo git reset --hard
$ sudo git merge origin/master
$ cd ~/GrovePi/Firmware
$ nano grovepi_firmware_update.sh
```

下記のとおり修正して保存。

```shell:grovepi_firmware_update.sh
#!/usr/bin/env bash
update_grovepi_firmware(){ 
    avrdude -c linuxgpio -p m328p -U lfuse:w:0xFF:m
    avrdude -c linuxgpio -p m328p -U hfuse:w:0xDA:m
    avrdude -c linuxgpio -p m328p -U efuse:w:0x05:m
    avrdude -c linuxgpio -p m328p -U flash:w:grove_pi_firmware.hex
}
```

下記を実行する。

```shell
$ sudo nano /usr/local/etc/avrdude.conf
```

下記のとおり修正して保存。

```cmake:修正前
programmer
  id    = "gpio";
  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
  type  = "gpio";
  reset = ?;
  sck   = ?;
  mosi  = ?;
  miso  = ?;
;
```

```cmake:修正後
programmer
  id    = "linuxgpio";
  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
  type  = "linuxgpio";
  reset = 8;
  sck   = 11;
  mosi  = 10;
  miso  = 9;
;
```

下記を実行する。エラーが表示されても無視する。

```shell
$ sudo chmod 777 ./firmware_update.sh
$ sudo ./firmware_update.sh
$ sudo reboot
$ cd /home/pi/GrovePi/Firmware/Source/v1.2/grove_v1_2_7
$ nano manualupdate.sh
```

下記を入力して保存する。

```shell:manualupdate.sh
#! /bin/bash
echo "Updating the GrovePi firmware and software with the Experimntal software and firmware"

read -n1 -p "Do you want to update the firmware? [y,n]" input
if [[ $input == "Y" || $input == "y" ]]; then
       	printf "\nMake sure that GrovePi is connected to Raspberry Pi"
else
        printf "\nExiting..."
	exit 0
fi

printf "\nPress any key to start firmware update\n. . .";
read -n1
sudo avrdude -c linuxgpio -p m328p -U flash:w:grove_pi_v1_2_7.cpp.hex
```

下記を実行する。

```shell
$ sudo chmod 777 ./manualupdate.sh
$ sudo ./manualupdate.sh
$ sudo reboot
```

これで、GovePi+ ファームウェアが現時点で最新 (ver 1.2.7) のものに更新される。
試しに下記アナログセンサーの動きを確認したところ、ファームウェアアップデート前までは動作しなかったが、ファームウェアアップデート後には正常に動作し、値が取得できるようになった。
これで、I2Cではできないがアナログではできる、「同じ型のセンサーの複数個同時利用」が実現できた。

- GROVE - 光センサ v1.2　https://www.switch-science.com/catalog/3284/
![PO8B7QD0XnLNChGoGZiQ9G3d.png](https://qiita-image-store.s3.amazonaws.com/0/194769/3471a145-9882-1c4e-ecdf-f3ff12f64452.png)