ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

デスクトップPCにDebian 10

(2020-07-11 初稿 - 2021-05-18 転記・追記)

はじめに

約12年ぶりにデスクトップPCを購入した。長い間デスクトップPCを使っているという意識はあったものの、12年間もの間、購入していなかったとは思ってなかったなぁ。(汗)

購入したデスクトップPCは、パソコン工房のSTYLE-M1B4-R535-RXSで、OSはインストール無しの製品。

ちなみに、価格は約10万円。新型コロナの給付事業の振込み時期に購入したので、記念で買ったということに。

購入したデスクトップPCの主なスペック

[マザーボード] ASUS PRIME B450-A

[CPU] AMD(R) Ryzen 5 3500 (3.6-4.1GHz/6コア/6スレッド/16MBキャッシュ/TDP 65W)

[メモリ] 16GB (DDR4-2666 8GB×2)

[グラフィック] NVIDIA(R) GeForce GTX 1660 Ti 6GB GDDR6

[電源] 500W

インストールの前にセキュアブートをOFFに

インストールOSが無いPCを購入したので、まずはOSのインストールから始めるが、インストールするOSは、筆者お好みのDebian

2020年6月だったので、インストールしたDebianのバージョンはBuster(10.4)。

Debianは、Stretchの時代からUEFIに対応しているとのことだが、セキュアブートには対応していないので、セキュアブートをOFFにしないとDebianをインストールできない。

マザーボードの種類によって、セキュアブートをOFFにする設定が異なるので、購入したPCがマザーボードBIOSでセキュアブートをOFFにできるか心配だった。

起動直後にDELキーまたはF2キーを押してBIOSに入り、最初はセキュアブートの設定を切ることができなくて焦ったが、あらかじめ設定されていたパスワード削除することにより、無事にセキュアブートの設定をOFFにすることができた。

Busterのインストール

UEFIの準備が整ったので、いよいよDebian Busterのインストール。

有線でネットに接続し、Debianのnetinst版を用いてインストールした。

インストールは、いつものように正常に終了したが、再起動するとXが起動しなかった。

グラフィックボードが、Nvidia製品だから、Xが起動しないのは想定の範囲内

ちなみに、インストールしたデスクトップ環境は、筆者お好みのLXDEで、とても軽く普段の利用では必要十分な機能がある。 

nVidiaドライバのインストール

sudoをインストールする前なので、rootになって以下のコマンドを実行。

# apt install nivdia-detect

# nvidia-detect
Detected NVIDIA GPUs:
08:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU116 [GeForce GTX 1660 Ti Rev. A] [10de:2182] (rev a1)

Checking card:  NVIDIA Corporation TU116 [GeForce GTX 1660 Ti Rev. A] (rev a1)
Your card is supported by the default drivers.

It is recommended to install the
    nvidia-driver
package.

# apt install nvidia-driver

nvidia-driverのインストール後、再起動して無事にXが起動した。

Desktop PCの各種設定

以下は、細々とした各種設定。

IPアドレスの固定

このデスクトップPCは、筆者のメインPCとなるので、IPアドレスが固定していた方が、他のPCからのssh接続などで便利。

当初、デスクトップのネットワークマネージャ(Wicd)のアイコンでIPアドレスを固定しましたが、実際には全く固定化できず、少し焦った。

以下のとおり、/etc/network/interfaces を編集することによってIPアドレスを固定することができた。

# vi /etc/network/interfaces

allow-hotplug enp0s3
auto enp0s3                       # <= 追加(自動起動)
#iface enp0s3 inet dhcp           # <= コメント化(DHCP を使用しない)
iface enp0s3 inet static          # <= 追加(IP アドレス固定化)
address 192.168.11.11             # <= 追加(IP アドレス)
network 192.168.11.0              # <= 追加(ネットワークアドレス)
netmask 255.255.255.0             # <= 追加(ネットマスク)
broadcast 192.168.11.255          # <= 追加(ブロードキャストアドレス)
gateway 192.168.11.1              # <= 追加(デフォルトゲートウェイ(ルータの IP ))
dns-nameservers 192.168.11.1      # <= 追加(ネームサーバ(現時点ではルータの IP アドレス))
dns-search exsample.com           # <= 追加(DNS 検索)

なお、IPv6を利用しない場合は、以下で無効化できる。

