FC2カウンター

現在の訪問者数

現在の閲覧者数:

カレンダー

10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -

プロフィール

剣菱P

Author:剣菱P
剣菱Pと申します。
性別:男
年齢:27
二兎を追って一兎も得られないタイプ

マイコンやプログラミング、ニコニコ動画、雑記等
方向性は見えずとも、ちょっとずつ更新していく予定です!

リンクフリーです。
こんなブログでよかったらよろしくお願いしま~す。

公開メール kenbishiP@gmail.com

検索フォーム

最新記事

最新コメント

カテゴリ

メールフォーム

名前:
メール:
件名:
本文:

月別アーカイブ

最新トラックバック

リンク

ブロとも一覧

ブロとも申請フォーム

ランキング

ランキング参加中です。気が向いたらクリックしてあげてください。


にほんブログ村 その他趣味ブログへ
にほんブログ村 その他趣味ブログ 趣味の工作へ

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

タチコマのサーボ VC++/CLI  シリアル通信»

コメント

コメントの投稿













管理者にだけ表示を許可する

PCでサーボ制御


よくわからないポイントがたくさんあり、そこをまだ解決してないが

自分のわかる範囲で何とか工夫してプログラムを書いてみました。

文字コードがなぜか2バイトになってることとか
数値も全部文字データに変換されることとか、訂正方法がまだわからないので
無理やりそのまま1バイト単位で読み込む、はっきり言ってスマートさのかけらも感じられないプログラムにw

PC側プログラム


#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                int indexNumber = comboBox1->SelectedIndex;
                String^ str;

                char select;
                switch(indexNumber){
                    case 0: select = 'A';break;
                    case 1: select = 'B';break;
                    case 2: select = 'C';break;
                    case 3: select = 'D';break;
                }
                str = select + textBox1->Text;
               
                serialPort1->Write(str);       
             }
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
             serialPort1->Open();
         }
private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
             textBox2->Text = serialPort1->ReadLine();
         }



PIC側プログラム

#include <12f683.h>
#fuses HS,NOWDT,NOPROTECT,NOMCLR,BROWNOUT
#use delay(clock = 20000000)
#use rs232(BAUD =9600, XMIT = PIN_A1, RCV = PIN_A3)
#define zero_p 15536

#int_timer1
void intval(){
    set_timer1(0x3cb0);
    output_high(PIN_A0);
}

#int_ccp1
void ccp1_isr(){
    output_low(PIN_A0);
}   
main()
{
    char time[4] = {'3','7','5','0'};
    char select[2] = {'5','5'};
    int data;
    setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
    setup_ccp1(CCP_COMPARE_CLR_ON_MATCH);
    CCP_1 = zero_p + 3750;
    enable_interrupts(INT_TIMER1);
    enable_interrupts(INT_CCP1);
    enable_interrupts(GLOBAL);
    set_timer1(0x3cb0);
    set_tris_a(0x09);
    output_a(0x00);
   
    while(1){
        select[0] = getc();
        select[1] = getc();
        data = (select[0]-'0')*10 + select[1]-'0';
        if(data == 65){
            time[0] = getc();
            time[1] = getc();
            time[2] = getc();
            time[3] = getc();
        }
        CCP_1 = zero_p  + (time[0]-'0')*1000 + (time[1]-'0')*100 + (time[2]-'0')*10 + (time[3]-'0');
        printf("%c%c%c%c\r\n",time[0],time[1],time[2],time[3]);
    }
}



PCからPICにはサーボ選択2バイト、パルス幅設定に4バイト 計6バイトのデータを送信してます。

PIC側はサーボのデバイス番号が一致しなければパルス幅変更を受け付けません。

最後に現在の値をPCに送り返します。送り返すのはサーボ番号を除いた4バイト

Aのサーボに3750およそ1.5msのパルスを送るようにPICに命令 受理されて3750のデータが返信
servo-pic.jpg

Aのサーボに対しBを指定して4000のパルスを送るように命令。当然スルーされる
servo-pic2.jpg

問題なく動き、設定したパルス幅でサーボを動かすことが出来ました。



ただ、シリアル通信について自分が理解していないポイントが浮上

正しいサーボ番号で受信した場合は6バイト受け取るが
それ以外はサーボ番号の2バイトしか受け取らない

受け取らないけど4バイトは送られてくるわけですよね
パソコンの場合はシリアルデータはバッファにストックされると聞いたことがあるような気がしますが

そうなるとバッファにたまった不要な4バイトが悪さをするような気も・・・

PICにはバッファはないのかな よく考えれば そんな余裕はPICには無いか


でも、改行コードで 信号を区切ってるわけじゃないから動作が高速になったら死ねそう
それ以前に、タイミングが1バイトずれたりしたら 終わりなような気がしてきた・・・

よく正常に動いてるなこれ・・・

今後の課題はPCとPICの型をあわせることだなぁ。
スポンサーサイト

タチコマのサーボ VC++/CLI  シリアル通信»

コメント

コメントの投稿













管理者にだけ表示を許可する


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。