2004年10月

作業日記トップへ

10月02日(土)  10月03日(日)  10月04日(月)  10月05日(火)  10月06日(水)  10月07日(木) 

2004年10月07日(木)

マイコン側プログラム(1サーボ駆動)

マイコンプログラムを本格的にやるにあたって、 気になるいくつかのことを確認することにしました。

スライダーで、ぐりぐり・・・(0041007-1)

GDLでやったときには問題が無かったのですが、 Cygwinでgccとなるとシリアルのスピード的に問題は無いのか疑問が残ります。 そこで、himitsu soft(©平沢氏)を使って 確認してみることにしました。

himitsu softのデータ仕様

himitsu soft(©平沢氏)では、 1モータをスライダで動かす場合の転送データは、

となっているので、これにあわせてプログラムします。

利用する関数

himitsu soft(©平沢氏)に対応するパソコン側のプログラムもあるのですが、 ここでは後のことを考えて、Little Burning Core(©宮田耕自氏)で用意されている 関数を使ってみることにしました。

利用する関数
関数のあるファイル関数説明
sci.cSCI_init(void)シリアル初期化
sci.cSCI_read(s32 *c)1バイト受信
srv.cSRV_init(void)サーボ制御モジュール初期化
srv.cSRV_start(void)サーボ制御信号出力開始
srv.cSRV_setDuty(u16 ch, u16 duty)パルス幅設定(duty:4799-18399)

パルス幅への変換

1バイトで受け取る角度情報:duty_byte
duty=5000+53*duty_byte

関数を付け足す

SCI_readを使って、データを受信するまで待つ(受信したデータは変更しない)関数SCI_getByteを付け足す。

結果

特に問題なく、ぐりぐり動かせている様子。

次にやるべきこと

スライダーのサンプルソフト(©平沢氏)があるので、 リハビリを兼ねて、これをもとに自分でプログラムをしてみます。

2004年10月06日(水)

通信の仕様を決める(2004/10/06案)

Little Burning Core(©宮田耕自氏)のプログラムが なんとなく分かった気になったので、通信の仕様を決めて自分なりに変更してみたいと思います。

とにかく全てを1バイトで・・・

1バイトコード仕様
(制御符号?)数値意味
0-200数値データ
VD240次の1バイトは、電圧のデータ(マイコン側から)。
SMD241以下通信終了まで、モーションデータ
DIV242次の1バイトは、分割数(前のポーズからの時間)
SLO243ループ開始(次の1バイトはループ回数)
ELO244ループ終了
CSM245次の1バイトは、チェックサム(保存データからは削除)
MEX246マイコン上にあるモーションを実行
RTM247EEPROMのモーションをマイコンへ読み出し
MTR248マイコン上にあるモーションをEEPROMへ書き込み
SSD249以下通信終了まで、1箇所のモータを駆動するためのデータ(モータ番号,角度のみ)
SPWM250PWM開始
EPWM251PWM停止
ACK252肯定応答(マイコン側から)
NAK253再送信要求(マイコン側から)
SOH254通信開始
EOT255通信終了

ASCIIコードを送るなどということは考えず、全てを1バイトのデータとして送ることにします。 制御コードも自分勝手に決めます(笑)。

0-200までをデータとし、201-255までを制御コードに割り振ります。

今回は、モータの角度データも、0-200までで指定することにしておきます (複数バイトへの拡張は、それほど難しくは無いと思います。たぶん・・・)。

現時点では、マイコン側のデータをパソコンに取り込むことは考えていません (マイコン側のデータとの比較や整合性を考えだすと、頭が痛くなってくるので・・・)。

マイコン起動時のポーズは、EEPROMの最初のページから読み出すことにします。

ループは、1モーションに1回のみ利用可能とします。

1モーションは256バイト以下で(は、無理かなぁ)・・・

1モーションはできるだけ小さくてすむように努力してみたいと思います。

1モータをスライダで動かす場合

1モータをスライダで動かす場合は、チェックサムなどは送らない。

1モーションを転送する場合

最初の「全モータのデータ」は、モータ番号無しで角度データをモータ番号順に送る。

