Мотив
Начну с того, что каждый человек живёт во времени, которое, к огромному сожалению, не возможно остановить. И раз мы живём в этом мире, то давайте следить за временем и не упускать ни минуты, тратя её впустую. Для этого я и сделал это чудесное устройство, по имени часы.
Начнём!
На улице встало солнце, я нарисовал плату и почесал на ксерокс, дабы напечатать плату
Дальше те, кто знают как изготавливаются платы поймут, что я перевёл рисунок утюгом на текстолит, протравил, залудил и т.д., а те, кто не в курсе — почитайте в интернете про изготовление плат методом ЛУТ — (Лазерно-утюжная технология).
результат я заснять забыл, но думаю, что качество будет видно и на готовой плате:
Видно места, которые не взялись, но ничего страшного не случилось, отстал только полигон.
Дальше нужно было запаять компоненты, на которых я особо останавливаться не буду, только оставлю их список:
- AtTiny2313 — 8ми битный микроконтроллер
- ds1307 — микросхема-счётчик с неплохой точностью
- часовой кварц на 32.768кГц
- 2 резистора на 10 КОм
- 7 резисторов на 10 Ом
- 1 резистор на 5.2 КОм
- 4 резистора на 1 КОм
- 4 транзистора КТ315 (их современные братья)
- буззер на 5 вольт
- 2 тактовые кнопки (угловой монтаж)
- 4 индикатора (10011-BSR) общий анод
- тантал на 47 микрофарад
- и гнездо питания и угловым креплением (диаметр отверстия — 5.1мм, диаметр центр. контакта — 1.5мм)
И пускай вас не смущает длина этого списка, ведь мы собираем устройство на долгие года, и оно должно быть собрано на должном уровне!
Кто желает посмотреть на плату с другой стороны, вот фото:
Программа
Как и все устройства, часы нуждаются в программе. В данном случае программа написана на языке BASIC в BASCOM AVR. Этот язык очень удобный для программирования, так как код понятный, эффективный и занимает не много места на микроконтроллере. Писать программу с ноля я не стал, а взял исходник одной статьи сайта паяльник. Кто интересуется — найдёт, я же просто оставлю доработанный мною код тут:
$regfile = "attiny2313.dat"
$crystal = 8000000
Dim Count As Byte
Dim Number(4) As Integer
Dim Pointmem As Byte
Dim Point As Bit
Dim Mine As Byte
Dim Hour As Byte
Dim Seco As Byte
Config Porta.1 = Output
Porta.1 = 1
Waitms 10
Porta.1 = 0
Waitms 70
Porta.1 = 1
Waitms 10
Porta.1 = 0
Config Portb = Output
Config Porta.0 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.6 = Output
Config Sda = Portd.5
Config Scl = Portd.4
Config Pind.0 = Input
Portd.0 = 1
Config Pind.1 = Input
Portd.1 = 1
Config Timer1 = Timer , Prescale = 64
On Timer1 Awake:
Config Timer0 = Timer , Prescale = 64
On Ovf0 Refresh
Dig1 Alias Porta.0 : Dig2 Alias Portd.2 : Dig3 Alias Portd.3 : Dig4 Alias Portd.6
Enable Interrupts
Enable Ovf0
Enable Timer1
Start Timer1
Hour = 0
Mine = 0
If Pind.1 = 0 And Pind.0 = 0 Then
Porta.1 = 1
Waitms 100
Porta.1 = 0
Hour = 0
Mine = 0
Seco = 1
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop
Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
Waitms 1000
Porta.1 = 1
Waitms 10
Porta.1 = 0
End If
Do
I2cstart
I2cwbyte &HD0
I2cwbyte &H00
I2cstart
I2cwbyte &HD1
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Nack
I2cstop
Seco = Makedec(seco)
Mine = Makedec(mine)
Hour = Makedec(hour)
If Seco = 80 Then
Seco = 10
Seco = Makebcd(seco)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte Seco
I2cstop
End If
If Hour > 9 Then
Number(1) = Hour / 10
Number(1) = Abs(number(1))
Else
Number(1) = 20
End If
Number(2) = Hour Mod 10
If Mine > 9 Then
Number(3) = Mine / 10
Number(3) = Abs(number(3))
Else
Number(3) = 0
End If
Number(4) = Mine Mod 10
If Pind.1 = 0 Then
Porta.1 = 1
Waitms 10
Porta.1 = 0
If Mine = 59 Then
Mine = 0
Else
Incr Mine
End If
Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop
Else
If Pind.0 = 0 Then
Porta.1 = 1
Waitms 10
Porta.1 = 0
If Hour = 23 Then
Hour = 0
Else
Incr Hour
End If
Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
End If
End If
Waitms 250
Loop
Awake:
If Point = 1 Then
Porta.1 = 1
Waitus 10
Porta.1 = 0
End If
Toggle Point
Return
Refresh:
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr Count : If Count > 4 Then Count = 1
If Count = 2 And Point = 1 Then
Pointmem = Number(2) + 10
Portb = Lookup(pointmem , Digits)
Else
Portb = Lookup(number(count) , Digits)
End If
Select Case Count
Case 1 : Set Dig1
Case 2 : Set Dig2
Case 3 : Set Dig3
Case 4 : Set Dig4
End Select
Return
Digits:
Data &B00101000 , &B01111011 , &B00110100 , &B00110010 , &B01100011
Data &B10100010 , &B10100000 , &B00101011 , &B00100000 , &B00100010
Data &B00001000 , &B01011011 , &B00010100 , &B00010010 , &B01000011
Data &B10000010 , &B10000000 , &B00001011 , &B00000000 , &B00000010
Data &B11111111
Прошиваем почти 2 килобайта кода в мк и наблюдаем как только-что ожившее устройство начало служить человеку.
Чесно сказать, я испытываю невероятное удовольствие от того, что могу создать нечто такое, что для многих далёкое и не понятное)
Так выглядит устройство без корпуса, корпус буду делать после написания статьи:
И так, часы готовы, а как они работают? Это я демонстрирую в первой половине этого видео (не прошу подписки или чего-то ещё, просто материал)
Заключение
Таким образом, за 2 дня я сделал устройство, которое покажет мне, сколько мне осталось заниматься одним делом и переходить к другому, когда пора идти, или начать что-то важное.
Ну а на этом всё, спасибо тем, кто дочитал до конца, успехов вам в ваших проектах, и как говорится: «треска вам, 47, и до встречи на других частотах! QRZ..»
Комментарии (27)
myxo
01.03.2016 01:15+5Я кончено извиняюсь, но для чего вы написали эту статью? Ни схем, ни инструкций. Пара фоточек + портянка чужого кода. Что мы должны отсюда вынести? Какой вы молодец?
ps. И зачем хаб Arduino?gleb_l
01.03.2016 01:30+1Автору 15 лет. Для такого возраста например качество изготовления печатной платы и монтажа — выше всяких похвал. То, что устройство скопировано, включая код — не проблема. Сегодня скопировано, завтра усовершенствовано, послезавтра — разработано с нуля. Из такого энтузиаста уже через 3 года (то есть уже на 1-2 курсе) может получиться специалист лучше, чем 90% окончивших институт бездельников и балаболов. Так что автор действительно молодец.
myxo
01.03.2016 01:34+4да нет, я не спорю, автор молодец (я вот так не умею делать). Но… зачем это на хабр?
IronHead
01.03.2016 11:33+3Эх, жалко, что в мои 15 лет не было хабра, тогда бы я тоже запостил, как делал цветомузыку на ОУ 140УД8 и тиристорах, а платы рисовал лаком для ногтей с помощью иголки…
gleb_l
01.03.2016 01:18+3Если у Вас индикаторы с общим анодом управляются npn-транзисторами (ссылка на КТ315) — значит эти транзисторы включены по схеме с ОК (то есть аноды индиаторов в эмиттерной цепи). А это в свою очередь означает, что напряжение питания недоиспользуется на величину падения Uбэ (порядка 0.7 В).
Судя по номиналу гасящего резистора (всего 10 Ом), яркости свечения в режиме динамической индикации не хватает (не знаю, в оригинальной конструкции, или в Вашем варианте), поэтому номинал этого резистора близок к 0.
Яркость же свечения индикаторов можно увеличить, либо управляя их общими цепями pnp-транзисторами, включив их по схеме с ОЭ (эмиттером на плюс, в коллекторе — общий анод) — будет ярче, т.к. Uкэ < Uбэ для насыщенного транзистора, либо вообще поставив p-канальные logic-level полевики (на параметры порядка 20В, 1А и каких-нибудь 20-50 миллиом канала — стоят копейки)
gleb_l
01.03.2016 01:22… только надо конечно не забыть программно проинвертировать выходы Dig1 — Dig4
TehnoPingvin
01.03.2016 08:54Их номинально питание ниже 5 вольт, поэтому падение на транзисторе и на резисторах вместе делают своё дело, не давая перегорать индикаторам. А светят более даже чем ярко, ночью иногда выключаю, так как всю комнату видно)
gleb_l
01.03.2016 09:57У (свето)диодов не может быть "питание в вольтах" — у них может быть только "ток в амперах", так как ВАХ у них очень крутая — дельта-U в пределах 20-30 милливольт может дать дельта-I в 80-100 миллиампер, а нормируется именно рабочий ток, от которого зависит яркость свечения.
В режиме динамической индикации яркость зависит от среднего тока через сегмент, который в Вашем случае в 4 раза меньше импульсного — поэтому схема раскачки сегментов должна иметь запас по пиковому току — иначе яркости может не хватить. Если Вам хватает — значит индикатор с высокой светоотдачей, и тогда можно ничего не переделывать (ну разве что в порядке эксперимента)
То, что легко можно сделать дальше самому — это прицепить фоторезистор, опрашивать его свободным выводом tiny (в режиме АЦП, либо измерением времени разряда конденсатора через фоторезистор до переключения логического входа), усреднять по времени, и регулировать яркость изменением скважности анодных импульсов в процедуре Refresh
Andy_Big
01.03.2016 02:31+1Часы — непременный этап :) Мои первые были на дискретной логике, добытой из самых разных девайсов (в основном из остатков каких-то ракет, вроде бы "воздух-земля") :) Тогда еще не было микроконтроллеров, и даже простейшие микросхемы (любые) в наших краях нужно было доставать по блату, т.к. купить было негде :) Был, правда, Посылторг, но в нем особого разнообразия не наблюдалось...
Rumlin
01.03.2016 08:37только оставлю их список
Для полноты не хватает уточнить размер индикаторов и итоговую стоимость.TehnoPingvin
01.03.2016 08:56Да, нужно добавить. Заодно и схему и разводку оставлю, народ негодует)
impetus
01.03.2016 12:35+2Да не будет этот народ вашу схему повторять, хоть пари заключай…
А схем часов и так навалом, тем более на стольдревнемпопулярном контроллере.
serafims
01.03.2016 12:08Помню, в радиокружке собирал, и железо было тем же самым). Только на ассемблере, и вручную приходилось общаться с часами,
а для отладки протокола написал даже примитивный логический анализатор, работающий через Com порт, и рисующий осциллограмму логическую сигналов..
ssg1712
01.03.2016 14:14+2Что мне делать? С одной стороны я не хочу такое видеть на хабре, с другой стороны минусовать молодежь не хочется...
POS_troi
01.03.2016 14:35Пусть будет, от GT не убудет а человек получит обратную связь и в следующий раз оформит статью хоть по нормальному.
А минусовать это самый плохой вариант выразить своё «Фиии», коммент в этом случае более эффективный метод.
Ну а что видеть и не видеть это уже задача мадераторов и адиминов :)
impetus
01.03.2016 16:03может быть DIY расщеплять надо — "для чайников"/"моя первая поделка" и суровый донецкий с термоядом и электронными микроскопами?
и да — пусть парень не просто получит обратную связь но и полновесный аккаунт на GT, тоже дело...Rumlin
01.03.2016 16:18Если делать "Подхаб", то придется запретить указывать в статье любые другие хабы DIY или Сделай сам, Arduino и прочее. Новичок будет не "в курсе" такого нюанса. И статьи всё равно будут там появляться. Логичнее сделать отдельный суровый хаб, но там тоже вопросы, что "достойно" там быть.
PKav
01.03.2016 22:03+1Я бы взял STM32F030F4P6. У него есть часы с календарем в виде встроенной периферии, больше ножек, меньше размер, и, что самое смешное, он в несколько раз дешевле. И ещё он позволит прикрутить к часам кучу всего, от термометра до синхронизации по GPS.
IronHead
02.03.2016 11:12Только вы забываете, что для attiny плату делать — это отдых: напечатал, прикатал, отодрал, вытравил, запаял любым паяльником.
А вот с stm с шагом 0,5 мм это уже не отдых, так что думаю 15 летнему пареньку лучше на тиньках начинать.PKav
02.03.2016 21:19По себе понял, что начинать надо сразу с более-менее сложного. Наломаешь в процессе и дров, и оборудования, но научишься быстрее и лучше.
А если какие-то проблемы с пайкой (чего при использовании флюса ЛТИ-120 не наблюдается вообще), можно купить переходник TSSOP-DIP.
В любом случае желаю не останавливаться на достигнутом, обвешать устройство новым функционалом, упереться в аппаратные ограничения контроллера и взяться за STM32 :)IronHead
02.03.2016 22:23Мне самому больше stm32 нравится, но тоже в 2008 году начинал с attiny2313 )
iliasam
Что-то ни схемы, ни разводки платы не видно.
Среда разработки не указана (на самом деле — Bascom-AVR), комментариев к коду нет, даже отступов нет.
Может, все же 73?
POS_troi
Может человек пока писал то облизывался на ГУ-47 :)
svd71
Вам нужна схема на подобный девайс? Сложности в этом абсолютно нет.
Очень даже вероятно, что все описанное вами автор где-то позаимствовал, переписав на бесик код. А значит гугль запросто поможет найти.
POS_troi
Да если передрал то простительно, вообще нынче изобрести что-то новое уже сложновато, да и смысл что-то изобретать в подобных часах когда есть испытанные временем классические схемы?
Автору намекнули что его статья не несёт смысловой нагрузки — без указанных компонентов. В данный момент выглядит не чем не лучше к примеру этого https://geektimes.ru/post/271712/
А так чего, увлёкся электроникой, травит платы сам, паяет а не собирает из кубиков готовых, респект.
К слову упоминание 47 и QRZ немного не к месту, а 47 ещё и не из той оперы :)