ラベル xwindow の投稿を表示しています。 すべての投稿を表示
ラベル xwindow の投稿を表示しています。 すべての投稿を表示

2010年4月11日日曜日

メモラーの法則

どうも、平日も土日もグウタラなQです、こんちには。

というわけでメモを書きたいわけです。まあ殆ど誰も見ることのないブログなので、メモはもはや私物としてのメモですな。
まあ特にLinux絡みなんかで会社で役に立ったりすることも有るので、書いといて損はしないなと思いました。

1.Linuxでシリアル
openでfile descriptorを手に入れる。
(/dev/ttyUSB0とか)

struct termios hogeを宣言し、それぞれ必要な設定を行う。
(重要なメンバはc_cflag、キャラクタサイズとか受信有効とか)

cfsetispeed:受信baud rate設定関数
cfsetospeed:送信baud rate設定関数
tcsetattr関数で設定を有効にする.

後はreadとかwrite関数とかでやりたい放題でっせ、だんな。



2.Linuxでシリアル通信に使うターミナルプログラムの名前
minicom
よく忘れる。



3.倒立振子
inverted pendulum



4.Xでポインタを移動
XWarpPointerで移動させることが出来るが、windowがポインタをgrabしてないと、関係ないwindow(大抵はターミナルプログラム)で移動してしまうので注意。



4.static記憶クラス
staticを付けると、最初に宣言されたときのみ初期化され(明示されてなければ0で初期化)、プログラム終了まで値が保持される。従って一旦ある関数から抜けて、また戻ってきたときに、前回抜けた時の値をそのまま使うことができる。



5.Linuxで時間を取得
time.hをinclude
秒単位の時間を得るとき
time_t zikan;
time(&zikan);
マイクロ秒単位が欲しい時
struct timeval zikan2;
gettimeofday(&zikan2,NULL);
zikan2.tv_secは秒単位
zikan2.tv_usecはマイクロ秒単位

必ず忘れるんだよな・・・。



しかし本当にメモだらけのブログだなこれ。そのつもりなんだけど。




メモ書いた
書いたことを
忘れてた

2010年4月6日火曜日

カオスメモ理論

どうも、最近制御論が面白いQです、こんちには。

前の日記はカオスだったが、要するにLinux用のプラネタリウムソフトを作ったのである。プラットホームはCとX window。
まだ改善点は大量にあるが、家の微妙なPCでもマウスでそこそこインタラクティブに視点変更ができるので、それなりに面白いものができたんじゃないかと思っている。もちろんメガモードも持ってます。最もメガモードだとそれなりに天の川とか映るけど、とてもインタラクティブとは言いがたい操作性。

まあちょっとマシンパワー当たりに手を加える必要があるかもしれない・・・。まだこういった機能付けたいといったものがあるので余裕をみて少しずつ改善していく予定です。将来的にはは実機のプラネタリウムと連携とかも考えてはいるのですが。

で、実装に完全にかまけていたのでメモ。まじカオス。

1.KDevelop
デバッグ環境が欲しかったので、KDevelop使ってみた。gdbとかで頑張るのもまあぶっちゃけ馬鹿馬鹿しいだけなので、この際一つ何か使えるようになっておこうかと。
普段Linuxではemacsでプログラム書いてるので、プログラム書くときにctrl-cとか押してしまうのに参った。というわけでショートカットボタンを変更。良く使うコマンドはemacs仕様に変更。setting->configureナンチャラとかで色々設定できる。

ちょっとハマッたのがプロジェクト管理。本家のQ&Aによると、画面の右側にAutomake Managerというのがあるので、ここで既存ファイルをプロジェクトに追加したり、特定のファイルをプロジェクトから外すことができる。



2.mallocとかcallocとか
Cの仕様として、保証される最大サイズは64KByte。これ以上確保する場合はエラーが発生する可能性がある。まあ今のPCのメモリは普通にGByte程度は有るので、よっぽどのことをやらない限り問題にはならない気がするけど。



3.feof()
現在ファイルポインタが指している文字がEOFかどうかを判定する。ただし、
12345\nEOF
見たいなファイルでfgets()を使っていると、ファイルポインタの中身?は\nで止まってしまうので、
while(feof(fp) == 0){
fgets(fp);
}
というコードを組んでいると、EOFを一行として余計に読み込んでしまう。
詳しい実装は知らんが、おそらくファイルポインタから読み込まれたストリームの最後の文字がEOFかどうかを調べているんだと思う。従ってEOF前の\nでストリームの最後の文字が止まるため、whileの判定文をすり抜けてしまう.