# vi /etc/sysctl.conf
# 最終行に追加
net.ipv6.conf.all.disable_ipv6 = 1

sudoのインストール

sudoが使えないといろいろと不便なので、以下のとおりsudoをインストールする。

# apt install sudo
# visudo

# User privilege specification
root ALL=(ALL:ALL) ALL
hoge ALL=(ALL:ALL) ALL #<= 自分のユーザ名を追加

ディレクトリ名を英語表記に

ディレクトリ名も英語でないと不便なので、以下のとおり英語表記に変更する。

$ sudo apt install xdg-user-dirs-gtk
$ LANG=C xdg-user-dirs-gtk-update

mozcのインストールと辞書のコピー

日本語変換には、fcitx-mozcを利用している。

前のPCのユーザ辞書には登録単語を追加しているので、scpでコピーして再利用。

なお、コピーにはsshのインストールが必要。

$ sudo apt intall fcitx-mozc
$ scp (既存のPC名):.mozc/user_dictionary.db .mozc/

Gvimのインストール

LXDEを使っていると、どのgvimをインストールしたら良いのかよくわからないが、最もシンプルそうなvim-gtkをインストール。

sudo apt install vim-gtk

なお、利用するフォントは、NOTO MONOの14を用いるように .gvimrcに追記。

$ vi .gvimrc
set guifont=NOTO\ MONO\ 14                #<= 追記

Google Chromeのインストール

ブラウザは、Google chromeをインストール。

最近のaptは、ダウンロードしたdebもインストールできるし、依存のパッケージもインストールしてくれるので、すごく賢くて便利。

$ sudo apt install google-chrome libappindicator3-1

家庭内のPC名(ホスト名)解決

家庭内のPCは、/etc/hosts に記述して、アクセスが簡単になるようにする。

ここでは、既存の /etc/hosts をscpでコピーします。

$ scp (既存のPC名):/etc/hosts /etc/hosts

Dropboxのインストール

3台までしか無料で利用できなくなってしまったDropboxだが、このPCは筆者のメインPCなので、以下のとおりダウンロードしたdebファイルをインストール。

$ sudo apt install dropbox.deb

.Xsessionrcのコピー

rubypythonで簡単なコマンドを作成し、~/bin ディレクトリに入れて、便利に使っている。しかし、インストール直後は、~/binにpathが通っていなかった。

pathを設定するには、いろいろな方法があるが、GUIログイン、sshのログインの両方ともに~/binにpathを通せる .xsessionrc を用いた。

ちなみに、コピーした.xsessionrc は以下のとおり。

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"                       #<= ここの行が大切
fi

フォントのインストール

デフォルトでNOTOフォントがインストールされていたが、IPAフォントを以下のとおり追加でインストールした。

apt install fonts-ipafont fonts-apaexfont

rubyのインストール

rubyも便利なので、以下のとおりインストールした。

sudo apt install ruby ruby-dev rake

ちなみに、rake を入れないと rubygem が動かない。

python3のインストール

pythonは3がデフォルトでインストールされているが、pipを以下のとおり追加でインストールした。

sudo apt install python3-pip

shotwellデータベースのコピー

自分で撮った写真の整理にshtowellを利用している。

~/.local/share/shotowell ディレクトリ内に data ディレクトリがあるので、まるごとコピーして利用する。

既存のデスクトップPCからハードディスクの移設

こちらは、少しややこしいので、別ページに記載。

Tverを見る

DebianRaspberry Piでは、Tverで視聴できないので、不便に思っていた。

ネットで検索したら、Google Chromeでなく、Firefoxならば視聴できるとあったので、試してみると見事に見ることができた。

deb.multimedia.orgをaptに追加

マルチメディア関連のパッケージを導入するには、deb.multimedia.orgをaptlineに追加する。

vi /etc/apt/sources.list
# 以下の2行を追記
deb http://www.deb-multimedia.org buster main non-free
deb-src http://www.deb-multimedia.org buster main non-free

そのまま、apt updateをすると怒られるので、公式サイトにあるように、keyring等をあらかじめインストールします。

apt update -oAcquire::AllowInsecureRepositories=true
apt install deb-multimedia-keyring

これで、aptでマルチメディア系のパッケージがインストールできるようになる。

おわりに

上記で、概ねいつも使える環境になった。

関連ページ

Debianでハードディスクの移設

(2020-07-12 初稿 - 2024-03-02 転記・修正)

