SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|

2016-09-03(Sat) ラズベリーパイを箱詰め

  アクセスポイントとして実用域に達してきたので、ラズベリーパイをケースに入れてやることにした。

  画像の説明

  とはいっても、今回、たかがケースに1000円も払うのが惜しくなったので買ってない。元箱を切り取って入れてやる。箱入りパイ。

  一応、底面はちゃんとネジで止めている。電源LEDがぼんやり透けて光るのがイイ感じ。


2016-09-04(Sun) ラズベリーパイ(pidora)でメディアサーバする、そして心地良い目覚めへ

  ラズベリーパイで無線LANアクセスポイントを作り、ラズベリーパイで無線LANブリッジを作ったことにより、愛用のミニコンポ「DENONのRCD-N9」を正しく宅内LANに「有線」で接続することができた。こんな感じに。

  インターネット─[モデム]─宅内LAN─[無線アクセスポイント(ブリッジ)]…無線LAN…[無線ブリッジ(コンバータ)]─直結LAN─[ミニコンポ]

  このような構成にした動機は、RCD-N9の無線LAN接続機能が「どタコ」なことにある。無線経由でflac等を再生中、他の無線トラフィックが増えると、接続が切断され、音楽が切れるのだ。切れると、再接続まで時間がかかるし、曲の再生は最初からになってしまう。それが頻繁に発生する。

  実に「音楽が途切れる」という事態に対しては、恐ろしく高いレベルの腹立たしさを感じさせられるものである。仮にも高品質な音楽の再生を謳う機器においては「極力避けるべき事態」ではないのか。無線LANは不安定だから仕方ない、などということは断じてない。TCPという仕組み上、再生が止まることはあっても切れることはあり得ない。実際、動画サイトで切れるなどという事態に遭遇したことはないはずだ。

  ちょっとtcpdumpでパケットの様子を調べた限りでは、RCD-N9側のTCPスイートに問題があるようで、その点ではRCD-N9は疑うことのない超ド級のクッソプロダクトなのだが、それ以外の点は十分に及第点なので、その点はあきらめて、ラズベリーパイを噛ますことでフォローすることにしたのである。

  具体的にはどうするかというと、上述の通りRCD-N9とラズベリーパイ間を有線LANで直結とし、通信の安定性の低い無線LANの通信をLinuxのNFS接続で保障してやるのである。つまりラズベリーパイ上にDLNAサーバを配置するのである。

  NFSについては、サーバ側で公開の設定をしておいて、

server.itline.jp:/root # cat /etc/exports
/home/mediatomb 172.xx.xx.0/24(ro)

  ラズベリーパイ側でマウントするだけ。

xxxpi.itline.jp: /root # yum install nfs-utils
xxxpi.itline.jp: /root # mkdir /mnt/mediatomb
xxxpi.itline.jp: /root # mount server:/home/mediatomb /mnt/mediatomb/

  実用上は、起動時に自動マウントするよう、/etc/fstabに以下のエントリを加えておくことになる。

xxxpi.itline.jp: /root # cat /etc/fstab
server:/home/mrdiatomb  /mnt/mediatomb  nfs  defaults  0 0

  NFSマウントができたら、DLNAサーバであるMediaTombを導入する。作業はこれだけ。

