---Fusion360をいじってます。(1)---

 諸兄のHPに影響されて,Fusion360を弄り始めました。
 なかなか思うように操作ができませんが,これ一つで,
 図形作成からパスの作成までできてしまいます。
 使えるようになると,大きな武器になるように思います。
 悪戦苦闘して,剪定ばさみの取手のモデリングができました。
 あわよくば,アルミ等で,削り出せればなんて考えてますが,
 道のりは,遠いです。
 3Dの加工になりますので,4面の加工をしなければなりま
 せん。どんな手順でするか,4面の加工となると,ワークの
 固定だけでも,大変です。
 Fusion360のいいところの一つは,作成の過程の履歴が
 残ることです。
 ビデオよろしくその履歴を再生することができます。
 3D加工はしたことがないのですが,課題ですね。

---NCVCのHPダウン---

 64ビットのノートを購入してから,環境を少しずつ作ってい
 ます。
 NCVCも入れておこうとアクセスしましたが,ダウンしているよう
 で,アクセスできません。
 サーバーの不具合でしょうか。NCVCのHPは確かXOOPSを
 使ってたと記憶しています。
 私も以前XOOPSでHPを作成したことがありますが,結構難し
 かったように思います。
 VECTORでもDLできますが,早く復活してくれないか
 なあ。

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

 道のりは、長いです。
 自作手パの無線化を進めてきましたが、一つ、疑問だったこ
 とが解決できそうですので、仕様?を変更してみたいと思い
 ます。
 今までの無線手パでは、A相B相の信号は、直接送っていま
 せんでした。A相とB相の信号から、CWの信号とCCWの信号
 に変換して、CWの信号とCCWの信号を送りました。
 受信側で、CWとCCWの信号に応じて、パルスを生成してい
 ました。
 このようにしてたのは、A相・B相の立ち上がりの検出はでき
 たのですが、立ち下がりの検出方法が分からなかったから
 です。
 NANDゲート等を使ってNOT・A相を作ればいいというアドバイ
 スをいただきました。下記のような回路で、試作してみようと
 思います。

 

 
 CWやCCWのの判定をするのに、立ち上がりでの外部
 割り込みを使いましたが、NOT・A相、NOT・B相を作ることで
 A相B相の立ち下がりを立ち上がりとして検出できそうですの
 で、状態変化割り込みでNOT・A相、NOT・B相の検出を追加す
 るだけですから、それほど大きな変更はしなくてすみ
 そうです。

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

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

 

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

 

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

