texからdocへの変換

pandocはどうか
texのソースをwordで読める形式に変換する必要があり、調べていたらpandocというソフトで変換できることが分かった。早速aptでインストールして使ってみたが、texがテキストとしては読めるようにはなるが、数式のコマンドなどは無視されるようだし、あまり有用では無かった。 十年ぐらい前に、texのコマンドを取り除くスクリプトをperlで書いたことがあった。数年前には、それをさらに改良して、rtfに変換するスクリプトをrubyで書いたが、texからの変換に限っては、それらの方が良いように感じられる。そこで、そのスクリプトの改善を試みてみた。texのコマンドをすべて解釈するのは面倒で、いろいろと簡略化しているので、texソースの書き方によってはうまく変換できない時もあるが、それなりに動くようになって来た。もう少し改良が進んだら、公開するかも知れません。でも、使う人は居るのかな。

Read more...

raspberry pi2のraspbian jessieでusbtmc

USBTMCのためにkernelの再構築

ubuntu mate wilyではusbtmcを使えなくなったことが判明したので、仕方ないのでraspbianを使うことにした。jessie liteというものが出ていたので、そのイメージをmicroSDに書き込み、rpi2にそれを入れて立ち上げる。まずは、raspi-configでfile systemを拡張する。そして、aptitude update、aptitude upgradeで、パッケージを最新にする。usbtmcの機器を試しに繋いてみても、予想通り/dev/usbtmc0はできない。

kernelの再構築に必要なパッケージを入れる。ソースを取ってくるためのgitとkernel-packageを入れたが、後者を入れると、texやrubyなんかも入るので、kernel用のパッケージじゃ無くて、中心的なパッケージを入れてくれるものなのかも。build-essentialの方が正解かも知れない。公式サイトには、bcを入れるように書いてあるが、これはkernel-packageに入っているようだ。次に、ソースを取ってきて、基本的な設定をする。

cd /usr/src
sudo git clone --depth=1 https://github.com/raspberrypi/linux
cd linux
KERNEL=kernel7
sudo make bcm2709_defconfig

ここで生成した.configを編集して、CONFIG_USB_TMC=yとする。そして、Makefile中のEXTRAVERSIONに、USBTMCなどと必要に応じて名前をつける。いよいよコンパイルである。

sudo make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img

上の一行目に時間がかかるが、このようなオプションを指定することによって、4コアが使われて、時間が短くてすむらしい。約二時間で、終わったようだ。usbtmcの機器を繋いでみたら、無事に/dev/usbtmc0ができたので、うまくいったようだ。

その後で苦労したのが、ネットワークの設定である。/etc/network/interfacesをいじるのかと思ったら、/etc/dhcpcd.confをいじらないといけなくなっていた。wicdからやったり、いろいろと複雑になってしまった。

Read more...

raspberry pi2のubuntu mateのアップグレード

rpi2ではだめだった
測定用に使っているubuntu mateが15.04で、15.10にしろと言ってくるので、アップグレードを試みた。GUIからやっても、terminalからやっても、うまくいかなかった。aptの設定が悪いのかとも思ったら、どうやらraspberry pi2では、アップグレードには対応していないようだということが分かった。 仕方がないので、15.10のimageをdownloadして、新しいmicroSDに書き込んで、別のrpi2でシステムを構築することにした。しかし、noteでmicroSDに書き込み終わって、rpi2に挿したら、microSDが固定されずに出てきてしまう。少し調べたら、ホッチキスの針で、強引に固定している人がいたので、真似してみたら、なんとかうまくいった。 tarで古いシステムのファイルを圧縮して、新しいシステムに移し、lubuntu-desktopをインストールした。必要なパッケージとして、ruby-gtk2やr-baseなどをインストールして、測定系が動くのかをチェックしようとしたら、usbtmcを認識できない。まさかという感じです。usbtmcを認識できるという理由でubuntu mateにしたのに、意味が無い。15.04では動いたのに、15.10では、必要無いという理由で、削除されたのだろう。rpiでubuntuを使う意味が無くなってしまった。

