磁気センサーの改良

C言語の整数
AVRを使った磁気センサーのプログラムをいろいろと改良していたのだが、ときどき変な挙動をする。この原因を調べていたが、いくつか原因があったが、絶対値を計算するときにうまくいっていなかったのが、一番大きな原因だった。例えば、絶対値を求めるには次のような関数を書いたとする。

char abs(char v){
  if(v<0){v=-v;}
  return v;
}

しばらく機械語から遠ざかっていたので、気がつくのが遅れたが、これではうまくいかない場合がある。charでは、-128から127までの整数を表現することができる。そして、マイナスをつけるときには、0x100-vという計算がされる。-128は0b10000000と表現されるが、これにマイナスをつけると、0b10000000となり、128ではなく-128となってしまう。つまり、-128以外はうまく働くが、-128だけはダメなのだ。まあ、少しずつCを思い出していこう。

Read more...

液晶の活用

ワンチップ磁気センサー この間、デジットで買ったOPTREXのPWB842Bという液晶をようやく動かすことができた。いろいろとバグがあって発見に手間取ってしまった。まずwaitをかなり入れないとuPD7225がうまく応答しない。ICの説明書は一応読んだが、数マイクロ秒待てば良いような感じだったと思うが、100マイクロ秒ぐらいのwaitをいろいろなところに入れた。次に発見に手間取ったのが、i++のようなつもりで、i>>1としていたが、当然のことながらi>>=1としなければいけなかった。 さて、この液晶を何に使うかを考えていたのだが、磁気センサーを作ることにした。ホール素子の電圧をattiny261のADコンバーターを使って読んで、さらに液晶と通信して表示すれば、ワンチップの磁気センサーができあがるはずである。というわけで、プログラムを書いてみた。そのままだと精度が出ないようだったので、256回測定してその平均を取ったが、数値が安定して良い感じになった。磁場の絶対値に関しては、換算がまだ間違っているかも知れないが、1-1000ガウスぐらいは測定できるようになった。100以上では増幅をしないようにプログラムすれば、3Tぐらいまでは測れるようになつはずだろうが、面倒なので組み込んでいない。本当は、超伝導磁石の漏れ磁場を測定したかったのだが、どうやら感度の問題で難しいようだ。 #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000 /* 1MHz */ #include <util/delay.h> #include <avr/pgmspace.h> /* lcd controller for OPTREX PWB842B */ /* 7seg 10digit */ // pin connection // 1 /RESET // 2 /SCK // 3 SI // 4 /BUSY // 5 C,/D // 6 /CS // 7 Vdd 5V // 8 Vss GND #define LCD_PORT PORTB #define LCD_PIN PINB #define LCD_DDR DDRB #define LCD_RESET 6 #define LCD_SCK 5 #define LCD_SI 4 #define LCD_BUSY 3 #define LCD_CD 2 #define LCD_CS 1 #define setbit(PORT,BIT) PORT|=_BV(BIT) #define clearbit(PORT,BIT) PORT&=~_BV(BIT) #define checkbit(PORT,BIT) (PORT&_BV(BIT)) #define SIZE_BUF 10 #define SIZE_CHAR 10 volatile uint8_t buf[SIZE_BUF]; // data to send LCD static volatile uint8_t chars[SIZE_CHAR]; // charactor data static volatile int32_t ave=0; static volatile uint16_t cnt=0; #define SIZE_AVE 256 #define ZERO_ADJ 6 const prog_uint8_t number[0x40]={ // 76543210 0b000000000, // 0x20 0b0, //!
Read more...

linux死亡

計測用のPCの不調
Linuxのwineをいじっていて、なんだか挙動がおかしい。初めはwineとの相性の問題かと思っていたが、ファイルシステムが変な気がしたので、再起動した。すると、起動できない。grubとかは動いているのだが、fsckが起動して、途中で沢山エラーが出る。おそらく、HDDの一部がクラッシュしたらしい。まだ、多少は必要なデータが入っているので、後でknoppixでCDROMブートして、取り出せるか試してみよう。 これまでに、Linuxで不調になったことがあるが、その大部分がHDDの不調によるものだった気がする。HDDが壊れたのでは仕方がない。

