Arduino attiny85: младшая линейка микроконтроллеров

Проект на голом МК

Зачем делать проект на своей плате и голом микроконтроллере?

Конечно же размер, своя плата получится компактнее в большинстве случаев.
Энергопотребление. Ни для кого не секрет, что всякие удобные штуки на плате ардуино потребляют огромный по меркам энергосбережения ток, и для автономного устройства лучше взять голый камушек.
Работая с голым камнем мы можем выбрать микроконтроллер под свои задачи. Например для мелкого проекта необязательно брать 328 мегу, если с задачей справится аттини13, которая стоит 20 рублей.
Возможная экономия. Ардуино нано стоит условно 170 рублей без доставки. Голая 328 мега на том же алиэкспресс – 100 рублей. Если брать десяток. В дорогущем российском чип и дип – 190 рублей. То есть если очень приспичит – можно и тут купить без особых потерь, потому что оригинальная нано стоит 3 тысячи рублей в том же ЧИДе.
Удобство разводки платы. Микросхема в корпусе под поверхностный монтаж находится на одном слое и не мешает дорожкам на другом слое.
Удобство монтажа. Даже если делать свою плату прототип лутом, то припаять на неё чип в 100 раз удобнее и быстрее, чем сверлить три десятка отверстий под ардуину, а потом их запаивать.
Мелкосерийное производство готовых или почти готовых плат, для себя если нужно несколько или на продажу

На том же jlcpcb можно заказать изготовление плат с распайкой внимание smd компонентов. То есть ардуину вам никто не припаяет, а вот ту же 328 мегу припаяют за 100 рублей, тиньку 13ю – за 35 рублей, а чем больше партия – тем дешевле

К этому вопросу мы вернёмся ближе к концу этого урока.

Итак, я на личном опыте убедился, что МК способен работать вообще без какой-либо обвязки. Это был проект “Читалка файлов с SD карты” на базе ATmega328. Проект достаточно непростой: МК читал текстовые файлы с карты памяти microSD и выводил их на OLED дисплей. Никаких лишних компонентов на плате нет, МК тактируется от внутренних 8 МГц и всё работает отлично. Даже карта памяти подключена напрямую к МК =) Но в надёжных устройствах делать так не рекомендуется! Что следует помнить и делать по возможности:

Соединять все ноги VCC максимально толстыми дорожками между собой
Соединять все ноги GND максимально толстыми дорожками между собой (а ещё лучше делать заливку полигоном GND)
Поставить керамический конденсатор (~100 нФ) по питанию МК (между VCC и GND) максимально близко к пинам питания
Поставить электролит или тантал на 10-47 мкФ по питанию. Особенно если МК питается от одного источника с другими потребителями

Рекомендуется подтягивать пин RSTЕсли нужна кнопка сброса (reset), цепляем её к RST и на GND к питанию (VCC) резистором на 10 кОм
Если нужен внешний тактовый генератор – подключаем его между пинами XTAL1 и XTAL2 Не забываем в настройках платы или напрямую во фьюзах поставить внешнее тактирование

ВНИМАНИЕ! Если фьюзы настроены на внешнее тактирование и внешний генератор не подключен к пинам – вы не сможете прошить МК даже при помощи ISP программатора!
(см. распиновку своего МК), и оба пина подключаем к GND через керамические конденсаторы на 18-22 пФ (схема ниже)

Например как-то так, питание соединяем, плюс пара конденсаторов и подтяжка RST:

Схема подключения внешнего осциллятора (если нужен). Пины 9 и 10 тут соответственно XTAL1 и XTAL2

Я думаю теперь вы готовы к созданию проекта на своей плате!

код для Digispark:

Библиотеку для работы 7 сегментным индикатором можно взять тут или тут.

В проекте не предусмотрена настройка времени, нужно установить время в DS3231 с компьютера.

#include <TinyWireM.h>
#include "TM1637.h"
  
#define CLK 1
#define DIO 4 

TM1637 tm1637(CLK,DIO);

