でんげき☆ Network Service

Raspberry Pi 4 で運用実験中 Connect checker

No.11, No.10, No.9, No.8, No.7, No.6, No.57件]

ラズパイの Apache で CPU 情報を取得する vcgencmd が CGI で動かない問題を解決する

20211205061157-admin.png
 
Raspberry Pi 4 (ラズパイ) に CPU のクロック周波数や温度やらを取得する vcgencmd なるコマンドが用意されています
CPU などなどのクロック周波数を表示
for src in arm core h264 isp v3d uart pwm emmc pixel vec hdmi dpi ; do echo -e "$src:\t$(vcgencmd measure_clock $src)" ; done
CPU の温度を表示
vcgencmd measure_temp
利用可能・不可能なコーデックの表示
for codec in H264 MPG2 WVC1 MPG4 MJPG WMV9 ; do  echo -e "$codec:\t$(vcgencmd codec_enabled $codec)" ; done

20211205053433-admin.png
実行例

その他にもいろいろあるんで…詳しくは 解説ページをご覧ください って感じの vcgencmd コマンドなんですが Apache 上の CGI として実行させようとすると失敗するんでその辺をどうにかしてみます

まぁ結論から云ってしまうと…グループ video に Apache が実行するユーザである www-data が入っていないから動かないって事らしいです
cat /etc/group | grep video
video:x:44:pi

ちなみに Apache が実行するユーザは /etc/apache2/envvars で指定しているようです
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

試しにコマンドラインでユーザを www-data に切り替えて確認してみましょう
sudo su -s /bin/bash www-data
vcgencmd measure_temp
VCHI initialization failed
やはり使えないみたいですね…

それじゃグループ video にユーザ www-data を追加していきましょう まぁコマンド一発なんですが
sudo usermod -aG video www-data
これで追加できます 確認すると…
cat /etc/group | grep video
video:x:44:pi,www-data
グループ video にユーザ www-data が追加されました

それでは再びユーザを www-data に切り替えて確認してみましょう
sudo su -s /bin/bash www-data
vcgencmd measure_temp
temp=28.2'C
ちゃんと使えるようになりました

  :

しかし Apache 上の CGI として vcgencmd コマンドを実行しても「VCHI initialization failed」のエラーが出続けます なんで??
いろいろと試していて…まぁはっきりとした理由は不明なんですが Apache を再起動させたらこの問題が解決しました
sudo systemctl restart apache2
これで Apache 上の CGI として vcgencmd コマンドが使えるようになりました 何か別の所に問題があるかもだけど…我が家の環境ではこの手法で解決できました

202112050534331-admin.png
そんな操作の過程のスクリーンショットをぺたり 改竄の余地のないよう作業の過程を全て収録してあります

※参考資料 グループからユーザを削除するには…
トラブルの解決中っていうか…いろいろやってて勢い余って必要のないユーザをグループに追加しちゃった!(>_<)qって時なんかにグループからユーザを削除する場合には以下のようにします
例えばグループ video に追加されたユーザ www-data を削除する場合は
sudo gpasswd -d www-data video
こんな感じに操作します 先ほどの usermod の場合とユーザ名とグループ名の指定が逆になってるので注意が必要です なんなら gpasswd -a でグループにユーザを追加することができるらしいんですが…どっちを使うといいんだろうね

  :

さてさてそんな vcgencmd を使ってこんな感じで動かしています
 (キャプション自動取得対象外) その都度都度で PNG 画像を生成しています
Web サーバの処理やら画像の生成などで一時的にクロック高めな感じですがアイドル時は 600MHz くらいになってるようです
そんなこんなで何かの都合でラズパイを再セットアップした際に悩まないようなメモでした #[Raspberry Pi] #Apache #コマンドヘルプ #CGI

情報 <2063文字>

貧者のラーツー・装備品解説

20211204062141-admin.png
 
キャンプツーリングは楽しい! 楽しいんだけど…準備したり後片付けしたりがかなり面倒!!って事なんでついつい疎遠になっちゃうっていうかなかなか実行に移せないんだけどそれでもやっぱりお外で何かしたい!って気分をお手軽にどうにかしてプチ・アウトドア気分を満喫できるラーメンツーリング略してラーツーが大好きな感じなんですが「それどんな装備でやってんの??」ってお問い合わせをぼつぼつ頂いたりするんでせっかくなんで解説したいと思います
まぁ安め狙いの装備なんで映えませんが(-_-;)

2021120406214115-admin.jpg
そんな装備品は100均の巾着袋に収まる感じです
どっか景色のいいお気に入りの場所でお湯を沸かしてカプ麺を作って仕上げに即席コーヒーを楽しむって辺りまで実現できる装備をお安くコンパクトにまとめてみました

2021120406214114-admin.jpg
中身を広げてみた 更に詳しく解説していきましょう

2021120406214113-admin.jpg
季節により使わないかもだけど…虫除けスプレーと軍手

2021120406214112-admin.jpg
アルミ製ぺんぺんの風防と割り箸とスティック型・インスタントコーヒーと水筒です 水筒は 500ml のもので水道水が入ってます

2021120406214111-admin.jpg
某Dイソーで売ってた 450ml くらい入るらしいデカ目の(たぶん)ステンレス製のマグカップとシリコン製のフタと 98 円以下で買ってくるカプ麺 デカ目のマグカップはそのままコッヘルとして使うっていうかこれでお湯を沸かします フタは少ない燃料でお湯を沸かす際に必須となるので何があっても用意したい感じです

