10.03.2021, 17:17 | #1 (permalink) |
Engineer
Регистрация: 05.07.2012
Адрес: Винница
Сообщений: 579
Сказал(а) спасибо: 5
Поблагодарили 6 раз(а) в 3 сообщениях
Репутация: 3008
|
Светодиодное сердце на STM32. Шкатулка
Потихоньку осваиваю кортексы, вот и решил слепить в качестве пилотного проекта светодиодное сердце на STM32, вдохновившись аналогичным на AtMega соответственно, думаю все его видели... В данном случае использован контроллер STM32L100RBT6TR, как самый дешевый на момент покупки на космодроме, но в принципе, подойдет любой другой в корпусе LQFP64. Можно взять поменьше, но тогда и светодиодов будет меньше. Или вообще как вариант, взять тот же F030 самый дешевый с около 20 ногами и рулить диодами через сдвиговый регистр, ибо математики там нету кроме шима, но тогда придется поупражняться в плотной трассировке Питается оно все от литий полимерного акб в пакете (серые такие). Гнездо зарядки выведено на заднюю стенку шкатулки. Включение платы происходит при открытии верхней крышки. Все просто, в одной боковой стенке профрезерован паз, в который поставлен переключающий геркон, после чего шпаклюется и красится. А в крышке соответственно находится нео магнит, геркон просто рвет питание от акб при закрытой крышке. Сама плата как и тонирующий пластик крепится в пазах, которые предварительно фрезеруются по внутреннему периметру нижней части шкатулки. По программной части - ничего сверхъестественного, CubeMX+HAL, писалось в Keil. Благодаря этому, можно за 10 минут перекинуть прошивку на МК другого семейства. Если будет интересно, спрашивайте, буду дополнять Последний раз редактировалось Storm; 10.03.2021 в 17:25 |
4 пользователя(ей) сказали cпасибо: | gluxon (10.03.2021), Gopnik987 (10.03.2021), ИЛЬЯ.С (10.03.2021), кочевник (19.03.2021) |
10.03.2021, 17:17 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Информация которая содержится в схожих по содержанию темах будет вам полезна Электронное светодиодное сердце на микроконтроллере Шкатулка |
10.03.2021, 17:39 | #2 (permalink) |
Member
Регистрация: 27.11.2017
Сообщений: 3,424
Сказал(а) спасибо: 35
Поблагодарили 31 раз(а) в 6 сообщениях
Репутация: 31069
|
Всё хочу научиться писать под STM, только грустно что дальше желания дело не движется у меня... На Atmel'ы раньше что-то писал на Си, иногда даже получалось.
|
10.03.2021, 17:47 | #3 (permalink) | |
Engineer
Регистрация: 05.07.2012
Адрес: Винница
Сообщений: 579
Сказал(а) спасибо: 5
Поблагодарили 6 раз(а) в 3 сообщениях
Репутация: 3008
|
Цитата:
Да и если просто абстрактно хотеть, то да, далеко не уедешь на этом. Нужно поставить конкретную задачу, и потихоньку ее решать. А там уже и понимание приходит что к чему. |
|
19.03.2021, 20:23 | #5 (permalink) |
Engineer
Регистрация: 05.07.2012
Адрес: Винница
Сообщений: 579
Сказал(а) спасибо: 5
Поблагодарили 6 раз(а) в 3 сообщениях
Репутация: 3008
|
Да, вполне. На час работы хватит если использовать линейный стабилизатор, если использовать понижающий модуль то может и больше. Да и крона грубая сильно, лучше АКБ от сотового использовать.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
19.03.2021, 20:45 | #6 (permalink) |
Engineer
Регистрация: 05.07.2012
Адрес: Винница
Сообщений: 579
Сказал(а) спасибо: 5
Поблагодарили 6 раз(а) в 3 сообщениях
Репутация: 3008
|
Если кому то интересно, тело прошивки.
Код:
#include "main.h" void LED(uint8_t a, uint8_t b) { switch(a) { case 0: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_RESET); break; case 1: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET); break; case 2: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); break; case 3: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET); break; case 4: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); break; case 5: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); break; case 6: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); break; case 7: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET); break; case 8: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET); break; case 9: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET); break; case 10: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET); break; case 11: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET); break; case 12: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET); break; case 13: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET); break; case 14: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); break; case 15: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET); break; case 16: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); break; case 17: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); break; case 18: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); break; case 19: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); break; case 20: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET); break; case 21: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); break; case 22: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); break; case 23: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); break; case 24: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); break; case 25: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); break; case 26: if (b) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); break; case 27: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET); break; case 28: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); break; case 29: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); break; case 30: if (b) HAL_GPIO_WritePin(GPIOH, GPIO_PIN_1, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOH, GPIO_PIN_1, GPIO_PIN_RESET); break; case 31: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET); break; case 32: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); break; case 33: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); break; case 34: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); break; case 35: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); break; case 36: if (b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); break; case 37: if (b) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); break; case 38: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET); break; case 39: if (b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_11, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_11, GPIO_PIN_RESET); break; case 40: break; } } void LED_INV(uint8_t a) { switch(a) { case 0: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_10); break; case 1: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15); break; case 2: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_12); break; case 3: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_11); break; case 4: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_10); break; case 5: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_9); break; case 6: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8); break; case 7: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9); break; case 8: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8); break; case 9: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_7); break; case 10: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6); break; case 11: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_15); break; case 12: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14); break; case 13: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13); break; case 14: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12); break; case 15: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_11); break; case 16: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_10); break; case 17: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); break; case 18: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); break; case 19: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5); break; case 20: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4); break; case 21: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_7); break; case 22: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6); break; case 23: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); break; case 24: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4); break; case 25: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); break; case 26: HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); break; case 27: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_3); break; case 28: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2); break; case 29: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_0); break; case 30: HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_1); break; case 31: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9); break; case 32: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8); break; case 33: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7); break; case 34: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6); break; case 35: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); break; case 36: HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4); break; case 37: HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2); break; case 38: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_12); break; case 39: HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_11); break; case 40: break; } } void LED_ON() { for(int i=0; i<40; i++) { LED(i,1); } } void LED_OFF() { for(int i=0; i<40; i++) { LED(i,0); } } void FADE_IN() { LED_OFF(); for(int i=0; i<100; i++) { for (int ii=0; ii<100; ii++) { if(ii<=i) LED_ON(); else LED_OFF(); } } } void FADE_OUT() { LED_OFF(); for(int i=0; i<100; i++) { for (int ii=0; ii<100; ii++) { if(ii>i) LED_ON(); else LED_OFF(); } } HAL_Delay(200); } void KRUG(int a) { for(int c=0; c<a; c++) { for(int i=0; i<40; i++) { LED(i,1); HAL_Delay(20); } for(int i=1; i<40; i++) { LED(i,0); HAL_Delay(20); } } } void polovina_po_chas() { LED(0,1); for(int i=1; i<=20; i++) { LED(i,1); LED(19+i,1); HAL_Delay(20); } LED(20,1); } void polov_po_chas_inv() { for(int i=0; i<=19; i++) { LED_INV(i); LED_INV(20+i); HAL_Delay(20); } } void polov_pr_chas_inv() { for(int i=19; i>=0; i--) { LED_INV(i); LED_INV(20+i); HAL_Delay(20); } } void polov_S0() { LED_INV(0); for(int i=1; i<=19; i++) { LED_INV(i); LED_INV(40-i); HAL_Delay(20); } LED_INV(20); } void nasip_posl() { uint32_t delay=15; LED_OFF(); for(int i=20; i>=0; i--) { for(int ii=0; ii<=i; ii++) { LED_INV(ii); HAL_Delay(delay); if (ii==i) break; LED_INV(ii); } LED_INV(0); HAL_Delay(delay); LED_INV(0); for(int iii=39; iii>=39-i+2; iii--) { LED_INV(iii); HAL_Delay(delay); if (iii==39-i+2) break; LED_INV(iii); } } } void nasip_parr() { uint32_t delay=20; LED_OFF(); for(int i=20; i>=0; i--) { LED_INV(0); HAL_Delay(delay); LED_INV(0); for(int ii=1; ii<=i; ii++) { LED_INV(ii); if (ii!=20) LED_INV(40-ii); HAL_Delay(delay); if (ii==i) break; LED_INV(ii); LED_INV(40-ii); } } } void tochka_kolco() { uint32_t delay=11; LED_OFF(); for(int ii=0; ii<40; ii++) { LED_INV(ii); HAL_Delay(delay); LED_INV(ii); } LED_INV(0); HAL_Delay(delay); LED_INV(0); for(int iii=39; iii>=0; iii--) { LED_INV(iii); HAL_Delay(delay); LED_INV(iii); } } void polovinki(int a) { LED_OFF(); uint32_t delay=700; for(int ii=1; ii<=a; ii++) { for(int i=0; i<=20; i++) { LED(i,1); } HAL_Delay(delay); LED_OFF(); for(int i=20; i<=39; i++) { LED(i,1); } LED(0,1); HAL_Delay(delay); LED_OFF(); } } int main(void) { while (1) { FADE_IN(); FADE_OUT(); polov_pr_chas_inv(); polov_po_chas_inv(); polov_po_chas_inv(); FADE_OUT(); FADE_IN(); polovinki(2); FADE_OUT(); KRUG(1); polovina_po_chas(); polov_S0(); polov_S0(); polov_S0(); nasip_posl(); FADE_OUT(); polov_po_chas_inv(); polov_po_chas_inv(); polov_pr_chas_inv(); polov_pr_chas_inv(); polov_pr_chas_inv(); FADE_OUT(); nasip_parr(); FADE_OUT(); polov_pr_chas_inv(); FADE_OUT(); tochka_kolco(); } } |
19.03.2021, 21:09 | #8 (permalink) |
Engineer
Регистрация: 05.07.2012
Адрес: Винница
Сообщений: 579
Сказал(а) спасибо: 5
Поблагодарили 6 раз(а) в 3 сообщениях
Репутация: 3008
|
Макет раскроя для лазера. Толщина материала 6-6,2 мм.
Программы для ЧПУ станка для фрезеровки пазов и карманов для магнитов с датчиком я думаю нету смысла выкладывать |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Метки |
arm, cortex, stm32, подарок, шкатулка |
|
|