免責事項

注意、免責事項について
・高電圧、大電流その他高エネルギを扱う実験を行う際にはくれぐれも安全に配慮し、細心の注意を払って行うようにしてください。
・当ブログの記事を参考にして発生した損害についてFEL研究室はいかなる責任も負えませんでご了承ください。
ラベル 通信 の投稿を表示しています。 すべての投稿を表示
ラベル 通信 の投稿を表示しています。 すべての投稿を表示

2020年10月11日日曜日

ACサーボモータのエンコーダ解析

ご無沙汰しております。
すっかり涼しくなってきました。
秋と言えば、過ごしやすいことを口実に〇〇の秋と、ほとんどなんでも有りの秋が大量発生して騒々しいことこの上無いので、何かと流行に歯向かいがちな年頃の私としては「逆張りの秋」を標語に、世間への反発を強めていこうと決意しました。
 
実に9ヶ月ぶりくらいの更新です。
久しぶりに記事書くやつ(意味不明)立ち上げたらなんかUIが変わってて困惑しました。画像の左揃えがうまくできん。

さて、ヤフオクで衝動買いしたACサーボが部屋で眠っていたので、ちょっとモータ制御でもしてみようと思いたち、まずは搭載されているエンコーダを解析してみることにしました。
 
50Wなのでとても小柄です。
モータの型式は「GYS500DC1-C8B」で、カタログ(記事の後ろにURL貼っときます)によると、16bitのインクリメンタルエンコーダを搭載しているらしいです。インクリメンタルとアブソリュートの違いは「多回転データの有無」で、前者が無し、後者が有りです。アブソリュートでは大抵多回転データ保持用のバッテリが接続され、それを用いて回転量のメモリが消えないようにしている仕組みのようです。
カタログやサーボアンプ側の資料を読み漁りましたが、ピン配置以上のデータが見つかりませんでした。ピン配置はメーカの製品情報に書いてあり、この情報から半二重の差動シリアル信号なんだろうというのは予想が付きます。

取り敢えず電源に5Vを供給し、差動ペアの信号をオシロで見てみましたが何も信号の変化がなかったのでなんからのリクエストに対してエンコーダがデータを返すような仕組みのようです。なんらかのデータを送ってやるにしろどういう信号レベルなのかもわからないので分解してみました。
 
既に外して線が引っ張り出してありますが、1段目の基板(写真左)にRS-485のトランシーバが載っていたのでこれを外し、送信信号と受信信号を別々に取り出してみました。制御してそうな部分はASICのようで当然データシートも出てきませんでしたので通信プロトコルについては不明です。他社と共用してそうな製品もないようなのでこのメーカ独自のものなのでしょう。
取り敢えず適当な周波数のパルスを送ってみるとラッキーなことになんかデータを返してきました。8パルス送ると以下のようなデータがエンコーダから送信されてきます。
 
4MHzのパルスがしばらく続いて、あるところでオフ期間が1周期分(250ns)あるパルスが出てきます。
 
この後からはなんか意味がありそうなパルスの変化が現れてきます。
 
エンコーダの軸を回すと後半部分の波形が変化しました。また、電源を入れ直すとかならず同じような波形となる部分があったのでそこにインクリメンタル角度データがありそうです。
波形を見る感じUARTでは無さそうです。波形の変化の仕方からマンチェスター(バイフェーズ)っぽいので取り敢えずデコーダを作って読み出してみることにしました。
波形の最初の方に同じような波形が続くのは、恐らくここでデコーダがクロックの同期をとるためのプリアンブル期間と思われます。この期間でPLL等を用いてクロックを復元してやればいい感じにデータが読み出せるんじゃないでしょうか。
考えたデコーダの構成は以下の感じです。