Read more...

plot for python

matplotlib
rubyでグラフを書けないかと思っていた。そのために、rsrubyをつかったり、tkのcanvasを使って簡易のグラフを書くツールをつくったこともある。一方、pythonにはグラフを書くツールがあるようだ。matplotlibというものだ。debianでは、python-matplotlibをaptで入れればインストールは終了する。使い方は、いろいろとあって覚えるのは難しそうだ。例えば、こんな感じで使うらしい。

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,1,0.01)
y=np.exp(x)
plt.plot(x,y+0,'r-',label='first')
plt.plot(x,y+1,'b:',label='second')
plt.plot(x,y+2,'g--',label='third')
plt.grid(True)
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

細かいグラフの調節の仕方を覚えないといけないが、python上から簡単にグラフを扱えるのは便利かも知れない。

Read more...

昔はできたのだが

Windows NTのIOポート
WindowsのIOポートをたたく必要が出てきそうになったので、調べてみた。よく知られているように、NT系ではIOポートを直接操作することはできない。 昔はDriverLINXのdiportio.dllを使うと、NTからIOを扱うことができた。しかし、今ではリンクが切れている。いろいろと探してみると、Software Informerというところには、あるようだが、それを作っていたScientific Software Tools, Inc.のサイトからはdownloadできない。これはまだ使えるのかな。 ほかには、WinIo.dllというものを使っている人もいるようだ。しかし、それを使うためのbinderを書くのも面倒だな。このくらい自分で書けるようになればよいのだが、windowsのプログラム手法を勉強する気にはなかなかならない。

Read more...

京都の秋葉

寺町通りを歩いてみた
京都に出張に来たついでに、寺町を歩いてみた。秋葉や日本橋に比べると、当然見劣りしてしまう。秋月やデジットに相当する店は無い。マルツーがあるだけでも有難いと考えるべきだろう。マルツーの中を一通り見てみたが、一つ興味を引かれるものを見つけた。microchipのMCP3551という22bitのDelta-Sigma型A-Dコンバーターだ。精度の高いADコンバーターを探しているのだが、Delta-Sigma型だと精度の高いものがつくれるようだ。原理はいまいち理解できていないが。値段も手ごろだ。インターフェースはSPIなのだが、マイコンで扱うので、問題はない。今後使うADコンバーターの候補に入れておこう。

Read more...

動画を使ったプレゼン

impressiveで動画
以前はプレゼンテーションはacroreadを使って行っていたが、今はimpressiveを使っている。Ubuntu Weekly Recipeによると、0.10.2からは、動画再生機能が使えるらしいので、つかってみた。

PageProps = {
  12: { 'video': "embedded.ogv" }
}

という内容を、例えばmovie.infoという名前で作って、–script movie.infoオプションをつけて実行すればよい。すると、12ページ目が表示されたときにmovieが再生される。しかし、一度再生すると、二度目には再生できなかったり、再生中にキーボードで何か操作したら固まってしまったりと、まだ改良の余地があるように思われる。

Read more...

ubuntu 9.04

mini9のOS

もうそろそろubuntu 9.04のサポートが切れるだろう。現在使用しているPCのほとんどはDebianLennyのLXDEにしているが、例外としてdellのmini9はubuntu9.04で動かしている。これは、インストールした当時、debianでは、SDを指したままにしておくと、udevが立ち上げのときにハングるようでうまくいかなかったので、ubuntuにしたためだ。念のために、versionを確認してみると、やはり9.04だった。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=9.04
DISTRIB_CODENAME=jaunty
DISTRIB_DESCRIPTION="Ubuntu 9.04"

サポート切れしたOSを使い続けるのも嫌なので、どうしようか迷っている。ubuntuのより新しいものに乗り換えるのが無難なのだろうが、最近のubuntuにはいくつか気に入らない点がある。

