カンサットで無線通信をするためのサンプルプログラム。加速度センサの値とステータスピンの情報をシリアル通信で出力し、TOCOSを使って無線送信する。

Dependencies:   mbed

Committer:
hardtail
Date:
Sat Jul 05 12:03:29 2014 +0000
Revision:
0:aa80dc78d8bc
Child:
1:4a1cf62c486c
??????????????????????????????????????????????TOCOS????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hardtail 0:aa80dc78d8bc 1 /******************************************************************************
hardtail 0:aa80dc78d8bc 2 * @file: main.c
hardtail 0:aa80dc78d8bc 3 * @date: 5. jul. 2014
hardtail 0:aa80dc78d8bc 4 * @author: Matsuzawa Takaaki
hardtail 0:aa80dc78d8bc 5 *----------------------------------------------------------------------------
hardtail 0:aa80dc78d8bc 6 *
hardtail 0:aa80dc78d8bc 7 * mbedとTOCOS-Lite Dipモジュールを使った通信のサンプルプログラム。6つのアナログ入力(加速度センサ)と
hardtail 0:aa80dc78d8bc 8 * 4つのデジタル入力(ステータス情報)を無線で10msごと(100Hz)にTOOCOStickに送信する。
hardtail 0:aa80dc78d8bc 9 *
hardtail 0:aa80dc78d8bc 10 ******************************************************************************/
hardtail 0:aa80dc78d8bc 11 #include "mbed.h"
hardtail 0:aa80dc78d8bc 12
hardtail 0:aa80dc78d8bc 13 Ticker WirelessEngine; //タイマー割り込みの宣言
hardtail 0:aa80dc78d8bc 14
hardtail 0:aa80dc78d8bc 15 /***加速度センサをアナログ入力に接続***/
hardtail 0:aa80dc78d8bc 16 /*加速度センサA*/
hardtail 0:aa80dc78d8bc 17 AnalogIn Accel_Ax(p15); //加速度センサAのX軸
hardtail 0:aa80dc78d8bc 18 AnalogIn Accel_Ay(p16); //加速度センサAのY軸
hardtail 0:aa80dc78d8bc 19 AnalogIn Accel_Az(p17); //加速度センサAのZ軸
hardtail 0:aa80dc78d8bc 20 /*加速度センサB*/
hardtail 0:aa80dc78d8bc 21 AnalogIn Accel_Bx(p18); //加速度センサBのX軸
hardtail 0:aa80dc78d8bc 22 AnalogIn Accel_By(p19); //加速度センサBのY軸
hardtail 0:aa80dc78d8bc 23 AnalogIn Accel_Bz(p20); //加速度センサBのZ軸
hardtail 0:aa80dc78d8bc 24 /******************************/
hardtail 0:aa80dc78d8bc 25 /***ステータスピンの設定(初期時は全てLOW(0)とする)***/
hardtail 0:aa80dc78d8bc 26 DigitalIn FlightPin(p9); //フライトピン
hardtail 0:aa80dc78d8bc 27 DigitalIn MoveServo(p10); //開放用サーボ
hardtail 0:aa80dc78d8bc 28 DigitalIn GachaSAT1(p11); //ガチャサット1放出
hardtail 0:aa80dc78d8bc 29 DigitalIn GachaSAT2(p12); //ガチャサット2放出
hardtail 0:aa80dc78d8bc 30 /******************************/
hardtail 0:aa80dc78d8bc 31 DigitalOut myled(LED1); //LED設定
hardtail 0:aa80dc78d8bc 32
hardtail 0:aa80dc78d8bc 33 Serial TOCOS(p13,p14); //TOCOSに繋がっているシリアルピンを設定
hardtail 0:aa80dc78d8bc 34 /*
hardtail 0:aa80dc78d8bc 35 * TOCOS ========= mbed
hardtail 0:aa80dc78d8bc 36 * RX(p3) <===> TX(p13)
hardtail 0:aa80dc78d8bc 37 * TX(p10) <===> TX(p14)
hardtail 0:aa80dc78d8bc 38 */
hardtail 0:aa80dc78d8bc 39
hardtail 0:aa80dc78d8bc 40 int i=0;
hardtail 0:aa80dc78d8bc 41
hardtail 0:aa80dc78d8bc 42 int ReadStatus(){
hardtail 0:aa80dc78d8bc 43 /*
hardtail 0:aa80dc78d8bc 44 * 4本のステータスピンの情報を統合して1つの数値にして返す(ビットフラグで2進数表現)
hardtail 0:aa80dc78d8bc 45 * 本来、「フライトピンが抜けていないのににサーボが動作する」などの状態はありえないが、万が一の場合に備え、
hardtail 0:aa80dc78d8bc 46 * 全ての状態を表せるようにこのような表現方法をとっている。
hardtail 0:aa80dc78d8bc 47 *
hardtail 0:aa80dc78d8bc 48 * EX.
hardtail 0:aa80dc78d8bc 49 * <<状態>> <<戻り値>>
hardtail 0:aa80dc78d8bc 50 * 初期値(全てLOW)  =>  0
hardtail 0:aa80dc78d8bc 51 * フライトピン 信号HIGH =>  1
hardtail 0:aa80dc78d8bc 52 * フライトピン & サーボ動作 信号HIGH => 3
hardtail 0:aa80dc78d8bc 53 * ...
hardtail 0:aa80dc78d8bc 54 * 最終状態(全てHIGH) => 16
hardtail 0:aa80dc78d8bc 55 *
hardtail 0:aa80dc78d8bc 56 * ガチャサット1 | 0 1 1 0
hardtail 0:aa80dc78d8bc 57 * ガチャサット2 | 0 0 1 1
hardtail 0:aa80dc78d8bc 58 * ------------------------+-----------------
hardtail 0:aa80dc78d8bc 59 * サーボ動作ピン | フライトピン |
hardtail 0:aa80dc78d8bc 60 * ------------+-----------+-----------------
hardtail 0:aa80dc78d8bc 61 * 0 | 0 | 0 4 12 8
hardtail 0:aa80dc78d8bc 62 * 0 | 1 | 1 5 13 9
hardtail 0:aa80dc78d8bc 63 * 1 | 1 | 3 7 16 11
hardtail 0:aa80dc78d8bc 64 * 1 | 0 | 2 6 14 10
hardtail 0:aa80dc78d8bc 65 *
hardtail 0:aa80dc78d8bc 66 */
hardtail 0:aa80dc78d8bc 67 return (GachaSAT2<<3|GachaSAT1<<2|MoveServo<<1|FlightPin);
hardtail 0:aa80dc78d8bc 68 }
hardtail 0:aa80dc78d8bc 69
hardtail 0:aa80dc78d8bc 70 void sendVal(){
hardtail 0:aa80dc78d8bc 71 /*
hardtail 0:aa80dc78d8bc 72 * アナログピンの値をp15~p20の順にカンマ区切りで、最後にステータス情報と改行を送信
hardtail 0:aa80dc78d8bc 73 */
hardtail 0:aa80dc78d8bc 74 int status = ReadStatus(); //ステータスピンの情報を読み取る
hardtail 0:aa80dc78d8bc 75
hardtail 0:aa80dc78d8bc 76 TOCOS.printf("%d,%d,%d,%d,%d,%d,%d\n"
hardtail 0:aa80dc78d8bc 77 ,Accel_Ax.read_u16(),Accel_Ay.read_u16(),Accel_Az.read_u16()//加速度A(X,Y,Z)
hardtail 0:aa80dc78d8bc 78 ,Accel_Bx.read_u16(),Accel_By.read_u16(),Accel_Bz.read_u16()//加速度B(X,Y,Z)
hardtail 0:aa80dc78d8bc 79 ,status); //ステータス 1~16の数値
hardtail 0:aa80dc78d8bc 80 }
hardtail 0:aa80dc78d8bc 81
hardtail 0:aa80dc78d8bc 82 int main() {
hardtail 0:aa80dc78d8bc 83 TOCOS.baud(115200); //TOCOSに繋がっているシリアルのボーレートを115200bpsに設定
hardtail 0:aa80dc78d8bc 84
hardtail 0:aa80dc78d8bc 85 /*
hardtail 0:aa80dc78d8bc 86 * 0.01秒(10ms)ごとにセンサ値を取得し、TOCOSで送信する用割り込みを設定
hardtail 0:aa80dc78d8bc 87 * この割り込みが通信関係の処理を一定時間ごとに行ってくれるので、メインループ
hardtail 0:aa80dc78d8bc 88 * (while内)では別の処理を行なうことができる。
hardtail 0:aa80dc78d8bc 89 */
hardtail 0:aa80dc78d8bc 90 WirelessEngine.attach(&sendVal, 0.01);
hardtail 0:aa80dc78d8bc 91
hardtail 0:aa80dc78d8bc 92 while(1) {
hardtail 0:aa80dc78d8bc 93 /*
hardtail 0:aa80dc78d8bc 94 * メインループ
hardtail 0:aa80dc78d8bc 95 * 無線通信は割り込みで一定時間ごとに実行されるので、時間の正確さを必要としない
hardtail 0:aa80dc78d8bc 96 * 処理はこのループ内に記述する。サンプルでは動作確認のため約0.2秒ごとにLED1を
hardtail 0:aa80dc78d8bc 97 * 点滅させている。
hardtail 0:aa80dc78d8bc 98 */
hardtail 0:aa80dc78d8bc 99
hardtail 0:aa80dc78d8bc 100 myled = 1;
hardtail 0:aa80dc78d8bc 101 wait(0.2);
hardtail 0:aa80dc78d8bc 102 myled = 0;
hardtail 0:aa80dc78d8bc 103 wait(0.2);
hardtail 0:aa80dc78d8bc 104 }
hardtail 0:aa80dc78d8bc 105 }