デコードすると単なるクロック同期のシリアル信号(SPIで読める)になるので適当なマイコンにでも入力したらいいかと思ったのですが、クロック4MHzのSPIを数バイト高速で処理しなければなりませんので少々オーバスペックですがdsPICを使ってみました。
マイコンでやってることは非常に単純で、エンコーダへの送信データとしてIO叩きで8パルス作って、エンコーダからデータが出てきたらPLLのロック信号を監視して、ロックしたらSPIの受信バッファを読み、1が含まれたデータが検出されたらそっからは順番にメモリにデータを格納していくということをやっています。Cで書いても余裕の速度なのでdsPICすごいですね、というかもったいない。
読み出せたデータを眺めながらモータの軸を動かしていると以下のようにデータが格納されていることがわかりました。
ステータスフラグのようなものは内容は不明です。パッと思いつくのはバックアップ用バッテリの電圧監視とか温度監視とかでしょうか。確かめてないのでわかりません。
その次の16bitが1回転の位置データです。電源を切っても軸位置を変えなければ同じデータが読み出せます。インクリメンタルエンコーダでも1回転のアブソリュートデータは取れるのですね。知りませんでした。
その次に8bitの90度ごとのデータがあります。軸を90度回転させるごとに255→0に戻ることから判明しました。電源を切っても保持されます。何に使っているのかはわかりませんが、もしかしたらモータが4極なのでモータ駆動用の位置データ(ホールセンサの変わりのようなもの?)かもしれません。
そしてその次の16bitにインクリメンタルな位置データが続きます。電源を入れると0からのカウントになります。
次は16bit分0が続くようです。同じシリーズのACサーボには16bit回転量を持ったアブソリュート型もあるようなのでその場合に多回転データが入るのかもしれません。
最後に16bitのチェックサムないしCRC等の検査データと思われる部分があります。インクリメンタルデータとアブソリュートデータ両方に影響を受けて変化するためです。計算式までは不明です。
 
アブソリュート16bitデータを360度換算にして表示させてみた動画です。
軸の回転に応じて角度が変化しているのが確認できます。

ちょっと疑問なんですが、モータ軸に高分解能なエンコーダを付けた角度制御ってどういうアルゴリズムになっているんでしょうか。いくらエンコーダの分解能が高くても、正弦波駆動の分解能はたかだか知れているはずで、同期モータですので単純に考えるとそれ以上の角度分解能は無いはずです。指令値に近づくと相ごとに位相の進み、遅れ等を意図的に作ったりするのでしょうか。気になります…。
 
今回はエンコーダの解析ができたので、気が向いたらACサーボの制御でもチャレンジしようかなと思っています。または一年放置している焼き芋機。
 
それでは

資料
1. モータのカタログ
 
2. インバータの詳細(エンコーダのピン配置等)
 
3. マンチェスタ(バイフェーズ)デコード

2016年11月18日金曜日

I2C機能が無いAVRで秋月のLCDを動かす

KKTです…。まさかの連続更新です。
最近マイコンいじりたい欲が出てきているので今回もAVRの記事です。
毎度毎度次回予告から外れているのですが、今回は予告通りI2Cと液晶の記事を書きます。

急にLCDがいじりたくなったのですが、僕がよく使うATtiny13AではI2Cの液晶以外はピン数の関係で接続できません。しかし、ATtiny13AにはI2C機能はありません。
ということで、まずI2Cの仕組みを理解してから、アセンブラで同じ機能を実装することにします。I2Cの説明はggればいくらでも出てくるので割愛しまして、具体的にマイコンにやらせることをメモ的に書いていきます。使用したのは秋月のこの液晶です。

・ピンの設定
I2Cにはマスタとスレーブなるものがありまして、マスタが通信を統括して、スレーブはそれに従うというルールがあります。データの送受信はマスタスレーブ無関係ですので、マスタがデータを読みたいと言えばスレーブは送信を開始しますし、マスタがこれを読めと言えばスレーブはデータを受信します。
I2Cにはクロスストレッチ(クロックストレッチでした)なるものが存在していて、本来通信は全てマスタの言う通りに進めないといけないところ、どうしてもスレーブが忙しい時や送受信データを処理している時には、スレーブがクロックをLowレベルに固定してマスタを待たせることができるという機能です。
ということは、I2Cの信号ラインはLowレベルかHiインピーダンスの二通りということになります。AVRのピン設定では、Lowは出力ピンモードで、Hiインピーダンスは入力ピンモードにすればそれぞれ設定可能です。要はオープンコレクタ/ドレインみたいになれば良いということです。以下Hiインピーダンス状態をHi、LowはそのままLowと記述します。

