ブログ - 最新エントリー

液晶ディスプレイ

カテゴリ : 
その他
2010-5-28 11:09



FREEDOM jr.IIIの胸部に装着することで、モーション作成や歩行パラメータ調整、ホームポジションの調整などがPCレスでリモコン操作のみでできちゃいます。単にSimple Termで表示されているものが液晶画面に表示されるだけですが。
まだまだ現地調整が手放せないロボット君にはコンソールは必要不可欠。思っただけで伝わる様になるのはいつの日になることやら。ま、人間同士の意思疎通ですら難しいんだから無理ですかね。
なお、こちらも近々商品化される予定です。


FDIII-HCスターターキット学習ガイドはいよいよ2軸へ。
写真はFDIII-HCスターターキットAX-12+とタミヤのユニバーサルプレートを使って作った車輪型ロボット。

今後この構成でライントレースや相撲などのサンプルプログラムを紹介する予定です。

そこにドアがあるから

カテゴリ : 
雑記
2010-5-26 16:39



いちよーこのぐらいのコードでえんとちゃう?
なんつー無意味なマルチタスク加減。

以前より「TOPPERSを動かす」というネタを書いてきましたが、諸々の環境を考えるとなかなか敷居が高いのかなと感じるところがあります。
RTOSと言われてもピンとこない方でも、見かけ上複数のプログラムが同時に動く環境が手に入るとなればちょっとは使ってみたくなるかなと思いまして、今月中にリリースする予定のGCC Developer LiteにはAT91SAM7Sシリーズ限定版のTOPPERS/ASPを簡単に利用できるターゲットを含めようと思っています。
TOPPERS/ASPは動的にタスクを生成する事は考慮されていませんので今回提供しようと考えている環境ではタスク数に制限が加わっていますが、割り込みハンドラ等はユーザ側のソースで自由に追加定義できるように手を加えてあります。また、デフォルトで定義されたタスクでは物足りない場合でも、単体でコンフィギュレーションできるよう考慮してみたいとも思っています。
こんなコードだけで3つのタスクが同時並行で動いたら面白いなぁと思われたら、ぜひ試してみてください。

新しくサポートしたデバイスはシステムクロックの指定が重要なため、任意に設定できるようにしました。また、このご時世ボーレートが9600bpsの倍数なんてケチ臭いのも間抜けなので、こちらも自由度を上げました。これで場合によっては転送速度を数百kbpsまで上げる事も可能です。
という事でbeta2としてこちらに公開しました。
2010/02/23

久々に新しい(単に作者が使っていなかっただけですが)ルネサステクノロジさんのチップを使ったボードに触れる機会がありました。秋月電子さんのSH7125ベースボードキットAKI-H8/3069Fマイコンボードキットの2種類。
ベステクで扱っているシリーズとは内蔵機能が違うので、ちょっとは楽しめるかなと思い選んだのですが、案の定現状のFlash WriterではこれらのフラッシュROMの書き換えは対応せず。もちろんFDTを使えば難なくイケますが、横着な作者にはやっぱりいろいろ面倒。
という事で、データシート見ると案外簡単そうだったのでFlash Writerをこの2機種のフラッシュROM書き換えに対応させてみました。マイコンのシステムクロックに依存する部分があるので設定上少々物足りないのですが、ひとまずベータ版としてここに置いておきます。現状は上記2機種に使用されているクロックが前提になりますので。

不具合があっても保証の限りではありませんが、絶対おかしい!って時はこちらにメールして下さいね。

それと、少しでもヤル気が出たら、今まで見捨てていたターゲットも復活させてみようかなと思ってたりします。もう用済み!と思われていたとしてもw。
指摘があったので chip_time.c と chip_timer.h をちょっと修正。
タイマのインターバルが10kHzになっていたので、1kHzにしました。これでホントに元のサンプルと同じ速度になったかな?
2010/01/29

 

タスクスイッチ用タイマ

タスクを並列に処理しているように見せかけるための機能を実現するのタスクスイッチ用のタイマらしく、マイコンに内蔵された時計を利用して一定間隔で何かしでかす仕掛けの様です。
という事でまだまだ理解が追いついてない状態で、この部分に手を加えてみようというのが今回のネタです。

