HS-15Pを動かしてみる(4)LCD追加

Arduinoの嬉しいところは、電子工作の世界としては珍しくライブラリがあるところです。

で、早速LCDモジュールを接続し、LCDに出力してみました。表示内容は左から室温、湿度、センサ抵抗値の対数値です。写真を見るとわかるのですが、室温25度、湿度25%なので、めちゃくちゃ乾燥しています。

接続したLCDは秋月の300円LCDモジュール(HD44780U使用、16文字×1行)です。この手のLCDモジュールは画面の右半分と左半分のアドレスが連続していなかったりします。そのため何らかの工夫が必要になるのですが、残念ながらArduinoのLiquidCrystalライブラリはそこまではサポートしていないようです。ソースをみてもそれらしい記述はありません。ただ、20文字×4行のLCDモジュールを想定した処理は入っているようですので、それを利用して8文字×2行として設定を行い、右半分は2行目扱いで文字を表示することでお茶を濁しました。

HS-15Pを動かしてみる(3)Arduino編

無事に「HS15P湿度センサの簡易動作実験」の追試ができたところで、これをArduinoに移植してみました。

回路図は・・・・省略。

  • Analog0にLM35DZの出力を接続
  • Analog1に湿度センサと0.022uFの間の端子を接続
  • Analog2に湿度センサを接続(デジタル出力ポートとして使用)

という接続です。

ソフトウェアの方はほぼそのままの移植ですが、

  • A/D変換はArduinoのライブラリを使用
  • I/O端子制御もArduinoのライブラリを使用
  • シリアル出力もArduinoのライブラリを使用
  • ループで時間調整しているのを delayMicroseconds()に置き換え
  • 変数名をちょっとそれっぽく、と思ったけど中途半端・・・

などの変更をしました。それ以外はそのまま移植しましたが、あっさりそれっぽく動きました・・・。ただ、校正のための道具がないので、そこまで・・・と思ったのですが、もうちょっと頑張ってみます。

まず、元のATTINY13でHS15Pの代わりに用意した1KΩ、10KΩ、100KΩ、1MΩの抵抗をつけてデバッグ用に出力されている抵抗の対数値を記録します。1KΩ時が219、10KΩ時が180、100KΩ時が140、1MΩ時が99と、ほぼ理論値通りになりました。

この抵抗をArduino版に接続すると、1KΩ時が226、10KΩ時が181、100KΩ時が141、1MΩ時が100といずれも少し大きめの値が出力されます。これは充電時間が長めになっているからだと思われます。

そこで、時間設定を0.1us単位で管理して、delayMicroseconds()に渡す際に10で割ってやると、1KΩ時が240、10KΩ時が209、100KΩ時が141、1MΩ時が99と、大きな誤差がでるようになってしまいました。おそらく除算を必要とするようになってしまったので、結果的にwaitが増えてしまったのでしょう。

結局、測定レンジを充電時間で指定するのではなく、インデックスで指定するようにしてwaitの時間はその中で swtich()~case で充電開始終了を含めたテーブル形式にして、待ち時間も調整することにしました。その結果、1KΩ時が219、10KΩ時が180、100KΩ時が139、1MΩ時が99と、ほぼ合うようになりました(当然ですが・・)。

これでセンサをHS-15Pに戻せば概ね正しい値を測定できるはずです。

HS-15Pを動かしてみる(2)

組み上げたら、まずヒューズビットを書き込みます。

$ avrdude -c avrisp2 -p t13 -P usb -t
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9007
avrdude> r lfuse
>>> r lfuse
0000 6a |j |
avrdude> r hfuse
>>> r hfuse
0000 ff |. |
avrdude> w lfuse 0 0x3a
>>> w lfuse 0 0x3a
avrdude> w hfuse 0 0xff
>>> w hfuse 0 0xff
avrdude> quit
>>> quit
avrdude: safemode: Fuses OK
avrdude done. Thank you.

次に、プログラムを書き込みます。

$ avrdude -c avrisp2 -p t13 -P usb -U flash:w:TestHS15.hex:i
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9007
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file “TestHS15.hex”
avrdude: writing flash (896 bytes):
Writing | ################################################## | 100% 0.38s
avrdude: 896 bytes of flash written
avrdude: verifying flash memory against TestHS15.hex:
avrdude: load data flash data from input file TestHS15.hex:
avrdude: input file TestHS15.hex contains 896 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.26s
avrdude: verifying …
avrdude: 896 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done. Thank you.

・・・・が、このままではシリアルの論理が違うので、このままでは表示できません。

2SC2120を1段間に入れて、論理を反転させました。また、よく考えると温度を取得するためのLM35DZのA/D変換の基準電圧はVccで5Vが前提になっています。しかしPICによるシリアルモニタから供給できるのは3.3Vなので、正常に温度が取得できなくなるはずです。ですので、外部電源5Vで動作するように改めました。

DebianのPCにつないで、screenをシリアルターミナルとして起動すると、A/D変換値、温度、湿度の順で周期的に出力されます。(screenコマンドは、C-a H でログファイルを吐くので、その機能でファイルに記録することもできる)

ちなみに自分の部屋の湿度は暖房あり(エアコン使用)で20%台、暖房無しで30%程度でした。非常に乾燥しやすい部屋とはいえ、あってるのかよくわかりません。

そこで、ビニール袋に濡らしたティッシュペーパーと共に入れて封をして放置してみたところ、23度20%(ソースをみるとわかりますが、20%以下は計測できません)からぐんぐん袋内の湿度が上昇し、すぐに80%近く、30分くらいで90%くらいになりました。

HS-15Pを動かしてみる(1)

部屋の片付けをしていたら、秋月で買ったHS-15Pという湿度センサが出てきました。

ずいぶん前に使っていた加湿器が強力過ぎて部屋が水浸しになってしまったので、その制御に使おうと思って買ってあったものですが、結局加湿器自体使わなくなってしまったのでお蔵入りしてすっかり忘れていました。

で、「HS15P湿度センサーの簡易動作実験」を参考にして、湿度センサを動かしてみることにしました(単なる追試とも言う)。こちらのページでは「インチキ動作させる」などと書かれていますが、至ってマジメに手抜き動作をされておられます。バカ正直にデータシートやアプリケーションノートの通りに動かすのではなく、基本原理に立ち返って考え直すこういう工夫、とっても大事だと思うんですよね~。

で、写真のように適当にちゃちゃっと組み上げます。ICクリップの下にいるのがATTINY13Aです。・・・・が、写真はHS15P取り付け前でした・・・。シリアルは受けるだけなので、以前作ったシリアルモニタを1chだけ使います。

~つづく~

Ubuntu無線LANが不通になった・・・

Ubuntuは結構頻繁にアップデートマネージャでのアップデートが出ます。本来は一つ一つ確認しながら進めればいいのでしょうが、たくさんあるのでアップデートマネージャの表示が出たら特に確認せずに進めてしまいます。

で、先日もいつものようにアップデートマネージャでポチッとアップデートをしたら、再起動後に無線LANの接続ができなくなってしまいました。

理由がわからなかったのですが、とりあえずドライバを再度インストールしたら使えるようになりました。

IPv6のアドレスに思う

ここしばらく、IPv6対応でいまできることってなに、ということでいろいろやってみましたが、その中で疑問に思うことがあるので記載します。

IPv6のアドレスの長さは128bitなので、IPv4の32bitに比べると2^96倍もあって事実上無数にある、という説明がされています。しかし、IPv6のアドレス構造を見てみると、「前半がプレフィックス・ネットワークID」「後半がインタフェースID」となっています。また、サブネットマスクは/48か/64のどちらかであまり意識することはない、とされています(Wikipediaによる)。また、同じくWikipediaによると、同じくOCNによるIPv6サービスでは月額300円で/64のネットワークブロックを2つ取得できる、とされています。

つまり、/48とか/64のアドレスが従来のIPv4グローバルアドレスに相当し、従来NATなどのプライベートIPアドレスで対応していた部分に/64の下のアドレスを企業内や家庭内で割り振る、ということになるのだと思います。そう考えると、「IPv4の32bitに比べると2^96倍」というのは誇張で、2^32倍くらいに考えるのが妥当なんだと思います。

さらに、IPv6アドレスの割り当て状況をみると、IANAは地域のRIRに/12単位でIPv6アドレスの割り当てを進めていくように見えます。従来IPv4ではこれが/8の単位だったのでしょう。ここで気づくのは、一度に割り当てる単位で数えるとIPv6とIPv4は16倍の違いしかない、ということです。まあ、それでも/12のIPv6アドレスブロックを/48の単位でエンドユーザーに割り当てていくと割り当ての際に/36の自由度があって、IPv4全体のアドレス空間以上を一度にRIRに割り当てることになるのだから、あまり心配はないのかもしれません。ただ、今後、それこそ家電製品どころか照明器具、壁のスイッチ、水道の蛇口、窓ガラス、扉、錠前・・・などに組み込まれたワンチップマイコンのようなものまでもIPv6を喋るようになるかもしれない、ということを考えると、無闇にアドレスブロックを浪費しても大丈夫なのだろうか、という気もします。

