ラベル 作ってみた の投稿を表示しています。 すべての投稿を表示
ラベル 作ってみた の投稿を表示しています。 すべての投稿を表示

2010年4月24日土曜日

林檎最中を立てよう

新年および新年度あけましておめでとうございます。MTM以来なのでそろそろ化石になるかとおもったhwhack ですが春のコネタとともに復活です。

最近話題の林檎最中ことiPad にはBTのキーボードが繋がります。最近のimacについてくるキーボードがつながるので文字を打ち込む場合には便利なのですが、こういう体制の場合には画面は立ってて欲しいものです。dock兼スタンドはちょい高いのと縦置きしか想定されていません。そこで、「ティンときた」ということで転がっていたLEGOを使って台を作りました。

作り方の解説は必要ないかとおもいます。パーツは「緑のバケツ」を探ればトップの丸みのあるパーツ以外は2セットそろいます。
使ってみると非常に快適で、自宅、オフィスと2つ作ってしまいました。角があたるのを嫌ってトップには丸みのあるパーツを使いましたが、ふつうのブロックでもよいかもしれませんが、そのときは高さの調整が必要かもしれません。


気を良くしたのでついでに余っているパーツを使ってiphone用のスタンドも作ってみました。これもなかなか快適です。こちらはもうひとつ小さい板を使ったスタンドで、ipadは重心が板の上にこないので倒れてしまいます。もう一こま狭くして角度を立てるとなんとか使えますので持ち歩きにはいいかもしれません。



2009年5月9日土曜日

ブレッドボード/arduino用のお手軽ケーブル加工



yuoがまたUSBデバイスの解析という大ネタを連載しているので、その合間にcueのほうは電子工作関連のコネタをひとつ。

パーツをブレッドボードやarduinoに刺すときに、しっかりとした足がついているLEDなどはよいが、センサーなどのようにケーブルを介して接続する必要がある場合には、そのケーブルをどうやってブレッドボードに刺すかを考える必要がある。

よくやる手としてはケーブルをピンヘッダにハンダ付けをするというのだが、これでは量産が効かないし、出来上がりが不揃いになってしまう。四角いピンのピンヘッダはブレッドボードへの刺さりがキツいし、丸ピンのヘッダはピンが細すぎてブレッドボードにはいいが、arduinoなどのピンソケットにはすこし緩い。

そこでちょうどいい太さで先端がピンに
なった圧着端子を探していた。なかなかちょうどよいものがなかったのだが、yuoとアキバを探し歩いた結果、VGAコネクタなどに使うシュリンクDSUB用のピンがちょうどいいのじゃないかという結論に達したので紹介しておく。
千石通商で売られているシュリンクDSUB用のコンタクトピンは5本単位で売られている。CUEは田舎に住んでいて交通費を考えると必要数だけ毎回買うの
も無駄なので100本パックを買っている。このとき 「シュリンク(細い方)」DSUBの「オス」を入手する必要がある。写真とおなじものを手にいれれば間違いないだろう。
千石通商の1Fにほかの端子とともにおいてあるはずだ。残念ながら通販ではシュリンクではないDSUB用のピンしか扱っていないようだ。ちなみにRS232Cなどに使う普通のDSUB用のピンは太すぎてブレッドボードに刺さらない。

これを1本づつ切り取ってケーブルに圧着するだけである。小信号用の圧着端子と同じで、エンジニア社の精密圧着ペンチで加工すればよい。ケーブルはAWG26より細いものがよいだろう。

そして圧着部の保護と絶縁のために熱収縮チューブでくるんで完成である。上手に圧着できれば、サンハヤトの高級なほうの柔らかいジャンパーケーブルのような出来映えになるはずだ。

arduinoとブレッドボードがカジュアル電子工作の主戦場になってきた今日この頃、このピンの価値は計り知れないと思う。ちなみに、arduino(FIO)に刺すとこんなかんじになる。

このピンの問題は、ちょうどいい100milピッチのハウジングがないところではあるが、1本単位でバラバラでもよい用途では非常に便利にかつ美しくケーブルを作ることが出来るのでおすすめである。

2009年2月20日金曜日

BLINKM ICSPアダプタ

USB-BLINKMの実験をしている最中に、BLINKMのAVR Tiny45を書き換える作業が面倒になったので簡単なICSP用のアダプタを作ってみた。機能は最低限で、

  • AVR USBISP mkIIの6pinのコネクタ
  • BLINKM(ICSP用の補助ピンを2本増やしたもの)
  • 外部電源5V
をつなげるだけだ。最初はブレッドボードに挿して個別に配線していたのだが、これを作っただけでずいぶん作業が楽になった。

部品の配置図と配線図のメモを残しておく。これも秋月の16穴基板を2枚つかって作ったので、8x4穴に収まるようになっている。

USB-BLINKM

BLINKMはthingmが作成・販売しているインテリジェントフルカラーLEDだ。1cm角くらいの基板に、明るいRGB LEDとAVR Tiny45が載っていて、I2Cインターフェイスで外部に接続できる。I2Cはデイジーチェーンできるので、たくさんLEDを使うときには大変便利だ。Arduinoなどから簡単に扱えるので様々なメディア作品で利用されている。


