« 2009年8月 | トップページ | 2009年10月 »

2009年9月

2009/09/27

PSoC + 2.4GHz その8

送信機、受信機ともに落ち着いてきたので、受信機を機体に搭載してみました。
機体そのものは昨年暮れにYSFCの飛行会に参加させていただいた時のものですが、PICを使った赤外線受信機と比べて消費電流が増えているのでバッテリーを大きなものに交換しています。(本当は逆接続防止のためにバッテリーのコネクタを変えたのですが、変えたバッテリーがまだ1個しかないため。)
Dscf1153_2


搭載した受信機の様子です。プロペラ付近の胴体がふにゃふにゃです。補強とプロペラ保護のためにアルミパイプのガードを付けていますが、着地するたびにアルミパイプの曲がり具合が変わってしまい補強になっていません。機体の上側に「竹くし」でも貼りつけますか・・・・・・。(よって今晩のオカズは焼きとりor串焼きに決定・・・・しません。)
Dscf1152


| | コメント (0) | トラックバック (0)

2009/09/23

PSoC 455kHzPCM信号の発生方法(10月18日 追記を追加)

PSoCで455kHzの赤外線PCM信号を出す回路とソフトについて説明します。

赤丸でかこったPWM8_1ユーザーモジュールで信号を発生します。PWM8_1のクロックには48MHz(SYSCLK*2)を入力し、Enableは常時PWM信号を生成するようにHighにします。PWM8_1の周期は105、compare値(PWM信号のDuty)には0を設定します。出力はCompareOutの信号を38kHzのPPM信号とORして出力します。
455khz_pcm

ソフトはこんな感じです。
全部のチャンネルのデータを受信するごとにTXBUFにPCM信号(ON/OFF情報)をセットしてから呼び出しています。
TXBUFには48μsごとに赤外線をONにするか、OFFにするかを表す情報を格納します。
ONにする場合はON時のPWM信号のcompare値(35)を入れておき、OFFにする場合はcompare値(0)を入れておきます。データの末尾には終わりを表すための0xFFを入れておきます。48μsごとに「PWM8_1_WritePulseWidth(tmp);」を行ってPWM信号のDutyを変化させています。
やりたくはなかったのですが、48μsごとの割込みでは処理できなかったため、ソフトでタイミングを取るようにしました。(CPUを24MHzで動かせば大丈夫かもしれないのですが、そうするとI2Cで接続したLCDが制御できないため。)

void Send_Pulse(void)
{
static BYTE tmp;

TX_SND_count = 0;
tmp = TXBUF[TX_SND_count];
while(tmp != 0xff){
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");

asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");

asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");

asm("nop");

PWM8_1_WritePulseWidth(tmp);
TX_SND_count++;
tmp = TXBUF[TX_SND_count];
};
}

TXBUFにはこのようなデータが入っています。

TXBUF[] = {35,35,35,35,35,35,35,35,35,0,35,0,35,0xFF};

上記は「9ビットON,1ビットOFF,1ビットON,1ビットOFF,終了」を表しています。実際にはプロポから入力されたデータや選択されているバンドなどに従って生成されたデータを入れておきます。


実際の送信データ設定処理はこんなふうになりました。
CONFIG_ROM[PCM455CH]はバンド(チャンネル)の情報、txCH_Data[]はプロポから入力されたPPM信号のパルス周期(1100μsが0x00、1900μsが0xFF)が入っています。
下記ではラダー(txCH_Data[3])とスロットル(txCH_Data[2])のデータを各8ビット送信しています。