「変更のあるモータのデータ」は、 モータ番号と角度データを送る(全データを送ったほうがよいか迷い中・・・)。

チェックサムには、データ部をすべて加算して256で割った余りを入れる。

単独で実行される制御コードの場合

EEPROM関連の制御コードの場合

アドレスは、128X4(?)で指定。

次にやるべきこと

とりあえずこれで、マイコンプログラムを書いてみよう・・・ 動作確認はどうやってすればよいのやら・・・

2004年10月05日(火)

XMODEM

XMODEMはネット黎明期に急速に広まった通信プロトコル。 バイナリデータを転送。 YMODEM,ZMODEMなど多くの改良版も存在。

XMODEMのブロック構成

SOH(Start of Heading)(0x01):ヘッダ開始

シーケンス番号:1からブロックを送信するごとに1ずつ増やしていく。 255の次は0になり、その後1から再度1ずつ増やしていくことになる。

シーケンス番号の補数:シーケンス番号のチェックのために、 足して0xFFになるような値を入れる。

データ:128バイト(8ビットのバイナリを128)のデータ。 128バイトにならない場合には、残りをControl-Z(SUB:Substitute Charactor)(0x1A)で埋める。

チェックサム:データ部をすべて加算して256で割った余りを入れる。

XMODEM通信手順

  1. 送信側は、受信側からNAK(Negative Acknowledge)(0x15)が送られてくるのを1分間待つ。 NAKを受け取ると、ブロックを送信。
  2. 受信側は、10秒待って応答がないとNAKを再送。10回繰り返して応答がないと通信を中止。
  3. 受信側は、ブロック受信後シーケンス番号とチェックサムをチェックし、 正しければACK(Acknowledge)(0x06)を送信。 間違っていればNAKを送信。
  4. 送信側は、ブロックを送った後、ACKが戻ってくれば次のブロックを、 NAKが戻ってくれば再度同じブロックを送信。
  5. 送信側は、最後のブロックを送信し、ACKが戻ってくれば、 EOT(End of Transmission)(0x04)を送信。
  6. 受信側は、EOTを受け取ったら、ACKを送信して終了。

参考文献

次にやるべきこと

ロボットを作る前に、プログラムを進めておきたい。 LBCでの電圧監視は後回しにして、モーションクリエータを進めていこう。 しかし、すっかり忘れてしまったなぁ・・・

まずは、通信の仕様を決めておこうかな・・・

2004年10月04日(月)

2-wire Serial EEPROM AT24C1024(8-lead PDIP) 続き

書き込み

Word Address

AT24C1024のメモリは1,048,576 bits で、書き込み時に、8 bits(1 byte)を131,072wordsという使い方と、 256 bytes(256 X 8 bits)を512ページという使い方ができるようです。 ロボットの1モーションを256 bytes以内に収めれば、 512モーションが保存できることになります。

読み書きは、byte(word)単位で行われるようなので、 位置を指定するのに、17bits必要になるようです (131,072=2^17)。

BYTE 書き込み

書き込む8bitsデータのアドレスは、P0とDEVICE ADDRESSに続く2bytesの17bitsで指定するようです。 データを転送し、ACKNOWLEDGE(0)が帰ってきたら、STOP CONDITIONを送信して終了する必要があるようです。

書き込み中は、他の命令は受け付けなくなるようです。 書き込み時間Twr(Write Cycle Time)は、Maxで10msのようです。

PAGE 書き込み

AT24C1024では、256bytes(1page)の書き込みも可能なようです。

データの送り方は、「BYTE 書き込み」とほぼ同じようです。 違うのは、1byte送った時点でSTOP CONDITIONを送信せずに、 続けてデータを送信することみたいです。 256bytesまで送信したら、ACKNOWLEDGE(0)を受け取り、 STOP CONDITIONを送信して終了するようです。

書き込みのアドレスは、データを受け取るたびに1ずつ増えるようになっているようです。 このとき、下位の1byte分は増えますが、上位byteは変化しないようです。 ページの最後まで行った場合には、最初に戻るようです。 256bytes以上書き込むと、最初のほうのデータは上書きされることになるようです。

読み出し

現在のアドレスから1byte読み出し

最後に読み書きした次のデータを読み出すのに利用するようです。

