E-mail
パスワード
次回から自動ログインする
パスワード紛失
新規登録
ホーム
|
新着情報
|
研究室
|
掲示板
|
ぶろぐ
|
Wiki
|
お問合せ
|
アルバム
|
リンク
|
サイトマップ
|
|
一覧
検索
最新
ヘルプ
ページへ戻る
履歴
リンク元
印刷
inc/mbed/20140629
をテンプレートにして作成
xpwiki
:inc/mbed/20140629 をテンプレートにして作成
開始行:
** mbed ことはじめ
*** まず頭に入れてくべきこと
-- [[mbedオフィシャルサイト:https://mbed.org/]] 全てはこ...
-- [[mbedとは:Wikiedia:http://ja.wikipedia.org/wiki/Mbed]]
-- [[mbed と Arduino の違い:https://mbed.org/users/okini3...
*** 準備したもの
-- mbed対応のマイコン。今回は、[[LPC1114FN28 を、秋月電子...
-- USB-シリアル変換モジュール [[FT232RL 秋月で購入:http...
-- Arduinoスターターキット [[SGK-ARD-KIT 千石電商で購入:h...
*** 配線
- 参考
-- [[mbed LPC1114でLチカしてみた(1):http://www3.big.or.jp...
マイコンとFT232RLの接続が参考になります。 プログラムを...
-- [[mbed LPC1114でLチカしてみた(2):http://www3.big.or.jp...
LPC1114限定で「LPCISP」というソフトを公開しておられます...
|&ref(LPCISP_0.jpg,mw:360,mh:360);|
- ハード図
ブレッドボードを使うとテストは楽にできるけど、一度バラ...
-- LPC1114のLED回路はソース出力(PNP)でプラスコモン、FT23...
工業用制御部品に関していえば、日本国内やアジア圏ではシ...
組み込み部品での状況は全くわからずです。
|&ref(mbed_UART_SERVO.jpg,mw:480,mh:360);|
|&ref(site://modules/dblog1/upimg/00215f18aa1dcaf25bbcdb4...
*** プログラム
mbedはarduinoと違い、ほぼ素のC/C++で書けます。 オンラ...
とはいえまずはオンラインコンパイラで。
|&ref(mbed_WorkSpace_0.jpg,mw:480,mh:360);|
**** 使用ライブラリ
- Servo
mbedのオンラインコンパイラ上の「Import」でキーワード「S...
- MySerial
[[自作ライブラリ MySerial:http://mbed.org/users/naao/co...
-- GetString メソッドは、テンプレート化でオーバーロードし...
-- Wait時間の設定を追加してあります。
その他APIは、[[こちらを参照:http://mbed.org/users/naao/...
-- MySerial.h
#code(c,0-){{
/** mbed Serial Library extend RawSerial
* Copyright (c) 2014 Naoki Okino
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ...
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES O...
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ...
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ...
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR O...
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE O...
* THE SOFTWARE.
*/
#ifndef MBED_MYSERIAL_H
#define MBED_MYSERIAL_H
#include "mbed.h"
/** MySerial control class, based on a RawSerial
*
* Example:
* @code
* #include "mbed.h"
* #include "MySerial.h"
*
* MySerial pc(USBTX,USBRX); //instance of MySerial Class
* char cWord[16]; //receive chars or cWord[256], cWord[...
*
* void readbuf()
* {
* // int iRtn = pc.GetString(6,&cWord); //Serial r...
* int iRtn = pc.GetString(6,cWord); //Serial receive...
* }
* int main() {
* pc.baud(9600); //set baud rate
* pc.format(8, MySerial::None, 1);//set bits for a by...
* pc.SetRxWait(0.01, 0.001); //set wait getting...
* pc.attach( readbuf, MySerial::RxIrq ); //Set Int...
* }
* @endcode
*/
class MySerial : public RawSerial{
public:
/** constructor to get chars received by serial
*
* @param PinName tx
* @param PinName rx
*/
MySerial(PinName tx, PinName rx);
/** set wait getting chars after interrupted
*
* @param float _fRxStartWait wait getting a 1st char...
* @param float _fRxEachWait wait getting each char
*/
void SetRxWait(float _fRxStartWait, float _fRxEachWai...
/** function to get chars after received chars by ser...
*
* @param int size for get chars
* @param *cWord returns got chars by pointer
* @param returns success by 0
*/
virtual int GetString(int size, char *cWord);
/** overload function to get chars after received cha...
*
* @param int size for get chars
* @param cWord returns got chars by ref
* @param returns success by 0
*/
template <class X> int GetString(int size, X cWord)
{
return GetString(size, &cWord);
}
protected:
float fRxStartWait;
float fRxEachWait;
}; /* class MySerial */
#endif
}}
-- MySerial.cpp
#code(c,0-){{
#include "MySerial.h"
MySerial::MySerial(PinName tx,PinName rx):RawSerial(tx,rx...
{
fRxStartWait = 0.01; //wait getting a 1st char aft...
fRxEachWait = 0.001; //wait getting each char
}
void MySerial::SetRxWait(float _fRxStartWait, float _fRxE...
{
fRxStartWait = _fRxStartWait; //wait getting a 1st ...
fRxEachWait = _fRxEachWait; //wait getting each c...
}
int MySerial::GetString(int size, char *cWord) ...
{
int i=0;
int ichar;
memset(cWord, '\0', strlen(cWord)); //initialise chars
wait(fRxStartWait);
while(1) {
if(!readable()) {
break;
}
ichar = getc();
if(i<size) {
cWord[i] =ichar;
//putc(ichar);
}
i++;
wait(fRxEachWait);
}
return 0;
}
}}
**** メイン
- シリアルコマンド
ただの実験なので、<STX><ETX>などの制御コマンドは一切無し...
-- 「start」で開始
-- 「pxxx」(xxxは角度)で位置決め
-- 「stop」で停止
です。
- 受信の割り込みと、50ms定時タイマ割り込みを受けてメイン...
-- 割り込みのIRQ変数名は、シリアルが「UART_IRQn」、定時タ...
- まだ試していませんが、フロー制御を入れないと9600bps以外...
- ソース
volatile のつけ方などわかっていないので、まだ適当です。
-- main.cpp
#code(c,0-){{
#include "mbed.h"
#include "Servo.h"
#include "MySerial.h"
Servo myservo(dp18);
MySerial pc(USBTX,USBRX); //instance of MySerial ...
Ticker timer;
DigitalOut led2(LED2); //alive check LED
volatile int cntRx=0;
volatile int cntRx_old=0;
volatile int timeUp=0;
volatile int timeUp_old=0;
char cWord[6]; //receive chars or cWord[256], cWord[1024...
char *pCword = cWord; //pointer for cword
const char ccStart[6] = "start";
const char ccStop[5] = "stop";
const char ccMove_[2] = "p";
int readSize = 5;
int doStatus;
int iDeg;
void atRx()
{
NVIC_DisableIRQ(UART_IRQn);
cntRx++;
}
void atTimer()
{
//NVIC_DisableIRQ(TIMER_16_0_IRQn);
timeUp++;
}
void readbuf()
{
pCword = cWord; //pointer for cword
//int iRtn = pc.GetString( readSize, &cWord[0] ); //...
int iRtn = pc.GetString( readSize, cWord ); //Serial...
if(strcmp(cWord, ccStart)==0) { // start
doStatus=1;
printf("started\n");
} else if(strcmp(cWord, ccStop)==0) { // stop
doStatus=0;
printf("stopped\n");
} else if(cWord[0]==ccMove_[0]) { // 1st char matches
pCword++; // increment pointer...
iDeg = atoi( pCword );
printf("%d\n",iDeg);
} else { //no action except fo...
printf(" no match %s\n" , cWord);
}
if ((doStatus == 1) && (0 <= iDeg) && (iDeg <= 180)) {
wait(0.01); // waits fo...
myservo.position(iDeg - 83.0);
}
}
int main()
{
pc.baud(9600); //set baud rate
pc.format(8, MySerial::Odd, 1);//set bits for a byte,...
//pc.format(8, MySerial::None, 1);//set bits for a by...
//pc.set_flow_control(MySerial::RTSCTS,dp26,dp25);
pc.SetRxWait(0.01, 0.001); //set wait getting c...
wait(0.25); //startup wait
pc.attach( &atRx, MySerial::RxIrq ); //Set Interru...
NVIC_SetPriority(UART_IRQn, 120);
timer.attach( &atTimer, 0.05 );
NVIC_SetPriority(TIMER_16_0_IRQn, 10);
myservo.calibrate(/* range */ 0.00099, /* angle +/- *...
while(1) {
wait(0.01);
if(cntRx != cntRx_old)
{
readbuf();
cntRx_old = cntRx;
NVIC_EnableIRQ(UART_IRQn);
}
if(timeUp != timeUp_old)
{
if( 10 <= timeUp )
{
led2 = !led2;
timeUp=0;
}
timeUp_old = timeUp;
//NVIC_EnableIRQ(TIMER_16_0_IRQn);
}
}
}
}}
** 実行結果
シリアルコンソールには、定番のTeraTermではなく、「[[RS232...
下図のように、コマンドを送ると帰ってきたアンサーが表示さ...
|&ref(Comm_0.jpg,mw:480,mh:360);|
** 総括
mbed、おもしろいです。 C/C++の入門にもなるし、ハード回...
次回は、オフラインでのコンパイルとデバグ環境にチャレン...
[[inc/mbed]]
終了行:
** mbed ことはじめ
*** まず頭に入れてくべきこと
-- [[mbedオフィシャルサイト:https://mbed.org/]] 全てはこ...
-- [[mbedとは:Wikiedia:http://ja.wikipedia.org/wiki/Mbed]]
-- [[mbed と Arduino の違い:https://mbed.org/users/okini3...
*** 準備したもの
-- mbed対応のマイコン。今回は、[[LPC1114FN28 を、秋月電子...
-- USB-シリアル変換モジュール [[FT232RL 秋月で購入:http...
-- Arduinoスターターキット [[SGK-ARD-KIT 千石電商で購入:h...
*** 配線
- 参考
-- [[mbed LPC1114でLチカしてみた(1):http://www3.big.or.jp...
マイコンとFT232RLの接続が参考になります。 プログラムを...
-- [[mbed LPC1114でLチカしてみた(2):http://www3.big.or.jp...
LPC1114限定で「LPCISP」というソフトを公開しておられます...
|&ref(LPCISP_0.jpg,mw:360,mh:360);|
- ハード図
ブレッドボードを使うとテストは楽にできるけど、一度バラ...
-- LPC1114のLED回路はソース出力(PNP)でプラスコモン、FT23...
工業用制御部品に関していえば、日本国内やアジア圏ではシ...
組み込み部品での状況は全くわからずです。
|&ref(mbed_UART_SERVO.jpg,mw:480,mh:360);|
|&ref(site://modules/dblog1/upimg/00215f18aa1dcaf25bbcdb4...
*** プログラム
mbedはarduinoと違い、ほぼ素のC/C++で書けます。 オンラ...
とはいえまずはオンラインコンパイラで。
|&ref(mbed_WorkSpace_0.jpg,mw:480,mh:360);|
**** 使用ライブラリ
- Servo
mbedのオンラインコンパイラ上の「Import」でキーワード「S...
- MySerial
[[自作ライブラリ MySerial:http://mbed.org/users/naao/co...
-- GetString メソッドは、テンプレート化でオーバーロードし...
-- Wait時間の設定を追加してあります。
その他APIは、[[こちらを参照:http://mbed.org/users/naao/...
-- MySerial.h
#code(c,0-){{
/** mbed Serial Library extend RawSerial
* Copyright (c) 2014 Naoki Okino
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ...
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES O...
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ...
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ...
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR O...
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE O...
* THE SOFTWARE.
*/
#ifndef MBED_MYSERIAL_H
#define MBED_MYSERIAL_H
#include "mbed.h"
/** MySerial control class, based on a RawSerial
*
* Example:
* @code
* #include "mbed.h"
* #include "MySerial.h"
*
* MySerial pc(USBTX,USBRX); //instance of MySerial Class
* char cWord[16]; //receive chars or cWord[256], cWord[...
*
* void readbuf()
* {
* // int iRtn = pc.GetString(6,&cWord); //Serial r...
* int iRtn = pc.GetString(6,cWord); //Serial receive...
* }
* int main() {
* pc.baud(9600); //set baud rate
* pc.format(8, MySerial::None, 1);//set bits for a by...
* pc.SetRxWait(0.01, 0.001); //set wait getting...
* pc.attach( readbuf, MySerial::RxIrq ); //Set Int...
* }
* @endcode
*/
class MySerial : public RawSerial{
public:
/** constructor to get chars received by serial
*
* @param PinName tx
* @param PinName rx
*/
MySerial(PinName tx, PinName rx);
/** set wait getting chars after interrupted
*
* @param float _fRxStartWait wait getting a 1st char...
* @param float _fRxEachWait wait getting each char
*/
void SetRxWait(float _fRxStartWait, float _fRxEachWai...
/** function to get chars after received chars by ser...
*
* @param int size for get chars
* @param *cWord returns got chars by pointer
* @param returns success by 0
*/
virtual int GetString(int size, char *cWord);
/** overload function to get chars after received cha...
*
* @param int size for get chars
* @param cWord returns got chars by ref
* @param returns success by 0
*/
template <class X> int GetString(int size, X cWord)
{
return GetString(size, &cWord);
}
protected:
float fRxStartWait;
float fRxEachWait;
}; /* class MySerial */
#endif
}}
-- MySerial.cpp
#code(c,0-){{
#include "MySerial.h"
MySerial::MySerial(PinName tx,PinName rx):RawSerial(tx,rx...
{
fRxStartWait = 0.01; //wait getting a 1st char aft...
fRxEachWait = 0.001; //wait getting each char
}
void MySerial::SetRxWait(float _fRxStartWait, float _fRxE...
{
fRxStartWait = _fRxStartWait; //wait getting a 1st ...
fRxEachWait = _fRxEachWait; //wait getting each c...
}
int MySerial::GetString(int size, char *cWord) ...
{
int i=0;
int ichar;
memset(cWord, '\0', strlen(cWord)); //initialise chars
wait(fRxStartWait);
while(1) {
if(!readable()) {
break;
}
ichar = getc();
if(i<size) {
cWord[i] =ichar;
//putc(ichar);
}
i++;
wait(fRxEachWait);
}
return 0;
}
}}
**** メイン
- シリアルコマンド
ただの実験なので、<STX><ETX>などの制御コマンドは一切無し...
-- 「start」で開始
-- 「pxxx」(xxxは角度)で位置決め
-- 「stop」で停止
です。
- 受信の割り込みと、50ms定時タイマ割り込みを受けてメイン...
-- 割り込みのIRQ変数名は、シリアルが「UART_IRQn」、定時タ...
- まだ試していませんが、フロー制御を入れないと9600bps以外...
- ソース
volatile のつけ方などわかっていないので、まだ適当です。
-- main.cpp
#code(c,0-){{
#include "mbed.h"
#include "Servo.h"
#include "MySerial.h"
Servo myservo(dp18);
MySerial pc(USBTX,USBRX); //instance of MySerial ...
Ticker timer;
DigitalOut led2(LED2); //alive check LED
volatile int cntRx=0;
volatile int cntRx_old=0;
volatile int timeUp=0;
volatile int timeUp_old=0;
char cWord[6]; //receive chars or cWord[256], cWord[1024...
char *pCword = cWord; //pointer for cword
const char ccStart[6] = "start";
const char ccStop[5] = "stop";
const char ccMove_[2] = "p";
int readSize = 5;
int doStatus;
int iDeg;
void atRx()
{
NVIC_DisableIRQ(UART_IRQn);
cntRx++;
}
void atTimer()
{
//NVIC_DisableIRQ(TIMER_16_0_IRQn);
timeUp++;
}
void readbuf()
{
pCword = cWord; //pointer for cword
//int iRtn = pc.GetString( readSize, &cWord[0] ); //...
int iRtn = pc.GetString( readSize, cWord ); //Serial...
if(strcmp(cWord, ccStart)==0) { // start
doStatus=1;
printf("started\n");
} else if(strcmp(cWord, ccStop)==0) { // stop
doStatus=0;
printf("stopped\n");
} else if(cWord[0]==ccMove_[0]) { // 1st char matches
pCword++; // increment pointer...
iDeg = atoi( pCword );
printf("%d\n",iDeg);
} else { //no action except fo...
printf(" no match %s\n" , cWord);
}
if ((doStatus == 1) && (0 <= iDeg) && (iDeg <= 180)) {
wait(0.01); // waits fo...
myservo.position(iDeg - 83.0);
}
}
int main()
{
pc.baud(9600); //set baud rate
pc.format(8, MySerial::Odd, 1);//set bits for a byte,...
//pc.format(8, MySerial::None, 1);//set bits for a by...
//pc.set_flow_control(MySerial::RTSCTS,dp26,dp25);
pc.SetRxWait(0.01, 0.001); //set wait getting c...
wait(0.25); //startup wait
pc.attach( &atRx, MySerial::RxIrq ); //Set Interru...
NVIC_SetPriority(UART_IRQn, 120);
timer.attach( &atTimer, 0.05 );
NVIC_SetPriority(TIMER_16_0_IRQn, 10);
myservo.calibrate(/* range */ 0.00099, /* angle +/- *...
while(1) {
wait(0.01);
if(cntRx != cntRx_old)
{
readbuf();
cntRx_old = cntRx;
NVIC_EnableIRQ(UART_IRQn);
}
if(timeUp != timeUp_old)
{
if( 10 <= timeUp )
{
led2 = !led2;
timeUp=0;
}
timeUp_old = timeUp;
//NVIC_EnableIRQ(TIMER_16_0_IRQn);
}
}
}
}}
** 実行結果
シリアルコンソールには、定番のTeraTermではなく、「[[RS232...
下図のように、コマンドを送ると帰ってきたアンサーが表示さ...
|&ref(Comm_0.jpg,mw:480,mh:360);|
** 総括
mbed、おもしろいです。 C/C++の入門にもなるし、ハード回...
次回は、オフラインでのコンパイルとデバグ環境にチャレン...
[[inc/mbed]]
ページ名:
ぺージ情報
ぺージ名 :
inc/mbed/20140629
ページ別名 :
未設定
ページ作成 :
なーお
閲覧可
グループ :
すべての訪問者
ユーザー :
すべての訪問者
編集可
グループ :
なし
ユーザー :
なし
Counter: 0, today: 0, yesterday: 0
Go Page Top
Powered by
XOOPS Cube
2.2 © 2001-2012
XOOPS Cube Project
, theme design by
BCOOL
ログイン
ユーザ名:
パスワード:
IDとパスワードを記憶
パスワード紛失
新規登録
メインメニュー
ホーム
なーお'nぶろぐ
フォーラム
なーお'n研究室
xpwiki
最新ページ一覧
全ページ一覧
ヘルプ
新着情報
マイアルバム
ラン記録
大会リスト
シューズリスト
画像マネージャ
マイフレンド
WEBリンク集