2016-05-30 20:00 | カテゴリ:PIC応用回路
前回ご紹介しましたPICのAD変換によるサーボの制御について、AD変換の設定方法と使用方法について、少し御説明したいと思います。
以下の説明は、PIC-16F87Xが前提になっていますので、他のPICでは設定の方法などが異なるかもしれません。

16F87Xには、RA0-5のポートのうち、RA4を除いて5つのポートをAD変換の入力に割り当てることが出来ます。
それぞれ、AN0-AN4の4つのchに割り当てられます。(下図参照)
実際のAD変換を行う回路は1ch分しか内蔵されていませんので、どのchのアナログ信号をAD変換するのかを指定し、それを切り替えすることによって、5chのAD変換を実現しています。

(注:出展はマイクロチップ社 データシートです)

PIC.jpg

続きへ、、、、
2016-05-28 17:50 | カテゴリ:PIC応用回路
現在の仕様は、SWでサーボを決まった角度に振る、いわゆるON・OFFの制御です。
できれば、模型の仕様によっては、VRを操作してRCサーボの動きをVRに比例的に動作させたい場合もあるかと思い、検討してみました。
ミッドレンジのPICの16F876には、AD変換機能複数CH分が内蔵されています。
今回は、PINの数の制限もあるので、RA0ポートに備わっている、AN0のCHを一つ使用することにしました。

まずは、動作状況をご覧ください。



(注)一番上のLEDは、AD変換にRA0を使いましたので、点灯しません。

さて、AD変換を利用する方法は、それほど難しくありません。
手順的には

割り込み処理を使用しない場合

1)使用するポート(今回はRA0)を入力モードに設定する。

2)A/Dモジュールの構成を設定 (初期化処理)
  アナログポート、基準電圧ポート、デジタルポートを構成 ADCON1/PCFG0-3
3)A/D変換クロックを選択 ADCON0/ADCS0-1

4)A/DモジュールをON状態にする ADCON0/ADON

5)入力チャネル指定(今回はRA0)

6)A/D入力ポートを選択 ADCON0/CHS0-2

7)サンプル/ホールド・コンデンサ充電時間確保として、入力取得時間経過を待つ(20マイクロ秒)

8)変換開始を指示 変換開始ビットを設定 ADCON0/GO=1

9)変換終了確認
  変換開始ビットがクリアされるのを周期的にチェックする ADCON0/GO=0?

10)変換結果読み込み
   変換結果レジスタを読み込む ADRESH,ADRESL

11)次の変換のために(5)から必要に応じて実行

文書にすると長いようですが、実際は簡単です。

//---------------------------------------------
// PICのPORT設定の初期化 AD変換RA0ポートに設定
//---------------------------------------------
//PICのポート設定
ADCON0 = 0b10000001; //アナログ使用AD0
//ADはRA0 結果はADRESHに左寄せ8ビット
ADCON1 = 0b00001110; //For A/D0 & degital I/O
TRISA = 0b00000001; // A/D変換はRA0で行うのでRA0を入力に設定

および

//-------------------------------------------------------------------
// RA0のchでAD変換を実行し結果をservoに代入する
// AD変換結果は0-256となるので、250以上は250として処理
//-------------------------------------------------------------------

void ad_conv(void) {
ADCON0 = 0b10000001; // AD変換準備RA0チャンネル
__delay_us(20); // 20usecの準備待ち
GO = 1; // AD変換開始
while (GO) {
// GOビットが1の間待つ(0になるまで待つ)
}
servo = ADRESH;
if (servo >= 250) servo = 250;

}

が、AD変換部分を記述したところです。
GOの変数は、AD変換の開始を指示(1にする)すると同時に、AD変換が完了(0になる)した合図にもなっています。
また、サーボの処理の部分を一部変更します。

//------------------------------------------------------------------
// TMR0に割り込み時間をセットして、サーボ信号出力をONに
// 660マイクロ秒をDelay関数で待って、
// TMR0に時間をセットして割り込み処理を許可するが、そのまま割り込み
// 発生をLOOPで待ち、割り込み検出後に、ポートをOFFにして次の処理にすすむ
//------------------------------------------------------------------

