2014年9月14日日曜日

Arduinoとの通信(FreeBSDでのシリアル通信)

Arduinoが何かをしゃべるように、プログラムしたとする。
(例えば、Serial.println())を使う。)
何を喋っているかをTerminalで受け取るには、次のようにすればよい。
$ (stty speed 57600; cat) </dev/cuaU0
解説すると、標準入力(stdin)を/dev/cuaU0に切り替え、stty speedで、Arduinoが喋るスピードで耳を傾けるように設定する。
その後は、catによって、/dev/cuaU0から入力されたものを、terminalに表示する。

Arduinoを/dev/cuaU0として認識して、いきなりstdinに切り替えられるのは、 Arduino上の、FT232RL(FDTI社)のUSB-Serial変換石に対応した、 デバイスドライバがあるから。
FT232RLが乗っていないArudinoでは、うまくいかないかもしれない。
kernelが、USBに刺さったものをデバイスファイルに見えるように、 適当に/dev/cuaU0に割り当ててくれる。

stty speed 57600で terminal input baud rateを設定している。
Arduinoのプログラムで設定した値と合わせる必要がある。
baudは「ボー」と読む。

環境
OS:FreeBSD 9.3-STABLE r268734
ports:arduino-1.0.5_2,1, arduino-mk-0.10_1
arduino:CQカチャduino (Arduino Duemilanove互換)

2013年10月26日土曜日

FreeBSDでArduino 2

FreeBSDでAVRの続きです。

前回のあらすじ(のうち本当に必要な部分)

CQカチャduinoを買って、portsからdevel/arduinoとdevel/arduino-mkをインストールした。
arduinoを起動する(terminalから「arduino」で立ち上がる)と、IDEが立ち上がるのだけど、uploadができなかった。

dialerに追加

uploadに失敗したときのエラーメッセージを見ると次のように書いてある。
check_group_uucp(): error testing lock file creation Error 
details:Permission deniedcheck_lock_status: No permission to create lock
 file.
please see: How can I use Lock Files with rxtx? in INSTALL
何かの権限が足りていなそうだ。

さらに、とりあえず/dev/cuaU0のステータスを見てみた。
$ ls -l /dev/cuaU0
crw-rw----  1 uucp  dialer  0x9a Sep 32 19:23 /dev/cuaU0
ということで、自分をdialerに追加した。一度ログアウトが必要かも。
$ pw groupmod dialer -m username

これで、/dev/cuaU0の書き込み権限がもらえたので、(ユーザー権限で走っている)Arduino IDEからuploadが可能になった。
(前回の記録では、sudoしてルート権限で書き込んでいた。)

本当は、 Port devel/arduino serial port problems [SOLVED](メーリングリストの過去ログ)を見て分かったのだけれど、せっかくなので「手探りで解決する風」の話に再構成しました。

USBシリアル関係の設定

~/.arduino/prefrence.txtで次の2つの値を設定する。
serial.port=/dev/cuaU0
serial.debug_rate=57600
*.inoのsetup()でシリアル通信の速度を設定する。
Serial.begin(57600)

これでArduinoとして動いた。Serial monitorもシリアル通信の速度を設定したら使えた。さて、何して遊ぼうかな。

2013年9月8日日曜日

FreeBSDでAVR (旧タイトル:FreeBSDでArduino)

Arduinoの互換機を手に入れたのだけど、家のマシンがFreeBSDなので開発環境を整えるのにちょっと調べ物が必要だったので、その記録を残しておくことにする。

参考文献
[1]
中尾司(2013),『Arduino実験キットで楽ちんマイコン開発』, CQ出版

[2]
坂井弘亮,<http://kozos.jp/kozos/avr_04.html>, (AVR編第4回)AVRとArduinoについて,調べたことをまとめておこう (2013年9月8日アクセス)

[3]
<http://playground.arduino.cc/FreeBSD/CLI>, Arduino Playground - CLI, (2013年9月8日アクセス)