---手パ(手動パルスジェネレーター)切り替え器制作(10)---

 一応完成した手パ(手動パルスジェネレイター=MPG)で
 すが、コントロールするのに、割り当てた信号線を、
 オルタネートでコントロールしてました。ふとしたことで、
 モーメンタリーでもコントロールできるのではと思い、タクト
 スイッチで、簡単な基板を作って、実験してみました。

 結論から言うと、モーメンタリーでも、コントロールが可能
 でした。
 JogモードからMPGモードへの切り替え、各軸の選択は、
 モメンタリースイッチでも大丈夫でした。
 市販のMPGの各軸選択には、ロータリースイッチが使われて
 います。ロータリースイッチにするのは、多分、誤動作防止
 の意味合いが強いのかなと思いました。

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

 昨日コーディングしたリングバッファーを使ったプログラムの
 検証が終わりました。
 ほぼ満足のいく結果で、データーの取りこぼしもほとんどなく
 なりました。
 今回、リングバッファーに使ったメモリーは、256バイトで、
 これだけで、メモリーの74%を使ってしまいます。
 でも、効果、絶大ですね。パルスの生成に時間がかかる
 ので、その時間差を吸収してくれます。MPG1回転で、
 100パルスですから、2回半程度の回転に対応できると
 思います。
 今回は、大きなはまりどころもなく、すんなりでした。
 main.c
 ざっと、ゴミを取り除いたプログラムです。
 例によって、「uart.c」と「uart.h」は諸兄のものをそのまま
 使わせていただいてます。
 
 LCDのデバックモニターを作成予定ですが、ついでに、
 I2C接続のLCDもあれこれいじってみようと思います。
 本日、LCDの部品が到着しました。

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

 どこでデータが欠落するのか、いろいろ調べようと思って
 ます。そのために、LCDデバックモニターを作って、みようと思
 います。部品を注文しましたので、届くのをまちます。
 デバッグモニターの制作と平行して、データー受信を
 リングバッファーを使ったプログラムに変更しみようと
 思います。
 当初は、リングバッファーを使ったプログラムにする予定で
 したが、リングバッファーの理解がいまいちで、コーデング
 できませんでした。その一番の原因は、構造体とポインタの
 理解ができてないことでした。
 ネットには、リングバッファーを使ったプログラムが沢山ある
 のですが、そのほとんどが、構造体とポインタという、私が
 一番苦手な手法を使ってありました。
 いろいろあさっていると、構造体とポンタを使わないプログラム
 を使って解説しているHPを見つけました。
 Elementary data structures - Queue
 このHPでやっと、リングバッファーの仕組みが理解で
 きました。
 また、このプログラムを組むにあたって、割り算のあまりを
 求める、計算をしなければなりません。この計算に、結構
 な時間がかかります。一般的には、計算の時間を短縮す
 るために2のN乗の数を使うそうです。2のN乗の数を使う
 ことで、割り算のあまりを出す計算を、X & (N-1)とする
 ことで可能にできるそうです。これで、飛躍的に計算を早く
 できると書いてあるHPにも出会ました。この2のN乗の大き
 さをバッファーの大きさにするそうで、計算時間の短縮がで
 きます。
 この & を使った計算方法が、
 %(剰余)の最適化について
 というHPに分かり易く書いてありました。
 ということで、リングバッファーを使ったプログラムを
 コーデングしていきます。

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

 
 16F1827への移植がほぼ終わったので、有線でのMPGと
 ワイヤレスのMPGの動作について、テストしました。
 Multi Step-Cycle Jog Step1.00の設定で
 100パルス(MPG1回転)をSS経由でMachを動かして
 ました。
   ワイヤレスMPG ゆっくり回転 97.00
              早めに回転 64.00
   有線    MPG ゆっくり回転 100.00
              早めに回転 100.00
 というような結果で、ワイヤレスの方は、早く回転すると、
 4割ほど、パルスが欠落するようです。
 今回生成したA相とB相のパルスは、振幅を少し広めに
 とりました。この振幅をもうちょっと狭くすると、応答もよく
 なるような気がします。
 送信と受信側で、送受信のデータの個数を計測してみ
 
 ようと思います。

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

 外部セラロックを使わないで、内部PLLを使って、32Mhzで
 動作させるために、16F1827に16F88のプログラムを移
 植しました。
 今回、移植するのに、丸々3日ほどかかりました。はまっ
 てしまったのは、二つでした。
 一つ目は、大いなる勘違いで、
     for( ; ; )
 の使い方を誤ってました。そのため、A相、B相のパルスが
 正しく発生できませんでした。16F88で作った時は、パルス
 の発生を前後の余裕をもってしていたので、その余裕が、
 ロジックの誤りを吸収してくれたようです。初期値1~5まで、
 5回のループを作りたいのに、
   for(i=0;i<5;i++)
 のような記述をしてました。これでは、0~4までの5回の
 ループになってしまいます。正しくは、
   for(i=1;i<=5;i++)
 でした。
 もう一つは、原因がよく分からないのですが、クロックを早く
 すると、PORTが思った動作をしてくれなくなるようで、
 PORTレジスタとLATレジスタ
 
 と
 PICとMikroC
 
 に記事がありました。
 早速、LATレジスタを使って組み直すと、見事動きました。
 動いたプログラムです。ゴミが沢山残ってます。
  main.c
 特に、メインの処理では、switch分とif分が混在してます。
 原因をあれこれ探るためにやった名残です。
 もしかして、このように、PICは癖があるのかもしれませんね。
 AVR等は、どうなんでしょうか。
**************************
*           追記           *
**************************

 もしやと思い、諸兄の記事を参考に、ポートのビット操作
 の間に’nop’を一ついれて動かして見ました。
 あれほどなやんだのが嘘のように、通常の書き込みで、
 LATレジスタを使わないで、動きました。
   ’nop’をいれたプログラムです。
     main.c
 やはり、諸兄はすごい。

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

 やっと動作確認できた、送受信の基板を使って、SS経由で、
 MACHを動かしてみました。
 不具合が出るかなと思いましたが、あっけなく動いてしまい
 ました。
 MACHの数字の変化は、有線でつないだMPGに比べてみて、
 若干もたつくような印象でしたが、とりあえず動くことがわ
 かりました。
 今回の回路です。手直した方がいいところがあるかと思いま
 すが、一応動作したもの覚え書きです。

 

 今回は、エンコーダーが作り出した信号でなくて、PICで作っ
 た信号をSSに入れてますので、両者をオシロで比較してみ
 ました。

 

 PICで作った信号の振幅がやや狭いようです。
 広くするのは、簡単ですが、その分、応答速度が遅くなるような
 気がするので、このままにしようと思います。
 また、今回は、UART(USART)の通信速度は、9600bpsに
 しました。PIC周期を32Mhzにすれば、倍の19200bpsに設定
 しても大丈夫だと思いますので、後日変更してみようと思います。
 ただ、受信側に使ってる16F88は、20Mhzまでなので、
 ついでに購入しておいた16F1827に置き換えてみようと思い
 ます。幸い、RXとTXのピンは、プログラムから変更できるようで
 すが、16F88と同じ設定にできるようです。