void sv_on(void) {

//------- 変更分 -------------------------------------------
// target = parameter[portcnt][2]; //サーボ設定値を読み取り(値=0-255)
//
// if (target != current) {
// if (target <= current) current = current - step; //目標値が現在値よりちいさければstepを減算
// else current = current + step; //そうでなければ加算
// if (current <= 0) current = 0; //下限値チェック
// if (current >= 250) current = 250; //上限値チェック
// }
// servo = current; //値(0-255)をservoに渡す
//--------ここまで--------------------------------------------

ad_conv(); // AD変換実行。結果はservoに格納
port_off(); //サーボ接続ポートをON(負論理)

__delay_us(660); //サーボ制御パルスの最初の基本部分750マイクロ秒をここで指定する

TMR0 = servo;

T0IF = 0; // TMR0 割り込みフラッグクリア
T0IE = 1; // タイマー割り込み解除
while (T0IF == 0) {

// TMR0割り込みが発生するまで待つ
}
}


なお、SW入力部分は使用しませんから、今回はコメントアウトしていきます

//---------------------------------------------
// サーボの制御はAD変換で行うのでSWは使用しない
//---------------------------------------------


// if (sw0 == 0)parameter[12][2] = 0; //SWがON(0)ならサーボパラメータを20に
// else {
// parameter[12][2] = 250; //そうでなければ、250にセット
// }

また、RA0はLEDには使用しませんので、メインのLOOP部分は

//-----------------------------------------------------------
// 配列の設定データにしたがって、LEDを接続したポートをON/OFFする
//-----------------------------------------------------------
// ADにRA0を使用するためportcntは、1から13とする
//-----------------------------------------------------------

for (portcnt = 1; portcnt <= 13; portcnt++) {

if (parameter[portcnt][0] == scnt) seri();
if (parameter[portcnt][0] == 0) rndm();
if (parameter[portcnt][0] == 13) regular();
if (parameter[portcnt][0] == 14) port_pwm();
if (parameter[portcnt][0] == 15) sv_on();
}

このように修正します。

最終的なプログラムをここに置きます。

v030_AD.txt


御参考になれば幸いです。
2016-05-27 14:04 | カテゴリ:PIC応用回路
プログラムの中身の整理とコメントの訂正をしました。


サーボの動作もお蔭様でゆっくりさせることができるようになりました。
これは動作させる模型によっては、良い機能だと思っています。
いっぽう、私が使用したサーボの動作をじっと見ていますと、動作がスムースではないようです。
カクカクと動く様にみえます。
サーボ自体の最小動作角度に対して、与えるパルスの変化が大きくて、動作がスムースではないようです。
気になってしまったので、ここを修正しました。

また、合わせて、私のサーボ(JR製)に合わせて、サーボの触れ幅の最終調整を行い、他のサーボを使用する際の各種パラメータの設定上の注意点を検討しました。


原因
RCサーボへ与える信号の立ち上がりから約1000マイクロ秒はサーボへの指示に関係なく、常にONです。
しかし、RCサーボに与えるパルス信号のONの部分を最初から最後まで全てTMR0のカウントで処理している為、実際に制御に使用できるTMR0のカウントが少なく、1カウントでパルスの時間が大きく変わってしまい、動作がカクカクとなるようです。
そこで、立ち上がりから共通の約1000マイクロ秒のカウントを「Delay関数」で時間稼ぎをして、その後、TMR0の部分でパルス幅の制御をするように変更しました。


変更点
RCサーボパルスの計測を、すべてTMR0で行う方法から、始めの立ち上がりから共通の1000マイクロ秒(1msec)をDelay関数で置き換えました。
よって、TMR0のカウントの多くを、残りの可変部分(約1000マイクロ秒)に使用できるようにしました。
サーボの制御は、この一定部分に加えて、0-255のカウントに応じて、6.4マイクロ秒から1638マイクロ秒の範囲でパルス幅を可変してサーボの制御が出来ます。(プリスケーラが1/32の場合)

この変更により一部パラメータも変えました。

1、TMR0のプリスケラーを1/64から1/32に。(サーボパルスの分解能が二倍になった)

//----------------------------------------------------------------
// TMR0設定変更
// TRM0 setting 割り込み使用、プリスケーラ1/32設定@20MHz
// 割り込みは約1.6384 msec毎に発生する
//----------------------------------------------------------------
OPTION_REG = 0b10000100; /// Prescaller 1/32 (1.6384 msec full count)
INTCON = 0b00100000;
GIE = 1; // 全体割り込み許可
T0IE = 0; // TMR0 中断
T0IF = 0; // TMR0 割り込みフラッグクリア