無駄な心配でしょうかね??

≪おまけ≫
Arduinoというか、フィジカルコンピューティングの世界でIPv6っていろいろ面白い使い方があるような気がするのだけど、どうでしょうかね。実験だけならIPv4でも十分だから別にIPv6でなくたっていいのだけど。

DebianにWordPressをインストール

IPv6で接続可能になったDebianですが、WordPressをインストールしてみることにしました。簡単そうな参考サイトはここでしょうか・・・。

# aptitude install wordpress

でjavascript,mysql,perl,phpなどの関連モジュールが一気にインストールされます。

・・・が、mysqlのサーバ自体はインストールされていないようですので、インストールします。

# aptitude install mysql-server

php5のインストールを認識させるため、apache2を再起動します。

# /etc/init.d/apache2 restart

/var/www/index.htmlを消去し、/var/www/index.php に以下の内容を作成します。

<?
php phpinfo();
?>

生成後、「http://(IPアドレス)」にアクセスして、PHPの状態が表示されるのを確認します。

・・・・

いろいろやってるうちに、メモが取りきれませんでした(^^;

なので、覚えていることだけ。

  • aptitudeでインストールされるWordPress本体は英語版なので結局消した。場所(/usr/share/wordpress)だけはそのまま利用したけど。
  • データベースの生成はWebMinから例えば「wordpress」という名前で生成。今回は最終的に「wordpress_v4」と「wordpress_v6」で生成した。特に変わった設定は不要。生成したデータベースにアクセスするユーザー「wordpress」も作成した。
  • 結局、WordPressの日本語版 tar.gz をダウンロードして展開したものを 「/usr/share/wordpress/vpv4」「/usr/share/wordpress/vpv6」として2箇所に置いた。(1箇所で済む方法もありそうだけど)
  • それぞれのディレクトリの中の wp-config.php にデータベースへのアクセス情報を設定した。ただし、IPv6の場合、サイトのアドレスをIPv6のアドレス(FQDN)に書き換えなければならない(デフォルトだとIPv4のアドレスが入るので、そこでおかしくなってしまう)ので、一旦下記のVirtualHostの設定をv4アドレスで接続して、サイトのアドレスを書き換えてからv6で使えるようにした。
  • それぞれのアクセスのための Apache2 の設定を /etc/apache2/sites-available/default にVirtualHostとして設定した。片方はIPv4、もう片方は IPv6で設定。VirtualHost設定時にはports.confなども確認しないとアクセスできないことがある。(最初は8080ポートにv6を設定したので、ports.conf と ip6tables の穴が開いてなくて接続できなかった。)

といったところでしょうか。

これで一応、IPv6アドレスからWordPressにアクセスできました。・・・置くコンテンツは特にないし、それ以上にPentium500MHz+192MBでは重くて使いようがないのですけどね。

(追伸)
ここのバックアップサイトにしてみようかと思ったのだけど、テーマの設定でプレビューすらできないので、消してしまいました・・・。

Debianで起動時にFreenet6に接続する

現在の状態では、Debianは起動後に手動で /usr/local/gogoc/bin/gogoc を起動しなければならないのですが、これを自動化したいと思います。

そこで、Debianの起動スクリプトを作ります。ここ(@IT)にあるのを雛形に、以下のようなファイルを作りました。

#!/bin/bash
setip6tables() {
    ip6tables -P INPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT ACCEPT
    ip6tables -F
    ip6tables -Z
    ip6tables -X
    ip6tables -N ufw6-after-forward
    ip6tables -N ufw6-after-input
    ip6tables -N ufw6-after-logging-forward
   :
   :(長いので中略)
   :
    ip6tables -A ufw6-before-output -m state --state RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A ufw6-before-output -j ufw6-user-output
    ip6tables -A ufw6-skip-to-policy-forward -j DROP
    ip6tables -A ufw6-skip-to-policy-input -j DROP
    ip6tables -A ufw6-skip-to-policy-output -j ACCEPT
    ip6tables -A ufw6-track-output -p tcp -m state --state NEW -j ACCEPT
    ip6tables -A ufw6-track-output -p udp -m state --state NEW -j ACCEPT
}
clearip6tables() {
    ip6tables -P INPUT DROP
    ip6tables -P FORWARD DROP
    ip6tables -P OUTPUT DROP
    ip6tables -F
    ip6tables -Z
    ip6tables -X
}
start() {
    echo -e "Set ip6tables: "
    setip6tables
    echo -e "Starting gogoc Freenet6 client: "
    /usr/local/gogoc/bin/gogoc -y -f /usr/local/gogoc/bin/gogoc.conf -r 180 &
    return 0
}
stop() {
#    killproc gogoc
    echo -e "Clear ip6tables: "
    clearip6tables
    return 0
}
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
esac

本来なら、ip6tablesの設定はわけた方が良さそうな気もしますが、ここに含めています。
また、gogoc(Freenet6クライアント)の停止のしかたがわからないので、代わりにip6tablesで全てをDROPする設定をするようにしました。

このファイルを /etc/init.d/gogoclient として root で保存し、ファイル属性を 700 に変更します。そして起動時に呼ばれるようにするため、update-rc.dを使って設定します。

# sudo update-rc.d gogoclient start 99 2 3 4 5 .
update-rc.d: warning: /etc/init.d/gogoclient missing LSB information
update-rc.d: see
Adding system startup for /etc/init.d/gogoclient …
/etc/rc2.d/S99gogoclient -> ../init.d/gogoclient
/etc/rc3.d/S99gogoclient -> ../init.d/gogoclient
/etc/rc4.d/S99gogoclient -> ../init.d/gogoclient
/etc/rc5.d/S99gogoclient -> ../init.d/gogoclient
#

再起動すると、自動的にFreenetに接続するようになります。なお、起動時はなぜか素直につながらないことが多いようですが、リトライするうちにつながるようです。

停止する際は、

# /etc/init.d/gogoclient stop

で全てのIPv6をブロックするようにip6tablesを設定変更します。

自分自身のポートスキャン

外からアクセス可能となると、いろいろ心配になるものです。ルートキットの存在についてはchrootkitやrkhunterなどで確認できますが、できれば感染前に防ぎたいものです。

それで調べていたら、自分自身にnmapを使ってポートスキャンをかけてみる、という記述を見かけたので試してみました。nmapは一般的なポートスキャンツールですが、他者に使うのは非常に迷惑ですので、取扱いには十分注意が必要です。

で、インストールです。

# aptitude install nmap

実際にスキャンする場合は、IPv4では、

# nmap localhost

IPv6の場合は、

# nmap -6 ::0

でスキャンできます。

自分のところではDebianでは、

  • rpcbind(111,IPv4)
  • afp(548,IPv4)
  • postgresql(5432,IPv4)
  • postgresql(5432,IPv6)

が開いていて、同様にUbuntuではIPv4,IPv6共に、

  • smtp(25)
  • ipp(631)

が開いていました。

しかし、よく考えると、それぞれiptables/ip6tablesでFirewallを構築しているので、localhostに関してはあまり意味がありません。ですので、お互いにスキャンをかけたところ、Debianはsshとhttpのみオープン、Ubuntuは全ポートがフィルタリングされていました。狙い通りなので安心しました。(IPv6の場合はオーストラリアと北米まで行って来いでポートスキャンなのですごく無駄な感じはしますが・・・)

Debianで時刻を自動的に合わせる

Debianを動かしているPCはたぶん前世紀もののかなり古いPCなので、時計がかなりずれてしまいます。なので、NTPで自動的に時計合わせをすることにしました。

まずは、ntpdateのインストールです。

# apt-get install ntpdate

でインストールします。

設定ファイルは、/etc/default/ntpdateですが、設定ファイルの冒頭で、

# Set to “yes” to take the server list from /etc/ntp.conf, from package ntp,
# so you only have to keep it in one place.
NTPDATE_USE_NTP_CONF=yes

という記載があり、サーバリストは /etc/ntp.conf を使うようになっています。
ですので、/etc/ntp.conf を作ります。

# INTERNET MULTIFEED CO.
# http://www.jst.mfeed.ad.jp
server ntp3.v6.mfeed.ad.jp
server ntp2.v6.mfeed.ad.jp
server ntp1.v6.mfeed.ad.jp

IPv6の場合はIPv6専用のNTPサーバーへアクセスしなければならないようで、一般のNTPサーバーへは接続できませんでした。結局、今回はインターネットマルチフィードの時刻提供サービスを使わせてもらうことにしました。

さらに自動的に時刻を同期し、PCの時計を合わせるために、「crontab -e」として、以下の内容を設定しました。

# m h dom mon dow command
43 * * * * /usr/sbin/ntpdate-debian
45 1 * * * /sbin/hwclock –systohc

毎時43分にNTPで時刻合わせし、毎日1時45分にハードウェアの時計ICに設定しにいくようにしています。