先週からいきなり始めてみた「AVRを使ってみる」という活動だが、ふと机の横に転がっていたBLINKMを眺めるとAVR Tiny45が目についた。ちょうどAVR Tiny85で遊んでいたところだった(その話はまた今度)ので、「Blinkmを単純にLED付きのAVRとして使えるんじゃないか?」と思い立った。実際にやってみたのが今回のエントリの「USBに直接つながるBLINKM」だ。i2cのデイジーチェーンできるという利点は無くなってしまうけれど、USBならどんなPCにも大体ついているので、一個だけ使う場合には逆にお手軽になる(と期待している)。今回は、ハードウェア部分について書いてみることにする。








BLINKMの回路図

BLINKMを裏返して眺めてみると、実装されている部品はLEDと電流制限用の抵抗(x3)とAVR TINY45とデカップリング用のコンデンサくらいだ。とりあえずI2Cの接続用にでている4pinがどこにつながっているかと、LEDがどのIOにつながっているかがわかれば良いとおもって回路を追ってみた。というわけでわかったのが左の図に示す回路図。大変都合の良いことに、i2cのdata/clockの線がPB0/PB2につながっている。

あと実際のBLINKMには実装されていないけれど、ISCPに必要な信号線を出すためのパターンも実装されていて、reset/misoは簡単に外部に引き出せる。
AVRでソフトウェア的にUSBを実現するコードとしてobject development社が公開しているAVRUSBがあるが、USBの信号線の一本をINT0に接続することが推奨されている。PB0/PB2が出ているのがどうして都合が良いかというと、PB2はINT0だからだ。ちょうどTINY85でAVRUSBを試していたところだったので、すぐに「ほとんど外付け回路無しでUSB化できそうだ」という予想ができた。


BLINKM-USBブリッジ回路

というわけで、BLINKMの4pinコネクタからUSBのAコネクタに変換するための外部回路を書いてみる。基本的にAVRUSBのリファレンス回路のツェナーダイオードを使うやつと同じ。
USB1.1の仕様ではD-信号線を1.5Kオームでプルアップすると、low speed (1.5Mbps)デバイスだと認識する。そのためのプルアップ抵抗が一本、信号線の電圧をクリッピングするためのツェナーが2本、あと信号線のシリーズ抵抗(68オーム)が2本、だけの簡単な回路になる。実際にはVccラインに保護用に500mA以下(LEDだけだったら300mA程度で十分)のポリヒューズを一本と、0.1uF程度のセラミックコンデンサを実装しておけば良い。
ポリヒューズが無ければ直結するという方法もあるが、何か間違ったときにPC側のUSBポートやUSBホストコントローラを焼いちゃうかもしれないのでおすすめしない。デカップリング用コンデンサはなくてもいいから、過電流の保護はちゃんとやっておこう。

BLINKM-USBブリッジの実装

思い立ってから、最初の実験を含めて3つほど実装したけど、一番小さくなったやつを紹介しておく。USBもBLINKMも両方とも4pinのコネクタだったので、秋月の16穴スルーホール基板をつかって実装したくなった。10枚買えば一枚10円、100枚だと一枚5円というお手頃価格だし、基板を加工する手間も省ける。

右の図が実体配線図。部品面から見た図になっている。斜め配線&一つの穴に2本部品がはいっているというお行儀の悪い実装になっているけれどなんとか収まったので良しとしよう。


部品はだいたい秋葉原で揃う。3.6Vのツェナーダイオードは千石電商で100本入りをかった。これはどこでも売っているはず。68オームと2Kオームのチップ抵抗(1608)は鈴商で売っている。チップ抵抗なら千石でもあるはずなんだけど、68オームは置いていなかった。一番面倒なのが面実装のポリスイッチ(ポリヒューズ)だ。容量の小さいものなら秋月で扱っているらしいけど0.1Aは小さすぎる。探してもなかったのでチップワンストップで、Tyco Electronics Raychem PSR-27313-050を調達して使った。まあ、千石のB1で売っているポリスイッチを裏にがんばって貼り付けても大丈夫なのでそこまでしなくても平気だとはおもう。

実際に制作したものは右の写真のとおり。BLINKMはUSBコネクタ側にLEDが向くように差し込む。USBコネクタを差し込むと、ちょっと余裕が出るくらいの長さになるので、これがこの方法でつなげる場合に一番短くなる実装方法だろう。





USB-BLINKMのソフトウェア

もちろん、今回つくった回路で電気的にUSBコネクタにさせるようになったとしても、AVRのソフトウェアを書かないと動かない。I2C-USBブリッジではなく、BLINKMにのっているTINY45に直接USBを処理してもらわないといけないからだ。

次回のエントリでは、AVRUSBについて説明してみる予定。


2009年2月19日木曜日

ブレッドボードでArduino