2、制御するパラメータの範囲を、0-100から0-250に変更。(%ではなく直接TMR0へパラメータを指定するようにした)



//---------------------------------------------
//スイッチの状態をチェックして配列データを変更する
//----------------------------------------------
//----------------------------
//SWでサーボの角度を切り替える
// サーボの動作は0から250にする
//----------------------------
//注意----------------------------------------------------------------
// TMR0はカウントアップ->オーバーフロー型のタイマーなので
// 設定するパラメータ(0-255)が小さければ、オーバーフローまでの
// 時間が長く、割り込みまで時間がかかり、逆にパラメータが大きいと
// 割り込みは短時間で発生します。
// 試行錯誤の結果、パルス立ち上がり時のDelay関数の値は、660マイクロ秒
// TMR0のパラメータは、0-250でサーボが、ほぼフルスイングする様に
// なりました。
//---------------------------------------------------------------------



if (sw0 == 0)parameter[12][2] = 0; //SWがON(0)ならサーボパラメータを20に
else {
parameter[12][2] = 250; //そうでなければ、250にセット
}


3、上記に合わせて、パラメータの範囲チェック条件を変更


//------- 変更分 -------------------------------------------
target = parameter[portcnt][2]; //サーボ設定値を読み取り(値=0-255)

if (target != current) {
if (target <= current) current = current - step; //目標値が現在値よりちいさければstepを減算
else current = current + step; //そうでなければ加算
if (current <= 0) current = 0; //下限値チェック
if (current >= 250) current = 250; //上限値チェック
}
servo = current; //値(0-255)をservoに渡す
//--------ここまで--------------------------------------------



4、RCサーボ制御パルスの、初期の1msecをTMR0から660マイクロ秒のDelay関数に移行。


port_off(); //サーボ接続ポートをON(負論理)

__delay_us(660);//サーボ制御パルスの最初の基本部分750マイクロ秒をここで指定する

TMR0 = servo;


実際にこの仮定に基づいてパラメータを変更して動作させました。
しかし、回転はスムースになりましたが、回転の始点と終点の位置がすこしずれていました。
恐らくサーボの固有の条件があっていないと思い、カット&トライでいろいろ修正し、最終的には下記の様になりました。


Delay関数で遅らせる初期の時間 1000マイクロ秒-->660マイクロ秒
TMR0にセットするパラメータの範囲 0-255    -->0-250(1カウントあたり約6.4マイクロ秒)

この値を計算すると、パルス幅は、
最短で 660+(6.4x6)=約700マイクロ秒
最長で 660+(6.4x256)=約2300マイクロ秒
中間点は、約1500マイクロ秒となります。

ここで分かりにくいのはTMR0がカウントアップ・オーバーフロータイマーという事で、セットしたカウント値からカウントアップして、256になったときにオーバーフローで割り込みが発生するということです。
したがって、パラメータを0にセットすると6.4x(256-0)=約1640マイクロ秒、250にセットすると6.4x(256-250)=40マイクロ秒で割り込みが発生します。

以上を参考にしていただいて、お手持ちのサーボに合わせて、ここの660マイクロ秒と、TMR0のセットパラメータ(0-250)を修正していただければと思います。




最終的なプログラムをここに置きます。

v026_prog_final.txt


御参考になれば幸いです。
2016-05-25 20:30 | カテゴリ:PIC応用回路
プログラム完成後の追加検討です。

このブログをごらんいただいている方(6jiroさん)から、サーボの動作速度をもう少し遅く出来ないか?というお話を頂きました。
現在の仕様では、サーボは、その最大速度で、目的の角度(パルス幅)になるように動作します。
現在位置が0で、100の位置信号を与えると、一気に動作します。
RCサーボを利用する模型の状況によっては、ゆっくりと目的の位置まで移動させたい場合があります。
その為の、サーボの動作速度をある程度増減できる工夫をしました。

続きは、こちらから



【ジャンル】:趣味・実用 【テーマ】:模型・プラモデル
コメント(6)
2016-05-20 18:10 | カテゴリ:PIC応用回路
RCサーボの制御が出来るようになりました!


PWMでRCサーボの制御が出来ないかとの御質問を頂きました。
しかし、このPIC回路では、PWMの処理速度が速すぎて、RCサーボの制御には向いていないことがわかりました。
でも、せっかくなのでこれを生かしてRCサーボも制御したい、と言うわけで、ソフトを検討してみました。