4.XWindowのディスプレイとスクリーンの意味。
スクリーンはいわゆるマルチディスプレイ環境におけるどのディスプレイか?を示す。デュアルディスプレイとか言うときのディスプレイの概念はこっちに当てはまる。一方ディスプレイは凄い怪しい説明が多いのだが、最も明解な説明は、「ユーザーに提供されるマウスやキーボード、モニタ等の、インターフェースのセット」。現代のPCのイメージだと想像し難いが、昔のハイスペックなPCを皆で共有していた時代の概念だと思う。インターフェースのセットなんて考え方は一人にPC一台の時代には不要な概念だし。



5.Xにおけるマウスのボタン。
右手系において、
左ボタン:Button1
ホイールをコチってする:Button2
右ボタン:Button3
ホイール前回転:Button4
ホイール後回転:Button5
に相当。



6.構造体を型として定義
typedef struct{
short suzuki;
long watanabe;
char *tsukishima;
int kobayashi;
double iwaki;
} zannen;
ど忘れした。こんな感じで定義する。



7.キーボードからの入力を受け取る
KeyPressMaskをイベントして許可する.
通常のウィンドウの場合、フォーカスが有ればキーボードの入力は普通に認識されるが、override_redirectが設定されてたりするとキーボードの入力が認識されない。認識されるようにすることをgrabとXでは表現しているようだが、キーボードの入力をgrabするためには、ウィンドウをmapした後に、
XGrabKeyboard
という関数を使う。
さらに入力された文字が何かを知るためには
XLookupString(
XKeyEvent*,
char*,
int,
KeySim*,
XComposeStatus*)
という関数を使う。最後の二個の引数はNULLで良い。char*にアスキーコードが返され、intに数が返される。



8.Pixmapのクリア
XClearWindowはWindowに対して定義されている関数で、Pixmapには使えない。代用として、drawableに対して使うことができるXFillRectanbleを用いた。



9.イベントのqueueingと圧縮
ExposeやMotionNotifyのイベントは大量に発生するので、逐次対応していたのでは描画に時間がかかったりして非効率である。そこで、同じ種類のイベントがあったら一つにまとめて対応することが良く行われ、これをイベントの圧縮という。
Bool XCheckMaskEvent(
display *,
long,
XEvent*)
Bool XCheckTypedEvent(
display *,
int,
XEvent *)
queueingされているイベントのうち、同種のイベントが有るかどうかをチェックし、有ればそのイベントをqueueから削除してXEvent構造体に格納、Trueをreturnする関数。



10.日周運動と緯度
diurnal motion
latitude
latitudeってD○LLのPCってイメージだが緯度って意味だったのね・・・。



11.マルチスレッドのプログラム
コンパイル時に-lpthreadを付ける。忘れてはまった。



12.意図的にイベントを起こす
マルチスレッドなんかやってると意図的にイベントを起こしたくなる。
XSendEventという関数を使う。
使いかたが意外と面倒なのだが、基本的にはXEvent型の変数を定義して、内部のメンバの値を色々偽装する。そして、XSendEvent関数で当該のDisplayのイベントqueueに送り込むことになる。Exposeイベントなんかでは使うことも有るのではないかと思う。
ちなみにExposeイベントとかのメンバにはcountというのがあって、本来は同様のイベントが少なくともあと何回くるか?を表す。イベントの圧縮の手法にこっちを使うことも有るようだが、XSendEventで送られたイベントはこの処理は行ってくれない。従って自分で調べて偽装するか、これに頼らない実装を採用することになる.



13.sprintf
printf関数の何が便利って%dとかだと思う。double-char変換を簡単に行う方法として、
sprintf(配列的なもの,"%f",double型の何か);
で代入できる。



しばらくメモをサボってただけ長文メモになってしまった・・・




眠いけど
いつかは見るさ
このメモも

2010年3月19日金曜日

フラッシュめもリ

どうも、anywhere,anytime、ウッツ!!なQです、こんちには。

