Годинник з механічною розгорткою (Propeller Clock)

  • Час 17-12-2014, 13:06
  • Автор admin
  • Коментарів 0 Комент.
  • Силка url

Годинник з механічною розгорткою, Propeller clock, годинник Боба Відблиску - це пристрій має багато назв, але в основу його роботи покладена розробка 80х років позаминулого століття (1884 р) запропонована німецьким техніком і винахідником Паулем Нипковым. Цей пристрій отримало назву на честь свого винахідника - диск Ніпкова і послужило основою механічного телебачення, яке проіснувало аж до 1939 року і була широко поширена в Німеччині. Диск Ніпкова має ряд отворів, розташованих по спіралі, за диском розташовується джерело освітлення, яскравість якого модулюється відеосигналом.

Годинник з механічною розгорткою (Propeller Clock)

Таким чином кожне отвір формує на екрані (область відзначена червоним кольором) один рядок зображення.

Аналогічним чином працюють і годинник з механічною розгорткою. Власне і назву вони отримали таке з-за близькою родинного зв'язку з принципами розгортки зображення механічного телебачення.

Годинник з механічною розгорткою (Propeller Clock)

Використовуючи сучасну елементну базу побудувати такий годинник досить просто. Серцем годин є мікроконтролер фірми Atmel Attiny2313. Схема рухомої частини годин:

Годинник з механічною розгорткою (Propeller Clock)

Тактується схема від вбудованого генератора із зовнішнім кварцовим резонатором на 12Мгц, Світлодіоди Led1.. Led8 формують зображення, світлодіод led9 не використовується і його не можна паяти. Управляються годинник з допомогою ІЧ пульта, за допомогою приймача (IR sensor), підключеного до входу зовнішнього переривання int0. Фотодіод LED10 підключений до входу зовнішнього переривання int1 використовується для синхронізації зображення. Як тільки на нього потрапляє світло від ІК світлодіоди, контролер починає формування зображення. Тимчасові інтервали підібрані таким чином, що зображення формується за один повний оберт. Живлення схеми здійснюється за допомогою обертового трансформатора. Таке рішення зменшує шум всього пристрою та усуває вплив ковзних контактів (при контактній схемі живлення) на стабільність обертів і швидкість. Первинна обмотка ВТ (обертового трансформатора) намотується проводом 0.15 мм 50 витків безпосередньо на двигун. Для надійності перед намотуванням двигун необхідно ізолювати шматочком лакотканини або іншим ізоляційним матеріалом. Вторинна обмотка мотається на каркасі з радиокартона тим же дротом 60 витків і приклеюється безпосередньо до плати. Діоди D1-D4 можна використовувати будь-які на струм від 0.5 А. Конденсатори С15, С16 виконують фільтруючу функцію і повинні бути розраховані на напругу 16-25в. Як видно схема обертової частини досить проста. Схема нерухомої частини наведена на малюнку нижче і труднощів не представляє.

Годинник з механічною розгорткою (Propeller Clock)

Вона складається з двох генераторів імпульсів виконаних на таймерах NE555. Перший з них призначений для живлення рухомої частини годинників з допомогою обертового трансформатора, другий для живлення двигуна. Перша схема особливостей не має виконана за класичною схемою генератора на таймері 555. Конденсатор С18 заряджається через резистори R13, R18, розряджається через резистор R13. У другій схемі ланцюга заряду і розряду конденсатора розділені за допомогою діодів D5, D6 і резистора R15, що дає можливість регулювати ширину імпульсу, а відповідно і швидкість обертання двигуна. Світлодіод Led1 є датчиком синхронізації. Він світиться безперервно і датчик на рухомій частині проходячи над ним інформує контролер про необхідність початку формування зображення. Двигун у даній конструкції застосований від приводу будь-якого лотка CD/DVD приводу.

Годинник з механічною розгорткою (Propeller Clock)

Вихідний код програми:

/***************************************************** This program was produced by the CodeWizardAVR V1.24.8 d Professional Automatic Program Generator © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Propeller Clock Version : 1.0 Date : 05.09.2009 Author : Panda Company : *** Comments: Chip type : AT90S2313 Clock frequency : 12,000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 866 words (84.6% of FLASH) 759 words (74,1% of FLASH) 761 words (74,3% of FLASH) *****************************************************/ #include #include unsigned char max_days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; unsigned char sec, min, hour, month, day_of_week, day_of_month, tmr_cnt, mode; volatile unsigned char _cmd; unsigned int ms, day, year; #define tmr 250 flash const unsigned char font[11][8] = { {0x00, 0x00, 0xFE, 0x81, 0x81, 0xFE, 0x00, 0x00}, // 0 {0x00, 0x00, 0x04, 0x02, 0xFF, 0x00, 0x00, 0x00}, // 1 {0x80, 0x40, 0xA2, 0x11, 0x89, 0x06, 0x80, 0x00}, // 2 {0xC0, 0x00, 0x82, 0x01, 0x89, 0x76, 0x00, 0x00}, // 3 {0x00, 0x10, 0x18, 0x14, 0x12, 0xFF, 0x10, 0x00}, // 4 {0x40, 0x8F, 0x09, 0x89, 0x09, 0x90, 0x60, 0x00}, // 5 {0x00, 0xF0, 0x0C, 0x8A, 0x09, 0x90, 0x60, 0x00}, // 6 {0x00, 0x00, 0x01, 0xF1, 0x09, 0x05, 0x03, 0x00}, // 7 {0x60, 0x96, 0x09, 0x89, 0x09, 0x96, 0x60, 0x00}, // 8 {0x00, 0x00, 0x0E, 0x91, 0x51, 0x3E, 0x00, 0x00}, // 9 {0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00} // : }; //8x5 font for down parth screen flash const unsigned char d_font[12][5] = { {0x00, 0x1E, 0x21, 0x21, 0x1E}, // 0 {0x00, 0x00, 0x3F, 0x10, 0x08}, // 1 {0x00, 0x19, 0x25, 0x23, 0x11}, // 2 {0x00, 0x16, 0x29, 0x21, 0x12}, // 3 {0x00, 0x3F, 0x04, 0x04, 0x4C}, // 4 {0x00, 0x26, 0x29, 0x29, 0x39}, // 5 {0x00, 0x06, 0x29, 0x29, 0x1E}, // 6 {0x00, 0x30, 0x28, 0x27, 0x20}, // 7 {0x00, 0x16, 0x29, 0x29, 0x16}, // 8 {0x00, 0x18, 0x26, 0x25, 0x18}, // 9 {0x00, 0x03, 0x03, 0x00, 0x00}, //. {0x00, 0x07, 0x06, 0x00, 0x00} // , }; //******************************************** // External Interrupt 1 service routine // Scr for display//******************************************** interrupt [EXT_INT1] void ext_int1_isr(void) { unsigned char i, s, tmp; char str[10]; tmp = hour/10; str[0] = tmp; str[1] = hour-tmp*10; str[2] = 10; tmp = min/10; str[3] = tmp; str[4] = min-tmp*10; str[5] = 10; tmp = sec/10; str[6] = tmp; str[7] = sec-tmp*10; for (s=0; slt;8; s++) { for (i=0; ilt;7; i++) { PORTB = font[str[s]][i]; delay_us(tmr); }; PORTB = 0; delay_us(tmr); }; for (i=0; ilt;6; i++) delay_us(tmr); //output data //year tmp = year/10; str[0] = year-tmp*10; str[1] = tmp-tmp/10*10; str[2] = 0; str[3] = 2; str[4] = 10; //month tmp = month/10; str[5] = month-tmp*10; str[6] = tmp; str[7] = 10; //day tmp = day_of_month/10; str[8] = day_of_month-tmp*10; str[9] = tmp; for (s=0; slt;10; s++) { for (i=0; ilt;6; i++) { PORTB = d_font[str[s]][i]; delay_us(tmr); }; PORTB = 0; delay_us(tmr); }; } //********************************************************************************** // External Interrupt 0 service routine receive from command IR remote control unit//********************************************************************************** interrupt [EXT_INT0] void ext_int0_isr(void) {unsigned char ppp, pin; unsigned int _tmp, tout; GIMSK = 0; _tmp = 1; for(ppp = 1; ppplt;14; ppp++) {delay_us(1200); pin = PIND.2; for (tout = 1400; tout gt; 0; tout--) if (pin != PIND.2) break; if (tout == 0) {GIMSK = 0x40; //timeout EIFR = 0xC0; return;}; _tmp = _tmp lt;lt; 1; if (!PIND.2) _tmp++; }; _cmd = _tmp & 0x003F; if ((_cmd & 0x0F) == 1) hour++; //1 slow if ((_cmd & 0x0F) == 2) min++; //2 fast if ((_cmd & 0x0F) == 3) sec=0; //3 if ((_cmd & 0x0F) == 4) //fast {//4 day++; day_of_week++; }; if ((_cmd & 0x0F) == 5) day = day + 31; //5 slow if ((_cmd & 0x0F) == 6) year++; //6 fast if ((_cmd & 0x0F) == 7) day--; //7 if ((_cmd & 0x0F) == 8) {//8 if (daygt;31) day=day-31; }; if ((_cmd & 0x0F) == 9) {//9 if (yeargt;2000) year--; }; _cmd = 0; EIFR = 0xC0; GIMSK = 0xC0; } //************************************************** // Timer 1 output compare interrupt service routine//************************************************** interrupt [TIM1_COMPA] void timer1_comp_isr(void) { // Place your code here unsigned char vis = 0; ms = ms + 200; if (ms == 1000) {ms = 0; sec++; EIFR = 0xC0; GIMSK = 0xC0;}; if (sec gt;= 60) {sec = 0; min++;}; if (min gt;= 60) {min = 0; hour++;}; if (hour gt;= 24) {hour = 0; day++; day_of_week++;}; vis = 0; if ((year-2000)/4*4 == (year-2000)) vis = 1; if (day == 366+vis) {day = 1; year++;}; month = 1; day_of_month = day; if ((day_of_month gt; 59) & (vis)) day_of_month--; while (day_of_month gt; max_days[month]) {day_of_month -= max_days[month]; month++; }; if (day_of_week == 7) day_of_week = 1; } void main(void) { PORTB=0x00; DDRB=0xFF; PORTD=0x04; DDRD=0x00; TCCR1A=0x00; TCCR1B=0x0B; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x92; OCR1AL=0x7C; GIMSK=0xC0; MCUCR=0x0D; EIFR=0xC0; TIMSK=0x40; TCCR0B=0x04; TCNT0=0x00; ACSR=0x80; ms = 0; sec = 0; min = 0; hour = 0; day = 1; month = 1; year = 2000; day_of_week = 6; day_of_month = 1; tmr_cnt = 0; mode = 0; #asm("sei") while (1) { }; }

