読者です 読者をやめる 読者になる 読者になる

<!--親の顔より見た光景-->

日々の発見を残していきます。

Arduinoに書き込めなくなったら

1.回路を確認(ショートしてないか)
2.ターゲットのボードを確認
f:id:akagi13213:20170425231911p:plain

今回はIDEのショートカットキーでArduino UnoからArduino Mega ADKになっていた。

【Arduino】タクトスイッチでLED輝度を変更

こんな回路。
f:id:akagi13213:20170423160244j:plain

LEDはアナログ入力ピンで繋がってる。

こんな状態にする。
f:id:akagi13213:20170423160719p:plain

ソースコード led_change.ino】

#define STATUS_ELEMENT ( 3 )
void setup()
{
  pinMode( 1, INPUT );
  pinMode( 9, OUTPUT );
  pinMode( 10, OUTPUT );
  pinMode( 11, OUTPUT );
}
void loop()
{
  int switch_status = 0;  // スイッチの状態
  int i = 0;
  int j = 0;
  int analog_value = 0;  // LED輝度値
  for ( ;; ) {
    delay( 400 ); // チャタリング防止
    if ( digitalRead( 1 ) == LOW ) {
      switch_status++;
      if ( switch_status > STATUS_ELEMENT ) {
        switch_status = 0;
      }
      // スイッチがONになるまで待機
      while ( digitalRead( 1 ) == LOW ) {
        ;
      }
    }
    switch ( switch_status ) {
      case 0:  // 状態1
        analog_value = 0; break;
      case 1:  // 状態2
        analog_value = 50; break;
      case 2:  // 状態3
        analog_value = 100; break;
      case 3:  // 状態4
        analog_value = 150; break;
      default:
        analog_value = 0; break;
    }
    // 9番ピンから11番ピンに指定した電圧を入力
    for ( j = 9; j <= 11; j++ ) {
      analogWrite( j, analog_value );
    }
  }
}

Cdsセルの回路

f:id:akagi13213:20170419001245p:plain
こんな回路。
Cdsセルは光量に応じて抵抗値が変化する素子。(暗いほど抵抗値が下がる)
マイコンに入力する電圧を可変にしたいため、分圧する必要がある。
・分圧のためにわざわざもう一つ抵抗が必要。Cdsだけだと5[V]しか選択肢が無い(?)

 Cdsの抵抗値が50kΩのとき、V2は分圧即により、
 V2 = ( 50k / ( 10k + 50k ) ) * 入力電圧( 5V ) = 25 / 6 = 4.166[V]
 マイコンには4.166[V]が入力される。

【メモ】プレゼン技法

最も重要なこと:聴衆に応じた内容のプレゼンをする

例:聴衆がエンジニアだらけ……次世代技術や既存技術の話題を取り入れる

老人にIoTの話をしてもしょうがない。若い世代が多かったらゲームやスマホ関係などが好ましい。

 

他、重要なこと(上から重要度高)

・大きい声でハキハキと

・自身を持つ

・結論→論拠(裏付けるデータなど)→結論

・場合によっては、問題を羅列→対策法

・大きいジャンル分け→箇条書きについて言及(○○視点からのリスクは……、一方**視点からのリスクは……が挙げられます)

・具体的なエピソード、具体例を挙げると聴衆は理解し易い

・心をつかむキーワード(例:「最終決算」、「人生のパートナー」 エンジニアに向けたプレゼンで実際にウケたのは「ニーズを創る」というキーワード。とっさに出るものではないので日々書き留めておくと良い。)

・字、図はキレイに

・適度にカラフルにする(4色?)

・アテンションゲッター(聴衆の心をつかむような言い回し、テンポ)

・最後に「ありがとうございました」

 

一般的にプレゼンの質はDelivery<Contentsで決まる。しかし、第一印象でプレゼンを聞くか聞かないか決まる(こともある)ので、自身をもって、大きい声でハキハキと喋るのは重要。

【宣伝】マインスイーパのAndroidアプリが完成

このブログは自分のメモ用だけど、ユーザーが欲しいので宣伝…