たまにXのプログラムを書いていたのだが、Xserverが動いているPCの上でXclient動かすのはXの本質を捉えていないと思い、XserverとXclientを分離して動かしてみた。

なんて書くとちょっとそれっぽいが、なんてことは無い、

自分のLinuxPC⇒SSH⇒サーバーにlogin
サーバー上でxeyesというアレを起動
サーバー⇒x_onnection(TCP)⇒自分のLinuxPC上に表示

しただけ。だけど、思いのほかやってみるとメンドクサかった。
とりあえず、最低限のやるべきこととして、

Xserver側(上記で自分のLinuxPCに相当)で


Xhost + 192.168.xxx.xxx
(192.168.xxx.xxxからのアクセスを受け付ける)

ファイアウォールを切る(TCP,6000番を開けるでもOK)

自分のLinuxはCentOSなので
管理⇒ログイン画面からTCPのコネクションを受け付ける
ようにする。


次にXclient側(上記でサーバーに相当)で


僕はbashなので、
export DISPLAY=192.168.yyy.yyy:0
(要するにXserverが動いているPCのIPアドレス)

でxeyesを実行すればOK。


ついでに
XOpenDisplay("192.168.yyy.yyy:0")
というプログラムでも遠隔でいける。まあ直書きするのはどうかと思うけど(笑)


このスタイルってちょうど20年くらい前の、高性能な演算装置を皆で共用して使っていた時代の使い方そのものなんだよな。この時代には既に、遠隔とか外部から接続とかディスプレイ環境に関するサーバーとクライアントとかが出来ていたってのは驚く。
今はPCスタイルが普通なので何の意味もない。仮想的に計算環境を借りてきた時代じゃなくて、もはや自分のPCを仮想化する時代だし・・・僕のPCはスペック低いので無理だけど。といってもサーバーがAtomD410だから、計算環境を借りる意味すら怪しいのか(笑)

まあちょっとやってみただけですが…





このブログ
もはや只の
メモ帳で

2010年3月1日月曜日

やさしいメモ論

どうも、最近ニコニコ動画の凄さに気づいてしまったQです、こんちには。

タイトルのネタが段々乏しくなってきましたが、まあ最悪、~~第二とかで逃げれば良いので(笑)

1.スピログラフのイメージ
スピログラフとはちょっと違うけど。
二つの同じ半径のボールが有ったときに、一つのボールを固定して、もう一つのボールを固定されたボールの上を滑り無く転がしたとき、半周分しか転がさないのに、何故か転がした方のボールが一回転する、というのが分からなかった。
でもそれは以下のように考えることで解決できた.











つまり、一回転したように見えるけど、実際は二つのボールがそれぞれ反対方向に半回転分回っているわけですな。そして、固定されているはずのボールを本来の位置に戻すと一回転しているように見えると。






2.Rumer has it the world is held together by duct tape.
最初意味が分からなかった。Rumer has itで「~~という噂だ」という意味だと言うことが分かると…(笑)




3.XRaiseWindow
本来の意味としては、当該のwindowを上に表示させる関数。が、override-redirectがFalseの場合、イベントが通知されるだけで実際には上にならない。この辺の動作は思ったよりも難しいのかも知れない。





4.XDrawString16
2byte文字を書くための関数なのだが、引数に文字数の指定がある。この単位は2byte indexingらしい。明示的に書かれて無いので不明だが。また、普通の1byte文字を放り込んだ場合、byte2に当該の文字が入り、byte1は0x00として扱われる。





5.linuxでCPUの情報をみる。
cat /proc/cpuinfo




6.AtomプロセッサD510
GPU内蔵のDual Atomプロセッサ搭載のマザーボードがintelから出てる。ATX電源の端子が説明書には24pinと接続する的なことが書いてあるが、20pinでも動いた。


そういえば最近プラネタリウムから離れ気味だなぁ…





プラネもね
流石にそろそろ
始めたい

2010年2月10日水曜日

メモ概論第一

どうも、第一印象があまり良くないと言われること山の如しのQです、こんちには。

英語が使えると10億人とコミュニケーションできるそうですが、コミュニケーションあんまりしたくない僕はどうしたらいいんですかね?(笑)
どっちかっていうと技術文書とかマニュアルとかの方が・・・

まあつまり最近日常言語、特に読むのが殆ど英語になりつつある。