xxxpi.itline.jp: /root # yum install mediatomb
xxxpi.itline.jp: /root # cd /etc
xxxpi.itline.jp: /etc # diff mediatomb.conf.org mediatomb.conf
< MT_INTERFACE="NOT_SET"
> MT_INTERFACE="br0"
xxxpi.itline.jp: /etc # cd mediatomb
xxxpi.itline.jp: /etc/mediatomb # diff config.xml.org config.xml
<     <name>MediaTomb</name>
>     <name>MediaTomb - xxxpi</name>
xxxpi.itline.jp: /etc/mediatomb # systemctl enable mediatomb
xxxpi.itline.jp: /etc/mediatomb # systemctl start mediatomb

  この後http://xxxpi:50500/にWebアクセスして、/mnt/mediatombのディレクトリを登録してやれば、RCD-N9のMUSIC SERVER機能で、flacファイル等を選択、曲を再生できるようになる。これにて、ハイパーミッドナイトサーバ(オイラは寝しなに音楽を聴くので)の完成である。

  だが、今回はまだ続く。

  オイラは起き抜けにも音楽を聴くのだが、それにRCD-N9のアラーム機能を使っている。開始時刻を6:00に設定、入力ソースにはCDを選択、寝る前に好みのCDをトレイにセットする。そして6:40頃に気分よく起き出すのだ。

  ところが問題がある。CDのセットが面倒くさい。毎日のアラームをセットすると休みの日にも流れてしまう(気づかないが)。CDの長さによって、起き出す時刻に曲が終わってしまったりする。

  仕方ないといえば、仕方ないが、そこをサッサとあきらめたりしないのがエンジニアである。インターネットラジオ機能で、自分専用に曲をストリーミング配信することで、上記をまとめて解決してしまうのである。おそらく、インターネットラジオ配信において、最短配信距離記録ギネス更新(直線距離10cm以下)という偉業達成の瞬間ではないかと思う。

  ストリーミング配信のアプリにはicecastを使う。例によって、ググると大量のサイトが引っかかるのだが、手順は書いてあるものの、その意図がよくわからない。どうも、こういうことのようだ。

  icecastは、フロントエンドサービスを行うアプリ。ウェブサーバとして振る舞い、インターネットラジオ聴取クライアントに曲を配信する。が、自らは曲を扱わず、インターネットラジオ配信クライアント(?)から曲の提供を受ける。

  icesは、インターネットラジオ配信クライアント。icecastにアクセスし、icecastが配信する曲を提供する。んが、icesはバージョン2からOggVorbis形式の配信しか対応していないようで、mp3形式では配信できない。古いicesはできるようだが、そんなものを使うべきではないだろう。

  ezstreamは、icesと同じく、インターネットラジオ配信クライアント。icecastにアクセスし、icecastが配信する曲を提供する。こっちはmp3形式での配信に対応している。

  上記はどれも、Icecastスイートとしてxiphという開発コミュニティで扱っているようで、ここはOggVorbisやflacの開発主体でもあるようだ。

  配信形式によって、アプリの使い分けが必要なことや、配信形式が特定の形式に限定されている意味がよくわからんが、なにせflacでの配信はできず、RCD-N9も対応していないので、mp3形式での配信が妥協点である。

  というわけで、icecastの導入、設定である。

xxxpi.itline.jp: /root # yum install icecast ezstream
xxxpi.itline.jp: /root # cd /etc
xxxpi.itline.jp: /etc # diff icecast.xml.org icecast.xml
<         <bind-address>127.0.0.1</bind-address>
>         <bind-address>0.0.0.0</bind-address>
xxxpi.itline.jp: /etc # systemctl start icecast

  とりあえず、これだけでhttp://xxxpi:8000/にアクセスすると結果が返るようになる。

  次は、ezstreamの導入、設定である。

xxxpi.itline.jp: /etc # cp /usr/share/doc/ezstream/examples/ezstream_mp3.xml ezstream.xml
xxxpi.itline.jp: /etc # find /mnt/mediatomb/YUMI_54_WITH3 -name "*.mp3" > /usr/share/icecast/playlist.m3u
xxxpi.itline.jp: /etc # diff ezstream.xml.org ezstream.xml
<     <filename>playlist.m3u</filename>
>     <filename>/usr/share/icecast/playlist.m3u</filename>
xxxpi.itline.jp: /etc # ezstream -c /etc/ezstream.xml 

  mp3ファイルを羅列したプレイリストファイルを生成し、ezstreamの設定ファイルに指定、ezstreamを起動する。この状態でhttp://xxxpi:8000/にアクセスすると演奏中の状態が確認できる。また、インターネットラジオ聴取クライアントにhttp://xxxpi:8000/streamを指定すれば、とりあえず音楽を聴くことができる。

  んが、これでは不満。オイラのライブラリはflacで構築しているのだ。百歩譲ってmp3配信は許容するが、ライブラリをmp3化するのは許容できない。二重に持つのもイヤだ。そこでezstreamの「リ・エンコーディング」機能を使う。

