Модификация новогоднего декоративного светильника с помощью микроконтроллера STM8L

Под новый год на торговых площадках и магазинах выбрасывается в продажу куча примитивных сувенирных светильников с питанием на литиевых батарейках-таблетках типа CR2032. Внутри находится светодиод, который либо имитирует мерцание свечи, либо хаотично меняет цвет. Такой светильник включается, кладется куда-нибудь под елку и благополучно забывается. Устав менять батарейки, я решил сделать для него режим энергосбережения и, заодно, поупражнять мозги, пощупав низко потребляющую серию микроконтроллеров STM8L10х.


Вообще, линейка STM8L почему-то незаслуженно забыта в плане всяких отладочных плат. Если вбить в поиске какую-нибудь «stm8s003f3 board» или «stm8s103f3 board», то выйдет куча вариантов. Ну да ладно, будем городить свою плату с диодами и датчиками.

В качестве «мозга» был выбран МК STM8L101F3P6. Благодаря низкому напряжению питания 1,65-3,6 вольт он отлично покрывает возможности литиевой батарейки и не требует дополнительных вмешательств по согласованию напряжений. А встроенной памяти в 8 кбайт хватит для реализации любого хитро выдуманного алгоритма. Так как в L серии полноценные загрузчики через последовательный интерфейс имеют только STM8L151xx и STM8L152xx, для прошивки потребуется программатор ST-Link с поддержкой SWIM. Я же воспользовался имеющейся у меня отладочной платой STM8L-Discovery.

Список компонентов

Микроконтроллер STM8L101F3P6 в корпусе TSSOP20 (10 шт./лот) ($7.14)


Переходник с TSSOP20 на DIP20 в качестве макетной платы (10 шт.) ($0.93)


3 мм светодиоды различных цветов (100 шт./лот) ($1.06)


Датчик вибрации HDX-2 SW-420 (10 шт./лот) ($0.49)


Еще опционально керамический конденсатор на 0,1 мкф параллельно питанию МК.

Схема и алгоритм работы




Светодиод подключается к выходу канала 1 таймера TIM2 для использования ШИМ-модуляции. Токоограничивающий резистор отсутствует, так как максимальное значение ШИМ подобрано таким образом, что бы ограничить ток 20 мА. Датчик вибрации вешается на любой удобный порт. На этом порту настраивается прерывание на положительную или отрицательную границу сигнала (на самом деле не имеет значения).

Микроконтроллер работает от внутреннего высокочастотного генератора с максимальным делителем (итоговая частота работы — 2 Мгц). При старте микроконтроллер начинает ждать сигналов с датчика вибрации. Если он их не дожидается, то через 10 секунд уходит в режим active halt, в котором по AN3147 потребляет всего 1 мкА. Стоит взять светильник в руку и начать его трясти, как яркость свечения светодиода начинает нарастать. Если его оставить в покое, то он плавно погаснет и опять заснет. После непрерывного пятисекундного «теребонькания» светильник перейдет в рабочий режим свечения, пытаясь выдать себя за свечку. Что бы погасить светильник, его также нужно непрерывно трясти 5 секунд, пока яркость светодиода не снизится до нуля или просто выключить штатной кнопкой. Если включенный светильник не трогать, то он сам погаснет через 5 часов и уйдет в сон.

Программа


Программа написана в среде IAR Embedded Workbench версии 1.40.1. Бесплатная версия ограничена размером прошивки в 8 кбайт, что вполне достаточно. Для удобства использовалась библиотека со стандартными периферийными функциями (STM8L10x standard peripheral library). Текст программы довольно подробно откомментирован, архив с проектом приложен в конце.

main.c
#include "stm8l10x.h"

#define LED_PORT		GPIOC
#define LED_PIN			GPIO_Pin_2	// вывод 20
#define LED_TOGGLE()	(GPIO_ToggleBits(LED_PORT, LED_PIN))
//#define LED_ON()		(GPIO_WriteBit(LED_PORT, LED_PIN, SET))	- это говно не работает!!!
//#define LED_OFF()		(GPIO_WriteBit(LED_PORT, LED_PIN, RESET)) - - это говно не работает!!!
#define LED_ON()		(LED_PORT->ODR |= GPIO_Pin_2)
#define LED_OFF()		(LED_PORT->ODR &= ~GPIO_Pin_2)

#define BTN_GPIO_PORT	GPIOB
#define BTN_GPIO_PIN	GPIO_Pin_7		// порт PB7 (17) - вход кнопки
#define BTN_PRESSED()	(!GPIO_ReadInputDataBit(BTN_GPIO_PORT, BTN_GPIO_PIN))

#define TIM2_PERIOD 	1000			// период таймера 2

/* константы для режима свечи, все времена в миллисекундах */
#define MIN_DELAY_BEFORE_DOWN	1
#define MAX_DELAY_BEFORE_DOWN 	1000	
#define MIN_PERIOD_DOWN			200		// минимальная длительность угасания
#define MAX_PERIOD_DOWN			300		// максимальная длительность угасания
#define MIN_BRIGHTNESS_DOWN  	100		// минимальное значение яркости, до которого будет угасать свеча	(значение подбирается экспериментально)
#define MAX_BRIGHTNESS_DOWN 	900		// максимальное значение яркости, до которого будет угасать свеча (значение подбирается экспериментально)
#define MIN_PERIOD_UP 			200		// минимальная длительность разгорания
#define MAX_PERIOD_UP			500		// максимальная длительность разгорания
#define TIMER_INTERVAL			25		// периодичность срабатывания прерывания
#define MAX_BRIGHTNESS 			900		// максимально возможное значение яркости (подбирается экспериментально во току светодиода 20мА)

