27-Oct-2020
[こういうものを組み立ててみました]

初歩のラジオ等でTTLとLEDを使ったゲーム機っぽいもの、イマドキだとこんな感じになるんですかねーということでAliExpressでキットを買ってみました。DIY Game Board Kit 51 SCM等のキーワードで見つけることができ、\1200前後で購入できるようです。

timg_20201024_065219_9.jpg timg_20201024_065232_2.jpg

必要な部品はすべて含まれていますが、説明書はありません。Soldering Practice Console Kitと書かれているだけあって、基板を見れば説明書が無くても分かるとは思います。

timg_20201024_065303_8.jpg timg_20201024_065313_2.jpg

とはいえ、8×8のマトリクスLED(1588BS)の向きは悩みました。マトリクスLED以外の半田付けを全て終えた状態で、マトリクスLEDの1588と書かれている面を手前(ボタン側)に向けて差し込み、簡単に動作確認をしてから半田付けするという手を使いました(これ、本当は良くないはずです)。

timg_20201024_092615_5.jpg timg_20201024_092639_6.jpg

組み立てた基板はケースに入れて、完成です。

timg_20201024_094559_7.jpg timg_20201024_094635_0.jpg

とりあえずテトリスと他3種のゲーム(未だに試したことが無いので分からない)が動くのと、音のon/off、輝度調整ができるようになっています。半田付けの練習キットとして売られているものではありますが、綺麗なケースが付いているので組み立てた後の達成感はかなりあると思います。

お隣の国の人達はこういうもので練習し、技術を学んでいくというのはちょっと羨ましいものがありますね。日本はどうなのでしょうか…と考えさせられる電子工作キットでした。53.25kg(07:00)

25-Oct-2020
[NFSおぼえがき]

随分前にLinuxマシンをNFSサーバとして使うようなことをしていた気がするけど、今度はOpenBSDマシンをNFSサーバにしてみようかなということで。NFS server on OpenBSDそのまんまではあるのですが…

サーバ側の設定ファイルは二つ。一つ目の/etc/exportsはこんな感じに記述。192.168.xxx.yyyはクライアントのIPアドレスで。


/usr/src /usr/ports -maproot=root 192.168.xxx.yyy

FreeBSDでは複数のディレクトリを公開する場合は一行にまとめないといけないとNFS サーバーの設定、 ディスクレス NetBSD HOW-TOに書かれていますが、OpenBSDのexports(5)の例でも一行にまとまっているのでこのスタイルで。あと、-maproot=rootを記述しないとクライアント側がrootであってもサーバ側の(root権限が必要な)ファイルへアクセスできません。

二つ目、/etc/rc.conf.localはこれを追加。


portmap_flags=""
mountd_flags=""
nfsd_flags="-tun 4"

nfs_server="YES"を指定した場合、/etc/rc.d/rc.subrの_rc_quirks()により、mountd_flags=""およびnfsd_flags="-tun 4"が指定されたものとみなされます。

クライアント側は、/etc/fstabにマウント先を記述するだけ。


192.168.aaa.bbb:/usr/src /usr/src nfs rw,nodev,nosuid,soft,intr 0 0
192.168.aaa.bbb:/usr/ports /usr/ports nfs rw,nodev,nosuid,soft,intr 0 0

192.168.aaa.bbbはサーバのIPアドレス。これもOpenBSDのfstab(5)にある例をそのまま引っ張っているので、rw,nodev,nosuid,soft,intrそれぞれの意味についてはGoogle等で調べてみてください(と放り投げる)。

Jumbospotの動作するBananpi BPI-P2をOpenBSD-6.8にアップデートしてみたものの、portsのバイナリパッケージが公開されなくなってしまったのか、自力でどうにかしないといけない状況にあります。microSDカード上でビルドするのもかなりしんどいので、NetBSDなりAlpine Linuxなりに乗り換えようかと考えていたのですが、ネットワークの口が付いているのでまずはNFS上で作業するとどんな感じになるか調べてから決めることにしました(なので、/usr/src, /usr/portsをマウントさせている)。

とりあえず、OpenBSD-6.8/armv7のカーネルビルドで評価してみましょうか。

NFS上でビルド
38m06.08s real 32m45.98s user 2m52.84s system
microSD上でビルド
37m20.78s real 32m40.41s user 2m39.07s system

