
2010年04月06日
これで最後のロボデザイナー探求 ?
ロボデザイナー探求終了を宣言しておきながら何度もすみませんが、
MC908QB8 である JRT-104 を MC908QC16 に置換してメモリー容量を倍増出来る可能性に気付いてしまいました。
MC908QC16 は DIP パッケージでは供給されてませんので、TSSOP パッケージ等からの変換基板が必要となります。
MC908QC16 は MC908QB8 とかなり互換性が高いですが、Ticolla CDE で制御するのは多分無理ですね。Code Warrier に乗り換えれば出来ることはほぼ確実ですが、そんなことまでするなら別のプラットフォームに乗り換えたほうが早そうです。
一番良いのはジャパンロボテックさんから CPU ドータボードと Ticolla CDE のバージョンアップ版が発売されることなのですが... 出してくれないかな ?
2010年03月14日
電源について
ロボデザイナ探検の最後として、コントローラボードが耐えられる電力と対策について書いておきます。
ロボデザイナのコントローラボードには 78DL05AF がメインの三端子レギュレータとして搭載されていますので、コントローラボード内とセンサ類を含めた電力出力は 5V 250mA が最大のようです。このため、PSD センサや超音波センサのような高消費電力のセンサを複数付けると、コントローラの電力が足りなくなり不安定となります。
78DL05AF を他の高出力な 5V 出力の三端子レギュレータに取り替えるという手段もありますが、置換するのは実装上かなり難しいと思います。そのため、高消費電力のセンサを複数接続するためには他の手段で 電源を追加することが必須となります。
2009年06月26日
非同期タイマーの実現
モッパーです。
ただし、本当は Ticolla CDE の PWM 初期化を流用していて、ネイティブなタイマー定義をしているわけではないので、ちょっとズルです。私の知力の限界なのでこんなくらいで許して下さい。
モータの PWM 制御をしながら非同期タイマー実現するなら、こちらの記事に書かれている手法のほうが有効です。
また、TCH2 と TCH3 (JRT104 で追加されているタイマーチャネル 2 と 3 ) の活用についても調べましたが、TCH2 と TCH3 が I2C 通信を行っているポートと重複しますので、I2C 通信をしながら TCH2 と TCH3 を併用することは無理だというのが私の結論です。
main.c では以下のような感じ。このブログのエディタは TAB を無視するんでインデント無くなってますけど、我慢して修復して下さい(笑)。
/*--------------------------------------------------------------------------------*/
/* Variable declaration */
/*--------------------------------------------------------------------------------*/
extern byte count0;
extern byte second0;
/*--------------------------------------------------------------------------------*/
/* Prototype declaration */
/*--------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------*/
/* main */
/*--------------------------------------------------------------------------------*/
init(); //Initialization
PWM2_INIT();
INTERRUPT_INIT();
CH0IE = 1;
while(1){
LED_OUT(second0);
COPCTL = 0;
}
}
/*--------------------------------------------------------------------------------*/
/* Variable declaration */
/*--------------------------------------------------------------------------------*/
byte count0 = 0;
byte second0 = 0;
/*--------------------------------------------------------------------------------*/
/* Prototype declaration */
/*--------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------*/
/* ADC_Interrupt - ADC Conversion Complete Interrupt */
/*--------------------------------------------------------------------------------*/
//#pragma TRAP_PROC
void _ADC_Interrupt(void) {
__DI();
__EI();
}
/*--------------------------------------------------------------------------------*/
/* KBD_Interrupt - Keyboard Wakeup */
/*--------------------------------------------------------------------------------*/
//#pragma TRAP_PROC
void _KBD_Interrupt(void) {
__DI();
__EI();
}
/*--------------------------------------------------------------------------------*/
/* timer_overflow_isr - The timer rolls over every 256T counts */
/*--------------------------------------------------------------------------------*/
//#pragma TRAP_PROC
void _TOF_Interrupt(void) {
__DI();
__EI();
}
/*--------------------------------------------------------------------------------*/
/* Timer Channel 0 - Timer Channel 0 Interrupt */
/*--------------------------------------------------------------------------------*/
//#pragma TRAP_PROC
void _TCH0_Interrupt(void) {
__DI();
CH0F = 0;
count0++;
if ( count0 >= 48 ) {
second0++;
count0 = 0;
}
__EI();
}
/*--------------------------------------------------------------------------------*/
/* Timer Channel 1 - Timer Channel 1 Interrup */
/*--------------------------------------------------------------------------------*/
//#pragma TRAP_PROC
void _TCH1_Interrupt(void) {
__DI();
__EI();
}
/*--------------------------------------------------------------------------------*/
/* IRQ interrupt */
/*--------------------------------------------------------------------------------*/
//#pragma TRAP_PROC
void _IRQ_Interrupt(void) {
__DI();
__EI();
}
そろそろ私自身の趣味の範囲内での、ロボデザイナ+Ticolla CDE をしゃぶりつくす旅は終わりにしたいと思います。いやいやロボデザイナは本当に美味しかったです。私が小中学生だった頃の 8bit ワンボードマイコンの回路やBIOS解析そのまんまの世界に加えて C言語 + Java + I2C といった最近の技術を学べました。ごちそうさまでした。H/W としては、電源弱いようなのでそこだけはおしゃぶりポイントはまだ残るかも。
次は PSoC あたりで遊ぶかな ? それとも積年の夢だった FPGA に逝くか ? Arduino も良いですね。
2009年05月24日
I2C って...
今日は K 君がたまたま来たので、N 君と一緒に前回と引き続き木工やってもらいました。
放っておいてもそこそこの精度が出せるようになってきたようなので、私のアマチュア家具職人のプライドもどこかに行ってしまい、バリ取りなし・研磨なしでも「いいんじゃないのー」の放置モードに...(笑)
その代わり私はアマチュア電子工作職人の血が疼いてしまい、届いていたダイセンのモータードライバボードを使って、I2C バスのノイズ解析という個人的趣味モードに...(笑)。最近もデジタルオシロで自作オーディオとか簡単なデジタル回路のチェックとかはしていましたが、こんな応用問題にトライするのは 25 年振りくらいなので、そもそもオシロの高度な使用方法がよく思い出せません。xx才の手習いはきついです...でもとりあえず I2C バスのノイズの解析に挑戦!!!
(1) ロボデザイナ側の I2C コネクタ
(2) (1) から 20cm くらいのケーブルで接続したモータードライバ側のI2Cコネクタ(モーター回転なし)
(3) (2) にさらにサージ予防のコンデンサなしの DC モーターを接続・回転させた場合
について SCL クロックの波形について調べて見ましたが、シングルトリガで捕捉した SCL クロックの波形はどのパターンもほとんど変わりません。以下の通り、綺麗なもんです。