「AVRのATMEGA168があればArduino互換ボードが作れる」ということだけを教えてもらって始めたところ、いくつかはまったのでメモ。

  • AVRISP MKIIでは外部電源が無いと書けない
  • 買ってきたばかりのATMEGA168は外部クロックで動くモードになっているので、クロックを供給してあげないと書けない
  • AVRにはヒューズというものがあって、クロックなどの動作モードはそこに書く。ヒューズのビットマップはチップごとに違うので仕様書を参照
とりあえずfirmware(bootloader)を書くまでに超えないといけなかったのはこのくらい。前のエントリーのarduino用シリアルアダプタ(2) を作っただけでは「ブレッドボードでArduino」には到達できなかった。とりあえずクロックを供給するために、その辺にあったセラロック(20MHz)をつなげてみた。DIPのATmega168のクロック周りのピン配置はGND-XTAL1-XTAL2の順番だが、セラロック(負荷容量内蔵)のピン配置はOSC0-GND-OSC1になっていてブレッドボードに挿すには都合が悪い。写真のようにGNDとOSC0のピンをひねって順番を入れ替えたものを作っておいた。これも今後たくさん使うようなものでは無いけれど、一個くらい持っていても損はしないだろう。

で、次にはまったのがこのいい加減に選んだ20MHzという速度だった。
  • Arduinoのブートローダーはクロック周波数によって違う
普通のArduinoは16MHzで動作するらしい。16MHz以外のクロックをつかって標準的なブートローダーを書き込んでもシリアル通信のタイミングが合わなくて通信できない。解決方法は2つで、
  • 供給しているクロックに対応したブートローダーを作成して書き込む
  • 内部クロック(8MHz)で動作する用にヒューズを書き換えて、8MHz用のブートローダー(lilypad 8MHz用)などを書き込む
のどちらかをやらないといけない。

とくにArduinoのknow-howが無い状態で始めてしまったので「こんなところではまるなよ」と言われそうだけど、しょうがない。おかげで最初にLEDの点滅プログラムを動かせた時には、すでにブートローダーのソースを読み終わっているというArduinoの思想とはちょっと離れたスタートになってしまった。

arduino 用シリアルアダプタ(2)

単に機会が無くていままでAVRを使うことは無かったのだが、共同執筆者のCUEと秋葉原で会ったときに「AVRつかったことないんだ」と言われてしまったので、その場の勢いでATMEGA168とATTINY85を購入してしまった。さて、帰ろうかとおもったときにふと違和感を感じた。「あれ?これってどうやってプログラムを書き込むんだ?」。今までAVRをさわったことのない私に何らかの開発環境があるわけがない。結局、さらにATMELのAVRISP MKIIを秋月で4000円で購入するはめになった。

というわけで、何となくAVRと戯れることになったで、最近の週末プロジェクトについて書いてみようと思う。

Arduino用シリアルアダプタ

右も左もわからなかったのだが、AVRといえばArduinoがはやっているらしいし、CUEもさわっているみたいだったのでその辺から攻めてみた。せっかくATMEGA168を買ってしまった手前Arduinoを更に買うのももったいなかったので、ブレッドボードで実験してみることにする。CUEがやっていたシリアルアダプタが便利そうだったので、こちらでも作ってみた。

たくさんつくるものでもないし、必要そうな機能は全部実装した。
  • USB-AVR間のシリアル通信
  • DTRを用いたオートリセット
  • 手動リセットスイッチ
  • シリアル通信のTX/RXのステータスLED
  • AVRISP MK2をAVRにつなげるためのICSPの6ピンコネクタ
AVRISP MKIIはターゲットとなるAVRに電源が供給されていないと書き込めないので、USB給電で全部書き込むためにはICSPコネクタが手元にあった方が、ブレッドボード上のAVRを扱うときに都合がよい。

これで、こんな感じにブレッドボード上にArduino互換の環境をすぐに準備できるようになった。AVRISP MKIIをつなげないといけないのはブートローダを書き込む最初の一回だけで、Arduinoを使うのならそれ以降に接続する必要はない。

まあ、Arduino以外でブレッド ボードにのったAVRを使うこともあるだろうから、つけて良かったと感じている。


とりあえず基板のレイアウトを書いておいた紙を記録用に載せておく。接続図とかは自明だからいらないよね。






(補足:2009/02/19 19:54)
自分でも忘れそうだから、配線図を書き下した。参考までに載せておく。RX/TXのLEDは割愛。




2009年1月29日木曜日

arduino 用シリアルアダプタ


arduinoの場合には作品制作にPCは必須ではない、というよりPCからコントロールする作品ならば、プログラムが一種類ですむgainerのほうがより簡単に扱えるし、PGAや静電容量センサーが使えて便利なことがおおい。arduinoの本領はgainerでは動作しないようなデバイスを動かす場合や、マイコン単体で動作する作品をつくる場合だろう。