2021120406214110-admin.jpg
ちなみにカプ麺はこんな感じでマグカップにスタッキングできます スタッキングが可能になるのでカプ麺のサイズ・形状が限定されてしまいますが…まぁこのサイズのカプ麺はお値打ちなんで納得しちゃう!(>_<)w

202112040621419-admin.jpg
使用する燃料は「ゲルネン着火剤 25g 8個入り」か「パック燃料 27g 4個入り」です ゲルネン着火剤はホームセンターで見かけることがあります パック燃料は某Dイソーで売ってることがあります 内容量に微妙な違いがあるけど性能的にはどちらも同じ感じかな?ってイメージなんで…その時々の入手性の良いほうを選んでるって感じです

202112040621418-admin.jpg 202112040621417-admin.jpg
ただこの燃料にそのまま点火すると結構な勢いで燃え盛ってしまうっていうか早々に燃え尽きてしまうので…アルミ箔で周囲と底面を包んで燃焼範囲を制限して持続力を延長できる細工を施しています こうして無駄な放熱を抑制することにより気温 0℃ の環境下でも 500ml の水をギリ沸騰させることができます 夏場とかならそれほど気にすることではないのだけど…真冬だと最高の効率を求めないと沸騰する前に燃え尽きてしまう感じです

202112040621416-admin.jpg 202112040621411-admin.jpeg
そしてコンパクトに収納できるエスビット・ポケットストーブ…のパチものっていうか某Aマゾンで 300 円チョイで買ってきたエスビットと同サイズの固形燃料ストーブです→ https://www.amazon.co.jp/gp/product/B00F... ポーチ付きでした
同等品と思われるエスビット・ポケットストーブっぽいストーブが某Dイソーで売られていたんでコレでもいいかも知れません

202112040621415-admin.jpg 202112040621414-admin.jpg
最大限の熱効率を得られるように…シーチキン缶をぱっかんした時のフタを折り曲げてセッティングしています 無くてもいいかもだけど…コレがあるとお湯が早く沸くなぁってイメージです

202112040621413-admin.jpg
それではコッヘル(マグカップ)に水を 350ml くらい入れてパック燃料に点火してみましょう 点火しづらい時は…パック燃料を仕込んだストーブごと持ち上げてひっくり返すような格好にすると簡単に火が付きます
そしてお湯が沸くまでのこの待ち時間に周囲の自然を満喫しよう! 最高に楽しい時間すぎる!!(>_<)w

202112040621412-admin.jpg
ラーツーは楽しい(定型文)
カプ麺にお湯を注いで 3 分待つ間に…食後のコーヒー用っていうか残りの 150ml くらいの水を沸かしておくのを忘れずに!

202112040621411-admin.jpg
そんな食後のコーヒーでほっと一息
お家で飲むと心もちイマイチなお味のスティック型・インスタントコーヒーだけど…大自然に囲まれた中で頂くと本当に美味しい!

20211204062141-admin.jpg
そんな感じでごちそうさまでした! ゴミなど一切の痕跡を残さないようコンパクトに収納して撤収です

20211204062141-admin.jpeg
コンパクトさ故っていうか…イスもテーブルも無いんでその辺は現地調達となります でもまぁそれもアリかな!って思っちゃうww

