UBWを試す

これまでAVR中心に扱ってきましたが、AVRにおけるArduinoと似たような存在として、PICの方でもUBW(USB Bit Whacker)というものがあることを知りました。こちらはマイコンにUSBコントローラを内蔵しているPIC18F2550を使用可能で、しかも、秋月で売っている18F2550マイコンボードをほぼそのまま使えるようです。しかも、ホストとの通信にはデバイス内臓のUSBコントローラを使うということで、極小サイズでデバッグができるようです。

というわけで、試してみることにしました。

ハードウェアの準備

ハードウェアは千秋ゼミのサイトを参考に、AE-18F2550を使ってブレッドボード上に構成しました。

ブートローダの書き込み

UBWでは、ブートローダのことをFirmware Bと呼ぶようです。このFirmware Bは、こちらのページの「UBW driver」というリンクの先にあるB.zipファイルに入っています。これを展開すると、FW_B_20MHz.hexというファイルが「output_20MHz」フォルダの下にあるので、これをWindows上の「PICkit 2 Programmer」で書き込みます。

書き込み完了後、UbuntuマシンにAE-18F2550を接続しても・・・・なにも起きません。動いてないと困るので、ポートRC2をGNDに落としながらMCLRをリリースすると、LEDが交互点滅し、どうやらブートローダが動いていることがわかりました。

ダウンロード用プログラムのコンパイル

次にダウンロード(ブートローダにアプリケーションを流し込んで書き込む)用のプログラムをコンパイルします。

こちらのサイトを参考に fsusb-0.1.11-2.tar.gz をダウンロード、コンパイルします。一次配布サイトなのかどうかよくわからなかったのですが、make一発でコンパイルします。

ファームウェアの書き込み

次に、Firmware D と呼ばれるアプリケーションをダウンロードします。こちらのページの途中に「・・・・ UBW Firmware D released」というリンクがありますので、それをクリックすると、Firmware D の圧縮ファイルが入手できます。これを展開したら、ポートRC2をGNDに落としながらMCLRをリリースして、LEDを交互点滅させます。この状態でブートローダが待機しているようですので、

として書き込んで、再度MCLRでリセットをかけると、異なるパターンのLED点滅が始まりました。

追伸

fsusb をルート権限で動かすのは面倒くさいので、こちらの記事で追加した /etc/udev/rules.d/60-local.rules に

を追加してみました。再起動しないと効果がわからないので、うまくいくかわかりませんが・・・。

追伸の追伸

やっぱりダメでした・・・。何でroot権限要求するのかソース読んでみないと・・・。

TightVNCをインストールする

さくらのVPSマシンでは遠隔操作ソフトとしてFreeNXを使っています。しかし、最近XperiaArcoを手に入れたので、これで遠隔操作したいと思って調べてみました。残念ながらFreeNXは使用できないようで、主流はVNCのようです。その中でもFreeで使用可能なTightVNCを使ってみることにしました。

で、最新のLinuxで使用可能なTightVNCは1.3.10のようなのですが、ここでは簡単にSynapticからインストール可能な1.3.9-6を入れてみることにします。インストールはSynapticを使うのでごく簡単で、「VNC」で検索して「tightvncserver」を選択してインストールするだけです。

インストールしたら、「アプリケーション」→「インターネット」→「X11VNC Server」で起動し、設定を行います。ここではセキュリティ確保のため、SSHを使ったトンネル接続を行いますので、「Listen on localhost」と「File Transfer: TightVNC」にチェックを入れてOKを押します。さらに、「Accept Connections」とパスワード設定をしてOKを押します。Ubuntuのリモートデスクトップビューアはパスワードがなくても問題ありませんが、Androidの Android-vnc-viewerの方はパスワードがないとアクセスできませんでした。

さらに、TightVNCは暗号化などのセキュリティがないために、sshトンネルと併用しなければなりません。

テストのためローカルのUbuntuからSSHトンネルを掘って接続してみます。

$  ssh -p (SSHポート) -L 15900:localhost:5900 userid@接続先

で手元のマシンの Port 15900 がSSHでログインした先から見た localhost:5900 にトンネル接続されます。この状態でローカルのリモートデスクトップビューアで localhost:15900 に接続すると、リモートマシンの画面が表示されました!