あんまり変わらない、というのは…ストレージよりもむしろCPUの性能が低いと読み解くべきですかね(シングルコア動作ですし)。ソースコードのtar ballを展開するといった操作はmicroSD上でやるよりもNFSサーバ上でやってしまう方がはるかに快適なので、NFS併用による何かしらの利点はある…と思いたいです。54.25kg(20:40)

18-Oct-2020
[C++におけるtest("string")の"string"の型って?]

Arduino(のC++)でコード書く時に、ふと"string"等の文字列ってどんな型になるのか気になったので…テストのスケッチを書いて試してみました。使っている環境はArduino-1.8.13、avr-gcc-7.3.0が入っています。

char*const char*Stringresult
××String
××const char*
×const char*
××char*
×char*
×const char*
const char*

同じようなことをOpenBSD/amd64上で試すとどうなるか、見てみることにします。まずはgcc-4.2。char*型への変換については、deprecated conversion from string constant to 'char*'の警告が出ます。

char*const char*std::stringresult
××std::string
××const char*
×const char*
××char*
×char*
×const char*
const char*

次はgcc-8.3.0。こちらもchar*型の変換についてはISO C++ forbids converting a string constant to 'char*'の警告が。結果はgcc-4.2と同じになるので表は省略。

最後にclang-8.0.1。char*型への変換はgcc同様にISO C++11 does not allow conversion from string literal to 'char *'の警告が出ますが、char*とstd::stringの二つしか無い場合の挙動がgccと異なっています。

char*const char*std::stringresult
××std::string
××const char*
×const char*
××char*
×std::string
×const char*
const char*

普通はこんなこと意識しなくて済むはずなんですが、LoRaモジュールに関する変更申請を出す際の書類でRadioLib内の動きを説明する際に、radio.transmit("Hello, world!")がどの実行経路を通るか気になってしまいまして…とりあえずconst char*側を通るだろう、で書き上げて出してしまいましたけど念のため調べてみたということで。

という訳で、JG1UAA(移動する局)は電話級の従事者免許証と紐付けが終わっている状態なのですが、JG1UAA(移動しない局)についてはまだ連絡が無いため、電信級化は終わっていない状態です(まだ一アマのままになっている)。54.00kg(15:00)

11-Oct-2020
[D-STARに浮気する気は無いです]

ここ数日、dmonitorが随分と頻繁に更新されているのを見て、一体何をやっているのかという興味が湧き少し追いかけていました。

サーバ接続時の認証にdmonitor自身のMD5を使用しているようだというtweetを今年の6月頃に見ており、このときOSDNのrpi-dmonitorにあるコードを調べています。特にMD5を扱うような部分が見つからなかったことに加え、2019年11月9日以降にソースコードの更新が無いことがずっと引っかかっていたというのが理由です。

とりあえず、配布されているバイナリと同等の物を生成するソースコードがどこかにあるかもしれないと思って探してみたところ、JK1ZRWの作業部屋にあるrpi-dmonitorがそれっぽく見えます。これでビルドができるかどうかを試してみたものの、いくつかのファイル(node.h, rpt_conn_lcd.c)が欠けているために、現状では動作可能なバイナリを得ることができません。また、ソースコードにはライセンスが一切設定されていないため、forkすることで何らかの(法的な)攻撃を受ける危険性がありそうです。

とはいえ、どんな作業をしたかを残せないのも困りますので、revision 1653b845297c53b4728febb75e45d88aefe1dbb1のビルドを強引に通すためのdiffを置いておきます。Banana Pi BPI-P2上で動作するAlpine LinuxにBPI-WiringPi2他必要なライブラリをインストールし、コンパイラによる大量の警告が出るもののバイナリが得られることを確認しています。当然ですが、本来存在しなければならないファイルを強引な方法でごまかしているため、正常な動作はできません。

バージョンアップの度に2Gbyte近くあるOS入りのファイルをダウンロードさせて起動用のディスクをまるごと作り直させるのは何故か、正式に公開されているソースコードとは異なるソースコードを使って生成したバイナリをあたかも正式であるかのように公開するのは何故か、ソースコードにライセンスを設定せずに公開するのは何故か、とにかくD-STAR界隈はよく分からないことが多すぎます。(54.35kg)

08-Oct-2020
[壊したかなー…(2)]