1.XSetWindowAttributes
当然だがウィンドウには様々な属性がある。そこで、その属性を設定・変更したりするのに使うのがこの構造体。なんか凄い一杯あるが、とりあえず今回使ったのがウィンドウマネージャによる介入の防止。
上記構造体のメンバに
bool override_redirect
というのがあり、デフォルトはFalseだが、Trueにするとwindowをmapするときにウィンドウマネージャがデコレーションや位置のコントロールを行わなくなる。
例えば、

XSetWindowAttributes a;
a.override_redirect = True;
XChangeWindowAttributes(Display,
            Window,
            CWOverrideRedirect,
            &a);

こうするとWindowのoverride_redirectに関する属性のみ、&aに設定した内容に変更される。CWOverrideRedirectは変更対象の属性を示すマスク。複数種存在しそれらのORによるマスクにより複数の属性を一度に変更することも出来る。




2.XCopyAreaとPixmap
XCopyAreaという関数で、あるdrawableの内容を別のdrawableの内容にコピーする。
XCopyArea(display,
     src,
     dest,
     gc,
     src_x,
     src_y,
     width,
     height,
     dest_x,
     dest_y)
大体、名前見るとどういうことか分かるが、要するに、幅width,高さheight、左上の角の座標が(src_x,src_y)の長方形で囲まれたsrcのdrawableの内容を、destのdrawable上で左上の角を座標(dest_x,dest_y)とした同じ大きさの長方形で囲まれた領域にコピーする。この時この二つのdrawableは同じrootとdepthを持っていなければならない。
drawableにPixmapというものを使うこともできる。イメージとしてはviewableでないwindow、表示されることはない生のwindowって感じ。バッファに使えるので、あるwindowの内容を一時保存したり、影でこそこそ計算・描画しておいて一定のタイミングでのみ本当に表示するwindowにコピーとかに使うっぽい。





春がくる
出会いと別れ
引き連れて

2010年2月9日火曜日

樹海の入口にメモを書く

どうも、会社の先輩に結婚しないなんて人生損するよ?と言われること山の如しのQです、こんちには。


すいませんが先輩、あんまり幸せそうじゃないっす(笑)

さてさて、Xwindowという樹海に紛れ込みそうになっているので、とにかくメモを書いておきます。基本的な概念・構成は今から20年以上前に出来ていたわけで、当然ながらちょー巨大・カオスなプログラム、ライブラリと化しているわけです。
とんでもないところに足を踏み入れたもんだ・・・


1.Atom
サーバーとクライアント間の通信に使われる、識別子、らしい。Atom自体は単なる32bitの整数型でしかないが、これに
atom = XInternAtom(d,*name,only_if_exist)
とすることで、*nameの関連付けをすることが出来る.
dはDisplay、*nameは要するにAtomにつける名前、only_if_existはbool型で、よくわからんがとりあえずTrueの時は*nameのAtomが存在するときに値を返す、Falseの時は*nameのAtomが存在しないときに新しく生成してくれるらしい。

とりあえず、これを使えばクライアント-サーバ間やクライアントークライアント間通信を実現できるのだが、実際にはwindowのプロパティとかEventとかの設定をしなければいけない。ぶっちゃけ使うだけならなんとかなるのだが、この辺の深い内容は一度腰を据えてきちんと理解しないとカオスになりそうなので、今はここで留めておこう。




2.xで色を使う。
Colormap = DefaultColormap(Display,0)
デフォルトで用意されているカラーマップのIDを手に入れる。

XAllocNamedColor(Display,
Colormap,
(char*)color_name,
XColor *screen_def_return
XColor *exact_def_return)
Colormapを放りこんで、color_nameを指定すれと、exact_def_returnには本来指定されるべき色のデータ、screen_def_returnには使いたい色が使えなかった場合に近い色のデータが返される。要するにscreen_def_returnに代入される値を使う.




3.Linuxで文字のエンコードを変える。
システム的に変えるには
/etc/sysconfig/i18n
の内容をいじり、再起動。

その場で文字コードを変換するには
nkfというコマンドが使える。
echo hogehoge | nkf -e
とやるとEUCになる。
kccも似たようなことができるようなのだが、僕のPCではうまくいきません。
まあnkfが動くからいいけど。




4.古いRoomba
やっぱりROIが使えなかった。鬱。





なんてこと
これじゃあ只の
掃除機じゃん

