mattintosh note

田舎エンジニア物語 〜In Search of the Lost My Private Key〜

VirtualBox に macOS Catalina 開発環境を作る

不具合報告多数の Catalina さん。開発用なら問題ないでしょうが実機に入れる気にはならないですね。

いつも通りインストール用の ISO 作成。Mojave のときに作っておいたものがそのまま使えたので変数だけ書き換え。8 GB を超えているのでイメージサイズは 9 GB に変更。

#!/bin/bash
 set -e
 set -u
 set -x

name=Catalina
tempfile=$(mktemp -u)
hdiutil create -size 9g -fs HFS+J -layout SPUD ${tempfile}
hdiutil attach ${tempfile}.dmg -noverify -nobrowse -mountpoint /Volumes/Install\ macOS\ ${name}
sudo /Applications/Install\ macOS\ ${name}.app/Contents/Resources/createinstallmedia --nointeraction --downloadassets --volume /Volumes/Install\ macOS\ ${name}
hdiutil detach /Volumes/Install\ macOS\ ${name}
hdiutil resize -size $(hdiutil resize -limits ${tempfile}.dmg | awk 'END { print $1 }')b ${tempfile}.dmg
hdiutil convert ${tempfile}.dmg -ov -format UDTO -o "Install macOS ${name}"
rm ${tempfile}.dmg
mv Install\ macOS\ ${name}.{cdr,iso}

最初のインストール中に再起動してまた ISO から起動するので一旦ディスクを取り外して VM を再起動する。インストール完了後、再起動するが VirtualBox が APFS のパーティションを認識出来ないため再び ISO をセットしてインストーラーのユーティリティからターミナルを起動する。

APFS を読み取れるようにインストーラーに付属されている apfs.efiEFI ボリュームにコピーする。ついでに自動起動するように startup.nsh を作成するが、システムボリュームの UUID を調べておく必要がある。例えばディスクの初期化時に名前を Macintosh HD とした場合は disk1s5 がソレ。

f:id:mattintosh4:20191017161134p:plain
macOS Catalina

volume=disk1s5

# ボリュームの UUID を取得
uuid=$(diskutil info ${volume} | awk '/Volume UUID:/ { print $NF }')

# EFI ボリュームをマウント
diskutil mount /dev/disk0s1

# APFS EFI ファイルを EFI ボリュームにコピー
cp /Volumes/macOS\ Base\ System/usr/standalone/i386/apfs.efi /Volumes/EFI

# startup.nsh を作成
cat >/Volumes/EFI/startup.nsh <<!
load fs0:\apfs.efi
map -r
fs1:\${uuid}\System\Library\CoreServices\boot.efi
!

案の定、糞重い。ディスクイメージの使用サイズは 26 GB くらい。40 GB くらいで用意しておかないと何も出来なさそう。

f:id:mattintosh4:20191017161849p:plain
macOS Catalina

同人イベントにサークル参加してきました

以前お知らせした通り、東方Projectの同人イベント「第六回博麗神社秋季例大祭」にサークル参加してきました。

色々あって辞退することも検討していたのですが、頑張って参加して良かったなと思っています。当日お越しいただいた皆様ありがとうございました。

当日はこんなコピー本を頒布しておりました。

台風19号が来る前にスキャナーが届いたので今後の自分のためにレポート的なものを残しておこうかなとかなんとか。

以下、素人の下手な絵がダラダラと続きますので苦手な方は閲覧をお控えください。

2019年 絵を描き始める

3D のモデリングをしてみたいけど 2D からしっかりやった方がいいよなぁ、ということで練習のために『深夜の真剣お絵描き60分一本勝負(通称ワンドロ)』というものを始めることにしました。派生で『艦これ版』とかもありますが、Twitter やってる方なら見たことあるのではないでしょうか。絵を描くのなんて小学生以来なので完全初心者スタートです。

この辺の落書きは Pixiv にあります。

東方Projectの同人誌とかはいくつか持っているのでなんとなくキャラはわかるんですが、実際絵を描くとなると難しい。というのも東方Projectは原作絵が少ないためネットやお店で見かける絵は大抵が二次創作なんですね(公式書籍なんかもあったりしますが絵師さんが描いてたりします)。他のアニメやゲームなんかに比べると元絵が少ないので本当に頭を使います。

ワンドロをやりつつ、お次は『ポーズマニアックス』の『30秒ドローイング』ですね。3D の人体模型を見ながら模写するってやつです。普段あまり人体とか気にせず見てますが改めて見ると人体って面白いなぁと思います。30秒は無理なので60秒か90秒で数日やってました。

f:id:mattintosh4:20191011175830p:plain
ポーズマニアックス(2019年4月22日)