RCサーボの制御は、繰り返しパルス信号を与えます。その信号のONの時間を1500マイクロ秒(usec)を中心として、プラスマイナス500usecの範囲で、変化させるとそれに応じてサーボが動作する仕組みです。
このONとなっている時間は結構シビアに与えないと、サーボが微振動したり、誤動作したりします。
このパルス信号を繰り返して与えるのですが、その繰り返しの周期の精度は、それほど高く求められません。
せいぜい、10-20msecの繰り返しでよいでしょう。

先日から製作しているソフトは、LEDの点滅と言う、人間の目で見て、かなり自由度の高い、処理をしていますので、プログラム自体の動作時間(分岐や、処理の長短)は、ほとんど無視できるくらいのものです。
しかし、サーボの制御は、数usec位の分解能で制御されますので、プログラムの動作時間で影響される事が十分考えられます。

したがって、RCサーボの制御をこのソフトに組み入れるには、タイマー割り込みで、かなり正確なON時間を出力し制御する必要があると考えました。

検討した方法は以下の通りです。
LEDのカウント処理と同様に、定期的にONの時間を読み出し。それをタイマー割り込みにセットして、RCサーボ用のポートをONにします。
タイマー割り込みが発生したら、ポートをOFFにします。
タイマー割り込みは、かなり精度良く設定できますから、サーボをうまく制御できると思います。

このプロセスのポイントは、タイマーをセットして、割り込みの発生を待っている間は、処理を中断(ループで処理を待っている)して、割り込みが発生したら、ポートをOFFにして、次の処理に移るという事です。
通常、タイマー割り込みは、割り込みが発生するまでは、別の処理を行って、割り込みが発生すると、その処理をするという考え方ですが、今回、割り込み発生を待たずに先に処理を進めてしまうと、次のタイマー処理に進んでしまうと、タイマー0が一つしかありませんので、不都合が生じます。
幸い、サーボの制御で待たなければならない時間は2-3msecですので、この間は処理を進めないで、タイマー割り込みを待って、一つのサーボ処理を完了させてから、次に移るとしても問題ないと判断しました。

この方法ですと、LEDと同様に、RCサーボを複数制御できると思います。

と言うわけで、先日のプログラムをいじって、当初のアイデアを盛り込みました。
ところが、上手くありません。

問題点は

PICが動作すると、サーボが動いて、振り切ってしまいます。パラメータを変えても同じです。

色々なパラメータを与えてもサーボが動作しますが、何故か一方へ振り切ってしまいます。
恐らく、パルスのH時間が長すぎると思いますが、TMR0に直接数値を書き込んでいますので、パルス幅が長くなるわけは有りません。
散々悩んだ末、原因が分かりました。
LEDのON/OFFのルーチンを使用していましたが、これは「負論理」です。ONで、LにOFFでHになります。
うっかりしていました。
ここは、ONとOFFを入れ替えて、サーボは振り切らないで、動作範囲の途中でちゃんと停止するようになりました。
やれやれです。

次に、中立となるはずのパラメータを与えてみました。
しかし、中央ではなく、かなり端にずれています。
値を返ると、それなりに動作するのですが、一方では振り切れます。
どうやら、信号の中央の位置がずれています。計算では中央は、ほぼ1500usecにセットしてあります。
そこで、オシロで実際の出力波形を調べてみました。
なんと、2500usecほどあります。
そんなバカな!
で、プログラムリストを見てみると、原因がありました。
LEDのON/OFFルーチンに、1msecのDelayが入っています。

Prog001.jpg

自分では、何気なしに、入れてしまった意味の無いDelayです。
このために、ちょうど1msecの余分な時間が入ってしまったのでした。

というわけで、これらを修正し、ちゃんとRCサーボが動作するようになりました。

下記のHパルスを得る為のTMR0に指定するパラメータは、実測で

2000マイクロ秒 = 100
1500      = 139
1000      = 178

となりました。



実際のプログラムがこれです。
この部分で、サーボ設定値を読み出して、タイマー割り込みをセットし、ポートをONに。

そして、tmr0_int()で割り込みが発生したところで、ポートをOFFにします。

Prog002.jpg

また、タイマー割り込みを使用するための設定もここで行います。
プリスケーラは1/64にセットしました。
TMR0の詳しい使い方は下記をご覧ください。

Prog003.jpg