はじめに

先日、久しぶりにデスクトップPCを交換したので、前のデスクトップPCに付けていたハードディスクを移設(乗せ換え)した。

このページは、ハードディスクのフォーマットは行わず、データはそのままで移設する方法を記載する。

ハードディスクの接続

まずは、ハードディスクを本体に接続する。

電源を確実にOFFにした上で、電源とS-ATAケーブルを接続すれば、難しい作業ではないので、ここでは省略。

 UUIDの確認

ハードディスクを物理的に接続後、電源ONにして起動する。

UUIDの確認方法は、以下の2とおりあるので、どちらか好きな方で。

ls /dev/disk/by-uuid

まず1つ目の方法は、/dev/disk/by-uuidをlsコマンドで確認する方法。

$ ls /dev/disk/by-uuid

合計 0

lrwxrwxrwx 1 root root 10 7月 10 20:42 02C3-21D2 -> ../../sda1

lrwxrwxrwx 1 root root 10 7月 10 20:42 2ef369a1-0330-4175-8651-f2da0a60ac01 -> ../../sdb1

lrwxrwxrwx 1 root root 10 7月 10 20:42 b1d418de-eb86-45b0-9841-76a135104c85 -> ../../sda3

lrwxrwxrwx 1 root root 10 7月 10 20:42 ffd2862c-029b-41a5-8677-0ca8eb8751c1 -> ../../sda2

筆者のデスクトップPCでは、上記のように表示され、移設したハードディスクは、UUIDが2ef369a1-0330-4175-8651-f2da0a60ac01であり、/dev/sdb1として認識されている。

blkid

blkidコマンドの場合は、以下のように確認する。

$ sudo blkid

/dev/sda1: UUID="02C3-21D2" TYPE="vfat" PARTUUID="4667a68b-4a36-481b-8875-8c1baaf674e0"

/dev/sda2: UUID="ffd2862c-029b-41a5-8677-0ca8eb8751c1" TYPE="ext4" PARTUUID="71b2c054-465a-4dc9-a997-0786ee1f53dd"

/dev/sda3: UUID="b1d418de-eb86-45b0-9841-76a135104c85" TYPE="swap" PARTUUID="449fe6df-c9e5-4e2c-8f2d-cfbce08847d0"

/dev/sdb1: UUID="2ef369a1-0330-4175-8651-f2da0a60ac01" TYPE="ext4" PARTUUID="15cf4ba6-d7b5-4f85-bc5e-38bf701296f1"

こちらでも、UUIDが"2ef369a1-0330-4175-8651-f2da0a60ac01"で、/dev/sdb1として認識されていることがわかる。

様々なハードディスクを接続している場合は、あらかじめlsblkコマンドで、以下のように対象のハードディスクを確認したうえで、blkidコマンドを利用した方が良い。

$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sda 8:0 0 465.8G 0 disk

├─sda1 8:1 0 512M 0 part /boot/efi

├─sda2 8:2 0 449.3G 0 part /

└─sda3 8:3 0 16G 0 part [SWAP]

sdb 8:16 0 2.7T 0 disk

└─sdb1 8:17 0 2.7T 0 part /home2 ※

sr0 11:0 1 1024M 0 rom

※ 上記の例では、すでに/home2にマウントしてしまっている ^^;。

 

$ sudo blkid /dev/sdb1

/dev/sdb1: UUID="2ef369a1-0330-4175-8651-f2da0a60ac01" TYPE="ext4" PARTUUID="15cf4ba6-d7b5-4f85-bc5e-38bf701296f1"

マウンティングポイントの作成

筆者の移設するハードディスクには、容量は大きくてもそれ程頻繁にアクセスしないファイルが多く含まれるDownloadsやMusicディレクトリを保存している。

ここでは、まずマウンティングポイントを/dev/home2とする。

$ sudo mkdir /home2

/etc/fstab への追記

次に/etc/fstabに追記し、起動時から/home2ディレクトリとして、アクセスできるようにする。

$ cat /etc/fstab

 

# /etc/fstab: static file system information.

#

# Use 'blkid' to print the universally unique identifier for a

# device; this may be used with UUID= as a more robust way to name devices

# that works even if disks are added and removed. See fstab(5).

#

# <file system> <mount point> <type> <options> <dump> <pass>

# / was on /dev/sda2 during installation