Periodic Interval Timer (PIT)への変更

タスクスイッチ用のタイマに関するソースは ~/asp/arch/arm_gcc/at91sam7s/chip_timer.c に書かれている様で、ねちねち読むとTimer Counter Channel 0 (TC0)の初期化や割り込み処理ルーチンしかない感じ。それでもって、単純に時間を刻んでいれば良い筈なんだろうと決めつけると、そこそこ高機能なTC0をインターバルタイマとしてだけ使うのは何だかもったいない気がしてきました。
そこで、あまり触れられる機会が少ない Periodic Interval Timer (PIT)で代替できないだろうかと考えました。chip_timer.c ではTC0の初期化や割り込み処理ルーチンしかないので、改造する範囲はかなり少なくて済みそうだからという憶測も手伝い、改造を英断。

またもやドキュメントを中途半端に読みつつ、何度か試行錯誤しながら処理方法を模索し、ホントに後々問題にならないのかは全く自信が無いまま、とりあえず関係するソースを修正して再度のコンフィギュレーションしなおした asp.bin が#1と同じ動きをしたならば良しと決めました。
まずはTC0を使用するように記述されている ~/asp/arch/arm_gcc/at91sam7s/chip_timer.h と ~/asp/arch/arm_gcc/at91sam7s/chip_timer.c の該当箇所をPIT化し、以下のコマンドを実行してサンプルプログラムをコンパイル。
cd ~/asp/OBJ
make clean
make depend
make asp.bin
おや? make depend をした段階で、何やら定義の重複エラーが発生したと言ってくる。そんなつもりは無いのだが。おまけに手を入れたトコとは関係ないソースとの競合があるらしい
エラーメッセージから INTNO_SIO をgrepしていくと、適当に修正した chip_timer.h の INTNO_TIMER が、INTNO_SIO に設定されている INTNO_SYSIRQ_PID と同じ値だという事らしい。どうやらPITは他のペリフェラルのいくつかと割り込みベクタが共通になっている事が原因っぽいけど、ダメな理屈は分からない状態で難儀する事に。

ドキュメントを読もう!

悩むこと数年、試行錯誤で修正しても何ら解決しそうになかったので、マジメに資料を読むしかない!という事に行き着きました。

割り込みベクタを共有したい場合の方法については、~/asp/doc/configurator.txt の「(5-2-1) 割込みハンドラの生成」に共有になっている場合に使用できそうな内容が記述されています。これを参照しながら  chip_timer.cfg と、関係がある事すら意識していなかった競合相手 dbgu_serial.cfg を修正。
「割り込みハンドラの生成」はGCC Developer Liteのsam7sターゲットでSYSIRQの分岐処理として提供されている sys.c みたいなコードを使ってるとダメらしく、割り込みハンドラ側でフラグをちゃんと見ないといけない事も判明 (chip_timer.c の target_timer_handler と、dbgu_serial.c の sio_isr)。

動作確認

再度 make depend を実行し、文句は言ってこなくなった様なのでひとまず改造はOKといった所でしょうか。make asp.bin を実行。completeの文字が表示されて ~asp/OBJ/asp.bin が作成されていればコンパイルは成功。さっそく書き込んで動作を見てみましょう。
#1と同じ動きをしましたかね? dbgu_serial.c もいじくったので大丈夫か不安だったのですが、sample1.c の中身は別として同じ動きをしている気がしますがいかがでしょう。

※元のソースからの差分はこちらからダウンロードできます。最終段階の動くであろうと思われるソースになっていますので、~/aspフォルダに上書きして使ってください。

 

TOPPERSについて

TOPPERSはRTOSの1つでITRON仕様のオープンソースソフトウェアとして公開されているOSです。TOPPERSの詳細は http://www.toppers.jp/project.html を参照してください。

マイコン上でプログラムを作成する場合でも、OSがタスク制御とかをやってくれるのでマルチタスクのプログラムが作成し易い?はずです。数回に分けてTOPPERSをAT91SAM7Sに搭載させてマルチタスクOSによるプログラミングに挑戦してみます。

今回は公開されている情報をトレースし、今現在でも同様の手順で再現できるかを試してみたいと思います。動作を保証するものでもサポートされるものでもありませんが。

用意するもの


環境の構築