xxxpi.itline.jp: /etc # cp /usr/share/doc/ezstream/examples/ezstream_reencode_mp3.xml ezstream.xml
xxxpi.itline.jp: /etc # find /mnt/mediatomb/YUMI_54_WITH3 -name "*.flac" > /usr/share/icecast/playlist.flac.txt
xxxpi.itline.jp: /etc # diff ezstream.xml.org ezstream.xml
<     <filename>playlist.pl</filename>
>     <filename>/usr/share/icecast/playlist.flac.txt</filename>
<     <playlist_program>1</playlist_program>
>     <playlist_program>0</playlist_program>
>     <stream_once>1</stream_once>
<             <!-- <encode>Not supported Yet</encode> -->
>             <encode>lame - -</encode>
xxxpi.itline.jp: /etc # ezstream -c /etc/ezstream.xml 

  最初からflacのサンプル記述があるので、lameを噛ます指定を加えるだけだ。リアルタイムエンコーディングだから、配信中のCPU使用率はハネ上がるが、特に音飛びが起こるほどでもなく、問題はない。

  そして、今回はまだ続く。

  曜日によって、好みのアルバムが流れるようにし、どのアルバムを選択しても起床時刻である6:40に最後の曲の再生が終わり、その後にスプラトゥーンの「Now or Never!」もしくは「イマ・ヌラネバー!」が流れるようにしたい。要するに「あと1分!」のタイミングで「あと1分!」のBGMが流れるようにするというわけだ。

  というわけで作ったのがこのスクリプト。指定されたディレクトリのflac群から、再生時間が40分未満になるように適当に間引き、最後に「あと1分!」の曲を追加し、再生時間が50分ちょうどになるよう、頭に無音時間を追加したプレイリストを作成する。そしてcron機能により、5:50分からストリーミング再生を開始。

MAILTO=""
40 5 * * 2 ./create_morning_playlist /mnt/mediatomb/YUMI_03_HEAR > playlist.flac.txt
40 5 * * 3 ./create_morning_playlist /mnt/mediatomb/MARI_15_RAINSHINE > playlist.flac.txt
40 5 * * 4 ./create_morning_playlist /mnt/mediatomb/YUMI_05_AI_HA_GENKI > playlist.flac.txt
50 5 * * * /usr/bin/ezstream -c /etc/ezstream.xml

  RCD-N9の側ではアラーム機能の開始時刻を5:50に設定、入力ソースにはインターネットラジオのオレオレトリーミングチャンネルを選択。

  というわけで、夢の起床環境へまた一歩近づいた。これにて、ハイパーモーニングサーバの完成……といいたいところだが、実は、まだまだ実現したい機能があるのであった。それはまたそのうちに。


2016-09-08(Thu) RubyGems環境をなんとかする

  個人的にCUI好きなのだが、GUIが必要な時もある。そんな時はcursesだ。リモートコンソール上でセミGUIが使える。作るのもラクだし、動作も軽快。てなわけで、これまで、これやら、これやら、これやらを作って、実用に供している。

  んが、いつしかRubyの標準添付ライブラリにcursesが含まれなくなってしまった。Fedoraのrubygem-xxxシリーズでの提供もない。別途、RubyGemsで入れろ、ということらしい。むぅ。

  ところが、たまにしかやらないし、ちょくちょくディストリの仕様側が変わるので、いつも試行錯誤になってしまう。そこで、現時点において、うまいことRubyGemsの環境を構築できた方法を「考え方つきで」メモしておくことにした。目的は「gem install curses」を成功させること。今回はFedora24で実行している。

  うおりゃ。

[root@xxx ~]# gem install curses
-bash: gem: command not found

  gemが入ってない。

[root@xxx ~]# dnf install rubygems

  うおりゃ。

[root@xxx ~]# gem install curses
……沈黙

  proxyの設定がない。