[4]
<http://wiki.livedoor.jp/avoild/d/Arduino%28Duemilanove%29%A4%F2%C9%E1%C4%CC%A4%CEAVR%A5%DE%A5%A4%A5%B3%A5%F3%A4%C8%A4%B7%A4%C6%BB%C8%A4%A6>
Arduino(Duemilanove)を普通のAVRマイコンとして使う, (2013年9月8日アクセス)

環境
OS:FreeBSD 9.1-STABLE #2
ports:arduino-1.0.5.1, arduino-mk-0.10
arduino:CQカチャduino (Arduino Duemilanove互換)

実験
まず、[1]の互換機(CQカチャduino)が、Arduino Duemilanove互換であることを確認。
CQカチャduinoのUSBコントローラはFT232であるのだけれど、[3]を読むと十分に昔からFT232はサポートされているようだったので、CQカチャduinoを購入した。

数日後、CQカチャduinoが届いたのでUSBケーブルでつないでみた。
FreeBSD 9.1では、標準のカーネルでFT232を認識できて、カーネルモジュールは不要であった。
[2]にあるように、/dev/cuaU0として認識された。

引き続き、devel/arduinoとdevel/arduino-mkをportからインストールした。
端末から、arduinoを起動すると、IDEが立ち上がった。
ちょこちょこと[1]のサンプルコードを打ち込んで、コンパイルするとコンパイルできた。
しかし、uploadができない。Tools->Serial Portでポートを指定してやらねばならないのだけど、どうも指定できない。
この辺でIDEは諦めた。CUIでの操作に抵抗はない。

気を取り直して、[3]を参考に、新しいディレクトリで、もう一度サンプルコード(led.c)を用意した。
なお、[1]のIDE用のコードと違って、[3]のコードはmain文がある。IDEは関数setup()、loop()を定義するだけで、IDE内で自動的にmain()を用意してくれることになっているのだろう。多分、次のような感じ。

int main(){
  setup();

  while(1){
    loop();
  }
}

で、ターミナルで次を実行する。

avr-gcc -DF_CPU=16000000UL -mmcu=atmega328p -o led.out led.c
avr-objcopy -O ihex -R .eeprom led.out led.hex
sudo avrdude -V -F -c stk500v1 -p m328p -b 57600 -P /dev/cuaU0 -U flash:w:led.hex

[1]との差分は、次の点。
  • blink.cの代わりにled.cにした。
  • avr-gcc
      -mmcu=atmega328pにした。(でもmanには選択肢として出ていないので本当に聞いているかは不明)
  • avrdude
      -p m328pにした。
      -b 57600 にした。
    (avrdude: stk500_recv(): programmer is not respondingとエラーが出たから調べたら、[4]に書いてあった。)


これで、コンパイル、アップロードに成功した。
情報を残して行ってくれた、皆さんのおかげです。ありがとうございます。

次は、Arduinoとシリアル通信できるようにしたい。

2013年10月26日追記:
もともとは、FreeBSDでArduinoだったのだけれど、AVRとしてしか使っていないので、タイトルを変えました。 FreeBSDでもArduinoとして使えているので、それは別途どこかで述べます。

2013年9月7日土曜日

2013年の西瓜 まとめ

今年の夏もそろそろ終わりなので、2013年に食べた西瓜についてまとめようと思います。
購入日購入単位重さ 産地 購入価格*
5月19日1/6-熊本398円
6月1日1/6-熊本280円
6月12日1/6-千葉297円
6月15日
(黄色い西瓜)
1/6-千葉398円
6月19日1/6-千葉450円
7月5日1/61.4kg鳥取458円
7月7日1/61.1kg鳥取398円
7月9日1/61.166kg鳥取458円
(購入時は150円引き)
7月10日1/61.503kg鳥取458円
7月12日1/61.223kg鳥取458円
7月13日ホール5.4kg千葉1,570円
7月24日1/61.450kg山形336円
7月27日1/61.172kg山形398円
7月31日1/61.315kg山形398円
8月2日ホール5.85kg山形1,580円
8月12日ホール5.20kg山形1,980円
8月23日ホール1.299kg長野397円
合計34kg **10,562円
  * 購入店舗は一つではない
  ** 測定していない1/6は1.2kgと推定