1.Cygwinのインストール
CygwinのWEBサイトからsetup.exeをダウンロードし実行します。

インストール中に要求されるダウンロードサイトを適宜選択し、パッケージの選択でDevelカテゴリのmakeをインストールする様にする以外はデフォルトのまま進んで構わないでしょう。

しばらくしてインストールが完了したら、ちょっとだけ修正作業をしておきます。windowsのコマンドプロンプトを起動し、以下の通り打ち込みます。
cd c:\cygwin\bin
ash rebaseall -v
この措置を講じておかないと、後々perlの処理に支障をきたします。


2.ARM用gccの準備
こちらのWEBサイトから yagarto-bu-2.20_gcc-4.4.2-c-c++_nl-1.18.0_gdb-7.0.1_20091223.exe をダウンロードおよびインストールします。
デフォルトの設定でインストールを進めて構いません。

3.TOPPERS/ASPカーネルの準備
TOPPERS/ASPカーネルTOPPERS/ASPカーネル簡易パッケージから 「BTC090(ベストテクノロジ)簡易パッケージ」を使用します。
ダウンロードしたファイルをc:\cygwin\home\ユーザー名\ (ユーザー名はWindowsにログインしているユーザ名)に解凍します。
解凍した後のフォルダイメージはこのような感じになっていれば良いはずです。


4.カーネル用コンフィギュレータの準備
TOPPERSカーネルコンフィギュレータよりコンフィギュレータ Release 1.5.0(Windows用バイナリ)をダウンロードし、c:\cyginw\home\ユーザー名\asp\cfg\cfg (ユーザー名はWindowsにログインしているユーザ名)へ解凍します。
同名のファイルがあれば上書きして構いません。

5.書き込みツールとシリアルターミナルの準備
マイコンへのプログラム書き込み用ソフトウェアとしてGCC Developer Liteに付属するFlash WriterとopenOCDを使用します。
その他、プログラムの動作確認をするために汎用のシリアルターミナルプログラムを用意しておきます。GCC Developer Liteに付属のSIMPLE TERMでひとまず事足りるでしょう。

ひとまず必要なファイルの類の準備が終わりました。

TOPPERS/ASPをコンパイルしてみる

1.ユーザーズマニュアル
~/asp/doc/user.txt  がユーザーズマニュアルになっています。必要な情報の大半が記述されているのですが、windowsのメモ帳で開くと文字化けして読めないので、ms wordやもうちょっとインテリジェンスなテキストエディタで参照しましょう。
ここまでの作業は、「3.クイックスタートガイド」の3.1~3.2に記載された内容と同等です。

2.サンプルプログラムのコンパイル
user.txt の「3.3 サンプルプログラムの構築と実行」に記載された手順を追えばコンパイルできる様ですので、順に作業してみます。
Cygwinのコンソールを起動し、以下のコマンドを順に実行します。
cd ~/asp
mkdir OBJ
cd OBJ
perl ../configure -T btc090_gcc
実際の画面はこのような結果になるはずです。

この操作によりコンフィギュレーションが行われます。

特に問題がなければ、最終段階のサンプルプログラムのコンパイルを行います。引き続きCygwinのコンソール上で以下のコマンドを順に実行します。
make depend
make
しかしながら、使用したコンパイラのせいなのか、提供されているファイルがイマイチよろしくないのか、make depend を実行した時点でerrorが発生したと言ってくると思います。


とりあえず動けばOKという事で、~/asp/arch/arm_gcc/at91sam7s/at91sam7s.ldファイルをこちらのもので置き換えて、再度 make depend を実行します。文句は言ってこなくなったので、処理が完了した様です。


それでは最後に make を実行してコンパイルを行います。ずらずらと処理中の状況が表示された後に complete の文字が表示され、~asp/OBJ/asp.exe が作成されていればコンパイルは成功です。


続きCygwinのコンソール上で以下のコマンドを順に実行します。
cd ~/asp/OBJ
arm-elf-objcopy -O binary -S asp.exe asp.bin
これにより ~/asp/OBJ/asp.bin ファイルが作成され、マイコンボードに書き込むためのファイルができあがりました。

マイコンボードで動かす