//PCM2用の送信データ設定処理
void PCM2_data_set(void)
{
int i;
unsigned int tmp;
unsigned int mask;

TX_SET_count = 0; //0.048ms * 9 ON
TXBUF_SET1(); //1
TXBUF_SET1(); //2
TXBUF_SET1(); //3
TXBUF_SET1(); //4
TXBUF_SET1(); //5
TXBUF_SET1(); //6
TXBUF_SET1(); //7
TXBUF_SET1(); //8
TXBUF_SET1(); //9
TXBUF_SET0(); //0.048ms OFF
TXBUF_SET1(); //0.048ms ON
TXBUF_SET0(); //0.048ms OFF (2ch)

switch(CONFIG_ROM[PCM455CH]){
case Ch_A : TXBUF_SET0();TXBUF_SET0();TXBUF_SET0();parity = 0;break;
case Ch_B : TXBUF_SET0();TXBUF_SET0();TXBUF_SET1();parity = 1;break;
case Ch_C : TXBUF_SET0();TXBUF_SET1();TXBUF_SET0();parity = 1;break;
case Ch_D : TXBUF_SET0();TXBUF_SET1();TXBUF_SET1();parity = 2;break;
case Ch_E : TXBUF_SET1();TXBUF_SET0();TXBUF_SET0();parity = 1;break;
case Ch_F : TXBUF_SET1();TXBUF_SET0();TXBUF_SET1();parity = 2;break;
case Ch_G : TXBUF_SET1();TXBUF_SET1();TXBUF_SET0();parity = 2;break;
case Ch_H : TXBUF_SET1();TXBUF_SET1();TXBUF_SET1();parity = 3;break;
};

TXBUF_SET0(); //0.048ms OFF

for(i=2;i<=3;i++){
tmp = txCH_Data[i];
mask = 0x80;
while (mask != 0){
if ((tmp & mask) != 0){
TXBUF_SET1();
parity++;
}
else {
TXBUF_SET0();
};
mask = mask >> 1;
};
TXBUF_SET0(); //0.048ms OFF
};

if (pairing_req > 0){
pairing_req--;
TXBUF_SET1(); //0.048ms OFF
parity++;
}
else {
TXBUF_SET0(); //0.048ms OFF
};

if (resv_req > 0){
resv_req--;
TXBUF_SET1(); //0.048ms OFF
parity++;
}
else {
TXBUF_SET0(); //0.048ms OFF
};

//parityには1だったビットの数が入っている。偶数だったらパリティビットが1
if ((parity & 0x01)==0){
TXBUF_SET1();
}
else {
TXBUF_SET0();
};
TXBUF_SETE();
}


void TXBUF_SET(char c)
{
if (TX_SET_count < TXBUF_SIZE){
TXBUF[TX_SET_count] = c;
TX_SET_count++;
};
}

void TXBUF_SET1(void)
{
TXBUF_SET(IR_PWM16_CNT); //IR_PWM16_CNT=35
}

void TXBUF_SET0(void)
{
TXBUF_SET(0);
}

void TXBUF_SETE(void)
{
TXBUF_SET(0xff);
}


<10月18日追記>
上記のPSoCの内部回路ですが、ひとつ前の版のものです。IRラジコン☆プログラム倉庫にアップしてあるプロジェクトのものとは一部異なります。やっていることは変わりませんが、ユーザーモジュールの配置などが変わっています。

| | コメント (0) | トラックバック (0)

PSoC 38kHz/56kHz PPM信号の発生方法(10月18日一部修正)

PSoCで38kHz(56kHz)の赤外線PPM信号を出す回路とソフトについて説明します。
最初の説明とPSoCの内部回路だと赤外線が垂れ流しされてしまうことがあるため、修正しました。(10月18日)

内部回路です。
24ga
24ga_2

赤丸でかこったPWM16_2ユーザーモジュールで信号を発生します。PWM16_2のクロックには48MHz(SYSCLK*2)を入力し、Enableにはプロポから入力された信号(ただし、正論理となるようにしてからPSoCに入力)を入力します。出力はCompareOutの信号を455kHzのPCM信号とORして出力します。
PSoCに入力されたはDigBufユーザーモジュールを通ってユーザーモジュール群の出口のモジュールへつながれます。(赤線)ここで常時ON/OFFしている_PWMユーザーモジュールから信号(青線)とANDを取って、PPM信号がONのときだけ38kHzまたは56kHzでON/OFする信号を生成します。(黄線)この信号は455kHzのPCM信号発生用のユーザーモジュール出力とORを取ってPINに出すようにするため、いったん入力側の内部配線に戻され、ぐるりとまわって出力されます。


ソフトはこれだけです。(10月18日 1行追加)

main(void)
{
PWM16_2_Start();
}

main(void)
{
PWM16_2_Start();
}

