Монтаж устройства. Проверка и запуск устройства
Электроника
“
Смарт-часы готовы к работе! Давайте добавим несколько завершающих штрихов и проверим функционал собранного нами устройства
Глоссарий
Для успешного освоения материала рекомендуем вам изучить следующие понятия:
Прерывание
сигнал от программного или аппаратного обеспечения, сообщающий процессору о наступлении какого-либо события, требующего немедленного внимания. Прерывание извещает процессор о наступлении высокоприоритетного события, требующего прерывания текущего кода, выполняемого процессором. Процессор отвечает приостановкой своей текущей активности, сохраняя свое состояние и выполняя функцию, называемую обработчиком прерывания (или программой обработки прерывания), которая реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код
Сервопривод или следящий привод
механический привод с автоматической коррекцией состояния через внутреннюю отрицательную обратную связь, в соответствии с параметрами, заданными извне
Видеолекция
Конспект
Как расширить функционал часов? Разберем необходимые этапы, а именно:
- уменьшение расхода батарейки
- добавление IMU сенсора
Работа в проекте
1. Открываем проект с настройкой смарт-часов
2. Заходим в настройки микроконтроллера. Для уменьшения потребления тока микроконтроллером зайдем в утилиту и посмотрим различные режимы:
2. Заходим в настройки микроконтроллера. Для уменьшения потребления тока микроконтроллером зайдем в утилиту и посмотрим различные режимы:
- в обычном активном режиме потребление около 50 мА
- при отсутствии взаимодействия с пользователем можно снизить потребление, отключив модули взаимодействия
Важно
Для экономии энергии в «спящем режиме» уменьшаем частоты
3. Для выхода из неактивного режима необходимо задать «пробуждение»:
- по нажатию энкодера
- по изменению положения в пространстве
Важно
Чтобы пробуждать часы по изменению положения, необходимо постоянно это положение считывать. Настроим микроконтроллер периодически «пробуждаться», считывать положение и, если оно входит в нужный диапазон, то включать все модули
Реализация
1. Процессор в «спящем режиме» отключает все тактирующие цепи. Будут работать только низкочастотные модули (таймер часов реального времени, внешние кварцевые генераторы, внутренний блок низкой частоты 32 кГц)
2. Процессор в «спящем режиме» может реагировать на внешние события, например, изменение состояния интерфейса или цифровых входов
3. Энкодер в данном случае будет являться цифровым входом и при нажатии пробуждать процессор:
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. Для взаимодействия с часами поднимаем их на уровень взгляда
2. Прошиваем устройства
3. После 2 мин ожидания часы уходят в спящий режим
4. Для взаимодействия с часами поднимаем их на уровень взгляда
“
Итак, мы расширили функционал часов. Теперь перед нами работающие, удобное устройство. Перейдем к заданиям.
Интерактивное задание
Тест
Для закрепления полученных знаний пройдите тест
Стартуем! |
Что не относится к низкочастотным модулям?
Дальше |
Проверить |
Узнать результат |
Как произвести расчет при настройке пробуждения?
Дальше |
Проверить |
Узнать результат |
Когда происходит событие wake?
Дальше |
Проверить |
Узнать результат |
К сожалению, вы ответили неправильно
Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз |
Неплохо!
Но можно лучше. Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз |
Отлично!
Вы отлично справились. Теперь можете ознакомиться с другими компетенциями
Пройти еще раз |