ArduinoUnoでRealTimeClockをNTPと同期させる Step.1 構想編

2010/12/02 赤口 投稿時の月齢:26.2  月名:二十七日月  潮汐:中潮 Moon:26.2 - 10:18 am by chameleon

ちょっとしたことは、ATmega168を搭載した小型マイコンボード「Arduino」で制御できてとても便利なツールになっています。
今回は、気象観測装置の雨量計の凍結防止用ヒーターを制御する機材のプロトタイプを作成することにします。雑用係ですから、微妙に業務とかぶらない仕事が回ってきます・・・。

さて、従来は「Arduino Duemilanove」というバージョンのハードウェアだったのですが、先日購入したものは「Aruduino Uno」となっていました。ハードウェア的な性能アップはないようですが、スケッチと呼ばれるプログラムのアップロードが高速化されているようです。
ただ、従来の開発環境である「Aruduino IDE」がVer.0021以降のものしか利用できません。
で・・・思わぬところで躓きました・・・。まあ、いつものことですけど。

一応、凍結防止用ヒーターの構成を考えます。

雪が降ると、雨量計の転倒マスへ雨を集約して送るバケットの受け皿に雪が融解せずに溜まり、正確な降水量が計測できなくなります。そうなったらあきらめて、雪が溶けるのを待てばいいのですが、そうなると、降雪がある間は全く雨量が計測されず、降雪が止んで、晴れてきてから雨量が計上されるというおかしなことになります。
こういったことを避けるために、ドップラー式の雨量計などがあるのですが、非常に高価です。したがって、転倒マス式の雨量計が普及しています。

DavisWeatherStation RainCollectorHeaterさて、仮に何らかの方法で雪を溶かして水にしてしまえば、転倒マスに雨(水)として落ちて、正確な降水量が計測できるはずです。多くは、転倒マスのバケットの中に熱源を置くという解決方法がとられています。
私の施設ではDavis社のWeatherStationですので、純正のRainCollectorHeaterを装着しています。伝統的な手法としては、ヒーター線をバケット内に貼り付けて加熱したり、奇抜な方法はオートバイや車のスモールランプなどを12Vの電源で駆動するなどして熱源にする方法があります。ただ、ランプを使う場合は、もともとRainCollector内は水がかかりやすい環境なので、ランプや回路の防水が困難です。ランプを使う場合は発熱量が必要以上に大きくなりすぎないよう制御しないと、バケット内の機構がダメージを受けるほど高温になってしまう傾向があるので気をつけないといけません。

ただ、いずれにしても「凍結しそうなとき」や「大量の降雪がありそうなとき」には熱源の電源を入れなければなりません。いつも電源を入れておくという荒技もありますが、エコ指向な昨今、ある程度インテリジェンスに電源の制御をしておきたいところです。

構想としては、

  • 温度計でRainCollector周辺と内部の温度を計測する。
  • 外気あるいはRainCollector内の気温が0℃(仮に1℃くらいから運用してみる・・・)に達する前に、ヒーターを駆動する電源をONにする。
  • 外気が十分に高くなったら電源をOFFにする。
  • RainCollector内部の温度が異常に高くなったら、電源をOFFにする。
  • Arduinoを格納するウォルボックス内の温度もついでに計測しておく。(夏場はかなり高温になると思われるので、各機器の動作範囲温度を超えてしまうおそれがあるのでそのモニター用・・・夏はヒーターコントロール回路はいらないし・・・)

制御がばたつかないように

  • 適当なヒステリシスをとる。
  • あるいはいったん電源を入れたら数時間は通電したままにしておく。

といったところか。
細かな調整は、Arduinoならいつでも修正可能なので、後は運用して不都合があれば、その都度対応することにすればいいかな。

いつものように材料を調達します。

  • Arduino Uno
  • シールド用基板(Arduinoのシールドを作る専用基盤です)
  • デジタル温度計専用IC(今回はDS18B20というチップを使いました。)
  • RealTimeClockモジュール
  • 抵抗・コンデンサ
  • 電気二重層コンデンサ
  • コネクタ
  • ツイストペアケーブル
  • SSRリレー
  • コンセントボックス一式
  • その他、こまごましたものは手持ちのものを利用