実際には他のモードとの切り換えやLCDの制御などがあって色々と複雑ですが、本質的にはこれだけです。
赤外線のPWM周波数とPWM周期をハードの設定で済ませて、赤外線のON/OFFはPWM16_2ユーザーモジュールのEnable入力に入れたプロポの信号でやっているので、ソフトでやらなければならないことはPWM16_2ユーザーモジュールとDigBuf1ユーザーモジュールを起動する関数を呼び出すだけです。

赤外線送信アダプタのソフトとしては多分「世界最短」ではないでしょうか。
(PSoCデサイナーの中の人がやっていることに目をつぶってしまえばですが。)

他の周波数でも38kHzも56kHzもPWM周波数とPWMパルス幅の設定を変えるだけでやることは一緒です。

※ このことに気がついていなくて、プロポ壊しました。(すぐに修理できましたが。)

| | コメント (0) | トラックバック (0)

PSoC + 2.4GHz その7

ブレッドボード上に組んでいた2.4GHzの送信機を基板化してケースに入れました。
以前作成した赤外線送信アダプタのケースなどを流用したという家庭の事情により、赤外線送信機としての機能を持たせることも必須です。でないと、38kHzの赤外線受信機を搭載した機体が飛べなくなってしまうので。


<正面から>
Propo_front_view

<上から>
Propo_top_view


内部の様子です。でっかいICはCY8C29466です。他はプロポのトレーナ信号をのHi/Loを反転して、ついでにレベル変換もやってから3V系の回路に渡すためのトランジスタと、プロポから貰った電源を3.0Vに変換する3端子レギュレータICと、それから赤外発光ダイオードを駆動するためのFETを実装しています。
右側のスイッチは上が赤外線の出力切り換えスイッチで下側は設定モードと飛行モードの切り換えスイッチです。
Propo_inner_view

2.4GHzと赤外線の455kHz,56kHz,38kHzの切り換え、2.4GHzの周波数切り換え他各種設定、455kHzマルチバンドのバンド切り換え、などは設定モードに入った後に、LCDの画面表示に従ってプロポのスティックを使って設定します。


| | コメント (0) | トラックバック (0)

2009/09/10

PSoC + 2.4GHz その6

すこし改良しました。

・専用ICによる電源電圧監視をやめてCYWUSB6935のADC8ユーザーモジュールで電圧検出するようにしました。
・これに伴って、CYWUSB6935に接続したLEDによる状態表示を追加しました。
 (動作中に電圧が3.7V以上であれば2回点滅、3.3V~3.7Vであれば1回点滅、3.3V以下であれば連続点灯)
・また、バインドした時のラダーをぱたぱたさせる動作をやめてLEDを点滅させるようにしました。

プログラムと回路図をIRラジコン☆プログラム倉庫にアップしておきます。

| | コメント (0) | トラックバック (0)

2009/09/06

PSoC + 2.4GHz その5

およそ半月ぶりの更新です。
CYWUSB6953を使った2チャンネル受信機のソフトができました。(まだ完成レベルではありません。)


あいかわらず画質がぼろぼろですが、電源をつないだ後に送信機の電波を見つけるまでの部分です。
送信機の電波を見つけるとラダーをパタパタします。動画の中ではラダーのかわりのLEDが点滅しています。
送信機は動画の外にある「PSoC + 2.4GHz その4」のものにLCDを追加し、データを256段階化したものを使っています。


送信機との接続が確立した後の動作です。
モーターのノイズの影響を見たかったので、とりあえず6mmモータ(ミドリ)をつないでいます。


CYWUSB6953では無線部分とCPUが一体化しているため、無線部分とのインターフェースに「PSoC + 2.4GHz その4」以前で使っていたSPIMモジュールが使えません。そこで専用のWirelessUSBLSユーザモジュールにしたのですが、初期化関数とレジスタの読み書きしか使っていません。初期化処理後の設定がmattyさんのものと違っていて通信出来なかったたので、設定を書き直す処理を追加しました。他はあいかわらずmattyさん作のプログラムがベースになっています。(大感謝!!)


プログラムは例によってIRラジコン☆プログラム倉庫にアップしておきました。

| | コメント (0) | トラックバック (0)

« 2009年8月 | トップページ | 2009年10月 »