メカトロニクス研究部会

エアシリンダーを動かしてみよう

note_add 2025/05/05
update 2025/09/01

いよいよ前回までで作ったプロジェクトで開発していきます。
今回はエアシリンダーを動かします。

ファイル構造について

…とその前に、これから開発していく上でどこに何があるか知っておくと便利です。
ファイル構造について軽く書いておきます。

ファイル構造

赤で囲った部分はCMake関連のファイルです。ライブラリを追加する時には触るかもしれませんが、基本こっちから触ることはありません。
水色で囲った部分はマイコンがプログラムを起動するために必要なヤツです。これも放置。

重要なのはここからで、黄色・緑で囲った部分(特に後者)を主に触っていきます。

黄色の方、Incはヘッダーファイルを入れておきます。(Includeの略だろうけど一般的にはincludeが使われるので何故Incなのか謎)
緑の方、Srcはソースファイルを入れておきます。(Source codeの略なんだけど一般的には小文字スタートのsrcが使われるのでなんとも)

ヘッダー・ソースの違いはコラム:ヘッダーとソースの違いを参照。

その他にもCubeMXでやった設定内容が入ったIOCファイル、ライブラリが入ったDriversディレクトリがありますが、触ることはありません。

エアシリンダーを動かそう!

いよいよ本題のエアシリンダーです。

エアシリンダーと電磁弁の大まかな動作の流れ

エアシリンダー(図中央)は電磁弁(図左・右)によって制御されます。
電磁弁は赤で示した弁を電気で動かす事で、タンクの圧縮空気を送ったり、外に向かって開放したりします。
制御は単純で、信号のON/OFFで弁を切り替えます。ダントツで一番楽です。

STM32のHAL環境においてGPIOから出力する時はHAL_GPIO_WritePinHAL_GPIO_TogglePinを使います。
Writeというのは、信号のON/OFFを「ONという状態をピンに書き込む」「OFFという状態をピンに書き込む」と捉えているんですね。
一方Toggleは読んで字の如くON/OFFを切り替えます。

引数は両者とも2つ目までは共通で「どのピンに出力するか」をまず渡してやります。
Writeの方だけONなのかOFFなのかを渡してやります。Toggleは中に持ってるんで要らんという事です。

例としてはこう。

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);   // PA5(GPIOAの5番ピン)にSET(ON)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // PA5(同上)にRESET(OFF)
//                GPIO?  GPIO_PIN_?  GPIO_PIN_(RE)SET
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);                // PA5(同上)をON/OFF切り替え

ON/OFFとはそのまま書かずそれぞれSET/RESETと言ってますね。
これは内部的には「ONであるか」というフラグで見ているので、そこに1をセットすんのか(0で)リセットすんのか、という風に捉えてるわけですね。

ちなみに、CubeMXでピンに名前を付けることができますが、例えば今回のは何もしてなければ「LD2」と言うピンがあるはずなのでこれを例に取ると、

HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
//                ???_GPIO_Port  ???_Pin

のように書けます。便利。
なおこのピンはNUCLEO-F446REの基板表面のLEDに繋がっていてデフォルトで出力モードとなってます。折角なのでコレ使います。

お手元のmain.cを開いて下さい。そんで、/* USER CODE BEGIN 3 */の下にカーソルを移動して頂戴。
(めんdので以降は/* USER CODE BEGIN なんとか *//* USER CODE END なんとか */の間はUSER CODE なんとかって呼ぶっす)

  // (略)

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while(1) {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    // >>>>> こ↑こ↓ <<<<<
  }
  /* USER CODE END 3 */
}

// (略)

で、ここにON/OFFのコードをぶち込めばON/OFFしてくれるわけです。
が、このままだともれなく秒間1億回弱ぐらいの速度でON/OFFされちゃいます。これでは、いけませんね。
なので、ちゃんと待ってあげましょう。

STM32のHAL環境において待ってあげる時はHAL_Delayを使ってやります。

HAL_Delay(1000);
//            ms

この例は1秒待ちます。組み込み開発では大体時間の基本単位がミリ秒な気がします。まぁ丁度いいし妥当。[要出典]

まぁ1秒でも良いんですが0.5秒の方が絵面が面白いなんとなく分かりやすそう[要検証]なので0.5秒でやります。
要するに500ミリ秒ですね。

なのでUSER CODE 3の中身は、

HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
HAL_Delay(500);

といった所でしょうかね。ON/OFFを明示的に行うなら、

HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
HAL_Delay(500);

みたいに書けばよき。

基板にぶち込んでみよう!

プログラム出来たんで基板にぶち込みませう。

(TODO:実行ボタン押してる画像)

上にある実行ボタン(多分①とかになるはず)を押すと勝手にビルドした後、
OpenOCDが起動して書き込みまでやってくれます。楽。

これだけ。

次回予告

今回はエアシリンダーを動かしました。ただのON/OFFという所で気付いたかもしれませんが、実は全く同じ方法でLEDも光らせたり出来ます。
次回は足回りの肝、モーターを動かします。

前へ次へ

ロボット制御入門Topへ