マイコンボードへの書き込み手段は複数ありますが、ここではJTAGを介して書き込んでみます。
また、サンプルプログラムはDBGUポートを使用してシリアル通信でメッセージを送受信するように作られていますので、SIMPLE TERMを使用して動作を確認してみます。

1.openOCDの起動
GCC Developer LiteはSAM7Sのターゲットを前提としてインストールしてあるものとします。
  • TINY JTAG-ICE2をPCのUSBポートに装着(デバイスドライバのインストール要)
  • BTE077のI/OボードのCN3とTINY JTAG-ICE2のJTAGコネクタをフラットケーブルで接続
  • AT91SAM7S256マイコンボードのCN3とTINY-ICE2のRS232Cコネクタをシリアルケーブルで接続
  • AT91SAM7S256マイコンボードのSW1をSAM-BAとは反対側に切り替え
  • BTE077のI/Oボードに外部電源を接続し、I/OボードのSW1をONにして電源を供給

GCC Developer Liteを起動し、ツールバーから openOCD(SAM7S) をクリックしてopenOCDを起動します(最小化されたコマンドプロンプトがタスクバーに収まっているはず)。もし起動しないようであれば、ケーブルの接続や電源、ドライバのインストール等をチェックしましょう。また、外部からマイコンボードのFLASH書き換えやJTAG接続を使用不能にする設定になっている場合もありますので、その場合はこちらを参照して対処してください。

2.Flash Writerで書き込み
Flash Writerは先ほど出来上がったasp.bin ファイルを openOCD を介してマイコンボードへ書き込みを行うツールです。
GCC Developer LiteのツールバーからFlash Writerを起動します。

起動したFlash Writerのタイトルバー左端にあるアイコンをクリックし、表示されるメニューから「FlashWriter Property」をクリックすると、Flash Writerのウィンドウが拡大します。

ウィンドウが拡大したら、以下の様に設定します。
  • CPU TYPE: openOCD
  • PORT: openOCD
  • Write Script File: at91sam7_bin_flash.script

ちなみにopenOCDが起動していないとPORTのドロップダウンリストにはopenOCDが列挙されません。起動しているにもかかわらず列挙されない場合は「Rescan」とある部分をクリックしてみてください。
また、Write Script Fileのドロップダウンリストには似たような名称のものがいくつも列挙されますが、間違いなく「at91sam7_bin_flash.script」を選択しましょう。
最後にファイルを開くアイコンをクリックして先ほど作成した asp.bin を一番上のテキストボックスに設定します。

これでおそらく書き込む準備が完了したはずなので、「Execute」をクリックして書き込み処理を開始させます。書き込み中はそれにかかる処理の状況を逐一ログウィンドウで表示し、滞りなく成功すればFlash Writerのステータスバーに青色で Successful と表示されます。


3.SIMPLE TERMで動作確認
書き込み処理が成功してさえいれば、書き込み処理終了と同時にマイコン上でプログラムがスタートしているはずですが、マイコンボードの外観からは何らその様子をうかがい知る事ができないのが残念なところです。
~asp/OBJ/sample1.c を眺めると syslog 関数でテキストを吐いているだけで、LEDやブザーの類までを扱っている様には見受けられません。入力は serial_rea_dat でDBGUからシリアルデータを取得してswitch文でなにやら分岐しています。ということで、シリアルターミナルの出番です。
GCC Developer LiteのツールバーからSIMPLE TERMを起動し、SIMPLE TERMのファイルメニューのプロパティをクリックし、表示されるダイアログボックスを以下の様に設定します。
  • Connect to: COM??? (???はTINY JTAG-ICE2のRS232Cで増設されるCOMポート番号)
  • Baudrate: 38400 bps
  • Databits: 8 bit
  • Stopbits: 1 bit
  • Parity: Non
  • Flow Control: Non


ではSIMPLE TERMのツールバーから「指定ポートを開く」ボタン(電話のアイコン)をクリックしてみましょう。「task1 is running (????).」の表示が延々と表示され続けていれば間違いなく書き込まれたプログラムが動いている証拠です。

マイコンボードのリセットボタンを押してプログラムを再起動してみると、実行を開始したことを意味するメッセージの後に、再度「task1 is running (????).」が表示され続けます。sample1.c のソースを眺めながらswitch文で列挙されているキャラクタをSIMPLE TERMのターミナルウィンドウ上で入力してみて、何かしら表示が変化すればなおOKってところでしょうか。