2010年2月1日月曜日

ヌーメモローン

どうも、メッケーモとかヌーメロローンとか分かる人には廃人全開にしか見えないであろうQです、こんちには。

人生は色々あるとは思いますが、時として色々賭けざるを得ない状況もあるような気がします。てか、まあどうも僕は何かを作ったり、熱中してないと死にたくなる人種だということは最近理解しました.

というわけでメモ。

1.DUB-9、シリアルポートの割り当て
PCのポートの場合、

1.CD:データキャリア検出
2.RD:データ受信
3.TD:データ送信
4.DTR:データ端末レディ、PC送信中
5.GND:信号のグラウンド
6.DSR:データセットレディ、周辺装置稼働中
7.RTS:PCからの送信要求
8.CTS:周辺装置の受信可能通知
9.RI:周辺装置から呼出信号検出の報告

マイコン的に重要なのは
RD <- 周辺装置TD
TD -> 周辺装置RD
GND -- 周辺装置GND
RTS -> CTS
DTR -> DSR

この辺の情報は調べると錯綜気味な内容が多いが、とりあえず自分の環境ではこれでいける。




2.イヤホン用ジャックの耐電流
調べるのが意外と大変。本気で調べようと思うと、JIS規格のPDFを購入する必要があるっぽい。まあとりあえず調べた限りでは、

3.5Φジャック 約1[A]
6.3Φジャック 約2[A]

と見積もれば大丈夫っぽい。まあ、このイヤホン用ジャックで耐電流を気にするような使い方は普通しないと思うけど、着脱性と入手性は良さはトップレベルかもしれない・・・。




3.incompatible implicit declaration of built-in function
built-in関数の不正な?暗黙の宣言。
要するに、適切な宣言が行われていない関数が存在する時に発生する警告。

自分はstrlen()を呼ぶときにstring.hがincludeされてなくて出た。本やホームページに書いてあるソースが常に信頼に値するわけではないことを学習した.




4.Xにおけるフォント関連
xlsfonts:Xで使えるフォントの一覧
xfd -fn hogefont:当該のフォントの中身を見る

フォントの読み込み
Font font = XLoadFont(d,"hogefont");
なおフォント名はX Logical Font Description Conventionsに従っている必要があり、?や*による正規表現が可能。

GCにフォントを設定
XSetFont(d,gc,font);

文字列を書く
XDrawString(d,w,gc,x,y,"hugahuga",length);
w:書きたいwindow
gc:この場合は設定したフォント
x,y:よく分からんが、windowの左上を原点として、文字列の最初の文字の左端、下から3分の1位の位置を指定する感じ。フォントによって違うかも。
length:文字列長さ




5.window回り
window内にwindowを作ることができ、これをsubwindowと呼ぶらしい。

sub_window = XCreateSimpleWindow(d,parent_window,,,,)
これでsub_windowはparent_windowのsubwindowになる。

また
XsetSubwindowMode(d,gc,subwindow_mode)
という関数があり、subwindow_modeには
ClipByChildren:親windowへの書き込みがsubwindow内に影響しない。
IncludeInferiors:親windowへの書き込みがsubwindow内に影響する。
この辺をクリッピングとか言うらしい。
defaultはClipByChildren。

XRaiseWindow(d,w)
wをwindow stackのtopに置く。要するに一番上に表示させる。またExposeイベントをキューイングする。

XMapWindow(d,w)
wを実際に表示させる。manualのancestorの意味がいまいち掴めんが、親windowの連なり、のことをいってるのかな?要するに親(とその親とその親の・・・)windowが全てmapされてなければ、表示される資格が与えられるのみで、表示はされない。

subwindowを全部表示するのがメンドクサイときは
XMapSubWindows(d,parent_window)
を使う。manualでも推奨されています。

XMapRaised(d,w)
Mapして最上位に表示。




6.ボタンを作るのに便利なイベント
イベントタイプがButtonPressのとき、
Event.xany.window
でどのwindowでButtonPressが発生したのかを拾うことができる。
subwindowに使うとボタンに相当する機能が実現できる.




7.wc
トイレのことではなく、行数や文字数を表示するコマンド。





ほげほげほげ
ほげほげほげほげ
げほっげほ!!

2010年1月28日木曜日

メ(ッケー)モ