そんなこんなな不要な物を削りに削って必要最小限な装備をできるだけお安く!ってコンセプトでまとめたラーツー装備でした そんなに頑張らなくても楽しめるラーツーがもっと流行るといいですね! 概ね貧乏装備すぎてあ んまり参考にならないかもだけど(汗 #アウトドア

趣味 <1952文字>

Perl の GD::Simple モジュールでフォントを指定したりしてみるメモ

20211203182031-admin.png
 
初期のインターネットっていうか Web サイト黎明期の CGI と云えば Perl でキマリ!!って時代もありましたよね…って感じすらすっかり忘れ去られたかのように近年では全く話題にもならない Perl ですが「三つ子の魂百まで」なのか何なのかあまりにも手に馴染みすぎてついつい使っちゃうって事はありませんか? 私はあります いやむしろ未だに他の言語が使えず Perl にどっぷりなんです悪いか!!(-_-#)って事なのか何なのかそんな忘れ去られつつある言語である Perl と…その Perl で画像を扱う GD ライブラリの(主に文字フォント系の)使い方を少しばかり探求してみたかなりニッチな需要的な忘れ物防止メモです

そんな Perl の GD ライブラリですが…以下のようにコマンド一発で簡単にインストールできます
sudo apt install libgd-perl
依存関係とか詳しく調べてないんでアレだけど…ちょっと見た感じでは我が家の環境にいつの間にか libgd-text-perl なんてのも入っていたんで文字フォントの扱いに不具合が発生した時には sudo apt install libgd-text-perl してみるのもいいかもです(汗

あーあと標準的な Raspberry Pi OS のセットアップではゴシック書体の日本語フォントしか入ってないっぽい? 後に説明するけど…フォント名に Sans とだけ付いてるフォントは概ねゴシック書体です 明朝書体には Serif と付くらしいんだけどラズパイにはそれが入ってないみたい?なんで…後の動作確認しやすいように明朝書体が含まれる程よいフォントを追加でインストールしておきます
sudo apt install fonts-ipaexfont
日本語フォントファイルってのはそれなりに容量が大きいんで…少容量 microSD とかで運用してる方などには要注意かもですがまぁその辺はうまいことどうにかしてやってください(瀧汗

※ 追記 ※
Google の「No more 豆腐」と呼ばれるフォントのインストール方法
sudo apt install fonts-noto-cjk
中国語(C)と日本語(J)と韓国語(K)が一緒くたに入っちゃう感じっぽいです

そんな下準備が済んだトコロで…現在システムに入ってるフォントの一覧を取得する方法です それには fc-list ってコマンドを使うんだけど…日本語に非対応なフォントとかも羅列されて心もち見づらいんでその辺を絞り込んで表示させてみましょう
fc-list :lang=ja | sort | uniq
sort と uniq は並べ替えてダブり行を除去してくれるんで見やすくなると思います
ここで表示される内容は…フォントのパス付きファイル名とフォントファミリー名とスタイルです 後に説明する GD のフォント指定で…何となくフォントのパス付きファイル名で指定してたんだけどそれではダメでデフォルトのフォントが使用され続けてて悩んでたんだけどどうやら「フォントファミリー名:スタイル」で指定するといいって事を突き止めたんで
fc-list -f '%{family}:%{style}\n' :lang=ja | sort | uniq
このようなオプション指定で実行するといいと思います

実行すると(環境によって違うと思うけど)こんな感じの一覧が出ます
Droid Sans Fallback:Regular
IPAexゴシック,IPAexGothic:Regular
IPAex明朝,IPAexMincho:Regular
Noto Sans CJK JP,Noto Sans CJK JP Black:Black,Regular
Noto Sans CJK JP,Noto Sans CJK JP Bold:Bold,Regular
Noto Sans CJK JP,Noto Sans CJK JP DemiLight:DemiLight,Regular
Noto Sans CJK JP,Noto Sans CJK JP Light:Light,Regular
Noto Sans CJK JP,Noto Sans CJK JP Medium:Medium,Regular
Noto Sans CJK JP,Noto Sans CJK JP Regular:Regular
Noto Sans CJK JP,Noto Sans CJK JP Thin:Thin,Regular
Noto Sans CJK KR,Noto Sans CJK KR Black:Black,Regular
---- 中略 ----
この中から使いたいフォントの行をコピーして後の GD のフォント指定に使用するといい感じに使えるようです そして今後は「IPAex明朝,IPAexMincho:Regular」を使って話を進めていきます

それでは早速その辺を使ったサンプルを作ってみますかね

----------

#!/usr/bin/perl
use GD::Simple;

$img_obj = GD::Simple->new(500, 500);

$img_obj->font('IPAex明朝,IPAexMincho:Regular'); # フォント
#$img_obj->font('/usr/share/fonts/opentype/ipaexfont-mincho/ipaexm.ttf'); # このフォント指定じゃダメみたい
$img_obj->fgcolor('red'); # 文字色
$img_obj->fontsize(30); # フォントサイズ
$img_obj->moveTo(20, 100); # 始点 x, y
$img_obj->string("日本語フォント表示\nRaspberry Pi\n1234567890"); # 文字列(最後に記述)

# ファイルへ出力
#open(IMG, "> gd_out1.gif"); # GIF で出力
#open(IMG, "> gd_out1.jpg"); # JPEG で出力
open(IMG, "> gd_out1.png"); # PNG で出力
binmode IMG; # バイナリ・ストリームへ書き込む
#print IMG $img_obj->gif(); # GIF で出力
#print IMG $img_obj->jpeg(100); # JPEG (品質:0〜100) で出力
print IMG $img_obj->png(); # PNG で出力
close(IMG);

----------

実行すると以下のような感じの画像が生成されると思います
20211120103516-admin.png
今回は PNG で保存してみましたが GIF や JPEG でも保存できます 「ファイルへ出力」の辺りのコメントアウトしてある部分で切り替えられるんで試してみてください

  :

そんな Perl で画像を生成するって話だと…既存の画像を読み込んで文字とかを描き込んで使いたい場合があると思います そんな時には以下のように指定します
gd_test2.gif gd_test2.jpg gd_test2.png
[サンプル画像]

----------

#!/usr/bin/perl
use GD::Simple;

#$img_obj = GD::Simple->newFromGif("./gd_test2.gif"); # GIF 画像の時
#$img_obj = GD::Simple->newFromJpeg("./gd_test2.jpg", 1); # JPEG 画像の時 最後の「1」は True Color のフラグ?(未解明)
$img_obj = GD::Simple->newFromPng("./gd_test2.png", 1); # PNG 画像の時 最後の「1」は True Color のフラグ?(未解明)

$img_obj->font('IPAex明朝,IPAexMincho:Regular'); # フォント
$img_obj->fgcolor('red'); # 文字色
$img_obj->fontsize(30); # フォントサイズ
$img_obj->moveTo(20, 100); # 始点 x, y
$img_obj->string("日本語フォント表示\nRaspberry Pi\n1234567890"); # 文字列(最後に記述)

# ファイルへ出力
#open(IMG, "> gd_out1.gif"); # GIF で出力
#open(IMG, "> gd_out1.jpg"); # JPEG で出力
open(IMG, "> gd_out1.png"); # PNG で出力
binmode IMG; # バイナリ・ストリームへ書き込む
#print IMG $img_obj->gif(); # GIF で出力
#print IMG $img_obj->jpeg(100); # JPEG (品質:0〜100) で出力
print IMG $img_obj->png(); # PNG で出力
close(IMG);

----------

実行すると以下のように読み込んだ画像の上に文字を描き込んだ画像が出力されます
202111201035162-admin.png
ちゃんと文字が描き込まれていますね なお色数の多い JPEG と PNG は True Color フラグとなる「1」を指定しておかないと色が正しく再現されないような感じでした

  :

お次は複数の画像を読み込んで 1 枚の画像に合成するってのをやってみます
gd_test2.gif gd_test2.jpg gd_test2.png
[サンプル画像]

----------

#!/usr/bin/perl
use GD::Simple;

$img_obj = GD::Simple->new(500, 500, 1); # 最後の「1」は True Color のフラグ?(未解明)

$img_gif = GD::Image->newFromGif("./gd_test2.gif"); # GIF 画像の時
$img_jpg = GD::Image->newFromJpeg("./gd_test2.jpg", 1); # JPEG 画像の時 最後の「1」は True Color のフラグ?(未解明)
$img_png = GD::Image->newFromPng("./gd_test2.png", 1); # PNG 画像の時 最後の「1」は True Color のフラグ?(未解明)

# 参考までに…読み込んだ画像の簡易な情報を表示
($width, $height) = $img_gif->getBounds();
$is_truecolor = $img_gif->isTrueColor();
print "GIF:[$width][$height][$is_truecolor]\n";
($width, $height) = $img_jpg->getBounds();
$is_truecolor = $img_jpg->isTrueColor();
print "JPG:[$width][$height][$is_truecolor]\n";
($width, $height) = $img_png->getBounds();
$is_truecolor = $img_png->isTrueColor();
print "PNG:[$width][$height][$is_truecolor]\n";

# コピー元オブジェクト, コピー先X座標, コピー先Y座標, コピー元X座標, コピー元Y座標, 横サイズ, 縦サイズ
$img_obj->copy($img_gif, 0, 150, 200, 140, 200, 200); # GIF 画像をコピーする
$img_obj->copy($img_jpg, 180, 280, 240, 135, 200, 200); # JPEG 画像をコピーする
$img_obj->copy($img_png, 300, 100, 140, 140, 200, 200); # PNG 画像をコピーする

$img_obj->font('IPAex明朝,IPAexMincho:Regular'); # フォント
$img_obj->fgcolor('red'); # 文字色
$img_obj->fontsize(30); # フォントサイズ
$img_obj->moveTo(20, 100); # 始点 x, y
$img_obj->string("日本語フォント表示\nRaspberry Pi\n1234567890"); # 文字列(最後に記述)

# ファイルへ出力
#open(IMG, "> gd_out1.gif"); # GIF で出力
#open(IMG, "> gd_out1.jpg"); # JPEG で出力
open(IMG, "> gd_out1.png"); # PNG で出力
binmode IMG; # バイナリ・ストリームへ書き込む
#print IMG $img_obj->gif(); # GIF で出力
#print IMG $img_obj->jpeg(100); # JPEG (品質:0〜100) で出力
print IMG $img_obj->png(); # PNG で出力
close(IMG);

----------

実行すると以下のように読み込んだ画像の指定範囲を切り抜き合成してその上に文字を描き込んだ画像が出力されます
202111201035161-admin.png
なお画像の copy にはパラメータを全て指定する必要があるようです ちょっと面倒ですね(-_-;) 今回は指定範囲を切り抜くような形でコピーしたけど…サイズが不定な画像を読み込んだ際に正しく範囲指定できるように読み込んだ画像サイズを取得できる getBounds ってのも使っているので参考までに

なお既存のファイルを読み込む際に newFromGif や newFromJpeg や newFromPng といった感じに予め画像フォーマットを知っておく必要があるようです しかしざっと調べた感じでは GD で画像フォーマットを調べる術がないようなんで…ちょっと困りますね
そこで標準的に用意されている file コマンドを使って画像フォーマットを調べるサンプルを即興で用意してみました

----------

#!/usr/bin/perl

$cmd = 'file -b -i'; # file コマンドを使う
$file = './gd_test2.gif'; # 画像ファイル名 [GIF]
#$file = './gd_test2.jpg'; # 画像ファイル名 [JPEG]
#$file = './gd_test2.png'; # 画像ファイル名 [PNG]

chomp($res = `$cmd $file`); # コマンドを実行して出力を取り込む
if ($?) { die "Command error:"; } # 何らかのエラーが発生
print "$res\n"; # コマンドを実行した出力はこんな感じ

if ($res =~ /^cannot open/) { # file コマンドが何らかのエラーを返した
  print "File error: $file\n";
} elsif ($res =~ /^image\/gif;/) { # GIF ファイルらしい
  print "[\$img_obj = GD::Simple->newFromGif(\"$file\"); を使う]\n";
} elsif ($res =~ /^image\/jpeg;/) { # JPEG ファイルらしい
  print "[\$img_obj = GD::Simple->newFromJpeg(\"$file\"); を使う]\n";
} elsif ($res =~ /^image\/png;/) { # PNG ファイルらしい
  print "[\$img_obj = GD::Simple->newFromPng(\"$file\"); を使う]\n";
} else { # それ以外のファイルっぽい
  print "扱えないファイルです(-_-;)\n";
}

----------

file コマンドについて詳しく調べてないんでアレなんだけど…これで概ね画像フォーマットを特定できると思います この辺ちょっと面倒ですね(-_-;)

まぁそんなこなんで時既に情報が古すぎて調べられない GD::Simple のアレこれをまとめてみました この GD::Simple は…その昔の N88-Disk Basic の LINE 文や CIRCLE 文とかでお絵描きしてた頃のようなシンプルな操作で作画できて懐かしく思ったりしながら愛用しています しょーみこれを今さらわざわざ使おうって思う人も居ないかなーって思いつつ今後の参考ってことで残しておきます 長々とお疲れさまでした! #[Raspberry Pi] #Perl

情報 <7610文字>

Arduino Leonardo (Pro Micro) でマルチメディアキーボードを作ろう!

20211203181404-admin.jpeg
 
前回に引き続き Arduino 的な諸々をひとつって事で…マルチメディア・キーボードって云うんですかね?
20211114113829-admin.png
+α的に実装されている音量調節などのキーとかノート PC でよく見かける Fn キーと併用して使える再生とか早送りなどのキーを ATmega32U4 を搭載した Arduino Leonardo (Pro Micro) でどうにかしてみるお話です

そんな今回の実験の様子
202111141138293-admin.jpeg
以前のマウスクリック超連射実験の回路がくっついたままなんで判りにくいですよね…

202111141138291-admin.png
申し訳程度に回路図を描いてみたけど…それでも判りづらいですよね(汗 まぁとにかく 2 番ピンと 3 番ピンを使用しました

今回のマルチメディア・キーボード(?)的な機能を簡単に実装するためにライブラリを追加してみました
202111141138292-admin.jpeg
Arduino IDE で [スケッチ] → [ライブラリをインクルード] → [ライブラリ管理] してライブラリ管理画面を出す

202111141138291-admin.jpeg
目的のライブラリを「hid」ってキーワードで検索して…出てきた「HID-Project」をインストールする ※画面は既にインストール済みだけどまぁそんな感じで(汗

後は Arduino IDE でこんな感じのを用意してそれをマイコンボードに書き込みます

----------

// include the HID library
#include "HID-Project.h" // 今回インストールしたやつをインクルードする

// definitions for each pin used
const int pinLed = LED_BUILTIN;
const int playButton = 2; // 今回使うピン番号
const int fwdButton = 3; // 今回使うピン番号
const int backButton = 4; // 以下今回は使わない(-_-;)
const int volUpButton = 5;
const int volDwnButton = 6;
const int muteButton = 7;


void setup() {
  // define the pin mode for each pin used
  pinMode(pinLed, OUTPUT);
  pinMode(playButton, INPUT_PULLUP); // 今回使うピン番号
  pinMode(fwdButton, INPUT_PULLUP); // 今回使うピン番号
  pinMode(backButton, INPUT_PULLUP); // 以下今回は使わない(-_-;)
  pinMode(volUpButton, INPUT_PULLUP);
  pinMode(volDwnButton, INPUT_PULLUP);
  pinMode(muteButton, INPUT_PULLUP);

  // begin HID connection
  Consumer.begin();
}

void loop() {
  if (!digitalRead(playButton)) {
    digitalWrite(pinLed, HIGH); // turn on LED
    Consumer.write(MEDIA_PLAY_PAUSE); // 一時停止・再生的なコマンド
    delay(500); // 動作確認用の LED 点滅
    digitalWrite(pinLed, LOW); // turn off LED
  }
  
  if (!digitalRead(fwdButton)) {
    digitalWrite(pinLed, HIGH);
    Consumer.write(MEDIA_NEXT); // 次の曲的なコマンド
    delay(500); // 動作確認用の LED 点滅
    digitalWrite(pinLed, LOW);
  }
}

----------

20211114113829-admin.jpeg
Ubuntu 20.04.3 LTS と Audacious 3.10.1 で動作チェックしたところ…「再生/一時停止」と「次の曲」の動作をタクトスイッチの押下にて実現できました やったね!

わりと入手しづらいイメージのマルチメディア・キーボード(?)の拡張部分を Arduino Leonardo (Pro Micro) でどうにかできる事が判明しました 後は程よいケースとスイッチを用意すれば完成なんだけど…それはまた後の話ってかんじで

  :

他にも機能があるっていうか…キーコードは Arduino/libraries/HID-Project/src/HID-APIs/ConsumerAPI.h に定義されています ※ファイルの場所は環境によって異なる場合があります

enum ConsumerKeycode : uint16_t {
  // Some keys might only work with linux
  CONSUMER_POWER = 0x30,
  CONSUMER_SLEEP = 0x32,

  MEDIA_RECORD = 0xB2,
  MEDIA_FAST_FORWARD = 0xB3,
  MEDIA_REWIND = 0xB4,
  MEDIA_NEXT = 0xB5,
  MEDIA_PREVIOUS = 0xB6,
  MEDIA_PREV = 0xB6, // Alias
  MEDIA_STOP = 0xB7,
  MEDIA_PLAY_PAUSE = 0xCD,
  MEDIA_PAUSE = 0xB0,

  MEDIA_VOLUME_MUTE = 0xE2,
  MEDIA_VOL_MUTE = 0xE2, // Alias
  MEDIA_VOLUME_UP = 0xE9,
  MEDIA_VOL_UP = 0xE9, // Alias
  MEDIA_VOLUME_DOWN = 0xEA,
  MEDIA_VOL_DOWN = 0xEA, // Alias

  CONSUMER_BRIGHTNESS_UP = 0x006F,
  CONSUMER_BRIGHTNESS_DOWN = 0x0070,

  CONSUMER_SCREENSAVER = 0x19e,

  CONSUMER_PROGRAMMABLE_BUTTON_CONFIGURATION = 0x182,
  CONSUMER_CONTROL_CONFIGURATION = 0x183,
  CONSUMER_EMAIL_READER = 0x18A,
  CONSUMER_CALCULATOR = 0x192,
  CONSUMER_EXPLORER = 0x194,

  CONSUMER_BROWSER_HOME = 0x223,
  CONSUMER_BROWSER_BACK = 0x224,
  CONSUMER_BROWSER_FORWARD = 0x225,
  CONSUMER_BROWSER_REFRESH = 0x227,
  CONSUMER_BROWSER_BOOKMARKS = 0x22A,

今回使った MEDIA_PLAY_PAUSEMEDIA_NEXT の他にもいろいろあります 例えば CONSUMER_BROWSER_REFRESH を超連打して…いわゆる F5 アタックを実装するのもいいかもしれません ※やめて!(>_<)q

  :

まぁざっくりこんな感じですかね これを用いてちょっと便利な補助キーボードを作れるとイイナ! #Arduino

情報 <3322文字>

Arduino Leonardo (Pro Micro) でマウスクリック連射装置を作ろう!

20211203180938-admin.jpg
 
ワンボードマイコンっていうか…ここんとこ Arduino が人気沸騰で気になりますよね!って事なんでモノは試しに安っすい VKLSVAN Pro Micro USB ATmega32U4 を買ってぼちぼちイジってみることにしました

202111130723461-admin.jpeg
まぁなんか Arduino にもいろいろあるようで…その中で ATmega32U4 を搭載した Arduino Leonardo と呼ばれるものが HID 機能を搭載しているって事で気になっていました そんな Arduino Leonardo の互換機が今回購入した Pro Micro って感じです
その HID 機能とはなんぞや?って話ですがまぁざっくり PC の標準的なキーボードやマウスを指すようです 要するに USB 接続した Arduino Leonardo (Pro Micro) がキーボードやマウスに化けるって事なんですね
そこで今回は連打系ブラウザゲーとして名高い CookieClicker を超連射できるボタンを実装してみることにしました

20211113072346-admin.jpg
そんな Pro Micro のピン配列図 なんかいろいろ書いてあるけど…単純な On/Off スイッチを付ける場合は  Arduino  と色付けされた 0 から 20 までのピンを使うようです

20211113072346-admin.png
それを今回はこんな感じで 10 番ピンに配線しました
そしてお次はそれを制御するプログラムで…

----------

#define RX_LED 17 // RX LED はポート 17 っぽい?
#define TX_LED 30 // TX LED はポート 30 っぽい?
#define SW 10 // スイッチ用
#include <Mouse.h> // マウス機能を使いたい

void setup() {
  pinMode(SW, INPUT_PULLUP);
  Mouse.begin();
}

void loop() {
  if(!digitalRead(SW)) {
    digitalWrite(TX_LED, LOW); // TX LED を点灯
    //Mouse.click();
    //delay(100);
    Mouse.press(MOUSE_LEFT);
    //delay(17); // 最速
    delay(20);
    Mouse.release(MOUSE_LEFT);
    //delay(9); // 最速
    delay(10);
    digitalWrite(TX_LED, HIGH); // TX LED 消灯
  } else {
    digitalWrite(RX_LED, LOW); // RX LED を点灯
    delay(40);
    digitalWrite(RX_LED, HIGH); // RX LED 消灯
    delay(20);
  }
}

----------

Arduino IDE でこんな感じのを用意してそれをマイコンボードに書き込みます 書き込まれた後に直ちに動作を開始します
スイッチが Off の時には基板上の LED が細かく点滅しています スイッチを On にするとマウスクリックの連射が始まります

マウスのクリックには Mouse.click(); って関数と Mouse.press(); Mouse.release(); とを選べるようです
Mouse.click(); は…いい感じに「押して離す」をまとめて実行できるようです
Mouse.press(); は…ドラッグ操作っていうんですかね この関数を実行するとマウスボタンが押されたままになり Mouse.release(); を実行するとマウスボタンが離されます

どちらの関数をどのようなタイミングで繰り返すかは個々の環境によって違うかと思いますが…
20211113072346-admin.jpeg
我が家の環境では Mouse.press(); Mouse.release(); を使って 1 秒間に 38 連射を記録しました → マウスクリック連射速度テスト
高橋名人もびっくりな超高速連射を実装できて満足しました!

Arduino Leonardo (Pro Micro) の HID 機能は手軽に有用な機能を実装できてなかなか楽しいです またぼちぼちイジっていきたいと思いました #Arduino

情報 <1926文字>

ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3

20211203180402-admin.png
 
・ラズパイとファイルのやり取りしたい
・ラズパイのアプリを PC 上で実行する?

  :

----- ラズパイとファイルのやりとりしたい -----

ファイル共有に samba サーバを建てるほどじゃないんだけど… PC とちょっとしたファイルのやりとりをしたい!って場面はちょくちょくあると思います そんな時は scp コマンドを使うと良いみたいです

使い方
scp [オプション] コピー元 コピー先

オプションはいろいろあるけど…よく使うものを勝手に抜粋(汗
-p 元のファイルの変更時間とアクセス時間およびモードを維持します
-r ディレクトリ全体を再帰的にコピーします

PC からラズパイにファイルを送信する その1
scp ./dir/filename.ext pi@hostname:
PC 上の ./dir/filename.ext ってファイルをラズパイにコピーする この場合…ユーザ pi のホームフォルダ (/home/pi) に filename.ext がコピーされる

ラズパイから PC にファイルを受信する その1
scp pi@hostname:/var/www.html/index.html ./
ラズパイ上の /var/www.html/index.html が PC 上のカレントフォルダに index.html としてコピーされる

PC からラズパイにフォルダを送信する その2
scp -pr ./pic pi@hostname:
PC 上の ./pic ってフォルダとその中身の全てをファイル更新日時・モードを保持したままラズパイにコピーする この場合…ユーザ pi のホームフォルダ (/home/pi) に pic フォルダを作成してコピーする

ラズパイから PC にフォルダを受信する その2
scp -pr pi@hostname:/etc/apache2 ./
ラズパイ上の /etc/apache2 ってフォルダとその中身の全てをファイル更新日時・モードを保持したまま PC に apache2 フォルダを作成してコピーする
※ ただし /etc/apache2 はユーザ pi で読めるけど…逆に書き込もうとすると root 権限が無いんで失敗しますが

hostname は IP アドレスでも OK です ファイル名にはワイルドカードも使えるようです

2018 年 4 月頃のアップデートで Windows 10 に OpenSSH ってのが導入されているらしく…その時に scp コマンドが入ったようです
20211024175230-admin.png
202110241752301-admin.png
試しに使ってみたところちゃんとコピーできたようです

  :

----- ラズパイのアプリを PC 上で実行する? -----

ラズパイ上で動くアプリケーションの画面を PC 上に持ってくることができるようです

使い方
ssh [オプション] pi@hostname

オプションはいろいろあるけど…よく使うものを勝手に抜粋(汗
-Y 信頼できるX11転送を有効にします
-C データ転送を圧縮します

普通に SSH による接続なんですが…ファイルマネージャ (pcmanfm) とかのグラフィカルなアプリケーションの実行画面を PC 上で再現できるようになるようです
SSH でログインした後にコマンドラインに実行したいアプリケーションのコマンドを打ち込み実行します
pcmanfm :ファイルマネージャ
lxtask :タスクマネージャ
lxterminal :LXTerminal
例えば上記のようなコマンドです

20211024175159-admin.png
Ubuntu MATE 上に再現されたラズパイのアプリケーション画面 心もち再現しきれてないものもあるけどご愛嬌かな
ファイルマネージャからイメージビューワなんかを起動するとその画面も PC 上に出てきます
ただしログインしたユーザ権限で動作できるアプリケーションに限るようです
macOS 系ではできたって話を聞いたことがあります Windows 系ではできないかも知れません(汗

そろそろネタが尽きてきたかな…って感じで長々とお疲れさまでした! #[Raspberry Pi] #コマンドヘルプ

  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
  ●ラズパイで Apache2 サーバを建ててゆるい設定をする
  ●モニタ無しでラズパイを VNC 接続できるとこまでセットアップ

情報 <2042文字>

ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2

20211203175809-admin.png
 
・テキストエディタ nano の超基本の使い方
・ユーザを切り替えて root で作業したい
・ラズパイは sudo した時にパスワードを聞かれないのは何故?

  :

----- テキストエディタ nano の超基本の使い方 -----

端末上(LX Terminal等)でテキストファイルを編集するには vi か nano を使うことになるんだけど… vi は操作感が少々特殊でとっつきにくいんでその辺が判りやすい nano を使うことが多いのかな?って事でその nano を初めて使う方向けの超基本の使い方の解説です

コマンド名は nano です 管理者権限で使いたい時は sudo nano って感じで使います
nano もしくは sudo nano とコマンド名のみで起動すると「新規ファイル」の編集として起動します nano 「ファイル名」 とファイル名を付けて起動すると「ファイル名のファイル」を編集します

202110181533153-admin.png
nano とだけ打ち込み起動した状態
よく使う(と思われる)コマンドが下部に記載されています
この中の 「^G ヘルプ」 とか 「^X 終了」 の「^」意味は以下のようになっています

ショートカットキーの記法は以下の通りです。(^)で表記されているショートカットはCtrlキーを押すか、Escキーを二回続けて押すことを表してします。(M-)で表記されているショートカットはAltキーCmdキーEscキーなどのメタキーを押して入力します。
 また、Escキーを二回押した後に000から255までの十進数を入力することで、コードに対応する文字を入力することができます。以下のキーストロークは主なエディタのウィンドウで使用できます。代替のキーストロークは括弧で囲って表記されます。


試しに Ctrl キーを押しながら G キーを押してみましょう
202110181533152-admin.png
nano のヘルプが表示されました
長くて表示しきれてないんでキーボードの ↑ キーと ↓ キーを使ってスクロールさせます
ヘルプの終了は Ctrl キーを押しながら X キーを押します
いっぱいコマンドがあって覚えきれなさそうだけど…実際には「ちょっと編集を」って感じなんで数個のコマンドを使うだけになると思います

そんなよく使うコマンド例

Ctrl + X :nano の終了 ファイルに変更がなければそのまま終了します 変更があれば保存するか破棄するか聞いてきます
Ctrl + O :ファイルの書き込み 新規ファイルとして編集していればファイル名を聞いてきます 既存ファイルを編集していればそのファイル名が表示されそこに保存します
Ctrl + S :ファイルを確認なしで保存する 慣れてくるとこれをよく使います
Ctrl + W :文字列の検索 指定した文字列が見つかればカーソルがその文字列の場所に移動する さらに次の文字列を探す場合には Alt + W もしくは Alt + で…逆向きに探す場合には Alt + Q もしくは Alt + と操作します
Ctrl + / :文字列の置換 探す文字列を指定した後に置き換える文字列を指定します 見つかった時に「1箇所置換」するか「全部を置換」するかを聞いてきます
Alt + # :コメント行の切り替え カーソルがいる行の先頭に # を付ける/付けないを繰り返す わりと便利なんでよく使う

だいたいこんなもんですかね しょーみもっと込み入った編集をしたい時には GUI で操作できる mousepad とかを使ったほうが判りやすくて便利だと思います ただ nano は諸々の設定作業なんかで「使わない訳にはいかない」テキスト・エディタなんで最低限の操作は覚えておきたいものです

  :

----- ユーザを切り替えて root で作業したい -----

サーバの設定をしてる時とかに…いちいち sudo + コマンド ってやるんがめんどくさい!!(-_-#)って時に感情に任せて root にチェンジして作業したいと思ったことはありませんか? 私はたまにあります…って事なんでその辺の話を少々

202110181533155-admin.png
通常はユーザ pi で作業してるんだけどこれをユーザ切り替えの su コマンドを使って管理者 root になろうとするんだけど…認証失敗して root になれません これは root にパスワードが設定されてないんで「パスワードによる認証ができない」ってのが原因のようです

まぁこれを解決するには root にパスワードを設定すればいいんだけど…世間的にはセキュリティ云々の事情で root にパスワードを設定すべきではないって事なんでちょっと躊躇しちゃいますね ※ root にパスワードを設定すると SSH などで root ログインできるようになるんで好ましくないらしいのです

しかしこれが実機の前に居るのであれば別の方法でどうにかできます LXTerminal を sudo で起動してみましょう

202110181533154-admin.png
sudo x-terminal-emulator
無事(?)に root に切り替えることができました
でもまぁ何でもできる管理者 root なんで…くれぐれも慎重な操作をお願いします(汗

※ 追記 ※
別のシェルでログインを試みるって手法をもっと試してみるっていうか…なんか su コマンドにシェルを指定するオプションがあるのに気づいたんでそっちも試してみることにします
sudo su -s /bin/bash root
これで root に切り替えることができました こっちのほうがスマートな操作って感じなのかな

ちなみにオプション指定の違いがあるっていうか…
20211205041659-admin.png
sudo su -s /bin/bash root
sudo su -s /bin/bash - root
「-」オプションを付けない時はコマンドを実行したユーザのホームディレクトリ・環境変数が引き継がれて
「-」オプションを付た時は指定したユーザのホームディレクトリ・環境変数に設定されるようです

※ さらに追記 ※
もうちょっとシンプルにっていうか sudo -isudo susudo su - でもいいみたい
この場合もそれぞれ環境変数の引き継ぎに違いがあったりするようです 使いやすい手法を覚えておきタイネ!

  :

----- ラズパイは sudo した時にパスワードを聞かれないのは何故? -----

Ubuntu などを使っている時に sudo すると…
202110181533151-admin.png
パスワードを聞かれます

20211018153315-admin.png
でも Raspberry Pi OS の sudo だとパスワードを聞かれません これは何故なんでしょう?

まぁ sudo がそう云う設定になってるんですけどね…って事でその設定を見てみましょう sudo の設定内容は sudo cat /etc/sudoers で確認することができます
その中に %sudo ALL=(ALL:ALL) ALL なんて行があります これはグループ sudo に属する全てのユーザが全てのコマンドを実行できるって定義らしいです

それではグループ sudo に誰が属しているのか見てみましょう これは sudo getent group sudo で確認できます おそらく sudo:x:27:pi ってなってると思うんだけど…まぁグループ sudo にユーザ pi が含まれているのが判ります この設定によりユーザ pi が sudo した時に全てのコマンドが使えるって事になるらしいです

ちなみに /etc/sudoers は極めて重要なファイルなんで直接編集しないほうがいいらしいです これを編集するには専用コマンドの sudo visudo を使います なんでも書き込んだ内容に間違いがないか構文チェックして正しければ書き込むって感じになってるらしいです

まぁそれはともかく sudo した時にパスワードを聞かれないって話でしたよね これはさらに細やかな設定ファイルが /etc/sudoers.d/ に入ってるらしいのでそれを sudo cat /etc/sudoers.d/010_pi-nopasswd で確認してみましょう
すると pi ALL=(ALL) NOPASSWD: ALL ってのがあります この NOPASSWD ってのがパスワードを聞かれないための設定らしいです
この /etc/sudoers.d の設定ファイルも直接書き換えるのではなく専用コマンドの sudo visudo -f /etc/sudoers.d/010_pi-nopasswd を使うらしいです

まぁただそれだけの話なんですけどね モヤモヤしてた謎が解けたらイイネ!って感じで長々とお疲れさまでした! #[Raspberry Pi] #コマンドヘルプ

  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.3
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.2
  ●ラズパイの頻度低めだけど知っておきたい設定メモ Vol.1
  ●ラズパイで Apache2 サーバを建ててゆるい設定をする
  ●モニタ無しでラズパイを VNC 接続できるとこまでセットアップ

情報 <3977文字>

DASHBOARD

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■ハッシュタグ:

■カテゴリ:

■日付検索:

■機器状態:

Raspberry Pi 4 Status

編集

RSSフィード