///// часы ..
byte decToBcd(byte val){
  return ( (val10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val16*10) + (val%16) );
}

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   TinyWireM.beginTransmission(0x68);
   TinyWireM.send();
   TinyWireM.send(decToBcd(second));    
   TinyWireM.send(decToBcd(minute));
   TinyWireM.send(decToBcd(hour));     
   TinyWireM.send(decToBcd(dayOfWeek));
   TinyWireM.send(decToBcd(dayOfMonth));
   TinyWireM.send(decToBcd(month));
   TinyWireM.send(decToBcd(year));
   TinyWireM.endTransmission();
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  TinyWireM.beginTransmission(0x68);
  TinyWireM.send();
  TinyWireM.endTransmission();

  TinyWireM.requestFrom(0x68, 7);

  *second     = bcdToDec(TinyWireM.receive() & 0x7f);
  *minute     = bcdToDec(TinyWireM.receive());
  *hour       = bcdToDec(TinyWireM.receive() & 0x3f); 
  *dayOfWeek  = bcdToDec(TinyWireM.receive());
  *dayOfMonth = bcdToDec(TinyWireM.receive());
  *month      = bcdToDec(TinyWireM.receive());
  *year       = bcdToDec(TinyWireM.receive());
}

float get3231Temp(){
  byte tMSB, tLSB; 
  float temp3231;

  TinyWireM.beginTransmission(0x68);
  TinyWireM.send(0x11);
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(0x68, 2);

  if(TinyWireM.available()) {
    tMSB = TinyWireM.receive(); //2's complement int portion
    tLSB = TinyWireM.receive(); //fraction portion

    temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
    temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
  }
  else {
    //oh noes, no data!
  }

  return temp3231;
}
/////////////////

void setup() {
  
  TinyWireM.begin();
  tm1637.init();
  tm1637.set(1); // яркость, от 0 до 7
  
  /*  // установка часов  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  second = 30;  minute = 0;  hour = 14;  dayOfWeek = 3; // день недели  dayOfMonth = 1; // день  month = 4;  year = 14;  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); */
}

void loop(){
  
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  byte temp = get3231Temp(); 
  
  int8_t TimeDisp4; 
  
 
  // вывод температуры .. каждые 10 сек на 2 сек
  if (second >=  && second <= 1 ||
      second >= 10 && second <= 11 ||
      second >= 20 && second <= 21 ||
      second >= 30 && second <= 31 ||
      second >= 40 && second <= 41 ||
      second >= 50 && second <= 51)
  {
    tm1637.point(POINT_OFF); // выключаем точки 
    TimeDisp = 19; //  
    TimeDisp1 = temp  10; // заполняем массив
    TimeDisp2 = temp % 10;
    TimeDisp3 = 12; // C

  }
/*  // дата  else if(second >= 25 && second <= 26 ||          second >= 45 && second <= 46)  {    tm1637.point(POINT_OFF);      TimeDisp = dayOfMonth / 10;    TimeDisp = dayOfMonth % 10;    TimeDisp = month / 10;    TimeDisp = month % 10;    }*/
  /// часы
  else
  {  
    tm1637.point(POINT_ON); // включаем точки
    TimeDisp = hour  10;
    TimeDisp1 = hour % 10;
    TimeDisp2 = minute  10;
    TimeDisp3 = minute % 10;        
  }
  
  tm1637.display(TimeDisp); // отправляем массив на экран
 
  
}

Программирование

Для использования платы, все, что вам нужно, это кабель с MicroUSB разъемом. Сперва вы должны настроить Arduino IDE и установить соответствующие драйверы (Micronucleus). Все подробно описано на wiki-странице Подключение и программирование вашего Digispark.

Я скачал версию micronucleus-2.0a4-win, но код был написан и работал на 1.8.7 IDE (требуется версия 1.6.5+). В этой версии я импортировал поддержку Digispark через Boards Manager, как описано на упомянутой выше странице.

Я выбрал платформу «Digispark (по умолчанию — 16,5 МГц)». В общем, в меню Файл / Примеры / Digispark есть много интересных примеров. Я выбрал из них два, из которых в дальнейшей части статьи я построю простой монитор температуры.

Стоит также упомянуть о DigisparkExamplePrograms. В каталоге DigisparkExamplePrograms / Python / DigiUSB находятся такие программы, как digiscope.exe или monitor.exe, которые работают с Digispark (если не используются контакты, соответствующие USB-соединению).

Первая программа показывает графики, а вторая — последовательный терминал. Примеры использования доступны в среде IDE в разделе «Файл / Примеры / DigisparkUSB». Они используют файл DigiUSB.h.

Есть еще один способ связи через USB с использованием файла DigiCDC.h (File / Examples / DigisparkCDC), и этот способ имеет то преимущество, что достаточно обычного терминала с Arduino IDE.

