Хардкорный Валентин

8-е марта близко-близко,
и сердце бьётся как олень...


В преддверии наступающих праздников решил выложить свой вариант валентинки, сохранившийся ровненько с прошлого года:
heart.png

Ну, с назначением валентинки всё понятно, будем разбираться с устройством.
Схема:
sch_.png
(Извините за качество картинки, sPlan меня уже достал, а Eagle я ещё не освоил).

Изначальная конструкция состояла из ATtiny26 + 2N3904 + 2N3906 (по 8 штук каждого), но они отнимали слишком много места на макетке, и я решил от них отказаться.
2n390x.png
А ещё в процессе выяснилось, что из всего порта D на моём STK500 доступно только 6 пинов, а совсем не 8, поэтому я вообще решил перейти на последовательный вывод (а потом и вовсе отказался от STK500).
Так как светодиоды кушают под 20мА каждый, я не рискнул ставить только 74HC595 (у неё ограничение в 70мА через питание/землю, а при включении восьми светодиодов одновременно — получается 160мА, многовато) и начал искать драйверы.
В качестве нижнего плеча нашлись ULN2803 (восьмибитный аналог популярной ULN2003), верхнее плечо — UDN2981A. Однако 4 корпуса тоже не очень хорошо умещались на макетке, и я продолжил поиски. В итоге нашёл TPIC6B595, которая представляет собой гибрид из 74HC595 и ULN2803. Увы, верхнее плечо так и осталось на UDN.
Прошивка тривиальна: выводит построчно картинку, причём каждая строка выводится последовательно (из тиньки в регистр). В строке могут гореть сразу несколько светодиодов, управляются они через TPIC6B595. Конкретная текущая строка выбирается через UDN.
Чтобы сэкономить выводы и упростить вывод я соединил последовательно оба сдвиговых регистра. В результате для управления нужно всего 3 ноги: данные, клок, защёлка.
Собственно, программа предельно проста:

#include <avr/io.h>
#include <avr/cpufunc.h>
#include <avr/pgmspace.h>

#define F_CPU 4000000UL
#include <util/delay.h>

/*
--------
-**--**- 01100110 0x66
******** 11111111 0xFF
******** 11111111 0xFF
-******- 01111110 0x7E
--****-- 00111100 0x3C
---**--- 00011000 0x18
--------
*/

/*
 *     *|0100 0001 41
   *   *|0001 0001 11
    * * |0000 1010 0A
    *** |0000 1110 0E
  ** ***|0011 0111 37
 *******|0111 1111 7F
  ******|0011 1111 3F
    *** |0000 1110 0E
*/

#define DATA PA0  // white
#define CLK PA1   // green
#define LATCH PA2 // yellow
#define IO PORTA
#define DDIO DDRA

typedef unsigned char BYTE;

const BYTE img[8] PROGMEM = {
  0x00, 0x66, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00
//  0x41, 0x11, 0x0A, 0x0E, 0x37, 0x7F, 0x3F, 0x0E
};

void OutByte(BYTE row) {
  for (int i = 0; i < 8; i++) {
    // set data bit
    if (row & 0x01)
      IO |= (1 << DATA);
    else
      IO &= ~(1 << DATA);
    row >>= 1;
    // shift into 74595
    IO |= (1 << CLK);
    IO &= ~(1 << CLK);
  }
}

void OutRow(BYTE row, BYTE col) {
  OutByte(col);
  OutByte(row);
  // latch it!
  IO |= (1 << LATCH);
  IO &= ~(1 << LATCH);
}

int main(void) {
  DDIO |= (1 << CLK) | (1 << DATA) | (1 << LATCH);
  IO = 0;
  while (1) {
    for (int i = 0; i < 8; i++) {
      BYTE row = pgm_read_byte(&img[i]);
      OutRow(row, 1 << i);
      _delay_us(500);
    }
  }

  return 0;
}

Написана на языке Си, в качестве среды разработки я использовал Code::Blocks (поэтому make файлов нет, среда как-то сама собирает проект).
Собрано всё на двух монтажках (breadboard). В принципе можно взять монтажку побольше и всё собрать на ней, ибо к тиньке подключается только питание и кварц.
Матрицу можно взять любую 8x8. Можно даже зелёную:
green.png

Итоговая железка:
IMG_6289.JPG
IMG_6291.JPG

