ブログ - 最新エントリー

フォトインタラプタ

カテゴリ : 
新商品
2012-6-18 15:53
フォトインタラプタの検出スピードをもう一桁速くしたいといった要望に応えようと、ちまちま実験していたら半年過ぎてしまったorz。

とりあえず従来と外形は変えて2カ所の取付穴を設けたら、ディスクリートという事もあり建蔽率上がりまくり。コネクタを800mmセンサと共通にしたら日照権の争いに。結局発光量を調整するポテンショは廃止。


センサ素子は一体型なんだが、焦点距離が5mmぐらいに合っているので、条件にもよるが検出対象とのギャップが最大でも20mm程度に。


その代り、出力の多機能化を考えており、単純なインタラプタとPWM出力、論理反転のモードを装備してみようと。
開発部

毛色を変えて

カテゴリ : 
雑記
2011-12-20 14:11
LANとUSB機能を標準で提供しているシステムデザイン社のSDLX1100をちょっとだけ紹介。

メインのモジュールはRX62Nとphy及びRJ45のコネクタが搭載されて52x33.5mmとなかなか小型。オリジナルでシンプルなOSが予め搭載されているので、プログラムはHEWを使ってAPI呼ぶだけで相当シンプルに作れちゃう。


拡張基板にはUSBコネクタやLDC・タッチパネル・オーディオアンプなどなど装備されており、これだけでちょっとしたサーバーなんぞはちゃちゃっと構成できてしまう。


特にという事でも無かったので触れてなかったRXシリーズ。知らぬ間にリソースが盛りだくさんになっていておなかいっぱい。
STM32F205上でTOPPERSを動かそうと思ったら、ターゲットにSTM32F205が見つからなかったので、新規に作成することにしました。
TOPPERS/ASPの導入については過去のブログを参考にしています。TOPPERSのバージョンは最新の1.7にしました。

使ったもの

環境の構築

1.Cygwinのインストール

CygwinのWEBサイトからsetup.exeをダウンロードして実行しました。インストール方法は簡単なのでここでは省きます。

2.TOPPER/ASPカーネルの準備

TOPPERS/ASPカーネル簡易パッケージからLM3SXXXX簡易パッケージのasp_lm3sxxxx_gcc-20110801.tar.gzをダウンロードして、c:\cygwin\home\ユーザー名\ (ユーザー名はWindowsにログインしているユーザ名)に解凍しました。c:\cygwinはCygwinのインストールフォルダです。C:\cygwin\home\ユーザ名フォルダはCygwin端末ログイン時のホームディレクトリになります。
コンフィギュレータは実行モジュールが用意されていますので、このまま使用します。

3.書き込みツールの準備

STEVAL-PCC010V2にはJTAGコネクタが用意されているので、TINY JTAG-ICE2を使用することにしました。これでプログラムの書き込みソフトウェアとしてGCC Developer Liteに付属するFlash WriterとopenOCDが使用できるようになりました。

TOPPERS/ASPのコンパイル

取りあえずSTEVAL-PCC010V2で動くことを確認したいので、プログラムはLEDの点滅程度の機能とします。

1.ユーザーズマニュアルを確認します

ユーザーズマニュアルはc:\cyginw\home\ユーザー名\asp\doc\user.txtですが、EUCコードとなっているためEUC対応エディダで開きます。基本は以前のバージョンと変わっていないようです。

2.サンプルプログラムのコンパイル

Cygwinのコンソール画面を起動したら、perlコマンドを実行します。が、ユーザプログラムと必要なファイルを作成しているだけなので今回はsampleフォルダを使用することにして実行しません。
次にコンパイラですが、gccはGCC Developer Liteを使用するので、Cygwinユーザのホームディレクト配下の.bashrcファイルのPATH変数に以下の通り追加しました。インストール先を変更していた場合は変更したフォルダを指定して下さい。
export PATH=${PATH}:"/cygdrive/c/Program Files/BestTech/GCC Developer Lite/GCC/ARM/bin"
依存関係ファイル(Makefile.depend)は何に使用しているか不明だったので、makeだけ実行することにします。が、当然の如くエラーが発生しました。コンパイルの前に色々と準備が必要のようです。

3.ターゲットの作成

