ブログ - 最新エントリー

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の様に最短経路で周辺回路とつなげられるのがヨサゲです。
ウェブ上で設定できるので、モノが無くてもどんな感じか垣間見る事ができます。


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

Edison

カテゴリ : 
雑記
2014-10-28 17:31
巷ではEdisonがちらほらと見受けられるように。


WiFiもBluetoothもメモリも装備されてOS入り。こんなサイズに収まってくれるとやること無いですな。
懐かしいx86互換のV25ボードを引っ張り出して並べてみました。Turbo Cが使えるのかな?んなわきゃないか。



初回ロットはコンソールの取りこぼしやら諸々イラッとするので、さらっとアップデートしましょう。

800mm光センサ復刻?

カテゴリ : 
新商品
2014-10-20 13:00
使用パーツの製造終了に伴い廃盤になってしまった800mm光センサ
この類のセンサの民生用途が少なくなった事が終了の主因ですが、ちょっとだけ長距離にあるモノを簡易的に検出したいといったニーズはまだあるわけでして、廃盤は我々としても残念でなりませんでした。

なんとかして代替品をと計画しておりましたが、ようやく同等レベルの代物が用意できそうな段階になってきました。ロボット相撲の時期からはかなりズレてしまいましたが、近々代替品として紹介できると思います。
なお、旧来のシャッターによる感度調整機能は無し、コネクタではなくケーブルを装備というスタイルになるかと思います。



技術

Status Return Levelの復帰

カテゴリ : 
Dynamixel
2014-8-26 10:30
Dynamixelはシリアル通信でホストとコミュニケーションを行いますが、そのコミュニケーションを設定によって容易に阻害する事ができてしまいます。そのアイテムはStatus Return Levelでして、デフォルトは2なのですが、0にすると通常のコミュニケーションは一切できない様に見せかけられてしまいます(唯一Pingパケットには応答します)。
この設定は不揮発領域に配置されており、電源を入れ直しても自動的に元に戻る事はありません

ということで、アクチュエータ系のDynamixel前提ですが、Status Returl Levelのリカバリ用プログラムを作ってみました。
ツクリは単純でして、ボーレートを順次変えながらPingで検索し、見つかったidに対してReadが失敗したらStatus Return Levelが0になっていると仮定し、強制的に2で上書きするといったものです。

#include <stdio.h>
#include <conio.h>
#include "dxlib.h"

#define OFFSETTIME  (50)  // タイムアウトオフセット[ms]

void main (void) {
  TDeviceID   dev;
  char        inputcomport[10], mycomport[20]="\\\\.\\";
  int         bdiv=-1, baud, i, yn;
  uint16_t    val16;
  uint8_t     val8;

 printf ("input com name=");
  gets (inputcomport);
  printf ("use [%s]\n",inputcomport);
  strcat (mycomport, inputcomport);

  if ((dev = DX_OpenPort (mycomport, 3000000))) {
    DX_SetTimeOutOffset (dev, OFFSETTIME);
    printf ("Open success\n");
    for (bdiv=-1;bdiv<250;bdiv++) {
      // ボーレートの変更
      if (bdiv >= 0) DX_SetBaudrate (dev, (baud=2000000 / (bdiv + 1)));
      else           DX_SetBaudrate (dev, (baud=3000000));
      printf("\rbaud=%7d ",baud);

      uint32_t num = 253;
      TDxAlarmStatus stat[255];
      // Ping2で検索
      if (DX_Ping2 (dev, &num, stat, NULL)) {
        printf ("%d device found\n", num);
        // 検索で見つかったデバイスを列挙
        for (i = 0; i < num; i++) {
          // アドレス16(Status Return Level)を読み出し
          if (DX_ReadWordData (dev, stat[i].id, 0, &val16, NULL)) {
            printf ("Found ID=%d stat:$%04X modelno:$%04X\n", stat[i].id, stat[i].Status, val16);
          } else {
            // 読み出しに失敗したらおそらくStatus Return Levelが0だろう
            printf ("Found ID=%d stat:$%04X modelno:???? \n", stat[i].id, stat[i].Status);
            printf ("Do you want to reset Status Return Level ? (y/n)->");
            yn = getch ();
            putch( yn);
            if (yn == 'y' || yn == 'Y') {
              printf ("\nupdate....");
              DX_WriteByteData (dev, stat[i].id, 16, 2, NULL);
              Sleep (800);
              if (DX_ReadByteData (dev, stat[i].id, 16, &val8, NULL)) {
                if (val8 == 2) printf ("success\n"); else printf("fail\n");
              } else printf ("fail\n");
            } printf ("\n");
          }
        }
      }
    }
    DX_ClosePort (dev);
  } else {
    printf ("Open error\n");
  }
}
DXLIBを使っていますので、コンパイルにはGCC Developer Liteを使用したコンパイルの方法を参考にしてください。

また、コンパイルが面倒といった場合は、ちょっとイリガルな方法ですがDXCONFを使って書き換える事もできます。
Status Return Levelが0でもPingには応答するため、スキャンすると以下の様に???(不明なデバイス)として列挙されます。


通常であれば、該当デバイスをクリックする事で右半分に表示されるコントロールテーブルがそのデバイスに応じて切り替わるのですが、不明なデバイスの場合はこの画面キャプチャの様に5個のアイテムのみの表示になってしまい、値自体も不定となります。
ではこのコントロールテーブル上にマウスカーソルを置き、右クリックしてください。ポップアップメニューが表示されますので、もしデバイスの型式がわかっているのであれば、この中から該当するデバイスを選択します。


選択したデバイスに応じた コントロールテーブルの表示に切り替わりますので、その後強制的にNo.16 Status Return Levelを2に変更します。処置後は全ての通信ができるようになる筈です。


お試しください。

技術

Digitus STM32F3用ブートローダ

カテゴリ : 
新商品
2014-8-20 13:34
Digitus STM32F3用ブートローダの情報が不完全でしたので本日補完しました。
STM32F3 Bootloader
ST社のDfuSeというツールを使えばUSB経由でチップのフラッシュへ書き込む事ができますが、その前にBOOT0端子(CN2-38)を3.3V端子(CN1-2)につないでからUSBケーブルを接続してください。

技術

DXLIB V3.0公開

カテゴリ : 
Dynamixel
2014-6-11 15:06
Dynamixel Library Version 3.0を公開しました。

既にいくつかのソフトウェアには導入済みですが、DXLIB2(XLやProシリーズの新プロトコル用API)の機能拡張に伴い、パラメータの互換性を保つためDXLIBも修正を施しました。
主な変更点は以下の通りです。
  • アドレス指定を8bitから16bitに変更
  • 不明瞭だったTDxAlarmStatus構造体のアライメントを1バイト境界に固定
  • 似非ReadSync APIを追加
  • 不定なDevice IDを指定された際のクラッシュを簡易的にブロック
  • dllのソースをC++に
  • API引数の変更に伴い各サンプルを修正
  • LabVIEWのサンプルを大幅に拡充
  • EXCELのVBAを64bitに対応
特にLabVIEWから制御する際の使い勝手を向上させたのと、サンプルプログラムを増やしました。特定のアイテムへのアクセスを対象としたviは、ループ中に適用しても不用意にトラフィックを上げない様な仕掛けや、LabVIEWのイベントストラクチャを多用したり、ダイナミックなポートの開閉等、そこそこがんばってみました。

PCから直接制御する際の参考にして下さい。

技術