そのため、gainerの時と違ってUSBシリアルをすべてのボードに同梱する必要はなく、プログラムの書き込みやデバッグ時のためだけに使えるようにすればよい。
そこで、USBシリアルアダプタを作品のブレッドボードに差し込みやすい形で作ることにした。まず最初に試作してみたのが、L型ヘッダをつかい、縦に基板を差し込む方法である。Decemiela についているリセット端子と同様の回路(抵抗とコンデンサ)をつけることで、自動リセットにも対応している。
上からみた配線図はこのよ
うになる。電源ラインの取り回しにモジュールの6ピンのところを通してあるが、ここはソケットのピンを抜いておいて、通電しないようにしてある。もちろん、ジャンパとして表面をまわしてもよいだろう。0.1uFのコンデンサと10KΩの抵抗で通信用のラインを横切っているので、裏面にはジャンパが飛ばないようになっている。

この方法ならブ
レッドボードに部品が少々のっていても大丈夫であるとおもったが思ったよりもL型コネクタに厚みがありほとんど部品がない状態でなければ刺せない。
よってこのままでは使えないので、ケーブルをつかってのばすことを考えた。よくやる手ではケーブルの先にピンヘッダをハンダ付けするのだが、今日はイマイチうまくいかなかったので新しい方法を試してみた。





もともと千石電商で売られているヘッダピンとブレッドボードを結ぶジャンパケーブルを分解する。これはエクステン
ションのようになっていて、1ピンのソケットと、1ピンのピンヘッダがそれぞれ圧着されている、簡単にいえばジャンパワイヤーの延長コード状のものだ。(図)ピンヘッダがついた部品をブレッドボードにさすのに利用するワイヤーだが、これを使ってシリアルのヘッダを延長することにした。

もちろん、そのまま5本のケーブルをさすのでもかまわないのだが、ここは専用ケーブルとするためにも、ヘッダを分解し、1x8列の枠を使って再構成することとした。一度ささっている圧着ヘッダを抜くためには、細いマイナスドライバを用いるのがいい。ソケットのプラスチックのひっかかりがある部分をすこしこじって、ひっぱればケーブルを抜くことが出来る。両側のケーブルを抜くと、このように金具だけになったケーブルが出来上がる。これを5本用意して8列ソケットの両側から、3本、2本とさす。延長なのでクロスする部分がないようにフラットに両側のソケットを実装すれば完成である。

これを使うことで1列の隙間があればブレッドボード上のarduinoに書き込みを行うことが出来る。
もちろん、延長ケーブルの配線でクロスさせるなら、もっと簡単にラインを引っ張りだせた、というのは言うまでもないが、直接させることを目標にしたというのが今回の工作の主眼なのでそこは問わないことにしよう。


なんにせよ、これで格安arduino環境が整い、ブレッドボード上に低コストで作品を作ることが出来るようになったわけだ。





2009年1月28日水曜日

ブレッドボードで arduino/88

one chip Arduino clone というのを Make blogなどで発見した。制作記事を読むとATMega88 をつかって 内部発振で動くらしい。ということで、何度か試したもののあまり巧くいってないarduino clone作りであるがこれはさっそく真似せねば!と思い、ブレッドボード上に実装してみた。これは速報のonechip arduinoの前に行った実験だが、報告の前後が逆になっている。
 
最近のArduinoは通常 Atmega168 を 16MHzで駆動しているが、one chip arduino は日本の誇る秋月電子で格安に販売されている Atmega 88 を使い、内部発振で駆動しているため発振子も必要なくなっている。このチップに最低限の回路としてステータス表示用のLEDと動作きりかえのためのリセットスイッチを実装したのがone chip arduino だ。実装部品は思ったよりも少なく、gainerと違い、シリアルポートもオプションなのでたしかにワンチップの上に載せられるくらいの部品しか存在しない。

これをベースにワンチップ化の前に、さらにシンプルになるように配慮しながらブレッドボードに組み立ててみることとした。

そのまえに、まずAVRをarduinoとして動作させるのに必要なブートローダをAtmega88に書き込んだ。
仕事でAVRを使っているグループがいるのもあり、手元にたまたま STK500が転がっていたので、kosakaさんのページ
を参考に STK500をarduinoに登録した。
さすが純正品ということで当たり前だが、なんのトラブルもなく書き込みを行えた。ブートローダは各チップに一度だけ書けばいいので、チップを買ってきたらまとめて作っておくのがよいだろう。


秋月電子で一番安いブレッドボードの上でこれを組み立てることとして、
配線を行った。この ブレッドボードでの最大の問題は、電源ラインが左右に分離しているところであり、このため通常はやらないパーツの上をとびこえる配線が1カ所だけ入っている。


なお、もう1つ大きいブレッドボードの場合には、電源ラインが2本づつ入っているので、左右をちゃんとつなぎ込めば、無様な真似をしなくても作ることが出来る。余白に回路を作ることを考えると、実はこちらのほうがよいのかもしれない。