最初に、target/lm3sxxxx_gccフォルダをstm32f205_gccに変更します。変なフォルダ名ですが、決まり事なので従いましょう。stm32f205_gccをターゲット依存部と呼びます。doc/porting.txtの「2.システム構築環境のターゲット依存部」に詳細な記述があります。
名称変更したらのターゲット依存部の修正開始です。
まずはヘッダファイルから。
lm3sxxxx.hをstm32f205.hに名前変更し、TMAX_INTNOを15+80に変更します。
lm3sxxxx.hをインクルードしていたヘッダファイルは全てstm32f205.hに書換え、余分なインクルード文(inc/hw_ints.h等)も削除します。更にtarget_syssvc.hのTARGET_NAMEをSTM32F205に変更した後、taget_timer.hのTIMER_CLOCKを(120000)に設定します。今回は動けば良いのスタンスであるため、値の精査をしていません。TIMER_CLOCKはTOPPERSカーネル内で時間用に使用しているようなので、想定時間と違っていたらここを修正します。
修正したヘッダファイルはtarget_timer.h/target_serial.h/target_config.h/target_syssvc.hです。
次にtarget_config.cを修正します。
こちらも余計なインクルード(inc/hw_ints.h等)を削除し、target_initialize関数からコア依存の初期化以外を削除します。core_initialize関数の呼出し前にクロックの初期化を追加します。ざっくりと記載します。
レジスタ等の詳細はSTMicroelectronics社さんからダウンロード可能なリファレンスで確認して下さい。

#define RCC_CR        (*(volatile uint32_t *)0x40023800)
#define RCC_PLLCFGR (*(volatile uint32_t *)0x40023804)
#define RCC_CFGR (*(volatile uint32_t *)0x40023808)
#define RCC_CIR (*(volatile uint32_t *)0x4002380C)
#define FLASH_ACR (*(volatile uint32_t *)0x40023C00)
#define PLL_M 25
#define PLL_N 240
#define PLL_P 2
#define PLL_Q 5
/* 初期化部分 */
volatile uint32_t _up_cnt = 0, _hse_stat = 0;
RCC_CR |= (uint32_t)0x01;
RCC_CFGR = 0x0;
RCC_CR &= (uint32_t)0xFEF6FFFF;
RCC_PLLCFGR = 0x24003010;
RCC_CR &= (uint32_t)0xFFFBFFFF;
RCC_CIR = 0x00000000;
RCC_CR |= ((uint32_t)0x00010000); // enable HSE
while (!(RCC_CR & ((uint32_t)0x00020000)) && _up_cnt++ < (0x0500)); // HSE ready
if (RCC_CR & ((uint32_t)0x00020000)) { // not timeout
RCC_CFGR = (RCC_CFGR & ((uint32_t)0xFFFFFF0F)); // SYSCLK not divided
RCC_CFGR = (RCC_CFGR & ((uint32_t)0xFFFF1FFF) | ((uint32_t)0x00008000)); // PRPRE2 AHB clock divided by 2
RCC_CFGR = (RCC_CFGR & ((uint32_t)0xFFFFE3FF) | ((uint32_t)0x00001400)); // PRPRE1 AHB clock divided by 4
RCC_PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | ((uint32_t)0x00400000) | (PLL_Q << 24);
RCC_CR |= ((uint32_t)0x01000000); // main PLL enable
while (!(RCC_CR & ((uint32_t)0x02000000))); // PLL ready
FLASH_ACR = ((uint32_t)0x00000703);
RCC_CFGR = (RCC_CFGR & (uint32_t)((uint32_t)0xFFFFFFFC) | ((uint32_t)0x00000002)); // PLL used as the system clock
while (RCC_CFGR & ((uint32_t)0x0000000C) != ((uint32_t)0x00000008));
}
最後にtarget_fput_log関数がありますので、内容を削除して空の関数とします。
次はMakefile.targetの修正です。
セグメントの開始アドレスを追加したらlm3sxxxx用の記述を削除して、stm32f205用に書き換えるだけです。大した修正ではないので詳細は省きます。
次にリンカスクリプトを作成します。今回はstm32f205.ldとしました。Makefile.targetにもそのように記述します。
リンカスクリプトについては出力セクション.textと.rodataはFLASHに配置します。出力セクション.textには.vectorセクションと.textセクションを配置します。出力セクション.rodataには.rodataセクションを配置します。
SRAMに出力セクション.dataと.bssを配置すれば完成です。MEMORY領域の設定はリファレンスで確認して下さい。
続いてsampleフォルダ内の修正です。
今回使用するSTEVAL-PCC010V2はシリアルが外部へ接続されていないので使用することができません。そのため、今回はsyslog関連を使用しないことにしました。
sample/Makefileから以下のファイルを使用しないようを修正します。システムサービスに関する定義のSYSSVC_COBJSに記述があります。
target/stm32f205_gcc/target_serial.c
syssvc/banner.c
syssvc/logtask.c
syssvc/serial.c
syssvc/syslog.c
syssvc/vasyslog.c
他の修正点はTARGETの変更、CFLAGSに-DTOPPERS_OMIT_SYSLOGの追加になります。
-DTOPPERS_OMIT_SYSLOGはカーネル側でもsyslogを使用しており、これを抑止するためのフラグです。
ターゲットファイルをall: $(OBJFILE)よりall: $(OBJNAME).binに変更したらMakefileの修正は完了です。
次にsample1.cfgの編集です。
syslogを使用しないことにしたので、syssvc配下のcfgファイルのINCLUDE文を削除します。
最後にsample1.cの修正です。
まず使用できない部分を削除します。syslog_msk_log関数を使用している最初のSVC_PERRORと、シリアルポートの初期化部分です。タスクについては今回起動しませんので励起しているact_tsk関数部分を削除します。task関数自体を削除する場合はsample1.cfgの修正を行ってください。メインループを空にしたら後は追加です。
STEVAL-PCC010V2のLEDはPE2とPE3に接続されていますので、まずはmain関数の最初に初期化を追加します。
#define RCC_AHB1ENR   (*(volatile uint32_t *)0x40023830)
#define GPIOE_MODER (*(volatile uint32_t *)0x40021000)
#define GPIOE_OTYPER (*(volatile uint32_t *)0x40021004)
#define GPIOE_OSPEEDR (*(volatile uint32_t *)0x40021008)
#define GPIOE_PUPDR (*(volatile uint32_t *)0x4002100C)
#define GPIOE_BSRR (*(volatile uint32_t *)0x40021018)
/* 初期化部分 */
RCC_AHB1ENR |= ((uint32_t)0x00000010); // port E clock enable
GPIOE_MODER = ((GPIOE_MODER & 0xFFFFFF0F) | (uint32_t)0x050); // PE2/PE3 output
GPIOE_OSPEEDR = ((GPIOE_OSPEEDR & 0xFFFFFF0F) | (uint32_t)0x0F0); // PE2/PE3 100MHz
GPIOE_OTYPER = (GPIOE_OTYPER & 0xFFFFFFFB);
GPIOE_PUPDR = (GPIOE_PUPDR & 0xFFFFFFFB);
更にメインループでLEDの点灯と消灯を行います。
#define LED1          0x0004
#define LED2 0x0008
/* メインループ */
while (1) {
GPIOE_BSRR = ((GPIOE_BSRR & 0x0000FFFF) | ((LED1 << 16)));
tslp_tsk (500);
GPIOE_BSRR = ((GPIOE_BSRR & 0xFFFF0000) | (LED1));
tslp_tsk (500);
}
メイン以外の関数は変更しません。これでmakeが通るようになりました。

 