Вихідний код програми управління умовно можна розбити на чотири частини. Це блок ініціалізації регістрів контролера, блок виводу зображення, блок управління і блок відліку часу.
Відтворення зображення провадиться в процедурі обробки переривання int1

//******************************************** // External Interrupt 1 service routine // Scr for display//******************************************** interrupt [EXT_INT1] void ext_int1_isr(void) {

Фотодіод на рухомій частині проходячи над світлодіодом нерухомої частини формує імпульс, який запускає виконання процедури обробки переривання int1.

В процедурі обробки переривання int0 проводиться обробка прийому сигналів від ІЧ пульта дистанційного керування працює з протоколом RC5.

//********************************************************************************** // External Interrupt 0 service routine receive from command IR remote control unit//********************************************************************************** interrupt [EXT_INT0] void ext_int0_isr(void) {unsigned char ppp, pin;

В процедурі обробки переривання від таймера TMR1 проводиться відлік часу і дати.

//************************************************** // Timer 1 output compare interrupt service routine//************************************************** interrupt [TIM1_COMPA] void timer1_comp_isr(void) {

Таймер працює в режимі порівняння. Коефіцієнт розподілу для тактирования таймера і значення регістру порівняння підібрані таким чином, що таймер цокає кожні 200мс.
Програма була написана з використанням Code Vision AVR версії 1.24.8 d, версія 2.05.5 дає більш компактний код.
Fuse Bits необхідно виставити для роботи із зовнішнім кварцовим резонатором
SKSEL0 = 1 (знята галочка)
SKSEL1 = 1 (знята галочка)
SKSEL2 = 1 (знята галочка)
SKSEL3 = 1 (знята галочка)
SUT0 = 1 (знята галочка)
SUT1 = 1 (знята галочка)

Рухома частина годин зібрана на друкованій платі:

Годинник з механічною розгорткою (Propeller Clock)

На друкованій платі передбачено місце під датчик температури ds18b20s, але так як він не використовується і програмне забезпечення, його не підтримує, місце під нього залишається порожнім. Є варіант ПП без датчика температури.

Так як друкована плата має несиметричну форму, а конструкція повинна обертатися з досить великою швидкістю, то необхідно врівноважити плату з допомогою вантажу, роль якого виконує металева пластина закріплена з боку фотодіода (ліва сторона на малюнку). Рухома частина годин після зборки повинна бути ретельно збалансована, інакше неминуче будуть виникати биття і вібрації.

Список радіоелементів

Позначення Тип Номінал Кількість VR1 D1-D4 С11 С12, С13 С15, С16 R1 R3 R4-R12 LED1-LED9 LED10 Qz VR2 Т1 Т2 D5-D7 С17, С19 С18 С20 R2 R13, R18 R14, R17 R15 R16 М1 IR LED1
Схема обертової частини.
МікроконтролерAT90S2313-20su1
Лінійний регуляторLM78051
Діод4
Електролітичний конденсатор1 мкФ1
Конденсатор22 пФ2
Електролітичний конденсатор220 мкФ2
Резистор2.2 кОм1
Резистор200 кОм1
Резистор300 Ом9
СвітлодіодЯскравий червоний9
Інфра-червоний фотодіод1
Інфра-червоний фотоприймач1
Кварцовий резонатор12 МГц1
Котушка індуктивності1
Схема нерухомої частини.
Програмований таймер і осциляториNE5552
Лінійний регуляторLM78051
ТранзисторК16031
ТранзисторС44081
Діод3
Конденсатор0.01 мкФ2
Конденсатор680 пФ1
Конденсатор0.1 мкФ1
Резистор240 Ом1
Резистор10 кОм2
Резистор270 Ом2
Підлаштування резистор22 кОм1
Резистор1 кОм1
Котушка індуктивності1
Безколекторний двигун1 Двигун від кулера
СвітлодіодІнфра-червоний1
Tags

Коментарі до новини