等々です。

特に温度計測用ICは温度校正がいらない、しかも測定誤差が±0.5℃以下という大変精度のよいものです。しかも複数のセンサーを一つのバスラインに並列に接続できるため、Arduinoのポートを節約できます。
今回は、このチップの正確な温度に基づいてWeatherStationの気温センサの校正にも利用することとします。

iPodTouch 4GでJailbreakせずにGPSを利用する

2010/10/25 友引 投稿時の月齢:17.7  月名:居待月  潮汐:中潮 Moon:17.7 - 12:12 pm by chameleon

Amazonで予約していた新型iPodTouchのケースがいっこうに入荷未定で、ついにキャンセルして新しいケースを購入しました。ケースが到着するまではと放置状態だったので、ようやくiPod touch 4Gのセットアップを行いました。
ブラックのケースを予約していたのですが、よく考えたらレーザー刻印もしていたし、スモークという若干、色味の付いたハードケースにしてみました。結構いいです。ぴったりです。背面のレーザー刻印もはっきり見えます。ストラップ用の穴が付いているのもいいです。
すでに、液晶保護シートを購入していたのですが、ケースに付属していました・・・。まあ、予備と言うことで取っておきます。

TUNEWEAR 第4世代iPod Touch対応ハードケース eggshell for iPod touch 4G スモーク TUN-IP-000134
TUNEWEAR 第4世代iPod Touch対応ハードケース eggshell for iPod touch 4G スモーク TUN-IP-000134
FocalPointComputer 2010-09-30
売り上げランキング : 1459

おすすめ平均 star
star良い感じのスモーク度合いです
star全くフィットせず,ちょっとひどい
starジャストフィットでGOOD!

Amazonで詳しく見る by G-Tools

さて、iPodTouchはiPhoneと比べてGPSが搭載されていないという弱点があります。e-mobileのポケットWifiや自宅の無線LANに接続して、位置情報を取得するとGPSなしでも、そこそこの精度で自分の位置情報を把握できたのには驚きましたが、やはり無視できない程度の誤差があります。(e-mobileのポケットWifi経由だとかなり精度がいいんですが・・・)

で、GPSレシーバーが欲しくなるんですが、残念ながら自分の所持しているSonyのVGP-BGU1ではペアリングができません。新型iPodTouchはSerial Port Profileに対応しているのですが、GPSレシーバーは利用できないんですね。果てしなく大人的事情が存在するようです・・・。
もちろん、先達たちの努力によってJailbreakしたあと、「Roqy BT」等のソフトウェアを利用すれば利用可能でした。ただ、どうやらiOS4以降はJailbreakした後は、デバイスを復元してもJailbreakの記録がデバイス本体に残ってしまうようで、故障したときは潔く実費修理か買い直しを覚悟した方が良さそうです。もっとも、いずれはそのJailbreakした記録さえ無効化してしまうJailbreakの技が開発されると思いますが・・・。

そこで、なんとかApple公認でGPSを使いたいところです。調べてみるとドイツの会社の製品がApple公認のGPSレシーバーとして開発されているようです。
GNS 5870 MFI」というGPSレシーバーです。
出張行ったついでに買ってきました・・・。ドル換算で$90くらい。手荷物に放り込んできたら、薄目のボール紙製の化粧箱だったので、箱がつぶれていました。ドイツ製品は、どれも簡易的な包装が多いです。もっとも中身は、ほとんどが自動車のシガレットライターから電源を取るケーブルの容積だったのですが・・・。
学校で習った第2外国語はフランス語だったので、ドイツ語は全く持って意味不明ですが何とかなりました。

たぶん店員さんは、日本は測地系が違うんじゃないかとか心配してくれていたような内容です。(たぶんです・・・)

一応、日本のソフトウェアも世界測地系にも対応できるから大丈夫だと思うと答えておきました。少なくともGoogleMapは世界測地系ですから、GoogleMapを使う分には大丈夫なはずです。

帰国してから、該当商品を調べたらAmazon.comで普通に買えるみたいです。

中身は至ってシンプルで、GPSレシーバーと簡易マニュアル、シガレットライター電源とUSBケーブル。

