Мотив


Начну с того, что каждый человек живёт во времени, которое, к огромному сожалению, не возможно остановить. И раз мы живём в этом мире, то давайте следить за временем и не упускать ни минуты, тратя её впустую. Для этого я и сделал это чудесное устройство, по имени часы.
image

Начнём!


На улице встало солнце, я нарисовал плату и почесал на ксерокс, дабы напечатать плату

image

Дальше те, кто знают как изготавливаются платы поймут, что я перевёл рисунок утюгом на текстолит, протравил, залудил и т.д., а те, кто не в курсе — почитайте в интернете про изготовление плат методом ЛУТ — (Лазерно-утюжная технология).
результат я заснять забыл, но думаю, что качество будет видно и на готовой плате:

image

Видно места, которые не взялись, но ничего страшного не случилось, отстал только полигон.
Дальше нужно было запаять компоненты, на которых я особо останавливаться не буду, только оставлю их список:
  • 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мм)

И пускай вас не смущает длина этого списка, ведь мы собираем устройство на долгие года, и оно должно быть собрано на должном уровне!
Кто желает посмотреть на плату с другой стороны, вот фото:

image

Программа


Как и все устройства, часы нуждаются в программе. В данном случае программа написана на языке 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 килобайта кода в мк и наблюдаем как только-что ожившее устройство начало служить человеку.
Чесно сказать, я испытываю невероятное удовольствие от того, что могу создать нечто такое, что для многих далёкое и не понятное)
Так выглядит устройство без корпуса, корпус буду делать после написания статьи:

image

И так, часы готовы, а как они работают? Это я демонстрирую в первой половине этого видео (не прошу подписки или чего-то ещё, просто материал)



Заключение


Таким образом, за 2 дня я сделал устройство, которое покажет мне, сколько мне осталось заниматься одним делом и переходить к другому, когда пора идти, или начать что-то важное.
Ну а на этом всё, спасибо тем, кто дочитал до конца, успехов вам в ваших проектах, и как говорится: «треска вам, 47, и до встречи на других частотах! QRZ..»