[root@xxx ~]# export http_proxy=http://proxy.example.com:8080/
[root@xxx ~]# export https_proxy=http://proxy.example.com:8080/

  うおりゃ。

[root@xxx ~]# gem install curses
Fetching: curses-1.0.2.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-3344-15aufht.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/include/ruby.h ★
 
extconf failed, exit code 1
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  ruby.hがない。

[root@xxx ~]# dnf install ruby-devel

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-3373-17xujbr.rb extconf.rb
checking for tgetent() in -ltinfo... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
 
Provided configuration options:
<略>
/usr/share/ruby/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first. ★
	from /usr/share/ruby/mkmf.rb:541:in `try_link0'
<略>
	from extconf.rb:29:in `<main>'
 
To see why this extension failed to compile, please check the mkmf.log which can be found here:
 
  /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log
 
extconf failed, exit code 1
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  development tools、要するにgccが入ってない。

[root@xxx ~]# dnf install gcc

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-3509-162u4n0.rb extconf.rb
checking for tgetent() in -ltinfo... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
 
Provided configuration options:
<略>
/usr/share/ruby/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
	from /usr/share/ruby/mkmf.rb:541:in `try_link0'
<略>
	from extconf.rb:29:in `<main>'
 
To see why this extension failed to compile, please check the mkmf.log which can be found here:
 
  /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log ★
 
extconf failed, exit code 1
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  ログを見てみる。

[root@xxx ~]# cat /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log
"gcc -o conftest -I/usr/include -I/usr/include/ruby/backward -I/usr/include -I.    -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -mtune=generic -fPIC conftest.c  -L. -L/usr/lib64 -L. -Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -fstack-protector -rdynamic -Wl,-export-dynamic  -m64   -lruby  -lpthread -ldl -lcrypt -lm   -lc"
gcc: error: /usr/lib/rpm/redhat/redhat-hardened-cc1: No such file or directory ★
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */

  /usr/lib/rpm/redhat/redhat-hardened-cc1がない。どのパッケージに入っているかわからないので調べる。

[root@xxx ~]# dnf provides /usr/lib/rpm/redhat/redhat-hardened-cc1
redhat-rpm-config-40-2.fc24.noarch : Red Hat specific rpm configuration files ★
Repo        : fedora
 
redhat-rpm-config-41-2.fc24.noarch : Red Hat specific rpm configuration files ★
Repo        : updates

  redhat-rpm-configパッケージということなので入れる。

[root@xxx ~]# dnf install redhat-rpm-config

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-3658-cnj5ie.rb extconf.rb
checking for tgetent() in -ltinfo... no
checking for tgetent() in -ltermcap... no
checking for ncurses.h... no
checking for ncurses/curses.h... no
checking for ncursesw/curses.h... no
checking for curses_colr/curses.h... no
checking for curses.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
 
Provided configuration options:
<略>
 
To see why this extension failed to compile, please check the mkmf.log which can be found here:
 
  /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log ★
 
extconf failed, exit code 1
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  ログを見てみる。

[root@xxx ~]# cat /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log
 :
 :
have_header: checking for curses.h... -------------------- no
 
"gcc -E -I/usr/include -I/usr/include/ruby/backward -I/usr/include -I.    -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -mtune=generic -fPIC  conftest.c -o conftest.i"
conftest.c:3:20: fatal error: curses.h: No such file or directory
 #include <curses.h>
                    ^
compilation terminated.
checked program was:
/* begin */
1: #include "ruby.h"
2: 
3: #include <curses.h>
/* end */
 
--------------------

  curses.hがない。これはcursesの開発パッケージに入っている。

[root@xxx ~]# dnf install ncurses-devel

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
ERROR:  Error installing curses:
	ERROR: Failed to build gem native extension.
 
    current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
/usr/bin/ruby -r ./siteconf20160909-4359-1h9o77p.rb extconf.rb
checking for tgetent() in -ltinfo... yes
checking for ncurses.h... yes
checking for initscr() in -lncursesw... yes
header: ncurses.h
library: ncursesw
<略>
checking for function curses_version in ncurses.h... yes
checking for variable curses_version in ncurses.h... no
creating Makefile
 