表題の通りマインスイーパアプリが完成しました。
特殊なルールは無く、本当にシンプルなマインスイーパになっています。
是非プレイしてみてください。
↓ダウンロードはこちらから↓
play.google.com

スクリーンショット
f:id:akagi13213:20170324165807p:plain

【C】constのメモ

1. const int *p;

「値を変更できないint」を指すポインタ。アドレス書き換えられるけど、アドレスが指す中身変更できない
【例】

const int *p;
int *temp;

p = temp;    // OK
*p = 5;      // エラー
2. int * const p;

int型への「const修飾された」ポインタ(int *p; は int型へのポインタ)。アドレスが指す中身書き換えられるけど、アドレスそのものは変更できない
【例】

int * const p;
int *temp;

p = temp;    // エラー
*p = 5;      // OK
3. const int * const p;

「値を変更できないint」への「値が変更できないポインタ」。アドレスの中身変更できないアドレス変更できない
【例】

const int * const p;
int *temp;

p = temp;    // エラー
*p = 5;      // エラー

【Android】onLongPressを使わないで長押し判定

背景

View上で長押しを判定したい時、通常はGestureDetectorクラスのOnGestureListenerをimplementsしてonLongPressを実装する。
GestureDetector | Android Developers

参考サイト
Androidプログラミングの館
Android タッチパネルのダブルタップや長押しを検出する方法 | TechBooster

しかしonLongPressは長押し判定の時間を指定できない。

今作ってるマインスイーパアプリでは長押しでフラグを立てる処理にしている。
onLongPressで長押し判定を実装すると、0.8秒程度押し続けないとならない。
0.8秒という時間は長く、ユーザーはスピーディーにフラグを立てることができなくてイライラしてしまう。

解決策

onTouchEventで取得できるMotionEvent.ACTION_DOWNとHandlerクラスを使う。

onTouchEventはViewクラスで画面がタッチされたときに呼び出されるメソッド。
詳しくはこちら
Androidでアプリ画面のタッチイベントを取得する方法 | TechBooster

Handlerクラスは「指定した時間後に処理を行いたい」という時に使い、処理の中身はRunnableクラスのrun()メソッドで実装する。
詳しくはこちら
[Android]指定した時間後にちょっとした処理を行う方法 | Developers.IO

結局長押し判定はこんなコードになる。convertCoordinateToAddress()は現在の座標からマス番号を求めるメソッド。
とりあえずACTION_DOWNが検出されたらhandlerを起動して、0.4秒後にrunメソッドを実行する。
0.4秒を測ってる間に指上げなどの邪魔が入ったらhandlerを中止する。

参考サイト
java - Detecting a long press with Android - Stack Overflow

【MainActivity.java

/*略*/
long LONG_PRESS_TIME = 400;    // 長押し時間(ミリ秒)
Handler long_press_handler = new Handler();
Runnable long_press_receiver = new Runnable() {
    @Override
    public void run()
    {
        // 長押しする
        longClickSquare();
    }
};

/*略*/
@Override
public boolean onTouchEvent( MotionEvent e )
{
    switch ( e.getAction() )
    {
        case MotionEvent.ACTION_DOWN:    // 指が触れたとき
            action_down_square_address = game_view.convertCoordinateToAddress(e.getX(), e.getY());       // 触れたマス番号を記憶
            long_press_handler.postDelayed( long_press_receiver, LONG_PRESS_TIME);       // 長押し判定
            break;

        case MotionEvent.ACTION_UP:     // 指を上げたとき
            long_press_handler.removeCallbacks( long_press_receiver );    // 長押し中に指を上げたらhandlerの処理を中止
            break;

        case MotionEvent.ACTION_MOVE :    // 指でなぞったとき
            // 触れたマスが最初に触れていたマスと違う番号なら
            if ( game_view.convertCoordinateToAddress(e.getX(), e.getY()) != action_down_square_address ) {
                long_press_handler.removeCallbacks( long_press_receiver );    // 最初に触れたマスから離れたらhandlerの処理を中止
            }
            break;

        default:
            break;
        }
        return false;
    }
}

/*略*/