実際に利用するスケッチを書き込むためには、USBシリアルの変換アダプタが必要だ。秋月のUSBシリアル変換モジュールにコンデンサと抵抗でリセット回路を組み合わせた書き込み用ボードを作成した。L字型のコネクタを使うことで、直接ブレッドボードにさせるのを狙ったが、微妙にスペースが足りずに干渉しやすいことが判ったので、延長ケーブルでつないでいる。
こちらに関してはのちほど別の記事でお伝えしようとおもう。

arduinoも思ったよりも簡単に作ることが出来たので、これでパソコンとの連携が必要ない作品を作る場合はarduinoを使ってもいいかもしれないと思えてきた。パソコンを使う場合で、機能が収まる場合には、arduinoよりもgainerのほうが開発コストが低いと思われるので、gainerの意味がなくなったという訳ではない。とくにgainerの派生物としてAVRと組み合わせた ginger/peper は秀逸で、USBをソフトウェア実装してあるため、USB接続をする先まで考えても、コストが安いことと、実装面積が小さくていいことの2つから便利に使えそうである。


実は先にAtmega168 をつかった Diecimila互換機もブレッドボード上に実装してみた。こちらはマルツで買ったAtmega168と秋月で買った16MHz のセラロック(セラミック発振子)を配線してあるだけでほかは大きな違いはない。高速処理が必要ならばこちらもやってみるといいだろう。ただし、本気で高速処理を考えるならば、普通にAVRGCCをつかってC言語でプログラムをかいたほうがいいのは言うまでももない。

2009年1月26日月曜日

速報 one chip arduinoを作ってみた

ちょっと時間ができたので one chip arduinoを真似してチップ上に無理矢理実装というのをやってみた。

コンデンサの数を減らし、書き込みはヘッダピンがなくてもブレッドボードでやればいいじゃないかということで、極力パーツを省略することで、さらにパーツの少ないすっきりとしたものが出来上がった。この先は表面実装用のパーツとシール基板を使えば、もっとすっきりしたものが出来上がるだろう。

ビフォーアフターは以下のとおり。














書き込みはこのように、USBシリアルアダプタを使ってブレッドボード上で行うこととした。このシリアルアダプタの話はまた今度しようとおもう。シリアルアダプタの中にリセット用の回路を組んであるので、リセットスイッチを押さなくても書き込みは可能である。

LEGO Duplo をケースに

携帯モノの工作をしたときには、そのケースに苦労することが多い。今回は本業で作っているzigbeeの携帯用ノードであるが、ちょうどいいケースを探していたときに 赤ちゃんむけのLego であるdupro シリーズがちょうどいいんでは?と思い当たり、試してみた。残念ながらレゴは単品売りが行われていないので、一番安くて普通のブロックが沢山入ってそうなものということで、緑のバケツというのを購入した。この中には通常サイズのブロックのほかに動物や人
形、車といったパーツが入っていたが、こちらは今回の用途には役に立たないので、最近激務な同僚の先生のお子さんに差し上げることにして、通常の8つ突起のあるブロックをそのまま削り込むことにした。
結果はこのように、あつらえたように申し分のないサイズとなった。今回の用途では大満足だ。

レゴの内側には噛み合わせのための形状がモールドされている。もちろん、中にモノを詰め込むためにはこのモールドは邪魔になるので切り刻むしかない。カッターとペンチと電動リュータを駆使して中身をくりぬいたところがこちら。

ブロックの内側の構造にカッターで切れ目をいれ、出来る限りペンチでもぎ取る。残った部分はリュータを使って削りこんでいって完成だ。レゴの素材はやわらかく、熱に強いので、ゆっくりカッターやリュータをつかえば思ったよりは簡単に削り込めるし、割れる心配もほとんどない。Oリングをつけるための金具はピンバイスであけた穴を拡張して利用している。こちらの金具はタカチのもので袋には70円と書いてあった。

あとは基盤の組み付けの問題は残っているが、現状では電池ケースを接着剤ではりつけ、基盤は電池に対して両面テープでとりつけた。今後はうすい普通サイズのレゴのパーツをつかい蓋をするなどといった案が考えられるだろう。

レゴを使ったケースは手間とコストはかかるものの見栄えとしても悪くないし、持ち歩きもの、インテリアものにはよいのではないだろうか。次はユニバーサル基板をいれてみようかとおもう。

2008年10月14日火曜日

ベリーショートなACタップ

テーブルタップのコードがからまるという問題は、古今東西あらゆる現代人が直面している問題のようで、さまざまなツールや解決案が提案されている。また、別のテーブルタップの問題としてはコンセントの口が少ないということがよくあげられる。総計1500Wの3つ口テーブルタップに、昔なら数百ワットを使うテレビやこたつといったものをつなぐのが普通だったのが、最近ではたった100W以下しか使わないゲーム機やパソコンのACアダプタを数多くつなぎたいという要求のほうが多い。

これを解決するには多口のタップを使うのが簡単だが、そう多いものは売られていない。そのため、タップは基本的にたこ足になってしまうのが一般的だが、その場合には長いコードのやり場に困る。