27-Sep-2020の続き。

仕方がないのでストックからLGT8F328Pを載せたArduino Nanoもどきを一枚取り出し、brother-yan/LGTISPでFlashROMの内容を読み出してみました。LGTISPは通信速度を115200bps→19200bpsに落とし、SERIAL_RX_BUFFER_SIZEを拡張しなくて済むような修正を行い、avrdude -c usbasp -P usb -p m328p -U flash:w:LGTISP.ino.with_bootloader.standard.hexでUSBaspを使ってbootloaderごとArduino UNOに書き込んでおきます。

LGTISP化したArduino UNOとLGT8F328Pを載せたArduino Nanoもどきの結線は、

とします。Arduino Nanoもどきは3.3Vで動作する設定になっていますが、ジャンパの設定で5V動作も可能です。とはいえいじるのも面倒なので…LGT8F328のVccは基板のVIO端子に繋がっていることを利用し、ここに5Vを印可して動かします(前回うまく動かなかったのは、多分ここが原因という気がします)。これにより、5Vで動作するArduino UNOともうまく繋がるはずです。

avrdude -c avrisp -P /dev/ttyU0 -b 19200 -p m328p -U flash:r:test.hex:iで読み出した結果を見るに、ストックしてあったものについてはきちんとFlashROMにbootloader等が書き込まれているようです。不可解なのは、読み出した後に(予め書き込まれていたと思われる)Blinkが動作しなくなっていたのですが、これはBlinkのスケッチを再度Arduino IDEから書き込むと直っています。

どうにかここまではできたのですが、今度はArduino UNOが壊れたのか作業が進まなくなってしまいました。USBaspで書き込もうとしてもtarget doesn't answerと言われてしまうので、もしかするとATmega328Pを壊したのかも…とりあえずATmega328Pを早急に発注し、作業の続きを行いたいところです。ATmega328Pの問題でなかった場合については今のところ考えない方向で(考えたくない)。53.85kg(21:20)

09-Oct-2020補足:LEDが点灯しっぱなしだったのでオペアンプを交換して直したArduino UNOに載っていたATmega328Pと交換しても動かなかったので、使っていたArduino UNO(実はこれもArduino UNOもどき…説明としてはaitendoのびんぼうでいいの[U3R]と同じ物です)が壊れていると判断しました。

交換した方のArduino UNOでLGTISPを動作させてみましたが、ストックしていたLGT8F328Pを載せたArduino Nanoもどきからは書き込んだBlinkが読み出せたものの(読み出した後はやっぱり動かなくなっている)、動かなくなってしまった物については0xffしか読めていません。また、書き込みもできません。

04-Oct-2020
[雑ネタ。]

ちゃっちゃとまとめます。

とりあえずNetBSD+MMDVMHost+ArduiPi_OLED+UserDBが動くようになったので、次をどうしようかな…LoRa関連の書類書き?(まだ手を付けていない)54.25kg(20:20)

01-Oct-2020
[Alpine LinuxをBanana Pi BPI-P2で試す]

いちいち公式のUbuntuなイメージでLinuxを試すのも面倒というか、単にそれを入れるだけのmicroSDが余ってない(今投入できるのが4GB物しかない)ということで、Alpine Linuxを試してみようかと。

使えそうなインストール用パッケージは、今のところdownloadsにあるGENERIC ARMのarmv7一択。インストール手順はClassic install or sys mode on Raspberry Piが参考になりそうなのでこれを参考に、起動ディスクの作成はOpenBSD向けにアレンジします。

手順は長く、かつ面倒なので要点を先に書いておきます。

ext4モジュールのロードをわざわざ強調しているのは、これを忘れていたために思いっきりハマっていたから。という訳でこの部分は特に注意して作業しましょう。まずは起動ディスクの作成から。

  1. fdisk -e /dev/rsd1c (/dev/rsd1cはmiscoSDに対応したデバイス)で区画の作成。最初の区画をLBA 2048から256Mbyteをtype 0x0e(FAT16L)、この後に続く空き領域はtype 0x83(Linux)と必要に応じtype 0x82(Linux swap)で。自分はFAT16→Linux swap(512Mbyte)→Linuxの順で作っているのでこの後の説明もこれに準じます。
  2. newfs_msdos /dev/rsd1i でFAT区画をフォーマット。
  3. mount_msdos -l /dev/sd1i /mnt; cd /mnt; tar zxf /path/to/alpine-uboot-3.12.0-armv7.tar.gz でインストール用イメージを展開。mount_msdos -lでLFNの使用を強制しておくこと。
  4. デフォルトのインストール用イメージに含まれるBPI-P2用Device TreeではEthernetを利用できないので、/mnt/boot/dtbs-lts/sun8i-h2-plus-bananapi-m2-zero.dtbを適切な物に置き換える。
  5. umount /mntでFAT区画への作業は終了。
  6. dd if=u-boot-sunxi-with-spl.bin of=/dev/sd1c bs=1024 seek=8 でU-bootの書き込み。