設定は一瞬です。ペアリングのIDを入れて、あっさり完了。マニュアルは、簡易なものが英語表記とドイツ語表記で記載されていました。英語表記があって良かった・・・
Wifi経由と違ってピンポイントに正確な位置情報が得られます。
使い勝手としては、電源スイッチがLED部分を指でスライドして入り切りする「タッチパネル式」なのですが、ちょっと慣れないと、コントロールが難しいです。
特に電源を切るときは、手間取ることがあります。
連続使用しても10時間以上電池は持ちましたから、頻繁に電源操作をする必要はないんですが、もう少し簡単に電源が入り切りできるといいですね。
というか、物理的な電源スイッチをつけといてくれた方がありがたいです。

今後、Jailbreakしなくてもいい、Apple公認GPSレシーバーが各種登場してくるのでしょうか?
ちなみに本来はiPod touch 4Gはマニュアルを見る限り、対応製品には入っていません。

  • iPod touch 2G
  • iPod touch 3G
  • iPhone 3G
  • iPhone 3GS
  • iPad

となっており、まあ、iPadが記載されているから問題ないと言うことで買ったわけです。一応、購入される人はご自分の判断と責任で・・・。

感度も良好、電池も持つし小さく軽くていい感じです。

arduinoとEthernetShieldを使う[Step.4]

2010/09/19 先勝 投稿時の月齢:11.3  月名:十二日月  潮汐:中潮 Moon:11.3 - 5:55 pm by chameleon

閑話休題です。
部品を買いに久しぶりに秋葉原に出かけたついでに、書店に立ち寄ったら「Make:」という雑誌が目に付きました。
同じようなことをしている人がいるなぁと思ったので、購入しました。
読んでみると自分では想像も付かないおもしろいことを考えている人もいると実感です。

やっていることがかなりかぶっています

家の近くの書店では見かけたことはないんですよね・・・。

Make: Technology on Your Time Volume 10
Make: Technology on Your Time Volume 10 オライリー・ジャパン

オライリージャパン 2010-08-26
売り上げランキング : 2639

Amazonで詳しく見る by G-Tools

arduinoとEthernetShieldを使う[Step.3]

- 5:38 pm by chameleon

Step.2で動作確認ができたので、これを遠隔地からコントロールできるようにします。WEBブラウザでインターフェースを表示して、コントロールするのが適当でしょう。というか、それしか思いつきません・・・。あまり手間をかけて大がかりなものにするほどの内容でもありませんから、サクッと書くのを目標にします。スクリプトは今の自分的にはPythonがブームなのですが、慣れたPHPで作ることにします。

適当に書き上げたものなので、非常に地味ですがラジオボタンをクリックして「SEND」ボタンを押せば、arduinoのLEDをコントロールできます。LEDの光る時間から、0.5秒や5秒と言った時間設定もきちんと実行されていることがわかります。
PCの稼働状況を得るためのデジタル入力も、とりあえずarduinoの5V出力に手動でジャンパピンを刺したり抜いたりすることで、取得できる電源状況が変化することを確認できました。
ただし、短時間で書き上げるというのが大前提でしたのでリロード対策などはしていません。ページをリロードすると「直近に実行したコマンド」が再実行されます。汎用化するならリロード対策位はしておいた方がいいでしょうが、自分用ですのでそこまでする必要もないでしょう。うっかりリロードして、予期せぬリセット動作をくり返してしまったとかがないように気をつけておけばいいだけです。まあ、一応リロードするときは気をつけろと自分宛のメッセージを表示することにしておきます。
そもそも成り行きで作り出したので、コードも見直しできていない部分があったりしてちょっと反省です。プロトタイプと言うことで自分を納得させます。
電源状態がどうなったかを知るには、一番下のラジオボタンを選択して「SEND」ボタンを押せば、電源供給状態の変化を得られます。
作成したPHPは、この間設定したSheevaPlugにWEBサーバーを立てて置きました。SheevaPlugはNASのN4100ProをWOLで外部からコントロールするためにも使っていますが、自宅に消費電力の少ないサーバーが一台稼働していると、あれこれとやれることの自由度が高まります(と、無理に、衝動買いした自分を納得させます)。

