RPU-10講座/第四章 待たないRS232C通信とボタンでLED点灯

公開日:  最終更新日:2014/06/05

すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。

ℹ️本記事にはPRが含まれています。

マイコンによるロボット制御には必須と思われる、「待たないRS232Cデータ受信」を、RPU-10にてどのように実装したかということについて説明します。


■RPU-10は待っている。
ここまで紹介したRS232C通信ですが、「データを受信するまで待ち、データが来たら送信する」という仕組みで動いています。ということは、RPU-10は、データを受信するまでひたすら待っている、という、なんだかもったいない状態になってしまっています。


一からすべてのプログラムを書いていれば、割り込み処理などを併用することで、空いている時間にほかの事をさせるとかというのも可能ですが、割り込み処理っていうのも、あまり長い時間処理させるようなものはトラブルの原因になりますので、だいたいいつも、別の方法でシリアル通信待ちが発生しないようにして、メイン処理でサーボ角度の計算とかを行い、割り込み処理ではセンサの取り込みとか、時間的なタイミング取りとかをやらせていますので、今回、紹介するやり方は
わりとよく使われているやり方かなって思っています。


■受信データがあるか、データ取得前にチェック
どうやったらRS232C受信待ちをせずにデータを受信できるようになるかというと、「RS232C受信データがあったら受信する」という方式にすればよいのです。GDLのライブラリとして供給されていますので、中身がどうなっているのかはわかりませんが、とりあえず「rs0_rx_buff()」という関数が使えるようです。


これは、裏方処理(たぶん)で受信処理を行っていて、受信データが溜まっているかどうかをチェックする関数です。これを使って、「最初に、受信データがあるかどうかチェック」した後に、もしデータがあったらデータを取り出す、というようにすることで、受信データが来るまで待つ、という状況を防ぐことができます。


■RPU-10上のプッシュボタンとLED
RPU-10には、上面にプッシュボタンとLEDが2つついています。プッシュボタンは、プログラムを書き込むときに使用したボタンですが、実は、書込みモード専用というわけではなく、プログラムの中で使用することができます。また、LEDは電源LEDと、もう1つLEDがついていますが、このLEDもプログラムから操作することができます(下の写真の「MONITOR」って書いてある左側がLEDです)。



プッシュボタンの状態を読み取るには、以下の関数を使用します。



short RPU_IsPushButton( void );


この関数を実行すると、プッシュボタンが押されているときは「1」、押されていないときは「0」が返ってきます。これによってプッシュボタンの状態を知ることができます。


また、LEDをON/OFFするには、以下のマクロを使用します。マクロっては、C言語でよく使われるもので、#defineという定義機能を使ってあらかじめ文字列を定義する機能です。定義のやりかたによりますが、関数とはちょっと違う扱いになります。で、LED操作は、以下のマクロで行います。



LED_ON
LED_OFF


そのまんまな名前ですが、これはこれでシンプルでよいですね。


■サンプルプログラム
ということで、サンプルプログラムを作成してみました。今回のは、RS232Cからデータを受信してそれをエコーバックしますが、受信データが無いときもプログラムがちゃんと回っていることを確認するため、「RPU-10上面のプッシュボタンを押すとLEDが点灯する」、という機能を付け加えてみました。


   1: //—————————————————————————————-