そこで個人的によくやっているのが、タップのコンセントを短く切断してしまう方法だ。とくにオフィスのデスクの下に転がすタップなどはデスクに磁石で取り付けることもあり、あまり長いと邪魔なだけなので、20cmくらいの長さになるようにコードを切断したものを用意している。

高級品のタップの場合にはタップ側を分解するとケーブルがねじ留めされているので、その場合にはねじを外して、コードを短く切り、もう一度ねじ止めする。普通のタップの場合には、ケーブルがハンダ付けされていたり分解できないようなネジや、接着といった方法でとめられていたりするのでその場合にはコンセント側を捨てることにして、新しいコンセントの部品をホームセンターで買ってくればいい。このときにコンセントを90度に曲がるものや回転するものなど、自分のさしたい場所にあわせてやるといいだろう。

写真は筆者のオフィスのテーブルに張り付いているタップである。真ん中が床下から生えてきているタップでそれを左右2つのタップに分岐して使っている。ただでさえ、イーサネットケーブルと電源ケーブルで混乱している机の下だが、このタップのケーブルが3mもある場合とは雲泥の差であるのは判ってもらえるだろう。

既製品を切り刻むのは抵抗があるのだろう。簡単にできる割にあまりやった話を聞かないのだが、自分の足下がおどろくほど快適になるのでぜひ試してみてほしい。

ちなみに切ってしまうと模様替えなどで長いケーブルが必要になると使えないじゃないか!と言う人もいるとおもうが、自分の手元に必要なテーブルタップの口数がかわらない以上は手元まで引っ張るものと手元でバラすものが必要なわけで、大きな問題にならないはずだ。

2008年6月25日水曜日

gainer clone で「かざぐるま」あるいは PWMによるモーターの駆動

Gainerは設定にもよるが 4ないし8本のアナログ出力(PWM)を使うことが出来る。前に作成した power gainer は電源にもよるがトランジスタアレイにより小型のモータを回転させるには十分な電力を供給することができる。そこで、前からやってみたかったアンビエントディスプレイである「かざぐるま」を作ってみた。

これは MITのメディアラボで行われているタンジブルコンピューティングの象徴的なアンビエントデバイスの一つである。(詳しくは Media LabのTangible Media Group を参照。) 

使ったのは前に作成したTD62083をワンボードに組み込んだGainer(Power gainer)とタミヤのプーリー基本キットである。これらをささえる土台となっているのは、100円ショップで買ってきたアクリルのメニュー立てだ。プラスチックのプーリーをゴムベルト(ゴムバンド)で回転させるプーリーキットは回転時に音がほとんどしないので、ギアボックスと違い常時動かしておくアンビエントディスプレイに適している。これに、ケント紙で作った風車を両面テープで貼付けてハードウェアのほうは完成である。



gainerのconfiguration3ならばPWM出力が8ch仕様ということで作成した風車のセットを同時に8つコントロールできるが、今回はサンプルということもあり1つの風車だけで満足しておくこととする。8ch同時で動かすにはUSBに寄生するだけではなくターゲットボードにACアダプタ等の外部電源が必要だろう。

このgainerをコントロールするプログラムはまず、テスト用ということで簡単なものを用意した。マウスカーソルを動かすとそれに従ってアナログ値が変化するものだ。これで、ウインドウ上をマウスを左右に動かすだけで回転を変化させることが出来るので動作確認には十分だろう。このプログラムはPWMで動かすデバイスの試験にいつも使っているものでもある。




以上のように風車は簡単に動くところまではきたのだが、ひとつ大きな問題が残ってしまった。ほとんど動いていないときもピーピーとモーターから音がする。これは Gainerの PWMの周波数が1KHzであるため、 1KHz周期でモータが振動してしまっている音であり、PWMでモータを動かす場合に起きる現象だ。このノイズを解決するためにはモータを駆動するPWMの周期を25KHz以上に上げる方法がよく使われる。こうなると、モーターの振動音が超音波の領域に入るため人間には聞こえなくなるのである。もちろんノイズがなくなるわけではないので、コウモリやイルカには迷惑なのかもしれないが、そこは気にしないことにして、ファームウェアを改造しPWMの周波数を上げる対策をとることとした。

(つづく)

PWMテスターのソースコードは以下のとおり。

----------
import processing.gainer.*;

Gainer gainer ;


void setup() {
size(500,100) ;
gainer = new Gainer(this) ;
}

void draw() {
int i ;
background(mouseX/4) ;

for ( i = 0; i<500;i+=100) {
stroke(255,0,0) ;
line(i ,0,i,100) ;
}

gainer.analogOutput(1,mouseX/2) ;
stroke(0,0,255);
line(mouseX,0,mouseX,100) ;
println("NOW: " + mouseX/2 + "*" ) ;
}
----------

2008年6月24日火曜日

Processingでtwitterと http認証 (basic auth)

