Мой регион: Россия

RDC1-0009, Цифровое сердце

Артикул: RDC1-0009
Ном. номер: 9000325918
Производитель: DIY
RDC1-0009, Цифровое сердце
653.50 руб.
Это набор компонентов
(см.спецификацию ниже)
Добавить в корзину 1 шт. на сумму 653.50 руб.

Спецификация набора

То, что у вас уже есть, вы можете удалить в корзине.

НаименованиеЦенаКол-во
Печатная плата rdc1-0009 h, Печатная плата с разводкой, FR4 56.9х54.2мм (1.5мм, 18мкм) 150 руб. 1
MCP73831T-2ACI/OT, Контроллер заряда батарей Li-Ion/Li-Pol 15mA to 500mA 4.2V [SOT-23-5] 36 руб. 1
Кер.ЧИП конд. 0.1 мкФ Y5V 50В,+80-20%, 0805 4 руб. 3
0.125Вт 0805 360 Ом, 1%, Чип резистор (SMD) 0.90 руб. 22
0.125Вт 0805 2 кОм, 5%, Чип резистор (SMD) 0.90 руб. 1
0.125Вт 0805 10 кОм, 1%, Чип резистор (SMD) 0.90 руб. 2
BSS138-7-F, Транзистор, MOSFET, N-канал, 0.2А, 50В, [SOT-23] 5 руб. 1
TO-1608BC-MRE, Светодиод красный SMD 1608, 112мКд, 120°, 630нМ (Ultra Bright Red) 5 руб. 22
MiniUSB-A, Розетка 5-контактная SMD на плату 22 руб. 1
KLS7-SS-12F19-G5, Переключатель движковый 6 руб. 1
VIBRATING-MOTOR, Плоский вибромотор 10мм 3В для Arduino проектов 130 руб. 1
ATmega168V-10AU with bootloader arduino Lilypad, Микроконтроллер с предустановленным загрузчиком Arduino Lilypad 160 руб. 1

Это цифровое, светодиодное сердце будет отличным подарком девушке ко Дню Влюбленных, 8 Марта, или на День рождения.
21 светодиод расположены по периметру печатной платы в виде сердца. Все они управляются микроконтроллером ATmega328. В демонстрационном скетче прописаны несколько эффектов оживляющих сердце. Скетч загружается с помощью любого контроллера Arduino. Но главная изюминка это вибромоторчик от смартфона расположенный на тыльной стороне. Он создает эффект бьющегося в такт световым эффектам сердца. Скетч легко изменить, если вы придумаете новые световые эффекты и частоту стука сердца.
На тыльной стороне сердца есть зарядное устройство для Li-ion аккумуляторов, которое будет подзаряжать ваше сердце через порт Mini USB. Схема зарядного устройства собрана на микросхеме MCP73831T. Схема включения стандартная из описания на микросхему.
Все детали проекта открыты для свободного использования. Проект созданный в KiCAD можно скачать в приложении.

Внешний вид устройства

Внешний вид

Внешний вид

Технические параметры

Размер - 50 х 50 мм.
Источник питания – Li-Ion или Li-Pol аккумулятор 3,7В

Электрическая схема

Электрическая схема

Это открытый проект! Лицензия, под которой он распространяется – Creative Commons - Attribution - Share Alike license. Проект выполнен в KiCad. Любые файлы доступны для скачивания.

Инструкция по программированию.

В этом разделе вы оживите электронное сердце. Запишите загрузчик в новый микроконтроллер, а затем скетч с эффектами
Для записи загрузчика, а затем скетчей в модуль RDC1-0009 “Цифровое сердце” можно использовать любую плату Arduino на которой есть разъем Arduino ISP.
Рассмотрим пример для платы Arduino Uno (Ванилин). Сделайте соединения как показано на рисунке.

Новая плата

1. Запустите на ПК Arduino IDE.

2. На главном меню найдите вкладку «Инструменты» в ней пункт «Плата:…». Выберите плату – Arduino/Genuino Uno.

UNO

3. В пункте «Порт» выберите тот порт, который был назначен операционной системой вашей плате Arduino Uno. Например COM11.

COM порт

4. Заходите в пункт главного меню «Файл» -> Примеры –> 11.ArduinoISP и нажимайте ArduinoISP.

ArduinoISP

5. Откроется новый скетч «ArduinoISP» Загрузите его в свою плату. После загрузки этого скетча с помощью вашей Arduino UNO уже можно будет программировать «Цифровое сердце».

Новый скетч

