ブログ - 最新エントリー

ARGOS CHALLENGEの試走会がフランスのポーで始まりました。
隣はもうスペインといったロケーションからか、初日はTシャツ1枚で十分。

我がチームの新型は足回りだけでもという事で、急あつらえの頭を装備。
とはいえ非常停止やら遠隔停止等々強いられる事はかなり多く。




必用な装備を概ね備えた従来機によるバックアップ体制も万全。
各チームに割り当てられた時間は多くないので、いそいそと保安チェックを済ませ現場へGO。


足場にしか見えませんが、これでも立派な消防訓練の設備。
ここで実証実験をします。


わ~高い


juryの皆さんの厳しい目が・・・。


これから4日間で精度の良いポイントクラウドの収集・オドメトリエンジンの検証・画像処理・音響分析などなど、時差に負けないようめいっぱいやりますよ。

コーディネータ

OpenOCDとLPC82x

カテゴリ : 
その他 » 備忘録
2015-4-1 18:00
最近のOpenOCDはCMSIS-DAPを活性化してあり、LPC-LINK2CMSIS-DAP化したものが使えるので、LPC82xもOpenOCDから触れるという事になる。
既存のlpc8xx.cfgはワークエリアの指定が小さいので、そこだけ変えたlpc82x.cfgを使ってほしい。
openocd -s ./tcl -f daemon.cfg -f interface/cmsis-dap.cfg -c "adapter_khz 1000" -f target/lpc82x.cfg
GCC Developer Liteに同梱されるFlash Writerはデーモン化させたOpenOCDとお話しできるので、Flash Write用にスクリプトさえ用意すればこちらも1クリックで書き込みできたりする。
init
adapter_khz 1000
reset init
flash erase_sector 0 0 31
flash write_image erase unlock ($PGENE) 0 bin
dump_image ($PGENETMP) 0x0 ($PGENESIZE)
#verify_image ($PGENE) 0 bin
reset run
exit
GCC Developer Liteでサポートされるのはもうすぐかな?

技術

CoFlashとLPC824

カテゴリ : 
その他 » 備忘録
2015-3-10 13:54
NXP LPC824のフラッシュメモリへの書き込みを行う場合、LPCXPressoのデバッガを介してLPC-Link 2で書き込むか、標準で内蔵されているブートローダを使用してシリアルポートから書き込む(ISP)方法がある。
前者は統合環境が必要、後者はUSARTの端子が決め打ちされいる、といった感じでどちらもお気楽感がない。

分身を沢山あつらえたいとなると、ライセンスやら操作手順やらが野暮ったい事も多い。そこで白羽の矢が立ったのがCooCoxCoFlashである。

CoIDEは色々なデバイスに対応しているのとフリーの統合環境という事も合って結構使われている方も多いがと思うが、CoFlashもフリーかつシンプルな書き込みツールで対応するICEも結構多い。

今回はデフォルトではCoFlashがサポートしていないLPC824を、LPC-Link 2を使って書き込めるようにしてみた。その手法が開示されているのと、LPC11xxシリーズと互換性があるので、そのままソースを流用すれば結構さくっとイケる。

詳しくは修正したソースをここに置いておくのでそれを見てもらえればと思うが、違いはセクタサイズやページサイズ程度である。ついでにページ書き込みのルーチンの中で書き込み後にコンペアを行った上で応答を返しているので、ツール上でベリファイを指定しなくても良い筈。
同梱のファイルをCooFlashをインストールしたフォルダにt適宜コピーすればDeviceツリーのNXPにLPC822とLPC824が追加される。後はSWDからガシガシ書き込むだけである。

なお、LPC-Link 2CMSIS-DAPのファームを書き込んだ物を使用する事。

技術

GCC Developer Liteの更新は?

カテゴリ : 
雑記
2015-1-13 15:00
新しもの好きの作者の割には、パブリック向けの更新が滞っている様です。
カスタムターゲット向けのパッケージはそこそこ更新されていますが、ツール類は特段変わった様子も無く枯れたままだったり。

そんな中、作者より更新の案内がありました。
ソースの編集は1ファイルに限定している事もあって有用性は無いと判断し、公には活性化されていないタグジャンプ機能を、今後のリリースでは使えるようにするらしく。

