Монтаж устройства. Проверка и запуск устройства

Электроника

Смарт-часы готовы к работе! Давайте добавим несколько завершающих штрихов и проверим функционал собранного нами устройства
Глоссарий
Для успешного освоения материала рекомендуем вам изучить следующие понятия:
Прерывание
сигнал от программного или аппаратного обеспечения, сообщающий процессору о наступлении какого-либо события, требующего немедленного внимания. Прерывание извещает процессор о наступлении высокоприоритетного события, требующего прерывания текущего кода, выполняемого процессором. Процессор отвечает приостановкой своей текущей активности, сохраняя свое состояние и выполняя функцию, называемую обработчиком прерывания (или программой обработки прерывания), которая реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код
Сервопривод или следящий привод
механический привод с автоматической коррекцией состояния через внутреннюю отрицательную обратную связь, в соответствии с параметрами, заданными извне
Видеолекция
Конспект
Как расширить функционал часов? Разберем необходимые этапы, а именно:
  • уменьшение расхода батарейки
  • добавление IMU сенсора

Работа в проекте
1. Открываем проект с настройкой смарт-часов

2. Заходим в настройки микроконтроллера. Для уменьшения потребления тока микроконтроллером зайдем в утилиту и посмотрим различные режимы:
  • в обычном активном режиме потребление около 50 мА
  • при отсутствии взаимодействия с пользователем можно снизить потребление, отключив модули взаимодействия
Важно
Для экономии энергии в «спящем режиме» уменьшаем частоты
3. Для выхода из неактивного режима необходимо задать «пробуждение»:
  • по нажатию энкодера
  • по изменению положения в пространстве
Важно
Чтобы пробуждать часы по изменению положения, необходимо постоянно это положение считывать. Настроим микроконтроллер периодически «пробуждаться», считывать положение и, если оно входит в нужный диапазон, то включать все модули
Реализация
1. Процессор в «спящем режиме» отключает все тактирующие цепи. Будут работать только низкочастотные модули (таймер часов реального времени, внешние кварцевые генераторы, внутренний блок низкой частоты 32 кГц)

2. Процессор в «спящем режиме» может реагировать на внешние события, например, изменение состояния интерфейса или цифровых входов

3. Энкодер в данном случае будет являться цифровым входом и при нажатии пробуждать процессор:
  • определяем лапку, относящуюся с энкодеру, как GPIO EXIT 2
  • заходим в настройки и дополнительно устанавливаемь для лапки pull_up
  • указываем спад напряжения при нажатии кнопки

4.
Настраиваем таймер:
  • таймер часов реального времени имеет систему пробуждения
  • настраиваем пробуждение (32 кГц делится на 16 и на 2000, чтобы получалась 1)
Важно
Необходимо указать, что пробуждение будет формировать прерывание на внутренней ножке line 20
Настройки кода
1. В main для запуска будильника нашего процессора пишем вызов
HAL_NVIC_DisableIRQ(EXTI2_IRQn); //запрещаем прерывания от кнопки энкодера
  btn_try_push_int=0;

  HAL_TIM_Base_Start_IT(&htim1);
  HAL_TIM_Base_Start_IT(&htim2);

  HAL_LPTIM_Encoder_Start(&hlptim1, 0xFFFF);
  LPTIM1->CNT = 0xFFFF/2;
  state_enc_old = HAL_LPTIM_ReadCounter(&hlptim1);

  HAL_ADC_Start_DMA(&hadc1, ADC_buf, 2);

  HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 6000, RTC_WAKEUPCLOCK_RTCCLK_DIV16);


  POWER_BLE(0);

  POWER_OLED(1);

  ssd1331_init();


   accel.Accelerometer_ = Accelerometer_;
   accel.Accelerometer_(ACCEL_ADDRESS_V1, &(accel.LIS331DLH_TWI));

   gyro.Gyroscope_ = Gyroscope_;
   gyro.Gyroscope_(GYRO_ADDRESS_V1, &(gyro.L3G4200D_TWI));


   compass.Compass_ = Compass_;
   compass.Compass_(COMPASS_ADDRESS_V1, &(compass.LIS3MDL_TWI));

   barometer.Barometer_ = Barometer_;
   barometer.Barometer_(BARO_ADDRESS_V1, &(barometer.LPS331));

   accel.LIS331DLH_TWI.begin(&(accel.LIS331DLH_TWI));
   gyro.L3G4200D_TWI.begin(&(gyro.L3G4200D_TWI));