Сам процесс программирования выглядит следующим образом:

  • После нажатия кнопки «Загрузить» на информационной панели, в нижней части среды IDE появиться следующее сообщение: «Запуск Digispark Uploader… Подключите устройство сейчас… (время ожидания истекает через 60 секунд)»
  • На этом этапе мы подключаем Digispark и загружаем код.
  • После загрузки загрузчик завершает работу и загруженная программа запускается.

Программирование

Итак, что же даёт нам ядро помимо выбора настроек МК? Можно программировать МК всё теми же командами, что и раньше! Мигать светодиодами через digitalWrite, измерять напряжение через analogRead и прочее прочее. Давайте напишем классический Blink:

void setup() {
  pinMode(PB3, OUTPUT);
}

void loop() {
  digitalWrite(PB3, HIGH);
  delay(500);
  digitalWrite(PB3, LOW);
  delay(500);
}

PB3 – это номер пина, прямо как на распиновке.

Всё! Осталось загрузить прошивку. Для этого нажимаем Скетч/Загрузить через программатор:

Я подключил светодиод через резистор на 220 Ом и он мигает два раза в секунду, всё как написано.

Что следует помнить при работе с тиньками: у них мало памяти, а все вот эти Ардуино-функции являются кошмаром индуса и занимают очень много места в памяти. Если тини85 ещё как-то переживёт такие издевательства и сможет уместить в себе вполне интересный проект из Ардуино-функций, то в тини13 уже сложно уместить что-то серьёзное. Напомню: всего 64 байта оперативной памяти и 1 кб флэша! Для перехода на 13-ые тиньки рекомендуется научиться работать с МК напрямую, при помощи даташита и регистров.

Я думаю вы поняли, что в целом работа с голыми МК не особо то и отличается от работы с обычной платой Arduino, и теперь можно переходить к сложным самоделкам на базе своей платы, в центре которой будет стоять микроконтроллер. Давайте поделюсь парой советов по минимальной обвязке.

Программная часть

Проблема с драйвером датчика MAX30102 заключается в том, что используемый в приборе датчик выпускается на плате MH-ET LIVE. В спецификации на датчик подразумевается, но не указывается явно, что LED1 – красный светодиод, LED2 – инфракрасный (ИК). Однако, если сигнал управления на LED1 равен 0, красный светодиод остается включенным (как на Рисунке 3), если же сигнал управления на LED2 равен 0, то красный светодиод гаснет. Очевидный вывод состоит в том, что LED1 – это ИК светодиод, а LED2 – красный, который также участвует в измерениях уровня насыщения крови кислородом (см. описание ниже). Мы упоминаем этот момент по причине того, что самый распространенный драйвер датчика MAX30102 для проектов на Arduino – это драйвер SparkFun 3010x, в котором однозначно определено, что LED1 – красный, LED2 – ИК. Это может быть справедливо для модулей с датчиком серии MAX30105, установленных на платах SparkFun, но, похоже, не относится к датчику MAX30102 на плате MH-ET LIVE.

Уровень кислорода в крови обозначает насыщение периферийных капилляров кислородом. Более конкретно, это процент насыщенного кислородом гемоглобина по сравнению с общим количеством гемоглобина в крови (насыщенный и ненасыщенный кислородом гемоглобин).

Насыщенный и ненасыщенный гемоглобин имеют разные характеристики поглощения света для красных и ИК длин волн. На этом принципе основана работа датчиков, таких как MAX30102. В вычислениях используется следующее соотношение:

R = (AC_red/DC_red)/(AC_IR/DC_IR)

где AC_xxx является переменной составляющей сигнала xxx, а DC_xxx является постоянной составляющей сигнала xxx. В приборе вычисляются два значения R. Верхнее значение на дисплее (следующее после частоты пульса) вычисляется по классической формуле:

R = 104 — 1.7 × R

Нижнее значение вычисляется с помощью таблицы из Arduino библиотеки драйвера, которая является приближением  формулы:

-45.060 × R × R + 30.354 × R + 94.845

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

Построение графика сердечного ритма основывается на красном и ИК сигналах от датчика, и также проходят две стадии фильтрации. Первой, как описано выше, является удаление постоянной составляющей. Второй – это фильтр скользящего среднего, который действует как фильтр нижних частот для удаления переходных процессов до того, как сигнал поступит в детектор пульса. Форму сигнала после каждого из этих фильтров можно отобразить, но в целом более интересна форма сигнала без фильтров.

