見出し画像

ArduinoとSTM32マイコンをつないでマイコンシステム開発をしてみる その22 ~実装①~

 マイコンシステム開発の要件定義から総合テストまでの工程をたどってみます。
 題材としては、空調管理システムにします。
 機材はいま手元にあるArduino1台とSTM32マイコン1台を使います。

Arduino UNO
STM32

今回から実装に入ります

要件定義から実装する内容を確認します。

システム構成

下記の3つのシステムから構成されています
・気温データ送信ユニット
・アクチュエータ
・空調管理システム

順番に実装していきます。

1.気温データ送信ユニット

  • 気温データ送信ユニットをSTM32マイコンに実装する。STM32マイコンで温度センサを使用する。

  • 気温データ送信ユニットから空調管理システムへは次の2バイトのフォーマットでSPIで送信する。

   unsigned char data[0]  bit7     符号  0:プラス 1:マイナス
                                     bit6~0  整数部 0~127
   unsigned char data[1] bit7~0  小数部  0x00~0x09

 温度センサで取得した数値を摂氏に変換し、float 型で下記の関数 makeSendDate() に渡します。

  void makeSendData(float temperature_celsius){
	  /* データ配列に変換 */
	  int16_t temp_integer = (int16_t)temperature_celsius; // 整数部
	  unsigned char temp_fraction = (unsigned char)((fabs(temperature_celsius - temp_integer)) * 10 + 0.5f); // 小数部(絶対値で計算し四捨五入)

	  /* 符号ビットと整数部を設定 */
	  if (temp_integer < 0) {
	      data[0] = 0x80 | ((-temp_integer) & 0x7F); // 符号ビット(1)と絶対値
	  } else {
	      data[0] = (temp_integer & 0x7F); // 符号ビット(0)と整数部
	  }

	  /* 小数部を設定 */
	  data[1] = (temp_fraction & 0x0F); // 小数部を4ビットで格納
  }

グローバル変数として定義されたunsigned char型の配列 data に符号と整数部は data[0]に、小数部は data[1] に格納しています。

単体テストをおこないます

STM32のシリアルモニタに送信データを出力します

シリアルモニタの出力 

温度センサで取得した気温
  temperature=24.1°C
送信したデータ
  data[0]=0x18 0001 1000   … 符号ビットは0、整数部は24
       data[1]=0x01    0000 0001   … 小数部は1

テストOKです

マイナスの値でもテストします
-10.5の気温を設定して、makeSendData()関数に渡します

 
シリアルモニタの出力 

温度センサで取得した気温
  temperature=-10.5°C
送信したデータ
  data[0]=0x8a 1000 1010   … 符号ビットは1、整数部は10
       data[1]=0x05    0000 0101   … 小数部は5

テストOKです


2.アクチュエーター

  • アクチュエータはSTM32マイコンに実装する。

  • 空調管理システムからアクチュエータへは次のフォーマットで送信される。

  送信データ 0: アクチュエータはLEDを消灯 
  送信データ 1: アクチュエータはLEDを点灯

	/* SPIデータ受信 */
	if (HAL_SPI_Receive(&hspi1, &receivedData, 1, HAL_MAX_DELAY) == HAL_OK) {
	  /* 受信データをシリアルモニタに表示 */
	  snprintf(msgbuf, sizeof(msgbuf), "Received Data: %d\r\n", receivedData);
	  CDC_Transmit_FS((uint8_t *)msgbuf, strlen(msgbuf));

	  /* 受信データに応じてPA15のLEDを制御 */
	  if (receivedData == 0) {
	    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET); // 消灯
	  } else if (receivedData == 1) {
	    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);   // 点灯
	  }
    } else {
	  /* エラー処理 */
      Error_Handler();
    }

アクチュエータの部分は検証実験⑬で実施確認済みです


それでは、次回
空調管理システムの実装にはいります 



いいなと思ったら応援しよう!