UUID=ffd2862c-029b-41a5-8677-0ca8eb8751c1 / ext4 errors=remount-ro 0 1

# /boot/efi was on /dev/sda1 during installation

UUID=02C3-21D2 /boot/efi vfat umask=0077 0 1

# swap was on /dev/sda3 during installation

UUID=b1d418de-eb86-45b0-9841-76a135104c85 none swap sw 0 0

/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0

# add H.Y 2020-07-04

UUID=2ef369a1-0330-4175-8651-f2da0a60ac01 /home2 ext4 errors=remount-ro 0 2

 なお、第6フィールドの数値は、fsckがチェックする順番だが、ルートファイルシステムは1を、それ以外は2を指定する。

以上で移設の作業は終了。

Tips

シンボリックリンクの活用

Tipsという程ではないが、以下のようにマウントポイントのディレクトリを変更すれば、通常のディレクトリと同様に利用可能になる。

例として、ユーザ名hogeが、Downloads ディレクトリを/home2/Downloads に移動する場合をあげる。

$ sudo mv ~/Downloads /home2/                     # これまでのデータを移動

$ sudo chown hoge.hoge /home2/Downloads

$ rm -rf ~/Downloads                                        # 既存のディレクトリを削除

$ ln -s /home2/Downloads Downloads             # シンボリックリンクを貼る

ゴミ箱の設置

新しく移設や増設したハードディスクは、通常ではゴミ箱にファイルを移動できないので不便だ。

これは、ゴミ箱がパーティションをまたいで利用できないのが原因のよう。

新しく移設・増設したハードディスクに以下のように.Trashディレクトリを作成することにより、便利に利用できるようになる。

sudo mkdir -m 1777 /home2/.Trash

おわりに

何かかわったら追記する。

関連ページ

ファイルのタイムスタンプを9時間戻す

(2021-03-01 初稿 - 2021-05-17 転記・追記)

 

LinuxでSDカード等からファイルを読み込むと、なぜか9時間進んだタイムスタンプになり不便。

9時間の時差が関係していると思っているが、対策がわからない。

デジカメの写真の場合は、以下のとおりjheadを使ってExifから正しい時刻に設定しなおしている。

(インストール)
sudo apt install jhead
(使い方)
jhead -ft hoge.jpg

その他のファイルは、設定方法がわからないので、以下のbashスクリプトを作った。

初めて知ったが、dateやtouchコマンドは、時間の引き算もできて便利。

cat ~/bin/chg-fst

#!/bin/bash
# 2021-03-01 start Written by hymd3a
# CHanGe File Time Stamp 9 hours ago