まず、ログイン画面でユーザー名が選択できてしまうことである。ユーザー名は入力すべきだと思う。

それから、起動時や終了時には、不要な画像を表示して何を裏でやっているのかが分からない。debianは、ターミナル画面になって、いろいろと表示してくれるので、意味はよく分からなくても安心できる。

さらに問題なのが、ctrl+alt+fnでx無しのモードに切り替わらないことである。debianベースなのだから、同じようにできても良いものなのだが。linuxでもプログラムがハングるときはある。それがwindowで動いていれば、ターミナルを立ち上げて殺すこともできるだろうが、全画面のときには、何も受け付けなくなるときがある。そのような場合、debianなら別にログインしてkillすれば問題ない。しかし、ubuntuではこれができないのである。何か別の手法があるのかも知れないけど。

結局、私にはubuntuよりもdebianの方があっているように感じられる。Debian sqeezeもrelease-critical bugsが300個ぐらいになってきているので、そろそろリリースされそうだ。これを待って入れ換えるのも良いのかも知れない。SD問題がどうなっているかが課題だが。

Read more...

ubuntu 10.04 LTS

windowsからlinuxへ
少し調子の悪いPCがあるということで、様子をみてみた。メモリやHDDをいじっていたら、少し調子は良くなったが、原因はよく分からなかった。まあ、Windowsで使いつづけるのもなんなので、Linuxをインストールすることにした。どのlinuxにしようかと思ったが、素人向けのubuntuにすることにした。リカバリ領域を消さずにインストールしようとしたが、リカバリ領域が邪魔してなかなかうまくいかない。Cドライブを縮めて、その後のパーティションを消して、あいたところにlinuxを入れたらうまくいった。 標準のGNOMEの他にLXDEを入れたが、なんだかとろとろしている。Pen4の3GHzでメモリは512Mbyteなのだが、それにしては遅い。何もしていないようなときにディスクにアクセスをしているのでswapを疑ったが、freeでメモリの状況を見てみても、足りてないわけではない。いろいろといじっていると、余分なディスクアクセスが無くなって、きびきびと動くようになった。なんだったのだろう。 GNOMEだともっと遅いと思ったが、使っていてほとんどストレスを感じない。GNOMEの最適化が進んできたのか、PCの性能が上がって来たのか分からない。個人的にはLXDEを好んで使っているが、この環境は素人向けでは無い気がする。しかし、私はGNOMEだと何をしているのか分かりにくいのであまり好きではない。isoなどもクリックするだけでマウントしてくれたりして驚いたが、どこにマウントされているか分からなくて、ターミナルからコマンドを実行することができなかった。何も知らなくても使えるということと、使いやすいということは必ずしも一致しない。まあ、linuxが素人でも簡単に使えるようになってきたことは、素直にうれしく感じる。もっと普及すると良いが。

Read more...

アキバの液晶

またまた液晶
日本橋に続いて、秋葉でも液晶を買ってしまった。最初は秋月で何かの液晶を買おうと思っていたのだが、液晶工房に行ったところ、面白そうな液晶がいろいろとあったので、その中からお買い得そうなものを買ってしまった。 一つは、16x2のキャラクタ表示用のSC162Aというものだ。バックライト付で\300というのは激安だった。これまで、キャラクタ表示用の液晶は秋月かデジットで買っていたのだが、液晶工房も捨てがたいことが分かった。 もう一つは、シャープ製5.5インチカラーSTN液晶モジュールのLM6Q40Aというものが、これも\300で売っていたので買ってしまった。インターフェースは、RGBとSYNCで、15kHzらしい。これらの信号の意味を調べないと、これを使うことはできないだろう。目標はこれをマイコンから動作させることだ。 ちなみに、今日は人と一緒だったので、秋月に行くのが後回しになってしまった。液晶はさすがにもう買うべきではないと判断して、mega8を買ってみた。AVRはtiny2313(or at90s2313)とtiny261に続いて三種類目だが、megaは初めてだ。28pinなので、書き込みようの部品が必要になるかも知れない。

Read more...