マイコンボードで動かす

STEVAL-PCC010V2はJTAGコネクタが用意されているので、そのままTINY JTAG-ICE2を接続します。

TINY JTAG-ICE2経由でPCとSTEVAL-PCC010V2を接続したら、STM32F205用のopenOCDを起動します。
openOCD起動後、Flash Writerを起動します。書込むファイルはコンパイルしたasp.binを指定します。起動したFlash Writerのタイトルバー左端にあるアイコンをクリックすると、メニューが表示されるので、メニューから「FlashWriter Property」を選択します。すると、Flash Writerのウィンドウが拡大表示されます。

ウィンドウが拡大したら、CPU TYPEにopenOCDを選択し、Write Script Fileにはstm32f2xx_bin_flash.scriptを指定します。PORTは自動でopenOCDが設定されるので指定しません。
実際の書込みには[Execute]ボタンを押下して下さい。書き込み中はそれにかかる処理の状況が逐一ログウィンドウに表示されます。滞りなく成功すればFlash Writerのステータスバーに青色で Successful と表示されます。ログウィンドウは数秒放っておくと自動で閉じてしまうので、エラーメッセージを確認したい場合は気を付けてください。
書込みが完了すると自動でプログラムが実行され、LEDが1秒間隔で点滅し始めました。どうやら無事TOPPERS/ASPをSTM32F205上で実行できたようです。

その後、waitしないタスクをぶん回して割り込みを行ってみましたが、割り込みも問題(遅滞)なく動作しました。旧バージョンでは他のタスクが停止していたはずですが、バージョンアップしたTOPPERかSTM32F205の性能のせいなのか分かりませんが、当初の目的は達成できたのでTOPPERについてはここまでとします。

大掃除