if [ $#  -ne 1 ]; then
  echo "[Usage] chg-fts file"
  echo "        Change file time stamp -9 hours"
  exit
fi

motofdate=$(date "+%Y/%m/%d %H:%M:%S" -r $1 )
chgfdate=$(date "+%Y/%m/%d %H:%M:%S" -d "$motofdate 9 hour ago")

touch -d "$chgfdate" $1

実行権を与える

chmod +x bin/chg-fst

使い方

(新規ファイルを作成)
touch file1

(ファイルのタイムスタンプを確認)
ls -l file1
-rw-r--r-- 1 hoge hoge 0  3月  1 15:46 file1

(ファイルのタイムスタンプを9時間戻す)
chg-fst file1

(ファイルのタイムスタンプを確認)
ls -l file1
-rw-r--r-- 1 hoge hoge 0  3月  1 06:46 file1

(複数のファイルを一括で変更)
for f in * ; do chg-fts $f ; done

また、何かわかったら追記する。

関連ページ

M5StackのWiFi設定について

(2020-09-24 初稿 - 2021-05-17 転記・修正 )

はじめに

M5Stackを購入して、一番面倒だったのは、WiFiの接続とその切替えだった。

WiFiSSIDやパスワードはとても複雑で、キーボードのないM5Stackで入力できるような代物ではない。

ネットで検索すると、簡潔でとても素晴らしいサイトを見つけた。

上記サイトによると、一度設定したWiFiは、変更しない限り再度接続できるとのこと。

ということは、普段良く使うことが想定されるWiFiを切り替えるスケッチと突然寄った店やホテル等で一時的に設定できるスケッチの2種類を併用すれば、WiFiの接続に関しては問題解決だ。

WiFiを簡単に切換えるスケッチ

まずは、WiFiを簡単に切換えるスケッチを、以下のとおり自作した。

Cもろくにわかっていない素人が作成したスケッチなので、参考程度に。

使い方は、普段良く使っているWiFiSSIDとPassword及びhome01等自分でわかる程度のコメントをWiFi構造体に入力しておく。

紹介した上記サイトでは、SSIDやPassWordのスケッチ内への保存は非推奨となっているが、このスケッチだけに入力して、他のスケッチには入力しない方針なのでご容赦を。m(__)m

上記のとおり、SSID、PassWord、コメントを入力したら、スケッチを起動する。

起動したら、BボタンでWiFiを番号の増加方向に、Cボタンで番号の減少方向に変更し、接続したいWiFiが現れたら、AボタンでWiFiの設定を行う。

しばらくすると、正常に接続し、IPアドレス等が表示されるので、電源ボタンで電源を切って、WiFiを利用する目的のスケッチを起動する。

ファイル名は、nSetWifi.inoとし、スケッチを以下に示す。

#include 
#include "M5StackUpdater.h"
#include 

struct wifi {
  const char* ssid;
  const char* pswd;
  const char* come;
};

struct wifi wifi[] = {
  {"Your SSID 01",  "Your Password 01", "Comment ex. home01"},
  {"Your SSID 02",  "Your Password 02", "Comment ex. job01"},
  {"Your SSID 03",  "Your Password 03", "Comment ex. job02"},
};

int MaxNum = sizeof(wifi) / sizeof(wifi[0]);
int num = 0;

void setup() {
  // put your setup code here, to run once:
  M5.begin();
  //checkSDUpdater();                 SD-Updaterを使う場合は//を削除
  display();
}

void display() {
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(0,0);
  M5.Lcd.printf("Please Push A,B,C Button\n");
  M5.Lcd.setCursor(0,220);
  M5.Lcd.printf(" [Set]     [Up]    [Down]");
  M5.Lcd.setTextSize(4);
  M5.Lcd.setCursor(40,120);
  M5.Lcd.printf("%i : %s", num, wifi[num].come);
}

//void set_wifi(const char* sid, const char* pwd, int n) {
void set_wifi(int n) {
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(0,20);
  M5.Lcd.printf("Set Wifi %s\n", wifi[n].come);
  WiFi.begin(wifi[n].ssid, wifi[n].pswd);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.print('.');
  }
  M5.Lcd.print("\r\nWiFi connected\r\nIP address: ");
  M5.Lcd.println(WiFi.localIP());
  delay(5000); 
  exit(0);
}

void loop() {
  M5.update();
  // Aボタン
  if (M5.BtnA.wasPressed()) {
    set_wifi(num);
  }
  // Bボタン
  if (M5.BtnB.wasPressed()) {
    if (num < MaxNum - 1) {
      num++;
    }
  display();
  }
  // Cボタン
  if (M5.BtnC.wasPressed()) {
    if (num >= 0) {
      num--;
    }
  display();
  }
}

作成するスケッチについて

上記のように、一度WiFiに接続すれば、変更しない限り再接続できる。

このため、自ら作るスケッチでは、以下のようにSSDI及びパスワードを記入しない。

以下に例を示しますので、参考に。

void setup() {
    WiFi.begin();
}

予めわからないWiFiに接続する

出先等でPC等がない場合に、急に接続したくなる場合は、アクセスポイントモードでESP32を起動して、ブラウザ経由で設定するsoftAPモードや、SmartConfigで設定する方法がある。

詳細については、最初に紹介した上記のリンク先を参照のこと(ここでは割愛)。

おわりに

また、何かわかったら追記する。

関連ページ

SD-Uploaderを使う

(2020-09-22 初稿 - 2021-05-17 転記・修正)

はじめに

購入したM5Stackで、小さなスケッチを作っているが、作成・変更するたびにUSBで接続してコンパイル・転送を実行していた。

一度、スケッチをM5Stackに転送してしまうと、一つ前や、その前に作ったスケッチが消失してしまい、それらを実行するためには、再度Arduino IDEで転送する必要があり、非常に面倒に感じていた。

Webで検索すると、とても良いスケッチをアップしてくださる方がいた。

このスケッチは、実行するスケッチをSDカードの中に保存しておけば、起動時に実行したいスケッチを選択できるようになるものだ。

インストールと準備

上記サイトから、gitまたはzipファイルをダウンロード。