・スタートコンディション
まずI2Cの信号ラインは何も無い時はクロック、データともHiで待機します。次にマスタとして通信を開始したいデバイスがデータをLowにしてからクロックをLowにします。
簡単ですね。ちなみにデータをLowにしてからどれくらいの時間待ってからクロックをLowにすれば良いというのは各デバイスのデータシートに書いてあると思います。

・ストップコンディション
スタートコンディション同様通信の終了も同じようなのがあります。今度はクロックをHiにしてからデータをHiにします。
簡単ですね。これに関する時間もデータシートにあると思います。

以上をアセンブラで実装するのはまぁ簡単ですね。I/Oレジスタのbit操作だけでできます。続いてデータ関連の話です。

・スレーブアドレス送信
通信がスタートされたら、まず最初にマスタが誰を相手にするか、というのを送信します。I2Cはマスタに対して複数のスレーブが存在することができますが、同時に通信できるのは1人なのでまず誰と通信するかを指定します。誰を差すのがスレーブアドレスと呼ばれる7bitのデータです。デバイスごとに固有の値が振られていて、これもデータシートに記載されています。そして、実際にデータを送信する時は、この7bitのデータの後に更にもう1bit加えて合計8bitのデータをまず最初に送信します。スレーブアドレスの尻尾に付け足した1bitはマスタが受信するか、送信するかの指定に使用します。RWなどと呼ばれているbitでマスタが送信なら0、マスタが受信なら1を書かれます。
後術しますがこの操作で呼ばれたスレーブは「いますよ」を返します。
上の図ではスレーブアドレスとして「0111110」を、RWのbitは「0」を送信しています(この液晶は読み出しは出来ないようです)。ですからデータはRW→スレーブアドレス0bit→スレーブアドレス1bit…というように下位から順番に送られていいきます。アセンブラの操作では、まずレシスタにスレーブアドレスにRWを加えた8bitデータを入れて、それを左シフトさせて順番にクロックに乗せていくという感じでしょうか。

実際に信号の波形を見てみるとこんな感じになります。
上がデータ、下がクロックです。手書き図同様0x7C(01111100)を送信しています。クロックがHiのときにはデータを変化させてはいけないので(→スタートコンディションになってしまう)注意しましょう。

・Acknowledge
ACK、アク、アクナレッジなどとも呼ばれます。認めるみたいな意味の英単語ですが、このbitはマスタ又はスレーブが発行する「正常にデータを受信しました」のしるしですね。最初スレーブを呼ぶときには「いますよ」のようなものです。実際にどのようにACKを出すのかというと先程の図の続きで見てみましょう。
詳細は省いてますがこんな感じになります。マスタ側はACKを確認するために、第7クロックを出し終えたらデータ線をHiにしておきます。もしスレーブが正常にデータを受信していたら、データ線をLowにし異常ならHiのままにします。よってプルアップのデータバスなのでLowが優先され、正常に受信出来ていていたらLow、異常ならHiということになります。ここでマスタが第8クロック目を立ち上げてACKを読みます。つまりマスタ側は第8クロックを立ち上げてLowなら正常、Hiなら異常とわかるわけです。この動作は8bit(モードによっては10bit)のデータを受信したらマスタ、スレーブ関わらず必ず行われます。実際にACKが返ってきている様子を以下に。
最後のチョンと出ているのがACKですね(ホントは出ない方が良いと思う)。最後のクロックの立ち上がりできちんとLowになっています。スレーブのLowはマイコンのポートほどシンク電流が流せないようで若干電圧が残っていますが許容内ですので問題ありません。最後のクロックの立ち下がりでデータがピョコっと跳ね上がっているのは、スレーブが「もういいかな」と思ってLowをやめたからだと思います。なおACKを確認した後はクロックをLow→データをLowにして待機させましょう。ACKを確認できなかったらこれから送信するデータ等も意味を成さないのでエラー表示するなりなんなりしましょう。実は最初に貼ったオシロのキャプチャと同じのを送信しているのですが、最初のはスレーブを繋がず、こちらはスレーブを繋いで撮影しました。
今回は省きますが、スレーブのプログラミングをする時は、スレーブアドレスと称号して合ってたらACKを出す、間違ってたら出さないというようにすれば良いと思います。その後のデータのやり取りでは、単にクロックを数えてちゃんと8クロック来てたらACKを出すようにすれば良いんじゃ無いかと思います。

