2016-11-30 19:20 | カテゴリ:PIC応用回路
手持ちのAIWAの赤外線リモコンの信号を受信して解析することに成功しましたので、ブロ友の6jiroさんが紹介された、薄型の小型リモコンをWEBで見つめて注文していました。
デザインが多少異なりますが、赤外線信号はPWMと教えていただきましたので、プログラムの修正は最低限で済みそうです。

1封筒

今度は、このリモコンの信号を処理するように、プログラムを修正していきます。

続きは、、、、
【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(7)
2016-11-28 11:06 | カテゴリ:PIC応用回路



MPLABXのフリーコンパイラーである、XC8のプログラミングにもずいぶん慣れてきたつもりです。
最初は、C言語特有の「作法」に戸惑ったりしました。
いきなり、void とか、突然出てきて、面食らいました。

習うより慣れろで、壁にぶち当たりながら、息子に教えを乞うこともあって、なんとかプログラミングに慣れてきました。

しかしながら、寄る年波、デバッグには結構てこずっています。

論理上のプログラムの流れのデバッグは、手がありませんが、予想外にてこずったのが、ERRORの出ない、文法のミスでした。
そこで、初心者の私が、未だに結構はまってしまっている、落とし穴を整理して、備忘録としたいと思います。
どう考えても、プログラムが正常と思われても、期待通りの動作をしない時にチェックしてみたら良いと思われるポイントを、自分なりに挙げてみました。



チェックポイントとティップです(順不同)
私の記憶では、下記の記述ではERRORにならないと思います。
それだけにバグの発見はなかなか困難です(笑)


* IF分の条件判断で、等しい場合に等号を一つしか記述しない。
  正しくは、 A == Bとする。
  感覚と異なるので、はまると発見しずらいERROR。
  わかっていても私はこれが一番多いミスです。

* 論理記号、&「AND」と|「OR」。 文献やWEBのC言語では、「&&」とか「||」とか記述されている場合がある。
  XC8では、一つを記述すればよい。

* FOR分の開始点。 A=0; が正しいが、IF文と混同する場合あり。A==0としてしまうかも。

* 常数の指定で、16進数は、0xFFFF、2進数は、0b00001010。
  以前、16進表記から2進表記に途中で変更した際に、0xを0bに変更するのを忘れて、バグ取にはまりました。

* 左右のシフトの論理演算の結果を得る際、 ABC = ABC >>2 とする。
  ABC>>2;
  では不正。
 
* EEPROMに常数を定義する方法は eeprom JOUSU[10];
  で、確保できる。特別に書き込み、読み出しルーチンを用意しなくても良い。

* 文字列の配列にASCII文字などを代入して、ポインターを利用して表示させる際、配列のデータの最後は、'0\' の終了記号をセットする。
  これがないと、プログラムが「終わりがないと」理解して、暴走する。

* 16ビットデータと8ビットデータのビット計算のコツ。二バイトのデータから16ビットのデータにまとめる。
  受け側の変数と代入する変数のバイト数を考える。

  例 
        unsigned char CMD_dataH, CMD_dataL; //  8ビット変数
        unsigned int cmd_entry; // 16ビット変数

        として

     cmd_entry = CMD_dataH;   // 一旦16ビット変数に代入
    cmd_entry = cmd_entry << 8; // それをシフト
     cmd_entry = cmd_entry | CMD_dataL; // そしてORをとる


ひとまず、この様なところをチェックポイントとして上げてみます。
今度バグではまったら、ここをチェックしてみることにします(笑)


【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(4)
2016-11-25 21:38 | カテゴリ:PIC応用回路


ブロ友のYangminさんが、空中給電のキットをテストされた結果をレポートされていましたが、とても興味深い記事だったので、思わず実験してみようと。
罠にはまってしまいました(笑)