Комментарии (27)


  1. iliasam
    01.03.2016 00:59
    +5

    Что-то ни схемы, ни разводки платы не видно.
    Среда разработки не указана (на самом деле — Bascom-AVR), комментариев к коду нет, даже отступов нет.

    47, и до встречи на других частотах!

    Может, все же 73?


    1. POS_troi
      01.03.2016 01:45

      Может человек пока писал то облизывался на ГУ-47 :)


    1. svd71
      01.03.2016 10:49
      -1

      Вам нужна схема на подобный девайс? Сложности в этом абсолютно нет.

      Очень даже вероятно, что все описанное вами автор где-то позаимствовал, переписав на бесик код. А значит гугль запросто поможет найти.


      1. POS_troi
        01.03.2016 12:36
        +2

        Да если передрал то простительно, вообще нынче изобрести что-то новое уже сложновато, да и смысл что-то изобретать в подобных часах когда есть испытанные временем классические схемы?

        Автору намекнули что его статья не несёт смысловой нагрузки — без указанных компонентов. В данный момент выглядит не чем не лучше к примеру этого https://geektimes.ru/post/271712/

        А так чего, увлёкся электроникой, травит платы сам, паяет а не собирает из кубиков готовых, респект.

        К слову упоминание 47 и QRZ немного не к месту, а 47 ещё и не из той оперы :)


  1. myxo
    01.03.2016 01:15
    +5

    Я кончено извиняюсь, но для чего вы написали эту статью? Ни схем, ни инструкций. Пара фоточек + портянка чужого кода. Что мы должны отсюда вынести? Какой вы молодец?
    ps. И зачем хаб Arduino?


    1. gleb_l
      01.03.2016 01:30
      +1

      Автору 15 лет. Для такого возраста например качество изготовления печатной платы и монтажа — выше всяких похвал. То, что устройство скопировано, включая код — не проблема. Сегодня скопировано, завтра усовершенствовано, послезавтра — разработано с нуля. Из такого энтузиаста уже через 3 года (то есть уже на 1-2 курсе) может получиться специалист лучше, чем 90% окончивших институт бездельников и балаболов. Так что автор действительно молодец.


      1. myxo
        01.03.2016 01:34
        +4

        да нет, я не спорю, автор молодец (я вот так не умею делать). Но… зачем это на хабр?


      1. IronHead
        01.03.2016 11:33
        +3

        Эх, жалко, что в мои 15 лет не было хабра, тогда бы я тоже запостил, как делал цветомузыку на ОУ 140УД8 и тиристорах, а платы рисовал лаком для ногтей с помощью иголки…


        1. POS_troi
          01.03.2016 14:29
          +1

          Забыл про то как лампочки цапонлаком красили :)


          1. IronHead
            01.03.2016 14:42
            +1

            Точно! Было дело, но они выгорали быстро, поэтому я нашел стекла от светофора и вставил в тракторные фары. Вот это было диско!


  1. 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 миллиом канала — стоят копейки)


    1. gleb_l
      01.03.2016 01:22

      … только надо конечно не забыть программно проинвертировать выходы Dig1 — Dig4


    1. TehnoPingvin
      01.03.2016 08:54

      Их номинально питание ниже 5 вольт, поэтому падение на транзисторе и на резисторах вместе делают своё дело, не давая перегорать индикаторам. А светят более даже чем ярко, ночью иногда выключаю, так как всю комнату видно)


      1. gleb_l
        01.03.2016 09:57

        У (свето)диодов не может быть "питание в вольтах" — у них может быть только "ток в амперах", так как ВАХ у них очень крутая — дельта-U в пределах 20-30 милливольт может дать дельта-I в 80-100 миллиампер, а нормируется именно рабочий ток, от которого зависит яркость свечения.

        В режиме динамической индикации яркость зависит от среднего тока через сегмент, который в Вашем случае в 4 раза меньше импульсного — поэтому схема раскачки сегментов должна иметь запас по пиковому току — иначе яркости может не хватить. Если Вам хватает — значит индикатор с высокой светоотдачей, и тогда можно ничего не переделывать (ну разве что в порядке эксперимента)

        То, что легко можно сделать дальше самому — это прицепить фоторезистор, опрашивать его свободным выводом tiny (в режиме АЦП, либо измерением времени разряда конденсатора через фоторезистор до переключения логического входа), усреднять по времени, и регулировать яркость изменением скважности анодных импульсов в процедуре Refresh


  1. Andy_Big
    01.03.2016 02:31
    +1

    Часы — непременный этап :) Мои первые были на дискретной логике, добытой из самых разных девайсов (в основном из остатков каких-то ракет, вроде бы "воздух-земля") :) Тогда еще не было микроконтроллеров, и даже простейшие микросхемы (любые) в наших краях нужно было доставать по блату, т.к. купить было негде :) Был, правда, Посылторг, но в нем особого разнообразия не наблюдалось...


  1. Rumlin
    01.03.2016 08:37

    только оставлю их список

    Для полноты не хватает уточнить размер индикаторов и итоговую стоимость.


    1. TehnoPingvin
      01.03.2016 08:56

      Да, нужно добавить. Заодно и схему и разводку оставлю, народ негодует)


      1. impetus
        01.03.2016 12:35
        +2

        Да не будет этот народ вашу схему повторять, хоть пари заключай…
        А схем часов и так навалом, тем более на столь древнем популярном контроллере.


  1. serafims
    01.03.2016 12:08

    Помню, в радиокружке собирал, и железо было тем же самым). Только на ассемблере, и вручную приходилось общаться с часами,
    а для отладки протокола написал даже примитивный логический анализатор, работающий через Com порт, и рисующий осциллограмму логическую сигналов..


  1. ssg1712
    01.03.2016 14:14
    +2

    Что мне делать? С одной стороны я не хочу такое видеть на хабре, с другой стороны минусовать молодежь не хочется...


    1. POS_troi
      01.03.2016 14:35

      Пусть будет, от GT не убудет а человек получит обратную связь и в следующий раз оформит статью хоть по нормальному.
      А минусовать это самый плохой вариант выразить своё «Фиии», коммент в этом случае более эффективный метод.

      Ну а что видеть и не видеть это уже задача мадераторов и адиминов :)


    1. impetus
      01.03.2016 16:03

      может быть DIY расщеплять надо — "для чайников"/"моя первая поделка" и суровый донецкий с термоядом и электронными микроскопами?
      и да — пусть парень не просто получит обратную связь но и полновесный аккаунт на GT, тоже дело...


      1. Rumlin
        01.03.2016 16:18

        Если делать "Подхаб", то придется запретить указывать в статье любые другие хабы DIY или Сделай сам, Arduino и прочее. Новичок будет не "в курсе" такого нюанса. И статьи всё равно будут там появляться. Логичнее сделать отдельный суровый хаб, но там тоже вопросы, что "достойно" там быть.


  1. PKav
    01.03.2016 22:03
    +1

    Я бы взял STM32F030F4P6. У него есть часы с календарем в виде встроенной периферии, больше ножек, меньше размер, и, что самое смешное, он в несколько раз дешевле. И ещё он позволит прикрутить к часам кучу всего, от термометра до синхронизации по GPS.


    1. IronHead
      02.03.2016 11:12

      Только вы забываете, что для attiny плату делать — это отдых: напечатал, прикатал, отодрал, вытравил, запаял любым паяльником.
      А вот с stm с шагом 0,5 мм это уже не отдых, так что думаю 15 летнему пареньку лучше на тиньках начинать.


      1. PKav
        02.03.2016 21:19

        По себе понял, что начинать надо сразу с более-менее сложного. Наломаешь в процессе и дров, и оборудования, но научишься быстрее и лучше.
        А если какие-то проблемы с пайкой (чего при использовании флюса ЛТИ-120 не наблюдается вообще), можно купить переходник TSSOP-DIP.

        В любом случае желаю не останавливаться на достигнутом, обвешать устройство новым функционалом, упереться в аппаратные ограничения контроллера и взяться за STM32 :)


        1. IronHead
          02.03.2016 22:23

          Мне самому больше stm32 нравится, но тоже в 2008 году начинал с attiny2313 )