M5Stack-SD-Updaterをコンパイルするためには、以下のライブラリが必要。

  • M5Stack Library (これは、Arduino IDEインストール時に入れたはず)
  • M5Stack-SD-Updater
  • ArduinoJSON

いずれも、Arduino Library Managerから検索して、インストールできるので、事前にインストールしておくこと。

続いて、以下の準備を実行する。

  1. M5Stack-SD-Menu.ino をコンパイル
  2. スケッチ」メニューの「エクスポート(コンパイルしたバイナリを出力)」でディレクトリにbinファイルを保存
  3. 保存したbinファイルを menu.bin に名前を変更
  4. コンパイルしたスケッチを、「右矢印マーク」または「スケッチ」メニューの「書込装置を使って書き込む」でM5Stackに送信

以上で準備は完了。

なお、以下のページにSD-Updaterに対応したバイナリファイルがあるので、お気に入りのスケッチをSDカードの中にコピーすれば選択・実行できるようになる。

SD-Uploaderの操作方法

左端のAボタンを押しながら、電源ボタンを押す(再起動)と、SD-Updaterが起動し、Cボタンでスケッチを選択し、AボタンでLOADすると、スケッチが実行できる。

スケッチを転送するための母艦が必要ないため、出先でも簡単にスケッチを変更して、実行することができるようになる。

自作のスケッチもSD-Updaterに対応させる

自分で、SD-Updaterに対応したスケッチを作る場合は、以下の2点のみスケッチに

書き加える。

#include の次の行に、以下の行を加える
#include "M5StackUpdater.h"

M5.begin(); の次の行に、以下の行を加える
checkSDUpdater();

とても簡単。後は、コンパイルしてバイナリファイルをSDカードに保存するだけ。

おわりに

世の中、不便に感じることは、既にどなたかが開発しており、このSD-Updaterも、そんなソフトフェアのひとつだと思う。

また、何かわかったら追記する。

関連ページ

DebianでG-PORTER GP102+を使う

(2021-08-15 初稿 - 2021-06-07 追記)

はじめに

筆者は、オートバイのツーリングや自転車でのポタリング、山のハイキング等、アウトドア生活を楽しんでいる。

これまで、スマフォのGPSのログ機能を使っていたが、GPSの精度がイマイチなのとバッテリー消費量の心配から、GPSの記録の専用のGPSロガーを購入した。

購入したGPSロガーは、CANMOREのG-PORTER GP102+(以下、GP102)で、2020年8月16日にAmazonで4,880円で購入した。

本体が100g程度で軽く、とても安いGPSロガーだ。

ちなみに、GP102に付属していたCDのソフトはWindows7用らしいので、Windows10をお使いの方にも多少参考になるかも(宣伝 ^^;)。

f:id:hymd3a:20210517091932j:plain

購入したGP102+

使い方

開封してマニュアルを見たが、GPSロガーを初めて使う筆者には、理解できなかったたので、以下のPDFファイルを検索しようやく使えるようになった。(^_^;)

以下のリンクのうち、日本語説明書というPDF。多謝

このページは、GP102+の使い方は上記PDFに譲り、以下ではdebianでの使い方を記載する。

Debianで使う

筆者の2020年8月現在の環境は以下のとおり。

Debian 4.19.132-1 (2020-07-24)

必要なファイル(FIT)の保存

ログを記録したGP102+を付属のUSBケーブルで接続すると、USBメモリ等と同様にファイルを開くか聞いてくる。

GP102+内のファイル構造としては、以下のとおり。

GP-102/
├── Activities
│   └── 005.fit
├── Device.xml
├── NewFiles
├── POIs
│   └── 001
├── Settings
│   └── Settings.dat
└── Trips

ここで必要になるファイルは、Activitiesに含まれるxxx.fitファイル。

ちなみに、FITとは、FIT (Flexible and Interoperable Data Transfer) の略。

ここでは、005.fitファイルを適当なディレクトリにコピーする。

gpsbabelのインストール

FITファイルはバイナリーファイルで、取扱いが面倒なので、ここではKMLファイルに変換してGoogle Earth等でログを確認する。

ちなみに、KMLとは、KML(Keyhole Markup Language)の略。

まずは、以下のとおり、gpsbabelをインストールする。

sudo apt install gpsbabel