ブログを拝見する限り、特別な機材を使用しなければならない様子でもなく、コイル2個とドライブ用の回路と受信回路+LEDの回路と思われます。
想像するに、送信回路は交流信号でドライブし、受信回路はダイオードで整流したのち、抵抗を入れてLEDに繋げばよいと思われます。
送信の交流信号をどうするかですが、一般的なモーター回転駆動用のICで正負信号を逆転すれば良さそうですが、片側だけのパルス信号でも効率は落ちるが、行けるかもしれません。

Yangminさんにコイルの太さなどを教えていただきました。(ありがとうございました!!)
早速、ホームセンターへ行って、0.6mm径のエナメル線を調達。(これしかありませんでした)(笑)

coil02.jpg

電源は、以前に制作した、Nゲージ用の簡易PWMコントローラを使用することにしました。

coil01.jpg

このコントローラはDC12V入力で、PWMでプラス方向のパルスを発生します。
電流計をつないで、どの程度電流が流れるか確認して、かつ、コイルの発熱にも注意して、ドライブ側のコイルに通電してみました。

机上にコイルを置いて、SWを入れ、徐々にVRを上げていきます。
PWM特有の高音のノイズをコイルが発生して、それが机の木に多少共鳴するようで、小さく聞こえます。

電流は、500mA程度までUPしましたが、この辺りから、コイルが発熱してきましたので、一応、この辺を限度とします。

coil03.jpg


受信コイルには、赤色LEDを1.2KΩの抵抗を通して接続してあります。

coil04.jpg


では、早速、受信コイルを近づけてみます。

2Cm位に近づけると、LEDが赤く光りだしました。
PWMのマイナス側が無いので、POWER的には半分になっていますので、輝度は暗く、、しかし、ちゃんと光っています。

coil05.jpg


まずは、初期のテストは成功といったところでしょうか。
今度は、ちゃんと正負の電圧で両方向にドライブして、かつ、受信のLED側も、整流してやれば、送信効率もUPして、LEDの輝度も上がると思われます。

実は、空中給電ができたら、同時にもう一つやってみたいことがあります。
それは、この空中給電のパルス信号を変調させて、PICにコマンドを送って、何か動作を切り替えるようなことができないか、なんです。
鉄道模型の、DCC制御みたいなものです。

果たしてできるかわかりませんが、考えてみたいと思います。

【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(4)
2016-11-23 21:10 | カテゴリ:PIC応用回路
手持ちにあった、ミニコンポ(AIWA)の赤外線リモコンの信号を解析して、模型に応用すべく、プログラムを製作してみました。
ブロ友の6jiroさんがご紹介くださったプログラムがAVR用だったので、PICでできないかと思いついたのですが、、、、
思わぬところで、はまりまくってしまいました。(この辺は後日顛末記でご紹介します)(笑)

1AIWA.jpg


このリモコンは、調べてみると、42ビットのデータフォーマットをして、通信のタイプは、PWM方式との事でした。
まずは、実際の信号を調べることから始めました。

続きはこちらから、、、、
【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(4)
2016-11-21 13:15 | カテゴリ:PIC応用回路
2か月ほど前に、中国から「なんちゃってPICKit3」を購入して、便利に使用していましたが、最近書き込み時に「電圧が5Vにならず4.75Vの為に書き込みできません」のエラーが頻発するようになりました。

ERR2.jpg

USBをさしなおしたり、PICをソケットにしっかりさしなおしたりして、復旧することがあったのですが、いよいよ何度やってもダメになりました。
本来ならこんなメッセージで書き込みが完了するはずなんです。

GOOD2.jpg

これは、「なんちゃってPICKit3」の電圧監視回路が動作不良を起こしたのではないかと思い、購入元に保証期間かわからないが、ダメもとで修理か交換のメールを出したら、速攻で「代品を送った」と返事が。
有難いことに日本語の文面なんですが、ちょっと微妙な日本語表現です。(笑)
「えー?ほんと??」
到着までに10日ほどかかりますが、待つことに。
物は言ってみるものです。