とりあえず書いた実証用コード(PHP)

<?php
echo <<<EOH
<html>
<head>
<meta http-equiv="Content-Type" content="text/php; charset=euc-jp">
<link rel="stylesheet" href="/main.css" type="text/css">
<title>
LED Direct Control
</title>
</head>
<body bgcolor="#CCCCCC">
<b>LED Direct Control</b><br>
EOH;
 
function ShowButton($res_response){
    $dat = "";
    if(ereg("0\r\n",$res_response)){    
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"POWER\" />Turn on a power switch.</td></tr>\n";
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"REBOOT\" />Reboot a machine.</td></tr>\n";
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"FORCE\" />It compulsorily turns it off</td></tr>\n";
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"RESERVE\" checked />The state of a power supply is acquired.</td></tr>\n";
    }else if(ereg("1\r\n",$res_response)){
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"POWER\" />Turn off a power switch.</td></tr>\n";
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"REBOOT\" />Reboot a machine.</td></tr>\n";
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"FORCE\" />It compulsorily turns it off</td></tr>\n";
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"RESERVE\" checked />The state of a power supply is acquired.</td></tr>\n";
    }else{
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"POWER\" />Turn off a power switch.</td></tr>\n";
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"REBOOT\" />Reboot a machine.</td></tr>\n";
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"FORCE\" />It compulsorily turns it off</td></tr>\n";
        $dat .= "<tr><td><input type=\"radio\" name=\"power\" value=\"RESERVE\" checked />Get PowerStatus</td></tr>\n";
    }
    return $dat;
}
    
define("TEST_URL", "http://192.168.0.##/");
define("TEST_PORT", 80);
define("TEST_TIMEOUT", 30);
    
$data = parse_url(TEST_URL);
$host = $data["host"];
$path = $data["path"];
 
$sock = fsockopen($host, TEST_PORT, $errno, $errmsg, TEST_TIMEOUT) or die("[{$errno}] {$errmsg}\n");
$request = "GET {$path}{$_POST['power']} HTTP/1.1\r\n"
       . "Accept: image/gif, image/png, image/jpeg, */*\r\n"
       . "Accept-Encoding: gzip, deflate\r\n"
       . "Accept-Language: ja\r\n"
       . "Connection: Keep-Alive\r\n"
       . "Host: {$host}\r\n"
       . "Referer: http://localhost/\r\n"
       . "User-Agent: PHP-" . phpversion() . "\r\n"
       . "\r\n";           
 
fwrite($sock, $request);
 
while (!feof($sock))
{
    $data = fgets($sock);
    $response .= $data;
}
 
if(isset($response))
{
    $from = mb_detect_encoding($response);
    $response = mb_convert_encoding($response, "UTF-8", $from);
    print "<pre>\n";
    $edited_respons = ereg_replace("^(.*)(0\r\n+)(.*)","Server Respons:\r\nPowerStatus: <font color=\"blue\">Not supplied.</font>\r\n",htmlspecialchars($response,ENT_NOQUOTES));
    print ereg_replace("^(.*)(1\r\n+)(.*)","Server Respons:\r\nPowerStatus: <font color=\"green\">Supplied.</font>\r\n",$edited_respons);
    print "</pre>\n";
}
 
fclose($sock);
 
$dat=ShowButton($response);
 
echo "<table border=\"0\">";
echo "<form action=\"{$_SERVER['PHP_SELF']}\" method=\"post\">\n";
echo "<tr align=\"center\">{$dat}</tr>\n";
echo "</table>\n";
echo "<input type=\"submit\" value=\"send\">\n";
echo "</form>\n";
if(isset($_POST['power'])){
    print "<font color=\"red\">When you reload this page, this command (".$_POST['power'].") is sent again.<br />Take care because the stop that the machine doesn't anticipate might be done. <br /></font>";
}
echo "<hr />\n<a href=\"./\">back</a>\n",
      "</body>\n</html>\n";
?>

あとは、実際にマザーボードとコンタクトする周辺回路を自作すれば完成です。部品買ってこないと・・・。

arduinoとEthShieldを使う[Step.2]

- 2:36 pm by chameleon