GUIがお好みの方は、以下のとおりGUIのgpsbabelがインストールできる(必須ではない)。

sudo apt install gpsbabel-gui

FITからKMLへの変換

gpsbabelは、とてもたくさんのオプションがあるので、筆者は以下のサイトを参考にさせていただいた。多謝。m(__)m

コマンドで実行する場合は、以下のように実行する。なお、ここではホームディレクトリ直下に保存した006.fitファイルを006.kmlに変換する場合を示す。

$ gpsbabel -t -i garmin_fit -f ~/006.fit -o kml,line_width=2,line_color=ff0000ff,units=m,points=0,trackdata=0 -F 006.kml

オプションが多くて覚えきれないので、以下のbashスクリプトを作成した。

出力は、ファイルの「日付-時間.kml」にしたが、Linuxで読み取ると、ファイルの時刻が変になってしまう。(手抜き)^^;

元のfitファイルが単なる数字だったので、fitファイル名は日付のファイル名に変更した。

$ cat ~/bin/fit2kml

#!/bin/bash
# 2020-08-18 start Written by hymd3a
# convert fit to kml
# ver0.02 [2020-08-23] mv fit filename

if [ $#  -ne 1 ]; then
  echo "[Usage] fit2kml fit_file"
  echo "        output date-hms.kml"
  exit
fi

fbase=$(date "+%Y-%m-%d-%H%M%S" -r $1)
#echo $fbase 
gpsbabel -t  -i garmin_fit -f $1 -o kml,line_width=2,line_color=ff0000ff,units=m,points=0,trackdata=0 -F $fbase.kml

# add H.Y [2020-08-23]
mv $1 $fbase.fit

スクリプトを作成したら、chmod +x fit2kml で実行権を与える。

さらに、ディレクトリに保存されている???.fit(3ケタの数字)ファイルを一括して変換するには、以下のとおり実行する。

$ for f in ???.fit; do fit2kml $f; done

GUIで変換する場合には、下図を参考に変換すること。

なお、出力のオプションについては、コマンドのhelp等で調べてね。

f:id:hymd3a:20210517093932p:plain

GUI版gpsbabel

Google Earthのインストールとkmlの表示方法

Google Earthのインストール

Google Earthgoogleからダウンロードして以下のとおりインストールする。

ちなみに、Debian64bitの場合は、google-earth-pro-stable_current_amd64.deb ファイルをダウンロードする。

$ sudo apt install google-earth-pro-stable_current_amd64.deb

Google Earthでのkmlファイルの表示

インストールしたGoogle Earthを起動して、ファイルメニューから開くで、変換したkmlファイルを表示させる。

以下の例は、近所を自転車で走り、1秒間隔で保存したkml。 赤字のとおり、詳細な位置が記録されている。

f:id:hymd3a:20210517094543p:plain

Google Earthでの表示

このままでは、あまりおもしろくないので、以下のとおり建物を3D表示させ、経路をトレースさせる。

f:id:hymd3a:20210517095005p:plain

最下層のPathの選択

上図のとおり「保留」ディレクトリの最下層のPathまで表示させ、右三角形が表示された経路のアイコンのボタン(赤丸)をクリックすることにより、移動した経路を3Dで表示させながら、たどることができる。

f:id:hymd3a:20210517095423p:plain

移動した経路をトレース

csvファイルを作る

上記のスクリプトkmlファイルを作成し、Google Earthで楽しんでいたが、不要なデータがあること、また、バイク等の記録ではその時のスピードを知りたくなり、csvファイルも併せて出力するようにした。

まずは、fitファイルからcsvファイルを出力する場合は、以下のコマンドになる。

gpsbabel -t -i garmin_fit -f ~/006.fit -o iblue747 -F 006.csv

kmlcsvを一括して作る

kmlcsvファイルを一括して作るbashスクリプトを作成した。

また、ファイルのタイムスタンプが9時間ずれるので、修正するようにした。

#!/bin/bash
# 2020-08-18 start Written by hymd3a
# convert fit to kml and csv
# ver0.02 [2020-08-23] mv fit filename
# ver0.03 [2021-02-28] both kml cvs
# ver0.04 [2021-02-28] 9 hours adjust

if [ $#  -ne 1 ]; then
  echo "[Usage] fit2kml fit_file"
  echo "        output date-hms.kml"
  exit
fi

fday=$(date "+%Y/%m/%d %H:%M:%S" -r $1 )
fbase=$(date "+%Y-%m-%d-%H%M%S" -d "$fday 9 hour ago")
#echo $fbase
#fbase=$(date "+%Y-%m-%d-%H%M%S" -r $1)
#echo $fbase 

gpsbabel -t  -i garmin_fit -f $1 -o kml,line_width=2,line_color=ff0000ff,units=m,points=0,trackdata=0 -F $fbase.kml

# add H.Y [2021-02-28]
gpsbabel -t  -i garmin_fit -f $1 -o iblue747 -F $fbase.csv

# add H.Y [2020-08-23]
mv $1 $fbase.fit

gpxファイルも作る(2021-06-07 追記)

先日、yamapに登録したら活動の軌跡がgpxだった。

gpxファイルも扱えた方が良いと思い、以下のページをアップした。

ついでに、fitファイルからgpxファイルを作成する方法を示す。

gpsbabel -i garmin_fit -o gpx infile.fit outfile.gpx

 以下のサイトにyamapにアップする際に、あまり更新頻度が高いファイルを読み込むと累積標高が多くなるとのこと。以下のようにすると良い。

gpsbabel -i garmin_fit -x simplify,count=800 -o gpx infile.fit outfile.gpx

1分間に4点程度にする。

おわりに

ここまで、駆け足でGP102をDebianで使う方法を記載した。

いろいろな機器をLinuxで使う場合にも、あまり困らない便利な時代になって、とてもありがたい。(^o^)

また、何か気がついたら追記する。

関連ページ

Arduinoで土壌水分を測る(シールド YL-69)

(2021-03-28 初稿 - 2021-05-17 転記・修正)

 

はじめに

土壌水分センサーのYL-69を入手したので、Arduino Unoで計測のテストを実施した。

ちなみに、YL-69 は以下のとおり WINGONEER製でAmazonで購入した。

当初、M5Stackで利用することを想定していたが、情報が少なくうまく使えなかった。

どなたか、情報を持っている方は、教えてください。

接続方法

計測は、YL-69とArduinoを接続し、ArduinoRaspberry Pi または PC等を接続して計測することを想定している。これは、YL-69のデータがアナログ値で、Raspberry Pi等とはA/Dコンバータ(今回は、Arduinoがコンバータ)がないと直接は接続できない。

Raspberry Pi (or PC)  ⇔ Ardiuno Uno  ⇔ YL-69

ちなみに、接続や測定方法については、以下のサイトを参考にさせていただいた。多謝【Arduino Uno】  

Arduino nano】

YL-69と中間ボードの接続

YL-69と中間ボードの接続は、どちらでも可。

中間ボードとArduinoの接続

中間ボードとArduinoの接続は、以下のとおり。

AO    ⇔ A0

VCC  ⇔ 5V

GND  ⇔ GND

 

f:id:hymd3a:20210517083236j:plain

Arduino、中間ボード、YL-69の接続

f:id:hymd3a:20210517083403j:plain

中間ボード側の接続

f:id:hymd3a:20210517083451j:plain

Arduino側の接続

接続テスト

Arduino IDEを設定したPCまたはRaspberry Piで接続テストする。

まずは、Arduino IDEで以下のスクリプトを入力。

int val;

void setup(){
  Serial.begin(9600);
}

void loop(){
  val = analogRead(0);
  Serial.println(val);
  delay(1000);
}

次に、USB ケーブルでセンサーを付けたArduinoを接続して、IDEコンパイルしたスケッチをArduinoに送る

IDEのシリアルモニタで、数値を確認。

水分がない場合は、最大値の1023を示す。

水を入れたコップ等に浸し、値が小さくなることを確認する。

Pythonでデータを取得

取得データの加工等、今後の利便性を考えPythonでデータを取得する。

なお、シリアル通信を利用するので、インストールしていない場合は、以下のとおりserialパッケージをインストールする。

sudo apt install python3-serial

作成した簡単なコード

#!/usr/bin/env python3
#coding: UTF-8

# [2021-03-28] ver0.01 started by H. Yamada 

import serial

data = ''
ser = serial.Serial('/dev/ttyACM0', 9600)
data = ser.readline() 
ser.close()

result = data.decode()
print(result)

作成したコードの実行

./yl-69-serial.py 
1023

値が返ってくれば成功。

 

ひゃまだのblogインデックス - ひゃまだのblog