6. Перед программированием RDC1-0009 нужно сделать ещё один шаг – «Добавить новую плату в Arduino IDE». Вам будет нужна дополнительная плата - «ATmega168 (8 MHz internal clock)». Такой микроконтроллер вы установили в сердце. Скачайте архив «boards» в разделе Документы. В папке со скетчами создайте папку «hardware». Размещение папки со скетчами можно узнать, выбрав «Файл – Настройки».

Новая плата

Новая плата

Распакуйте скаченный файл в созданную папку «hardware». Должно получиться примерно так: «C:\Users\имя пользователя\Documents\Arduino\hardware\breadboard». Перезапустите Arduino IDE. Если сделали все правильно, в списке плат появиться строка «ATmega168 (8 MHz internal clock)»

7. На этом этапе у вас уже всё готово к загрузке нового скетча в RDC1-0009. Откройте ваш скетч в Arduino IDE. Затем проверьте что в пункте меню «Инструменты» должен быть выбран программатор «Arduino as ISP»

Новая плата

В «Инструментах» выберите плату «ATmega168 (8 MHz internal clock)».

Новая плата

Запишите загрузчик в новый микроконтроллер. В «Инструментах» выберите «Записать загрузчик»
Внимание! Загрузчик записывается в новый микроконтроллер только один раз!

Новая плата

И сразу загрузите скетч в сердце «Через программатор».

Новая плата

Попробуйте скетч «Heart» из раздела «Документация». Не понравится, загрузите скетч «RDC1-0009», который загружается при производстве сердца RDC1-0009 на фабрике. Он в окне просмотра.

Скетч. Код программы