ATmega644シリーズの違い

ATmega644には無印644、644P、644A、644PAがありますが、それぞれ微妙に機能が違います。

その違いをブロック図で見ていきたいと思います。(それぞれデータシートから抜粋しました)

まず無印644です。

次に、Sanguinoに使われていて、秋月でも扱っている644Pです。ちなみに秋月のサイトに掲載されているデータシートは644Aのものだったりします。

大きな変化では、

  • UART1が追加されている
  • Timer/CounterのPortへの接続先が微妙に変わっている
  • OscillatorブロックからTOSC1/TOSC2の信号が出ている

というところが変わっています。

さらに644Aです。

さらに、644Aでは16bitのT/C3が追加されているのと、なぜかもう一つ16bit T/C1 の箱が増えています。また、ポートとの接続も複雑になっています。

次に644PAです。

644PAでは大きな変更はなさそうです。

644、644P、644A、644PAでは微妙に差があるので、データシートを見るときは気をつけてみる必要がありそうです。

Mega644版Arduino(Sanguino)・・・アナログ編

次にアナログ入力を試してみたのですが、サンプル「AnalogInput」をコンパイル&実行しようとしてみると、エラーが発生します。

エラーの原因は

int sensorPin = A0

の行で、「A0」が未定義ということのようです。で、元からある arduino-0022/hardware/arduino の下のファイルと、追加した arduino-0022/hardware/sanguino の下のファイルを見比べてみると、WProgram.h のファイルにA0~A15の設定が抜けていることがわかりました。

そこで、arduino-0022/hardware/arduino/cores/arduino/WProgram.h から以下の部分のうちの黒字部分と、ATmega644Pの記述(赤字の部分)を追加しました。

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
const static uint8_t A0 = 54;
const static uint8_t A1 = 55;
const static uint8_t A2 = 56;
const static uint8_t A3 = 57;
const static uint8_t A4 = 58;
const static uint8_t A5 = 59;
const static uint8_t A6 = 60;
const static uint8_t A7 = 61;
const static uint8_t A8 = 62;
const static uint8_t A9 = 63;
const static uint8_t A10 = 64;
const static uint8_t A11 = 65;
const static uint8_t A12 = 66;
const static uint8_t A13 = 67;
const static uint8_t A14 = 68;
const static uint8_t A15 = 69;
#elif defined(__AVR_ATmega644P__)
const static uint8_t A0 = 24;
const static uint8_t A1 = 25;
const static uint8_t A2 = 26;
const static uint8_t A3 = 27;
const static uint8_t A4 = 28;
const static uint8_t A5 = 29;
const static uint8_t A6 = 30;
const static uint8_t A7 = 31;
#else
const static uint8_t A0 = 14;
const static uint8_t A1 = 15;
const static uint8_t A2 = 16;
const static uint8_t A3 = 17;
const static uint8_t A4 = 18;
const static uint8_t A5 = 19;
const static uint8_t A6 = 20;
const static uint8_t A7 = 21;
#endif

さらに、これを処理する部分があるはずなので、探したところ、同様に wiring_analog.c の中の、analogRead()という関数で処理していそうだったので、同様に以下のように黒字部分を arduino-0022/hardware/arduino/cores/arduino/wiring_analog.c から追加し、さらに赤字部分をオリジナルで追加しました。

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega644P__)
if (pin >= 24) pin -= 24; // allow for channel or pin numbers
#else
if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

これでサンプル「AnalogInput」も無事に動作するようになりました。
ただ、これだけの記述だけではデジタルピンが sanguino.ccに掲載されている端子配置にならないような気がしたのですが、上記の変更でデジタルピンもこの順番で動作するようです。

・・・もう少し調べてみたら、arduino-0022/hardware/sanguino/cores/arduino/pins_arduino.c の中の配列 digital_pin_to_bit_mask_PGM[] の中で、PortAだけ逆順に並んでいました。ここでデジタルピンの並び順を変換しているようですね。

ライセンスを見ると、LGPLのようなので、差分を取り込んだファイルを添付(sanguino_analog.tar.gz)しておきます。同名のファイルを差し替えれば同じレベルになるはずです