そんなうち、ノートPCでもPICのMPLABXでプログラミングをしている関係で、こちらのノートPCで「なんちゃってPICKit3」を使ってみました。
「ちゃんと書き込みできます!」

おかしいなぁ?
ひょっとして、デスクトップPCのUSBの電圧が出ていないのかも、と思い、USB端子の電圧を見たら、4.9Vしかありません。
しかし、PCの電源部分での5V供給は、ちゃんと5V出ています。
ひょっとしたらUSB関連の回路の不安定があるかもしれませんが、実際の動作中の電圧の計測が難しいので、できていません。

同じUSB系統にはプリンターやMIDIキーボードなどが接続されていますが、ちゃんと動作していたので、気が付きませんでした。
「なんちゃってPICKit3」はバスパワーで、プリンターなどは、自前のパワーだったのでしょうか。


そこで、ダメもとで外付けのUSBポート(4ポートでACアダプターで電源供給ができるもの)をヨドバシさんで購入して背面のUSBコネクターから引っ張って、PC正面に廻して新たにUSBポートを設けました。

DSC02981.jpg


早速、テストです。

おー、今のところ「なんちゃってPICKit3」がちゃんと動作して、書き込みエラーも出ていません。

これは「なんちゃってPICKit3」は壊れていなかったかもしれません。(笑)

そうこう言っているうちに、代替え品が届きました。
セット一式です。
しかもSN#までも同じでした。(笑)

NewPICKIT3.jpg


送り返すのも失礼になるので、将来の故障に備えてバックアップ品とさせていただきました。(多謝!)




【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(8)
2016-11-15 12:57 | カテゴリ:PIC応用回路

CPU付きLEDXC8言語でのドライブに成功しました!!
(紆余曲折の末)



先日トライして、挫折、あきらめかけましたが、再再度トライして成功しました。
これもロジアナの助けがあっての成功でした。


(なぜマイクロチップ社のアプリノートで上手くいかなかったのか)

マイクロチップ社のAN160アプリケーションノートをPIC16F1716に応用しましたが上手くありません。
ここの解析を検討しましたが、以前に書きましたように、PWMの波形のフェーズとシリアル通信のクロック(SCKとSDO)のフェーズがなぜか約200nsecほどずれることがロジアナの観察で分かりました。
具体的には、SCKなどのシリアル通信の位相からPWMの位相が200nsecほど遅れることがわかりました。
この時は20MHzのクロックだったのですが、PIC16F1716のマニュアルを見てみると、PWMは、TMR2のカウントゼロから立ち上がって、TMR2がカウントアップし、P2Rで指定された値と一致したら、ゼロリセットされ、そのリセットパルスが各周辺レジスタに配信されます。
このTMR2のカウントが一致したときに出される「T2mutch」パルスが終わって、次のPWM信号が立ち上がります。

LED_T2Mutch.jpg

あれ~、それじゃあ、このT2mutchパルスの間はPWMがゼロのままじゃないの。
というわけで、ロジアナで確認したら、まさにT2mutchパルスが、SCKの立ち上がりから立ち上がって、T2mutchが終了したところでPWMが立ち上がる様に観察されました。
つまり、問題であったPWM3のパルスの立ち上がりの遅れを、このTMR2mutchのリセットパルスがちょうど埋めてくれるというわけです。(ラッキー)

PWM波形の位相の遅れの原因はこのT2mutchパルスだったのです。

続きはこちらです、、、、
【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(6)
2016-11-10 17:02 | カテゴリ:PIC応用回路


今回導入したのは、ZEROPLUS社(台湾メーカ)LAP-C 16032という機種です。
16ch同時取り込みで、最大100MHzでサンプリングでき、メモリーは32KBです。
一連のシリーズ中で最も下のランクに位置づけされます。
このモデルは、いつもの秋月さんでは在庫がなく(64KBメモリー版はありましたが)ストロベリーリナックスさんで購入しました。
15千円ほどでしたが、クリップ端子が20本おまけでついていましたので、お得感がありました。