・コントロールバイト
ここからは通信するデバイスによりますが、冒頭で書いた秋月のLCD準拠で説明します。LCDに送るデータには実際に表示させる文字データの他に、コントラストの設定値やDRAMアドレスの指定などがあります。これらを単に送るだけでは表示させたら良いのかコントラストの設定値に使えば良いのかわかりませんのでコントロールバイトというのを送ってから、データを送ります。コントロールバイトでは「この次に送るデータが(コマンド/DRAMアドレス/表示させるデータ)ですよ」というのを指定します。データシートを読むと書いてありますが、単一コマンドを送る前は「0x00」、連続コマンドを送る前は「0x80」、データを送る前は「0x40」を送ります。
もう少し詳しく書くと、コントロールバイトの次に送るデータをデータバイトと言って、さらにこのコントールバイトとデータバイトをまとめて「コントロールワード」と呼びます。つまり単一コマンド(=データバイトに書く)を送る場合は、0x00→任意のコマンドとなります。連続して送る場合は、0x80→任意のコマンド→0x80→任意のコマンド→0x80→任意のコマンド→…→0x00→任意のコマンド でおしまいとなります。要はコマンドワードを繰り返すかという感じです。この辺はよく分からなくてちょっと悩みましたね。

・データバイト
8bitのコントールバイトを送信し終わったら次はコマンドや文字データ等のデータビットを送信します。これと言った注意は無いです。

・初期化について
LCDのデータシートを見ると初期化処理は大体載っているのでこの通りすれば問題なく表示できます。しかし、僕がデータシート通りにやったところ、LCDのコントラストが異常に高く画面が■で埋められて文字が読めませんでした。色々いじっているとどうやら「Follower control」の値「6C」を「69」に変更することで解決しました。取り敢えず治りましたがよくわかりません。

他にも機能としてはCGRAMなどがあるのですが、まだやっていないのでよくわかりません。

ソースは縦に長いのでこちらのページに記載しました。興味のある方は御覧ください。
原理がわかれば処理自体は簡単ですので大したことは無いですが、待ち時間とかクッソ適当なのでもし参考にされる場合はご注意ください。あらぬところへジャンプしたり読みにくいですが、バグ等有りましたら報告していただけると助かります。
アセンブラの練習用にプログラム領域にデータ置いたりしてるのでたぶんまた解説記事を書くと思います。なんとなくコメントは書いてありますがあんまり真剣に見ないようお願い致します。

ちなみに上記のソースは実行するとこうなります。

Web拍手反応(もう届いているのか…(うれしい))
>おぱっい
プルンプルン!!

>◯◯たです
どう?


それでは、今日はこの辺で。

http://clap.webclap.com/clap.php?id=fellabo

11/26追記:誤字を修正 参考リンクを貼り忘れていたので貼っておきます。
 I2C通信の使い方:http://www.picfun.com/c15.html

2016年10月28日金曜日

シフトレジスタとか

ノート破り捨てそう。

どうもKKTです。しばらく間が空いたような気がしますが元気です。
Web拍手の返信をしないとなかたくんが記事を書かないとのさばるのでだいぶ前の下書きですが少し追記して投稿してみます。

今回はシフトレジスタのお勉強も兼ねて三桁の7セグ表示機を作ってみます。シフトレジスタの詳細は割愛しますが、D-FFを組み合わせた奴です。最初聞いた時は用途がよくわからなかったんですが、シリアル形式のデータをパラレルに変換する時に便利なようです。

シリアルでデータをやり取りするイメージ図を下に。
信号線はデータとクロックの2本です。初めに受信のルールを決めておきます。今回は「クロックの立ち上がり(赤線)でデータが0Vなら’0’、5Vなら’1’」ということにしておきます。これ以外にもパルスの数を数える方法やクロックの立ち下がりでデータを見る等ルールはいくらでも決められます。クロックの立ち上がり1回あたり、1bitのデータを表せるので、4bitなら4クロックで表現できます。このルールではクロックとデータの2線で、パラレルでは4本必要なデータが扱えます。