今年もごちそうさまでした。

2013年7月14日日曜日

Haltとcast

物理学者(見習い)は、数学とコンピュータにお世話になっております。

最近行ったドイツとグーテンベルク博物館で「この言葉はっ!!」と思ったものがいくつかあったので、紹介します。 (さらっと並列に書きましたが、グーテンベルク博物館はドイツに含まれるという関係です)

HALT

マイクロプロセッサの命令で「MPU停止!」の命令です。 ( HALT - 通信用語の基礎知識) Z80だと機械語は76hでしたね。

ドイツの街ではバス停が「Halt」なのです。バス停のマークが「H」で、何でなのかなと思っていたら、Haltの頭文字でした。
Z80の方のHaltは昔から知っていたので、すごく合点がいきしました。
nullだけでなく、haltもドイツから入ってきた言葉だったのですね。ふむふむ。

cast

プログラミング言語において、型変換することです。 ( キャストとは: - IT用語辞典バイナリ) type conversionとも言います。schemeのstring->numberみたいなのはcastと言うのでしょうか。

活版印刷用語でのcastは、matrixと呼ばれる活字の型(鋳型)に、鉛などの金属を融かして注ぎ、活字(type、AとかBとか)を作る工程です。活字(type)を並べてインクを活字につけて、紙を載せて押し付けると紙に文字が印刷されます。

Matrixとtypeは、もちろん凹凸、左右が逆だけれど、同じ意味をもっています。プログラミングでの「型変換」と雰囲気が似てると感じます。

(おまけ)Still

"Extra Still"と書いてある水を買ったら、炭酸でした。
Still waterは、ぶくぶくしていない(炭酸の入っていない)水をさすのに、ぶくぶくだったのです。
よく読むと"wasser mit sehr wenig kohlensäure"(water with very weak carbonic acid、とても弱い炭酸入りの水 の意味)と書いてあります。
私には全然弱く感じません。ばっちり炭酸水です。うーん。

結局、ペットボトルを振って二酸化炭素を追い出しました。でも硬い水でした。味がします。
水よりビールがおいしい国でした。

LibreOfficeでの文字化け(character encodingの指定法)

背景

Microsoft Office からexportした、テキストファイルがある。
(FreeBSD 9.1上の)emacsで書き進めようと思って、テキストファイルにexportしたのだけれど、やっぱりLibreOfficeで作業をしようと、気が変わった。

起きた問題

$ libreoffice hoge.txt
で開いたら、文字化けしている。
character encodingの問題だと思うのだけど、設定するところが見当たらない。
$ emacs hoge.txt
は問題なく、「適当に」encodeを解釈して、きちんと日本語で表示されるのに。
お、左下を見るとS(DOS)と表示されている。
encodingがShift-JIS (S)で、改行コードがCR+LF(DOS)なのね。
Sの代わりにU(UTF-8)、E(EUC)はよく見かける。
(DOS)の代わりに:だと、改行コードはLF。

解決法

$ LANG=ja_JP.SJIS libreoffice hoge.txt
でLibreOfficeを起動する。ふだんは、LANG=Cで暮らしているのでそのままでは開けなかったらしい。
LANGとして選べるものは、FreeBSDでは、/usr/share/nls/の下にあるディレクトリの名前になっているもの。
日本語だと、ja_JP.SJIS ja_JP.UTF-8 ja_JP.eucがあった。
これで、LibreOfficeで文字化けせずに開ける。

改行コード