さて、このロジアナですが、使ってみれば、素人の電子工作には十分すぎるほどの性能と機能です。

DSC02979.jpg


今回は、このロジアナの特徴の一つでもある、信号解析の機能をテストしてみました。
テストしたのは、

「i2c」と「RS232通信(USART)」の二種類です。

つづきは、、、
【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(4)
2016-11-08 20:24 | カテゴリ:PIC応用回路


以前にマイコン内蔵のフルカラーLEDをPICで制御して、宇宙家族ロビンソンのロボット「フライデー」の口に仕込んで光らせていました。
あの時は、WEBでいろいろ探して、LEDをドライブする部分だけアセンブラで記述して、高速性を確保しつつ、他の部分はXC8で製作していました。

今回、新しいPIC(16F1716)で複数のPWMやタイマー、あるいはある程度自由の利くロジック回路までが内蔵され、これをうまく使えばシフトレジスタ(MSSPのSPI通信)でアセンブラ部分を置き換えることができるのではないかと考えて、挑戦してみました。

先に結果を言いますと、「残念でした」

マイコンLEDの制御は、短いパルスとちょっと長いパルスを、0と1に見立ててシリアル通信で行うのですが、このパルスの波形の仕様が結構厳しく、結果的に思うようにいきませんでした。
「反面教師」ということで、失敗したところまでちょっと説明させていただきますと、、、

LEDのデータシートでは、

「0」= Hが0.35マイクロ秒  Lが2マイクロ秒のパルス
「1」= Hが1.36マイクロ秒  Lが1.3マイクロ秒のパルス

となっています。
これをRGB各色8ビットで、合計24ビットのデータを送れば、LEDが発色します。

新しいこのPICには、PWMが2系統あり、TMR2をクロックとしてPWMを制御しています。
一方、シフトレジスタとして使用したいSPI通信は、TMR2をクロックに選択できますが、この周波数の1/2でしか駆動できません。
つまり、PWMパルス2個でシフトレジスタの送信が1ビット分となるわけです。
これが第一の問題です。


次に、PWMとSPI通信のクロックを先日導入したロジアナで調べてみたら、なんとPWMの位相とSPIのクロックの位相がズレていることがわかりました。

Phase001.jpg


これでは、PWMの立ち上がり(あるいは立下りのタイミング)とSPI通信クロックのタイミングがずれて、通信データが同期されません。
これが第二の問題。

ただでさえ、0.3マイクロ秒のパルスを送り出すようなシビアな時間計算で動作させるように考えているのに、0.2マイクロ秒も位相がズレていました。

そこでこれらを考慮して、なんとか仕様に合うようなパルスを作ろうと、工夫したのですが、どうも条件に合わせることがむつかしく、近い波形は得られましたが、LEDが動作するには至りませんでした。

Phase002.jpg


この一番下の波形です。

「0」= 0.3マイクロ秒くらい(幅の狭いほう)
「1」= 1.0マイクロ秒くらい(幅の広いほう)

特に、「1」のパルス幅がかなり不足しているようです。
これではちょっと動かないなぁ(笑)

というわけで、新しいロジアナの操作にはちょっと慣れてきました。(任意のピンで計測開始トリガーもかけられます)

追伸:下記のBLOGでも同様にPICでSPIを使用してトライしている人がありましたが、いまだに成功できていないようです。

https://sanje2v.wordpress.com/2013/07/10/controlling-rgb-led-strips-ws2811-chip-with-pic16f877a/#comment-253


で、ここで諦めてこのままスルーするのも後味が悪いので、以前に製作したアセンブラを組み込んだCPU付きLEDの制御プログラムを関数としてアップします。
ご興味のある方は、追試などされてはいかがでしょうか?

関数の形です。