カテゴリ : 
その他
2011-11-17 17:44
突然PC(Windows7)にログインできなくなった。
セーフモードであればログインできることからウィルスかシステムファイルの一部が破損しているのでは?とあたりを付け調査するも状況は変わらず。
PCの本体カバーを開けるとグラフィックボードのファンが目詰まりしており、掃除機にて埃を取り除く。
掃除後、PCは何の問題もなく起動した。忘れがちだがPCは精密機器。
目の届かないところも、これからは気を付けることにしよう。

大洪水

カテゴリ : 
その他
2011-11-10 13:28
朝、出社してみると天井から大量の水が。
上階に連絡に行った時には既に出水は収まっているものの床上浸水状態で、この水がどこかを伝わり下階へ流れ込んでいた模様。
床一面の水溜りとを1時間以上かけて処理するも未だに天井からは水滴がポトリ。
事務用PCと複合機が冠水してしまったので、事務作業は一時停止中。
水難の相でも出ていたか。

香り付き蚊取線香

カテゴリ : 
その他
2011-11-8 12:06
一般では風邪が流行っている様子ですが、個人的に頭を悩ませているのは11月を過ぎても発生している蚊。
この季節、対策グッズは入手困難で唯一入手可能であったのが蚊取線香。
なるほど、それなりの効き目はあったが2日たっても煙いのはやはり線香ゆえか。
しかも煙に効用がないときては香りくらいは欲しいところ。
お香にもなる蚊取線香なんて各メーカさん、どうですかねぇ。
うん、やっぱ電気蚊取でいいや(笑)

FREEDOMライブラリの変更等

カテゴリ : 
雑記
2011-10-13 21:06
10/8に行われたROBO-ONE LightにFREEDOM Jr.IIIで何台かエントリーされていましたが、弊社の技術サポートからは未完成なサンプルプログラムの提供にとどまっていたにもかかわらず、皆さん予想以上に健闘されていらっしゃったと感じました。
引き続きご活用いただけるべく、10月末までには正式版を公開できるよう作業しておりますので、今しばらくお待ちください。

なお、それに合わせてという訳ではありませんが、FREEDOM IIIライブラリの以下のAPIを修正する予定です。
・DX_Ping2の全面改修
・fd_PlayMotionによるモーションの逆再生追加


その他、ROBO-ONEで計画されている標準化の一環として、モータやセンサ等のデバイスをPC上で一元管理するためのサーバアプリケーション(ROBO-ONE RTWB)の雛形を弊社にてデザインする事となりました。




詳細は次回のROBO-ONE Humanoid Helper Projectにて公開される予定となっておりますのでお楽しみに。

冠雪

カテゴリ : 
雑記
2011-9-28 10:32
裾野から見るいつもの富士の山頂にうっすら白いものが。
涼しいというよりちょっと寒い?

遅ればせながら

カテゴリ : 
雑記
2011-8-20 18:50
今更ですが、8/10発売のトランジスタ技術9月号にZIG-100B(BTX025)の紹介記事が掲載されていました。
BluetoothやZigBeeなどの無線機器の特集となっていますので、興味のある方はご確認を。

MATLAB/simulinkでDXLIB2を動かす

カテゴリ : 
その他
2011-8-19 20:20
MATLABでできてsimulinkでできないことはないよな。ってことで試してみた。
検証環境は前回同様以下の通り。
直接simulinkからDLLを呼出すことはできそうになかったので、MATLABを経由して呼出すことにした。
前回パスは通しているので、いきなりモデルを作成。ちなみにモデルのパスも登録が必要だ。

FunctionではなくEmbedded MATLAB Functionを配置して編集。
dx_openの中身は以下の通り。
function ret = dx_open()
eml.extrinsic ('dxopen');
ret = 0;
ret = dxopen();
MATLABで宣言したdxopenを呼出しているだけ。 当然dxopenはmファイルだ。
function ret = dxopen()
  if exists('dxlib2.h','file') ~= 2;
  disp('Not found');
  devid = 0;
 else
if ~libisloaded('dxlib2'); loadlibrary('dxlib2.dll','dxlib2.h'); end
  devid = calllib('dxlib2','DX_OpenPort','\\.\COM4',1000000);
 if devid ==0; unloadlibrary('dxlib2'); end
  disp('call DX_OpenPort');
  end
  ret = devid;
 disp('start end');
mファイルは前回使用したものを分割して戻り値を返すようにしただけなので、他のmファイルは割愛。
結果は次の通り。


まぁsimulinkから呼出せているからこれで良しとする。