To see why this extension failed to compile, please check the mkmf.log which can be found here:
 
  /usr/local/lib64/gems/ruby/curses-1.0.2/mkmf.log
 
current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
make "DESTDIR=" clean
sh: make: command not found ★
 
current directory: /usr/local/share/gems/gems/curses-1.0.2/ext/curses
make "DESTDIR="
sh: make: command not found ★
 
make failed, exit code 127
 
Gem files will remain installed in /usr/local/share/gems/gems/curses-1.0.2 for inspection.
Results logged to /usr/local/lib64/gems/ruby/curses-1.0.2/gem_make.out

  makeが入っていない。

[root@xxx ~]# dnf install make

  うおりゃ。

[root@xxx ~]# gem install curses
Building native extensions.  This could take a while...
Successfully installed curses-1.0.2
Parsing documentation for curses-1.0.2
Installing ri documentation for curses-1.0.2
Done installing documentation for curses after 1 seconds
1 gem installed

  というわけで「gem install curses」に成功ッ!

  画像の説明

  cccdct復活!


2016-09-12(Mon) Fedora24でsdccしてrakipicする

  先日、主たる環境をFedora24に移行したのだが、早々にPICマイコンを使って電子工作をする用事が出てきて、開発環境を整えることに。

  基本、オイラはフリーのCコンパイラであるsdccを愛用しているので、Fedoraの標準リポジトリから導入すればいいのだが、Fedoraはフリーソフト原理主義なので、非フリーのライブラリやインクルードファイルが故意に外されていて、毎度ややこしい作業が必要になるのが面倒くさい。また、バージョンが上がるとコンパイラの仕様もチョイチョイ変わるので、それでコンパイルが通らなくなって悩まされることも多い……って、いわんこっちゃない。いってるそばから両方とも引っかかったワイ。

  まずは、非フリーのライブラリやインクルードファイル関係。sdccのソースを持ってきて、ライブラリをコンパイルして、適切な場所にコピー……とかしようとしたが、以前のMINTと環境と様子が変わっていて何やらよくわからん。結局、非フリー除外のスイッチを外し、パッケージを丸ごと再ビルドするのが正解みたいだ。手順で言うと以下。これで、サクッとmakeが通るようになった。

# dnf install gputils
# dnf download --source sdcc
# rpm -ivh sdcc-3.6.0-2.fc24.src.rpm 
 
# vi rpmbuild/SPECS/sdcc.spec 
< %configure --enable-doc --disable-non-free STRIP=: ${OPTS}
> %configure --enable-doc STRIP=: ${OPTS}
 
# dnf install rpm-build
# dnf install python bison boost-devel flex latex2html lyx texlive-ulem texinfo
# dnf install gcc-c++
# rpmbuild -ba rpmbuild/SPECS/sdcc.spec 
 
# rpm -ivh rpmbuild/RPMS/x86_64/sdcc-3.6.0-2.fc24.x86_64.rpm

  次に、コンパイラの仕様もチョイチョイ変わる関係。PIC18系のコンフィグ指定のスタイルが変更されている。

< static __code char __at (__CONFIG1H) configword1h =
<   _IESO_OFF_1H &                  // Oscillator Switchover mode disabled
<   _FCMEN_OFF_1H &                 // Fail-Safe Clock Monitor disabled
<   _OSC_INTIO67_1H;                // Internal oscillator block, port function on RA6 and RA7
 
> #pragma config IESO   = OFF       // Oscillator Switchover mode disabled
> #pragma config FCMEN  = OFF       // Fail-Safe Clock Monitor disabled
> #pragma config OSC    = INTIO67   // Internal oscillator block, port function on RA6 and RA7

  最後に、自製のLinux用の秋月PICライタ「rakipic」もチョイチョイと修正。今回は、PIC16F688で赤外線リモコン信号の送信を行いたいので、ライブラリとサンプルプログラムも更新した。パッケージを置いておく。