作成したmicroSDをBanana Piに挿入して起動し、デバッグ用シリアルポートに接続した端末で作業を続けます。

  1. root(パスワード無し)でログイン。
  2. setup-alpine で初期設定。基本的にデフォルトで良いが、日本に住んでいるならtimezoneはAsia/Tokyo。最後のstore configsとapk cache directoryはどちらもnone。
  3. (swapを使う場合)RedHatのSWAPファイルを作成するを参考に、dd if=/dev/zero of=/dev/mmcblk0p2 bs=1M count=XXXX でswap領域をクリア(countの値は作成した区画サイズのMbyteとする)後、mkswap /dev/mmcblk0p2 で作成。swapon /dev/mmcblk02 で有効にできる(swapの状態はcat /proc/swapsで見るのが早い)。
  4. apk update で最新のリポジトリ情報を取得。
  5. apk add e2fsprogs; mkfs.ext4 /dev/mmcblk0p3 でLinux区画をフォーマット。
  6. mount /dev/mmcblk0p3 /mnt; setup-disk -m sys /mnt でインストール。

この時点ではLinux区画にファイルを入れただけの状態なので、システム起動用のFAT区画を編集して起動できるようにします。

  1. mount -o remount,rw /media/mmcblk0p1 でFAT領域の読み書きを可能にする。
  2. cd /media/mmcblk0p1; mv boot boot.old でFAT区画にある古い起動用ファイルを格納したディレクトリをリネーム(原典では削除しているが、失敗した時に復旧しやすくするようここでは残している)。
  3. cp -r /mnt/boot /media/mmcblk0p1 で新しい起動用ファイルをコピー。シンボリックリンクに関するエラーが出るがこれは無視。
  4. cd /media/mmcblk0p1; /media/mmcblk0p1/boot/dtbs-lts/sun8i-h2-plus-bananapi-m2-zero.dtb をEthernet対応の物に再度置き換える。
  5. cd /mnt; mv boot boot.old でLinux区画にある起動用ファイルを格納したディレクトリをリネーム(ここも敢えて残している)。
  6. mkdir /mnt/media/mmcblk0p1 でFAT区画のマウント先となるディレクトリを作成。
  7. ln -s media/mmcblk0p1 /mnt/boot でLinux区画のbootがFAT区画のbootディレクトリを示すようにする。

作業はあと少し、起動時にマウントするディスクの設定と、起動するディスクの設定です。

  1. cp /mnt/etc/fstab /mnt/etc/fstab.orig でバックアップを作っておく。
  2. cat /mnt/etc/fstab で/にマウントされるディスクのUUIDと、blkid /dev/mmcblk0p3 で表示されるUUIDが念のため同じであることを確認する。
  3. (swapを使う場合)echo "/dev/mmcblk0p2 swap swap defaults 0 0" >> /mnt/etc/fstab でswap区画を追加する。
  4. cd /media/mmcblk0p1/extlinux; mv extlinux.conf extlinux.conf.orig とリネームしておく。
  5. grep -v "^APPEND modules=" extlinux.conf.orig > extlinux.conf でAPPEND modules=を外したextlinux.confを作成。
  6. echo "APPEND root=/dev/mmcblk0p3 modules=loop,squashfs,sd-mod,usb-storage,ext4 quiet" >> extlinux.conf でカーネルオプションを設定。
  7. reboot で再起動。再起動後のrootのパスワードはsetup-alpineで設定した物と同じ。

BPI-P2上で動くUbuntu以外のLinux環境を構築できたので、この上でもMMDVMHost+ArduiPi_OLEDを試してみましょうかね。54.80kg(05:10)