#define set_brightness(br)		TIM2_SetCompare2(br)

#define WORK_TIME_VALUE			(720000UL)	// время непрерывной работы в тиках 40 Гц таймера = 5ч * 60 м * 60 с * 40 Гц
//#define WORK_TIME_VALUE			(24000UL) // ***debug***


////////////// прототипы ///////////////
static void TIM2_Config(void);
static void TIM4_Config(void);
void Delay(__IO uint16_t nCount);
uint16_t candleMode(void);
void EnterLowPowerMode();
void ExitLowPowerMode();
// uint16_t lighthouseMode(void);


/* немного рандомной магии */
#define RAND_MAX 32767
uint16_t rand(void);
uint16_t random(uint16_t minval, uint16_t maxval);

// функция возвращает псевдослучайное число из диапазона [0; RAND_MAX]
uint16_t rand()
{
	static uint32_t next=1;
	next=next*1103515245+12345;
	return((uint16_t)(next/65536)%32768);
}

// функция возвращает псевдослучайное число из диапазона [minval; maxval]
uint16_t random(uint16_t minval, uint16_t maxval)
{
	return ((uint16_t)(((maxval-minval)*1UL*rand())/RAND_MAX) + minval);
}

enum mode_T {OFF, ON, TRY_OFF} work_mode, next_mode;

volatile uint16_t g_pwm_value = 0;
volatile uint32_t g_off_counter = WORK_TIME_VALUE;			// время, оставшееся до выключения

/* Что делать с неииспользуемыми выводами: 
By default, the I/Os are configured as floating input.
It is important to change the configuration of all I/Os that are not connected to defined logic
signals so as to obtain one of the following configurations:
	- input configuration with pull-up
	- or, output configuration with a low (or high) logic level
Otherwise, an increased consumption is generated by noise, as the internal Schmitt triggers
detecting this noise are toggling.
Floating I/Os could generate additional consumption in the range of a few 10 µA.
There are also parts with some unbonded I/Os (typically different packages of the same
product). Those I/Os are connected to a defined level by factory option configuration, unless
otherwise specified in the datasheet.
*/

void main(void)
{
	CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv8); // максимальный делитель = минимальная частота 16/8 = 2 МГц
    TIM2_Config();
	TIM4_Config();
	//GPIO_Init(LED_PORT, LED_PIN, GPIO_Mode_Out_PP_Low_Fast);	// вывод для светодиода для отладки
	GPIO_Init(BTN_GPIO_PORT, BTN_GPIO_PIN, GPIO_Mode_In_PU_IT);	// вход с подтяжкой с внешним прерыванием
	EXTI_SetPinSensitivity(EXTI_Pin_7, EXTI_Trigger_Falling);

	// неиспользуемые порты на выход и в 0
	GPIO_Init(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Slow);	// выводы 3, 4, 5, 6
	GPIO_Init(GPIOB, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6, GPIO_Mode_Out_PP_Low_Slow);	// выводы 10, 11, 12, 13, 15, 16
	GPIO_Init(GPIOC, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4, GPIO_Mode_Out_PP_Low_Slow);	// выводы 18, 19, 20, 1, 2
	GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_PP_Low_Slow);	// выводы 9
	
	work_mode = OFF;
	set_brightness(0);

	/* Enable interrupts*/
	enableInterrupts();     
	
	while (1)
	{
		;
	}
}

static void TIM2_Config(void)
{
  /* Enable TIM2 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);
  
  /* Config TIM2 channel 2 pins */
  GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast);	// вывод PB2 (12)

  /* Time base configuration */
  // 2 МГц/1000 = 2000 Гц
  TIM2_TimeBaseInit(TIM2_Prescaler_1, TIM2_CounterMode_Up, TIM2_PERIOD);

  /* PWM1 Mode configuration: Channel2 */ 
  TIM2_OC2Init(TIM2_OCMode_PWM1, TIM2_OutputState_Enable, 0, TIM2_OCPolarity_High, TIM2_OCIdleState_Set);	// вывод PB2/TIM2_CH2/(12)
  TIM2_OC2PreloadConfig(ENABLE);
  
  TIM2_ARRPreloadConfig(ENABLE);
  
  TIM2_SetCompare2(0);
    
  /* Enable TIM2 outputs */
  TIM2_CtrlPWMOutputs(ENABLE);
  
  /* TIM2 enable counter */
  TIM2_Cmd(ENABLE);
}

static void TIM4_Config(void)
{
  /* Enable TIM4 CLK */
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE);
  
  TIM4_DeInit();
  
  /* Time base configuration */ 
  TIM4_TimeBaseInit(TIM4_Prescaler_256, 195); // 2 МГц / 256 / 195 = 40 Гц
  TIM4_ITConfig(TIM4_IT_Update, ENABLE);
  TIM4_ARRPreloadConfig (ENABLE);
  
  /* Enable TIM4 */
  TIM4_Cmd(ENABLE);
}