既にターゲットによってはサポートファイル類が肥大化しており、それらを使用する場合はソースやヘッダファイルを参照せざるを得ない状況です。
また、シングルソースであっても、長大であれば短期記憶をアテに自分のソースを移動するのは骨が折れますし、数日もすればおぼろげな記憶のレイアウトはアテにならなくなってくるでしょう。

Eclipseをはじめ、最近のIDEの類はプロジェクト中のファイルを解析して、編集作業をしやすくする機能が当然の様に備わっています。
GCC Developer Liteは単なるテキストエディタと称している割に、そこそこ中途半端に変な機能が備わってはいますが、広大なソースファイル類を手に取る様に見渡す事はできません。

これらから、タグジャンプ機能の公開が迫られていたという背景がありました。

今回の機能解放では、外部のコマンドを併用してソースファイル中の単語の関連性を簡易的に調べて、宣言されている場所を渡り歩く事ができる様になります。

タグファイルが生成されてさえいれば、カーソル位置の単語をタグファイルから検索させ、その単語を含むソースファイルの該当位置へジャンプ(タグジャンプ)させる事ができますし、ジャンプした履歴を逆に辿る事もできます。

背反事項として、設定によってはタグファイルのサイズがソースファイルのサイズとは関係なく大きくなる事がありますが、ハードディスクもSSD化が進み速度的に有利な環境が整いつつあるので、本ツールを活用されている方向けに活性化する事としました。

ちなみに、ゼロからプログラムを書き進める時よりも既存のソースファイルを読み進めるための機能なため、とりあえずは大きめのサイズになりがちのFDIII-HCやUD3のサンプルプログラムを読むには良いでしょう。

近々公開されるであろう更新版では、この機能が活性化していると思います。

技術

ROM API

カテゴリ : 
雑記
2014-12-26 18:00
NXPのMCUにはROM APIなる機能が備わっている物がある。内蔵ROM上にいろいろなルーチンが予め書き込まれているので、そのルーチンを使えばFLASHメモリ上にそれらの機能を別途作り込む必要が無いという事の様だ。

トラ技の付録だったLPC810の様に、FLASHの容量が少ないデバイスではこのROM APIの恩恵に与る事も多いはず。UART・I2C・SPI・ADCといったペリフェラルは、ROMに用意されたルーチンに任せる事でFLASHの容量を消費せずに利用できるという物。

特にROM APIの中でありがたいのが割り算で、ソースに「/」や「%」を使ったとたんに数キロバイトしかないFLASHの大半をライブラリが占めてしまうのを解消してくれる。
使い方はマニュアルに書いてあるが、何やら特定の環境を前提としている様でよく分からないので、今回はたぶん公知の情報でしょうがLPC82xを前提としてちょっとだけ簡単に使える方法を備忘録として書いておく。
概ねAPIの名称はマニュアルの記述を踏襲しつつ、まずはAPIへの入り口を作る。APIの呼び出しにいちいち変数なんぞ作って初期化して使うのは野暮ったいので直接アドレッシングで。
typedef struct { int quot; int rem; } idiv_return;
typedef struct { unsigned quot; unsigned rem; } uidiv_return;

typedef struct {
  int (*sidiv) (int numerator, int denominator);
  unsigned (*uidiv) (unsigned numerator, unsigned denominator);
  idiv_return (*sidivmod) (int numerator, int denominator);
  uidiv_return (*uidivmod) (unsigned numerator, unsigned denominator);
} TLPC_ROM_DIV_STRUCT;

typedef TLPC_ROM_DIV_STRUCT *pTLPC_ROM_DIV_STRUCT;

typedef struct {
  const uint32_t p_dev1;
  const uint32_t p_dev2;
  const uint32_t p_dev3;
  const uint32_t p_dev4;
  pTLPC_ROM_DIV_STRUCT pROMDiv;
  const uint32_t p_dev6;
  const uint32_t p_dev7;
  const uint32_t p_dev8;
} TROMAPIs;