で、LibreOfficeで編集して、テキスト形式で保存したのだけど、追記した部分の改行コードがLFになっていた。もとからある部分はCR+LFのまま。
部分ごとに改行コードが違うのはよろしくないので、sedで直す。
$ gsed s/'\r'//g hoge.txt >tmp
$ gsed 's/$/\r/' tmp > hoge_new.txt
BSD sedではうまくいかなかったのでgsedを使う。Linuxユーザはもちろん普通のsedでOK。
この形式ならMicrosoft Officeでも問題なく開けるはず。

以上

2013年7月6日土曜日

CentOS 6.3 on VirtualBox 4.2.12で Gnomeを起動するまで

Virtual Box上にCentOSを入れるのが、結構大変だったので、
はまりポイントを中心に記録しておく。

1. HostOS上にVirtualBoxをinstallする。

親マシン(ホスト)はFreeBSD 9.1。portupgrade -Nで
emulators/virtualbox-ose
emulators/virtualbox-ose-kmod
をインストールする。ただのvirtualbox-oseが先。
何か、gusetをinstallしようとして怒られて、virtualbox-ose-kmodを入れたのだけど、何があったかの記録が見つからない。

!! emulators/virtualbox-ose-kmodはkernel moduleなので、/usr/src/などを参照する。
したがって、「/usr/src/はkernelを作るときにしかマウントしない」とか運用していると/usr/src/が見つからなくて、installに失敗する。

!! portupgradeは*.koを作るところまでやってくれる。
まずは、kldloadで手動でkernel panicしないか試してみるよろし。
もし、panicしてもrebootしたら元に戻る。