// функция мерцания свечи
uint16_t candleMode(void)
{
	/* переменные */
	static uint8_t 	step = 0;							// 0 - delay, 1 - down, 2 - up
	static uint16_t needBrightness = MAX_BRIGHTNESS;	// требуемое значение яркости
	static uint16_t curBrightness = MAX_BRIGHTNESS;		// текущее значение яркости
	static uint16_t oneStep = 0;						// шаг изменения яркости
	static uint16_t curPeriod = 0;						// длительность изменения свечения
	static uint16_t delayBeforeDownUp = 0;
	
	if(step == 0)	// долгая задержка перед очередным угасанием
	{
		
		if (delayBeforeDownUp == 0) // генерация значений для следующего шага
		{
			
			step = 1;
			needBrightness = random(MIN_BRIGHTNESS_DOWN, MAX_BRIGHTNESS_DOWN);
			curPeriod = random(MIN_PERIOD_DOWN, MAX_PERIOD_DOWN);
			oneStep = ((MAX_BRIGHTNESS - needBrightness) * TIMER_INTERVAL) / curPeriod;	// шаг времени для каждого вызова функции
			if (oneStep == 0) oneStep = 1;	// если шаг получился нулевой, делаем его минимальным
		}
		else
		{
			if (delayBeforeDownUp > TIMER_INTERVAL) delayBeforeDownUp -= TIMER_INTERVAL;	
			else delayBeforeDownUp = 0;
		}
		
	}
	else if(step == 1)	// down
	{
		if (curBrightness == needBrightness) // генерация значений для следующего шага
		{
			step = 2;
			needBrightness = MAX_BRIGHTNESS;
			curPeriod = random(MIN_PERIOD_UP, MAX_PERIOD_UP);
			oneStep = ((MAX_BRIGHTNESS - curBrightness) * TIMER_INTERVAL) / curPeriod;
			if (oneStep == 0) oneStep = 1;
		}
		else
		{
			if ((curBrightness - needBrightness) > oneStep) curBrightness -= oneStep;
			else curBrightness = needBrightness;
		}
	}
	else
	{
		if (curBrightness == needBrightness) // генерация значений для следующего шага
		{
			step = 0;
			delayBeforeDownUp = random(MIN_DELAY_BEFORE_DOWN, MAX_DELAY_BEFORE_DOWN);
		}
		else
		{
			if ((needBrightness - curBrightness) > oneStep) curBrightness += oneStep;
			else curBrightness = needBrightness;
		}
		
	}
	

	return curBrightness;
}

// бонусная функция имитации мерцания маяка (плавное нарастание -> плавный спад)
uint16_t lighthouseMode(void)
{
	static uint8_t direction = 1;		// верх
	const uint16_t max_pwm = 900;
	static uint16_t cur_pwm = 0;
	static uint16_t pwm_step = 40;	// шаг прибавления/убавления яркости
	
	if(direction == 1) 
	{
		if(cur_pwm + pwm_step < max_pwm) cur_pwm += pwm_step;
		else
		{
			cur_pwm = max_pwm; direction = 0;
		}
	}
	else // direction == 0
	{
		if(cur_pwm > pwm_step) cur_pwm -= pwm_step;
		else
		{
			cur_pwm = 0; direction = 1;				
		}
	}
	return cur_pwm;
}

volatile uint16_t shake_counter = 0;	// счетчик потрясываний
volatile bool halt_flag = FALSE;		// флаг перехода в режим сна

// прерывание по совпадению таймера 4 (частота срабатывания 40 Гц)
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 25)
{
	const uint16_t pwm_step = MAX_BRIGHTNESS / 2 / 40;	// 
	static uint16_t delay_counter = 0;
	static const uint16_t delay_time = 16;		// 400 мс
	static const uint16_t delay_before_halt = 10 * 40;	// время, которое МК пробудет в выключенном состоянии, перед тем как заснуть (в тиках таймера)
	static uint16_t	halt_counter = 10 * 40;
	static uint32_t	work_counter = WORK_TIME_VALUE;
	
	switch(work_mode)
	{
		case OFF:
		{
			if(delay_counter > 0)	// задержка включена для того, что бы после выключения светильник не начал опять включаться
			{
				if(shake_counter > 0)
				{
					shake_counter = 0;
				}
				else
				{				
					delay_counter--;
				}
			}
			else
			{
				if(shake_counter > 0)	// если состояние изменилось
				{
					shake_counter = 0;
			
					if(g_pwm_value < MAX_BRIGHTNESS - (pwm_step))
						g_pwm_value += (pwm_step);
					else
					{
						work_mode = ON;
						//g_off_counter = g_off_value;
						delay_counter = delay_time;	
					}
				}
				else
				{
					if(g_pwm_value > (pwm_step))
						g_pwm_value -= (pwm_step);
					else
						g_pwm_value = 0;
				}
				
				if(g_pwm_value == 0)	// если текущая яркость нулевая, пробуем заснуть, если никто не начнет опять трясти
				{
					if(halt_counter > 0)
					{
						halt_counter--;
					}
					else	// дождались
					{
						halt_counter = delay_before_halt;
						halt_flag = TRUE;
						TIM4_ClearITPendingBit(TIM4_IT_Update);	// сброс флага прерывания, что бы МК смог уснуть
						__halt();
					}
					
				}
			}
			set_brightness(g_pwm_value);
		}
		break;
		
		case ON:
		{
			set_brightness(candleMode());

			if(delay_counter > 0)	// если требуется задержка
			{
				if(shake_counter > 0)	
				{
					shake_counter = 0;
				}
				else
				{
					delay_counter--;	// счетчик уменьшаем только тогда, когда кнопка отпущена
				}
			}
			else	// отработка тряски
			{
				if(shake_counter > 0)	// светильник трясут
				{
					shake_counter = 0;
					g_pwm_value = MAX_BRIGHTNESS;
					work_mode = TRY_OFF;
				}
			}
			
			if(work_counter > 0)
			{
				work_counter--;
			}
			else
			{
				// кончилось время работы
				g_pwm_value = 0;
				set_brightness(g_pwm_value);
				work_counter = WORK_TIME_VALUE;
				work_mode = OFF;
			}
		} //end of case ON:
		break;
		
		case TRY_OFF:
		{
			if(shake_counter > 0)	// есть тряска
			{
				shake_counter = 0;
				if(g_pwm_value > pwm_step)
					g_pwm_value -= pwm_step;	// пока можно, уменьшаем яркость до 0
				else	// если дошли до 0					
				{
					g_pwm_value = 0;
					delay_counter = delay_time;
					work_mode = OFF;		// режим выключения
				}
			}
			else // прекратили трясти
			{
				if(g_pwm_value < MAX_BRIGHTNESS - pwm_step)	
					g_pwm_value += pwm_step;	// постепенно наращиваем яркость до максимума
				else // дошли до максимума
				{
					work_mode = ON;
				}
			}
			set_brightness(g_pwm_value);
		} // end case TRY_OFF
		break;
	}


	TIM4_ClearITPendingBit(TIM4_IT_Update);
}