#define LPCAPI (*(TROMAPIs **)(0x1FFF1FF8UL))
#define LPC_DIV_API ((LPCAPI)->pROMDiv)
これらの宣言をしておけば後は使うだけ。
割り算をしたければ、
int ans, numerator, denominator;
ans = LPC_DIV_API->sidiv (numerator, denominator);
// ans = numerator / denominator;
余りが欲しければ、
int ans, numerator, denominator;
ans = LPC_DIV_API->sidivmod (numerator, denominator).rem;
// ans = numerator % denominator;
それすらも野暮ったかったら、gccであれば
int __aeabi_idiv (int numerator, int denominator) {
return LPC_DIV_API->sidiv (numerator, denominator);
}

unsigned __aeabi_uidiv (unsigned numerator, unsigned denominator) {
return LPC_DIV_API->uidiv (numerator, denominator);
}

idiv_return __aeabi_idivmod (int numerator, int denominator) {
return LPC_DIV_API->sidivmod (numerator, denominator);
}

uidiv_return __aeabi_uidivmod (unsigned numerator, unsigned denominator) {
return LPC_DIV_API->uidivmod (numerator, denominator);
}
としておけば、「/」やら「%」を使用するとリンクされる除算のライブラリ自体を置き換える素地となる。

割り算に限らずペリフェラルを扱うAPIもこの様なマクロを介して呼び出せるので、お気楽感が増すでしょう。

LPC8xxのボーレート

カテゴリ : 
雑記
2014-12-11 18:46
NXP LPC824と戯れているウチにボーレートの設定に疑問が出てきてしまった。

LPCXpressoはサンプルやライブラリも一緒に提供してくれるのでお気楽なのだが、いかんせんXpresso MAX用の設定がわんさとあって自前のものに移管させる際に結構ハマる。
普通LPCOpenのライブラリを使ってくれる事を期待しているのだろうと思い、それを無意識に使うと案の定といった感じ。とは言うもののソースがあるので、十分追うことは可能だし複雑怪奇な物は特に無いので素直にデータシートと見比べれば良いまでである。

そいでもってシリアル通信だが、やっぱり半二重や1Mbpsはさくっと出来て欲しいなぁと思って色々試したお話を。

端子はSWMまかせで好き勝手に割り当てられるのでよしとして、USARTの初期化とボーレートの設定はサンプルのまんまでも何ら問題はない。OETA|OESEL|OEPOLは半二重I/Fのバス制御にRTS端子を使う際に追加している。
#define _BAUDRATE	115200
Chip_UART_Enable (LPC_USART0);
Chip_UART_ConfigData (LPC_USART0,
UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1 | UART_CFG_OETA | UART_CFG_OESEL | UART_CFG_OEPOL);
Chip_Clock_SetUSARTNBaseClockRate (_BAUDRATE * 16, true);
Chip_UART_SetBaud (LPC_USART0, _BAUDRATE);
後はボーレートを好きな値にすれば良い筈だが、ボーレートジェネレータがインテリジェンスなのは分かるが1Mbps以下でしか誤差率を吸収してくれないし、Chip_Clock_SetUSARTNBaseClockRate に指定しているボーレートに対する *16 なんてデータシートまともに読まないと怪しい倍数にしか思えない。

結局の所、昔ながらの明確な指定をしようとするのであれば、ライブラリを使わずに自前でレジスタを叩いた方が素直というのはどこの世界も同じ。今回は1Mbpsにしたいだけだったので、クロックを16MHzの倍数にし、予め div と mul を固定し、BRGに好きな値を入れるという方針にした。
まず sysinitほげほげ.c の中の Chip_SetupIrcClocking でPLL設定しているとこを
Chip_Clock_SetupSystemPLL(7, 0);
Chip_Clock_SetSysClockDiv(3);
てな感じにすればオーバー気味だが fclkout=96MHz, sysclk=32MHz になる。
後はUARTの初期化時に
Chip_Clock_SetUSARTNBaseClockRate ((2000000 * 8), true);
LPC_USART0->OSR = 7;
としておけば良いかな。ボーレートは
uint32_t setbaudrate (uint32_ baudrate) {
  LPC_USART0->BRG = (Chip_Clock_GetUSARTNBaseClockRate () / (8 * baudrate)) - 1;
  return (Chip_Clock_GetUSARTNBaseClockRate () / (_OSR * (LPC_USART0->BRG + 1)));
}
で決めてみてはどうでしょう。今回はOSRをデフォルトの16から8にしたが、この辺は必要に応じて変えればOK。
これで2M,1M,666k,500k[bps]といったどこかで見た様な値が選べる。