arduinoのチップにアップロードするスケッチと呼ばれるプログラムを作成します。

  • POWERピンを0.5秒短絡させる。
  • RESETピンを0.5秒短絡させる。
  • POWERピンを5秒短絡させる。
  • PCの電源状態を取得する。
  • WEBインタフェースでは(POWERピンの入力は電源状態に応じてTrunOnとTrunOffを切り替える。)必要があるかな・・・。
  • WEBからコントロール可能にする。

今回の目的では、EtherShieldというシールドを使ってarduino側にWEBサーバーを構築しなければなりません。IDEにWEBサーバーのサンプルプログラムがあったのでそれを修正して使いました。もっとも、メモリーも限られたハードなので、非常に単純なWEBサーバーになっています。コードを見ると、リクエストやレスポンスはキャラクター単位で処理していますから、あまり大量のデータをやりとりすることは現実的ではありません。DHCPも実装したいところですが、習作なので本番用に組み込むことにしてスケッチはできるだけ単純にします。

さて、arduinoはデータをネットワークにむけて「発信」するのは簡単なのですが、ネットワークからデータを受信して処理することはあまり得意ではないようです。arduino側のWEBサーバーでPHPとかperlとかが動作すれば、それに越したことはないのですが、そんな高度なWEBサーバーはハードウェアの制約上からも自分の実力からも構築できそうにありません。

よって、データというか諸々のパラメータをどうやって渡すかと言うことで、ちょっと悩みました。
結局、URLに乗せて渡すという方法が単純でarduino側の処理も簡単であると考えました。

いきなり実機のPCの電源をコントロールするというのも何だし、なにより周辺回路をまだ制作していないので、各ピンに送る信号をLEDで確認するというデバック用の回路をブレッドボード上に構築しました。そんなたいそうな物ではなく、LEDとarduinoのデジタルI/Oをジャンパ線でつないだだけです。
EtherShieldがデジタルI/Oの11,12,13ピンを占有するようなので、空いたポートを出力に設定して3ポート確保します。実際は、マザーボードのPOWERピンとRESETピンの二つに入力するだけなので、2ポートでいいのですが、1ポートは別の何かをコントロールするためのリザーブポートとしておきます。

あと、PCの電源状態を取得するために、デジタルI/Oポートを入力に設定して1ポート確保しました。ディスクドライブの電源ライン当たりから5Vを得れば、PCが稼働状態かどうかを判別できますね。

arduinoへアップロードしたスケッチ

/*
 * Sketch to control the MotherBord switches.
*/
 
#include <SPI.h> //Will be required from EthernetLibrary Ver.0019.
#include <Ethernet.h>
#define POWER 7 //power:red
#define RESET 6 //reset:blue
#define RESERVED 5 //reserved:green
#define STATUS 4 //alive
 