Например, дикротические выемки, которые можно увидеть на полученном с помощью прибора графике сердечного ритма (Рисунок 1) – «второе движение вверх на нисходящей части траектории, соответствующее увеличению давления в аорте при закрытии аортального клапана. – словарь Merriam Webster». Автор заметил, что если эти дикротические выемки более ярко выраженные – у более молодых людей – они могут преодолеть фильтрацию второго уровня и привести к ошибочному выходному сигналу детектора пульса, который, по сути, ищет пики и впадины в сигнале. Работа над проектом продолжается!

Исходный код (скетч Arduino), необходимые библиотеки, проект корпуса (Рисунок 5) для печати на 3D принтере доступны для скачивания в разделе загрузок.

Рисунок 5. Простой корпус для прибора, напечатанный на 3D принтере.

Дополнительно автор добавил версию прибора (nanoPulsePPG) для стандартных плат Arduino и протестировал работу на плате Arduino Nano, но также должно работать на плате Arduino Uno. Таким образом, вы можете экспериментировать с исходным кодом и датчиком.

Digispark на Attiny85 — подключение под Windows 10 +4

  • 12.06.18 06:48


gerasimenkoao

#413927

Хабрахабр


Из песочницы

5100

Из песочницы, Разработка под Arduino

Если Вы читаете эти строки, значит что-то пошло не так… с подключением данного микроконтроллера. Знаю, у меня самого за сутки до написания статьи было так-же, но техноманьяки — народ упоротый упертый

Можно было спокойно заюзать любую из трех имеющихся ардуин или «голую» Atmega328P-PU/Atmega8-16PU

В конце концов, ПРОСТО загрузить USB-Linux c arduino ide под него.

Нет-же, в этот раз свет клином сошелся на Диджиспарке и ДЕСЯТКЕ — зря что-ли платил $3 за ESD-лицензию?.

«Уж если я чего решил, то выпью обязательно» пел Высоцкий, и как Вы поняли — таки да!

Ладно, с присказками закончили — бутаем комп, заходим в биос.

Находим пункт устройства/порты — USB — да, Digispark не работает с USB-3

Отключаем совместимось USB3-Disable (У некоторых просто может выставляться режим порта — ставим USB-2 Compatible)

У меня этот пункт назывался xHCI — Disable

Не торопитесь выходить — включите отладку — Debug-Enable

Опять на моем биосе эта функция зовется иначе — EHCI — Enable

Save&Exit

Гуд? Загрузили винду?

Не торопитесь входить в ArduinoIde!

Снесите для начала Все установленные ранее дрова под digistump/digispark!

Готово?

WIN-x — выполнить — regedit — поиск ищем digistump в реестре и беспощадно удаляем, F3 — поиск дальше!

Повторяем процедуру со словом digispark.

Контролный reboot в голову — винда все-же 😉

У меня это была версия micronucleus-2.0a4-win.zip

Еще нужна прога ArduinoIde с предустановленной поддержкой Digispark-a — идем сюда:

качаем последний ArduinoIDE, моя версия(на 07.06.2018) — DigisparkArduino-Win32-1.0.4-May19.zip, извлекаем содержимое.

На 64-битке — работает!

Распаковываем/сетапим наш микронуклеус драйвер.

Окей, запускаем DigisparkArduino версии 1.0.4!

Старый? А Вам Шашечки или Ехать?

Its a Sparta — это винда!

Лулзов добавляет, трейдмарк Sparta, под которым у меня импульсный паяльник и набор отверточек.

Но не торопитесь подключать плату в Usb порт!

Выбираем (в ArduinoIDE ) Сервис-Плата-Digispark (Tiny Core)

Далее Сервис-Программатор-Digispark

Наконец пришло время поморгать светодиодом 😉

Компилируем Ctrl-R

Загружаем Ctrl-U (ведь правда мы еще не вставляли плату в ЮСБ? ЭТО ВАЖНО!!)

Вот только после такой надписи внизу — включаем Digispark в порт.

иначе он будет бесцельно блинкать появляясь и исчезая в устройствах — как первый спутник земли!

Если ВСЕ пункты выполнялись внимательно и последовательно, то мы получим подобную картинку

И мигающий на плате светодиод — WIN!

Успешных Вам проектов!

Андрей.