// прерывание по входу на пине PB7 (17)
INTERRUPT_HANDLER(EXTI7_IRQHandler, 15)
{
	//LED_TOGGLE();	// **** debug ****
	if(shake_counter < U16_MAX) shake_counter++;
	
	if(halt_flag)	// если МК вышед из сна
	{
		halt_flag = FALSE;
	}
	
	EXTI_ClearITPendingBit(EXTI_IT_Pin7);
}



void Delay(__IO uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}


#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
    /* User can add his own implementation to report the file name and line number,
       ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

    /* Infinite loop */
    while (1)
    {
    }
}
#endif


Модификация светильника


Со светильника снимается крышка и отпаивается штатный светодиод


На переходник-макетку напаивается микроконтроллер со всей обвязкой


Макетка припаивается к штатным контактам держателя батарейки и кнопке. 2 крепежных винта удалось задействовать для выводов NRST и SWIM, что бы в дальнейшем прошивать МК без потрошения светильника


Вот гифка, как это выглядит в темноте
Дополнительная информация


Архив с программой на Яндекс.Диске

Всем добра!
Добавить в избранное +45 +69
+
avatar
  • u3712
  • 30 ноября 2018, 00:49
+3
Вообще, линейка STM8L почему-то незаслуженно забыта в плане всяких отладочных плат.…
Микроконтроллер STM8L101F3P6 в корпусе TSSOP20 (10 шт./лот) ($7.14)
Потому, что STM32F030F4P6 в корпусе TSSOP20 (10 шт./лот) стоит $6.5.
+
avatar
  • dansar
  • 30 ноября 2018, 01:19
+1
Я к тому, что по сравнению с stm32 stm8s тоже не такой навороченный, однако всяких плат на его основе больше.
+
avatar
+4
А stm8l151 навороченный камень. И с dma и с 12бит ацп и т.д.
Другое дело что stm32f030 стоит 0.5$ и по всем параметрам кладет на лопатки stm8l, кроме потребления. Но у stm32 тоже же есть l серия. Не стоит забывать что числа больше 255 уже 16 и 32бита. Условно говоря для 32бит МК это одна инструкция, а у 8мибитника это простыня из 8мибитных команд.
Про stm8s даже говорить не о чем. Сейчас за 0.25$ можно купить n76e003. За эти деньги 18Кб памяти, 12бит АЦП, 3x2 канала ШИМ.
stm8 вообще никуда не вписывается при таких раскладах.

P.S. Я SPL не перевариваю, предпочитаю регистры, поэтому мельком пробежался по программе. Вроде ничего. Но не хватает хотя бы перехода в WFI в основном цикле, чтобы процессор зря не молотил и не расходовал батарейку.
+
avatar
+6
Я stm8 в qfn покупаю, они так меньше места занимают. И когда купил себе stm8l151, спроектировал даже себе отладочную платку. 3d модели, посадочные места, все сам себе рисую, по мере появления новых компонентов.

Но пока так и не нашлось задачи, где бы stm8l151 понадобился, лежат в коробке :).
+
avatar
0
Какими программами пользуетесь?
+
avatar
+1
Судя по 3д визуализации платы- альтиум дезигнер
+
avatar
  • AndyBig
  • 30 ноября 2018, 19:48
0
Точно он :)
+
avatar
+1
Уже ответили за меня :). Сами модели делаю в Solidworks, визуализация самим Altium Designer.
+
avatar
  • AndyBig
  • 01 декабря 2018, 01:21
0
У Вас там шелкография на контактные площадки залазит :) DRC разве не ругается на это? :)
+
avatar
0
Да я знаю, мне нужно было только ЛУТом платку сделать, а не на изготовление отдавать )).
+
avatar
  • AndyBig
  • 01 декабря 2018, 01:36
0
А, тогда понятно :)
+
avatar
0
Все мечтаю себе установку сделать с радиокота лазером фоторезист и маску светить. Но вообще на это времени нет (. А тут через ламинатор прогнал бумагу и плата готова :).
+
avatar
  • AndyBig
  • 01 декабря 2018, 01:56
+1
Да, с засветкой лазером тема интересная :) Вот бы он там еще умел векторную работу, чтобы просто прошелся по дорожкам, а не нарезать растр в час по чайной ложке :)
+
avatar
+1
вот паренек сделал на galvo scanner
www.youtube.com/watch?v=7nVMRmfJnZg
Суть что луч 2 зеркала двигают.
Делиться он не стал проектом. galvo scanner продаются на али за 60$. но этот парень писал что с али плохие. Можно было бы попробовать. Но это сколько свободного времени нужно чтобы разобраться разработать контроллер и софт и довести до ума :).
Там кстати на али и установки мощные продаются и голову я отдельно находил, можно металл сразу выжигать. Типа такого
www.youtube.com/watch?v=mzmjGz0_joM
+
avatar
  • AndyBig
  • 01 декабря 2018, 09:47