ここでは sample1.c がどういった挙動をするものかまでは説明しませんので、よく眺めた上で遊んでみてくださいね。

それと、今回使用したマイコンボードはAT91SAM7S256という事で、デフォルトで想定しているAT91SAM7S128とは異なっています。両者の違いは内蔵されるメモリのサイズ程度と思えば、メモリの小さいAT91SAM7S128として構築したものをメモリの大きいAT91SAM7S256に書き込んだ所で何ら支障はありません。

at91sam7s/xの起動処理

カテゴリ : 
雑記
2009-12-3 0:35
ずーっと使いながら時々気になっていたことって良くあるものです。別のせいにしてお茶を濁してることもしばしば。at91sam7s/xでも似たようなことがって、あまり手を入れていなかった所に地雷が仕掛けられていました。それがPLLの初期化。
とりあえず現状でも動くのですが、起動させる条件(たとえばデバッガを使っていたりRAMでブートさせるといったと時)によって時折動かない事が起こり得えます。これはCPUの動作クロックを設定する部分に起因していて、フラグが意図通り変化しない場合に陥ります。openocdがガンガンバージョンアップしていく過程で明らかになった部分で、アセンブラであったこともあり気付くのに時間を要してしまいました。
GCC Developer Lite本体のWindows Vista/7対応レベルの向上、sam7s/xのx64環境でのUSBシリアルエミュレーションドライバ対応、sam7s/xのRAMデバッグ環境の見直し、FDIIIライブラリのバグフィクスと合わせて近々更新する予定です。

at91sam7s/xのボーレート

カテゴリ : 
雑記
2009-10-29 5:42
現在AT91SAM7S/Xシリーズ向けのシリアル通信ライブラリにおいて、USARTのボーレートは粗めの分解能でしか設定出来ません。特段理屈は無かったのですが、確かに高いボーレートになると合わせにくい所でもあります。
次のGCC Developer Liteのアップデート時にUSARTのSampling Divider関連は全て16から8に変更されますので、従来よりも倍の精度でボーレートが設定できるようになります。
なお、FDIII-HCにおいてもボーレートが全域においてDynamixelと一致しますので、666k,500kbpsといった最大速度に対して若干遅めのボーレートにも対応できるようになります。

それと、ボーレートついでに。
しばしば問い合わせのあるPCとDynamixel間の無線化は、特に特殊な事をせずともFDIII-HCを使用する事で実現できます。USB接続のみのDnamixelコンフィギュレータをFDIII-HCに置き換えるだけで、Bluetoothによる無線化が簡単に行えます。その場合FDIII-HC用に専用のプログラムを作る必要はありませんし、USBケーブルで有線、Bluetoothで無線といった具合に必要に応じて自由に使い分ける事もできます。もちろんPC上のソフトウェアの資産はそのままで、接続先に応じたCOMポート番号を変えれば良いだけ。
ちなみに、FDIII-HCではBluetoothのDTE速度を460.8kbpsとしていますので、無線化したとしてもリアルタイム性は別としてそこそこのスループットは得られるかと思います。

回路の準備ができたので、いよいよプログラム。まずはGCC Developer Liteをインストール。コンパイルオプションは「DYNAMIXEL Library for ATmega128 USB I/O」を選択(このGDLのバージョンは2.2.0.44)。GDLのバージョンによっては違う名前のこともあるが、「DYNAMIXEL」と「ATmega128」の2つの単語が入っている設定を使えばOK。
 

この設定にすることで、予め用意されているAX/DX(RXも)ライブラリをそのまま利用することができる。0から自分で用意する選択肢もあるが、今回は面倒なのでパス。また、別マイコンでAX/DXモータを使う場合も、ライブラリの中身を参考にするのが楽かも。

 


基本になるプログラムはこんな感じ。ただし、これだけだと何もしないので焦って「動かない!」と思わないよ~に。
 


トルクイネーブルまでを加えたのがこのプログラム。正しく動作すれば、AX-12+モータが現在位置で保持されるのでわかるはず。ここまでできれば、後は位置制御やら無限回転やら思いのままだ!

ということで今回はここまで。