Mega644版Arduino(Sanguino)・・・ハードウェア編

無事にコンパイルできることが確認できた(といっても、Blinkだけですが)ので、ハードウェアを準備します。確認のターゲットはまずはサンプルプログラムBlinkです。なので、(Arduinoでの)デジタル13ピンにLEDを接続したものを点滅させるのが目標になります。

最終的に作ったハードウェアはこんな感じです。(途中の写真がないのですみません)

16MHzのクリスタルと22pFのコンデンサ2つ、Vcc/GND間のパスコン(チップセラミックコンデンサ1uF)を実装した小さな基板を作って、ブレッドボード上のATmega644Pのそばに取り付けました。さらに、リセット端子のプルアップ抵抗と電源供給の配線を行っています。画面左上の青いコンデンサは自動リセット用のDTR信号にかませる0.1uFのコンデンサです。右上の緑色の基板はホストとの通信用のAE-UM232Rで、上の写真ではすでに接続済みです。写真下にはちょっとだけLEDの頭が見えています。

  1. AVRISP mkII(他のものでもいいですが)の接続
    まず、購入状態のATmega644PではArduino(Sanguino)として動作しませんので、ブートローダを書き込んでやります。自分はAVRISP mkIIを使用しているので、ピン配置を確認しながらVcc/GND/MISO/MOSI/RESET/SCKの6pinを接続します。RESETにはプルアップが必須なので忘れないようにします。
  2. ブートローダの書き込み
    ターゲットのATmega644pに電源を供給し、 Arduinoから「Tools」→「Burn Bootloader」→「w/ AVRISP mkII」を選択して、ブートローダを書き込みます。
    書き込みには多少時間がかかりました。赤い文字のエラーメッセージが出ていないことを確認します、
  3. AE-UM232Rの接続
    TXD/RXDを接続し、さらに自動リセット用のDTRを0.1uFのコンデンサを経由して接続します。さらに動作確認用のLEDと抵抗を19pin(D13)に接続します。
  4. 書き込み&実行
    サンプル「Blink」をコンパイル&アップロードして実行します。

これで問題なく無事にLEDが点滅しました。

Mega644版Arduino(Sanguino)・・・準備編

手元にグラフィック液晶があるのですが、これをArduino(28pin ATmega)で制御しようとすると、グラフィック液晶は4bit制御モードがないために最低でも10pinは必要になってしまいます。

なので、ピン数の多い手持ちのATmega644Pを使いたいのですが、ArduinoのIDE(統合環境)に慣れてしまうと「できればArduino(の統合環境)」で使いたい、と思ってしまいます。さらにArduinoの場合、bootloaderを書き込んでおけば、AVRISP mkIIなども必要なくなるというのも魅力です(むしろこっちの魅力の方が大きい。コマンドラインでブートローダを使う方法はないだろうか?)。

で、大抵の場合はこういうのは先人がいるので、Googleさんで調べてみると、Sanguino.ccが該当することがわかりました。しかし、こちらのサイトはArduinoの0018を対象にしているようなのでちょっと古そうだと思ってがっかりしたのですが、ダウンロードページをよく見ると、「For arduino-0018 and newer:」となっています。記載されているインストール方法をみると、既存のArduinoのディレクトリにまるごと追加のディレクトリをコピーするようなので、試してみることにしました。実際に試したインストール手順は以下の通りです。

  1. ダウンロードのページからリンクを辿っていって、Sanguino-0018r2_1_4.zipをダウンロードします。
  2. ダウンロードしたzipファイルを展開します。
  3. ダウンロードしたSanguinoというフォルダを 「~/arduino-0022/hardware/」 の下に「sanguino」という名前でコピーします。
  4. arduino IDE を起動して、「Tools」→「Borads」の下に、sanguinoが追加されるのを確認します。
  5. 何かサンプルをコンパイルしてみます。

これでとりあえずコンパイルできる所までは確認できました。

JDのコンパイル/インストール

いろんな事件などでも登場する2ch(2ちゃんねる)ですが、その一方で書き込まれている内容が本当のことかどうかを常識やその他の情報源に基づいて判断する力は必要ですが、その代わりに役に立つ情報も少なくありません。また、逆に困っている人がいれば助けてあげたいと思う気持ちもあります。
で、SynapticでインストールできるJDという2chビューアを使っているのですが、現在SynapticでインストールされるJDは2.6.0というバージョンです。このバージョンだと、荒らし防止のために導入された忍法帖という仕組みに対応できないらしく、書き込みを行うためには2.8.1以降でなければならないようです。
なので、ソースからコンパイルしてみることにしました。

Ubuntu11.04が対象ですがコンパイルの方法自体はこちらに載っています。自分は10.04LTSなので同じ手順で試してみました。・・・結果は、そのままやればうまく行きました。一応、手順をメモしておきます。

$ sudo apt-get install subversion autoconf libtool libgtkmm-2.4-dev libgnutls-dev ttf-ipamonafont
$ mkdir jd4linux
$ cd jd4linux
$ svn checkout http://svn.sourceforge.jp/svnroot/jd4linux/jd/trunk
$ cd trunk
$ autoreconf -i
$ ./configure –with-native
$ make
$ cd src
$ ./jd

最後の行が起動コマンドです。

LinuxでPDFファイルを編集する

今、Pythonで仕事で使うスクリプトを書いているのですが、そのために色々調べごとをしました。世の中、いろんな役に立つ情報をまとめて提供してくれている方がいて、非常に参考になります。しかしながら、その場で全部は理解できない/必要できないことも多いので、後でじっくり読みたいと思うものも少なくありません。
しかし、それらの情報はほとんどがWebサイトという形をとっていて、永続的に存在することが保証されてもいませんので、ぜひとも手元に残したいと思うものです。(もちろん、著作権は元々作成された方にある場合がほとんどですので、他の目的に使うことはできませんが)

で、一番お手頃なのがChromeブラウザで印刷してPDFに変換してしまうことなのですが、それだとページ毎にバラバラのファイルになってしまいます。自分はAcrobat7とAcrobat9のStandard版は持っているので、そちらで結合してもいいのですが、わざわざWindowsを立ち上げなければなりません。
そこでそのPDFファイルを編集(といっても結合だけでいいのですが)するツールがないか調べてみました。

Synapticで「PDF」で見て、pdfeditとpdftkをなんとなくインストールしてみました。

  1. pdfedit
    「アプリケーション」→「グラフィックス」→「PDF Editor」で起動します。
    ファイルを開くと、PDFファイル中のテキストやオブジェクトなどをあれこれできそうな表示はされるのですが、残念ながら今回の目的の複数のPDFファイルの結合は容易にはできそうにありませんでした。(こうすればできるよ、という情報があれば教えてもらえると嬉しいです)
  2. pdftk
    こちらはコマンドラインツールですので、目的のディレクトリにファイルに通し番号をつけた上で、シェルを開いて目的のディレクトリで、
    $ pdftk *.pdf cat output outfile.pdf
    とすることで、 瞬時のうちに結合したファイルが得られました。

ということで、ChromeのPDF出力とpdftkの組み合わせで個人用Web情報コレクションができそうです。

wxPythonをインストールする

PythonでGUIアプリケーションを作るためにwxPythonをインストールします。

wxPyWikiのページにしたがってインストールしていきます。

$ sudo apt-get install curl
パッケージリストを読み込んでいます… 完了
依存関係ツリーを作成しています
状態情報を読み取っています… 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
linux-headers-2.6.32-21 linux-headers-2.6.32-21-generic
これらを削除するには ‘apt-get autoremove’ を利用してください。
以下のパッケージが新たにインストールされます:
curl
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 6 個。
209kB のアーカイブを取得する必要があります。
この操作後に追加で 328kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu/ lucid-updates/main curl 7.19.7-1ubuntu1.1 [209kB]
209kB を 0s で取得しました (347kB/s)
未選択パッケージ curl を選択しています。
(データベースを読み込んでいます … 現在 184857 個のファイルとディレクトリがインストールされています。)
(…/curl_7.19.7-1ubuntu1.1_i386.deb から) curl を展開しています…
man-db のトリガを処理しています …
curl (7.19.7-1ubuntu1.1) を設定しています …

$ curl http://apt.wxwidgets.org/key.asc | sudo apt-key add –
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
104 1678 104 1678 0 0 937 0 0:00:01 0:00:01 –:–:– 1700
OK

として、次に、/etc/apt/sources.listに以下の内容を書き加えます。(10.04LTSの場合)

# wxWidgets/wxPython repository at apt.wxwidgets.org
deb http://apt.wxwidgets.org/ lucid-wx main
deb-src http://apt.wxwidgets.org/ lucid-wx main

その後、以下のコマンドを実行します。(結果は省略)

$ sudo apt-get update
$ sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n
$ sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n libwxgtk2.8-dev libgtk2.0-dev

コマンドラインから「xrced」と入力するとGUIを設計するためのツール XRCed が起動することを確認できました。

Python2.5のインストール

Ubuntu10.04LTSに標準でインストールされるPythonは2.6なのですが、Google App Engine で使うPythonは2.5だったりします。なので、2.5をインストールします。

googleさんで調べてみると、以下の方法が簡単でした。

$ sudo add-apt-repository ppa:fkrull/deadsnakes
Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret-keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver keyserver.ubuntu.com –recv FF3997E83CD969B409FB24BC5BB92C09DB82666C
gpg: 鍵DB82666Cをhkpからサーバーkeyserver.ubuntu.comに要求
gpg: 鍵DB82666C: 公開鍵“Launchpad Old Python Versions”を読み込みました
gpg: 処理数の合計: 1
gpg: 読込み: 1 (RSA: 1)
$ sudo apt-get update
ヒット http://archive.ubuntulinux.jp lucid Release.gpg
無視 http://archive.ubuntulinux.jp/ubuntu/ lucid/main Translation-ja
(途中省略)
ヒット http://ppa.launchpad.net lucid/main Sources
取得:6 http://dl.google.com stable/main Packages [1,183B]
24.2kB を 5s で取得しました (4,460B/s)
パッケージリストを読み込んでいます… 完了
$ sudo apt-get install python2.5
パッケージリストを読み込んでいます… 完了
依存関係ツリーを作成しています
状態情報を読み取っています… 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
linux-headers-2.6.32-21 linux-headers-2.6.32-21-generic
これらを削除するには ‘apt-get autoremove’ を利用してください。
以下の特別パッケージがインストールされます:
python2.5-minimal
提案パッケージ:
python2.5-doc python2.5-profiler
以下のパッケージが新たにインストールされます:
python2.5 python2.5-minimal
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 6 個。
4,114kB のアーカイブを取得する必要があります。
この操作後に追加で 14.9MB のディスク容量が消費されます。
続行しますか [Y/n]?
取得:1 http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu/ lucid/main python2.5-minimal 2.5.5-8~ppa2~lucid1 [1,220kB]
取得:2 http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu/ lucid/main python2.5 2.5.5-8~ppa2~lucid1 [2,893kB]
4,114kB を 15s で取得しました (264kB/s)
未選択パッケージ python2.5-minimal を選択しています。
(データベースを読み込んでいます … 現在 184153 個のファイルとディレクトリがインストールされています。)
(…/python2.5-minimal_2.5.5-8~ppa2~lucid1_i386.deb から) python2.5-minimal を展開しています…
未選択パッケージ python2.5 を選択しています。
(…/python2.5_2.5.5-8~ppa2~lucid1_i386.deb から) python2.5 を展開しています…
man-db のトリガを処理しています …
desktop-file-utils のトリガを処理しています …
python-gmenu のトリガを処理しています …
Rebuilding /usr/share/applications/desktop.ja_JP.utf8.cache…
menu のトリガを処理しています …
python-support のトリガを処理しています …
python2.5-minimal (2.5.5-8~ppa2~lucid1) を設定しています …

python2.5 (2.5.5-8~ppa2~lucid1) を設定しています …

libc-bin のトリガを処理しています …
ldconfig deferred processing now taking place
menu のトリガを処理しています …

これで以下のように2つのpythonが使えます。

$ python2.5 -V
Python 2.5.5
$ python2.6 -V
Python 2.6.5
$ python -V
Python 2.6.5