void setup()
{ 
  DDRB = 0xFF;
  PORTB = 0xFF;

  DDRC = 0x3F;
  PORTC = 0x3F;

  DDRD = 0xFF;
  PORTD = 0x7F;
}
//------------------------------------------------------
void loop()
{ 
  for (byte j = 0; j < 3; j++)
    Effect_1();
  for (byte j = 0; j < 3; j++)
    Effect_2();
  for (byte j = 0; j < 3; j++)
    Effect_3();
  for (byte j = 0; j < 3; j++)
    Effect_4();
  for (byte j = 0; j < 3; j++)
    Effect_5();
    
  Effect_6();
  
  for (byte j = 0; j < 3; j++)
  {
    for (unsigned int i = 0; i < 30000; i++)
    Effect_7();
  }
  
  for (byte j = 0; j < 3; j++)
    Effect_8();
  for (byte j = 0; j < 3; j++)
    Effect_9();
  for (byte j = 0; j < 3; j++)
    Effect_10();
  for (byte j = 0; j < 3; j++)
    Effect_11();
}
//------------------------------------------------------------
//Эффект 1
void Effect_1()
{
  for (byte j = 0; j <= 7; j++)
  {
    PORTB &= ~(1 << j);
    delay(75);
  }

  for (byte j = 0; j <= 5; j++)
  {
    PORTC &= ~(1 << j);
    delay(75);
  }

  for (byte j = 0; j < 7; j++)
  {
    PORTD &= ~(1 << j);
    delay(75);
  }

  for (byte j = 0; j < 2; j++)
  {
    All_OFF();
    delay(150);
    All_ON();
    delay(150);
  }

  All_OFF();
}
//---------------------------------------------------------
//Эффект 2
void Effect_2()
{
  for (byte j = 0; j <= 7; j++)
  {
    PORTB &= ~(1 << j);
    delay(75);
    PORTB |= (1 << j);
  }

  for (byte j = 0; j <= 5; j++)
  {
    PORTC &= ~(1 << j);
    delay(75);
    PORTC |= (1 << j);
  }

  for (byte j = 0; j < 7; j++)
  {
    PORTD &= ~(1 << j);
    delay(75);
    PORTD |= (1 << j);
  }
}
//---------------------------------------------------------
//Эффект 3
void Effect_3()
{
  byte Value;
  boolean ClearFlag;
    
  //включение
  while ((PORTB != 0) || ((PORTC & 0x3F) != 0) || ((PORTD & 0x7F) != 0))
  {
    //PORTB
    if (PORTB != 0)
    {
      Value = random(0, 8);
      ClearFlag = false;
      if ((PORTB & (1 << Value)) != (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTB & (1 << j)) == (1 << j))
          {
            PORTB &= ~(1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTB & (1 << j)) == (1 << j))
            {
              PORTB &= ~(1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTB &= ~(1 << Value);
      }
    }
    //PORTC
    if ((PORTC & 0x3F) != 0)
    {
      Value = random(0, 6);
      ClearFlag = false;
      if ((PORTC & (1 << Value)) != (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTC & (1 << j)) == (1 << j))
          {
            PORTC &= ~(1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTC & (1 << j)) == (1 << j))
            {
              PORTC &= ~(1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTC &= ~(1 << Value);
      }
    }
    //PORTD
    if ((PORTD & 0x7F) != 0)
    {
      Value = random(0, 7);
      ClearFlag = false;
      if ((PORTD & (1 << Value)) != (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTD & (1 << j)) == (1 << j))
          {
            PORTD &= ~(1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTD & (1 << j)) == (1 << j))
            {
              PORTD &= ~(1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTD &= ~(1 << Value);
      }
    }

      delay(150);
  }
    
  delay(1000);

  //выключение
  while ((PORTB != 0xFF) || ((PORTC & 0x3F) != 0x3F) || ((PORTD & 0x7F) != 0x7F))
  {
    //PORTB
    if (PORTB != 0xFF)
    {      
      Value = random(0, 8);
      ClearFlag = false;
      if ((PORTB & (1 << Value)) == (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTB & (1 << j)) != (1 << j))
          {
            PORTB |= (1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTB & (1 << j)) != (1 << j))
            {
              PORTB |= (1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTB |= (1 << Value);
      }
    }
    //PORTC
    if ((PORTC & 0x3F) != 0x3F)
    {
      Value = random(0, 6);
      ClearFlag = false;
      if ((PORTC & (1 << Value)) == (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTC & (1 << j)) != (1 << j))
          {
            PORTC |= (1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTC & (1 << j)) != (1 << j))
            {
              PORTC |= (1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTC |= (1 << Value);
      }
    }
    //PORTD
    if ((PORTD & 0x7F) != 0x7F)
    {
      Value = random(0, 7);
      ClearFlag = false;
      if ((PORTD & (1 << Value)) == (1 << Value))
      {
        for (byte j = Value; j < 7; j++)
        {
          if ((PORTD & (1 << j)) != (1 << j))
          {
            PORTD |= (1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTD & (1 << j)) != (1 << j))
            {
              PORTD |= (1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTD |= (1 << Value);
      }
    }

    delay(150);
  }
    
  delay(1000);
}
//------------------------------------------------------------
//Эффект 4
void Effect_4()
{ 
  All_ON();
  delay(750);
  All_OFF();
  delay(750); 
}
//---------------------------------------------------------
//Эффект 5
void Effect_5()
{
  PORTB &= ~(1 << 0);
  delay(75);
  
  for (byte i = 1; i <= 7; i++)
  {
    PORTB &= ~(1 << i);
    PORTD &= ~(1 << (7 - i));
    delay(75);
  }

  for (byte i = 0; i <= 2; i++)
  {
    PORTC &= ~((1 << i) | (1 << (5 - i)));
    delay(75);
  }
  
  delay(750);

  for (byte i = 3; i <= 5; i++)
  {
    PORTC |= ((1 << (5 - i)) | (1 << i));
    delay(75);
  }

  for (byte i = 7; i >= 1; i--)
  {
    PORTB |= (1 << i);
    PORTD |= (1 << (7 - i));
    delay(75);
  }

  PORTB |= (1 << 0);
  delay(75);

  delay(750);
}
//---------------------------------------------------------
//Эффект 6
void Effect_6()
{
  const unsigned int DotUnit = 100;
  const unsigned int DashUnit = 3 * DotUnit;
  const unsigned int WordSpace = 7 * DotUnit;

  //РЇ
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
    //-
    All_ON();
    delay(DashUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между словами
  delay(WordSpace - DotUnit);

  //тебя
  //С‚
  // -
  All_ON();
  delay(DashUnit);
  All_OFF();
  //пауЕа между буквами
  delay(DashUnit);
  //Рµ
  //.
  All_ON();
  delay(DotUnit);
  All_OFF();
  //пауЕа между буквами
  delay(DashUnit);
  //Р±
  //-
  All_ON();
  delay(DashUnit);
  All_OFF();
  delay(DotUnit);
  for (byte i = 0; i < 3; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);

  //СЏ
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
    //-
    All_ON();
    delay(DashUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между словами
  delay(WordSpace - DotUnit);

  //люблю
  //Р»
  //.
  All_ON();
  delay(DotUnit);
  All_OFF();
  delay(DotUnit);
  //-
  All_ON();
  delay(DashUnit);
  All_OFF();
  delay(DotUnit);
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);
  //СЋ
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  for (byte i = 0; i < 2; i++)
  {
    //-
    All_ON();
    delay(DashUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);
  //Р±
  //-
  All_ON();
  delay(DashUnit);
  All_OFF();
  delay(DotUnit);
  for (byte i = 0; i < 3; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);
  //Р»
  //.
  All_ON();
  delay(DotUnit);
  All_OFF();
  delay(DotUnit);
  //-
  All_ON();
  delay(DashUnit);
  All_OFF();
  delay(DotUnit);
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);
  //СЋ
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  for (byte i = 0; i < 2; i++)
  {
    //-
    All_ON();
    delay(DashUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между словами
  delay(WordSpace - DotUnit);
}
//---------------------------------------------------------
//Эффект 7
void Effect_7()
{
  const byte BrightnessRate = 100;
  const byte Period = 100;
  static byte PeriodCounter = 0;
  static boolean State = false;
  static byte DutyCycle = 0;
  static byte DutyCycleCounter = 0;
  
  delayMicroseconds(200);

  DutyCycleCounter++;
  
  if (DutyCycleCounter == BrightnessRate)
  {
    if (!State)
    {
      DutyCycle++;
      if (DutyCycle == PeriodCounter)
      {
        State = true;
      }
    }
  
    else
    {
      DutyCycle--;
      if (DutyCycle == 0)
      {
        State = false;
      }
    }

    DutyCycleCounter = 0;
  }

  if (PeriodCounter < DutyCycle)
    All_ON();
  else
    All_OFF();
  
  PeriodCounter++;

  if (PeriodCounter == Period)
    PeriodCounter = 0;
}
//----------------------------------------------
//Эффект 8
void Effect_8() 
{
  All_OFF();
  PORTB &= ~((1 << 0) | (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7));
  PORTC &= ~((1 << 1) | (1 << 4));
  PORTD &= ~((1 << 0) | (1 << 2) | (1 << 4) | (1 << 6));
  delay(300);
  All_OFF();
  PORTB &= ~((1 << 0) | (1 << 2) | (1 << 4) | (1 << 6));
  PORTC &= ~((1 << 0) | (1 << 2) | (1 << 3) | (1 << 5));
  PORTD &= ~((1 << 1) | (1 << 3) | (1 << 5));
  delay(300);
}
//----------------------------------------------
//Эффект 9
void Effect_9() 
{
  All_OFF();
  PORTB = 0;
  PORTC &= ~((1 << 0) | (1 << 1) | (1 << 2));
  delay(300);
  All_OFF();
  PORTB &= ~(1 << 0);
  PORTC &= ~((1 << 3) | (1 << 4) | (1 << 5));
  PORTD = 0;
  delay(300);
}
//----------------------------------------------
//Эффект 10
void Effect_10()
{  
  PORTB &= ~(1 << 0);

  for (byte i = 1; i <= 7; i++)
  {
    PORTB &= ~(1 << i);
    if (i < 4)
      PORTC |= (1 << (i + 2));
    else
      PORTD |= (1 << (i - 4));
    delay(150);    
  }

  for (byte i = 0; i <= 2; i++)
  {
    PORTC &= ~(1 << i);
    PORTD |= (1 << (i + 4));
    delay(150);    
  }

  for (byte i = 7; i >= 1; i--)
  {
    PORTD &= ~(1 << (i - 1));
    if (i > 4)
      PORTC |= (1 << (i - 5));
    else
      PORTB |= (1 << (i + 3));
    delay(150);
  }

  for (byte i = 5; i >= 3; i--)
  {
    PORTC &= ~(1 << i);
    PORTB |= (1 << (i - 2));
    delay(150);    
  }
}
//----------------------------------------------
//Эффект 11
void Effect_11()
{
  PORTB &= ~(1 << 0);
  
  for (byte i = 7; i >= 1; i--)
  {
    PORTD &= ~(1 << (i - 1));
    if (i > 4)
      PORTC &= ~(1 << (i - 5));
    else
      PORTB &= ~(1 << (i + 3));
    delay(150);
  }

  for (byte i = 5; i >= 3; i--)
  {
    PORTC &= ~(1 << i);
    PORTB &= ~(1 << (i - 2));
    delay(150);    
  }

  for (byte i = 1; i <= 7; i++)
  {
    PORTB |= (1 << i);
    if (i < 4)
      PORTC |= (1 << (i + 2));
    else
      PORTD |= (1 << (i - 4));
    delay(150);    
  }

  for (byte i = 0; i <= 2; i++)
  {
    PORTC |= (1 << i);
    PORTD |= (1 << (i + 4));
    delay(150);    
  }

  PORTB |= (1 << 0);
  delay(150);
}
//----------------------------------------------
void All_ON()
{
  PORTB = 0;
  PORTC = 0;
  PORTD = 0x80;
}
//----------------------------------------------
void All_OFF()
{
  PORTB = 0xFF;
  PORTC = 0x3F;
  PORTD = 0x7F;
}

Техническая документация

Видео

Выберите регион, чтобы увидеть способы получения товара.

Комментарии