NPO TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介(15)第六回(2016)アプリケーション開発部門R2CAクラス 金賞  歩きスマホ用障害物検知 山内健司（東京都市大学計算機ソフトウェア研究室）共同作業者：小畑太治郎，市村歩

TOPPERS「活用アイデア」・「アプリケーション開発」コンテスト
は、2011年から毎年実施されています。
https://www.toppers.jp/contest.html

「アプケーション開発」は、ソースコードの公開を前提としています。
「活用アイデア」でも、その後実現したソースコードなどもある。探しながら紹介。

なお、この記事は、TOPPERSプロジェクトの公式見解ではなく、
小川清　の　技術者個人の考えに基づいています。

# 目的(purpose)
TOPPERS開発アイデア・アプリケーション開発コンテスト受賞作品には、良質な算譜、技術的に崇高な志向、目的を達成するための意思などが感じられる。広く、source codeを表示して紹介し、次の応募作品を促す。
# 成果(outcome)
応募作品の算譜を眺めると、その技術者の得意分野や技法を感じることができる。応募作品のソースコードを使ってみようという気になる。ソースコードを一度コンパイルしたくなる。自分も良い作品を作ろうという気になる。

# TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介(14)第六回(2016)アプリケーション開発部門 R2CAクラス 金賞 
## 歩きスマホ用障害物検知
山内健司（東京都市大学計算機ソフトウェア研究室）共同作業者：小畑太治郎，市村歩
##応募資料(application material)等

 コンテスト応募資料 
https://www.toppers.jp/docs/contest/2016/歩きスマホ用障害物検知.pdf

### Download
ソースコード 
https://www.toppers.jp/docs/contest/2016/src_歩きスマホ用障害物検知.zip

#関連資料(related URL)
# 算譜(source code)

```C++:rca_app.cpp
#include "rca.h"

#define echoPin 5 // Echo Pin(超音波センサー?)
#define trigPin 6 // Trigger Pin(超音波センサー?)


#define TOUCH_PIN 3
#define LED_PIN  4


double Distance = 0; //障害物との距離(cm)
double Threshold_1 = 30; //通知閾値(cm)
double Threshold_2 = 80; //通知閾値(cm)

int LEDstate = LOW; //LEDを点滅させるときに使う.
bool alert = false; //通知判定用共有変数.task2が書き込み,task3が読み込む.

int SoundState = 0;
/*
 *  メインタスクの設定.
 *  デバッグ出力させるなら,シリアルポートは115200にしておくこと.
 */ 
void setup() {
    Serial.begin(115200);//デバッグ出力しないならコメントアウトでよろし
    delay(1);        
}

//メインタスク
void loop() {
    delay(1000);
}

/*
 *  タスク1の設定.
 *  超音波センサーの初期化を行う.
 */
void task1_setup() {
	pinMode(echoPin, INPUT);
	pinMode(trigPin, OUTPUT);
}

/*
 *  タスク1.
 *  超音波センサーによる測距を行う.
 *  測距の結果はcm単位でDistance変数に格納される.
 */
void task1_loop() {
	//ここから測定本体
	double Duration = 0; //超音波を受信した間隔
	digitalWrite(trigPin, LOW);
	delayMicroseconds(2);
	digitalWrite(trigPin, HIGH); //超音波を出力
	delayMicroseconds(10);
	digitalWrite(trigPin, LOW);
	Duration = pulseIn(echoPin, HIGH); //センサからの入力
	//ここまで測定本体
	//ここからDistance算出
	if (Duration > 0) {
		Duration = Duration / 2; //往復距離を半分にする
		Distance = Duration * 340 * 100 / 1000000; // 音速を340m/sに設定
		//Serial.println(Distance); //デバッグ出力をオフにするなら不要.
	}
	//ここまでDistance算出
	delay(10);
}


int tonewaiter1 = 0;
int tonewaiter2 = 0;
void task2_setup() {}
void task2_loop() {
	if (SoundState != 0) {
		if (Threshold_1 >= Distance) {
			tonewaiter2 = 0;
			if (tonewaiter1 == 25) {
				tone(12, 4000, 50);
				tonewaiter1 = 0;
			}
			tonewaiter1++;
		}
		else if (Threshold_2 >= Distance) {
			tonewaiter1 = 0;
			if (tonewaiter2 == 50) {
				tone(12, 4000, 50);
				tonewaiter2 = 0;
			}tonewaiter2++;

		}
	}
	
	delay(10);
}

int PreTouchValue = 0;
int TouchState = 0;


void task3_setup() {
	
	pinMode(TOUCH_PIN, INPUT_PULLUP);
	pinMode(LED_PIN, OUTPUT);
	digitalWrite(LED_PIN, LOW);
	
}  
void task3_loop() {
	int TouchValue = digitalRead(TOUCH_PIN);

	if ((PreTouchValue == 0) && (TouchValue == 1) && (TouchState = 0)) {
		TouchState = 1;
	}

	if ((PreTouchValue == 1) && (TouchValue == 0) && (TouchState = 1)) {
		TouchState = 0;
		if (SoundState == 0) {
			SoundState = 1;
			Threshold_1 = 30; //近いほうの通知閾値を30(cm)に設定
			digitalWrite(LED_PIN, HIGH);
			tone(12, 4000, 50);
			delay(30);
			tone(12, 4000, 50);
			digitalWrite(LED_PIN, LOW);
		}
		else if(SoundState == 1) {
			SoundState = 2;
			Threshold_1 = 50; //近いほうの通知閾値50(cm)に設定
			digitalWrite(LED_PIN, HIGH);
			tone(12, 6000, 100);
			delay(30);
			digitalWrite(LED_PIN, LOW);
		}
		else {
			SoundState = 0;
			digitalWrite(LED_PIN, HIGH);
			tone(12, 4000, 200);
			delay(20);
			digitalWrite(LED_PIN, LOW);
		}
	}
	PreTouchValue = TouchValue;
	
	delay(10);
}
	


```
source

# 参考資料(reference)
「TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介」まとめ
https://qiita.com/kaizen_nagoya/items/72b882d96b2841f25faf

TOPPERS活用アイデア・アプリケーション開発コンテストを振り返る
https://researchmap.jp/joxkbxlck-1778110/
「応募すると何が嬉しい」TOPPERS活用アイデア・ アプリケーション開発コンテスト
https://www.slideshare.net/kaizenjapan/ss-78528931

「TOPPERS活用アイデア・アプリケーション開発コンテスト」への道
https://researchmap.jp/jovr40j3b-1778110/?block_id=1778110&active_action=journal_view_main_detail&post_id=38687&comment_flag=1

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
### 文書履歴(document history)
ver. 0.10 初稿 20180624
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.