メモリの最後のアドレスまで行くと、 最初に戻ることになるようです。

STOP CONDITIONを送信して終了するようです。

ランダム読み出し

ランダム読み出しには、ダミーの「BYTE 書き込み」が必要なようです。 ダミーの「BYTE 書き込み」をおこなった後に、 ACKNOWLEDGE(0)を受け取ったら、 再度START CONDITIONDevice Addressを送るようです。 このようにすると、データが送られてくるようです。 マイコン側からはACKNOWLEDGE(0)を返さず、STOP CONDITIONを送信して終了するようです。

連続読み出し

現在のアドレスから1byte読み出しもしくは ランダム読み出しを行い、 データが送られてきた後で、ACKNOWLEDGE(0)を返すと、 連続的にデータが呼び出せるようです。 読み出しを止めるときには、 ACKNOWLEDGE(0)を返さず、STOP CONDITIONを送信して終了するようです。

次は・・・

XMODEMだぁ・・・

2004年10月03日(日)

2-wire Serial EEPROM AT24C1024(8-lead PDIP) 続き

今日は、EEPROM AT24C1024のデータ転送の仕様をまとめたいと思います。

Device Address

EEPROM AT24C1024のデータ読み書きには、 START CONDITIONに続いて、8bitsのDevice Addressを指定するようです。

最初の5bitsは、10100という値を入れることになっているようです。

次の1bit(6bit目)は、A1を指定します。 2-pin(A1)をGNDに結線したEEPROMにデータを送る場合には、 0を指定することになるようです。

次の1bit(7bit目)はP0で、 これは、指定するメモリのアドレス17bits中の1bit目(most fignificant bit)を指定するようです。 残りの16bitsはDevice Addressの後に指定するようです。

最後の8bit目は、書き込みか読み出しかを指定するようです。 読み出しはhigh(1)を、書き込みはlow(0)を指定するようです。

Device Address転送後は、AT24C1024から、 ACKNOWLEDGE(0)が帰ってくるようです。

2004年10月02日(土)

2-wire Serial EEPROM AT24C1024(8-lead PDIP)

やっとマイコンプログラムに戻れました。 Little Burning CoreはEEPROMから再開。 しかし、EEPROMとかXMODEMとか、全く知らないので調べることに・・・ よく分からないけれど、まとめながら作業をすることにしました。 間違ってたら、教えてももらえると助かります。

EEPROM AT24C1024

VCC電源へ。 2.7 Vから 5.5 Vの範囲で利用可能なようです。 LBCでは 5V につないでいます。
GND(Ground) グランドへ。
NC(No Connect)どこにもつながない。
A1(Address Input)1個目はGND、2個目はVCCにつなぐと2個利用できるようです。 データ読み書きの際には、この値で指定します。 1個だけならGNDにつなぐのが良いようです (つながなくてもGNDになるようです)。
WP(Write Protect)0(GND)で書き込み可能、1(VCC)にすると書き込みできなくなるようです。 マイコンなどから切り替えることも考えられます。 LBCではつないでないのでGND(書き込み可能)になるようです。
SDA(Serial Data)データを書き込んだり、読み出したりするのに使うようです。
SCL(Serial Clock Input)データ転送の際などのタイミングを決めているようです。 low(0)でデータを変更し、 high(1)でデータを確定する感じでしょうか・・・ たとえば、8bits転送するためには、lowとhighを8回繰り返すということをやるようです。

SDAとSCL

Serial EEPROM AT24C1024 にデータを読み書きする場合、SDA と SCL の2本の線で行うようです。

START CONDITION(通信開始)

通信開始は、SCL が high のときに、 SDA を high から low に変化させることで知らせるようです。

start condition

STOP CONDITION(通信終了)

通信終了は、SCL が high のときに、 SDA を low から high に変化させることで知らせるようです。

start condition

DATA TRANSITION(データ送信)

データ送信は、SCL が low のときに、 SDA を変化させるようです。

start condition

ACKNOWLEDGE

データは8-bit単位で送られ、 9番目のクロック時にはEEPROMから0が送られてくるようです。

続きはまた・・・

参考文献

作業日記トップページへ

トップページへ

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送