サーボのパラメータを切り換えるSW0の読み込み部分はこれです。
SWではなくて、内部のプログラムで動作させる際は、ここに0-100の数値を入れてください。

Prog004.jpg


また、このRCサーボの設定を読み込んで判断するメインルーチンは、この様に追加しました。

Prog005.jpg

と言うわけで、完成です。
今回は、PIC16F876を使用しましたので、ポートは、A(6),B(8),C(8)あわせて、22+1(PWM)個ありますので、本プログラムを拡張すれば、最大で23個のLEDとRCサーボを制御できることになります。
現在のプログラムのままでは、A(5)+B(8)+PWMですが。(デモビデオでは、PortBには全てLEDを接続してありません)

最終のプログラムは、こちらです。
個人的に趣味でご利用される場合は、ご自由にお使いください。
(著作権は一応私に帰属します)
一部、コメントが不適切だったので修正しました

LED_mgr_final2.txt



XC8のメインプログラムとして、コピペすれば動作します。


動作のビデオを撮影しました。




(TMR0の計時の計算方法)

例えば、20MHzの内部クロックをカウンターの入力とした場合、カウンターに入力される周波数は1/4の5MHzが入力されます。
このクロックパルスの周期は200nsです。ですから、TMR0がオーバーフローする時間は0.2μsec x 256 = 51.2μsecになります。
タイマーの使い方にもよりますが、これでは短い場合もあります。そのような場合、プリスケーラを使用します。
プリスケーラのカウント値は2、4、8、16、32、64、128、256の8段階に設定できます。
例えば2と設定した場合、プリスケーラに2パルス入力された時に1パルス出力します。
256の場合には入力に256パルス入ったときに出力から1パルス出ることになります。
ですから、プリスケーラの設定値倍TMR0のオーバーフロー時間を長くすることができます。
先ほどの例の場合、プリスケーラを256設定にすると 51.2μsec x 256 = 13,107.2μsecになり、約13ミリ秒でオーバーフローすることになります。



【ジャンル】:趣味・実用 【テーマ】:模型・プラモデル
コメント(18)
2016-05-18 11:49 | カテゴリ:PIC応用回路
先日、アップさせていただきましたPICによるLEDの点滅制御のプログラムですが、シンプルすぎて、一度起動したらそのまま走り続ける仕様でしたので、ちょっと機能を追加してみました。

追加仕様としては、

1)ポートCのRC0にSWを接続する事を前提として、そのSWがONかOFFかによって、特定のLEDの点滅動作を停止したり動作させたり出来るようにする。
2)PWM(PIC16F876Aなどには標準で装備されています)信号の制御も、周期とデューティー比を簡単にパラメータ設定できる。
3)PWMのデューティー比を自動で変化させて、LEDの輝度変化を可能とする。

を実現したく、検討してみました。

まず、1)ですが、ポートC0とポートC1にスイッチを取り付け、常時抵抗で+Vにプルアップしておき、スイッチをONとするときに、GNDに落とすように回路を組みます。
プログラムでは、そのスイッチの状態を読み込んで、ONなら、動作指定配列の、指定された出力の設定を、13(定期点滅)か15(動作しない)に書き換えます。

//---------------------------------------------
//スイッチの状態をチェックして配列データを変更する
//----------------------------------------------
// 下記のparameter[n][m]のnに制御したい配列のポート番号を指示する
// 下記の例では、sw0でポート番号3をsw1ではポート番号4を示しています
// swは、負論理で、ゼロならONとみなしています
// この機能を使用しない場合は、以下のプログラムをコメントアウトします
// 各行の先頭に//を挿入してください
//----------------------------------------------------------------

if (sw0 == 0)parameter[3][0] = 13; //sw0が0ならRA3の設定を13(定期点滅)に設定

else {
port_off(); //点灯中の場合に備え指定ビットを消灯
parameter[3][0] = 15; //そうでなければ、設定解除
}
if (sw1 == 0)
parameter[4][0] = 13; //sw1が0ならRA3の設定を13(定期点滅)に設定
else {
port_off(); //点灯中の場合に備え指定ビットを消灯
parameter[4][0] = 15; //そうでなければ、設定解除
}

上の例では、配列の番号3と4のLEDを制御するように記述しています。
制御したいポート番号のnを0から14の範囲で指定します。

プログラム追加部分はここです。

sw_set.jpg

