• 締切済み

思い通りに動かせず、困っています

ZIG100BeeモジュールとPIC12F675を2つずつ使って回路を作ろうとしているのですが、 ZIGBeeがどんなプログラムで動くのか、検索しても全く解りません。 送信側PIC 4ピン→1kΩ抵抗でプルアップ+スイッチ 7ピン→ZIGBeeTxDに接続 6ピン→ZIGBeeRxDに接続 受信側PIC 4ピン→ZIGBeeTxDに接続 5ピン→ZIGBeeRxDに接続 7ピン→LEDアノード側に接続 6ピン→ブザー+側に接続 このような回路で、送信側スイッチを押すと受信側LEDが点灯、ブザーが鳴るようにしたいのです。 送信側プログラム #include<12F675.h> #byte GPIO =0x09 #byte TRISTO =0x85 #byte CMCON = 0x19 #byte ANSEL =0x9F #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOBROWNOUT #use delay(clock=4000000) #use rs232(BAUD=9600,xmit=PIN_A1,rcv=PIN_A0,bits=8) #use fast_io(a) void main() { set_tris_a(0x09); delay_ms(50); while(1){ if(input(PIN_A3)==0x00){ putc(0x00); delay_ms(50); output_A(0x09); } } } 受信側プログラム #include<12f675.h> #byte GPIO =0x05 #byte TRISTO =0x85 #byte CMCON = 0x19 #byte ANSEL = 0x9F #fuses INTRC_IO, NOWDT, PUT, NOPROTECT,NOMCLR,NOBROWNOUT #use delay(clock = 4000000) #use rs232(BAUD = 9600, XMIT = PIN_A2, RCV = PIN_A3,bits = 8) #use fast_io(A) void main() { set_tris_A(0x08); delay_ms(50); while(1) { if(input(PIN_A3)== 0x00) { if(kbhit()) { delay_ms(500); output_high(PIN_A0); delay_ms(500); output_low(PIN_A1); } } } } このようなプログラムにしたのですが、受信側が送信側の操作に反応せず、 電源プラグを挿しただけで動作してしまいました。 すみませんが、誰か解る方がいたら教えてくれませんか?

みんなの回答

  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.1

ここで書かれているようなプログラムで動かす事は出来ないとおもいます。 まず使われているZigBeeモジュールについて、メーカーの説明書を見てください。 次にZigBeeについての市販の解説書を入手して理解に努めてください。 (Amazon等でサーチする等してください) ZigBeeシステムでは無線通信を通じて複数の装置との間で、一斉通信、個別通信等の機能を果たすようになっています。 従って相手毎に番号が割り振られています。 各装置は無線信号の上に特定のパターンが現れるのを監視しており、そのパターンが現れたら、その後に装置アドレス、コマンド(装置リセット、コントロール、データ送信、データ要求他)、データバイト数、データ、チェックデータ(チェックサム、CRC?)等からなるデータパケットが送られてくるのを確認し、チェックデータが正しくデータに誤りが無い事が確認できたら指定された動作をするように動いていきます。 以上のような形で動きますので、通常ZigBeeドライバーソフトを介して、そのサブルーチン仕様に従って送受信パラメータを渡し、信号のやり取りを行います。 少数のオンオフ信号のやり取りを行うだけで、詳細についてはブラックボックスのままでかまわないといった使い方をされる場合もあると思います。 ZigBeeモジュールにドライバーソフトも付属している場合には、それを使って動かすことが出来ます。 付属していない場合、フリーのZigBeeドライバーソフトもあるとは思うのですが、簡単に動かす事は出来ませんので次を検討されるのが早いのではと思われます。 "ZigBee 工作キット PIC" 等でサーチし、調べてください。