0
Нормальные гальваносканеры и стоят нормально, а тот лазер, что выжигает сразу медь, вообще как крыло от боинга :)
+
avatar
0
Ну не как крыло конечно, на том же али от 3000$ (20W) за готовую установку. Но не дешево :). Скорость 7000мм/c.
Можно наверное и бизнес открыть по гравировке на металле, может еще и окупится ))
+
avatar
  • AndyBig
  • 02 декабря 2018, 03:01
0
Думаю, что 20-ваттный гравер не сможет выжигать медь с текстолита :) Гравировать — да. А для выжигания нужно побольше :)
+
avatar
0
За несколько проходов. На ютубе есть видео с 20/30. Но там не показывается сколько проходов было сделано.
+
avatar
0
А прямую печать на стеклотекстолит из струйника случайно не пробовали делать?
+
avatar
  • AndyBig
  • 01 декабря 2018, 13:50
0
В сети вроде встречал такие эксперименты. Точно не помню, но что-то там не сильно гладко выходило.
+
avatar
0
Были попытки лазерником сразу печатать
www.youtube.com/watch?v=fDLgsEnmYu0
Частью струйника сейчас светят фоторезист на текстолите, сделав подвижный стол.
www.youtube.com/watch?v=kDNkFRPtxv0
+
avatar
0
Для n76e003 отладчик дороже. А стоят на Али они всего немного дешевле чем stm8s003. Кроме того у stm8s003 есть корпусе 3x3 мм
+
avatar
+1
10$ стоит отладчик на али и покупается один раз. Есть схема и прошивка в свободном доступе для сборки. Пока ко мне ехал отладчик, была у меня мысль сделать его на stm32, как более доступный вариант. Дизассемблировал прошивку. Разобрал USB пакеты. Но ко мне добрался отладчик и я забросил.
У Nuvotona аж 2 варианта в qfn 3x3. Но на али совместимый с stm8. aliexpress.com/item/10PCS-N76E003AQ20-N76E003-AQ20-QFN-20/32951884618.html Но цена уже не 0.25$ как за tssop, не так популярны.

Новотон дешевле stm8s, но памяти 18К и 12бит АЦП и пашут от 2.4В, а у stm8s 8K и 10бит. За 0.5$ уже stm32f030 покупается.
Я к нувотону сразу привык, шпарю прямо на ассемблере :).
+
avatar
0
Хм, ну не знаю… Купить чтоли… На отладчик денег жалко, вдруг не зайдут мне нувотоны… А отладчики такие, иногда выходят из строя. Я уже пару китайских st link спалил. Правда лет за 5.
а у них есть аналог stm8l

П.С, Думаю за программатор для нувотонов из st link вам бы многие сказали спасибо))
+
avatar
+1
Я не специалист по всему нувотону :). Брал только этот камень, как замену stm8s.
Но они разные с stm8s, у каждого свои плюсы и минусы. Плюсы я написал выше. И еще выше писал про 3x2 шим. Целые порты по 8 бит шириной P0.0-P0.7, P1.0-P1.7, а не как у стмки обрубки портов. Я могу сказать и минусы нувотона. Нувотон с кварцем не работает, если нужна кварцевая точность — отпадает. От внутренней цепочки обещают <2%. У новотона 3 такта на смену состояния ноги, против 1 такта у stm, если это критично (я говорю о ногодрыге, а не о железных интерфейсах, интерфейсы как у всех собратьев, тот же spi 8МГц).
+
avatar
  • dansar
  • 30 ноября 2018, 10:34
0
А среда разработки одна? А то у stm, особенно 32 битных, целый букет идешек и компиляторов.
+
avatar
0
Keil или IAR на выбор у новотона. stm8 тоже IAR. Можно соответственно в одной среде с stm8. Или в одной среде с stm32 (Keil) :)). У Нувотона еще есть что-то типа SPL стмовского для упрощения программирования и примерчики. Но я такими вещами не пользуюсь. Даже несколько багов там нашел.
У stm32 всего 3 компилятора все те же ARM (Keil), IAR и бесплатный GCC. Хотя на последнем могут быть и платные IDE.
+
avatar
0
О 3 такта это да, возможны проблемы ws2812b.
+
avatar
  • AndyBig
  • 30 ноября 2018, 19:50
0
А что, кто-то еще дергает ногами для управления 2812? :)
+
avatar
0
Ну для 8 битных камней без дма вполне себе
+
avatar
  • AndyBig
  • 30 ноября 2018, 20:06
0
Даже в 8-битных камнях есть SPI с прерываниями :)
+
avatar
0
spi часто не удовлетворяет по таймингам. Ну тоесть ws2812 работают конечно, но как то не красиво
+
avatar
  • AndyBig
  • 30 ноября 2018, 20:17
+2
ws2812 работают конечно, но как то не красиво
Нет той душевности в свечении светодиодов, которая есть с православным ногодрыгом? :))
+
avatar
+1
Да и на душе как то не спокойно:)
+
avatar
  • AndyBig
  • 30 ноября 2018, 20:47
0
:)))))
+
avatar
0
ws2812 давно устарели. 400Гц шим. Уже давно в продаже SK9822. шим ~5КГц, умеют общую яркость менять встроенным токовым драйвером, а не шимом. 0.13$ за чип. Есть еще более крутые APA102 с 20кГц шим, но на али их нет, и если будет написано что это APA102, по факту это будет SK9822. Мне китаец на али предлагал APA102 за 0.26$ за чип в личной переписке.
+
avatar
  • ssurneed
  • 01 декабря 2018, 00:09
0
ну устарели конечно. Да и купить их уже сложно, заказываешь ws2812b а присылают SK6812 с 1.2 кГц PWM.