続いて、2)です。
まず、PICのPWMの設定に関しては、以下の様になっています。
いずれも動作周波数20MHzを前提として

(PWMの周期の決定)

周期=(255+1)x 4 x 0.05マイクロ秒 x 10(のマイナス6乗)x 16
   PR2レジスタ値  <- PICの動作クロックの4倍の逆数->  (タイマー2のプリスケーラ)
  =0.8192ミリ秒から0.0032ミリ秒(1220Hxから312KHzの範囲)
となり、
LEDの点滅制御もしくは、模型用小型モーターの制御と言う前提で考えれば、プリスケーラは16で良さそうです。


(PWMのデューティー比の決定)

デューティー比=1023 x 0.05 x 10(のマイナス6乗) x 16
       =CCPR1Lレジスタ値(CCP1XとCCP1Yは使用しません) x 0.05 x 10(のマイナス6乗) x プリスケーラ
       =0から0.819ミリ秒

となり、この範囲で、周期とdヒューティー比を変更できますが、注意が必要です。
それは、デューティー比は、0-100の%で指定するのではなく、ONとなっている時間で指定するため、途中でデューティー比が100%を超えた数値になっても無視され、あるいは、レジスタがオーバーフローして、いきなり小さな値に戻ったりして、使い勝手が良くありません。
使用目的を、模型のLEDや小型モーターの制御と仮定して、PWMの周期は、遅めの1220Hzで固定し、デューティー比を0から100%の数値で指定する使用としました。

整理しますと、今回のPWMは、
周期は、約819マイクロ秒(1220Hz)で固定とし、デューティー比は、0-100%の値で制御する、と言う仕様に決めました。
(模型の小型モーターのPWM制御は、自分の経験上、周波数が低めの方が、起動時の最初の動き出しに力が入って、回転しやすい印象があります)


[x, y, z]の指定パラメータは、

自動モード
x=14:PWMの制御を指定
y=0 :PWMのデューティー比を0から100%の間で、自動的に増減させる。
z=n :デューティー比を増減させる速度を指定。1%あたりnx5msecで増減。例:2とすると、2x5msecx100=1000msec、つまり1秒で消灯から最大輝度へ、また次の1秒で、消灯へ。
     ただし、最大値は255。

PWM00.jpg

PWM02.jpg

手動モード
x=14:同上
y=1-255:周期を1から255までの間で指定可能。現在は、255固定(約0.819ミリ秒=約1220Hz)で使用する。デューティー比0-100%制御のため固定とする。
        変更禁止
z=n ;デューティー比を指定。0-100(%)として指定可能。プログラム内で、上記の周期に合わせてデューティー0-100%で制御。

PWM01.jpg

また、メインルーチンの比較判定部分に、PWM処理へ分岐する部分を追加します。

proces.jpg

肝心のPWM処理をする関数です

まず、PWMを使用できるように各種のパラメータを設定します。

PWM_setuup.jpg


そして、配列の設定データに従って、PWMの周期とデューティー比を設定する部分です。

pwm_proces.jpg

以上、プログラム全体をテキストファイルでここにアップしました。
ご自身の、MPLABXのCプログラムのメインプログラムを新規作成し、そこにコピペして、コンパイルしてください。

メインプログラムです
-----------------------------
PWM_Program.txt
-----------------------------

実際の動作状況です。

まずは、指定した周期とデューティー比でLEDを単純に点灯した場合。
ここでは、周期は255、つまり、約1200Hzくらいで、デューティー比は、3%くらいで赤色LEDを点灯させました。

LED1.jpg

次に自動でゆっくり輝度変化して点滅する自動モードです。
このLEDは、かなり古いもので、発光輝度が低いので、明暗が分かりやすいですが、最近の高輝度タイプのLEDだと、すぐに明るくなって、飽和してしまうかと想像します。
つまり、指定したデューティ%と明るさが比例しません。



以上、よろしければご参考にしてください。


【ジャンル】:趣味・実用 【テーマ】:模型・プラモデル
コメント(5)
2016-05-16 10:09 | カテゴリ:ヘリコプター
天気も良く晴れて、気持ちの良い週末でした。
所属するRCクラブで、久しぶりにRCヘリ(ベル222)を飛ばして調整しました。
めったに飛ばさない機体なので、調整がずれていて、「会長」にアドバイスを受けて、調整し、飛行できるように。