技術
PROシリーズはMXシリーズやAXシリーズとは異なる通信プロトコル(V2.0)で運用され、従来(V1.0)との相互互換性は無い。また、XL-320もPROシリーズと同類だが、完全互換でもない。
V1.0 Status Packet

V2.0 Status Packet


PROシリーズは扱うアドレスやデータのサイズが大きくなっている都合、自ずとパケットの構成要素のサイズが大きい。
そういった面からV2.0ではチェックサムはCRCになり、最大通信速度が10Mbpsに上がっているので、ハード同様に多少なりとも堅牢で応答性の良い環境にはなっている。

それとは別に、V2.0の通信プロトコルにおいて今まで指摘されなかった事を良い事に、仕様と実態が異なる事をライブラリ内でクローズしていた。
実際にはステータスパケット中のErrorはV1.0と同じ挙動をしているが、本来はそれとは異なるものとしている。

プロトコルの処理を独自に組み込んで使用する際は、現時点では「とりあえず」ErrorはV1.0と同様に各要因がビットアサインされているものとして処理してもらう他ない。
最終的にどのように修正されるかは流動的だが、V2.0の仕様に合わせたファームウェアの改修で対処する方針の様なので、いずれ変更せざるを得ない事をお忘れ無きよう。

技術

DYNAMIXEL PROシリーズ

カテゴリ : 
その他
2014-11-14 18:00
ちょくちょくご用命いただくPROシリーズ。一番小型のタイプでこのサイズ感です。

コストよりもバックラッシュや分解能、耐久性が優先といった場合のみ選択肢としてお考え下さい。また、通信プロトコルや電源仕様は従来のDynamixelシリーズと異なります。

以下のラインナップは全て取り寄せ品扱いとし常備在庫品としていませんので、ご用命の際はこちらからお問い合わせ下さい。

Name Output Dimension(mm) Weight(g) Price
DYNAMIXEL PRO H54-200-S500-R 200W 54x54x126 855 ¥301,320
DYNAMIXEL PRO H54-100-S500-R 100W 54x54x108 732 ¥279,720
DYNAMIXEL PRO H42-20-S300-R 20W 42x42x84 340 ¥160,920
DYNAMIXEL PRO M54-60-S250-R 60W 54x54x126 853 ¥182,520
DYNAMIXEL PRO M54-40-S250-R 40W 54x54x108 710 ¥171,720
DYNAMIXEL PRO M42-10-S260-R 10W 42x42x72 269 ¥85,320
DYNAMIXEL PRO L54-50-S500-R 50W 54x54x108 662 ¥106,920
DYNAMIXEL PRO L54-50-S290-R 50W 54x54x108 656 ¥106,920
DYNAMIXEL PRO L54-30-S500-R 30W 54x54x108 612 ¥96,120
DYNAMIXEL PRO L54-30-S400-R 30W 54x54x108 591 ¥96,120
DYNAMIXEL PRO L42-10-S300-R 10W 42x42x72 257 ¥63,720

技術

SP360 Extreme Pack

カテゴリ : 
雑記
2014-11-13 18:18
カメラをカメラで撮影する事のもの悲しさ。


ハウジングやマウントやらも必要だったのでExtreme Packで。

しかしLiveで見るにはスマホかWifi経由だけなのはこれいかに。
とりあえず今日はここまで。

NXP lpc82x

カテゴリ : 
雑記
2014-11-6 17:29
トラ技の付録だったLPC81xの上位版、LPC82xシリーズ
ピンコンパチじゃないので注意が必要だけど、 新しくA/Dコンバータが内蔵されたので楽しげな用途が。

TSSOP20なので変換基板つかえば工作も簡単、楽しそうです。

LPCXpressoを使えばエディタ・コンパイラ・デバッガ、それとサンプルも一切合切ついてこれ一つで完結するので楽ちん。


このデバイスはスイッチ・マトリックスで任意の端子にペリフェラルを割り当てられる(一部の機能を除く)ので、PLDやFPGAの様に最短経路で周辺回路とつなげられるのがヨサゲです。
ウェブ上で設定できるので、モノが無くてもどんな感じか垣間見る事ができます。


それと、タイマの機能をステートフローで記述できるのもおもしろい。