2016-09-17(Sat) ラズベリーパイ3B(Raspbian)で電子工作を始める

  先日、PICマイコンの開発環境を整えたことだし、ラズベリーパイ側をイジり始める。現在、ウチにはラズベリーパイが4台(A, B,B+, 3B)あるが、B+は無線アクセスポイント、Bは無線コンバータとして、実用に供しているので、3Bで開発を行う。なお、3BのNOOBSではpidoraが選べなかったので、Raspbianが入っているが、まぁ、開発する限りでは似たようなもんだろう。

  自作してもよかったが、面倒くさいので秋月で買っておいた、ブレッドボード用の変換コネクタをセットして開発開始。

  画像の説明

  まずは、定番のLEDの点灯。GPIOの状態を確認するため、まずはgpioコマンドを一発。

user@raspberrypi:~ $ gpio readall
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |★
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+

  適当なポートを出力モードに切り替える。

user@raspberrypi:~ $ gpio -g mode 25 out
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | OUT  | GPIO. 6 | 6   | 25  |

  あとは、ポートの電圧を上げ下げするだけ。

user@raspberrypi:~ $ gpio -g write 25 1
user@raspberrypi:~ $ gpio -g write 25 0

  シェルスクリプトでLEDを点滅。こりゃ、お手軽じゃ。

user@raspberrypi:~ $ while true; do gpio -g write 25 1; sleep 0.5; gpio -g write 25 0; sleep 1; done

  次はシリアルポート、なのだが、どうもPi3からBluetoothとの兼ね合いで扱いが厄介らしい。とりあえず、GPIOの14番をシリアル送信モードに切り替えてみた。

root@raspberrypi:~# gpio -g mode 14 ALT0 
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |

  でもってraspi-configでシリアルを有効にしてみた。

root@raspberrypi:~# raspi-config 
9 Advanced Options
A7 Serial
<いいえ>
<了解>

  この作業は、結局、以下の記述と等価らしい。

root@raspberrypi:/boot# diff config.txt.org config.txt
> enable_uart=0
root@raspberrypi:/boot# diff cmdline.txt.org cmdline.txt
< dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
> dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

  再起動して「echo 'aaa' > /dev/ttyAMA0」してみたが、bashが100%になってプロセスストール。通信速度を変えてみる。

root@raspberrypi:~# stty speed 115200 < /dev/ttyAMA0 
115200
root@raspberrypi:~# stty -g < /dev/ttyAMA0 
0:4:1cb2:a30:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

  更に謎の設定を追加してみる。

root@raspberrypi:/boot# diff config.txt.org config.txt
59a60,61
> enable_uart=0
> dtoverlay=pi3-miniuart-bt

  再起動すると、/dev/ttyS0が現れた。「echo 'aaa' > /dev/ttyS0」してみたが、プロセスストールはしなくなったものの、出ない。

  config.txtを「enable_uart=1」を変更してみる。

root@raspberrypi:/boot# diff config.txt.org config.txt
> enable_uart=1
> dtoverlay=pi3-miniuart-bt

  再起動して「echo 'aaa' > /dev/ttyAMA0」すると、なにやらシリアルに反応が得られた。通信速度を合わせてやったところ、いつもの自作のserialDebugスクリプトによる受信に成功した。

  とりあえず、PICの学習リモコンでも操作できるようにしてみるかな。


2016-09-22(Thu) ラズベリーパイ(pidora)でLED照明をPWM制御

  画像の説明


2016-09-25(Sun) スプラトゥーン甲子園、東海地区大会、観戦