そしてこのあたりを境目に絵を描くのを辞めました(早

仕事でメンタルやられてしまったのと、万年筆に嵌って字ばっかり書いてたんだと思います。6月11日に万年筆インク『色雫彩 - 霧雨』を買ったので霧雨魔理沙っぽい何かを描いていたようです。

f:id:mattintosh4:20191011181850p:plain
落書き(2019年6月11日)

かゆ…

うま…

表紙を考え始める

8月半ばになってもモチベーションが上がらないものの「最低限、表紙が無いと告知も何も出来ないな…」と思ったので表紙に手を付けることにしました。A5のノートにざっくりとイメージを描いてみる。魔理沙がエンジニアという設定なので楽天とかでオフィスカジュアルな服を見てみたけどあまりピンと来るものがなく衣装はとりあえずという感じ。(日本のIT現場ってだいたい男しかいないからね)

f:id:mattintosh4:20191011142955p:plain
表紙ボツ案ラフ(2019年8月20日

どうも「ペンタブの描いてる場所と描画場所が違う」というのに慣れなくて出来ればアナログでやりたかったんですが、デジタルの方が何かと楽なので頑張ってデジタルを使うことに。ペンタブは昔、プレゼンとかで使えれば楽だなと思って買ったもののほとんど使ってなかったワコムの『CTH-490』(元 Bamboo シリーズの一番小さいやつ)。

スキャナを持っていないので iPhone で撮影してペイントソフトに取り込む。Linux に対応しているペイントソフトはほとんど無いので Krita を選択。色塗るわけじゃないし、線画ならなんとかなるでしょ。ブラシとか何を使ったらいいのかよくわからなかったのでとりあえず "Ink-3 Gpen" を使ってみる。ペンタブを真面目に使うのも初めてだったのでトレースするだけなのに滅茶苦茶手こずった。このとき平行定規などの機能を知って遊んだりしてた。

f:id:mattintosh4:20191011143047p:plain
表紙ボツ案線画(2019年8月20日

「よーし、とりあえず表紙案も出来たし、受かるかどうかもわからないけど何とかなるだろ!」

とか思っていました。

参加証が届く

当落通知はもう少し早く出ていたんですが受かってしまいました。サークルスペースが「うぅ、お腹痛いブー(う07b)」だったって言うね。

よし、本文やるぞ!あれ?表紙のキャラデザで絵が描けない…左綴じ…コマ割り…

とりあえずで作った表紙だけど、実際本文をやってみようと思うと自分の力量不足で表紙のキャラデザで絵が描けないということに気づいた。アニメやゲームではキャラの設定画を用意されていたりするけど、ああいうものを作っておいた方がいいんだろうなとは思ったもののとりあえず表紙のラフを目の前に貼り付けて「本文描いてるうちにキャラデザ決まるだろ」なんて思いながら本文を考えることにした。

当初は普通の漫画を予定していたのだけど、技術書と言えばほとんどが左綴じだが、一般的な漫画は右綴じである。つまり左綴じ用にレイアウトを考えなくてはならない。参考になる資料が同人即売会イベントのカタログに収録されているちょっとした漫画の部分くらいしか無く、コマ割り自体結構悩むのに左綴じのコマ割りが出来なかった。「両面表紙で技術書は左から読んで、漫画は右から読めばいいのでは!?」というアホな構成も考えたけど特殊過ぎるのでやめた。

四コマなら左綴じでもなんとかなる気がしたので四コマで考えることにした(どんどんハードルが下がる)。四コマと言えば『起承転結』が肝心だけどその辺を気にする余裕も無くなってきた。

f:id:mattintosh4:20191011151637p:plain
本文ラフ①

久しぶりに描いたらまた絵柄が変わってしまったので多分キャラのデザインをちゃんと考えようと思ったんだろう形跡が残っていた。日付が9月12日なので既にイベントまで一ヶ月を切っている。

f:id:mattintosh4:20191011151753p:plain
落書き(2019年9月12日)

とりあえず髪の毛は細めのものを束ねることにして本文を進めるがこれまた絵柄が安定しない。どうも三頭身とかが描けないっぽい。

f:id:mattintosh4:20191011153506p:plain
本文ラフ②

キャラデザをちゃんと考える

時間も技術もなくて流石に危うくなってきたので東方鈴奈庵の絵柄を参考にさせてもらうことにした。髪型で悩んでいる節があったので髪型さえ決まればなんとかなる気がしたんだと思う。衣装も考えている余裕がなかったので鬼形獣のものを参考にした。

f:id:mattintosh4:20191011153810p:plain

f:id:mattintosh4:20191011153848p:plain

キャラデザ

表紙も再考。何故か二頭身になった。ちなみにこの後また絵柄が変わったのでこの絵柄というか頭身の魔理沙は表紙にしか出てこない。

f:id:mattintosh4:20191011142851p:plain

f:id:mattintosh4:20191011142857p:plain

表紙再考案

Krita に取り込んでアイコンと表紙を描いてみる。この辺からちょっとやる気出てきた気がするけど既に9月27日。

素材作成と表情の練習用に顔のパーツを変えたものをいくつか作った。ひとつずつ保存するの大変だったけど楽しかった。

f:id:mattintosh4:20191011160639p:plain
魔理沙アイコン

本文との戦い

なんとかキャラデザが決まったので本文のラフを描く。自分は右利きなので本来であれば左向きの顔の方が描きやすいのだが、左綴じを意識してしまっているせいか右向きが多い。

f:id:mattintosh4:20191011161117p:plain
本文②ラフ

Krita に取り込んでトレースしていく。ノートではスペースが無かったので見えない部分も含めて構図を考えてみるがなんか違う気がしてなかなか進まない。

f:id:mattintosh4:20191011162935p:plain

f:id:mattintosh4:20191011163352p:plain

Krita で線画

ちょっと本文の線画を置いといてパース考えながら練習してみる。

f:id:mattintosh4:20191011164714p:plain

f:id:mattintosh4:20191011164720p:plain

練習①

f:id:mattintosh4:20191011165029p:plain

f:id:mattintosh4:20191011165053p:plain

練習②

f:id:mattintosh4:20191011165359p:plain

f:id:mattintosh4:20191011165420p:plain

練習③

f:id:mattintosh4:20191011165646p:plain

f:id:mattintosh4:20191011165713p:plain

練習④

f:id:mattintosh4:20191011170136p:plain

f:id:mattintosh4:20191011170203p:plain

練習⑤

f:id:mattintosh4:20191011170250p:plain

f:id:mattintosh4:20191011170317p:plain

練習⑥

お前はデフォルメキャラで描きたくないんかい!って突っ込みたくなる。そして写真やってた癖にパースわかってないのな…。迷い線は少なくなってきた気がするけど、どんな絵を描きたいのかわからなくなってきたので一旦練習を止めて本文の別のページに手を付けることにした。

2日後

改めて練習してみると2日前と絵柄が変わってしまった…。アタリが適当過ぎてあまり役に立っていない。

f:id:mattintosh4:20191011172111p:plain

f:id:mattintosh4:20191011172139p:plain

練習⑦

ポーズマニアックスをやってたせいか、これくらいの頭身の方が描きやすいっぽい。

新しいデフォルメを考える

本文でデフォルメキャラを使うコマがあったがラフのはコレジャナイ感がしたので新しく考えることにした。

f:id:mattintosh4:20191011161343p:plain
本文③ラフ

「なんかもうちょっと可愛らしい感じの…う〜ん」って悩みながらラフをカリカリ…。デフォルメって描き慣れていないので本当に難しい。

f:id:mattintosh4:20191011171021p:plain
デフォルメ(ラフ)

まぁまぁいい感じのが出来た気がする。後ろ髪はバランスのいい線が描けず時間も無かったので今回は省略することにした。

f:id:mattintosh4:20191011171352p:plain
デフォルメ(線画)

まぁまぁ衣装もいい感じで描けた気がする。これ描いてるのがイベント3日前なので結構焦ってたかも。

猫耳つけてみたら案外よかったので猫耳バージョンを裏表紙で使った。

印刷

秋葉原製作所さんに行ってセルフ製本してきた。店員さんが丁寧にサポートしてくれたのでスムーズに出来た。表紙と本文を分けてしまったので表紙を印刷後に裁断機でフチを落としてそのあと別のプリンターで中綴じっていうちょっと面倒なことになったけど。

今回の作業は Mac mini でやってたんだけどメモリが 4 GB しか無かったのでモノクロ 350 dpi で作業してたんだけど小さいアイコンもちゃんと表情がわかるくらい綺麗に出てくれたので助かった…。

イベント当日

あんまり早く行ってもすることが無いのでゆっくり行った。サークル登録しに行ったときに登録証が無かったときは焦ったけど通行証と一緒に付いてた…。

一応、前日にセリアでイーゼルとクラフト紙を買っておいたのでそれっぽく設営。秒で終わったけど。

開場後はカタログ見たりして時間潰してたんだけど1時間に1、2人くらいのペースで足を運んでくれる人がちらほら。昼過ぎまでソロ参加だったからずっとスペースにいたけど人間ウォッチングとかしてたりしたらあっという間に時間が過ぎてたな。

次回に向けて

冬コミも申し込んだけど定員割れすることは無いし落ちる可能性は高いでしょうね。来年の博麗神社例大祭は静岡開催なのでちょっと難しそうだし。

とりあえず今回のプレビュー本の完成版を作って、次回はイラスト本が作れればいいかなぁと思っています。イラスト本が簡単ってわけではないんだけど、漫画は色々と考えなきゃいけないことが多い…。今は東方Projectしか描いてないので他のジャンルも描いてみたりしたいですね。まずはメンタル回復させて絵を描くことを日常的にしなくてはいけないわけですが…。

身内で絵を描く交流が出来れば楽しそうなんだけど周りにいないので寂しい…(´・ω・`)

それでは台風19号にお気をつけてまた今度。

LoRa モジュール RAK811 WisDuo Lora Module で TTN に接続する

SX1276 と STM32L を搭載した RAK 社製の LoRa モジュールを AliExpress で入手した。AK811 を選んだ理由は下記の通り。

f:id:mattintosh4:20190822175421p:plain
RAK811 WisDuo LoRa Module

  • 小さい(大事)
  • 値段が安い(だいたい $15 くらい)
  • ARM 環境での開発にちょっと興味があった

RAK811 は ARM 開発環境が無くても AT コマンドで LoRaWAN や LoRaP2P の設定ができるようなので今回は AT コマンドで遊んでみる。

RAK811 に関する情報収集

物は届いたのでまずは情報収集から始めた。

  • ピンヘッダは 2 mm ピッチなのでそのままではブレッドボード等に挿すことはできない。XBee のピッチ変換基板が流用できるっぽい?(海外掲示板情報)
  • ドキュメントにはファームウェアの更新方法が記載されているが、3.0.0.x 系の場合は BOOT ピンを使わなくてよい。(ドキュメントには If the firmware of your RAK811 WisNode is V3.0.0.0 or a newer one, just jump this section. と書かれている)
  • ファームウェアの更新には RAK LoRaButton Upgrade Tool というソフトを使うがこれが Windows しか対応していない様子(Wine でもなんとかできるかも)

ブートモードからノーマルモードに戻せない

これを先に書いておきたい。picocom コマンドで at+set_config=device:boot を送ってブートモードに移行すると AT コマンドを受け付けてくれなくなるため、at+run を送ってノーマルモードに戻すということができなくなる。この状態になってしまった場合はシェルのリダイレクトを使って at+run を書き込むことでノーマルモードに戻すことができる(ここでの USB シリアルアダプタのパスは /dev/ttyUSB0 だが環境によって異なる)。Arduino IDE のシリアルコンソールで改行コードを Both NR & CR に設定して AT コマンドを叩くという方法でも OK。何故か picocom のときはこうなる。

$ printf 'at+run\r\n' >/dev/ttyUSB0
Stop Boot Mode


========================================================
______  ___   _   __  _    _ _          _               
| ___ \/ _ \ | | / / | |  | (_)        | |              
| |_/ / /_\ \| |/ /  | |  | |_ _ __ ___| | ___  ___ ___ 
|    /|  _  ||    \  | |/\| | | '__/ _ \ |/ _ \/ __/ __|
| |\ \| | | || |\  \ \  /\  / | | |  __/ |  __/\__ \__ \
\_| \_\_| |_/\_| \_/  \/  \/|_|_|  \___|_|\___||___/___/
========================================================
********************************************************
RAK811 Version:3.0.0.3.H
********************************************************
========================================================

ファームウェアの更新

購入時のファームウェアは 3.0.0.0 だったが、一部のコマンドの改行がおかしかったので 3.0.0.3.H に更新した。ここでは RAK LoRaButton Upgrade Tool V1.0 を使用してファームウェアを V3.0.0.0.H から V3.0.0.3.H へ更新する。

最新のファームウェアは下記のページからダウンロードできる。

USB シリアルアダプタとの接続は VCCGNDTXRX のみで BOOT は接続不要。シリアル接続時の設定は下記の通り。

  • ボーレート: 115200
  • フローコントロール: オフ
  • パリティ: オフ
  • データビット: 8
  • ストップビット: 1

ここでは picocom コマンドを使用するが、Arduino IDE のシリアルコンソールでも設定可能。ローカルエコーを有効にしておかないと入力したコマンドが見えないので注意(見えなくても慣れればそのまま操作できるけど)。

Terminal

$ picocom -b 115200 --echo /dev/ttyUSB0

まずはブートモードに変更する。

AT Command

at+set_config=device:boot

Result

work in Boot mode now...
<BOOT MODE>

ブートモードに設定できたら Ctrl + aCtrl + xpicocom を終了する。この状態で RAK LoRaButton Upgrade Tool で新しいファームウェアRUI_RAK811_V3.0.0.3.H.bin 等)を選択して[Start]を押せば新しいファームウェアが書き込まれる。

macOSLinux の場合はどうするのか?

Windows 10 の評価版などを入手して VirtualBox にインストールしてホストの USB シリアルポートをバイパスさせることでゲストの Windows 10 から RAK LoRaButton Upgrade Tool を使って書き込みができる。Wine でもなんとかできるかも。

stm32flash についてはまだ試していない。

TTN への接続(OTAA)

デフォルトでは OTAA モードになっているが ABP でもほとんど変わらない。

まずは get_config=lora:status で現在の状態を確認する。

AT Command

at+get_config=lora:status

Region が AS923 になっていないのと DevEUI、AppEui、AppKey などが設定されていないのでこれらを設定していく。

Result

OK.
*************************************************
==============LoRaWAN Status List================
Region: EU868
Join_mode: OTAA
DevEui: 0000000000000000
AppEui: 0000000000000000
AppKey: 00000000000000000000000000000000
Class: A
Joined Network:false
IsConfirm: false
Work Mode: LoRaWAN
AdrEnable: true
EnableRepeaterSupport: false
RX2_CHANNEL_FREQUENCY: 869525000, RX2_CHANNEL_DR:0
RX_WINDOW_DURATION: 3000ms
RECEIVE_DELAY_1: 1000ms
RECEIVE_DELAY_2: 2000ms
JOIN_ACCEPT_DELAY_1: 5000ms
JOIN_ACCEPT_DELAY_2: 6000ms
Current Datarate: 5
Primeval Datarate: 5
ChannelsTxPower: 0
UpLinkCounter: 0
DownLinkCounter: 0
AntennaGain: 2.15
===================List End======================
*************************************************

Region の設定

周波数は下記のコマンドだけで設定できる。設定可能な値は EU868EU433CN470IN865EU868AU915US915KR920AS923。日本で使用できるのは AS923

AT Command

at+set_config=lora:region:AS923

デフォルトのデバイス EUI が返ってくるが TTN のコンソールで発行できるので控えておかなかったとしても問題はない。

Result

DEFAULT DEV_EUI = 9B0100089D010008
Selected LoRaWAN 1.0.2 Region: AS923
Band switch success.
OK

Region が変更されたか確認する。

AT Command

at+get_config=lora:status

Region が AS923 に変更されている。周波数の値も 923200000 になっている。

Result

OK.
*************************************************
==============LoRaWAN Status List================
Region: AS923
Join_mode: OTAA
DevEui: 0000000000000000
AppEui: 0000000000000000
AppKey: 00000000000000000000000000000000
Class: A
Joined Network:false
IsConfirm: false
Work Mode: LoRaWAN
AdrEnable: true
EnableRepeaterSupport: false
RX2_CHANNEL_FREQUENCY: 923200000, RX2_CHANNEL_DR:2
RX_WINDOW_DURATION: 3000ms
RECEIVE_DELAY_1: 1000ms
RECEIVE_DELAY_2: 2000ms
JOIN_ACCEPT_DELAY_1: 5000ms
JOIN_ACCEPT_DELAY_2: 6000ms
Current Datarate: 5
Primeval Datarate: 5
ChannelsTxPower: 0
UpLinkCounter: 0
DownLinkCounter: 0
AntennaGain: 2.15
===================List End======================
*************************************************

バイス EUI、アプリケーション EUI、アプリケーションキーの登録

TTN Console でデバイスを登録したら各値を控えておく。EUI は 16 桁、KEY は 32 桁の 16 進数。

dev_eui: 9B59615D543BC6F3
app_eui: 240A0F2375D286F8
app_key: 62DC6A9880FBE606F3503DB057946817

バイス EUI の登録

AT Command

at+set_config=lora:dev_eui:9B59615D543BC6F3

Result

OK

アプリケーション EUI の登録

AT Command

at+set_config=lora:app_eui:240A0F2375D286F8

Result

OK

アプリケーションキーの登録

注:OTAA の場合は lora:app_key、ABP の場合は lora:apps_key なので間違わないように注意。

AT Command

at+set_config=lora:app_key:62DC6A9880FBE606F3503DB057946817

Result

OK

設定を確認する

EUI などが設定されているか確認する。「Joined Network」はまだ false

AT Command

at+get_config=lora:status

Result

OK.
*************************************************
==============LoRaWAN Status List================
Region: AS923
Join_mode: OTAA
DevEui: 9B59615D543BC6F3
AppEui: 240A0F2375D286F8
AppKey: 62DC6A9880FBE606F3503DB057946817
Class: A
Joined Network:false
IsConfirm: false
Work Mode: LoRaWAN
AdrEnable: true
EnableRepeaterSupport: false
RX2_CHANNEL_FREQUENCY: 923200000, RX2_CHANNEL_DR:2
RX_WINDOW_DURATION: 3000ms
RECEIVE_DELAY_1: 1000ms
RECEIVE_DELAY_2: 2000ms
JOIN_ACCEPT_DELAY_1: 5000ms
JOIN_ACCEPT_DELAY_2: 6000ms
Current Datarate: 5
Primeval Datarate: 5
ChannelsTxPower: 0
UpLinkCounter: 0
DownLinkCounter: 0
AntennaGain: 2.15
===================List End======================
*************************************************

LoRa ネットワークに JOIN する

EUI の準備などができたので LoRa ネットワークに JOIN する。

AT Command

at+join

Result

OTAA:
DevEui:9B59615D543BC6F3
AppEui:240A0F2375D286F8
AppKey:62DC6A9880FBE606F3503DB057946817
OTAA Join Start... 
OK
[LoRa]:Joined Successed!

成功すれば TTN の Console にアクティベーションのログが残っているはず。電源を切っても復帰すれば自動的に JOIN してくれる。

TTN にデータを送る

ドキュメントによれば at+send は 50 bytes まで 16 進数でなければならないとある。適当に 1 バイトのデータを送ってみる。

AT Command

at+send=lora:1:00

Result

OK
[LoRa]: Unconfirm data send OK

データタブで受信できているか確認する。

/// image ///

デコーダを設定して値を整形する

TTN には Payload Formats という機能があり、値を変換したりすることができる。下記はデコーダのデフォルトサンプル。

Payload Formats (Decoder)

function Decoder(bytes, port) {
  // Decode an uplink message from a buffer
  // (array) of bytes to an object of fields.
  var decoded = {};

  // if (port === 1) decoded.led = bytes[0];

  return decoded;
}

サンプルを消して単純に数値を文字に変換する処理を入れてみる。返り値はオブジェクトで返す必要がある。

Payload Formats (Decoder)

function Decoder(bytes, port) {
  var a = [];
  for (var i=0; i<bytes.length; i++) {
    a.push(String.fromCharCode(bytes[i]));
  }
  return {
    message: a.join("")
  }
}

シェルで Hello, world! という文字列を 16 進数に変換する。

Terminal

$ printf 'Hello, world!' | hexdump -e '50/1 "%02x"' | tr -d ' '
48656c6c6f2c20776f726c6421

Hello, World! を 16 進数に変換した結果を at+sendTTN に送る。

AT Command

at+send=lora:1:48656c6c6f2c20776f726c6421

データタブで確認すると文字列に変換された結果が出てくる。

//// images ////

Shell や Python からデータを送ってみる

シェルからは CR + LF を末尾に付けてデータを書き込むだけ。応答を cat で読む場合は少し待ち時間を入れる。

$ printf 'at+send=lora:1:00\r\n' >/dev/ttyUSB1; sleep 1; cat /dev/ttyUSB1; sleep 3; cat /dev/ttyUSB1
OK
[LoRa]: Unconfirm data send OK

Python では serial モジュールを使う(PIP を確認したら RAK811 用のモジュールもあるっぽい)。write() に渡すデータはバイナリになってなければならない。応答は read() または read(n)readline() で読み取ることができる。

import serial
s = serial.Serial("/dev/ttyUSB0", baudrate=115200, timeout=10)
s.write(b"at+send=lora:1:00\r\n")
s.readline()

AT コマンド一覧

at+join

Start to join LoRa network.

LoRa ネットワークに参加する。一度 at+join すると電源を切っても設定が保持される(何日持つかは不明)。

at+run

Stop boot mode and run as normal. It is valid when the device works in boot mode.

ブートモードを停止してノーマルモードでは動作させる。デバイスがブートモードのときに有効。

at+version

Get the current firmware version number.

現在のファームウェアバージョン番号を得る。

OK3.0.0.3.H

at+send=lora:<PORT>:<HEX>

Send a customized data.

  • <PORT>: LoRa port
  • <HEX>: The data which you want to send. The limited length is 50 bytes, and the data must be in HEX format.

at+send=lorap2p:<HEX>

Send data through LoRaP2P. This AT command is valid when it works in LoRaP2P mode.

get_config=device

at+get_config=device:status

Get all infomation about the device's hardware components and their current status.

バイスのハードウェアに関する情報を表示する。

OK.
*************************************************
===============Device Status List================
Board Core:  RAK811
MCU:  STM32L151CB_A
LoRa chip:  SX1276
===================List End======================
*************************************************

set_config=device

at+set_config=device:boot

Let the device work in boot mode.

ブートモードとして動作させる。

at+set_config=device:restart

After set, the device will restart.

再起動する。

OK,restart ...

at+set_config=device:sleep:<MODE>

After setting, the device will go to sleep mode or wake up immediately.

バイスをスリープ、またはただちに起動させる。

  1. wake up
  2. sleep

get_config=lora

at+get_config=lora:status

LoRa に関する情報を表示する。(PDF 未記載)

at+get_config=lora:channel

It will return the state of all LoRa channels, then you can see which channel is closed and which channel is open very clearly.

OK.Max_nb_chs=16:
* 0,on,923200000,0,5;
* 1,on,923400000,0,5;
* 2,on,923600000,0,5;
* 3,on,923800000,0,5;
* 4,on,924000000,0,5;
* 5,on,924200000,0,5;
* 6,on,924400000,0,5;
* 7,on,924600000,0,5; 
  8,off,923600000,0,5;
  9,off,923800000,0,5;
  10,off,924000000,0,5;
  11,off,924200000,0,5;
  12,off,924400000,0,5;
  13,off,0,0,0;
  14,off,0,0,0;
  15,off,0,0,0;

*上記は at+set_config=lora:region:AS923 時の結果を整形したもの

set_config=lora

at+set_config=lora:adr:<MODE>

Open or close ADR function of LoRa Node.

0: Close ADR 1: Open ADR

at+set_config=lora:app_eui:<VALUE>

Set the application EUI for OTAA.

at+set_config=lora:app_key:<VALUE>

Set the application key for OTAA.

at+set_config=lora:apps_key:<VALUE>

Set the application session key for ABP.

at+set_config=lora:ch_mask:<NUM>:<MODE>

Set a certain channel on or off. <NUM>: The channel number, and you can check which channel can be set before you set it. <MODE>: 0 off, 1 on

at+set_config=lora:class:<NUM>

Set the class for LoRa.

  1. Class A
  2. Class B
  3. Class C

at+set_config=lora:confirm:<NUM>

Set the type of messages which will be sent out through LoRa.

  1. unconfirm
  2. confirm

at+set_config=lora:dev_addr:<HEX>

Set the device address for ABP.

at+set_config=lora:dev_eui:<HEX>

Set the device EUI for OTAA.

at+set_config=lora:dr:<NUM>

Set the DR of LoRa Node.

<NUM>: The number of DR. Generally, the value of X can be 0~5. More details, please check the LoRaWAN 1.0.2 specification.

at+set_config=lora:join_mode:<NUM>

Set the join mode for LoRaWAN.

  1. OTAA
  2. ABP

at+set_config=lora:nwks_key:<VALUE>

Set the network session key for ABP.

at+set_config=lora:region:<VALUE>

Set the region for LoRa.

  • EU868
  • EU433
  • CN470
  • IN865
  • EU868
  • AU915
  • US915
  • KR920
  • AS923

at+set_config=lora:work_mode:<NUM>

Set the work mode for LoRa.

  1. LoRaWAN
  2. LoRaP2P
  3. Test Mode

at+set_config=lorap2p:X:Y:Z:A:B:C

Set the parameters for LoRa P2P mode. This AT command is valid when the work mode is LoRaP2P.

  • X: Frequency in Hz.
  • Y: Spreading factor.
  • Z: Bandwidth
    • 0: 125 kHz
    • 1: 250 kHz
    • 2: 500 kHz
  • A: Coding Rate
    • 1: 4/5
    • 2: 4/6
    • 3: 4/7
    • 4: 4/8
  • B: Preamble Length (5-65535)
  • C: Power in dbm (5-20)

書式に誤りがある場合

以下のような応答が返ってくる。

  • No AT Command was found.
  • AT format error.

at+send でデータサイズがオーバーしている場合は下記のメッセージが返ってくる。

  • String over max length <256 Bytes>.

LoRaP2P モードで使うには

RAK811 Breakout Board を2つ用意する。

リージョンを設定する。

at+set_config=lora:region:AS923

LoRa の動作モードを LoRaP2P に設定する。

at+set_config=lora:work_mode:1

周波数などを設定する。

set+set_config=lorap2p:869525000:7:0:1:5:5

どちらかの RAK811 Breakout Board からデータを送る。

at+send=lorap2p:1234567890

第六回博麗神社秋季例大祭とコミックマーケット97に申し込みました

タイトルの通りです。令和になって何を血迷ったか同人イベントにサークルとして申し込みました(画力無いのに)。これまで同人イベントには度々行っていたんですが、一般参加じゃなくてサークルとして参加してみたいなと思ったわけです(画力無いのに)。

仕事柄どうしても技術書系の内容くらいしか書けず、それをどう東方Projectと結びつけようかと悩んだ挙句、macOS ユーザ向けの東方ゲーム解説本のようなナニカになります。キャラは自分の一番好きな魔理沙を描こうと思っています。「○畜ちゃん」っぽい感じになる…かも。

同人イベントに申し込む時って「本の概要」を書いて送らなくてはいけないんですが、かなり支離滅裂な内容で出したと思います。今頃きっと運営様の方で「何かヤバイの来た」と思われてるかもしれません。

それ以外にも不安が多々あります。

例大祭で技術系の本を出しているサークルはあるの?場違いじゃないの?

多分無いと…思います。夏の例大祭で一応すべての配置を周って「その他」も見てきたのですが技術書的なものを頒布されているサークルは無かったような気がします。この時点で場違いではないかという不安しかない。

そして「ただ自分の書いた本に東方のキャラをいいように使ってるだけじゃない?」みたいな感じになってしまいそうなのがすごく怖い。(そうならないようにちゃんと漫画は描きたい…画力ないけど)

Windows ゲームを macOS で動かそうとする"悪魔の書"みたいなもの出して大丈夫?

Wine を使って macOS でも東方ゲームをやってる人って結構いるだろうし、やりたいと思っている人もいると思ってます。そんな人たちの役に立てれば…と考えたのですがこれもやっぱり不安。そもそも Wine で動かそうとする行為が自己責任であり、そのような行為を拡散させるような書物を総本山の目の前で頒布していいのだろうか…。

動作する保証が無いため EasyWine などの頒布ページにも「製作者様への問い合わせ等はご遠慮ください」と記載はしていますが、これもやっぱり不安。

EasyWine とかの説明書が欲しいと思っている方には申し訳ないですが EasyWine 普及用の同人誌ではないので EasyWine や Nihonshu のことについては掲載しません。

そんな語彙力で大丈夫?

あっ…(察し


という感じで今になって「何故申し込んだし」と思っているのですが、原稿の方はなんとか進めています。しかし、ここでも問題が。

現在の私はフル Linux 環境で生きている人間なので IllustratorInDesign なんてものは当然使えず、本を作る環境を作るのに苦労しています。PDF なら何とでもなるんですが、印刷所に入稿するデータを作るとなるとフォントサイズやレイアウト、ページデザイン、断ち切りのサイズ等を考慮しなくてはなりません。Linux はこの辺が圧倒的に不利だと感じています。

Inkscape は複数ページを扱えないので Scribus を2日ほど使ってみましたがこれで書籍を作るのは正直かなりシンドいといった印象です。ベジェ使いにくいしリドゥ効かない部分あるしでマジで心が折れそう。

結局、書き慣れた AsciiDoc で原稿を書いてあとから漫画のページや表紙等を Scribus で合成する方針に変更。それも無理ならあとは GhostScript なり ImageMagick を駆使するしかない…。漫画はアナログで書いたものをスキャナで取り込んで Krita でベタとか入れる予定。

形式(コピ本 or オフセ本、カラー or モノクロ etc)や価格もまだまだ未定です。何より運営様の趣旨に沿わないことや抽選で外れる可能性もあるのでサークルとして出られるかどうかはわかりません。

不安しかない(;´Д`)

ESP-WROOM-02 で IoT 夏休み自由研究

「イベント出るから IoT っぽいこと何かやってよ」と言われたので「何か」をやることにした。

LoRa でやろうかとも思ったけど制限多いし市内にゲートウェイあんま無いから使い物にならんなってことで Wi-Fi にした。

Wi-Fi 温度計(Wi-Fi Temperature Measurement)

ESP-WROOM-02 と汎用温度センサー LM61CIZ を使った Wi-Fi 温度計。ESP-WROOM-02 の TOUT は 1 V までしか扱えないので分圧等の対応が必要だが LM61CIZ は 0 ℃が 600 mV で 1 ℃ ごとに 10 mV 増えるので 1 V になるのは 40 ℃。つまり「会場が 40 ℃ を超えなければ問題ない!」ということで手抜きで Vo をそのまま TOUT に突っ込んである。データは MQTT で飛ばして Node-RED で表示。外付けの ADC を使えばいいのだけどこの程度の装置に付けるのはちょっとね。

f:id:mattintosh4:20190729183913p:plain
ESP-WROOM-02 Wi-Fi 温度計

アンテナ部分に貼ってあるテプラはチップ ID。複数の ESP-WROOM-02 があるとどれがどのデバイスかわからなくなるので ESP.getChipId() でチップ ID を取得して MQTT のトピックとして使っている。

Wi-Fi 土壌湿度計(Wi-Fi Moisture Measurement)

市販の土壌湿度計もあるけど割高なので自作。回路は土壌の抵抗値をトランジスタで変換するだけなので単純。これも TOUT の上限 1 V までになるように分圧で調整。土壌の抵抗値は土質によるが数百オームから数メガオームくらいまで変化するので抵抗の分圧だけで測定しようと思うと難しい(湿っているか乾いているかくらいざっくりしたものならトランジスタも使わなくていいと思う)。

f:id:mattintosh4:20190729184103p:plain
ESP-WROOM-02 土壌湿度計

試作品なので縦付け抵抗とワニ口クリップを使う。0 Ω 抵抗は見た目を合わせるだけに使ってる。

f:id:mattintosh4:20190729184222p:plain
ESP-WROOM-02 土壌湿度計

金メッキプラグで試してみたことがあるが腐食してしまうので今回は 2 mm の鉛筆芯を使うことにした。手持ちには 2H もあるのだけど B の方が抵抗値が少なかったので B を採用。芯自体の抵抗値は 7 Ω くらいだった気がする。

f:id:mattintosh4:20190729184300p:plain
ESP-WROOM-02 土壌湿度計

土がなかったのでメラミンスポンジで実験。

この投稿をInstagramで見る

水分量チェッカー(スポンジ試験

mattintosh4さん(@mattintosh4)がシェアした投稿 -

金メッキプラグを使用していたときはヘデラを育てていたのだけどプラグが腐食し始めてからプラグに近い部分の茎から徐々に枯れていったので植物に悪影響を及ぼしていそう。錫は錆にくいみたいだけど錫メッキされたものなら植物に影響を与えずに電極棒として使えるのかなぁ…。

IoT コンセント

手元にソリッドステートリレーが転がっていたので作ってみた。これと水槽用エアポンプ、ペットボトル、ソフトチューブを組み合わせて自動水やりができるようにした。自動水やりと言うとよく汲み上げ式のポンプを使っているのを見るのだけど、エアポンプでタンク内の圧力を高めて押し出す方が多分楽だと思う(霧吹きの原理)。

f:id:mattintosh4:20190729185725p:plain
ESP-WROOM-02 IoT コンセント

中継には PVK ボックスを使った。が、屋外用の大きめのボックスを使った方が 3.3 V の AC アダプターも中に入れておけたのでは…と後悔。コンセントを二系統にしたので SSR が二つになってかなり窮屈になった。

f:id:mattintosh4:20190729184558p:plain
ESP-WROOM-02 IoT コンセント

Node-RED のダッシュボードを FireTV のウェブブラウザから弄って水を出してみる。

この投稿をInstagramで見る

遠隔水やり装置作りました

mattintosh4さん(@mattintosh4)がシェアした投稿 -


という感じでぼくのなつやすみのじゆうけんきゅうはこれで終わり(にしたい)。

ESP-WROOM-02 のプルアップ抵抗ってだいたい 10 kΩ を使っている例が多いと思うけど 10 kΩ だとたまに起動しないことがある。今回は一番面倒な PVK ボックス内の ESP-WROOM-02 が突然起動しなくなったので EN のプルアップ抵抗を 1 kΩに変えたら動くようになった。今後は 4.7 kΩ くらいを使おうかな。

ネットで ESP8266 や ESP-WROOM-02 の使い方を見ているとよく IO0IO2 をプルアップしている例が見つかるが、ESP-WROOM-02 のデータシートを見てみると IO0IO2 もフローティングでいいっぽい(UART Download モードの場合は IO0 をプルダウンする必要はある)。

f:id:mattintosh4:20190730233140p:plain
ESP-WROOM-02 Datasheet

https://www.espressif.com/sites/default/files/documentation/0c-esp-wroom-02_datasheet_en.pdf

考えてみればスイッチサイエンスのピッチ変換基板シンプル版だと IO0IO2 をプルアップもしくはプルダウンしてしまうと何も接続できない。

www.switch-science.com

余計な配線も減らせるしもっと早くデータシート見ておけばよかった。