関連するQ&A

  • 超音波センサについて教えてください

    超音波センサについてなのですが、パラレルポートを使って制御しようとしているのですがなかなかうまくいきません。 浅草ギ研さんからでているPING)))を使っているのですが、サンプルプログラムがPICを使用してのもので、 トリガをうってやれば、350マイクロ秒ホールドオフした後、音波を出して帰ってきた時の時間で距離を出すというものです。 プログラム全文 #include <12F675.h> #fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR,BROWNOUT //内部4MHzクロック指定 #use delay(clock=4000000) //delayを使えるようにする #use rs232(baud=9600,xmit=PIN_A5,rcv=PIN_A3,parity=N,bits=8) //シリアル設定 //(上の行説明)GP5を送信、GP3を受信に設定。 //12F675の場合は初期値がADCモードになっているので、デジタル入力を使う場合は事前にADCなどを切る必要がある。 //16F84などのPICはこの処理は不要。(初期値がデジタルIOだったり、ADCが無かったりする。) //コンパレータとADCを切るために特殊レジスタを操作します。とりあえずアドレスを割り当て。(アドレスはデータシートに書いてある) #byte CMCON=0x19 #byte GPIO=0x05 #byte ANSEL=0x9F void main(void){  set_tris_a(0x00); output_low(PIN_A0); //GP0をLowに(とりあえず。) //コンパレータなどを切って、デジタルIOピンにする処理 GPIO=0x00; //以下3行はデジタルIOに切り替える手順 CMCON=0x07; ANSEL=0x00; //タイマ0を設定(内部クロック使用の場合は4クロックで1カウントなので注意) setup_timer_0(RTCC_INTERNAL | RTCC_DIV_128); delay_ms(1000); //PINGが正常に立ち上がるまで待つ printf("START\r\n"); while(1){ set_tris_a(0x00); //GP0を出力に //トリガパルス出力 output_high(PIN_A0); //トリガパルス立ち上げ delay_us(5); output_low(PIN_A0); //トリガパルス立ち下げ //GP0を入力に切り替え set_tris_a(0x01); //GP0を入力に //パルス幅測定 while (!(input(PIN_A0))); //パルス立ち上がりまで待つ set_timer0(0); //タイマーをリセット(カウント開始) while (input(PIN_A0)); //パルスの立下りまで待つ printf("Dist=%u\r\n\r\n",get_timer0()); //結果出力 delay_ms(500); //0.5mSウェイト } } こんな感じです。 全体的にわからないんですが、 特に while (!(input(PIN_A0))); //パルス立ち上がりまで待つ set_timer0(0); //タイマーをリセット(カウント開始) while (input(PIN_A0)); //パルスの立下りまで待つ この部分のlinuxのC言語への書き換え方がわからなくて苦労しています。 どなたか教えてもらえないでしょうか? OSはVine linuxです。言語はC言語です。

  • PICマイコンでLEDの点滅をC言語で記述法を教えてください

    PICマイコン(PIC16F84A)にLEDを1個接続し点滅だけのプログラムをC言語で記述を書きたいのですが、教えていただけないでしょうか? CCS社のコンパイラを用いた時の記述の書き方を教えていただけないでしょうか? 条件は、 ・電池を繋げるとLEDが点滅、スイッチ素子は用いません。 ・LEDは1秒間隔で点滅し、永遠に点滅 ・LEDは、PICマイコン(PIC16F84A)の9番ピン(RB3に該当)に接続 ・水晶発振子は、10MHzを使用。 ・コンパイラは、CCS社を使用 私が分かる範囲は下記なのですが、これから先の記述方法が分かりません。 #include <16f84a.h> #fuses HS, NOWDT, NOPROTECT #use delay(clock=10000000) #byte port_b=6 main() { この中身の記述方法が分かりません。 教えていただけないでしょうか? } よろしくお願いします。

  • c言語でpicにDelay関数を使いたい

    pic16f84a用にLED点滅のソースコードを書きましたがエラー出て前に進めません。 コードは次の様になっています。 (前段略) #use delay(clock=20000000) void main(void) { TRISA = 0x00; PORTA = 0x03; TRISB = 0x00; PORTB = 0x00; while (1) { PORTA = 0x02; Delay_ms(1000); PORTA = 0x01; Delay_(1000); } } コード書き込み中にすでにDelayの箇所が2か所ともエラーの表示になってしまいます。 一応下記の様にdelya箇所をコメント化してビルドと,picに書き込みを行えます、そしてLEDも点滅できます。 while (1) { PORTA = 0x02; //Delay_ms(1000); PORTA = 0x01; //Delay_(1000); } } 参考のコードを正確に書き込みましたがこのような状況でしたので、   #use delay(clock=20000000) は自分が勝手に追加してみましたが結果はやはり同じでした。 何が原因なのでしょうか。 何方か教えて頂けませんか。お願いいたします。 自分の環境は、Windows8 MPLABX IDE2.10  XC8  PIC16F84A pickit3 です。

  • dspicをCCS-Cでオープンドレイン設定

    dspicをCCS-Cでプログラムする場合のオープンドレインの設定方法についてお尋ねします。初心者ですが、内臓12ビットADコンバータを利用する事情がありdspicを利用しています。picから、相手のデバイスに5Vのクロックを与えるために、別途5V電源を用意してpicのピンに接続して、そこから直接相手のデバイスに接続して、クロックを送るようにしたいのですが、うまく5Vのクロックを発生させることができません。dspicは3.3v電源(内部で2.5vにレギュレート)なので,通常のoutput_low(PIN)、output_high(PIN)の繰り返しでは3vのクロックしか発生できません。そのため、オープンドレイン接続で、外部から5vを接続して、それをコントロールして5vクロックを発生させる必要があります。プログラムにはCCS-Cを使用しており、マニュアルにはオープンコレクタ指定はoutput_float(PIN)、その解除はoutput_drive(PIN)となっているので、それを用いて以下のように記述して動作させているのですが、5vが連続して通電してしまいクロックが発生しません。なお、私の理解ではdspicでは任意のピンがオープンドレインに指定できると思っています。どなたか分かる方がいれば回答をお願いします。 #use fast_io(G) #use delay(CLOCK = xxxx) main{ set_tris_G(0x00);{ while(1){ output_float(PIN_G0); delay_ms(100); output_drive(PIN_G0);} delay_ms(100); }

  • C言語でLEDを点灯させるプログラムです

    C言語を使ってLEDを点灯させるプログラムです。 以下のプログラムを変更して、Aポートの入力(下位4ビット) と、Cポートの入力(下位4ビット)を加算した値をBポートに出力しなさい 。 という問題なのですが、加算した値を出力するにはどうプログラムを記述すればいいか 分かりません。教えてください。 また、加算するというのは、たとえばどういうふうにしろ ということなのか、教えてください。 #include<18F452/h> #device HIGH_INTS=TRUE #priority ext,rb #fuses NOOSCSEN,HS,BORV45,NOBROWNOUT,PUT #fuses WDT128,NOWDT #fuses NODEBUG,NOLVP,NOSTVREN #fuses NOPROTECT,NOCPD,NOCPB #fuses NOWRT,NOWRTD,NOWRTB,NOWRTC,NOEBTR,NOEBTRB #use delay (CLOCK=20000000) #use fast_io(A) #use fast_io(B) #use fast_io(C) #use fast_io(D) #use fast_io(E) #byte port_a=0xf80 #byte port_b=0xf81 #byte port_c=0xf82 #byte port_d=0xf83 #byte port_e=0xf84 int i=0,j=0; void main() { if(input(PIN_b4)){output_high(PIN_d4);} else{output_low(PIN_d4);} if(input(PIN_b5)){output_high(PIN_d5);} else{output_low(PIN_d5);} if(input(PIN_b6)){output_high(PIN_d6);} else{output_low(PIN_d6);} if(input(PIN_b7)){output_high(PIN_d7);} else{output_low(PIN_d7);} while(1) { output_c(0b10101010); } }

  • C言語でプログラミングし、PICマイコンでLEDを制御する

    現在PICを使ってLEDを制御する事を勉強しています。 3つのLEDを3秒間隔で点灯させ、それを無限に繰り返すプログラムを考えてみました。LEDは一つのポートに一つのLEDを割り振るのではなく、ICを使って制御しています。 これを発展させ、待ち時間の3秒間にRA2ポートに入力があるとLEDの点灯をその場所で停止させ、もう一度RA2ポートに入力するとループが再開するといった内容にしようと考えていますが、調べてもどうすればいいのか分かりません、分かる方は教えて頂けないでしょうか # include <16f84a.h> # fuses HS, NOWDT, NOPROTECT # use delay(clock=20000000) int flag, sec, count; main() //main関数の開始宣言 { set_tris_a(0x10); set_tris_b(0x10); #use fast_io(a) //port_aの高速処理を行う設定 #use fast_io(b) //port_bの高速処理を行う設定 while(1){ //無限ループのwhile文の宣言 output_low(PIN_A0); //RA0の出力 output_low(PIN_B5); //RB5の出力 output_low(PIN_B6); //RB6の出力 output_low(PIN_B7); //RB7の出力 //LED1が点灯 delay_ms( 3000 ) ; //3秒待つ   output_high(PIN_A0); //RA0の出力 output_low(PIN_B5); //RB5の出力 output_low(PIN_B6); //RB6の出力 output_low(PIN_B7); //RB7の出力 //LED2が点灯 delat_ms( 3000 ) ; //3秒待つ        output_low(PIN_A0); //RA0の出力 output_high(PIN_B5); //RB5の出力 output_low(PIN_B6); //RB6の出力 output_low(PIN_B7); //RB7の出力 //LED3が点灯 delay_ms( 3000 ) ; //3秒待つ }

  • PICのA/D変換の入力が何故か0Vになってしまいます・・・

    現在、PIC12f675を用いて下記のようなことをしたいと検討しているのですが、 中々思った通りに動いてくれません。 どなたか分かる方がいらっっしゃいましたらアドバイスお願い出来ないでしょうか? 「開発環境」 ・CCSのCコンパイラを使用 ・PICは12f675 「内容」 アナログ入力端子に任意の電圧を加えて、RS232CでPC上にその電圧を表示する。 現在、アナログ入力端子(AN0)に電源電圧から分圧して0.5Vや1Vなどの電圧を加えているのですが、 何故か入力端子の電圧をテスターで測定すると0Vとなり、PC上でもやはり0Vと表示されてしまいます。 何故、任意の電圧を加えても全て0Vとなってしまうのかが分かりません。 おそらくプログラム上でのミスがあると思うのですが・・・ 検討中のプログラムを下記に書きます。 ***************************************************** ///// 初期設定 ///// #include <12f675.h> #device ADC=10 #fuses INTRC_IO, NOWDT, PUT, NOPROTECT, BROWNOUT /////RS232C使用宣言///// #use delay(CLOCK = 4000000) #use rs232(BAUD = 9600, XMIT = PIN_A2, RCV = PIN_A1) //GP1=受信 GP2=送信 //// メイン関数 void main() { // A/D初期設定 float data; setup_adc_ports(AN0_ANALOG); //AN0をアナログ設定 setup_adc(ADC_CLOCK_INTERNAL); //ADCのクロック設定(内部発振) set_tris_a(0); output_A(0); while(1) { set_adc_channel(0); delay_us(50); data = read_adc(); data = (data * 3.0) / 1024; printf("電圧 = %1.3fV\r\n",data); } } ***************************************************** 申し訳ありませんが、アドバイスお願いします。

  • PICプログラミングに対する質問

    PIC16F627Aを使い、160KHzの周波数を外部に出力したいのですが、うまくいきません。 仕様はこのようになっています。 セラロックとして10MHzを使っています。(20MHzを使うことも考えている) 電源は5Vです。 開発環境はMPLAB IDEに CCS社Cコンパイラを使っています。 現在のプログラムはこのようになっています。 //////////////////////////////////////////////////////////////////////// //タイマ0を用いて160KHzの周波数を出力する //3.1μsでタイマ0の割り込み //////////////////////////////////////////////////////////////////////// #include<16f627a.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP  //コンフィグレーションの設定 #use delay(CLOCK = 10000000)      //発振子の周波数10MHz  //delay_ms()の使用 //定数の定義 #byte  PORTA=0x05 #bytePORTB=x06 #byte TMR0 = 0x01 #bit T0IF = 0x0B.2 //タイマ0割り込み処理 #INT_RTCC //タイマ0の割り込み処理関数の宣言 void rtcc_isr(void) { T0IF=0; //タイマ0の割り込みフラグ TMR0=0xF8; //タイマ0の初期値 PORTA^=0x04; //PORTAの出力反転 } //メイン関数 void main(void){ set_tris_a(0xF8); //出力ポートの設定 set_tris_b(0xF7); //出力ポートの設定 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);//プリスケーラを使用しない set_timer0(0x0); //TMR0に0x0を書き込む enable_interrupts(INT_RTCC); //タイマ0の割り込み許可 enable_interrupts(GLOBAL); //グローバルの許可 PORTB = 0x7F; //出力 while(1){ //割り込みを待つ delay_ms(1); //1μs } } ///////////////////////////////////////////////////////////////////// このようなプログラムで160KHzの周波数を出力することは可能でしょうか? もし不足の部分や誤っていることがあったら教えてください。

  • PICのプログラムについて質問です

    使用するPICは16F84Aで、MPLAB IDEv8.88を使ってこのようなプログラムを作りました。 #include"pic.h" static void pic_init(); static void Delay_ms(unsigned char ms); static void Delay_1ms(); void main(){ pic_init(); while(1) { RB0 = 1 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); RB0 = 0 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); } static void pic_init() { // GPIO = 0b00000000; TRISA = 0xFF ; TRISB = 0x00 } static void Delay_ms(unsigned char ms) { unsigned char c; for (c=ms ; c>0 ; c--) { Delay_1ms(); } } static void Delay_1ms() { unsigned int cnt; unsigned int i; cnt = 76; for (i=0 ; i<cnt ; i++) { NOP(); } } ポートB0の出力を0から1にするプログラムなのですが、実行すると Error [314] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 52.24 ";" expected Error [254] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 77.0 undefined variable: "pic_init" ********** Build failed! ********** というエラーが出ます。このようなエラーが出る原因を教えて頂けないでしょうか。お願いします。

  • MPLABでのビルドがうまくいかない

    C、picともに初心者です。 いまだにビルドがうまくいかず、書き込みができなくて困っています。 以下のようなソースです ・・・・・・・・・・・・・・・・・・・・・・・・・ #include <12f675.h> #fuses INTRC_IO,NOWDT,NOPROTECT,BROWNOUT,NOMCLR //#device ADC = 10 #use delay(CLOCK = 4000000) #use fast_io(A) #define GP0 PIN_A0 #define GP1 PIN_A1 #define GP2 PIN_A2 #define GP3 PIN_A3 #define GP4 PIN_A4 #define GP5 PIN_A5 #define DAN 255 void main() { set_tris_A(0x04); setup_adc(ADC_OFF); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); setup_counters(RTCC_INTERNAL,RTCC_DIV_32); setup_timer_1(T1_DISABLED); while(1) { int i,j,k; for(i=0;i<DAN;i++) { for(k=0;k<DAN-i;k++) { for(j=0;j<i;j++) { output_a(0x12); delay_us(10); } for(j=0;j<DAN-i;j++) { output_a(0x00); delay_us(10); } } } } } ・・・・・・・・・・・・・・・・・・・・・・・・・ エラーメッセージは以下のとおりです。 Clean: Deleting intermediary and output files. Clean operation failed. BUILD FAILED: Fri Aug 01 13:19:45 2008 簡単な事のように思いますが、なぜうまくいかないのかわかりません。 よろしければ、ご教授ください。。