2016-09-27(Tue) 15年ぶりのアードベック

  ひさびさにウイスキー関連エントリ。

  以前から「ハイローミックス」体制を構築しようと、安ウイスキーを物色しているのだが、やはり、安いとそれなりだ。基本、呑み切ることにしているので、スカを引いてしまうと長らくツラい。なにしろ、安物とタリスカーでは、擦りガラスとステンドグラスくらいの違いがある。

  とはいえ、タリスカーばかりでもつまらないので「ハイ」の方も時々散らすわけだが、以前、クセの強さに定評のあるラフロイグには、それほどピンとこなかった。そこで「……ラフロイグがやられたようだ」「ククッ……奴は四天王の中でも最弱……」というわけではないが、今回はクセの強さでは最強クラスのアードベックに登場を願ったのであった。

  実は15年ほど前、一度は呑んでいるのだが、その時は経験も浅かったこともあり、あまりの強烈さになかなか呑み進められなかった記憶がある。そのリベンジという意味合いもある。

  で、呑んでみた……うーむ、やっぱり口には合わんかも。その強烈さはイヤではなくなったが、だからといって好きかと言われればそうでもない。以前に呑んだ余市ほどじゃないが、好きなベクトルじゃないな。

  ちなみに「ロー」の方は、クレイモアあかしキャッスルロックと、1000円クラスを試してきたが、クレイモアは悪くなかった。タリスカーとベクトルは違うが、甘さを前面にまといつつ、それなりの深みも感じる。例えるなら黄色のベッコウアメか。あかしとキャッスルロックは、どっちも単なる擦りガラス。

  画像の説明

  そういえば、以前呑んだフロム・ザ・バレルも擦りガラスとまではいわんが、ピンとこなかった。

  一方で、先日、鳥貴族の呑み放題プランで頼んだ響 JAPANESEHARMONYは悪くなかった。初めて、サントリーのウイスキーでウマいと思えた気がする。刺激はそこそこだが、かなりの華やかさを感じた。んが、静かな場所でゆっくり味わいたい気はするものの、タリスカー以上の値段を出して、ボトルで買うかといわれるとどうにも微妙なのも確かなんだよな。

  それはそうと、先日、なにげなくコンビニで買ったミックスナッツをツマミにウイスキーをやったら、これが驚くほどにミート。これまでチョコレートをツマミにやっていたのだが、いきなり完全放置状態に。何をイマさらミックスナッツなんていう、ツマミの定番中の定番に驚いているんだといわれるかもしれないが、ホントにそのとおり。

  しかしさすがにダイソーのはあきまへん。その後にそこそこのミックスナッツを食ったら品質の差に歴然。さらに、カルディのスモークナッツミックスは舌からウロコのウマさ。

  ふと、ナッツのトップメーカってどこだろうかと思って調べたら、東洋ナッツという会社があるのね。それほどには高くないみたいだし、今度試してみることにしよう。


2016-09-29(Thu) 卓上カレンダにムキーッ!! 

  ウチは壁にカレンダを吊るす習慣はなく、ダイニングの横に卓上カレンダを置いているのだが、気に入るアイテムがなくてずっとイライラしていた。単に「表と裏」に「今月」と「来月」を配置したいだけなのだが、製品を「綴る」の都合上、そういうアイテムは売っていないのだ。で、作った。

  画像の説明

  例によって、自作のTrueLegacyGraphicsCairoライブラリを使い、以前に作ったカレンダ作成スクリプトをチョイチョイと手直しして作った。生成されるPDFライブラリごとスクリプトを置いておく。

  アイデアという程のものでもないが、ミソは、スタンド部分の一部を切り欠いて、表と裏にダブルクリップでカレンダを止められるようにしたこと。よく考えれば、卓上カレンダにおいて「綴る」必然性なんてまったくない。サッと紙を外せたほうが、記入する場合にもラクだ。

  ちなみにこの金色でスケスケのワイヤフレームなダブルクリップはダイソーで売っていたものだが、久々に深く感心させられた一品である。この発想はなかった。

  いざ印刷しようとしたらプリンタ複合機(PX-403A)の給紙トレイが折れていたので、1.5mmのドリルで穴を穿けて針金を通して修理しておく。

  画像の説明

  気づけば、このプリンタも既に5年も前に買ったものだが、使用頻度が極めて低いにもかかわらず、軽いインク詰まり程度で助かっている。メーカにしてみれば「1万ソコソコの製品をいつまで使う気だよ」と思っているかもしれんが、なにせ使用頻度が低いもんなぁ。