Processingをつかって、httpをしゃべらせることは難しくはない。ただ通信してページを取ってくるだけならば、loadStrings() の引数にURLを指定してやれば、自動的にJavaのURLクラスを使ってStringsの配列として格納できる。これをつかって、twitterのデータを読み込もうとおもったのだが、twitterではbasic authを使わなければ自分のfriends timelineを取り出すことが出来ない。そこで basic authを processingでやってる例をさがしたのだが、発見できなかったので生のjavaでのbasic authの方法をそのまま取り込んで実現してみた。

さまざまなページによると javaでのhttp認証では java.net.authenticator とjava.net.PasswordAuthentication の2つのクラスを使い、Authenticator クラスを継承した認証クラスを作ってハンドラを設定する、というのが正解らしい。つまり、以下のようなコードとなるわけだ。



import java.net.Authenticator;
import java.net.PasswordAuthentication;

//public
class BasicAuth extends java.net.Authenticator{
private String user;
private String pass;
public BasicAuth(String user, String pass)
{
this.user = user;
this.pass = pass;
}

protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(user,pass.toCharArray());
}
}




このクラスの利用方法は、user名とpasswordを設定して作成したクラスのインスタンスを生成し、そのあとで、Authenticator の setDefaultを呼び出す。前処理としてこの作業を行うと以降の http通信で認証が必要とされる場合には設定した情報をベースに自動的に認証が行われる。これをそのまま、processingに追加して使った。Processingは基本的にjavaそのものなので、このような場合の拡張は非常に簡単ですばらしい。
本当はpackage化してライブラリとするといいのだろうがそれはまた今後の課題ということにしておこう。

さて、現実にtwitterの出力するXMLの解析には、simlpeMLというライブラリを使うことにした。simpleMLはdaniel shiffman(http://www.shiffman.net/) の開発したライブラリであり彼のページからダウンロードできる。loadStrings()を使うよりもよい点は、後で XMLライブラリを使ってエレメントを取り出すよりも簡単なことと thread をつかって非同期にhttpリクエストを発生させて、ページを取得できたときにイベントを発生させることが出来る点である。とくに後者は、一定時間ごとにページを取得して書き換えるような動作を行いたい場合には、非常に有効であろう。

timelineの twitterAPI呼び出しを行うにはBasic認証付きでAPIで定められたURLを呼びだせばよい。受信形式はいろいろ見比べた結果、後処理がもっともやりやすそうなRSS形式を指定した。これらをまとめるとコードは以下のようになる。あとは、数分おきにreloadをするとか、スクロールするとかのフィーチャーを盛り込めば、twitter viewerとしての機能は十分だろう。
ちなみに書き込みは post method が必要なのだが、こちらも processingで使えるモジュールはなさそうなのとすこし複雑な処理が必要そうなのでもう一工夫必要なようなので今後の課題としておこう。
動作させるためには、フォントを作成する必要がある。Processingのメニューから Tools-->Create Fontを選択すると次のような画面が出るので Osakaフォントの16pointを指定する。日本語表示には日本語のフォントも必要なので All Fontのチェックボックスにもチェックをいれておく必要があるだろう。こうやってフォントを作成した後、コードの中の user と pass を自分のものに入れ替えれば動作させてみることができる。



--------------------------------
import simpleML.*;

import java.net.Authenticator;
import java.net.PasswordAuthentication;

// configration
String user = "uname" ;
String pass = "xxxxx" ;

// request url
String url = "http://twitter.com/statuses/friends_timeline.rss" ;

//public
class BasicAuth extends java.net.Authenticator{
private String user;
private String pass;
public BasicAuth(String user, String pass)
{
this.user = user;
this.pass = pass;
}

protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(user,pass.toCharArray());
}

}


XMLRequest xmlRequest;

void setup() {
size(screen.width/2,screen.height/2);


BasicAuth tw_authenticator = new BasicAuth(user, pass);
Authenticator.setDefault(tw_authenticator);

// Creating and starting the request

xmlRequest = new XMLRequest(this,url);
xmlRequest.makeRequest();
}

void draw() {
// background(frameCount % 255);

}

// When the request is complete
void netEvent(XMLRequest ml) {

PFont fontA = loadFont("Osaka-16.vlw");
textFont(fontA, 16);

// Retrieving an array of all XML elements inside "" tags
String[] titles = ml.getElementArray("title");

for (int i = 0; i < titles.length ; i++) {
println(titles[i].replaceAll("\n",""));
fill(10*i,0,0) ;
text( titles[i].replaceAll("\n",""),5,18*(i+1)) ;
}

}

--------------------------------


ここまで。

2008年5月12日月曜日

背の低いUSBシリアル

ということで、ジャンパピンがでっぱってケースに入らないことがあるので、

ピンをはがしてワイヤハンダ付けして結線しなおし。
どうせ、設定決めたらいじらないし。

最近どうもコネタばかりだ。


2008年4月11日金曜日

Power Gainer  (またまたGainer 互換機)

Gainerを使ってブレッドボードで作品をつくると作品をブレッドボードのまま保存しないといけない。しかしながら、ブレッドボードだとパーツはともかく、配線がもげたりして、動かなくなりがちである。1作品に1個gainerを消費するのは耐えられないという貧乏性なのもありサーボのときもユニバーサル基板で簡単な回路を起こしたが、今度はトランジスタアレイを駆動することにしたボードを作ってみた。