日曜日は結構風が強く、操縦が大変でしたが、仲間のクラブ員も黄色いスケールヘリ「アウグスタ」を調整飛行。
楽しい一日を過ごしました。

ちょっと長いビデオですが、ご笑覧ください。
RCクラブは、「のんびりRCクラブ」といいます。
他にもYouTubeにアップされていますので、「のんびりRC.TEAM」で検索すれば出てきます。

【ジャンル】:趣味・実用 【テーマ】:ラジコン
コメント(4)
2016-05-13 23:00 | カテゴリ:最近のプラモデルは良くできてます
ちょっと一息

陸上自衛隊 機動戦闘車プロトタイプ)を製作しました。

これは、アオシマ製品の1/72キットで、陸自のプロトタイプ8輪機動戦闘車です。
戦車のキャタピラーの代わりに、8輪のタイヤを装着した様な車両です。
先日、ヨドバシカメラの通販サイトで、見つけて、迷彩塗装の練習用として、手軽なので注文しました。

s1.jpg

到着して開梱しました。

s2.jpg

さすがに1/72キットだけあって、小さいのなんの。
部品もほんの少しの、申し訳程度です。
DD51の小ランナー一つ分もありません。

s3.jpg

と言うわけで、さくっと組み立てました。
塗装の関係があるので、車輪や一部のパーツは取り付けていません。

s4.jpg

s5.jpg

s6.jpg

車輪ですが、ブロックパターンも綺麗に表現されていて、塗装するとかなり実感的です。
もちろん、プラ成型です。

s7.jpg

s8.jpg

グレーのサフをサッと吹いて下地にして、その上から、自衛隊色のグリーンを全体に吹き、後から同じく茶色を吹いて迷彩塗装の基本塗装をしました。
自衛隊塗装のカラーは専用色が販売されていますが、手持ちのラッカーで調色しました。
なかなか難しいですね。
この才能が無いことに気づきました。
「なんちゃって自衛隊色」です。

s9.jpg

s10.jpg

デカールを貼って、保護塗装した上で、いよいよ汚しです。
墨入れした後で、フラットアース色、パフ色、などで、砂埃感を出したつもりです。
どちらかと言うと、富士山麓の演習地の色というよりは、砂漠乾燥地帯での演習試験走行の後、という感じです。

このキットは、車輪を操舵すると、車体が遠心力で沈み込むようなギミックがあって、前輪を切り込んだ状態が、とても躍動感があって、好きです。
完成写真でそんな雰囲気が感じていただければ幸いです。

s11.jpg

s12.jpg

s13.jpg

s14.jpg

s15.jpg

s16.jpg

s17.jpg

s18.jpg

2016-05-04 20:50 | カテゴリ:PIC応用回路
DD51ディーゼル機関車のプラモデル製作がようやく完成しました。
ここで、プラモデルはちょっとお休みして、電子工作に取り掛かりました。


実は、前回のロボット・フライデーを製作した際に、電飾として多数のLEDを点滅させる為にPICを使用してプログラミングをしました。
LEDの点滅はそれほど難しいプログラミングではありませんが、模型工作ごとに点滅の方法やタイミングを考えてプログラムをするのがめんどうだなあ、と感じていました。
LED電飾のパターンとしては、大きく分けると

* 単純点滅(同じ周期)
* 順次点滅(複数のLEDで流れるような点滅)
* ランダム点滅(異なった周期でのランダムな点滅)
* 常時点灯

などが考えられます。
常時点灯は、別として、それ以外の点滅方法を、比較的簡単な指定方法で点滅の制御が出来れば便利だと考え、汎用のLED点滅制御プログラムを考えてみました。

仕様としては

* PICのポート(A、B)最大合計13ポートの出力を制御できる。
* 単純点滅、順次点滅、ランダム点滅を簡単なパラメータの指定で行える。、
* 点滅の周期を長短指定できる。

として、プログラミングをしました。
使用した言語は、フリーライセンスのXC8(マイクロチップ社)です。
PICは、16F876になりました。

当初は、16F84Aでプログラミングを始めたのですが、途中で、使用する変数や配列が多くなって、コンパイラがエラーとなってしまい、急遽、PICを16F876に変更しました。


とりあえず動画をご覧ください。




右の3個のLEDは順次点滅に設定してあります。
光が流れるように点滅します。(ナイトライダー風)
次の2個と隣の2個の4個は、定期点滅です。(例えば翼端灯など)
点滅周期を変えて有ります。