Однако в документации на SK9822 PWM 1.2 кГц. На apa102 не нашёл в документации частоту, но вряд ли там 20 кГц
+
avatar
0
www.youtube.com/watch?v=DPdxlpz5Y_s
4.2кГц у SK9822 у человека на видео. И 20кГц APA102.
У меня SK9822 лежат, не дошли руки до них пока.
+
avatar
  • Z2K
  • 01 декабря 2018, 01:18
0
А какие плюсы дает повышенная частота? В БП понятно в чем плюсы, а в регулировке яркости возможно даже кпд снизится.
+
avatar
  • AndyBig
  • 01 декабря 2018, 01:23
0
Щас Вам расскажут как сильно бьет по глазам мерцание 400 Гц :))
+
avatar
  • dansar
  • 01 декабря 2018, 10:38
0
Можно будет собрать экран/иллюминацию с большим количеством светодиодов и вменяемой скоростью обновления.
+
avatar
  • ssurneed
  • 01 декабря 2018, 13:06
0
Экран без гамма коррекции плохой будет.
+
avatar
  • Z2K
  • 01 декабря 2018, 17:04
0
Спасибо, понятно
+
avatar
  • ssurneed
  • 01 декабря 2018, 01:46
0
Ну хз конечно. sk9822 прикольные, если 4.2 кГц будут и дальше в продаже.
Не понятно почему они в документах написали 1.2 кГц…
+
avatar
+2
Отличная работа… еще бы пьезик «приделать», чтоб проигрывать Хэппи Крисмас"…
и светодиодик лучше RGB поставить… чтоб цвет кубик менял…
+
avatar
  • dansar
  • 30 ноября 2018, 01:25
0
В пределах 8 килобайт — любой каприз.
+
avatar
+1
поставьте мигающий, двух цветный… нафига, только тогда шить, нужно было...?
+
avatar
  • dansar
  • 30 ноября 2018, 09:12
0
Для реализации режима свечи. Или какого-нибудь другого.
+
avatar
0
ясненько… я думал, просто мигает… а это в типе свечеа на ветру горит… Клево… уважаю…
+
avatar
0
вот уж и близко не «ардуина» и не любительство:
в качестве макетки ...
резистор отсутствует…
2 винта удалось задействовать ...
+
avatar
  • dansar
  • 30 ноября 2018, 01:35
+1
Резистор на самом деле отсутствует потому, что я изначально хотел сделать динамическую подстройку яркости светодиода в зависимости от напряжения батарейки, что бы яркость не падала при просадке напряжения. Однако я не учел, что в 101-ом нет АЦП, и измерение напряжения делается как-то хитро через компаратор. У ST на эту тему даже отдельный Applicaton Note есть. Но мне стало лень :)
+
avatar
  • AndyBig
  • 30 ноября 2018, 01:34
0
Плюс за STM8 :)) Я на таком делал RGB-ночник, уже года полтора дома работает :)
+
avatar
0
Порадовали комментарии: «Это гавно не работает!»
+
avatar
  • dansar
  • 30 ноября 2018, 09:13
0
Это издержки кривой SPL. Не зря её не любят.
+
avatar
+1
Мой плюс *за прямые руки* автору обзора…
И благодарность тем, кто предлагает прочие вариации по теме.

Порадовали комментарии
Вот-вот..-это уровень IQ подобных «оппонентов», и, не более…
+
avatar
  • PSVik
  • 30 ноября 2018, 09:14
+1
Если бы не автор, то я бы и не узнал, что увидел, декорация и декорация
+
avatar
+2
Для меня не совсем очевидно про токоограничивающий резистор. Это ШИМ. То есть в открытом состоянии ток ни кем ое ограничивается. То есть среднее значение тока через диод в норме, а мгновенное может быть и не очень.

И да я понимаю, что мы живем в реальном мире, в котором у проводов есть паразитная индуктивность и емкость. Ключ открывается не мгновенно и не до конца и т. д. И за счет паразитных индуктивностей, емкостей шимируя светодиод на высокой частоте можно корректно ограничивать ток через него. Но мне кажется это как то несерьезно полагаться только на непредсказуемые паразитные процессы.
+
avatar
  • dansar
  • 30 ноября 2018, 12:24
0
Ну это мои догадки по аналогии с инфракрасными светодиодами. Если почитать на них даташит, то в импульсном режиме, в котором они, по идее, и должны работать, они выдерживают больший ток и ярче светят.
Для влияния паразитных емкостей и индуктивностей тут слишком маленькая частота — 2 КГц.
+
avatar
0
Тут вопрос скорее даже не про ток через светодиод, а то, что выдержит или нет микроконтроллер такую импульсную нагрузку. Поэтому я бы например поставил резистор.
+
avatar
0
Больший ток != ни чем не ограниченный ток.
+
avatar
  • dansar
  • 01 декабря 2018, 10:41
0
Ток максимальным напряжением батарейки ограничен, светодиод же конечное сопротивление имеет.
PS: Закидали помидорами :( В следующий раз обязательно поставлю резистор на символические ом 10.
+
avatar
  • ssurneed
  • 01 декабря 2018, 13:08
0
Ток ограничен внутренним сопротивлением батарейки в данном случае.
+
avatar
  • Com4com
  • 30 ноября 2018, 11:41
0
Смотрю, тут много электронщиков собралось. А посоветуйте, если бы я захотел управлять по bluetooth BLE? И чтобы плата вместе с таблеткой была минимального размера, какие компоненты вы бы выбрали?
Т.е. миримальное по размеру устройство с bluetooth, которое эпизодически по BLE подключается к смартфону. В програмке на смартфоне выбирается режим мерцания или цвет светодиода
+
avatar
  • CuMr
  • 30 ноября 2018, 12:01
+2
CC2540 в виде модуля JDY-08 прекрасно ложится на батарейку CR2032. C CR1620 можно ужать до 17*21мм
или nRF52832, на али есть модуль размером вообще 10*10мм.
Есть вот такая фоточка
+
avatar
  • Com4com
  • 30 ноября 2018, 12:24
0
А на базе какого микроконтроллера посоветуете?
+
avatar
  • dansar
  • 30 ноября 2018, 12:28
0
Вон наверху smt32l пиарят, мой stm8l закритиковали :)