Комментарии (12):

  1. prs123

    12.06.18 09:54/#18764929

    Странно, видимо всё-таки действительно десятка разная бывает. нету у меня переключения типа USB. Правда я опытным путём выяснил, какие у меня порты 3.0, а какие 2.0

    • V1tol

      13.06.18 02:48/#18768499

      Обычно порты физически цветом различаются. Ещё у 3.0 при маркировке помимо стандартного значка добавляют SS.

      prs123

      13.06.18 02:51/#18768519

      Видимо мне не везёт на это. На предыдущем компупере винда все время гундосила, типа воткните в USB 3.0 и будет вам счастье, а сказать где он — не судьба

    gerasimenkoao

    14.06.18 10:21/#18772283

    У меня ВСЕ порты USB-3, в биосе пришлось отключать.

  2. Incognito4pda

    12.06.18 11:17/#18765251

    Что-то я не припомню каких либо проблем по теме подключения сабжа на win10 через обыкновенный юсб хаб 2.0

    gerasimenkoao

    14.06.18 10:35/#18772367

    Хаб — это хорошо, а если в «полевых» условиях воткнуть плату в ноут потребуется?
    Вот как раз на нем сейчас контроллер коллекторного двигателя для электровелосипеда делаю.

  3. Tutanhomon

    13.06.18 09:11/#18766237

    Ctrl-x — regedit это где?

    igrblkv

    13.06.18 10:15/#18766585

    Ctrl-X — это-же убрать в буфер?
    Может речь про Win-R — regedit (по-логике повествования у меня так получается)?..

    gerasimenkoao

    14.06.18 10:29/#18772325

    Спасибо, что нашли опечатку!
    Исправил — WIN-х-выполнить!

  4. johnfound

    13.06.18 10:30/#18766691

    Ничего не понял.

    • gerasimenkoao

      14.06.18 10:52/#18772489

      Если вкратце:
      1. Digispark не работает с портами USB3
      2. Нужен пакет драйверов micronucleus
      3. Для программирования используется Arduino IDE 1.0.4 с поддержкой данной платы.

      johnfound

      14.06.18 11:00/#18772535

      Другое дело! Так бы сразу и написали! 😀

Notes on serial monitoring

ATtiny85 does not provide a native serial interface, but it can be generated via software:

  • bit-bang two-way serial half-duplex (two pins)
  • bit-bang serial-out (one pin)

Both provide a TTL UART hardware interface (using one or two pins different from P3 and P4, used for USB). If the PC has a physical serial port, an external TTL-to-RS232 hardware interface is needed. If USB is required to connect a PC, an external UART-USB hardware converter is needed.

The above described options are ways to monitor a Digispark via Arduino «serial monitor».

Similarly to the UART serial port, USB monitoring can be emulated via a bit-bang software implementation of the Digispark USB interface, emulating a serial port. All these options do not allow monitoring via Arduino «serial monitor».

DKeyboard example:

#define USE_KEYBOARD
#define KEYBOARD_DELAY 1500 // Time to wait for the PC keyboard driver to become ready

#ifdef USE_KEYBOARD
#include "DKeyboard.h" // Use a modified tiny DigisparkKeyboard library
DKeyboardDevice Db = DKeyboardDevice(); // instantiate the Keyboard driver
#endif

void setup() {
...
#ifdef USE_KEYBOARD
    Db.sendKeyStroke();
    Db.delay(KEYBOARD_DELAY); // This is needed to wait for the PC keyboard driver to become ready
    Db.sendKeyStroke(); // This will ensure no character will be lost
#endif
...
}

void loop() {
...
#ifdef USE_KEYBOARD
    Db.print("Value result is ");
    Db.println(value);
    Db.print("Hex value is ");
    Db.println(hexvalue, HEX);
    Db.delay(300); // ensure that the transmission is performed before the interrupt is turned off
#endif
...
}

Steps to use DKeyboard for debug log monitoring:

  • Create a new folder called DKeyboard under the folder named «libraries» in your Arduino sketchbook folder. Create the folder «libraries» in case it does not exist yet. Copy all the files under libraries/DKeyboard to the target «DKeyboard» subfolder. This is a modified version of DKeyboard that slightly reduces its size so that it can be loaded to the Digispark ATTINY85 device. ATtiny85 presents itself to the PC as a keyboard USB HID.
  • Connect the Digispark to the PC via USB
  • Immediately after the code is successfully uploaded, remove the Digispark USB from the PC (to prevent interference of the emulated keyboard)
  • Open a Notepad and put the Windows focus there (maximizing the Notepad window is also suggested to prevent accidentally losing the focus)
  • Insert the USB to the PC (do not move the focus out of the Notepad window until the USB is connected)