残りのLEDはランダム点滅にしてあります。(計器のランプなど)

DSC02195.jpg

プログラムは、別途参照していただくとして、パラメータの指定方法を述べます。

const unsigned char parameter[13][3] = {//ここから
{1, 1, 3}, // ポートRA0用の設定
{2, 2, 3}, // ポートRA1用の設定。以下、RA2-RA4とRB0-RB7と続く
{3, 4, 3}, // RA2
{13, 8, 5}, // RA3
{13, 16, 5}, // RA4
{13, 1, 8}, // RB0
{13, 2, 8}, // RB1
{0, 4, 5}, // RB2
{0, 8, 5}, // RB3
{0, 16, 5}, // RB4
{0, 32, 5}, // RB5
{0, 64, 5}, // RB6
{0, 128, 5}, // RB7
}; // ここまで



点滅指定は、この配列でまとめて行います。

配列は、LEDを接続するポートの数あって、それぞれ、{x、y、z}三つのパラメータを指示するだけです。

xは、以下の様な意味を持ちます。

0=ランダムの点滅
1から12=順次点滅の順番
13=定期点滅

zは、点滅周期の長さで、今回のプログラムでは、1=100msecに指定しています。
ランダムで点滅する際は、この値が最大値となるように、周期が変わります。

yは、定数で、変更してはいけません。
初めの、1,2,4,8,16は、ポートAのポート0,1,2,3,4に対応します。
次の、1,2,4,8,16,32,64,128は、ポートBの0,1,2,3,4,5,6,7に対応します。

テキストファイルですので、ご自身でXC8のプロジェクトを新規で作成して、sourceファイルのフォルダーmain.cを新規作成した後で、このテキストファールの中身をコピペすればOKです。


ブレッドボードに回路を組んでみました。
LEDの数の都合で、PORTBは0-5にLEDが接続してあります。


XC8プログラムはここに,,,,,,

====================================================================
御注意

特殊文字(”<”や”>”)がブログ中で認識されない為、プログラムが正しく表示されないことが分かりました。
一旦、プログラムを削除して、改めてアップ方法を検討して、再掲させていただきます。

====================================================================

ここにプログラムをテキストファイルとして貼り付けました。
コピペして、お手持ちのXC8のメインのCファイルに貼り付けてください。

(一部セミコロンが欠落していました。再度修正しました)

==>>LED_mger2.txt


2016-05-02 18:24 | カテゴリ:コンピュータ
恐らく、このブログをごらんの方々のPC(Win10でなければ)にも、頻繁にWin10へのバージョンアップのメッセージが出ていることと思います。
わたしのPCは、2台ともWin7です。
昨年まで、WinXPでしたが、サポート終了で、Win7を購入しました。(Win8はあまり評判がよくなかったのでWin7にしました)

ここ数ヶ月、消しても消してもWin10へのバージョンアップのポップアップが出てきます。
先日は、強制的にバージョンアップする様なメッセージが出て、キャンセルできませんでした。
あわてて、ネットで調べたら、しばらくの間、このポップアップを出さない方法が紹介されていましたので、その操作を行い、アップグレードを避けることが出来ました。

なぜWin10にしないのかですって?

古いプログラムもあって、今のWin7でも、上手く終了できなかったりしていて、Win10バージョンアップスキャンで、互換性が無いプログラムがあると言われて、出来ないようでした。

温和な私ですが、このMSによるWin10の強制バージョンアップ(押し付け)は、非常に不快です。
バージョンアップの希望が無いのに、何度も何度もしつこくメッセージが出ます。

今日は、頭に来たので、MSのサポートで電話しました。
Win10のバージョンアップの電話先だと、Web紹介参照に廻されてしまったので、製品購入の電話に掛けて、思いっきり嫌味を言って、二度とバージョンアップのメッセージが出ないようにPCを変更する方法を聞きました。

同じような問題をお持ちの方のために、ご紹介します。

1)下記のアドレスをインターネットで表示します。

aka.ms/w10hus

MSwin10-1.png



2)ここに記載されている手順で、お手元のPCのレジストリーを書き換えるようです。
  一部、管理者権限で、コマンドプロンプトから長いコマンドを打ち込まなければなりませんが、無事、完了しました。

おかげで、30分くらいの時間を無駄にしました。
こんなのってMSからの「威力業務妨害」ですよね。