どうも、ゆっくりしたいんだってね、なQです。

とにもかくにもメモを書く。
ていう人が結構多くて、インターネットはメモだらけなんじゃないかとおもっています。戯言はさておき。


①サーバーのエラーメッセージ
webサーバー立てると当然ながらイミフなアクセスをされます。一秒おきにrequest送ってきたり、どこぞのサーバーに勝手にプロキシで使おうとしたりします。認証つけたりはしていますが、やっぱり不安です。

というわけでエラーページを返すときのhtmlも殆ど何も返さないようにしますた。
このあたりの処理を変更するには、

/etc/httpd/conf/httpd.conf
の中の

Alias /error/ "/var/www/error/"
より下にやたらに書いてある

# ErrorDocument XXX /hoge/hoge

を変更します。例えば401のerrorを応答するときにはコメントアウトを外し、

ErrorDocument 401 hogehoge

とします。こうすると、401エラーを返すときはhogehogeが帰るようになります(本当にブラウザ上にhogehogeが表示されます(笑))

また特定のhtmlファイルを選択するとそのhtmlが返されるようになります。




②1.XWarpPointerの引数について
マウスポインタの位置を強制的に移動させる関数。

XWarpPointer(d,
       移動前のwindow,Noneでも良い、
       移動後のwindow,Noneでも良い、
       src_x
       src_y
       src_width
       src_height
       dest_x
       dest_y
)

移動後のwindowがNoneの場合、dest_x,dest_yだけポインタ今の位置から移動させる。
移動後のwindowが設定されている場合、そのwindowの絶対座標にポインタを移動させる。
移動前のwindowが設定されている場合、そのwindow内にポインタが有る場合のみポインタを移動させる。またsrc_x,src_y,src_width,src_heightは移動前のwindow内を四角形を表しており、この値が設定されている場合はこの四角形にポインタが入っている場合にポインタを移動させる。src_x,src_yはwindwo内における左上の座標、src_width,src_heightは四角系の幅、高さ。






xも
使ってみると
便利かも

2010年1月25日月曜日

痛恨の一メモ

どうも、PCがLinuxじゃなくてUtuxになりそうなQです、こんちには。

会心の一メモ、必殺の一メモときたら、やはり痛恨の一メモも必要ですよね?いや、まったくもってどうでもいいことなんですが。

1.XSetLineAttributesの引数について
Xを使うとどうしても英語の文献に頼らざるを得ない部分が出てきます。まあ少なくとも読むことはそれほど苦痛ではなくなってきているけど。で、この関数ですがX上でwindow内に描く線の属性を設定する関数。

XSetLineAttributes(d,gc,
          線の太さ、
          線の種類(LineSolidとか)、
          線の端点の形状、
          線の交わり方の形状)

ってことらしい。
端点の形状はCapButtが四角形、CapRoundが丸ということになる。CapProjectingというのもあるが、これは「端点からさらに線の太さ半分だけ伸ばした四角形」になる。見た目はCapButtと同じ。
交わり方の形状が、JoinMiterが多分一番直感的な交わり方。「二つの線の外側のエッジの位置が一致するまで、同じだけそれぞれの線を伸ばす」って感じ。JoinRoundは要するに交点を丸くする。説明では「半径=線の太さ半分の円弧で外側のエッジを接続する」。JoinBevelは三角形で面取り。個人的には一番説明が簡単(笑)。



2.XDrawArcの位置指定
引数で円(円弧、楕円、楕円の弧)を描く位置を指定するわけですが、この位置指定の引数は円の中心ではありません。この円を内接円とする四角形の左上の座標です。直感的に勘違いしやすいのだが、おそらく円のより一般的な形といえる楕円を描くことに主眼をおいた関数なんだろうと推測されます。



3.emacsで検索、置換
検索コマンド C-s 検索したいワード
当該のワードにカーソルが飛んだ後、もう一度Ctrl + sを押すと次のワードに行く。
置換には   M-x query-replace (Return) 置換前のワード (Return) 置換後のワード(Return)
当該のワードに飛ぶので置換する場合はy,しない場合はn。終了はq。