//-------------------------------------------------------------------
// r,g,bに1バイトのRGBの各輝度データをセットしてDisp_CPU_LEDを呼ぶと
// そのデータをシリアル変換して RC1 から出力する関数
// あらかじめRC1を出力用に設定する事
// 下記のPORTC,1 を希望のポートに変更しても可
//--------------------------------------------------------------------

void Disp_CPU_LED(unsigned char r, unsigned char g, unsigned char b) {

volatile unsigned char rr, gg, bb, c; //ローカル変数
rr = r;
gg = g;
bb = b;


  // GIE = 0; // 割り込み禁止にセット(必要に応じて)

#asm // ここからアセンブラの記述

putbit MACRO var, bit // ビット操作のマクロを定義する
btfsc var, bit // var変数の所定のビットをチェックし1なら61行へ

// goto $ + 7 // ジャンプする

goto $ + 8
bsf PORTC, 1 // 0ならRC1をHにして
nop // 約2マシンサイクル(20MHzの場合は0.4マイクロ秒)後に
bcf PORTC, 1 // Lに戻す
nop // Lのまま4マシンサイクル維持しマクロ終了
nop
nop
goto $ + 9

bsf PORTC, 1 // 1ならRC1をHにして(61行目)
nop // 約7マシンサイクル(1.4マイクロ秒)後に
nop
nop
nop
nop
nop
bcf PORTC, 1 // Lに戻す
//Lのまま2マシンサイクル維持し、マクロ終了

ENDM

BANKSEL Disp_CPU_LED@rr // 変数rr(RED)の場所にバンクを切り換える
putbit Disp_CPU_LED@rr, 7 // RED dataのビット7から順次チェックする
putbit Disp_CPU_LED@rr, 6
putbit Disp_CPU_LED@rr, 5
putbit Disp_CPU_LED@rr, 4
putbit Disp_CPU_LED@rr, 3
putbit Disp_CPU_LED@rr, 2
putbit Disp_CPU_LED@rr, 1
putbit Disp_CPU_LED@rr, 0

putbit Disp_CPU_LED@gg, 7 // Green
putbit Disp_CPU_LED@gg, 6
putbit Disp_CPU_LED@gg, 5
putbit Disp_CPU_LED@gg, 4
putbit Disp_CPU_LED@gg, 3
putbit Disp_CPU_LED@gg, 2
putbit Disp_CPU_LED@gg, 1
putbit Disp_CPU_LED@gg, 0

putbit Disp_CPU_LED@bb, 7 // Blue
putbit Disp_CPU_LED@bb, 6
putbit Disp_CPU_LED@bb, 5
putbit Disp_CPU_LED@bb, 4
putbit Disp_CPU_LED@bb, 3
putbit Disp_CPU_LED@bb, 2
putbit Disp_CPU_LED@bb, 1
putbit Disp_CPU_LED@bb, 0
#endasm
// GIE = 1; // 必要なら上記処理中の間、割込みを禁止にしてください。その際は、
// 処理を終える際に、割込み許可をONに。
}


このプログラムで出力されるパルス波形の例です。


CPU_LED_asem.jpg

上の二つの波形は同じものです。
【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(2)
2016-11-06 21:56 | カテゴリ:PIC応用回路

ノートPCでは上手くいったのですがデスクトップPCではトラブルに (笑)

ZEROPLUS社製のLAP-C(100M SPS、16Ch処理)です。

C02_300dip.jpg

C01_300dip.jpg

現在、2CHのオシロを使用しています。数年前にPIC工作に必要(クロック確認や各種信号解析用)で、国産(KENWOOD製)を導入しました。
しかし、メモリー機能がないので(高価で買えなかった)単純波形の観察以外にはちょっと厳しい状況でした。

最近になって、新しいPIC(PIC16F1716シリーズなど)を活用するに際して、必要性を感じ、何かないかと探していたら、この機種を見つけました。
素人の電子工作に使用するので、「プロ仕様」は必要ありませんが、UARTやi2cなどのプロトコールも解析出来たらありがたいです。
16CH処理で、各種のプロトコール解析も内蔵しているとのことで、これで15千円。
早速、注文しました。


