投稿者
 メール
  題名
  内容 入力補助動画検索画像・ファイル<IMG><OBJECT>タグが利用可能です。(詳細)
    
  ファイル1
  ファイル2
  ファイル3
アップロード可能な形式(各1MB以内):
画像(gif,png,jpg,bmp) 音楽(mmf,mld) 動画(amc,3gp,3g2)

 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ] [ teacup.>アマチュア無線 ] [ 検索 ]

[PR]     銀座 インプラント
teacup. ] [ 無料掲示板 ] [ プレミアム掲示板 ] [ teacup.コミュニティ ] [ ブログ ] [ チャット ]

全251件の内、新着の記事から10件ずつ表示します。 1  2  3  4  5  6  7  8  9  10  |  《前のページ |  次のページ》 

Re: R3 各ピン入力を読み取るには

 投稿者:kuga  投稿日:2009年 9月 2日(水)04時38分16秒
返信・引用
  > No.211[元記事へ]

GTRさんへのお返事です。

GTRさん始めまして。

5chのサーボPWMのパルス幅を測定すると言うことですね。
ひとつの受信機から出ているサーボ信号なら
パルスは同時に出るのではなく、順次出ているはずです。
このパルスの出力順に合わせて、パルス幅計測ルーチンを
5個並べれば問題ないと思います。

mes_5ch() {
  CH1_mes();
  CH2_mes();
  CH3_mes();
  CH4_mes();
  CH5_mes();
}

受信機kから出ている信号を観測してどんな順番で出力されて
いるかの確認をし、順番をそれに合わせる必要はあります。
CHx_mes();は L->H->L とハルスがlowに戻ったら
計測完了としてすぐreturnしている必要があります。

参考にしたプログラムはキャプチャー機能を利用している
かも知れません、その場合キャプチャーに利用できるpinは
制限があるので5CHには対応できません。
 

Re: R3 各ピン入力を読み取るには

 投稿者:nekosan  投稿日:2009年 9月 1日(火)23時38分40秒
返信・引用
  > No.211[元記事へ]

GTRさんへのお返事です。

> 有難うございます。
> 5chで 遠隔操縦できる ロボットを制作するのですが
> 家にあります ラジコンの送受信機を使うため 受信機側から出てくる
> 信号は直接 RCサーボを動かせる RCサーボ用PWM信号です。
> それを AVRチップに入力 1つの操作で 3つ〜4つのサーボを動かす事になり
> 動作パターンによって サーボの数が変わります。
>
> 使う言語は C言語でプログラムを製作中です。 本当に初心者でして
> いろいろな サンプルプログラムから 1ch分のRCサーボ用PWM信号を読み取る
> プログラムは 見つけたのですが それを5ch分いかに読み取るかです。
> 入力ポートのすべてのピンを 順に高速でスキャンすれば 読める
> と 教わったんですが プログラムが組めず悩んでます。
> 有難うございました


「RCサーボ用の信号」という言葉が指しているのが、
↓このような
http://nekosan0.bake-neko.net/library_servo.html
いわゆる一般的なサーボモーター駆動用の信号なのか、
それともプロポ側と周辺機器の間でi/fを取り交わす
ようなメーカー固有の仕様の信号なのか、その辺りが
良く見えないのですが、もし、1チャンネル分でも読み取る
サンプルプログラムがあるのなら、可能な範囲で
プログラムコードを公開してみる手はあるかもしれません。

私はラジコン関係は全然経験がないのでそのプログラムの
意味が理解可能かどうか判りませんが、そちら方面が得意な
方が手を貸してくれるかも知れませんので。


ちなみに、パルスのバンド幅をセンシングするのであれば、
AD変換器や普通のデジタル入力ピンを使うのではなく、
普通は内蔵タイマーユニットが持っている「キャプチャー機能」
を使うのが一番楽で正確なのでは、と言う気がしますが…
サンプルプログラムは本当にAD変換を使っているのでしょうか?
 