!! 自動でkernel moduleを読み込みたいなら、/etc/rc.conf.localにkld_list="vboxdrv"のように追加する。
FreeBSD 9.1から/boot/loader.confに書かなくてもよくなったので、事故があっても、single user modeであがって助かれる(はず)。
(参考:Toshio Uchiyama's Diary(http://www.uchi-yama.info/wp/?p=57) http://lists.freebsd.org/pipermail/freebsd-hackers/2012-February/037780.html(FreeBSDのメーリングリスト)

2. Virtual Machineを用意する。

「New」のアイコンをクリックして、GUIで作る。

Type/VersionをLinux/other Linuxとすると、64bitを選べないように見えるが、実際は、64bit仮想マシンになる。
(64bitのinstalldiscでインストールできたのだから)
ここで選ぶ内容はアイコンにしか関係ないのか?

Memoryをデフォルトの256MByteにしたら、installするときに「メモリが小さすぎ」と怒られた。512MByteにしたら大丈夫。Memory sizeはいつでも大きくできる。
普通は、Hostの半分位にするものらしい。

Execution CapはGuestがどんだけ物理マシンのCPUを食ってよいか。
ホストが2core 2thereadなので、1CPU(core)を100%食ってよいことにした。
この数字もあとから変えられる。

HDDの大きさは20GBにした。GnomeとX用のフォントが入った段階で、
半分強埋まっている。HDDの拡大は少し面倒らしいので( くしゃみ日記(http://kei-pon.cocolog-nifty.com/blog/2013/04/virtualbox-hdd-.html))、
もう少し大きめにしたほうがよかったかもしれない。
dynamically allocatedなら、物理HDDを占領するわけでもないし。
あるいは、物理マシンでの大きなHDDへの引越しと同じことはできるはずので、
そんなに心配はいらないかもしれない。
(FreeBSDなら、新しいHDDのpartitionを手で切って、dumpとrestoreでごにょごにょとやるんだけど、linuxはどうやるんだろう??)

3. CentOSをinstall discからインストール

CentOS本家(http://www.centos.org) からリンクをたどって、CentOS-6.4-x86_64-bin-DVD1.isoとCentOS-6.4-x86_64-bin-DVD2.isoをダウンロードする。
Virtual Boxの設定画面で、CentOS-6.4-x86_64-bin-DVD1.isoをCDに入れて、電源Onする。

discのcheckは省略してよい。

時計は、親(ホスト)のSystem ClockがUTCなので、Use system clock UTCを選んだ。

CentOSで自宅サーバー構築(http://centossrv.com/centos6.shtml) を参考にしようとしたのだけど、VMだからか「赤と青と灰色の昔ながらのUnixのインストール画面」になる。
参考ページのように、色々聞かれたりしない。
discからインストールできるのは、kernelまで。gnomeを含むpackageはこの段階ではインストールできない。
Congratulations, your CentOS installation is complete.となったら、Rebootする。

Rebootすると、ログイン画面が出る。install時に決めたパスワードで、rootログインできたら、うまく行っている。

4. CentOS最低限の環境整備

まず初めに、一般ユーザーを追加した。
uidを親(ホスト)と合わせておくと、将来的に苦労しなさそうな気がする。
(親の環境でのuidは
$ id
とすれば表示される。)
# adduser -u 8888 username (8888は自分のユーザーidにする。)
# passwd username

他、最低限のpackageを入れる。
うちのCentOSは、目的があって、完全ローカルで運用する。
なので、yumもinstall disc頼り。
think-tの晴耕雨読 RSSフィード(http://d.hatena.ne.jp/think-t/20101207/1291733637 )が参考になった。
CentOS-6.4-x86_64-bin-DVD1.isoをCDに入れてmountする。
# mkdir /media/CentOS
# mount /dev/cdrom /mdeia/CentOS

# yum --disablerepo=\* --enablerepo=c6-media search emacs
で正しく動くか確かめよう。

うまく動いたら、次のコマンドで色々インストールする。
# yum --disablerepo=\* --enablerepo=c6-media install <package name>
次のものを入れた。
emacs(依存関係でいろいろなものが入る。)
man
rsync(このあと使うのだ)
sudo (rootでの作業気持ち悪い)

5. Gnomeのインストールまで

install discは2枚になっていて、2枚目の中身は、そのままでは使えない。
1枚目と2枚目の中身を同じディレクトリにおいておく必要がある。

CentOS-6.4-x86_64-bin-DVD1.isoをCDに入れた状態で、
# umount /media/CentOS
# mount /dev/cdrom /mnt/
# rsync -av /mnt/ /media/CentOS/
# umount /mnt/

CentOS-6.4-x86_64-bin-DVD2.isoに入れ替えて
# mount /dev/cdrom /mnt/
# rsync -av /mnt/ /media/CentOS/

さあ、gnomeをインストールしよう。
# yum --disablerepo=\* --enablerepo=c6-media groupinstall "X windows system"
# yum --disablerepo=\* --enablerepo=c6-media groupinstall "Desktop"

!!古い参考文献には、"Gnome Desktop Envrionment"と書いてあるけれど、今は"Desktop"です。要注意。
東の森(http://morrey22.hatenablog.com/entry/2013/04/14/212837) さんに感謝を。

!! ここでおもむろに
# startx
すると、文字が豆腐になるので、ちょっと待て。豆腐のgnomeからlogoutするの大変。

X用のフォントを追加したら出来上がり。
# yum --disablerepo=\* --enablerepo=c6-media install xorg-x11-font*

# startx
するとgnomeが立つ。「rootでXやめろよ」と警告が出るけど気にしない。
一般ユーザでも
$ startx
でgnome が立つ。ふう。
!! なお、この段階でも
# X -configure
はerrorしてしまう。これは気にしないことにした。

runlevelは上げると、起動時にXが起動するのは知っているのだけれど、テストマシンで不安定な見込みなので、しばらくは黒画面でブートさせる予定。

ふう、一仕事。

!! 私は、OS、Gnomeは英語環境で運用しているし、今回のCentOSも英語版のものしか入れていない。(エラーとかが文字化けで読めなかったりするのが嫌だから)
なので、日本語環境を整えたい人は、追加の情報が必要だと思う。
もちろん、普段の環境では、font、emacs、tex、firefoxなどは日本語対応にして生活しているけど、逆にそれ以外のアプリケーションが日本語である必要はあんまり感じないので。

参考にさせていただいたみなさま、どうもありがとうございます。