2. Добавляем обработку сенсора и указываем нужный диапазон
int enc_counter=0;

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	  //считывание сенсоров
	  if(to_update_imu==1 || to_update_imu_sleep==1)
	  	{

	  		//считываем IMU

	  		// считываем данные с акселерометра в единицах G
	  		accel.LIS331DLH_TWI.readGXYZ(&ax, &ay, &az, &(accel.LIS331DLH_TWI));
	  		float GX=0, GY=0, GZ=0;

	  		// считываем данные с гироскопа в радианах в секунду
	  		gyro.L3G4200D_TWI.readRadPerSecXYZ(&gx, &gy, &gz, &(gyro.L3G4200D_TWI));

			#define AX_MIN -0.8
			#define AX_MAX -0.4
			#define AY_MIN -0.20
	  		#define AY_MAX 0.20
			#define AZ_MIN -1.0
			#define AZ_MAX -0.50

	  		if( ax > AX_MIN && ax < AX_MAX && ay > AY_MIN && ay < AY_MAX && az > AZ_MIN && az < AZ_MAX )
	  		{// положение "смотрим на часы"
	  			try_sensor_to_active = 1;
	  		}

	  		to_update_imu=0;
	  		to_update_imu_sleep=0;
	  	}

3. Формируем событие «смотрим на часы» при попадании в нужный диапазон

4. Модернизируем режим to sleep:

  • выключаем все модули и процессы
  • разрешаем прерывание от кнопки энкодера
  • разрешаем немедленное чтение сенсора
  • вызываем метод, который практически выключает процессор
POWER_OFF(void)
{
	POWER_OLED(0);
	POWER_BLE(0);

    HAL_TIM_PWM_Stop(&htim5, TIM_CHANNEL_4);
	HAL_GPIO_WritePin(LED_ON_GPIO_Port, LED_ON_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(VIBRO_ON_GPIO_Port, VIBRO_ON_Pin, GPIO_PIN_RESET);

	btn_try_push_int=0;
    HAL_NVIC_EnableIRQ(EXTI2_IRQn); //разрешаем прерывания от кнопки энкодера

    to_update_imu_sleep =1 ; //разрешаем немедленное чтение сенсоров

	//входим в режим низкого потребления
	HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); //пробуждение только от внешних прерываний или wake up
	//HAL_PWR_EnterSTANDBYMode();

	SystemClock_Config(); //восстановление тактирования контроллера


}
5. Создаем дополнительное событие wake, которое будет происходить при выходе из sleep:
  • создаем метод to_wake, в котором будет процесс включения
Завершение процесса и тестирование
1. Компилируем

2. Прошиваем устройства

3. После 2 мин ожидания часы уходят в спящий режим

4. Для взаимодействия с часами поднимаем их на уровень взгляда
Итак, мы расширили функционал часов. Теперь перед нами работающие, удобное устройство. Перейдем к заданиям.
Интерактивное задание
Тест
Для закрепления полученных знаний пройдите тест
Стартуем!
Что не относится к низкочастотным модулям?
Дальше
Проверить
Узнать результат
Как произвести расчет при настройке пробуждения?
Дальше
Проверить
Узнать результат
Когда происходит событие wake?
Дальше
Проверить
Узнать результат
К сожалению, вы ответили неправильно
Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз
Неплохо!
Но можно лучше. Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз
Отлично!
Вы отлично справились. Теперь можете ознакомиться с другими компетенциями
Пройти еще раз