Read more...

Rで垂直記号

なんとかやり方を見つけた

簡単な数式はRのexpressionを使うと書くことができる。垂直記号(⊥)をどうやって出すのかを聞かれて、少し調べて分からなかったので、psfragなどに頼ろうと思ったら、demo(plotmath)としたら、やり方が出てきた。

expression(symbol("\136"))

とすれば良いようです。symbolのフォントの文字が他にも出せるようだが、文字コードと数字の対応がよく分からない。

Read more...

モーターの異常

USBハブが原因だった
測定装置に組み込んでいるモーターの挙動が変だということなので、原因を調べてみた。このモーターは、USBシリアルで変換した信号を、AVRのtiny2313で読み取って、ソリッドステートリレーを制御することによって、回転させている。しかし、時々逆回転をしたりしている。 まず疑ったのが、rubyのversion問題である。回転方向を指定するときに、binaryを送っているので、以前遭遇したunicodeへの自動変換が行われているのでは無いかと疑った。しかし、これは問題無いようだった。次に疑ったのが、ハードウェアの故障である。しかし、ランプなどを見ていると問題無い。仕方がないので、オシロでシリアルの信号を見てみる。すると、時々文字が化けていることが分かった。 以前、USBのハブが悪さをしていたのだが、モーターのためのシリアルには、大した情報は送っていないので、ハブを介してUSBシリアルを接続していた。これをPCというかRaspberry Pi2に直挿しすると、文字化けは無くなった。しかしこのままではUSBのポートが足りないので、手持ちのUSBハブをいろいろ持って行って、交換してみたら、ひとつ目でうまく行くようになった。 システムを入れ替えたのが7月なので、約半年も気づかずに使っていたようだ。しかし、これで別の装置との通信も安心して行えるようになる気がする。

Read more...

最近のAVRの使い方

割り込みを利用するUARTの使い方

AVRを使うときに、以前はtiny2313をよく使っていたが、最近は秋月の価格が高くなって、megaとあまり変わらなくなったので、mega88をよく使うようになってきた。megaの方がtinyよりも安いのは、変な気がする。

AVRの書き込みにはFTDIのFT232RLを使っているが、PCとUSBで通信する時にも同じ石を使っている。arduino-ft232rの書き込みpinとTX,RXの通信pinをつないでおくと、通信と書き込みの両方ができるようになる。この配線をするのが面倒だと思っていたのだが、UncomPatino基板を使うと、この配線をする手間が省けるので、この基板を利用することが多くなってきた。それなら、Arduinoを使えば良いじゃないかとも思えるが、クロック用に2pinを奪われるので、IOに使えるpinが減ってしまう。

PCとは、USBからFT232RLでUARTに変換して、mega88と通信する。そのとき、できるだけマイコンの負荷を減らすには、割り込みをうまく使うと良い。これまで、マイコンが受信するときは、割り込みでバッファに取り込んでいたが、バッファの内容を送信するときには、一文字送信されるのを待って次の文字を送信していた。以下のようにすると、送信のときの処理時間が減らせる。

#define BUFSIZE 100
static volatile unsigned char buf[BUFSIZE];
static volatile unsigned char i_buf=0;
static volatile unsigned char run_CMD=FALSE;
ISR(USART_RX_vect){ /* received */
  volatile unsigned char c;
  c=UDR0;
  buf[i_buf++]=c;
  if(i_buf>=BUFSIZE){i_buf=0;}
  if(c==10){
    run_CMD=TRUE;
    i_buf=0;
  }
}
ISR(USART_UDRE_vect){
  if(buf[i_buf]!=10){UDR0=buf[++i_buf];} //next
  else{i_buf=0;clearbit(UCSR0B,UDRIE0);} //end
}
void buf_rs232c(){ // buffer transmit
  while(checkbit(UCSR0B,UDRIE0)){} //previous buffer transmit is running
  UDR0=buf[i_buf=0];
  setbit(UCSR0B,UDRIE0);
}
ちなみに、setbit,clearbitやcheckbitなども定義している。
Read more...