このモデルは、USBケーブルでPCに接続し、データ表示と解析はPC側で行います。
物理的な電気信号の収集はこのBOXで行い、それをUSBでPCに送信し、PCのアプリケーションソフトで表示と解析を行います。

c02.jpg

WEB検索すると、3-4件、このモデルの使用経験や、操作説明などを発表されているサイトがあり、大いに参考になりました。
というのも、この最下位モデルには、紙の説明書が付いていません。
説明書は英文の物をWEBからDLしなければならず、PC上で英語のマニュアルを見ながら、片やPCでソフトを操作して、という具合で、どうも勝手がよくありません。

WEBのおかげで、最初の敷居がずいぶん低くなりました。


まずは使用テストを兼ねて、CPU付きLEDのドライブ信号の解析を行うことにしました。
じつは、これが今回の一番の目的でした(笑)

CPU_LED.jpg

以前製作した、アセンブラをC言語を組み合わせたプログラムがありましたが、それを今回はシフトレジスタなどを使用して、PIC16F1716で実現することを目的で、プログラムを組んでいたのですが、オシロで信号波形を確認して、正しい信号と思われるのに、動作しないという問題があり、その解決に役立てようという目論見です。
PICの所定端子から、SCK(クロック)、SDO(データアウト)、シフトレジスタ出力を取り出して、観察して見ることに。
所が、肝心のPC用アプリケーションソフトをデスクトップPCにインストールしたのですが、計測モジュールを認識しません。

ERROR.jpg

恐らくは、USB経由で認識されていない様子です。
USBドライバーは、アプリケーションSWをインストールする際に、同時にインストールされているはずです。
というのも、デスクトップPCにインストールする前に、ノートPCにインストールして、確認していました。
ノートPCでは、ちゃんと認識して、動作しました。

ここではまりました。

ノートPCとデスクトップの違いはありません。
どちらもWIN10にバージョンアップしています。
いや、まてまて、ノートPCは、WIN10のHOMEですが、64ビット。
デスクトップはWIN10のプロですが、32ビット。
うーん、微妙。
何度か、ドライバーソフトやアプリを再インストールしてもダメでした。

困った。

ドライバーの組み込み状況を確認しましたが、やはり、デスクトップのPCにはドライバーが上手く組み込まれていませんでした。
その他のドライバーの所に「?」で入っています。

DeskTopPCDevice.jpg

一方、ノートPCではちゃんと。

DeskTopPCdevice2.jpg

そこで、購入元の「ストロベリーリナックス」のWEBサイトのFAQをチェック。
すると、「WIN VISTA 64のドライバーインストール方法」のページが。
私は64ビットは問題ないのですが32ビットが問題。
しかし、そこに書いてある様にCドライブのアプリのフォルダーの中のドライバーを再インストールしました。

これでOKとなりました。

DeskTopPCdevice2.jpg


ちゃんとドライバが認識されました。

早速、回路の波形を観測してみました。

テスト波形

これでようやくロジアナをセットアップできましたので、これからCPU付のLEDのドライブテストが始められます。



【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(8)
2016-11-01 20:09 | カテゴリ:国内旅行


息子たちが社会人になって、初めて家族旅行をしてきました。
もう、うん十年ぶりです。

行先は、それもうん十年前に家族で行った信州です。
コースは、名神から中央道を経て、諏訪湖経由で蓼科温泉で一泊。

諏訪湖1

諏訪湖2

その後、御泉水自然園、

御泉推自然園

御泉推自然園2



信州そばで昼食、

そば1

そばの日キャンペーンで、この天ざる、500円でした!!

そば2


さらに美ヶ原高原経由で、

美ヶ原


松本の美ヶ原温泉で一泊。

松本夜景


翌朝、松本城を見学して、帰路に。
松本城はお堀の水面に映ってとてもきれいでした。

松本城



とても楽しい旅行でした。