2: // 待たないRS232C入力と、入力されたデータでRPU-10上のLEDを制御
3: // パソコンのシリアル端末から入力された文字を、そのままパソコンに返しますが、メイン
4: // 処理は入力が無くても他の処理を行うサンプルです。シリアル通信の監視をしながら、
5: // RPU-10上のボタン操作によってLEDをON/OFFします。
6: //
7: // 環境 RPU-10、GDL V2.00
8: // 説明 ビルドされた本プログラムをRPU-10へ転送後、パソコン側で「SIMPLE TERM」(GDLに
9: // 同梱)などを使って通信速度115200bpsで通信ポートを開いてください。その後RPU-10
10: // を再起動するとプログラムがスタートし、「SIMPLE TERM」の方に起動文字列が表示
11: // され、キーボードで文字を入力すると、入力された文字が表示されます。
12: // ちなみに、”RS232C TO LED”の”TO”は、英語の「トゥ」ではなく、日本語の「と」です。
13: //
14: // AUTHORED BY SISO JUNK STDUIO
15: //—————————————————————————————-
16: #include <avr/pgmspace.h>
17: #include <avr/io.h>
18: #include <avr/interrupt.h>
19: #include <avr/eeprom.h>
20: #include <stdio.h>
21: #include <avr/boot.h>
22: #include <avr/wdt.h>
23:
24: #include <sv.h>
25: #include <rs.h>
26:
27:
28: const char GPformatData[] PROGMEM = “RS232C TO LED”;
29:
30:
31: int main( void )
32: {
33: RPU_InitConsole( br115200 ); // RPU-10ライブラリの初期化
34: SV_Init( br115200 ); // サーボ制御ライブラリの初期化
35: sei(); // 割り込み処理開始
36:
37: // 1秒待つ(よく知らないけど必要らしい)
38: RPU_ResetTimerCounter();
39: while( RPU_GetTimerCounter10() < 100 );
40:
41: // 起動メッセージの表示
42: rs0_puts_P( GPformatData );
43: while( 1 ){
44: if( rs0_rx_buff() != 0 ){ // 受信バッファのチェック
45: rs0_putc( rs0_getc()); // データ受信と送信(表示)
46: }
47: // プッシュボタンによるLED点灯
48: if( RPU_IsPushButton() == 1 ){
49: LED_ON;
50: }
51: else{
52: LED_OFF;
53: }
54: }
55:
56: return 1;
57: }

今回の要は、L44~L46です。ここで、まず受信データがあるかどうかをチェックし、あったら受信してそのデータを送信する、というようになっています。また、無かった場合、そのまま何も処理をせず、次の処理へ移ります。


L47~L53は、プッシュボタンの状態によってLEDを点灯させるためのプログラムです。RPU_IsPushButton()でプッシュボタンの状態を読み取り、それに応じてLEDをON/OFFしているだけです。


シリアル端末から何もデータを送らなくても、プッシュボタンを押すことでLEDが点灯/消灯すると思いますので、これで、L47~L53の部分が常時実行されていることがわかるかと思います。


■今回使用した関数



  • unsigned char rs0_tx_buff (void);
    RS232C(USART0)に、受信データがあるかどうかを確認します。確認するだけで、受信は行いません。また、戻り値としては、現在、バッファに保持しているデータ数を返します。このあたり、中身が見えないんで微妙ですが…。

  • short RPU_IsPushButton( void );
    RPU-10上面のプッシュボタンの状態を取得します。押されている場合は「1」、押されていない場合は「0」が戻り値となります。51usecぐらいで処理してくれます。

  • LED_ON
    RPU-10上面のLEDをONするマクロです。マクロですので、使い方はちょっと関数と異なるため、少々、注意が必要です。たとえば、
    if( RPU_IsPushButton() == 1 ) LED_ON;
    else LED_OFF;
    と書くと、ビルド時、コンパイルエラーになります。しかし、
    if( RPU_IsPushButton() == 1 ) LED_ON
    else LED_OFF
    と書くと、ビルドすることができます。

  • LED_OFF
    RPU-10上面のLEDをOFFするマクロです。マクロですので、使い方はちょっと関数と異なるため、少々、注意が必要です。

ま、こんな感じの構造を基本にすれば、ファームウェアのプログラムはできると思います。





※注意:本BLOGにてRPU-10での再プログラミングについての情報を公開していますが、これらはSISOが個人的に再プログラミングを行った時の技術情報を整理して紹介しています。GDLへのRPU-10ライブラリ同梱については、Best Technologyさんのご好意で、趣味人への1つのチャンスとして同梱してくださっていると理解しています。そのため、RPU-10の再プログラミングについては、くれぐれもご自身の責任で、また、Best TechnologyさんやFUTABAさんに問い合わせたりすることの無いようにお願いいたします。

  • このエントリーをはてなブックマークに追加
  • Pocket

関連前後記事

Comment

  1. urouro より:

    SISO様、
     はじめまして、urouroです。
     私のブログの方にコメントを頂いていたのですが全然確認してませんで、ご挨拶が遅くなりまして申し訳ございませんでした。
     今後ともよろしくお願いいたします。

  2. SiSO より:

    urouroさん、初めまして!コメントありがとうございます。こちらこそ、とっかかりはかなり参考にさせていただき、ありがとうございました。やったことのないデバイスでのプログラミングって、最初の取っ掛かりと部分が一番つまづくんですが、urouroさんが情報あげてくださっていたおかげで、スムーズに入れましたよ。
    今後ともよろしくお願いいたします。

  3. […] RPU-10講座/第四章 待たないRS232C通信とボタンでLED点灯 […]

Your Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

PAGE TOP ↑