---自作MPGワイヤレス化 (15)---

 自作手パ(MPG)をワイヤレス化するのにアダプターを作製
 し、後は、ケースに組む状態になってます。
 ただ、念のデータの取りこぼしを調べたら、パルスジェネレータ
 を早く回すと、約半分の取りこぼしがあったので、受信側の
 プログラムにリングバッファーをいれました。
 リングバッファーをいれることで、ほぼデーターの取りこぼし
 がなくなりました。
 
 
 多少、疑問が残ったので、送受信のデーターの取りこぼし
 を調べるのに、ローコストLCDシリアル通信モニター
 作製しました。
 これだけでは、ただデーターの表示をするだけなので、
 カウントしたデータを計測してターミナルに表示できるように
 基板とプログラムを作成しました。
 基板といっても、PICにバスコンとICSPの端子をつけ
 
 ただけのものです。

 

 比較的短時間で、ほぼ動くようになりましたが、二つほど
 ドツボにはまって、二日ほどもがくことになりました。
 
 一つは、リングバッファーの操作でした。「s」のキャラクター
 が入力された一つ前のデーターをカウントのキーにするのに、
 リングバッファーの読み取りのポインターを「s」の一つ前に
 もどせばいい、と思いこんでいました。これが、ドツボの始まり
 でした。
 いくら、やっても、思ったキーになりません。
 読み込んだデータを、デバッグ用に表示してみて、やっと
 分かりました。
 データを取り込んだ後、ポインターを次の読み込みにそ
 そなえて、一つ進めていたのです。
 本来なら、ポインターを二つもどさないとだめなわけでした。
 「-1」としていたところを「-2」にしてやっと解決です。
  もう一つは、久しぶりに使ったprintf( )のフォーマットの間
  違いでした。
 「int」の「%4d」としなければならないところを、「char」の
 「%c」としていました。当たり前に、表示されないので、
 あれこれいじって、やっとprintf( )のフォーマットにたどり
 つきました。
 昔、PC用に、Cであれこれやっていたころは、printf( )が
 大嫌いで、直接ビデオラムを操作して表示する関数等を作って
 使ってました。
 今回は、ターミナルへの表示位置を決めるのに、printf( )を
 つかって、エスケープシーケンスの使いまくりでした。

 

 とりあえずのプログラムです。
 main.c
 例によって、ゴミが沢山のこっています。表示をもうちょっと洗練
 させたいなと思ってますが、計測中の表示をやめて、計測終了
 後に表示させた方が、いいのかなと、思案中です。

