onbmotorsのメモ

onbmotorsのメモ

電子工作とかマイクロマウス関連のメモ書き。

STM32 プッシュスイッチの状態を取得(とりあえず動かす用)

スイッチ回路について

マイクロマウスにいくつかのモードを持たせたいので、モードを切り替える用にプッシュスイッチを用意しています。

スイッチ回路は以下図のようにスイッチが押されているときにhigh、押されていないときはlowになるように作っています。

f:id:nantakosu5656:20201031225231p:plain

ModeSWピンをgpio入力ピンとし、プルダウン設定にすることで動くだろうというシンプルな作りです。

回路をシンプルにした分、ソフト側でチャタリング対策などをおこないます。

今回はとりあえず動かすためのソフトなので今後必要に応じて書き換えていく予定です。 (電源オン後モーターがすぐに動き出さないようにするために、スイッチ入力待機する)

手順

手順①

cubemxでswを接続しているピンの設定をします。

以下図のconfigurationの通りgpio modeをinput mode、pull-downとしておきます。

これでgenerate codeします。

f:id:nantakosu5656:20201031225805p:plain

手順②

ソースコードを書きます。

やることは、スイッチが押されている間、ある変数のカウントを1ずつインクリメントし、閾値を超えたらonと判断します。

スイッチが押されていない間はカウントを1ずつデクリメントします。

 

まずは適当なサイズの変数を宣言して初期化しておきます。

uint16_t sw_count = 0;

 

ここからSWの状態を判定します。

見ての通りですが、sw_countが250を超えたらループ抜けてモーターなどの制御を開始します。

while(sw_count < 250 ){
  if(HAL_GPIO_ReadPin(ModeSW_GPIO_Port,ModeSW_Pin) == 1){
    if(sw_count < 65535){
    sw_count++;
    }
    else{
      //何もしない、オーバーフロー対策
    }
  }
  else{
    if(sw_count > 0){
      sw_count--;
    }
    else{
      //何もしない、オーバーフロー対策
   }
  }
  HAL_Delay(1);//1ms程度のループにするため
}

・補足

今回はSW押されている間highになるため、readpin関数が1(high)のときカウントするようになってます。

1ms程度のループと書きましたが、実際はその他にも命令を実行しているので1ループが1msよりも長いです。時間はあまり正確にやる必要ないので適当です。

今後

今回の内容を少し発展させて、短押しならモード遷移、長押しなら決定みたいなことをやりたいです。

そのほか、割り込みで入力を監視したりもできるみたいですが、自分の機体で使うタイミング来るかは微妙。

あとはソースコードをうまく張り付ける方法があれば知りたいです。