www.st.com/en/microcontrollers/stm32l0-series.html?querycriteria=productId=SS1817
+
avatar
  • CuMr
  • 30 ноября 2018, 14:17
0
у обоих уже в пузе контроллер. Т.е. это контроллер с BLE. Для нрф вообще в ардуйне можно писать.
так, на всякий случай, слева nRF52832, справа СС2540 в виде модуля JDY-08.
+
avatar
0
nRF52832 обычный кортекс, уж лучше без всяких ардуин. Мне что в нем не понравилось, что SPI только 8МГц. Такое мощное ядро и такой унылый SPI. А так хотелось им же и на IPS дисплей информацию выводить. Можно конечно, но грустно.
Как раз заказал на днях на пробу платку за 3.5$. Будет у меня с удаленных датчиков инфу передавать. :).
+
avatar
  • CuMr
  • 01 декабря 2018, 00:17
0
Просто человеку, который задает такой вопрос, это не очевидно…
+
avatar
0
Как я прочитал, у СС2540 51 ядро, то есть привязан к платному IAR.
nRF52832 же кортекс и по идее есть выбор использования бесплатного ARM GCC.
СС проигрывает и по потреблению, судя по таблицам.
У TI, кстати, тоже есть серия на кортексе.
+
avatar
  • CuMr
  • 01 декабря 2018, 01:21
0
Да, х51 у 2540. И да, проигрывает. Но и выпущена раньше. А вот новое ядро что-то не впечатлило. Точнее впечатлило тремя разными ядрами в одном кристалле. А учитывая фирменную техасскую поддержку — ну их нах… )))
+
avatar
+2
Писать надо на том:
1.за что платят больше.
2.что знаешь лучше.
И толку что тебе кто-то подскажет какую-то Busy Bee если ты ее не знаешь, никто тебе не заплатит за ее изучение и никто не купит твои знания в будущем?
+
avatar
  • CuMr
  • 30 ноября 2018, 21:51
0
Ну я-то для обеих иар/кейл предпочитаю, а вот многие любят ардуйню, потому и упомянул.
+
avatar
0
Да, Iar/Keil это лучшие IDE. Но совсем скоро про них придется забыть всем, кто не работает на богатого работодателя.
+
avatar
  • CuMr
  • 01 декабря 2018, 00:14
0
а что совсем скоро приключится такого?
А как именно IDE, как раз — полное днище.
Ну и гцц для нрф есть вообще-то…
+
avatar
0
Оффлайн только для корпоративных клиентов, остальным онлайн и абонентская плата.
+
avatar
  • CuMr
  • 01 декабря 2018, 00:51
0
что именно онлайн? компиляция? бред.
+
avatar
-1
Насчет сессий и подгружаемых модулей не слыхал? Ну так совсем скоро услышишь.
+
avatar
  • CuMr
  • 01 декабря 2018, 01:23
0
Ну расскажи нам что там такого введут. Обсудим.
+
avatar
-1
У тебя на компе пустая IDE и твоя сигнатура.
Ты запускаешь IDE, открываешь своё workspace. IDE шлет на сервер твою сигнатуру и опции твоего workspace. Обратно сервер шлет тебе модуль конкретно под это workspace, в котором будут компиляторы, линкеры, библиотеки. Модуль зашифрован, привязан ко времени и к твоей сигнатуре.
Следующие 24 часа ты работаешь оффлайн ровно так-же как работаешь прямо сейчас. Через 24 часа подгруженный модуль перестает работать и надо опять подключаться к серверу, слать в него сигнатуру и получать новый модуль.
Твоя сигнатура это грубо говоря твой счет, закинул на него денежку- получаешь свежие модули и работаешь, не закинул- не получаешь.
Пытаться ломать бесполезно, вся крипта интегрирована в винду десятку, и с каждым обновлением становится все злее и злее.
+
avatar
  • AndyBig
  • 01 декабря 2018, 09:49
0
Не поделитесь источником информации? А то что-то сомнения берут :)
+
avatar
  • CuMr
  • 01 декабря 2018, 12:53
0
Тоже интересно.
+
avatar
  • Com4com
  • 30 ноября 2018, 22:12
0
Всегда восхищали люди, которые знают лучше меня, что мне нужно.
— Во-первых, не обязательно все собирать самому-можно нанять специалиста. А чтобы нанять — полезно послушать мнение опытных людей.
— Во вторых, интересно иногда и изучить.
— В третьих, я с уважением отношусь к людям, которые лучшим продуктом считают свои умения, но, к сожалению, я к ним не отношусь.
+
avatar
0
Найди специалиста который реализует твое техзадание на том, на чем посчитает нужным, за устраивающую тебя цену.
Не нужно лезть в процесс выбора элементарной базы если не обладаешь необходимыми для этого знаниями, ничего хорошего от опытных специалистов ты не услышишь потому что каждый свое болото хвалит и холивары на тему и51-мсп-пик-авр-тмс-стм-лпц-сам однажды начавшись не закончатся никогда.
+
avatar
  • Com4com
  • 01 декабря 2018, 11:22