4.Roombaの電池について
Roombaの電池をいろいろ頑張っていたわけであるが、いまいちうまく行かない。というか充電して、一旦電池を外し、そしてもう一度付けるとRoombaが動く、という感じである。おそらく原因はRoombaが電池の容量や充電量を検出する機能を持っていることに起因しているのではななかろうかと思う。早い話、電池パックの中でファンを回しているので、そのファンの電流分をRoombaは充電したと思っているが実際はそんなことはないわけで、Roombaにしてみれば「この電池そろそろ寿命だよ?」という気分なのではなかろうか?
一旦電池を外せば、そのあたりのメモリーはリセットされるので「お、普通に電力あるじゃん」と思って動いてくれる、て感じではないかと。

ちなみに今積んでる電池は1年以上ほったらかしだった電池なので多分かなり死にかけ。まあ電池の特性にもよるのだろうが、1.2Vよりも少し低めの電圧で放電する、内部抵抗が大きく大電流を流すと電圧降下が大きい、という特性がある。というわけでこの電池が使いものにならなくなるまではとりあえず使ってみる。
(まあ結局Roombaの性質と合致しないバッテリーシステムなのでこの方法はダメかも・・・普通に放熱板の方が良い)





このブログ
書いてる内容
まとまらず

2010年1月20日水曜日

必殺の一メモ

どうも、最近gadget的な発見が多いQです、こんちには。

ここ最近の日記がメモばかりなのですが、実際イミフな恋愛論とか書いてるよりもはるかに有意義なことが多いのでメモッてます。

1.Roombaの充電池改造計画第二


以前やってみたRoombaバッテリーの改造第二です。電池は同じものを使いまわしで、以前よりも改善したことやちょっとしたtips。

ダイオード?見たいなものが中に入っており、熱の検出に使われている。ニッケル水素充電池の充電方式の一つとして熱を見ながらやる、というのは定石の一つらしいのだが、これが結構シビアらしい。要するに電池の温度をちゃんと測って無いとダメポってこと。
温度検出、とくに低温方向に誤差がでかいと過充電の原因になる。
…というわけで力技だが、固まる放熱用シリコーンなるもので直接電池に固定した。これで多分より高精度に熱検出できる、はず。

中に追加した基盤には、流入方向の電流を検出してファンを回す、という回路を組んである。で、ここでオペアンプの作動増幅を使ったのだがここではまった。
最初検出抵抗の両端をそのまま作動増幅してみたのだが、使ったオペアンプLM358は、入力の下限はGNDレベルまで許容するが、上限はVcc-1.5Vである。したがって誤動作してしまった・・・ちゃんとデータシート読めよ自分。

というわけで検出用の電圧を抵抗で分圧を試みたのだがここで抵抗の誤差にやられる。もともと数ミリボルトの電位差を検出するような回路なので、分圧用抵抗値の誤差でやられた。まあ抵抗値の大きい抵抗を付けたいところにつけることで簡単に回避できることではあるのだが。

で、今充電中。今度はバッテリーホルダがとろけないことを願う(笑)



2.Roombaのハッキングに際して
一部でRoombaがROIというインタフェースを持っていて、ここを介してRoombaを操作できることは周知の事実になっていますが、中古を買うときは注意。といっても注意しようがないのですが、2005年10月以前の製品は後からOSMO//hackerというものを買い、これでファームウェアをアップデートする必要があるようです。ばかばかしいので2005年10月以降の製品を買うようにした方が良いでしょう。
・・・つまり中古で買ったRoombaを調べてみたら2004年製だったので鬱、ということです。まあ一つ普通に使う為に買ったのでいいんですけどね。



3.XWindow
昔からXWindowシステムすげえと勝手に思っていたのだが、実は何ができるのか、どういうものなのか、とかをちゃんと調べたりプログラム書いてみたりしたことが無い。
表面的な理解は、操作を受け持つClientとそれに応じて表示・描画命令を出すServerモデルなのだが、こんな抽象的な理解では理解したとはいえないので、ちょっと少しずつ勉強してみている。

とりあえずすこし線とか書いてみたのだが、VC++と凄くインタフェースが似てると感じた(VC++がXWindowに似てるというほうが正しいか…)。とりあえず、分かったことを少しずつ書いていこうと思っている。

イベントの拾い方
XEvent e;//XEvent構造体を用意
XNextEvent(Display,&e);//発生したイベントの取り込み
e.type = ????//どんなイベントが発生したか?

とりあえずこんな感じ。





枯れてこそ
隙間産業
その出番