Прошивалось всё через обычный AVR ISP mkII, софтина — atprogram.exe, из состава Atmel Studio. Батники для прошивки:

"C:\Program Files\Atmel\Atmel Studio 6.2\atbackend\atprogram.exe" -v -i isp -t avrispmk2 -cl 125khz -d attiny26 chiperase
"C:\Program Files\Atmel\Atmel Studio 6.2\atbackend\atprogram.exe" -v -i isp -t avrispmk2 -cl 125khz -d attiny26 program -f heart.hex
"C:\Program Files\Atmel\Atmel Studio 6.2\atbackend\atprogram.exe" -v -i isp -t avrispmk2 -cl 125khz -d attiny26 verify -fl -f heart.hex

Для заливки фьюзов батник такой:

"C:\Program Files\Atmel\Atmel Studio 6.2\atbackend\atprogram.exe" -v -i isp -t avrispmk2 -cl 125khz -d attiny26 write -fs --values DFF4
REM Порядок фьюзов при записи: LOW HIGH

Фьюзы переключают тиньку на работу с кварцем, включают BODEN, уровень 4В.
Файлики проекта положил сюда.
Печатную плату не рисовал.
Про альтернативу на MAX7219 слышал, обязательно попробую в следующий раз :)

Схемы включения самой тиньки нет, там только кварц, питание и ISP. Номера ног для данные/клок/защёлка есть в исходниках, можно выбрать любые.

Enjoy!

Что интересно, в процессе написания я перепутал местами col и row и… не заметил разницы. Удивительное рядом. Ошибку нашёл лишь перечитывая своё же описание :)

ЗЫ: Для гурманов в исходниках есть цифры для альтернативной картинки. Правда, угадать её в 64 пикселях почти нереально ;)

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

RSS свернуть / развернуть
+1
В чем фишка codeblocks::?
0
  • avatar
  • Jman
  • 13 февраля 2016, 23:42
Так уж получилось, что Atmel Studio на моей машине внезапно сломалась. Напрочь. И починить её не удалось.
Поэтому пришлось искать альтернативы.
Code::Blocks оказался вполне приличным IDE чему я очень рад :)
Про него здесь уже не раз писали, он подходит не только для AVR-ок.
0
Я раньше использовал CVAVR. Но вы знаете, неделю как сижу в Atmel Studio7, после него к кодвижну даже неохото возвращаться, разве что только ради генератора настройки периферии.
0
и сердце бьётся как олень...
я аж подпрыгнул на месте

вот от таких подарочков и становятся аленями
www.youtube.com/watch?v=VqJGUrOL1sM
0
(Извините за качество картинки, sPlan меня уже достал, а Eagle я ещё не освоил).
Такие вещи лучше сканировать в ЧБ режиме. Правда, оно может разлиновку увидеть.
ЗЫ: Для гурманов в исходниках есть цифры для альтернативной картинки. Правда, угадать её в 64 пикселях почти нереально ;)
Действительно. Что там изображено? Тоже сердечко?
P.S. Что за зеленая фиговина на предпоследней картинке, служащая подставкой для матрицы?
0
  • avatar
  • Vga
  • 14 февраля 2016, 10:50
Подставка это фигурный компостер. типа таких, какие были для билетов, но не с дырочками а всякими рисунками. Они каким-то образом применяются к детям.
0
Точно!
Применяется для развлечения детей.
0
Такие вещи лучше сканировать в ЧБ режиме. Правда, оно может разлиновку увидеть.
Спасибо, попробую.
Действительно. Что там изображено? Тоже сердечко?
Я пытался нарисовать playboy-ного зайчика. Видимо не удалось :)

skelet прав. Это фигурный дырокол. Позволяет засыпать всю квартиру красивыми обрезками бумаги. Сфоткал:
IMG_6294.JPG
По клику можно посмотреть крупнее.
0
Хардкорный Валентин

валентинка от софтваре разработчиков

(x^2 + y^2 – 1)^3 – x^2*y^3 = 0

Когда-то я своей жене написал на открытке эту формулу. Она взяла ручку, и на той же открытке нашла корни уравнения — люблю ее :)
+2
  • avatar
  • e_mc2
  • 14 февраля 2016, 22:57
Вернее не корни, а частные случаи решения равенства.
0
Мда… у математиков своеобразное чувство юмора.
+1
Эх… А нас только программированию учили :)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.