0
Лет 10 назад я иногда делал такую ошибку.
Во первых у вас по определению не совпадают цели (у работника — дорого и с минимальными результатами; у вас — цена, качество, стоимость поддержки, зависимость от определенного типа работников).
В во вторых (и главных) — если вы не вникаете в детали, проблемы, процесс — то на выходе получаете инструмент, который не вам нужен, а вашему нанятому специалисту.
к сожалению, в жизни шары нет, и нужно вникать в процесс.
+
avatar
+2
Когда речь идет о выборе породы древесины для изготовления деревянной двери то ты можешь «вникнуть в процесс» за пол часа и совершенно компетентно диктовать реализатору свое видение вопроса выбора породы древесины.
Когда же мы говорим о процессе значительно более сложном, чем изготовление деревянной двери, для «вникнуть в процесс» надо обладать глубокими знаниями и серьезным опытом работы как минимум с несколькими из платформ, и, самое главное, иметь опыт разработки подобного устройства работающего в подобных условиях.
Если всего этого лично у тебя нет то твое «вникнуть в процесс» будет пересказом мнения самого красноречивого из своих интернет консультантов, компетентность которого у тебя нет возможности проверить, а попытка затянуть его в дискуссию с другими консультантами моментально превратится в холивар, в котором ты ничего не поймешь, потому что абсолютно все участники этого холивара ПРАВЫ.
+
avatar
  • Com4com
  • 01 декабря 2018, 18:42
0
Этот комментарий был излишен. Вы не заставите меня принять мысль, что кто-то что-то знает лучше меня что мне нужно. У меня достаточный опыт запуска software и hardware продуктов, чтобы иметь свое мнение. Ваш комментарий также не несет полезной информации, но, все равно спасибо. что тема Вас заинтересовала.
+
avatar
0
Человек, задающий вопрос
А на базе какого микроконтроллера посоветуете?
априори не понимает ничего в вопросе, и его
опыт запуска software и hardware продуктов
стоит ровно НОЛЬ.
Эти типичный случай, когда каждый суслик в поле агроном.
+
avatar
  • Com4com
  • 01 декабря 2018, 23:25
0
Не стоит тут брызгать слюной. Все у Вас будет хорошо, не волнуйтесь. Обратите во внимание, в соседней ветке обзор купальника — может, Вам там выплеснуть свою негативную энергию?
+
avatar
+1
Модуль на NFR52840. Если не путаю, для него есть микропитон и ардуина.
aliexpress.com/item/CDEBYTE-E73-2G4M08S1C-nRF52840-BLE-5-0-Wireless-Transceiver-8dbm-120m-2-4GHz-Ceramic-Antenna-2/32944356249.html

Есть вот такая интересная плата, но цена не радует: aliexpress.com/item/New-product-NRF52832-Bluetooth-wireless-sensor-acceleration-sensor-BME280-environment-sensor/32812724646.html
+
avatar
  • dansar
  • 30 ноября 2018, 12:27
0
Я бы через ИК, а не bluetooth сделал.
+
avatar
+1
DA14580 на нем мибэнд сделан, модули тоже вроде можно купить. Из того что выше посоветовали все жрет относительно много тока.
+
avatar
  • Com4com
  • 30 ноября 2018, 15:19
0
Спасибо, посмотрю. Интересно было бы найти в идеалее вообще что-то типа отладочной платы простого фитнес-треккера :-)
+
avatar
+1
Да много что на чем сделано.
Для примера:
Garmin Vivosmart – nRF51422 by Nordic Semiconductor
Misfit Flash Link – nRF51822 by Nordic Semiconductor
Pebble Time – CC2564 by Texas Instruments
FitBit Surge – CC2564 by Texas Instruments
Misfit Shine Activity Tracker – CC2541 by Texas Instruments
Xiaomi Mi Band – DA14580 by Dialog Semiconductor
FitBit Charge 2 – BLUENRGCSP by STMicroelectronics
Samsung Gear Fit – BCM4334WKUBG by Broadcom

Нужно смотреть не просто кто на чем сделал, а платная или бесплатная будет среда разработки, комьюнити для помощи и т.д.

И если посмотреть, то DA14580 потребляет меньше из-за использования OTP памяти.
+
avatar
  • LynXzp
  • 30 ноября 2018, 16:51
0
минимального размера
Если на IR то можно на GreenPAK контроллере. Ну конечно кроме питания еще нужен фотоприемник.
+
avatar
  • ambuddy
  • 30 ноября 2018, 14:15
-2
пфф… вы бы еще выложили тут, как адронный коллайдер собрать из деталек с Али)))
+
avatar
+2
Рандом через умножение 32х32 на контроллере с аппаратным умножителем 8х8, и все это на батарейном питании?
Ты серьезно?
+
avatar
  • dansar
  • 30 ноября 2018, 22:27
0
В плане энергопотребления МК все равно, умножать ему или складывать, дело только в числе инструкций. Функция вызывается довольно редко (не чаще 200 мс), что бы как-то влиять на производительность.
+
avatar
+1
Включи в настройках проекта листинг и посмотри сколько на одно 32х32 умножение он делает 8х8 ассемблерных инструкций, и на сколько это больше чем банальная таблица.
+
avatar
0
Сдвиговый регистр с линейными обратными связями. Просто, дешево в плане тактов и достаточно псевдослучайно если правильно выбрать образующий полином.
+
avatar
0
зачем вообще там нужен ГПСЧ не понятно, как будто бы у детей, которые будут на него смотреть, в головах стоит измеритель спектральной плотности и дисперсии.
+
avatar
  • Prays
  • 01 декабря 2018, 06:48
0
Stm-кой мигать светодиодом… Пенсионеры негодуют. Два мультивибратора на кт315 на разных частотах — вот вам аппаратный rnd(). Хотя конечно понимаю, что на стмке и потребление сейчас ничтожное, и себестоимость меньше отдельных транзисторов.
+
avatar
0
Себестоимость считается с учетом времени на написание и отладку программы.