R3 各ピン入力を読み取るには

 投稿者:GTR  投稿日:2009年 9月 1日(火)19時22分43秒
返信・引用
  有難うございます。
5chで 遠隔操縦できる ロボットを制作するのですが
家にあります ラジコンの送受信機を使うため 受信機側から出てくる
信号は直接 RCサーボを動かせる RCサーボ用PWM信号です。
それを AVRチップに入力 1つの操作で 3つ〜4つのサーボを動かす事になり
動作パターンによって サーボの数が変わります。

使う言語は C言語でプログラムを製作中です。 本当に初心者でして
いろいろな サンプルプログラムから 1ch分のRCサーボ用PWM信号を読み取る
プログラムは 見つけたのですが それを5ch分いかに読み取るかです。
入力ポートのすべてのピンを 順に高速でスキャンすれば 読める
と 教わったんですが プログラムが組めず悩んでます。
有難うございました
 

Re: Re2 各ピン入力を読み取るには

 投稿者:nekosan  投稿日:2009年 8月31日(月)23時59分5秒
返信・引用
  > No.209[元記事へ]

GTRさんへのお返事です。

> 有り難うございます。
>
> 使用するチップは AVR ATmega128です。
> 入力信号は 市販のジャイロ信号 (RCサーボ信号PWMと同じです。)
> 5ch分の RCサーボ信号PWMを読み取れればよいのですが。
> 1ch分は検出プログラムはできたのですが
> 5chを読み取るには 検出するポートのピンを順番に高速で切り替えそれを
> 繰り返すループを組めばと思ったのですが
>
> どのように 検出するピンを高速に切り換えていく プログラムを
> 組めばよいのか そこがわかりません。


使用言語や処理内容が今ひとつぴんと来ないのですが、
単に5チャンネル分振り分けするなら、例えばC言語なら
switch〜case文をメインループの途中に挟み込んでおく
みたいなやり方で可能ではないでしょうか?


その前に、PWM信号を入力に使うというのは一般的
なのでしょうか?寡聞にして存じないのですが…

PWMはマイコンなどからアナログデータを出力する
ための方式だと思ってますが、もしマイコン間で
アナログ値をI/FするのであればPWM以外の方法を
使う気がします。

それに、そもそもPWM自体は「デジタル信号」なので
AD変換しても2つの値しか読めないのでは?AD変換
を使う意味が解りません。
(適当なLPFでも通すなら別ですが、一旦アナログ値化
 してしまうとI/Fされるデータにノイズが載る
 ことにもなりますし)

以前、JA2YYNさんから似たような質問を受けましたが、
私はPWMをマイコンで入力するようなケースを存じない
ので、そういう処理をしようとされているのであれば、
済みませんが多分お力にはなれないと思います。
 

Re2 各ピン入力を読み取るには

 投稿者:GTR  投稿日:2009年 8月31日(月)20時30分42秒
返信・引用
  有り難うございます。

使用するチップは AVR ATmega128です。
入力信号は 市販のジャイロ信号 (RCサーボ信号PWMと同じです。)
5ch分の RCサーボ信号PWMを読み取れればよいのですが。
1ch分は検出プログラムはできたのですが
5chを読み取るには 検出するポートのピンを順番に高速で切り替えそれを
繰り返すループを組めばと思ったのですが

どのように 検出するピンを高速に切り換えていく プログラムを
組めばよいのか そこがわかりません。
 

Re: 各ピン入力を読み取るには

 投稿者:nekosan  投稿日:2009年 8月31日(月)00時51分12秒
返信・引用
  > No.207[元記事へ]

GTRさんへのお返事です。

> 教えてください  ポート設定を行い 入力設定にし
> 各ピンを 順に同じ検出方法で読み取るには
> どのように プログラムを組めばよいのでしょう
> 入力は5ピン それを順番に高速で読み取りループにできれば
> 常にセンサー5個が読み取れてると思うのですが
> ピン0〜5までを 高速で順番でスキャンできればと思うのですが
> 入力を読み取るだけは出来たのですが(1つのセンサー)
> いかに 順番に切り替えて読み取るか 切り替える
> 方法がわかりません
>
> プログラム 初心者です。 教えていただけませんか


GTRさんこんにちは。

まずは対象のマイコンは何か(PIC?AVR?その他?)が
判らないとお話の進め様が無いかなぁと思われます。

また、入力設定にするポートと言うのは、デジタル入力なのか
アナログ入力(AD変換)なのかが判らないとやはりお話が
進まないかと思われます。

その他、どの様なセンサーを接続しているのか、どの様な
開発言語を使用しているのか、なども明確になっているほうが
お話がしやすいかと思います。


1入力でセンサーからの入力が可能であれば、それを
複数ピンに時分割にして高速に切り替えながら入力する
という考え方自体は特に違和感ありません。
ただ、その入力のやり方(入力処理や設定)自体が不明
なのか、それとも入力処理を時分割する制御方法が不明
なのか、そのあたりがよく見えません。

前者の入力処理自体のお話であれば、内蔵ペリフェラル
の取り扱いに関するお話ということだと思うので、
比較的単純なお話で済むかと思います。

後者の時分割のやり方といった話題であれば、お話の範囲が
少々漠然として広いお話になってくるかもしれません。


「プログラム初心者」とおっしゃっているのですが、
例えばフローチャートなどはご自身でお書きになったり、
それを何らかの処理言語用(例えばC言語など)の
プログラムにしたりということは問題なく出来る
と考えてよろしいのでしょうか?


可能な範囲で構いませんが、

 ・どんなマイコンを使うのか
 ・どんなセンサーを接続するのか
 ・どんな言語、どんな開発環境を使用するのか
 ・現在どこまで動作確認が出来ているのか
 ・プログラムを組むスキルがどの程度か
 ・回路を組むスキルがどの程度か
 ・読み込んだ値をどう加工してどんな用途に使うのか

といったあたりを補足頂ければと思います。

それによって、一口に時分割と言っても、単純にグルグル
ループをさせればいいのか、それともタイマー割り込み
などを使って入力のタイミング・間隔を厳密に制御
する必要があるのか無いのかだとか、一方読み込んだ値を
どのように加工・利用するのかとか、そういったあたりまで
含めて考える必要があるかと思います。
ある程度背景が見えてこないと具体的なプログラムの
コードに落とし込んでいくことが難しいかと。

マイコン以外(例えばPCで何らかのプログラムを組んだ
経験があるのか否か)などが判るとお話がしやすいかも
しれません。


よろしくお願いします。
 

各ピン入力を読み取るには

 投稿者:GTR  投稿日:2009年 8月30日(日)15時25分6秒
返信・引用
  教えてください  ポート設定を行い 入力設定にし
各ピンを 順に同じ検出方法で読み取るには
どのように プログラムを組めばよいのでしょう
入力は5ピン それを順番に高速で読み取りループにできれば
常にセンサー5個が読み取れてると思うのですが
ピン0〜5までを 高速で順番でスキャンできればと思うのですが
入力を読み取るだけは出来たのですが(1つのセンサー)
いかに 順番に切り替えて読み取るか 切り替える
方法がわかりません

プログラム 初心者です。 教えていただけませんか
 

Re: i2CでのPIC間通信について

 投稿者:nekosan  投稿日:2009年 8月17日(月)02時42分45秒
返信・引用
  > No.205[元記事へ]

yuyaさんへのお返事です。

yuyaさんこんにちは。
細かく眺めている時間が無いので、ザックリと眺めてみた
感じで気付いたところを何点か…

(1)#use i2cプリプロセッサの指定値

  スレーブ側の指定ですが、マニュアルによると
  #use i2cのオプションにNOFORCE_SW、もしくは
  バージョンによってはFORCE_HWを指定しないと、
  コンパイラが内部でソフトウェア処理として
  展開してしまうようです。
  i2c_poll()は内蔵SSPモジュールを使わないと
  機能しない関数らしいので(つまりハードウェア
  処理しないとイケナイ)、そこが悪さしている
  可能性があります。
  あと同様に、マスター側も現状のソースでは
  ソフトウェア処理で実装されている可能性が…。

(2)再現性の追い込み

  ICD2などのデバッガで1行1行追っていければ
  いいんですけど、それもすぐには難しいでしょう
  から、とりあえず今回の事象に関係が無いソース
  コードをザックリと取り除いて、最低限事象が
  再現する程度に関係ない部分を削り落としてみて
  いただけないでしょうか?PWMとかADCとか
  割り込みとか…
  当方実験する環境が無いので、どこが原因になって
  いるのかを追い込んでいくのに、現状のソースでは
  少々骨が折れるかと…

(3)ソフトウェアシミュレーション

  ICD2等のデバッガを使わないと仮定すると、
  MPLAB上のソフトウェアデバッガである程度
  追い込んで行くことも1つの手段になるかも
  しれません。
  シミュレータ上の入出力ピン、もしくは特殊
  レジスタファイルに直接データを入力して、
  シミュレータ上で処理を1ステップずつ動かして
  行った場合に、どんな処理結果が出てくるか
  によって原因を追い込むことが出来るかも
  しれません。
  (ソフトウェアシミュレータがどこまで
   実現されているかが良くわかってませんが)


とりあえずこんなところですが…
 

i2CでのPIC間通信について

 投稿者:yuya  投稿日:2009年 8月16日(日)17時47分59秒
返信・引用
  PIC間の通信についてどうか教えて下さい。送信側のPICから受信側のPICにi2Cでデータを送信しようとしています。問題は受信側のアドレスをデータとして読み込んでいるということですそこでプログラムの方でackのチェックをしました。
   i2c_start();
   i2c_write(0x20);
   i2c_write(data);
   i2c_stop();
とCCSでは関数があるのですが、i2c_write(0x20);のackがかえってきていないということがわかりました。原因がわかるかた、また調べる方法よろしければ教えていただけないでしょうか?

PICは16F877Aを用いています。

送信側プログラム
#include <16f877A.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#device ADC=10
#use delay(clock = 20000000)
#use i2c(MASTER,SDA=PIN_C4,SCL=PIN_C3)
#use rs232(BAUD = 9600, XMIT = PIN_C6, RCV = PIN_C7)
#use fast_io(b)
#use fast_io(d)
#include <stdlib.h>

//A/Dパラメータ
void a_d_converter();
int adcount=0;
int adf=10;
long ad_x=0;
int admax=10;//a/d変換周期(/0.1ms)
int32 data[8]={0};//データの格納
long ad[10];
long ave[8];
long angle=0;
void receive();
long data1;
char idata[10];
int rotaryflag=0;
short ack=0;
short ack2=0;

void main(void)
{
   output_float(PIN_C3);                             //I2C pin float
   output_float(PIN_C4);


   setup_PSP(PSP_DISABLED);
   set_tris_e(0);
   //タイマ1の初期設定
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   set_timer1(15536);//約10msecで割り込み

   //アナログ変換設定
   setup_ADC(ADC_CLOCK_DIV_32);
   setup_adc_ports(ALL_ANALOG);
   set_tris_b(0x00);
   set_tris_d(0x00);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   ///メインループ
   while(1)
   {

      if(KBHIT()){

         receive();

         }
   }
}

#INT_TIMER1
void isr1()
{
   set_timer1(15536);
   a_d_converter();
   data[1]=0;
   i2c_start();                                         //スタートコンディション
   ack=i2c_write(0x20);                                  //アドレスaddに送信
      if(ack==1){
      i2c_stop();                                    //ストップコンディション
      printf("ERROR[1]\r\n");
      }

      if(ack==0){

         ack2=i2c_write(rotaryflag);
         if(ack2==1){
            i2c_stop();
                                                //ストップコンディション
            printf("ERROR[2]\r\n");

         }

         i2c_stop();

      }

   if(angle >= data1){

      rotaryflag=1;

   }

   if(angle < data1){

      rotaryflag=0;

   }

}
//A/D変換関数
void a_d_converter(){

   adcount++;


   set_adc_channel(1);
   delay_us(40);
   ad[1]=read_adc();
   data[1] = data[1] + ad[1];


   if(adcount>=adf){

      ave[1]=data[1]/adcount;
      adcount=0;

      if(ave[1] < 345){

         angle=(ave[1]+679)*45/128;

         }

      if(ave[1] >= 345){

      angle=(ave[1]-345)*45/128;

      }

   }
}

void receive(){

   gets(idata);
   data1 = atol(idata);
}

ここで結果としてprintfでERROR[1]とでるのでi2c_write()のackがかえってきていないようです。

受信側
#include <16f877A.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#device ADC=10
#use delay(clock = 20000000)
#use i2c(SLAVE,SDA=PIN_C4,SCL=PIN_C3,ADDRESS=0x20)
#use rs232(BAUD = 9600, XMIT = PIN_C6, RCV = PIN_C7)
#use fast_io(b)

int dutyd;//走行用モータduty比(/0.1ms)
int dmax;//走行用モータPWM周期
int dr_x=0;
int rotaryflag=1;
int rotaryflag1=1;

void main(void)
{
   output_float(PIN_C3);                             //I2C pin float
   output_float(PIN_C4);
   set_tris_b(0x00);
   //初期パラメータ設定
   dutyd=1;//走行用モータduty比(/0.1ms)
   dmax=10;//走行用モータPWM周期
   setup_PSP(PSP_DISABLED);
   set_tris_e(0);
   //タイマ1の初期設定
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   set_timer1(63036);//約0.5msecで割り込み
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   output_low(PIN_B4);//enable_dr
   output_low(PIN_B1);//enable_dm
   output_low(PIN_B5);//in_dr
   output_low(PIN_B3);//brake_dr
   output_high(PIN_B2);//chop_dr
   output_low(PIN_B0);//chop_dm

   output_high(PIN_B3);//brake_dr
   delay_ms(100);
   output_low(PIN_B2);//chop_dr
   output_high(PIN_B0);//chop_dm
   output_high(PIN_B4);//enable_dr

   output_low(PIN_B4);//enable_dr
   output_low(PIN_B3);//brake_dr
   output_high(PIN_B2);//chop_dr
   output_low(PIN_B0);//chop_dm


   while(1)///メインループ
   {

         if(i2c_poll()) {
         rotaryflag=i2c_read();
         printf("flag1=%d\tdutyd=%d\r\n",rotaryflag,dutyd);
         }
   }
}


#INT_TIMER1
void isr1()
{
   set_timer1(63036);
   dr_x++;

   if(dr_x==dmax){
   dr_x=0;
   output_high(PIN_B2);//chop_dr
   output_low(PIN_B0);//chop_dm
   }
   if(dr_x>=dutyd){
      output_low(PIN_B2);//chop_dr
      output_high(PIN_B0);//chop_dm
   }

      if(rotaryflag==0){

         dutyd=0;

      }

      if(rotaryflag==1){

         dutyd=1;
      }
}
受信側PICのprintfの結果;rotaryflagには受信側のアドレスがはいってしまいます。(32)通信できていればrotaryflagに1か0がはいるはずなのですが。。。
PICもまだ勉強不足でよくわからなく、どうか教えていただければ幸いです
 

カウンタ

 投稿者:nekosan  投稿日:2009年 7月23日(木)19時45分34秒
返信・引用
  掲示板に無料のカウンタ機能が付いたらしいので、
設定してみました。

単にそれだけなんですけど…。
 

以上は、新着順41番目から50番目までの記事です。 1  2  3  4  5  6  7  8  9  10  |  《前のページ |  次のページ》 
/26 


[PR]