でも、DC モータのサージの周波数成分なんて I2C のクロックとは全く違うだろうし SCL クロックは定常波じゃないので、オシロで定常的に見ることなんて出来ないし... と今書きながら分かってきました。そうだ、サージ電圧はもっと高いはずなのでそれでトラップ出来るだろうし、擬似的に定常的な SCL クロック発生してしまえば良いんだ...やっと感覚が戻ってきましたが、今日はここまで。
でも、I2C バスって複雑で再現性の低い問題が発生した時に外部的な監視手段で本気モード(≒仕事モード)で解析しようとすると I2C バスアナライザみたいな専用機ないと難しいのかもしれませんね。デジタルオシロでも超ロングメモリないと無理だな。やっと世の中に I2C バスアナライザが存在する理由が分かりました。思っていたより手強い相手を選択しつつあることに今更ながら気付いてしまいました。
トラブルシューティングとかきちんと I2C ドライバを実装するためには、こちらあたりのレベルは読んで理解しないといけないようです。なになに、複数のマスタを想定したアービトレーションとか、スレーブが間に合わない時にスレーブ側が強制的に SCL クロックを LOW にして引き伸ばすなんてありなの ??? 結構ソフトウェアでフルサポートしようとすると難しいですね、このプロトコル。TicollaLib がフルサポート出来ているとは思えないな。それが公開されていない理由かな ?
結論として、今日ロボデザイナの I2C ライブラリについて分かったことは、100Kbps の場合の SCL クロックの "H" の時間の MIN 4.7μs、立ち上がり 1μS の基準を満たしていること、400kbps は絶対無理なこと、26 Khz という超遅い SCL クロックは遅いスレーブの強制的 SCL LOW にまともに対処せずにクロック落として対応しようとした結果じゃないの ??? という憶測だけ。
2009年03月13日
Ticolla CDE の隠し関数
TiCollaLib にはいくつかの隠し関数が入っています。
これらはマニュアルには書かれていませんし、私もまだテストしてませんので仕様もよく分かりません。このため以下は憶測でしかありません。でも、特に I2C 関連は I2C センサ の接続に使える可能性があり有用のように思います。これらの関数は TicollaLib.h ではプロトタイプ宣言されてませんので、自分でプロトタイプ宣言が必要です。
void GET_CAPTUR(byte _side, word *Value)
タイマーカウンタの値(TCH0かTCH1?)を Value に返す。_side はPWM_SIDE_CN11かPWM_SIDE_CN6を指定して TCH0 か TCH1 を選択するようです。byte EI2C1_SendSelectSlave(byte SlaveAddr, byte _Mode)
byte EI2C1_SendAddress(word Address)
byte EI2C1_SendData(byte Chr)
byte EI2C1_SendStop(void)
I2C のハンドリング関数群のようです。I2Cメモリ関数(I2C_READとか) から呼ばれていますが、I2C 通信の全ての機能を使えるものかどうかは良く分かりません。I2C センサつけてみて検証したいと思います。
JAPAN ROBOTECH さんが、vectors.h や TiCollaLib.c のソースコード公開してくれれば、もっと色々出来そうなんですが... なんとかなりませんかね ?
2010.9.3 更新
ただしそれは反面レスポンスが悪いということなので、ロボデザイナで I2C デバイスを複数接続すると、高度な RCJ サッカーロボットではボトルネックとなる遅延が発生します。
ちなみに TiCollaLib のソースコードは PC に大きな負荷をかけた状態でコンパイルをして、プロジェクトの内容を捕捉すると get 出来ます。あまり詳細を書くとライセンス条項にひっかかりそうなので、以下自粛。
2009年03月11日
10bit A/D の実現
以下、A/D コンバータを 10 bit 化するためのソースコードです。
#define AD_CN7 6 // CN7 AD port channel
#define AD_CN8 7 // CN7 AD port channel
#define AD_CN9 8 // CN7 AD port channel
#define AD_CN10 9 // CN7 AD port channel
#define AD_CN1 10 // CN7 AD port channel
#define AD_CN2 11 // CN7 AD port channel
VOLDATA UINT8 at 0x3d ADRH; /* ADC Data Register */
void AD_GETDATA10(byte Port, word *Data){
ADICLK = 0x56;
switch (Port){
case AD_CN6: Port = 0 ; break;
case AD_CN11: Port = 1 ; break;
case AD_CN3: Port = 2 ; break;
case AD_CN4: Port = 3 ; break;
case AD_CN7: Port = 4 ; break;
case AD_CN8: Port = 5 ; break;
case AD_CN9: Port = 6 ; break;
case AD_CN10: Port = 7 ; break;
case AD_CN1: Port = 16+8 ; break;
case AD_CN2: Port = 16+9 ; break;
default : return; break;
}
ADSCR = Port;
for(;;){
if (ADSCR_COCO == 1) break;
}
*Data = (ADRH<<8) | ADR;
ADSCR = 0x1F;
return;
}
ちょっと光センサでテストして見ましたが、センサの S/N 比がそもそも 60dB (10bit) 無いような感じもありますし、電源とか伝送路のノイズもあるようなのでトータルの分解能として向上した感じはありません。
それじゃ意味がない ??? いやいや、こういう地道な努力が日本を救うのです(爆)。
2009年02月15日
PWMとタイマー割り込みの両立
なんとかPWM とタイマー割り込みの両立が出来ないか模索していましたがやっと出来るようになりました。
(1) INTERRUPT_INIT();の後でCH0IE = 1;とやると TCH0 の割り込み(_TCH0_Interrupt)がかかるようになります。大体 24hz 程度で割り込みが入るようです。(H/W 定義で PWM が指定されている必要があります)
(2) ただし、MOTOR_SETSPDやMOTOR_SPD を呼ぶとタイマーをリセットするので割り込みがかからなくなります。このため、MOTOR_SETSPDやMOTOR_SPDのあとで CH0IE = 1; します。そうすると割り込みが再開します。タイマーがリセットされているので正確なタイマーを作ることは出来ませんが、ないよりはましでしょう。また、MOTOR_SETSPDやMOTOR_SPDのあとで割り込みがかかるまえにMOTOR_SETSPDやMOTOR_SPDすると当然割り込みはかかりません。
(3) CN11 の PWM が TCH1, CH6 の PWM が TCH0 使っているので、割り込み周期の変更は出来ないと思います。
(4) JRT-104 は TCH0 と TCH1 以外に TCH2 と TCH3 の2本のタイマーが使えますが、割り込み処理のためには Vectors.h や TicollaLib.c に手を入れないと無理なので現実的ではありません。割り込みではなく、TCH2 と TCH3 のタイマーカウンタを読み取ることも出来そうに思いますが、まだやってません。
PWM 使わないと、結構好き勝手に TCH0 と TCH1 使えそうですが、現在の使用方法では PWM 使えないと意味のない局面が多いので、これもやってみてません。
2009年02月14日
アナログ入力の拡張
Ticolla CDE でアナログ入力出来ないことになっているポートから、アナログ入力をする方法です。
H/W 定義では A/D コンバータの初期化のため、ADC_INIT(); というコードが必須です。H/W 定義で一つでも Analog in が定義されていれば、initilize.c の中でこのコードは呼ばれますが、定義しない場合は main.c の中で呼んでおく必要があります。また、H/W 定義で Analog in に出来ないポートは Digital in にしておけばアナログ入力出来ます。
以下、サンプルプログラムです。CN1 と CN2 はアナログ入力しながらデータロギングが出来ないようです。CN7-10 は検証が面倒だったのでテストすらしてません(笑)。結局使い物にならないような...
#define AD_CN7 6
#define AD_CN8 7
#define AD_CN9 8
#define AD_CN10 9
#define AD_CN1 10
#define AD_CN2 11
void AD_GETDATA2(byte Port, byte *Data){
switch (Port){
case AD_CN6: Port = 0 ; break;
case AD_CN11: Port = 1 ; break;
case AD_CN3: Port = 2 ; break;
case AD_CN4: Port = 3 ; break;
case AD_CN7: Port = 4 ; break;
case AD_CN8: Port = 5 ; break;
case AD_CN9: Port = 6 ; break;
case AD_CN10: Port = 7 ; break;
case AD_CN1: Port = 16+8 ; break;
case AD_CN2: Port = 16+9 ; break;
default : return; break;
}
ADSCR = Port;
for(;;){
if (ADSCR_COCO == 1) break;
}
*Data = ADR;
return;
}
2009年02月11日
データロギング
2009年02月03日
ロボデザイナー Ticolla CDE と SDCC について
かなり極端な例ですが、#pragma less_pedantic なしで以下のコードをコンパイルします。
void main(void) {
byte a = 1;
if (a == 1) return;
}
要は a が 1 であることが明白なのになんで評価するの ? というコードです。ちょっと単純化しすぎているので、そんなのダメで当然じゃんと思われるかもしれませんが、複雑なプログラムの中での出来事である場合や、初心者の子供の目で見た場合を想定して下さい。
main.c:36: warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG
EVELYN the modified DOG は知る人ぞ知る FRANK ZAPPA の曲の題名ですが、ある程度は ZAPPA を知る人の私が曲の歌詞を紐解いてもエラーの意味を理解出来ないほど超ハイレベルなオタク度を誇るエラーメッセージですね、これ(笑)。Ticolla CDE が SDCC を使っていることを自ら発見しネットで正確な情報を検索出来るか、もしくはC言語の達人でない限り、コンパイルエラーに完全にハマったときの対処が非常に困難な場合があると感じます。折角 GUI としては良く出来ていて、タイルベースからテキストベースへの移行に適した開発環境なのにとても口惜しいですね...
2008年12月29日
ROBODESIGNER と HC08 マイコンについて
脱線しましたが、ROBODESIGNER のコントローラボード RDC-101 に最初に乗っているのは JRT-101 という CPU です。JRT-101 の開発環境は Ticolla というタイルベースのプログラミング環境ですが、複雑なプログラムを書くことは困難です。Ticolla CDE は C 言語でのプログラミング環境であり、 Ticolla では不可能な高度で複雑なプログラミングが出来ます。UI が Ticolla に似ていることもあり、Ticolla を学んだ子供が C 言語に挑戦するためには良い開発環境だと思います。Ticolla CDE を使うためには CPU を JRT-104 に変える必要があります。RDP-904 か RDS-X03U を買うと Ticolla CDE と JRT-104 がついてきます。
JRT-101 は多分 MC908QY4 です。JRT-104 は多分 MC908QB8 です。MC908QB8 は MC908QY4 に比べて AD コンバータの本数が増えたり AD が 10 bit 化されていたりいくつかの点での強化が行われていますが、Ticolla CDE の制限によりそれらの恩恵は得られず、JRT-104 は単にメモリの増加と処理速度が速くなった JRT-101 としての位置づけでしかないようになってしまっています。ただし、自分でポートの初期化をしてしまうとか初期化ルーチンを作るとかしてしまえば MC908QB8 の追加機能の恩恵を受けることが出来る部分もあります。
また、ピン互換の HC08 に載せ変えてしまうという荒業もあります。この場合、Ticolla や Ticolla CDE は使えなくなってしまいますので、Freescale CodeWarrior とか SDCC での開発環境を使用することになります。
HC08 マイコンの購入はこちらで出来ます。
Ticolla CDE はインラインでのアセンブラ記述も出来るようです。子供の頃夢だった 6800 のインストラクション勉強しなおして書いてみようかな...
2008年12月09日
ROBODESIGNER(ロボデザイナー)のノウハウ(2)
2008年11月08日
ROBODESIGNER(ロボデザイナー)のノウハウ(1)
- JRT-104 は多分 MC68HC908QB8。もし当たりなら、A/Dが10bit化されているとか、タイマ本数も増えているとか、そのあたりの恩恵も受けられるはず。net 上にMC68HC908QB8のマニュアルは転がっている。JRT-104 を高度に使いこなすためにはこれを入手することが必須。
- コンパイラは SDCC を使っている。
- <= や =< はどうもまともに動かないことがある。(未確認)
- a.c というファイルの自作関数から b.c というファイルの自作関数は呼べない。b.c の自作関数をa.c に入れてローカル関数にしないとダメ。
- CN12 や CN13 は I2C 通信用のコネクタ。ピンアサインはこの記事の下のほうにあるポートアサイン表を参照。
- CN12 と CN13 は I2C メモリを使ったり I2C センサと通信しないのであれば、Digital in/out にも使える。ただし、他のコネクタとピンアサインが違うことに注意が必要。H/W 定義はできないので、main.cでinit(); の直後で以下のようにやれば良い。(Digital in の場合)
CONNECTER12 = 0;
CN12DDR = 0;
CN12PUE = 0; - #pragma less_pedantic しないと、コンパイラのロジックチェックが厳しすぎて苦労する。礼儀正しいコード書けば良いだけだが子供には厳しすぎる。
- stdio.h とか float.h もあるが、ひどくメモリー食い。そんなもんいるかという話もあるが、float は使わず整数演算にしたほうが良い。
- JRT104 のポートアサイン表です。 JRT104port.pdf
- 動作中にポートの In/Out 変えることも可能。ただし、CN5 は何故か出来なかった。他にも出来ないポートあるかも。