ここで活躍するのがシフトレジスタです。D-FFは「クロックの立ち上がり(もしくは立ち下がり)でデータ入力をQに出力、次の立ち上がりまで保持」という動作です。もうなんかアレですよね。
こんな感じに組んで、クロックとデータを入力してやるとうまい具合に左のレジスタから順に先頭のデータから移って行って最後のクロックの立ち上がりで一番右のレジスタにデータが入っておしまいです。データは各FFの出力から取れます。

という具合にシフトレジスタの仕組みがわかったのでこれの8bit版で7セグ表示機を作ってみました。
家に転がっていた部品でできました。7セグは三桁です。これにマイコンで発生させた8bitのデータを送ると…
わ!

問題点
・単に8bitのデータを送っているだけなのでもしノイズとかでズレたら終わる。
・データ受信中も7セグが光ってしまうので関係ないセグメントが若干光っている。
失敗集になるかなぁと思ったのですが強行しました。

1個目の問題はパリティ等でデータがきちんと受信できているか確認するなりすればマシにはなりそうです。2個目の問題は8bit送り終わるまではLEDを消しとくみたいな機能が必要になってくるのでちょっと面倒です。ピンを1つ増やしてLEDの点灯制御に使うのが一番簡単かなぁと思います。

ちなみに受信データです。
1000_1000を送っているところです。データフォーマットは下位4bit(0~3bit)で2進の数値データ、その上の3bitで7セグの桁選択となっています。各桁違う数字が表示できるのはダイナミック点灯しているからです。最後のbitはLEDの点灯/非点灯に割り当てたのですがデータ送信中は結局チラチラしてしまうので全く意味がありませんでした。眠かった。

今回はこれでおしまいです。また進展があれば続きを書くかもしれませんが、他にも続きものの記事をいくつかスタートさせてしまっている(手遅れ)ので望み薄。

Web拍手反応

>かぶっちょ!
ヘルメットみたいな?

>いつも拝見しています。とても面白いです。これからも頑張ってください!
ありがとうございます!当分は工作を続けていくと思うのでこれからもよろしくお願いします。

>記事の内容が難しいので池沼でもわかりやすい言語でお願いします
内容が難しいというよりは、簡単なことを難しく書いているということなので問題無いです。
言語の壁については擬音語等を用いて直感的にわかりやすい記事も書いてみようかなぁとも思いますね。

>包茎についてひとこと
バナナ剥いたことある?

>じいちゃん...
独身男性でもじいちゃんになり得る?

>web拍手配置しすぎなの草(もっとして)
まぁなんか軽く一言書いて欲しくて置いてるので構いません(これ以上はしない)。

>わ!
小野(わ)妹子

>次回の記事が楽しみ
>って一言はその"次回の記事"に掲載されるんですね.
ご名答!誰宛の一言かわかんないので適当に次記事書く人が返すことになってます。

>みてるかなぁ〜^^
ジロジロ^^

>おなかです
消化して

>ギャップの悦びを知りやがって...!
自分たちばっかし(トロイダルコア)

>友人が話していた統合失調症の条件に当てはまってしまったのですがどうすればいいですか?
どうすればいいかここに書き込んでる時点でアウト寄りなんだよなぁ…。

>KKTはやく記事書いて
>KKT記事はやく書いて
>あっ失敗集でもいいですよ
書きました書きました

>自分が童貞のくせに僕の事を童貞と煽ってくる友達がいてやれやれと思っているのですがどのように対処すればよいですか?ちなみに僕は童貞です
私もこんなWeb拍手見てやれやれと思っています。ちなみに僕も童貞です。

>もっと拍手したい...
どうもー^^

>インフォームドコンセントすこくすご
誰でも作れるので是非お試しを

>これってどの記事に投稿された一言かわからないな?
ご名答!もしどっちか(僕orなかたくん)宛にっていう希望がありましたら一言添えてくださいな。

>トロイダルコアは下ネタに含みますか?
トロイダルコアの穴は存在するか

>オムライス
>オムライス^^
えぇ…。おいしいよね。

>なかた
これは…なかたくん宛かな

>web拍手のいいネタが思いつきません。
どんなこと書いても目は通してるから心配いらないのよ

>ぼくです
>わ
>クワッ
黒板の隅っこにこんな落書きありそう

それでは、今日はこの辺で。

http://clap.webclap.com/clap.php?id=fellabo