“---自作MPGワイヤレス化 (15)---” への4件の返信

  1. AGENT: Mozilla/5.0 (Windows NT 6.1; rv:42.0) Gecko/20100101 Firefox/42.0
    oldmanさん、こんばんは。引き続きありがとうございます。
    oldmanさんおっしゃるように、A相B相の立ち下がりの検出の方法が思いつかなかったことも、今回のようなプログラムにした一因です。
    でも、oldmanさんのNOT・A相を作ればいい、というお話をきいて、今回も目から鱗でした。これでしたら、私にもできそうです。
    受信側は、
    switch(Buffer){
    case \’A\’:RA0=1;//A相-立ち上がり
    break;
    case \’a\’:RA0=0;//A相-立ち下がり
    brak;
    case \’B\’:RA1=1;//B相-立ち上がり
    break;
    case \’b\’:RA1=0;//B相-立ち下がり
    break;
    }
    で、パルスの生成が可能なんでしょうか。追従できるのかどうか、ちょっと分かりませんが、やって見ようと思います。ありがとうございました。

  2. AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0
    maboさん、こんにちは。
    >多分、同期をとならないとだめだろうな、と言うことで、断念いたしました。
    との事ですが、しっかりと割り込み処理( = 同期処理!)をされてますよね。
    (1) A相、B相の信号から、NANDを使って notA相とnotB相という逆転した信号を作る
    (2) これら 4個の信号を RB1~RB4に接続する
    とする事で、PIC 16F1783 でA相とB相および not-A相とnot-B相信号の立ち上がりを送信する事が出来ます。
    つまり、例えば、
    ・A相が \’on\’になった時に 文字\’A\’を送信し、\’off\’になった時( = not-A相が\’on\’になった時)に 文字\’a\’を送信し
    ・B相が \’on\’になった時に 文字\’B\’を送信し、\’off\’になった時( = not-B相が\’on\’になった時)に 文字\’b\’を送信し
    て、A相/B相の信号変化のタイミングを通知する訳です。
    受信側では このタイミングで A相/B相の信号をon/offすることで、信号線同士の『同期が取れた』事になります。
    難しく考えないで、デジタル信号を伝送するには その信号が\’on\’になった時と\’off\’になった時を通知するという基本に立ち返る事です(ひとつのデジタル信号あたり2個の割り込み処理が必要ということです)。
    混乱の原因は X,Y,ZやX1,X10,X100の信号は \’on\’になった事だけを通知すれば良いのだから A相/B相も \’on\’だけを通知すべきとの誤解だと思います(A相/B相の\’off\’になったという情報が無いので タイマーで補完せざるを得ない)。
    X,Y,Z等の信号は 単独の事象では無く相互に関係しているので(ex. Yを\’on\’にすると XとZは\’off\’になる) \’off\’の通知が省略できるだけです。
    例えば、モーターを動かすスイッチを考えると、スイッチの \’on\’ 及び \’off\’ を通知しなければいけないけど、スタートボタンとストップボタンを使うのであれば、スタートボタン及びストップボタンの \’on\’ のみを伝えれば良い訳です。
    (この例では、モーターの制御には、何れにしても 2種類の情報の通知が必要という事です)。

  3. AGENT: Mozilla/5.0 (Windows NT 6.1; rv:42.0) Gecko/20100101 Firefox/42.0
    oldmanさん、こんばんは。お久しぶりです。書き込みありがとうございます。また、アドバイスありがとうございます。
    アドバイスの内容、おぼろげながら理解できるのですが、能力不足でしょうか、今のところ実行には移せそうにありません。
    無線化にあたって、MPGがどのような信号作ってるのか、分かりませんでしたので、トライアンドエラーで、似たような信号を作ってみました。
    MPGの信号をオシロで見てみると、回転速度に応じて振幅にも幅があるようですが、プログラムが面倒そうなので、固定の振幅にしました。
    MPGの信号、本来なら、同期をとらないといけないと思うのですが、今の私の、力では無理なので、全部、一端、キャラクターに変換して、キャラクターを送信し、受信側で、MPGは信号の生成をしています。
    ですので、振幅等は、変化させていません。
    oldmanさんのおっしゃるように、
    >A相/B相パルスを直接無線伝送した方が簡単じゃないでしょうか
    の方法もちょと頭よぎりましたが、多分、同期をとならないとだめだろうな、と言うことで、断念いたしました。
    いつか、oldman さんのおっしゃるような方法ができるようになるかなあ、なんて・・・。還暦を3年ほど過ぎた年齢で、ちょっと、無理のような気もしますが・・・・。(笑)

  4. AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0
    maboさん、こんにちは。
    データの取りこぼし-受信側のプログラムにリングバッファ-の記述をみて?となり、過去ログを見させて頂きました。
    ワイヤレス化 No.14 のcプログラムを見ると、
    - 7.5mSecで A相/B相のパルスを生成
    - (MPGを毎秒1.3回以上の速度で回転させると)パルス発生処理が間に合わなくなるのでバッファリング処理
    していますが、この A相/B相のパルス幅を5mSec(or 周波数 133Hz)に制限する意味は無いように思えます。
    ワイヤレス受信部 - SmoothStepper - USB - パソコンの間なら最低でも1kHz程度のパルス処理ができるハズですので
    A相/B相のパルス幅はMach3(パソコン)の処理速度次第ではないでしょうか( ex. パルス幅 1mSec ?)。
    また、「手パ(手動パルスジェネレーター)切り替え器制作(8)」内の「今回の設定は、諸兄の設定とほぼ同じです。」に行って「 手パの設定(1)」を見ると、
    SmoothStepper(以下SS)に接続-A相 B相が主力される信号をポート3に入れます。
    という箇所に目がとまりました(何せ ナナメ読みなもので ^^;)。
    A相/B相パルスをDIR/Clockに変換 - 無線伝送 - Dir/ClockをA相/B相パルスに変換(含むバッファリング)
    の替わりに、A相/B相パルスを直接無線伝送した方が簡単じゃないでしょうか( どこか読み落としているかも ? )。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA