どうも、最近あまり体調が良くないQです、こんちには。
先週は咳&喉の痛みで、今日はなぜか頭痛がする。今はかなり落ち着いたけどまだ若干ふらふらする・・・。ここんとこ色々不調が多いので気を付けないとなぁ。差し当たり無茶してるつもりはないんだけど。
1.hacking roomba
9割がた読み終わった。まあ16章の一部と付録は正直どうでもいいor今更な内容だったのでもう読み終わったとしても問題ないかと。TOEIC400点に満たない僕でも普通に理解できたのでそれなりに平易な英語で書かれていると思う。簡単なレビュー、参考まで。
1章
この本の全体的な概要とRoombaの簡単な説明(本来の機能とか簡単な歴史とか)。この本読むような人はおそらく中古で安いのを探している∧Roombaの簡単な構造とかを知りたいだろうと思うので、ここだけでも読む価値があると思う。
2章
Roomba製造元のiRobotが公開したROI(Roomba Open Interface)の説明。要するにコネクタの各ピンの機能、通信プロトコル、及びRoombaの動作モードについて。マイコンとかでガシガシ遊んでいる人は1章、2章だけ読めば後は読む必要はないかもしれない。以降はこんなのを作ってみよう、使ってみよう系の話なので。
3章
Serial Tetherの製作。PCのRS232CとRoombaを接続する簡単な中継基盤を作る。2章が問題なく理解できる人は、著者が提供しているRoombaCommTestの部分以外は読む価値は無いと思う。逆に初心者の人は抵抗やLEDの簡単な使い方なんかを説明しているので、初めての半田付けくらいの気持ちで読むといいかも。
4章
Serial TetherのBluetooth版の製作。僕は実際これを作った。製作自体はむしろ3章より簡単。BlueSMiRFという装置の使い方が分かる。
5章
モーター部分の分解の様子と、Driveコマンド(実際に動かすコマンド)、およびそれ関連のjavaソースコードの説明。また、Roombaの移動指示をどう計算すればよいかも載っているが、一部間違っているので注意。本家サイトにエラッタ関連のコメントを確認。
6章
センサー部分の説明と使い方、それ関連のjavaソースコードの説明。ここではbumpturn(ぶつかったら方向を変えて進む)とか、角度や距離の検出法なんかも書いてある。
7章
Processingを使った、RoombaViewのプログラミング。平たく言えばRoombaを上から見てどのように動作するかのモーションシミュレータと、操作ボタンを組み合わせたようなプログラム。実際にはソースコードが著者サイトに落ちているので書く必要はない。
8章
同じくProcessingを使ってRoombaに歌わせるプログラミング。songコマンドとかplayコマンドの説明とか。パソコンのキーボードを鍵盤にみなして、Roombaに音を出させるprocessingプログラムが著者サイトにある。
9章
Roombaに絵を書かせるプログラミング。スピログラフがらみの話とかマジックをどうRoombaに取り付けるか、とか。なお後半はちょ、おま!!という展開になっている(笑)こういう行動力は素晴らしいと思う。
10章
Roombaをマウス代わりにしてみたりThereminもどきにしてみたり、目覚まし時計にしてみたり。いずれもprocessingが前提だが、versionが合ってなかったりlibraryが古かったりで本気でやろうと思うと結構面倒くさいと思う。一応Thereminは書いてみたが、むしろprocessingの方ではまった。
11章
RoombaにEthernetを乗せようと言う内容。色々書いてあるが、日本ではXPortが有るのでこっちが重要な内容かな…。XPortの使い方、javaでsocket開いて繋ぐ内容があるので読む価値はあるかも。ちなみに、ここではあくまでEthernet-RS232変換装置、という位置づけ。
12章
11章のwiportバージョン。wiportは素晴らしい製品だと思うが、残念ながら日本でwimicro(wiport+ベース基盤)を手に入れることは出来ない(電波法の関係)。もしwiportを使おうと思うと、自分でベースとなる基盤を作らなければいけない。
13章
RoombaにBasic Stamp、Arduinoを乗せて動かしてみようという話。Basic StampはともかくArduinoはブームなので、これで遊んでみたい人は読んでみると良いかもしれない。Arduinoに限って言うと、bumpturnとbumpturn+moodlight(怪しく光らせて走り回らせよう的な感じ)の作り方が載っている。
14章
15章とともに最も残念になってしまった章。Roombaにlinuxを乗せようという話なのだが、linuxを積んだwireless router等を使っている。これらが、まず販売終了しているのと中古も無い、海外からは変えない(同じく電波法)と言う三重苦。OpenWrtというrouter用linuxのディストリビューションや、それ関係の勉強の章になっちゃってる。非常に悔しいところ。
15章
おそらくこの本の最大の売り所だった章。Roombaにwireless router+webcamを乗せようという話。残念ながらrouterもwebcamも手に入らない。ちゃんと探していないのでもしかしたらどっかに有るかもしれないが…ただそれ関連の簡単な使い方に関する勉強にはなる。僕のようなヘッポコlinux userには以外とありがたい話。
16章+付録
他のなんか乗せてみたの事例紹介と、着せ替え?用のコスチュームの話、と実際にちょっとだけハードに手を加えるような話。付録は、半田付けについて、電気回路について、及びROIの仕様書。まあさすがにこれはいいやって感じなのでちゃんと読んでません。
てな感じ。全体として、「Roombaはファンタスティックで凄いんだ、でもこの部分が…」「Roombaでこんなことできたら楽しいと思わないかい?」的な文体です。ジョークも織り交ぜられており、親しみの持てる内容じゃないかと思います。もし邦訳するなら14章までが価値のあるところかな。邦訳するよりも、この本をベースにして日本で手に入る部品や装置を元にもう少し今風に書き直すってのが良いかも。
2.N330、D410、D510の消費電力、参考まで
D410(SSD:8GB,memory:2GB×1)
起動していない状態 1.5W位
bios画面 18W位
LiveCD(ubuntu),idle 20.5W位
D410(HDD:320GB(7200rpm),memory:2GB×1)
installed centos,idle 23W位
D510(SSD:8GB,memory:2GB×1)
起動していない状態 1.5W位
bios画面 17W位
LiveCD(ubuntu),idle 20.5W位
installed ubuntu,idle 19.0W位
N330(HDD:320GB(7200rpm),memory:2GB×1)
installed centos,idle 32W位
↑結構適当なので注意。あくまで参考。
意外なのがidleだとD510の方がD410よりも消費電力が少ないこと。まじで?つまりD410意味無いじゃん!!というかD410の消費電力に関するレビューが全く見つからないのはどういうこと?まあD410+1000円でD510買えるならD510買うわな、そりゃ。
Atom N世代からD世代で約20%程度の消費電力削減らしいのでまあ妥当なところなんじゃないかと思っている。
今までN330をサーバーに使っていたが、D410のあてが全くなくなってしまったのでそのまま植え替えた(笑)まあどうせ大した負荷は掛からないのと超静かなのが素晴らしい。逆にN330どうすんねんという(笑)しかしD510スゲェな…。てかスペック的に微妙なPCばっかり持ってる漏れ…。
3.D510+SSD+ubuntu9.04について
なんかたまに起動失敗するので、biosでpre-delayという項目を0⇒5にしたら直った。まあ遅いSSD使ってるのでなんとなくその辺の原因かなと思っている。しかし、それでも起動超速い(笑)ヤバイ、SSDはまりそう。
この辺の作業でこのブログが今ままで初めて役に立った(笑)メモは重要じゃよ。
吹雪から
花吹雪なる
想いかな
2010年3月5日金曜日
電メモ工学第一
どうも、だんだん日記のタイトルがめちゃくちゃになってきたQです、こんちには。
人生は色々あるものです。それは必ずしも良いことではないものです。つまり、プログラムがメンドクサイのである。何がメンドクサイって例のprocessing。言語自体が鋭意開発中?かつ、ライブラリ類もまあちょっと時間が経てばすぐbackward compatibilityが失われていたりするわけです。
知る人ぞ知るあれの中で、roombaを動かす為のプログラムがprocessingで書かれているのだがこれがちょっと古くて今のprocessingやライブラリに合って無いんだよな…。いくつかのプログラムを検索してみたら見つからないのもまあ頷ける。
1.RoombaThereminToo
とりあえずまねして作ってみたが、全く駄目駄目だったので、現在のライブラリの仕様にあわせて書き直してみた。
import krister.Ess.*;
import roombacomm.*;
String roombacommPort = "COMxx";
RoombaCommSerial roombacomm;
AudioChannel mySoundA;
SineWave myWave;
RateShift myRateShift;
int pshift;
void roombacommPortSelected()
{
roombacomm = new RoombaCommSerial();
if( roombacommPort.equals("testdummy") ) return;
println("opening roomba serial port '" +roombacommPort+"'");
if( ! roombacomm.connect( roombacommPort ) ) {
println("oh noes");
}
println("Roomba startup");
roombacomm.startup();
roombacomm.control();
roombacomm.full();
roombacomm.pause(50);
println("Playing some notes");
roombacomm.playNote( 72, 8 );
roombacomm.pause( 200 );
roombacomm.playNote( 72, 10 );
roombacomm.pause( 200 );
}
void roombacommSetup()
{
if( roombacommPort != null ) {
roombacommPortSelected();
return;
}
RoombaComm rc = new RoombaCommSerial();
final String portlist[] = rc.listPorts();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
String port = (String) javax.swing.JOptionPane.showInputDialog( null,
"Select Roomba Port",
"RoombaThereminToo",
javax.swing.JOptionPane.QUESTION_MESSAGE,
null, portlist, null);
if( port == null ) {
javax.swing.JOptionPane.showMessageDialog(null, "No port chosen, goodbye");
System.exit(1);
}
roombacommPort = port;
roombacommPortSelected();
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
void setup() {
roombacommSetup();
Ess.start(this);
mySoundA = new AudioChannel();
mySoundA.initChannel(mySoundA.frames(250));
myWave = new SineWave(960,.75);
myWave.generate(mySoundA,0,mySoundA.frames(250));
myRateShift = new RateShift(0);
pshift = 0;
println("start");
}
void parseRoombaSensors(){
if(!roombacomm.cliffLeft()){
pshift++;
}
if(!roombacomm.cliffFrontLeft()){
pshift++;
}
if(!roombacomm.cliffRight()){
pshift--;
}
if(!roombacomm.cliffFrontRight()){
pshift--;
}
if(!roombacomm.wheelDropLeft()){
pshift++;
}
if(!roombacomm.wheelDropRight()){
pshift--;
}
if(!roombacomm.wheelDropLeft() && !roombacomm.wheelDropRight()){
pshift = 0;
mySoundA.stop();
myWave.generate(mySoundA,0,mySoundA.frames(250));
}else if(roombacomm.bump() && mySoundA.state == Ess.STOPPED){
mySoundA.play(Ess.FOREVER);
}
}
void audioChannelLoop(AudioChannel ch){
if(pshift != 0){
myRateShift.percent = Ess.calcShift(0.03*pshift);
myRateShift.filter(mySoundA);
pshift = 0;
}
}
void draw() {
roombacomm.sensors();
parseRoombaSensors();
}
はっきりいって、まともに音出ません。なんか知らんけど最初のうちは動くけど、途中からザーザー言い出すし。で、そもそもrate変更とかする必要ないんじゃね?と思って次のように変えてみた。
2.RoombaThereminToo2
変更点
void setup() {
roombacommSetup();
Ess.start(this);
mySoundA = new AudioChannel();
mySoundA.initChannel(mySoundA.frames(100));
myWave = new SineWave(960,.75);
myWave.generate(mySoundA,0,mySoundA.frames(100));
pshift = 0;
println("start");
}
void audioChannelLoop(AudioChannel ch){
if(pshift != 0){
myWave.frequency += 2*pshift;
myWave.generate(mySoundA);
pshift = 0;
}
}
かなりましになったけど、まだグリッチが入る。おそらく位相が合わないせいとかマシンパワーのせいとかだと思うけど、本質的にprocessingもEssも理解して無いので絶対どっかにバグはある。まあ、そもそもこれを勉強する気は今のところ全く無いのでこんなものでいいや。
//確かに楽な言語ではある。クリティカルな用途じゃなければまあ意外と使い勝手はいいのかも。
3.%gの注意点
printf("%g",i);
とするときに%gにiが代入されるが、iが整数型だとおかしくなる。doubleを使うか、明示的にキャストをする必要がある。
プログラムを書けるようになる、という経過を辿る時、サンプルソースを見るというのは避けられないことだと思う。しかし、サンプルソースはベストなケースで「それを書いた人の環境と時期でしか動くことは保証されていない」と考えるべきだということが良く分かった。ひどい場合はバグだらけなんてこともままある。只おかげで勉強になったりすることもあるんだけど…
あんまり人のソース読んでどうこうっていう経験がないからなぁ…今更なんだよな。
面倒に
感謝されない
理解あり
人生は色々あるものです。それは必ずしも良いことではないものです。つまり、プログラムがメンドクサイのである。何がメンドクサイって例のprocessing。言語自体が鋭意開発中?かつ、ライブラリ類もまあちょっと時間が経てばすぐbackward compatibilityが失われていたりするわけです。
知る人ぞ知るあれの中で、roombaを動かす為のプログラムがprocessingで書かれているのだがこれがちょっと古くて今のprocessingやライブラリに合って無いんだよな…。いくつかのプログラムを検索してみたら見つからないのもまあ頷ける。
1.RoombaThereminToo
とりあえずまねして作ってみたが、全く駄目駄目だったので、現在のライブラリの仕様にあわせて書き直してみた。
import krister.Ess.*;
import roombacomm.*;
String roombacommPort = "COMxx";
RoombaCommSerial roombacomm;
AudioChannel mySoundA;
SineWave myWave;
RateShift myRateShift;
int pshift;
void roombacommPortSelected()
{
roombacomm = new RoombaCommSerial();
if( roombacommPort.equals("testdummy") ) return;
println("opening roomba serial port '" +roombacommPort+"'");
if( ! roombacomm.connect( roombacommPort ) ) {
println("oh noes");
}
println("Roomba startup");
roombacomm.startup();
roombacomm.control();
roombacomm.full();
roombacomm.pause(50);
println("Playing some notes");
roombacomm.playNote( 72, 8 );
roombacomm.pause( 200 );
roombacomm.playNote( 72, 10 );
roombacomm.pause( 200 );
}
void roombacommSetup()
{
if( roombacommPort != null ) {
roombacommPortSelected();
return;
}
RoombaComm rc = new RoombaCommSerial();
final String portlist[] = rc.listPorts();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
String port = (String) javax.swing.JOptionPane.showInputDialog( null,
"Select Roomba Port",
"RoombaThereminToo",
javax.swing.JOptionPane.QUESTION_MESSAGE,
null, portlist, null);
if( port == null ) {
javax.swing.JOptionPane.showMessageDialog(null, "No port chosen, goodbye");
System.exit(1);
}
roombacommPort = port;
roombacommPortSelected();
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
void setup() {
roombacommSetup();
Ess.start(this);
mySoundA = new AudioChannel();
mySoundA.initChannel(mySoundA.frames(250));
myWave = new SineWave(960,.75);
myWave.generate(mySoundA,0,mySoundA.frames(250));
myRateShift = new RateShift(0);
pshift = 0;
println("start");
}
void parseRoombaSensors(){
if(!roombacomm.cliffLeft()){
pshift++;
}
if(!roombacomm.cliffFrontLeft()){
pshift++;
}
if(!roombacomm.cliffRight()){
pshift--;
}
if(!roombacomm.cliffFrontRight()){
pshift--;
}
if(!roombacomm.wheelDropLeft()){
pshift++;
}
if(!roombacomm.wheelDropRight()){
pshift--;
}
if(!roombacomm.wheelDropLeft() && !roombacomm.wheelDropRight()){
pshift = 0;
mySoundA.stop();
myWave.generate(mySoundA,0,mySoundA.frames(250));
}else if(roombacomm.bump() && mySoundA.state == Ess.STOPPED){
mySoundA.play(Ess.FOREVER);
}
}
void audioChannelLoop(AudioChannel ch){
if(pshift != 0){
myRateShift.percent = Ess.calcShift(0.03*pshift);
myRateShift.filter(mySoundA);
pshift = 0;
}
}
void draw() {
roombacomm.sensors();
parseRoombaSensors();
}
はっきりいって、まともに音出ません。なんか知らんけど最初のうちは動くけど、途中からザーザー言い出すし。で、そもそもrate変更とかする必要ないんじゃね?と思って次のように変えてみた。
2.RoombaThereminToo2
変更点
void setup() {
roombacommSetup();
Ess.start(this);
mySoundA = new AudioChannel();
mySoundA.initChannel(mySoundA.frames(100));
myWave = new SineWave(960,.75);
myWave.generate(mySoundA,0,mySoundA.frames(100));
pshift = 0;
println("start");
}
void audioChannelLoop(AudioChannel ch){
if(pshift != 0){
myWave.frequency += 2*pshift;
myWave.generate(mySoundA);
pshift = 0;
}
}
かなりましになったけど、まだグリッチが入る。おそらく位相が合わないせいとかマシンパワーのせいとかだと思うけど、本質的にprocessingもEssも理解して無いので絶対どっかにバグはある。まあ、そもそもこれを勉強する気は今のところ全く無いのでこんなものでいいや。
//確かに楽な言語ではある。クリティカルな用途じゃなければまあ意外と使い勝手はいいのかも。
3.%gの注意点
printf("%g",i);
とするときに%gにiが代入されるが、iが整数型だとおかしくなる。doubleを使うか、明示的にキャストをする必要がある。
プログラムを書けるようになる、という経過を辿る時、サンプルソースを見るというのは避けられないことだと思う。しかし、サンプルソースはベストなケースで「それを書いた人の環境と時期でしか動くことは保証されていない」と考えるべきだということが良く分かった。ひどい場合はバグだらけなんてこともままある。只おかげで勉強になったりすることもあるんだけど…
あんまり人のソース読んでどうこうっていう経験がないからなぁ…今更なんだよな。
面倒に
感謝されない
理解あり
2010年2月14日日曜日
解析メモ学第一
どうも、家に転がってるものがスペース的な意味で極めてやばくなってきたこと山の如しのQです、こんちには。
この土日はroombaハッキングにいそしんでいたのですが、悲惨な感じ。メモるほどのことではないかもしれないが、例のRoomba hackingではProcessingという言語(ていうかJavaの開発環境?)を使います。それはいいのですが、ちょっと気になるバグ。
roombaの状態を追うことが出来るサンプルプログラムがあるのですが、そこでスライドバーが使われています。が、スライドバーのゲージは表示されるのですがツマミが表示されません。しかしマウスでカチコチすると値はちゃんと変わっていて、どうもGUIあたりにバグがあるみたいです。
Processingのホームページでバグに関する情報があり、「最新(1.09)のバージョンは一部のGUIが、特定の状況下でおかしくなるバグがある」とのこと。マジで!?しかも使われてるMyGUIていうlibraryも2006年からupdateされておらず、processingも古いバージョンは配布しないとのこと。
マジプギャー。
そうだよな、普通に動くことが確認されているサンプルでも上記のバグが発生したからなぁ…。Processingの古いバージョンを探すか、まあ操作上問題があるわけではないので無視してもまあ良いのか。なんかjavaのバージョンと相性問題があったりするらしく、ちょっとメンドクサイ。
Processingの使えるようになることは全く目的ではないのでとりあえずスルー。どうしようも無くなったら手段を考えるか。
悲惨だが
ソースを追うのも
作業です
この土日はroombaハッキングにいそしんでいたのですが、悲惨な感じ。メモるほどのことではないかもしれないが、例のRoomba hackingではProcessingという言語(ていうかJavaの開発環境?)を使います。それはいいのですが、ちょっと気になるバグ。
roombaの状態を追うことが出来るサンプルプログラムがあるのですが、そこでスライドバーが使われています。が、スライドバーのゲージは表示されるのですがツマミが表示されません。しかしマウスでカチコチすると値はちゃんと変わっていて、どうもGUIあたりにバグがあるみたいです。
Processingのホームページでバグに関する情報があり、「最新(1.09)のバージョンは一部のGUIが、特定の状況下でおかしくなるバグがある」とのこと。マジで!?しかも使われてるMyGUIていうlibraryも2006年からupdateされておらず、processingも古いバージョンは配布しないとのこと。
マジプギャー。
そうだよな、普通に動くことが確認されているサンプルでも上記のバグが発生したからなぁ…。Processingの古いバージョンを探すか、まあ操作上問題があるわけではないので無視してもまあ良いのか。なんかjavaのバージョンと相性問題があったりするらしく、ちょっとメンドクサイ。
Processingの使えるようになることは全く目的ではないのでとりあえずスルー。どうしようも無くなったら手段を考えるか。
悲惨だが
ソースを追うのも
作業です
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が使えなかった。鬱。
なんてこと
これじゃあ只の
掃除機じゃん
すいませんが先輩、あんまり幸せそうじゃないっす(笑)
さてさて、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月2日火曜日
というわけでメモ
どうも、いつも題名のネタ考えて若干時間浪費気味のQです、こんちには。
というわけでたまにはひねりの無い題名。
Roombaを制御するためのプログラムを落とすことが出来る。
http://hackingroomba.com
Javaで書いてあるようなので動作するOSは選ばないようだが、ダウンロードして動かそうとしても動かない。てかREADMEをちゃんと読まない自分が悪いんだが。
Windows用のREADMEが用意されていて、それによると
rxtxSerial.dll
なるファイルを「コマンドプロンプトでjava -versionのコマンドを入力したとき、応答するJavaに相当するjava.exeが置いてあるフォルダ」に置け、とある。updateしたり、複数のversionのJavaを入れているとどうもここではまるようで、自分はupdateされていたので若干はまった。
ちなみに本当にどのversionのjavaに相当するかを確認するには、コマンドプロンプトで明示的にパスを入れて逐一確認しろ、とある。
で、このREADMEファイルにはrunit COMxのコマンドで簡単なテストが出来るてきなことが書いてあるのだが何だかよく分からんし、しかも動かん。意味が分からんのでとりあえず、makedocとかbuild-jarとかbuild-processing-libraryとかとりあえず起動して、RoombaCommTestを動かしたら動いた。これで普通に実験できたので、よく分からんがOKぽい。
ラジコンもどきの動きをしてくれてます。まだ有線ですが(笑)
ちなみにbuild-jarとかbuild-processing-libraryとかいうのは本来は、プログラム内部のソースコードに手を加えた場合に起動するものらしい。
しかし、RoombaCommTestを動かすと先のdllのversionが合わんとか文句つけてくる。同じパッケージに入ってるのに(笑)まあ作者も、若干適当に作っちゃった、みたいな事書いてるからしょうがない。
どういうコマンドを送れば良いかは分かったので、とりあえず最低限のロボットフレームワークは手に入れたと言って良さそうだ。xにしろRoombaにしろ基本的に英語の文献が頼りなので、TOEICの点数が駄目な意味で半端じゃない僕にとってはかなり辛い…まあ、この辺は修行だと思って我慢。
あとCNCのコントロールプログラムのライセンス買った。これで無限行まで実行できるぜ。
また一つ
今また一つ
雪の如くに
というわけでたまにはひねりの無い題名。
Roombaを制御するためのプログラムを落とすことが出来る。
http://hackingroomba.com
Javaで書いてあるようなので動作するOSは選ばないようだが、ダウンロードして動かそうとしても動かない。てかREADMEをちゃんと読まない自分が悪いんだが。
Windows用のREADMEが用意されていて、それによると
rxtxSerial.dll
なるファイルを「コマンドプロンプトでjava -versionのコマンドを入力したとき、応答するJavaに相当するjava.exeが置いてあるフォルダ」に置け、とある。updateしたり、複数のversionのJavaを入れているとどうもここではまるようで、自分はupdateされていたので若干はまった。
ちなみに本当にどのversionのjavaに相当するかを確認するには、コマンドプロンプトで明示的にパスを入れて逐一確認しろ、とある。
で、このREADMEファイルにはrunit COMxのコマンドで簡単なテストが出来るてきなことが書いてあるのだが何だかよく分からんし、しかも動かん。意味が分からんのでとりあえず、makedocとかbuild-jarとかbuild-processing-libraryとかとりあえず起動して、RoombaCommTestを動かしたら動いた。これで普通に実験できたので、よく分からんがOKぽい。
ラジコンもどきの動きをしてくれてます。まだ有線ですが(笑)
ちなみにbuild-jarとかbuild-processing-libraryとかいうのは本来は、プログラム内部のソースコードに手を加えた場合に起動するものらしい。
しかし、RoombaCommTestを動かすと先のdllのversionが合わんとか文句つけてくる。同じパッケージに入ってるのに(笑)まあ作者も、若干適当に作っちゃった、みたいな事書いてるからしょうがない。
どういうコマンドを送れば良いかは分かったので、とりあえず最低限のロボットフレームワークは手に入れたと言って良さそうだ。xにしろRoombaにしろ基本的に英語の文献が頼りなので、TOEICの点数が駄目な意味で半端じゃない僕にとってはかなり辛い…まあ、この辺は修行だと思って我慢。
あとCNCのコントロールプログラムのライセンス買った。これで無限行まで実行できるぜ。
また一つ
今また一つ
雪の如くに
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の性質と合致しないバッテリーシステムなのでこの方法はダメかも・・・普通に放熱板の方が良い)
このブログ
書いてる内容
まとまらず
会心の一メモ、必殺の一メモときたら、やはり痛恨の一メモも必要ですよね?いや、まったくもってどうでもいいことなんですが。
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 = ????//どんなイベントが発生したか?
とりあえずこんな感じ。
枯れてこそ
隙間産業
その出番
ここ最近の日記がメモばかりなのですが、実際イミフな恋愛論とか書いてるよりもはるかに有意義なことが多いのでメモッてます。
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 = ????//どんなイベントが発生したか?
とりあえずこんな感じ。
枯れてこそ
隙間産業
その出番
2009年12月14日月曜日
とりあえずメモ的な
どうも、roombaタソが居れば嫁は不要論提唱者のQです、こんちには。
またしてもroomba買っちまいました。てか60ドルでこの円高なら買うよね普通。
ところで・・・
①roombaの電池について。
実はこの買ったroombaは中古で電池が死んでいた。というわけでばらして適当な充電池を放り込んでみたのである。


実は500番台は知らないが、それより前の世代のroombaの充電システムはどうも難があるらしい。なんでも充電中に爆熱になるとのこと。というわけでファンとか取り付けてみたのである。
んで、とりあえず使ってみた&充電してみた。
しばらくして・・・なんか臭い。
やばい。とりあえず外してみたら、電池がアッチイ上に若干電池ボックスがとろけている!!オイオイ…
というわけでもう少し改善の余地が有りそうだ。
とりあえず分かったのは
・充電池は直列充電はあまりよくない。というのは電池ごとに自然放電特性が異なるので、早く放電してしまうような変なのが一本混じっていると、電圧が上がらず充電しまくるようになりほかの正常な電池まで巻き添えを食らう。パックされている電池は、特性が揃っている、これが非常に重要。
普通の充電池は一本ずつ充電できるような奴の方が良いです。
・充電中だけじゃなくて、充電終了後もなんかアッチイ。やっぱりこのroombaの充電器ちょっとおかしいかも。実際臭くなってきたのは充電終了後だし…てことはより少ない充電電流でもファンを回すような方法が必要かも。
・roomba dirtの充電器は出力電流が小さい。したがってこれで充電すると電池がそこまで熱くはならない。しかし、充電器の方が耐えられるかどうか…
とりあえず改良が必要だ。
②linuxの自動起動プログラム
/etc/profile.d/*.sh
ログイン時に*.shに書いたシェルスクリプトが実行される。
/etc/rc.local
PC起動時にスクリプトが実行される。
両者の挙動は少し違う。IPアドレスを設定するようなスクリプトを書くと、上の方法ではログインしないと設定されないが、下のは起動するだけで設定される。
さらに
~/.bashrc
にスクリプトを書いた場合、ターミナル(シェル)を起動するたびに実行される。et/profile.d/*.shと似て非なるものである。
まあ、gnome使ってたら普通に自動起動するアプリをデスクトップ上で設定できるけど…
メモなんて
書いても結局
見ないかも
またしてもroomba買っちまいました。てか60ドルでこの円高なら買うよね普通。
ところで・・・
①roombaの電池について。
実はこの買ったroombaは中古で電池が死んでいた。というわけでばらして適当な充電池を放り込んでみたのである。
実は500番台は知らないが、それより前の世代のroombaの充電システムはどうも難があるらしい。なんでも充電中に爆熱になるとのこと。というわけでファンとか取り付けてみたのである。
んで、とりあえず使ってみた&充電してみた。
しばらくして・・・なんか臭い。
やばい。とりあえず外してみたら、電池がアッチイ上に若干電池ボックスがとろけている!!オイオイ…
というわけでもう少し改善の余地が有りそうだ。
とりあえず分かったのは
・充電池は直列充電はあまりよくない。というのは電池ごとに自然放電特性が異なるので、早く放電してしまうような変なのが一本混じっていると、電圧が上がらず充電しまくるようになりほかの正常な電池まで巻き添えを食らう。パックされている電池は、特性が揃っている、これが非常に重要。
普通の充電池は一本ずつ充電できるような奴の方が良いです。
・充電中だけじゃなくて、充電終了後もなんかアッチイ。やっぱりこのroombaの充電器ちょっとおかしいかも。実際臭くなってきたのは充電終了後だし…てことはより少ない充電電流でもファンを回すような方法が必要かも。
・roomba dirtの充電器は出力電流が小さい。したがってこれで充電すると電池がそこまで熱くはならない。しかし、充電器の方が耐えられるかどうか…
とりあえず改良が必要だ。
②linuxの自動起動プログラム
/etc/profile.d/*.sh
ログイン時に*.shに書いたシェルスクリプトが実行される。
/etc/rc.local
PC起動時にスクリプトが実行される。
両者の挙動は少し違う。IPアドレスを設定するようなスクリプトを書くと、上の方法ではログインしないと設定されないが、下のは起動するだけで設定される。
さらに
~/.bashrc
にスクリプトを書いた場合、ターミナル(シェル)を起動するたびに実行される。et/profile.d/*.shと似て非なるものである。
まあ、gnome使ってたら普通に自動起動するアプリをデスクトップ上で設定できるけど…
メモなんて
書いても結局
見ないかも
2009年12月7日月曜日
メモ代わり的な
どうも、鬱が直らない原因は鬱なせいではないか、等と考えつつもまあとりあえずちょこちょこ記録しておきたいQです、こんちには。
いやしかし、油断するとすぐに更新が滞る。別に誰が見てるわけでも無いだろうが(笑)
とりあえずメモ。
①CNC買った
とりあえずCNC買った。オリジナルマインド製、BLACKです。
前から欲しかったのだが遂に買ってしまった…。
別に精密加工したいわけではなく、どちらかというと手がもう一本欲しい、という発想ですね。

んで、製作時にちょっと厄介だったこと。
スライドガイドの平行をうまいこと出せないと動きが渋くなって脱調の原因になったりする。
というわけで頑張るわけだがこれが中々大変。そこで、
ネジ締めは対角線の順にちょっとずつ行う(1⇒2⇒3⇒4⇒1⇒…)
ねじを締める側にテーブルを寄せる(1,3のネジを締めるときは図の状態になる。2、4のときは反対側)
んでこれを繰り返すと結構簡単にスイスイ動くようになる。
3軸とも基本的に同じ方法でOK。うまくいかない人、お試しあれ。
②Ctrl+Cが効かない
ubuntuで仮想環境にSSHで繋いでいるのだが、時々Ctrl+Cが効かなくなる謎の現象?
これではemacsを使うときに支障を生じるので、こういうコマンドを叩いて再起動すると直った。
sudo stty intr "^c"
なんでこの現象がおきるんだろう?
③キーボードレイアウト変更
Debianでキーボード配列を変更するとき
/usr/share/keymaps/i386/qwerty/
から所望のレイアウトデータを選び
/etc/console/boottime.kmap.gz
と名前を指定してコピー、再起動
④Roombaの欠陥
どうも電池が一年くらいしか持たないらしい。
充電時、実はバッテリーは超熱くなっててこれで寿命が来てしまうらしい。
穴開け、フィンorファン取り付けによる放熱処理が必要かもしれないなぁ…
あと、バッテリーはリチウムイオンじゃないのでおそらくメモリー効果が起きる。
てことは放電とか多分本当はやらなければいけないはず。
しかし、500番以降は電池の取出しが容易じゃないんだが…どうしろと?
えーバッテリーはいいんだけど、本体に改造はやだなぁ…
とりあえず、生きてますですはい。
CNCが手に入ったので、作業効率は上がると思われ。
いやはや。なんとも、フライス、旋盤でゴリゴリするのも時代遅れなのかもしれないなぁ…
一通り
揃った工具
何ゆえに
いやしかし、油断するとすぐに更新が滞る。別に誰が見てるわけでも無いだろうが(笑)
とりあえずメモ。
①CNC買った
とりあえずCNC買った。オリジナルマインド製、BLACKです。
前から欲しかったのだが遂に買ってしまった…。
別に精密加工したいわけではなく、どちらかというと手がもう一本欲しい、という発想ですね。
んで、製作時にちょっと厄介だったこと。
スライドガイドの平行をうまいこと出せないと動きが渋くなって脱調の原因になったりする。
というわけで頑張るわけだがこれが中々大変。そこで、
ネジ締めは対角線の順にちょっとずつ行う(1⇒2⇒3⇒4⇒1⇒…)
ねじを締める側にテーブルを寄せる(1,3のネジを締めるときは図の状態になる。2、4のときは反対側)
んでこれを繰り返すと結構簡単にスイスイ動くようになる。
3軸とも基本的に同じ方法でOK。うまくいかない人、お試しあれ。
②Ctrl+Cが効かない
ubuntuで仮想環境にSSHで繋いでいるのだが、時々Ctrl+Cが効かなくなる謎の現象?
これではemacsを使うときに支障を生じるので、こういうコマンドを叩いて再起動すると直った。
sudo stty intr "^c"
なんでこの現象がおきるんだろう?
③キーボードレイアウト変更
Debianでキーボード配列を変更するとき
/usr/share/keymaps/i386/qwerty/
から所望のレイアウトデータを選び
/etc/console/boottime.kmap.gz
と名前を指定してコピー、再起動
④Roombaの欠陥
どうも電池が一年くらいしか持たないらしい。
充電時、実はバッテリーは超熱くなっててこれで寿命が来てしまうらしい。
穴開け、フィンorファン取り付けによる放熱処理が必要かもしれないなぁ…
あと、バッテリーはリチウムイオンじゃないのでおそらくメモリー効果が起きる。
てことは放電とか多分本当はやらなければいけないはず。
しかし、500番以降は電池の取出しが容易じゃないんだが…どうしろと?
えーバッテリーはいいんだけど、本体に改造はやだなぁ…
とりあえず、生きてますですはい。
CNCが手に入ったので、作業効率は上がると思われ。
いやはや。なんとも、フライス、旋盤でゴリゴリするのも時代遅れなのかもしれないなぁ…
一通り
揃った工具
何ゆえに
登録:
投稿 (Atom)