このトランジスタアレイつきGainerならば小型モータくらいならそのまま動かすことができるので、power gainer と名付けてみた。こうやって作ってみた基板がこちら。これをコンフィグレーション3、4を使えば8ポートのアナログ出力をトランジスタでドライブした形で使うことができる。シンクドライバなのだが、論理の反転はトランジスタアレイがやるのでそのまま出力すれば問題なく、出力を変化させることができる。

実際には多チャンネルを外部から同時に利用するためには、トランジスタアレイに別途電源を用意しなければ、USB給電の限界が先にくることになるとはおもう。何に使うかはまだ決めていないが、最近のマイブームでは振動モータが熱いのでそれをPWMで複数駆動してみる予定である。

Gainerとrubyとtwitter (あるいはタンジブルなtwitter)

Gainerをコントロールするためのライブラリを探すと processingや Flashといった作者から提供されているものだけではないさまざまなライブラリが存在する。その中でも個人的に普段使う言語であるrubyのライブラリを発見したので、それを使ってみることにした。gainerでよく使っていたprocessingは基本的にディスプレイと一体化しているのでデーモンを作るのは困難であるが(とおもう)rubyならば簡単にバックグラウンドタスクで動かすことが出来る。さらにrubyの他のライブラリと同時に使うことでさまざまな処理を簡単に行うことができることも
、processingとの違いであろう。

processingを使うとグラフィックを簡単に表示できるので画面をつかったインタラクションを作るのには非常に向いているのであるが、今回のようなネットワークをつかったフロントエンドで、画面を必要としないようなものの場合には、rubyのほうがよいであろう。さらに、 C++のライブラリというのも見つけたので、組み込みマシンを使うならばそちらのほうがいいかもしれない。恐るべしgainer。
まあ、それはおいといて作ったものがこれ。ボタンをおすと twitterに「コーヒー飲みたい」みたいなメッセージを書き込む。ボタン2はランダムにfollowerを選択して「スゲー」と書き込む。
ruby-twitter のライブラリと gainer-rubyのおかげでとても簡単に書き上がった。回路はブレッドボードの上につくったがコンフィグレーション1のまま Din の4ポートにスイッチをつないだだけである。
一度かきこんだら1分以上たたないと書き込まないといった処理は追加してボタンの押し過ぎに対応しておく。こうやっておかないと無限にボタンを押して大変なことになることがある。

これだと単なるキーボードでよさそうだが、このままスイッチを人感センサーに変更すれば「部屋にひとがきた!」みたいなことをしゃべるtwitterを作ることも簡単だ。もちろん、コードを修正してアナログの入力をつかえば「部屋があついです」とかもね。

今回のコードは以下のとおり。動作環境は intel imac の leopard 上でデフォルトのrubyを使っている。gem で twitter (twitter4rではない) と gainer-ruby をインストールしておく必要があるので試してみる前にお忘れなく。ちなみに twitterは gemでそのまま入るが、 gainer-rubyは URLを指定してやる必要がある。



#!/usr/bin/ruby
#
# Twitter Button
#

require 'rubygems'

gem 'twitter'
require 'twitter'
gem 'gainer'
require 'gainer'

## setting for User account
id = "UserName"
pass = "password"

tc0 = Time.now - 80
tc1 = tc0
tc2 = tc0
tc3 = tc0
tcb = tc0

twit = Twitter::Base.new(id,pass)
gainer = Gainer::Serial.new(ARGV.shift)

puts "Ready.\n waiting buttun..."

gainer.on_pressed = proc do
puts 'Button pressed'
if (Time.now - tcb > 60 ) then
tcb = Time.now
fri = twit.followers()
fnum = fri.size
friend = fri[rand(fnum)].screen_name

puts "#{friend} SUGOI..."
twit.update("@#{friend} スゲー!w by XXX ")
end

end

loop do
sleep(0.1)
gainer.peek_digital_input

case gainer.digital_input[0]
when 1
puts "GET 1"
if (Time.now - tc0 > 60 ) then
tc0 = Time.now
puts "Give me COFFEE..."
twit.update("珈琲プリーズ だれかプリーズ")
end
when 2
puts "GET 2"
if (Time.now - tc1 > 60 ) then
tc1 = Time.now
# fri = twit.friends()
fri = twit.followers()
fnum = fri.size
friend = fri[rand(fnum)].screen_name

puts "#{friend} SUGOI..."
twit.update("@#{friend} スゲーョ!")
end
when 4
puts "GET 3"
if (Time.now - tc2 > 60 ) then
tc2 = Time.now
puts "I'm Sleepy..."
twit.update("ねむい中")
end
when 8
puts "GET 4"
if (Time.now - tc3 > 60 ) then
tc3 = Time.now
puts "Give me FOOODDDD..."
twit.update("はらへり、ヘリハラ")
end
else
## puts "NODATA"
end
end