False errors of missing USB driver messages can occur with Windows (should be ignored). If no data is shown, increase KEYBOARD_DELAY timer.

The following DKeyboard Hello World code takes 2784 bytes (42% of the available rooms):

#define KEYBOARD_DELAY 1500

#include "DKeyboard.h"
DKeyboardDevice Db = DKeyboardDevice();

void setup() {
  Db.sendKeyStroke();
  Db.delay(KEYBOARD_DELAY);
  Db.sendKeyStroke();
}

void loop() {
  Db.println("Hello World");
  Db.delay(300);
}

DKeyboard needs timer interrupt disabled. If timer interrupt is used (e.g, IRMP or IRemote, interrupts shall be temporarily disabled.

Как сделать очень маленькую Ардуино своими руками?

Саму плату Arduino версии UNO, например, можно использовать, как универсальный программатор. Вы можете легко запрограммировать с помощью arduino attiny2313 и другие МК семейства AVR и МК иных производителей. Сама серия Attiny, как вы можете увидеть из названия, – младшая линейка микроконтроллеров Atmel, имеющая урезанные по сравнению с ATmega чипы.

Стоит отметить! Многие микроконтроллеры младшей, tiny, серии имеют аналогичную цоколевку, как, например, Tiny13/25/45/85 совместимы.

На рисунке – пример прошивки платы ардуино с помощью другой платы ардуино, в случае выхода микроконтроллера первой из строя, когда в него нужно прошить загрузчик.

Arudino ISP – проект, который превратит вашу платформу в программатор. Для этого нужно в плату UNO загрузить скетч и использовать её для прошивки.

Сам термин ISP – расшифровывается, как «внутрисистемное программирование», то есть прошивка чипа уже в непосредственно собранной схеме – такая методика применяется не только в любительских конструкциях, но и для корректирования программного обеспечения готовых блоков промышленного производства и бытовой техники.

Прошивка, которая превратит вашу ардуину в ISP программатор, поставляется в наборе примеров Arduino IDE. Подключите вашу плату к компьютеру и выберите File-examples-Arduino ISP. После чего залейте скетч в Arduino.

На картинке указаны назначения пинов ардуино и их расположение на контроллерах в DIP корпусах, для прошивки соедините одноименные выводы на микроконтроллере и ардуине.

При желании можно повторить опыт предшественников и сделать такой шилд для UNO.

Вот печатная плата

Пояснения будут излишними – проявите фантазию и воплотите это на текстолите.

Чтобы прошить attiny с Arduino IDE нужно предварительно добавить библиотеки для их поддержки, в стандартном варианте поддерживаются только atmega. Добавляем в директорию «C:\Users\*имя пользователя*\Documents\Arduino\» папку hardware, в неё – папку tiny из архива, который можно найти здесь (ссылка на открытый ресурс https://code.google.com/archive/p/arduino-tiny/).

После этого в папке tiny находим файл Prospective Boards.txt и удаляем из его название первое слово «Prospective».

На картинке изображены настройки и список плат. Не забудьте выбрать программатор «Arduino ISP».

Программатор готов.

При прошивке attiny код будет легче, чем в UNO, некоторые функции урезаны, вам доступны:

  • pinMode()
  • digitalWrite()
  • digitalRead()
  • analogRead()
  • analogReference(INTERNAL) / (EXTERNAL)
  • shiftOut()
  • pulseIn()
  • analogWrite()
  • millis()
  • micros()
  • delay()
  • delayMicroseconds()

Что мы получаем?

Теперь вы получаете аналог digispark, но размеры его сократились до размеров одного чипа; припаивайте периферию, и ваше устройство готово! Вы можете сделать дешевую arduino attiny13 с объемом памяти в 1024 байта, для простейших мигалок и датчиков.

Такие миниатюрные устройства сэкономят место и деньги при сборке. Дело в том, что на цену дешевой Ардуино Нано можно купить несколько Аттини, к тому же вы можете простейшими командами запрограммировать их, не изучая Си.

Precautions:

The Digispark, due to its small size and low cost is not as robust as a full blown Arduino.

When testing a new circuit we recommend that you test it with an external power supply first. Connecting a shorted circuit to the Digispark and connecting it to your computer could damage your computer and/or its USB ports. We take no responsibility for damage to your machine as a result of the use of a Digispark.

We strongly recommend connecting your Digispark through a USB hub which will often limit the damage caused by a short circuit to the usb hub. For the record, we’ve found many computers have usb fuses built in, and when we blew them on our 27“ Mac monitor, thankfully they reset and everything worked after a power down.

The Digispark does not have short circuit or reverse polarity protection. Connecting power to the Digispark power pins backwards will almost certainly destroy it.

The Digispark is small enough to present a choking hazard and small enough to be inserted into some sockets. We take no responsibility for misuse of the product. Please treat electricity and electronics with respect and common sense.

О возможностях среды разработки

Arduino IDE имеет встроенный набор плат и микроконтроллеров, с которыми можно работать; в её основе лежит классический программатор AVR, кстати, благодаря ему и можно обращаться к устройству командами на Си.

Однако не всегда удобно и рационально использовать предложенные микроконтроллеры. Согласитесь, что глупо брать плату с парой десятков выводов для работы с 1 датчиком и 1 исполнительным механизмом, в роли которого может быть:

  • сервопривод;
  • транзистор;
  • светодиод;
  • соленоид и т. д.

Поэтому сторонние разработчики создали целый ряд совместимых плат. Работать с ними можно через Arduino IDE, используя простые команды встроенного языка. Для этого были переписаны загрузчики и библиотеки команд.

Introduction

The Digispark -based on the ATtiny85 microcontroller- has 4 built-in hardware PWM.
Currently, only 3 of them are usable in the arduino environment:

  • Pin0
  • Pin1
  • Pin4

If the user wants to keep USB capabilty (with <DigiUSB> library) in his/her sketch, only 2 hardware PWM pins are available since Pin4 is used for USB.
In this context, it’s impossible, for example, to create a sketch which controls a RGB strip LED through USB using -only- the available hardware PWM pins since 3 PWM pins are required (one per color).

There is a solution: .

Software PWM is a technic which emulates hardware PWM by software.

This means:

  • Additional code in program memory
  • A lower PWM frequency

Перепрограммируемый загрузчик ATtiny85 с использованием платы Arduino Uno

Для программирования ATtiny85 без использования платы Arduino мы сначала должны загрузить в него загрузчик используя плату Arduino Uno. Этот процесс выполняется один раз и в дальнейшем у нас не будет необходимости в использовании платы Arduino для программирования микроконтроллера ATtiny85. Загрузчик (bootloader) – это специальная программа, которая выполняется в микроконтроллере, который необходимо запрограммировать. Использование загрузчика – это один из самых удобных способов загрузки программы в микроконтроллер. Загрузчик находится в микроконтроллере и выполняет поступающие команды, а затем записывает новую программу в память микроконтроллера.

Перепрограммируемый загрузчик в микроконтроллере устраняет необходимость в использовании специальных внешних аппаратных средств (плат программирования, программаторов) для программирования микроконтроллера и позволяет загружать программу в микроконтроллер непосредственно с помощью USB соединения. Платы Digispark ATtiny85 (а выбор подобных плат сейчас достаточно большой) работают на загрузчике “micronucleus tiny85”, первоначально написанным Bluebie. Загрузчик – это программный код, который заранее загружен в плату Digispark и позволяет работать ей как USB устройство, которое можно программировать с помощью Arduino IDE. Мы будем использовать аналогичный подход и загружать загрузчик digispark attiny85 в наш микроконтроллер ATtiny85.

Для реализации этой задачи необходимо выполнить следующую последовательность шагов.

Шаг 1. Конфигурирование платы Arduino Uno в качестве ISP программатора.

Поскольку ATtiny85 является всего лишь микроконтроллером, для его программирования требуется ISP (In-System Programming — внутрисистемное программирование). Поэтому для программирования ATtiny85 нам необходимо сначала сконфигурировать плату Arduino Uno в качестве ISP программатора. Для этого подключите плату Arduino Uno к компьютеру и запустите Arduino IDE. После этого откройте пункт меню File > Example > ArduinoISP и загрузите в Arduino ISP код.

Шаг 2. Схема перепрограммируемого загрузчика ATtiny85.

Схема перепрограммируемого загрузчика ATtiny85 представлена на следующем рисунке.

Конденсатор 10 мкФ подключен между контактами Reset и GND платы Arduino. Все соединения схемы представлены в следующей таблице:

ATtiny85 Pin Arduino Uno Pin
Vcc 5V
GND GND
Pin 2 13
Pin 1 12
Pin 0 11
Reset 10

После сборки схемы подключите плату Arduino Uno и запустите Arduino IDE. Определите к какому COM порту подключена плата Arduino Uno (в диспетчере устройств Windows). В нашем случае это COM5.

После этого скопируйте отредактированный файл «Burn_AT85_bootloader.bat» и файл ATtiny85.hex» в корневой каталог Arduino IDE (C:\Program Files (x86)\Arduino).

После этого сделайте клик правой кнопкой мыши на файле «Burn_AT85_bootloader.bat» и выберите «Run as Admin» (запуск от администратора). Необходимо примерно 5-6 секунд чтобы загрузчик загрузился. Если все прошло успешно, то вы должны увидеть сообщение «AVRdude done. Thank you. Press any key to continue…».

После выполнения этой операции загрузчик будет успешно установлен в микроконтроллер ATtiny85. После этого микроконтроллер ATtiny85 можно будет программировать через USB с помощью нашего самодельного программатора, который описан далее в статье.

Код термометра

#include <DigisparkOLED.h>
#include <OneWire.h>
#include <Wire.h>

OneWire ds(3);
byte addr;;

void setup() void setup() 
{{
  oled.begin();.begin();
}}

void loop() void loop() 
{{
    byte data;;
    byte i;;

    if (!ds.search(addr)) {if (!ds.search(addr)) {
        ds.reset_search();.reset_search();
        delay(250);(250);
        return;return;
    }}

    /*if (OneWire::crc8(addr, 7) != addr) {/*if (OneWire::crc8(addr, 7) != addr) {
        return;
    }*/

    ds.reset();.reset();
    ds.select(addr);.select(addr);
    ds.write(0x44, 1);.write(0x44, 1);
    delay(1000);(1000);
    ds.reset();.reset();
    ds.select(addr);    .select(addr);    
    ds.write(0xBE);.write(0xBE);

    for ( i = 0; i < 9; i++) {for ( i = 0; i < 9; i++) {
      data = ds.read(); = ds.read();
    }}

    int16_t raw = (data << 8) | data;int16_t raw = (data << 8) | data;
    byte cfg = (data & 0x60);= (data & 0x60);

    if (cfg == 0x00) raw = raw & ~7;if (cfg == 0x00) raw = raw & ~7;
    else if (cfg == 0x20) raw = raw & ~3;else if (cfg == 0x20) raw = raw & ~3;
    else if (cfg == 0x40) raw = raw & ~1;else if (cfg == 0x40) raw = raw & ~1;

    oled.clear();.clear();
    oled.setCursor(0, 0);.setCursor(0, 0);
    oled.setFont(FONT8X16);.setFont(FONT8X16);
    oled.print(raw / 16);.print(raw / 16);
    oled.print(".");.print(".");
    oled.print(raw % 16);.print(raw % 16);
    delay(5000);(5000);
}}

Из-за удобочитаемости я удалил комментарии

Их можно найти в примерах DS18B20 и OLED.
Еще одно важное замечание — DS18B20 требует подтягивающего резистора (4,7 кОм) между входом и напряжением питания — у моего модуля он уже был. Отсюда его отсутствие на схеме подключения

loop() is invoked each time

Variables defined in loop() get reinitialized every time… there is no magic goto the top. So:

void loop () {
  // don't use this buggy code!
  int second; // first bug here! (see explanation below)
  second = second + 1;
 
  if (second = 15) { // second bug here! (see explanation above)
     // this code runs every loop, because second is set to 15, and 15 is non-zero, so is truthy.
     // effectively the same as writing:
     // second = 15;
     // if (15 != 0) {
     //   ...
     // }
  }
  delay(1000);
}

If you really want something to run once 15 seconds after you power it up, you need something more like

void loop () {
  // use "static" to remember this value from one loop to the next.
  // Also, initialize it to something reasonable.
  static int seconds = ;
 
  if ( 15 == seconds ) { // use the correct "==" for comparison.
     // this code runs only the 15th time through the loop.
     Serial.write("hey, it's been 15 seconds!");
  }
  delay(1000);
  seconds = seconds + 1;
}

Even the above code has a minor bug – the Arduino Uno uses 16 bits in the “int”, so a “seconds” count stored in an “int” rolls over.
So it prints the message once 15 seconds after power-up, as desired, and then prints it out again (!) roughly every 18 hours.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий