Chromeブラウザのアルファ版を試してみたくなった。しかし、普段の環境にインストールすると後で往々にしてハマることが多いので、VMware上にインストールすることにした。
$ sudo apt-get install open-vms-tools
趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
Chromeブラウザのアルファ版を試してみたくなった。しかし、普段の環境にインストールすると後で往々にしてハマることが多いので、VMware上にインストールすることにした。
$ sudo apt-get install open-vms-tools
USB Frameworkは無事に動作したのだが、ループの中で常にCDCTxService()を呼び出し続けなければならない構造になっていて、改造しにくい。できればそんなものは割り込みなどで監視してほしいものである。
なので、もう少しコードを眺めてみることにした。そこでわかったこと、試してみたことは、
つまり、putUSBUART()などから送信データをポインタ渡しされたら、そのポインタをコピーしておき、CDCTxService()が呼ばれる度に状態をチェックして、送信データをエンドポイントのサイズに分割しながらコピー、送信する、という動作のようである。
これらのことから、以下のようにすれば概ね上手く行くのではないかと考えた。
ということで、実際に試してみた。確認のため、usb_config.hの
ずっと前に買ったオプティマイズのPIC24USBを引っ張り出してきた。
このボードに搭載されているPIC24FJ256GB106にはUSBデバイスインタフェースとシリアルポートが4チャンネルあるので、これらを使ってシリアルラインモニタを作ろうと考えている。シリアルラインモニタを使って、XBeeのプロトコルをモニタする作戦である。
USBプロトコルの処理は、Microchip Technology社から提供されているMicrochip Application Librariesの中のUSB Frameworkを使うつもりである。Microchip Application Librariesは、MicrochipのホームページのSoftware Librariesの中からダウンロードできる。
ダウンロードしてインストールすると、Microchip Solutionsというフォルダができるので、その中の「USB Device – CDC – Basic Demo」フォルダの中の、「CDC – Basic Demo – Firmware」フォルダの中の、「USB Device – CDC – Basic Demo – C30.mcw」をダブルクリックすると、MPLABが立ち上がり、プロジェクトが開く。
ここで、「Configure」→「Select Device」でPIC24FJ256GB106を選択し、さらに「Project」→「Package in .zip」を選択すると、ビルドに必要なファイルだけが「USB Device – CDC – Basic Demo – C30.zip」という名称でZIPに圧縮して保存される。これを別のフォルダで展開したものを作業のベースとすることにした。
試しに、「Project」→「Build All」すると、ちゃんとHEXファイルが生成されることを確認できる。
まず、回路図を比較してみる。後述の通り、PIC24FJ256GB106を使うボードのターゲットはPIC24F Starter Kitである。こいつの回路図はMicrochip社のWebサイトで入手できた。PIC24USBとの主な差分は、
であった。さらにソースを一通り眺めてみた。
ということがわかった。
そこで、「HardwareProfile – PIC24F Starter Kit.h」の94行めから123行めのLEDとSWのマクロ定義の中身を適当に修正する。ポート読出し用は0か1固定、ポート書込み用は中身を空にすることにした。この状態だと、「main.c」のProcessIO()関数の中身によれば、入力されたASCIIコードに1を足したものをエコーする(つまり、AをタイプするとBを表示する)プログラムとなるようだ。
修正してコンパイルしたところ問題なくコンパイルが通ることが確認できた。
これをPICkit2で書き込んでリセット解除すると、新しいCDCクラスのデバイスとして認識され、「USB Device – CDC – Basic Demo」フォルダの下の「inf」フォルダ内のinfファイルをインストールすると、COM12ポートが生成された。TeraTermでCOM12を開いて、キーを入力すると、期待通りタイプしたキーのASCIIコードに1を足した文字が表示された。
同様に、AVRlibのタイマーのテストを行いました。修正箇所は、
########### change this lines according to your project ################## #put the name of the target mcu here (at90s8515, at90s8535, attiny22, atmega603 etc.) # MCU = atmega8515 MCU = atmega163 # MCU = atmega323 # MCU = atmega161 # MCU = atmega128
変更後は、
########### change this lines according to your project ################## #put the name of the target mcu here (at90s8515, at90s8535, attiny22, atmega603 etc.) # MCU = atmega8515 # MCU = atmega163 # MCU = atmega323 # MCU = atmega161 # MCU = atmega128 MCU = atmega88 # FUSE BIT for ATMEGA88/168(default is E=0x01/H=0xDF/L=0x62) EFUSE = 0x01 HFUSE = 0xDF # LHUSE = 0x62 LHUSE = 0xe2 # WRITER parameter WRITER = -c avrispmkII -P usb WRITER_MCU = m88 #directory of AVRLib AVRLIB = /(適切に・・・)/avrlib
#put your C sourcefiles here # Here you must list any C source files which are used by your target file. # They will be compiled in the order you list them, so it's probably best # to list $(TRG).c, your top-level target file, last. SRC = $(AVRLIB)/buffer.c $(AVRLIB)/uart.c $(AVRLIB)/rprintf.c $(AVRLIB)/timer.c $(TRG).c
変更後は、
# put your C sourcefiles here # Here you must list any C source files which are used by your target file. # They will be compiled in the order you list them, so it's probably best # to list $(TRG).c, your top-level target file, last. SRC = $(AVRLIB)/buffer.c $(AVRLIB)/uart.c $(AVRLIB)/rprintf.c $(AVRLIB)/timerx8.c $(TRG).c
timer.o : timer.c timer.h global.h
変更後は、
timer.o : timerx8.c timerx8.h global.h
結局、タイマー周りの修正が要る、ってことですね。
これで一応シリアルの表示上は動いている(ポーズもそれっぽく掛かっている)気がするのですが、PWM出力の方は出ていないようです。
この辺はまた今度にすることにします。
ATMEGA88を使うことにしたのですが、シリアル制御を一から作るのも面倒くさい、ということで、ちょっと古いようですが、AVRLibを試してみることにしました。
まず、ZIPファイルをダウンロードしてきて、展開します。
環境変数AVRLIBに avrlib のディレクトリ位置を(avrlibの名前を)設定して、rprintf のサンプルディレクトリに移動。
makeすると、makeはされるのですが、ATmega163用にmakeされてしまいます。
今回のターゲットはATmega88なので修正を試みます。
現状の修正箇所は、
###### BLOCK 12) make instruction to delete created files ######prog: all
avrdude $(WRITER) -p $(WRITER_MCU) -F -U flash:w:$(TRG).hex -U eeprom:w:$(TRG).eep -U efuse:w:$(EFUSE):m -U hfuse:w:$(HFUSE):m -U lfuse:w:$(LFUSE):m
を追加。(このままだと拡張ヒューズビット無しのCPUに書くとき困るけど、とりあえずそのままで・・・)
# FUSE BIT for ATMEGA88/168(default is E=0x01/H=0xDF/L=0x62)
EFUSE = 0x01
HFUSE = 0xDF
# LHUSE = 0x62
LHUSE = 0xe2# WRITER parameter
WRITER = -c avrispmkII -P usb
WRITER_MCU = m88
を追加
とすることで、rprintfのテストを実施が通るようになりました。(サンプルプログラムの方の global.h を修正し忘れていて、通信速度がおかしく、しばらく悩んでしまいました・・・)
![]() |
無事にシリアル通信が通るようになりました! |
XBeeによって、リモートUARTの環境を構築、ループバック動作を確認できたので、その先のコントローラとして、AVRをつないでみることにしました。AVRにしたのは、Linux環境で閉じた開発ができるからということと、手持ちに ATmega88 が何個か転がっていた(PIC24FJ64も転がっていますが・・・)からです。
Zigbee子機をもう少し大きめのブレッドボードに移植し、ATmega88と同居させました。
・・・といっても、写真では見えないですね。書込みは AVRISPmkII で行っています。
ISP用の端子6本は写真右側に写っているブレッドボード用の自作アダプタを介してその下のATmega88につながっています。
その他、シリアル通信用の端子をXBeeとの間で接続しました。
このATmega88に対してシリアルでコマンド/ステータス通信をさせるようにしていきます。
もっとダイレクトにX-CTUをWINEで使っている方がいるようなので、試してみました。
で接続確認ができます。しかし、残念ながら、Modem Configuration のタブはファームウェアが見つからないとかで、ダウンロードを試みるのですが、それでもみつからないということで、動作しませんでした。ま、ターミナルが動くだけでもずいぶん助かりますので、よしとします。
続いて、通信ターミナルです。
通信ターミナルは、Minicomを使ってみることにしました。例によってSynapticからインストールします。
Minicomはモデムでの通信用のソフトなので、そのまま起動するとモデムを初期化しようとします。
そこで、minicom -s で設定画面に入り、モデム初期化文字列を全て消去します。
その後、設定ファイルを保存するのですが、/etc/minicom の下に保存しようとするため、このディレクトリのパーミッションを開けておきます。保存されたファイルを以下に示します。
$ cat minirc.dfl
# Machine-generated file – use “minicom -s” to change parameters.
pu port /dev/ttyUSB1
pu baudrate 9600
pu minit
pu mreset
pu mdialpre
pu mdialsuf
pu mdialpre2
pu mdialsuf2
pu mdialpre3
pu mdialsuf3
pu mconnect
pu mnocon1
pu mnocon2
pu mnocon3
pu mnocon4 VOICE
pu localecho Yes
$
ただ、ポートは場合によって変わるので、dmesgなどで確認した後変更が必要です。
これで一応、XBeeをコントロールすることはできるのですが、改行の処理は今ひとつ上手くいきません。
まあ、動作しているかどうかの確認くらいはできますが・・・。
ZigBeeモジュールであるXBeeが動き始めたのですが、できればこれをLinuxマシンに接続して動かしたいと思っています。すなわち、秋月のFT232RLモジュールをLinuxで使いたいのです。
早速、FTDIのサイトを見てみると、Linux版のドライバも存在しています。そのコメント欄を見ると、「Included in 2.6.31 kernel and later」と書かれています。つまり、2.6.31以降のカーネルであれば初めから入っていそうです。
そこで、コンソールを開いて見てみると、
>$ uname -a
Linux atom 2.6.32-26-generic #48-Ubuntu SMP Wed Nov 24 09:00:03 UTC 2010 i686 GNU/Linux
ということで、2.6.32なので大丈夫そうです。
おそるおそる、Linuxマシンに挿してみると、
$ dmesg
[56118.520287] usb 1-7.3: new full speed USB device using ehci_hcd and address 4
[56118.618644] usb 1-7.3: configuration #1 chosen from 1 choice
[56119.069612] USB Serial support registered for FTDI USB Serial Device
[56119.069790] ftdi_sio 1-7.3:1.0: FTDI USB Serial Device converter detected
[56119.069853] usb 1-7.3: Detected FT232RL
[56119.069858] usb 1-7.3: Number of endpoints 2
[56119.069864] usb 1-7.3: Endpoint 1 MaxPacketSize 64
[56119.069869] usb 1-7.3: Endpoint 2 MaxPacketSize 64
[56119.069873] usb 1-7.3: Setting MaxPacketSize 64
[56119.070318] usb 1-7.3: FTDI USB Serial Device converter now attached to ttyUSB1
[56119.070362] usbcore: registered new interface driver ftdi_sio
[56119.070367] ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver
$
ということで、ttyUSB1として認識されているようです。ただし、
$ ls -la /dev/ttyUSB*
crw-rw—- 1 root dialout 188, 0 2010-12-08 07:31 /dev/ttyUSB0
crw-rw—- 1 root dialout 188, 1 2010-12-08 23:06 /dev/ttyUSB1
$
となっているので、dialoutグループに自分のユーザ名が入っていないといけないようです。