byte mac[] = { 0x##, 0x##, 0x##, 0x##, 0x##, 0x## }; //etherShield Mac Add.
byte ip[] = { 192, 168, 0, ## };//arduino IP Add.
Server server(80);
String inString = String(80);
 
void setup(){
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(POWER,OUTPUT);
  pinMode(RESET,OUTPUT);
  pinMode(RESERVED,OUTPUT);
  pinMode(STATUS,INPUT);
}
 
void loop()
{
  Client client = server.available();
  if (client) {
    inString = String("");
    // an http request ends with a blank line
    boolean current_line_is_blank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //inString.append(c);
        inString += c; //append->+ or inString=inString+c
        // if we've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so we can send a reply
        if (c == '\n' && current_line_is_blank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println(digitalRead(STATUS));
          break;
        }
        if (c == '\n') {
          // we're starting a new line
          current_line_is_blank = true;
          if(inString.indexOf("GET")>=0){ //contains->indexOf : If the following Ver.0018 "contains" use, Ver.0019 it over "indexOf" to use.
          // get a request from the URI  
             if(inString.indexOf("FORCE")>=0){
               LEDON(0); //FORCE
             }
             if(inString.indexOf("POWER")>=0){
               LEDON(1); //POWER
             }
             if(inString.indexOf("REBOOT")>=0){
               LEDON(2); //RESET
             }
             if(inString.indexOf("RESERVE")>=0){
               LEDON(3); //RESERVE
             }
          }
          inString = String("");
        } else if (c != '\r') {
          // we've gotten a character on the current line
          current_line_is_blank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
  }
}
 
// LED Control
void LEDON(int mode){
  digitalWrite(POWER,LOW);
  digitalWrite(RESET,LOW);
  digitalWrite(RESERVED,LOW);
  if(mode==1){
    digitalWrite(POWER,HIGH);
    delay(500);
    digitalWrite(POWER,LOW);
  }else if(mode==2){
    digitalWrite(RESET,HIGH);
    delay(500);
    digitalWrite(RESET,LOW);
  }else if(mode==3){
    digitalWrite(RESERVED,HIGH);
  }else{
    digitalWrite(POWER,HIGH);
    delay(5000);
    digitalWrite(POWER,LOW);
  }
}

IDEのVer.0018とVer.0019での違いも書いておきます。

#include <SPI.h>
#include <Ethernet.h>

SPI.hはIDEのVer.0019よりEthernet.hを利用する場合は必要になりました。
また、文字列を扱うライブラリが標準になったため、WString.hのインクルードはいらなくなっています。また、そのライブラリの変更でcontainsはindexOf関数でコーディングしなければならなくなっています。このあたりはむしろ退化しているのではないかと感じますが・・・。
String.contains(”hoge”)はString.indexOf("hoge")>=0とでもしておけば同じ働きをします。従来通りの手法ですね。
マックアドレスやIPはハードコーディングしています。DHCPの実装などは、本番のプログラムのときまでに実装します。検索すればサンプルがいくつか見つかります。
なお、なぜだかコメント文中を含めIDEのコード内に2バイト系の文字を使うと途中で動作がおかしくなってしまったので、コメントを含めて日本語の利用は避けた方が良さそうです。

これでブラウザからURLにたとえば、http://192.168.0.##/POWER/とかhttp://192.168.0.##/RESET/とかとURLにコマンドを含んで送信すれば、各LEDが規定時間点灯します。LEDは仮想的なリレーとして考えていますから、実際にはPCのケースのスイッチが指定時間押されているのと同じ状態を想定しています。

後は、ブラウザからコントロールするためのプログラムを書けば完了です。

arduinoとEthShieldを使う[Step.1]

- 1:51 pm by chameleon


arduinoはUSBでPCとシリアル通信をするようになっています。PCがもれなく必須なら、わざわざマイコンボードで処理させなくても、PCを使ってリッチな環境で目的が達成できます。
しかし、現実世界ではコストとか単におもしろいからとかいった事情で、小さなマイコンボードだけで目的を達成できないかと考えるわけです。
が、とにかくネットにつながらないことには遠隔からのコントロールができませんのでEtherShieldというシールドを購入しました。
arduinoにプラグインするだけで増設できるという便利なオプションがシールドだそうです。

今回は、このシールドを扱う習作もかねてarduinoをWEBから遠隔コントロールするスケッチと呼ばれるソフトウェアを書いてみることにします。
IDEは現在Ver.0019が最新のようですので、そちらを使いました。Ver.0018からの変更は何点かあるようで、従来のコードは変更をしないと動作しないスケッチもあります。
これについては機会があれば記述します。

まず制作する物を構想しなければなりません。
プログラムの世界では、どの言語でも初めて書くプログラムというのは「Hello,World!」というのが定番なのですが、マイコンボードでの定番は「Lチカ」らしいです
LEDを光らせたり点滅させたりするということですね。
購入した書籍にもサンプルプログラムがついていましたから、パラメータを変えたりしてしばし遊んでみました。
ハードウェアの回路だけで点滅時間をコントロールするのはかなり面倒で、自由に変更したりするというのは回路設計の制約から簡単には実現できません。やはりソフトウェアを書き換えるだけで、ハードウェアを自在にコントロールできるのは楽です。
もっともサンプルの「Lチカ」には実用性は全くありません。モチベーションも上がりません・・・。

で、LEDのかわりにリレーを駆動して、遠隔地からPCの電源をコントロールすることにしました。
自宅のPCにVNCでリモート接続したりするのですが常時起動しておくのも無駄なので、WOLで起動しようとするとPCは「休止状態」にしておかなければなりません。Windows7にOSをアップデートしてから自宅のPCは休止状態からの復帰に、ほぼ失敗すると言うことに気づきました。古めのマザーボードですから、その当たりが問題なのかもしれません。
かといって、サスペンドではネコがマウスに絡んだだけでも、PCが起動してしまいます・・・。そもそも、「休止状態」のコマンドがデフォルトでは隠されているので、Windows7では「休止状態」を推奨していないのかもしれませんね。
何か妙案はないのかなぁと思ってはいたのですが、この際、解決に向けてがんばることにしました。

PCの電源のコントロールはスイッチを物理的に接触させてやれば、OSの状態に関係なく実行できます。
リモート接続中に、支配下のPCがクラッシュしても再起動させたり、強制的に電源を切ったりすることも可能になります。
さすがに、PCの電源スイッチを押したりする機械装置は簡単には作れそうにありませんから、マザーボードのPOWERやRESET信号を受けるピンをリレーで短絡させてやることにすれば、実現できそうです。

  • POWERピンを0.5秒短絡させる。
  • RESETピンを0.5秒短絡させる。
  • POWERピンを5秒短絡させる。
  • PCの電源状態を取得する。
  • WEBインタフェースでは(POWERピンの入力は電源状態に応じてTrunOnとTrunOffを切り替える。)必要があるかな・・・。
  • WEBからコントロール可能にする。

電源ボタンを押したりする動作は、0.5秒程度のピンの短絡でエミュレートできるでしょう。5秒間短絡させるのは、いわゆる4秒強制切断を意識した実装です。5秒あれば確実に、PCの電源を強制切断できるはずです。

マザーボードのピンとのインタフェースは、別途設計し自作しなければなりませんが、それほど複雑な回路にはならないでしょう。

リレーではなく、フォトカプラーをおごってarduinoとPCをアイソレートしておけばなお良さそうです。

AppleStoreからiPodTouch 4Gが届いた

2010/09/18 赤口 投稿時の月齢:10.0  月名:十日余の月  潮汐:若潮 Moon:10.0 - 11:07 am by chameleon

予約していた、新型iPodTochが到着しました。思っていたより早かった・・・。Amazonで予約しているケース保護シートの方がまだ来ていないくらい・・・。

箱も小さくシンプルでした。

ヘッドフォンは・・・別途に購入した方がいいかも。もっとも、音楽プレーヤーとして頻繁に使うことは今のところないか・・・。

たぶんすぐ容量が足りなくなるんじゃないかということで、64Gにしています。

すぐにでも遊びたいところですが、ケースが到着していませんし、別件で取り込み中だったりするのでしばらくおあずけです。
しかし、母艦にmac Book Proとかほしくなるのは何でだろう・・・

Arduino購入

2010/09/14 友引 投稿時の月齢:6.4  月名:七日月  潮汐:小潮 Moon:6.4 - 8:24 pm by chameleon

arduino Kit
少しばかりデータの収集を自動化したいことがあったので、いろいろ物色した結果Arduinoというマイコンボードを見つけたので買ってみました。

ブレッドボードとか持っていなければ、キットもあります。
Arduinoというベースになるボードに、シールドというモジュール化された拡張ボードを増設することで手軽にハード的な機能アップをすることができるようです。また、I/OをC・C++ライクな言語でコントロールできるようですので、目的の機能を実装した基盤のプロトタイプを制作するにはうってつけです。

Arduinoをはじめようキット
Arduinoをはじめようキット
スイッチサイエンス
売り上げランキング : 1225

おすすめ平均 star
starまとめて入っているので便利
star面倒くさい人にとってはうってつけ
starArduino楽しめます

Amazonで詳しく見る by G-Tools

入門用の書籍もありました。半分くらいはリファレンスになっているんですが、WEBで調べたりするよりも手早くって、買って正解でした。上記のキットを購入していれば、書籍の内容はほとんど実践できました。

Arduinoをはじめよう
Arduinoをはじめよう Massimo Banzi 船田 巧

オライリージャパン 2009-03-27
売り上げランキング : 8076

おすすめ平均 star
starArduinoの最初の教科書
starプログラミング初心者でもわかりやすい
star価格の割には

Amazonで詳しく見る by G-Tools

iPodTouch 4Gとケース

2010/09/11 大安 投稿時の月齢:3.3  月名:黄昏月  潮汐:中潮 Moon:3.3 - 4:23 pm by chameleon

iPodTouchの新型をAppleStoreで予約。ちょっと何で買ったのかは自分でもわからない部分があ
るけど、Walkman持っているので音楽を聞こうと思った訳じゃないことは確か・・・。

Apple iPod touch 64GB MC547J/A 【最新モデル】
Apple iPod touch 64GB MC547J/A 【最新モデル】
おすすめ平均
starsアメリカで購入しました

Amazonで詳しく見る by G-Tools

ケースと保護フィルムはAmazonで予約。ケースはラバー加工ありということでブラックにしたけど、本体にレーザー加工した意味がないなぁ。クリアにしとけば良かったか・・・。
他にも、カーボン調の加工がしてあるやつもあっていい感じだった。今回はアマゾンのポイントで収まる範囲にしたので、除外・・・。

TUNEWEAR 第4世代iPod Touch対応ハードケース TUNESHELL RubbeFrame for iPod touch 4G ブラック TUN-IP-000139
TUNEWEAR 第4世代iPod Touch対応ハードケース TUNESHELL RubbeFrame for iPod touch 4G ブラック TUN-IP-000139
FocalPointComputer 2010-09-21
売り上げランキング : 148

Amazonで詳しく見る by G-Tools

フィルムはアンチグレアにした。

TUNEWEAR 第4世代iPod Touch対応液晶保護フィルム TUNEFILM for iPod touch 4G 「アンチグレア」タイプ TUN-IP-000132

Amazonで詳しく見る by G-Tools

SheevaPlug Ubuntu9.04のアップデートを自動化する

2010/09/05 先負 投稿時の月齢:26.5  月名:二十七日月  潮汐:中潮 Moon:26.5 - 2:23 pm by chameleon

SheevaPlugのUbuntuOSのメンテナンスは、いつも気が向いたときに

apt-get update
apt-get upgrade

としていたのですが、CUIはやはりめんどくさい・・・。

なので、自動化してみることにしました。

こんな目的にぴったりなのが「cron-apt」です。

apt-get install cron-apt

あとは、 /etc/cron-apt/configを編集します。

私は、アップデートにapt-getコマンドを使っているので、

APTCOMMAND=/usr/bin/apt-get
#APTCOMMAND=/usr/bin/aptitude

apt-getの方のコメント文を外します。
あと以下の部分もコメント文を外します。

ACTIONDIR=”/etc/cron-apt/action.d”
ACTIONCONFDIR=”/etc/cron-apt/config.d”
ERRORMSGDIR=”/etc/cron-apt/errormsg.d”
LOGMSGDIR=”/etc/cron-apt/logmsg.d”
SYSLOGONMSGSDIR=”/etc/cron-apt/syslogonmsgs”
ERROR=”/var/log/cron-apt/error”
TEMP=”/var/log/cron-apt/temp”
LOG=”/var/log/cron-apt/log”
SYSLOGON=”upgrade”

HOSTNAMEには、自分のホスト名を書いておけばいいでしょう。

HOSTNAME=”MyHostName”

/etc/cron.d/cron-aptを見ると、毎日午前4時に実行してくれるようです。まあ、これでいいや・・・。意中の時間に変更してもかまいません。cornの書式です。

/etc/cron-apt/action.d/3-downloadに具体的なコマンドが、以下のように設定されていました。

dist-upgrade -d -y -o APT::Get::Show-Upgraded=true

SheevaPlug対応のUbuntuは9.04以降、新しいものが出る気配はないのでdist-upgradeはやめてupgradeコマンドに変更します。
時々手動で、apt-get upgradeを実行して、保留のアップデートが多くなっていればそのときにdist-upgradeしておけばいいでしょう。
あと、「-d」スイッチもダウンロードしか実行してくれませんので外します。

upgrade -y -o APT::Get::Show-Upgraded=true

これが編集後の設定です。
明日、確かに実行されているかログを見て確認することにします。