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

Тут у нас полноценный МК, в корпусе SOT-23-6! И задачи на нем решать можно вполне серьезные. Собрав схему на макетке с МК на адаптере и модулем дисплея я было обрадовался, но готовая плата работать отказалась...

А как, а что...

Маааленький!
Маааленький!

Attiny10 самый маленький МК, из AVR точно (не пугайтесь картинке, Microchip купила Atmel). Но характеристики у него вполне серьезные. Частота до 12МГц, 1кБ флэш и 32 байта оперативной памяти. Для корпуса SOT-23-6 это, согласитесь, не мало. Но самым главным плюсом наряду с размерами является энергопотребление, которое составляет всего 2.7-4мА при 8МГц и 5В питания, или всего 0.2-0.4мА при 1МГц и питании 1.8В.

Есть даже АЦП и ШИМ. Все характеристики вы можете посмотреть в даташите. Есть у тини10 и младшие братья ATTINY4, 5 и 9. У 4 и 9 нет АЦП, у 4 и 5 к тому же всего 512 байт флэш.

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

Программируются эти малыши по интерфейсу TPI- Tiny Programming Interface. Но как бы страшно это не звучало, этот интерфейс поддерживается программатором USBasp, естественно он должен быть прошит последней версией по ссылке выше. Подключение:

Программирование поддерживается при питании 5В, так что не забудьте переключить программатор в этот режим.

ПО я писал и заливал в среде Arduino IDE. Для самых маленьких аттини есть ядро. Правда про библиотеки думаю можно забыть, тут только хардкор поместится.

Возможные траблы

Сначала я собрал схему на макетке, чтобы отладить прошивку. Разъема для программирования на плате я не предусмотрел, да и дисплей наверное не пережил бы питания в 5В. Тут из проблем встречалось только то что где-то после 20й прошивки начались с этой самой прошивкой проблемы, которая прошивалась только на 2-3-4 раз. Вероятно это связано с моим железом.

После сборки платы вроде все заработало, но при втором включении я уже увидел шум на дисплее вместо данных. В первую очередь я заменил всю обвязку дисплея, но это не помогло. Программные ухищрения тоже. Еще раз прогуглив варианты обвязки- заметил что часто встречается аппаратная задержка на RESET дисплея. Ее добавление и решило проблему.

Схема

По больше части схема повторяет прошлую. Тут только добавлен С2 и защита от превышения напряжений. Так если по питанию придет больше 12В, на которые рассчитан MCP1703- некоторый диапазон отработает параметрический стабилизатор R3 D3, а при дальнейшем превышении R3 сгорит как предохранитель. Так-же в линию АЦП добавлен стабилитрон D1.

Делитель с плечом 3.5 позволяет измерить до 3.5*3.3=11.55В. При раздельном питании и измеряемом напряжении диапазон получается 0-11.55В. Если объединить питание и вход диапазон 4-12В. Это обусловлено тем что опорное напряжение ATTINY10 берет равным линии питания, которая здесь 3.3В плюс падение на стабилизаторе. Итого шаг на значение АЦП 11.55/255=0.045В.

Плата

Плата так-же сделана под возможности ЛУТ, и по большей части повторяет прошлую. Тут контакты для проводов находятся под дисплеем, а для торчащего шлейфа добавлены пара миллиметров справа.

Собранная плата
Собранная плата

Дисплей просто приклеил на двусторонний скотч.

Программа

ПО по большей части позаимствовано здесь и здесь. Итого ПО занимает всего 912 байт.

Код

uint8_t AD;
uint16_t VOLT;

const uint8_t Init[24] = {
  0xAE,         // Display OFF
  0xA8, 0x1F,   // set multiplex (HEIGHT-1): 0x1F for 128x32, 0x3F for 128x64
  0x22, 0x00, 0x03, // Page min to max
  0x20, 0x01,   // Memory addressing mode 0x00 Horizontal 0x01 Vertical
  0xDA, 0x02,   // Set COM Pins hardware configuration to sequential
  0x8D, 0x14,   // Charge pump enabled
  0xD3, 0x00,   // Display offset to 0
  0x81, 0xFF,   // Set contrast
  0xD9, 0xF1,   // Set pre-charge period
  0xDB, 0x40,   // Set vcom detect
  0x21, 0x00, 0x7F, // Column min to max
  0xAF,  // Display on

};

#define PI2C_SDA    PB0
#define PI2C_SCL    PB1

#define OUT_REG PORTB


#define SDA_ON (OUT_REG |= (1<< PI2C_SDA))
#define SDA_OFF (OUT_REG &= ~(1<< PI2C_SDA))
#define SCL_ON (OUT_REG |= (1<< PI2C_SCL))
#define SCL_OFF (OUT_REG &= ~(1<< PI2C_SCL))

#define SDA_READ (PINB & (1<<PI2C_SDA))



#define ADDR 0b01111000 //OLED Address plus write bit



inline void dly() { //пустая команда
  __asm__("NOP");
};




void setup () {
  ADMUX = 2 << MUX0;              // ADC1 (PB1)
  ADCSRA = 1 << ADEN | 3 << ADPS0; // Enable ADC, 125kHz clock

  DDRB = 3;
  for (uint8_t i = 0; i < 100; i++) dly();
  
  start();
  Tx(ADDR);
  Tx(0x00);
  for (uint8_t i = 0; i < 24; i++)
  {
    Tx(Init[i]);
  }

  stop();

}





void loop(void) {
  uint8_t buffer[8] = {0, 0, 10, 0, 0, 11, 12, 12}; //знаковый буффер на 8 ячеек.
  ADCSRA = ADCSRA | 1 << ADSC;    // Start
  while (ADCSRA & 1 << ADSC);     // Wait while conversion in progress
  AD = ADCL;                    //Читаем АЦП

  VOLT = (AD *47)/10;  //Преобразуем значение АЦП в вольты

 
    buffer[0] = VOLT / 1000;  //первый знак
    buffer[1] = (VOLT % 1000) / 100; //второй знак
    buffer[3] = (VOLT % 100) / 10; //третий знак
    buffer[4] = VOLT % 10;  //четвертый знак

  

  OLED_printB(buffer);  //Выводим буффер


}

Шрифт и отрисовка
const uint8_t OLED_FONT[] PROGMEM = {
  0x7F, 0x41, 0x7F, // 0  0
  0x00, 0x00, 0x7F, // 1  1
  0x79, 0x49, 0x4F, // 2  2
  0x41, 0x49, 0x7F, // 3  3
  0x0F, 0x08, 0x7E, // 4  4
  0x4F, 0x49, 0x79, // 5  5
  0x7F, 0x49, 0x79, // 6  6
  0x03, 0x01, 0x7F, // 7  7
  0x7F, 0x49, 0x7F, // 8  8
  0x4F, 0x49, 0x7F, // 9  9
  0x00, 0x60, 0x00, // .  10
  0x1F, 0x78, 0x1F, // V  11
  0x00, 0x00, 0x00, // -  12
  
};



void OLED_printB(uint8_t *buffer) {
  start();
  Tx(ADDR);
  Tx(0x40);
  for (uint8_t i = 0; i < 8; i++) OLED_printD(buffer[i]); // print buffer
  stop();                          // stop transmission
  
}



uint8_t OLED_stretch(uint8_t b) {
  b  = ((b & 2) << 3) | (b & 1);          // split 2 LSB into the nibbles
  b |= b << 1;                            // double the bits
  b |= b << 2;                            // double them again = 4 times
  return b;                               // return the value
}


void OLED_printD(uint8_t ch) {
  uint8_t i, j, k, b;                     // loop variables
  uint8_t sb[4];                          // stretched character bytes
  ch += ch << 1;                          // calculate position of character in font array
  for (i = 8; i; i--) Tx(0x00);    // print spacing between characters
  for (i = 3; i; i--) {                   // font has 3 bytes per character
    b = OLED_FONT[ch++]; // read character byte
    for (j = 0; j < 4; j++, b >>= 2) sb[j] = OLED_stretch(b); // stretch 4 times
    j = 4; if (i == 2) j = 6;             // calculate x-stretch value
    while (j--) {                      // write several times (x-direction)
      for (k = 0; k < 4; k++) Tx(sb[k]); // the 4 stretched bytes (y-direction)
    }
  }
}

Работа с I2C

/*  i2c start sequence */
void start() {
  SDA_ON;
  dly();
  SCL_ON;
  dly();
  SDA_OFF;
  dly();
  SCL_OFF;
  dly();
}


/*  i2c stop sequence */
void stop() {
  SDA_OFF;
  dly();
  SCL_ON;
  dly();
  SDA_ON;
  dly();
}

/* Transmit 8 bit data to slave */
bool Tx(uint8_t dat) {
  for (uint8_t i = 0; i < 8; i++) {
    (dat & 0x80) ? SDA_ON : SDA_OFF;
    dat <<= 1;
    dly();
    SCL_ON;
    dly();
    SCL_OFF;
    
  }

  SDA_ON;
  SCL_ON;
  dly();
  bool ack = !SDA_READ;    // Acknowledge bit
  SCL_OFF;
  return ack;
}

Файлы

Файлы на гитхаб https://github.com/ENGIN33RRR/Attiny10_VoltMeter

Схема и ПП в диптрейс, прошивка в Arduino IDE.

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


  1. anzay911
    12.01.2023 07:13
    +2

    Меньше можно на семисегментном.


    1. Sau
      12.01.2023 07:33
      +8

      Можно меньше - мигать светодиодом азбукой Морзе!


      1. kulhaker478
        12.01.2023 11:42
        +1

        Тогда понадобится специально обученный (не обязательно маленький) человек-декодер)


        1. tormozedison
          13.01.2023 23:47

          Выучить на морзянке одни цифры можно за несколько минут, там есть закономерность.


    1. kulhaker478
      12.01.2023 11:45
      +9

      Есть тут у меня один претендент)

      Осталось подружить МК и LCD...


      1. nafikovr
        12.01.2023 11:48
        +3

        stm32l вам в помощь


        1. kulhaker478
          12.01.2023 12:34

          Слишком просто, хех-хе. А так да, вариант адекватный


          1. Kudriavyi
            12.01.2023 15:38
            +2

            Есть ещё stm8l, посложнее, зато сильно дешевле. И на удивление купить их до сих пор несложно


            1. kulhaker478
              13.01.2023 01:19

              Опять просто, (хотя относительно, надо на новые камни переучиваться) хочу с AVR подружить.. Ждите, не хочу спойлерить и загадывать сильно :3


            1. nafikovr
              13.01.2023 15:28

              дешевле ли...


      1. ENGIN33RRR Автор
        12.01.2023 12:08
        +2

        Тут подойдет что-то в корпусе tssop20, иначе плата будет значительно больше дисплея. Именно поэтому я и ставлю везде SSD1306- нужно всего 2 ноги МК. С вашим дисплеем нужно 10.


        1. Mirn
          12.01.2023 18:09

          а как же ресет? или этому дисплею все (включая аппаратный сброс после сбоя питания например) можно сделать по i2c/spi?


          1. ENGIN33RRR Автор
            12.01.2023 18:29

            Не часто вижу reset на i2c устройствах. У дисплея он конечно есть, но как обычно- просто заглушен подтяжкой на плюс. При сбое питания дисплей перезагрузится вместе с МК, точно так же как при обычном включении.


            1. Mirn
              12.01.2023 19:09

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


            1. sim2q
              13.01.2023 06:03

              Пишут, что некоторые i2c устройства зависают просаживая CLK и только питание дёрнуть помогает. Актуально наверное только для каких то удалённых устройств.


  1. BerkutEagle
    12.01.2023 07:43

    Можно залить верх эпоксидкой, и сшлифовать текстолит до самой меди :) Получится ещё меньше


    1. ENGIN33RRR Автор
      12.01.2023 08:16

      У меня есть стеклотекстолит толщиной 0.2мм. Правда работать с ним тот еще геморрой.


  1. MikeVC
    12.01.2023 08:13

    Хотел маленький ЖК индикатор приделать на батарею чтоб всегда показывал напряжение и при этом не разряжал. Обнаружил что таких не найдешь. Казалось бы, что может быть проще.


    1. ENGIN33RRR Автор
      12.01.2023 11:21

      Можно использовать E-Ink, они работают даже после отключения питания. Мк во сне тоже почти ничего не потребляют.


      1. MikeVC
        12.01.2023 11:23
        +2

        Есть такая идея. Но они дороги и выбор мал.

        Вобще, обычный ЛСД в часах от одной крошечной батарейки годами работает, стоит копейки. Но почему-то таких напряжометров не делают.


        1. chapai22
          12.01.2023 14:06
          +1

          ну так часы и возьмите и разберите заради экранчика. делов то.


          1. tormozedison
            13.01.2023 23:53

            Тут чувак попробовал таким индикатором (с динамической индикацией, да) поуправлять.

            https://github.com/vishalsoniindia/Hack-Digital-Watch-LCD

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


            1. kulhaker478
              14.01.2023 22:48

              Если не ошибаюсь (может и правда плохо тему копал), то важно просто обеспечить разность уровней с быстрым переключением, переменка не обязательна. Очень сомневаюсь, что LCDшки в тех же калькуляторах и градусниках кормят переменкой

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


              1. tormozedison
                14.01.2023 23:28
                +1

                Глянул код. Напомнило случай, когда в редакцию журнала "Горизонты техники для детей" некий читатель прислал программу для ZX Spectrum, рисующую голову мультперсонажа под названием Smurf. Программа состояла из одних PLOT и DRAW, тогда как можно было упаковать весь массив векторов в DATA и написать короткую программу, вытаскивающую эти данные по очереди и обрабатывающую. Но сотрудник редакции не поленился набрать эту простыню, запустить и показать дочери. Она его узнала. :)

                Уж не знаю, было ли это толстым троллингом редакции, или программист оказался действительно настолько начинающим, что не знал про DATA и READ.


  1. KbRadar
    12.01.2023 08:57
    +10

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


    1. ENGIN33RRR Автор
      12.01.2023 09:44
      +2

      Самый большой мой код был для ESP32. Около 6 -7 мегабайт. Но там и были- 4 дюймовый сенсорный дисплей, полноценный звук на I2S из BT, ну и естественно общение с сервером.


  1. HEXFFFFFFFF
    12.01.2023 09:10
    +2

    АЦП у таких контроллеров очень посредственный, нормальный вольтметр не получится. Дисплеи кстати бывают совсем маленькие из той же серии 8×12мм


    1. ENGIN33RRR Автор
      12.01.2023 11:22
      +1

      АЦП вполне обычный. Разве что опорное с питания берет, но хорошо стабилизировать питание при потреблении самого МК в несколько мА не проблема.


    1. dem0crypt
      12.01.2023 18:57

      По-моему там обычный для AVR АЦП стоит, только без опорного напряжения внешнего


  1. spesso
    12.01.2023 09:17

    Attiny10 самый маленький МК

    А как же Freescale Kinetis KL03? 1,6 на 2,0 мм, правда BGA.


    1. ENGIN33RRR Автор
      12.01.2023 11:24
      +2

      Не вырывайте слова из контекста

      Attiny10 самый маленький МК, из AVR точно


      1. spesso
        12.01.2023 13:47

        1. atd
          14.01.2023 00:23
          +1

          ATTINY10 бывает в wlcsp 1.5×1.6mm (код -uur)


  1. An_private
    12.01.2023 09:50
    +1

    Есть способ сделать конструкцию еще тоньше, но это уже ЛУТом не получится.

    Для каждой детали выфрезеровывается соответствующее отверстие в плате и деталь "утапливается" в плату. Результат выглядит странно, но вполне работоспособно.


    1. ENGIN33RRR Автор
      12.01.2023 11:30
      +1

      Я за толщиной не гнался. Как я говорил выше, у меня есть стеклотекстолит толщиной 0.2мм. На фото не лист медной фольги, а именно фольгированный стеклотекстолит, причем двусторонний.


  1. Domein
    12.01.2023 10:17
    +2

    Я увидел то что хотел, 912 байт это конечно сильно но можно ещё меньше на семисегментных индикаторах сделать.


    1. KbRadar
      12.01.2023 16:17
      +3

      572пв5+ЖКИ - вообще не нужна прошивка.


  1. BobovorTheCommentBeast
    12.01.2023 10:17
    -1

    Меньше можно на ПИК10 каком с OTP. (по стоимости конешн). Когда первый раз увидел аттини10 - смутила ее цена. (в 2016 была под 250р розницы в терре вроде).


  1. shornikov
    12.01.2023 10:32

    Ребят, проконсультируйте поверхностно, пожалуйста.

    Хочу на attiny13 + гироскоп MPU-6050 + светодиодики + CR батарейка + кнопка

    собрать "брелок" который будет моргать при отклонении от 90°, размером чуть больше этой самой батарейки.

    Я по питанию и мозгам пройду или 100% ерунда выходит?

    До этого баловался ардуинками.


    1. An_private
      12.01.2023 11:37
      +1

      Пройдёшь, конечно. У MPU питание 2.375V-3.46V, у attiny от 2.7В. Если взять с индексом V, то вообще от 1.8В


    1. ENGIN33RRR Автор
      12.01.2023 11:58
      +2

      Тяжело будет. Процедура калибровки 6050 и количество данных могут не поместится в 1кБ. На какой-нибудь аттини85 вообще без проблем. Причем тот же OLED можно повесить и смотреть положение в пространстве.


    1. KbRadar
      12.01.2023 16:19

      Какое отклонение и с какой точностью надо ловить? Может и контроллера не надо а достаточно датчика наклона с капелькой ртути...


      1. shornikov
        12.01.2023 17:43

        Про ртутные датчики я слышал, но надо почитать что у них с точностью и прочим. Думаю - не пойдет.

        Хочу примочку на перфоратор для контроля вертикальности/горизонтальности/задания угла.

        Но с заданием угла - это не точно. Проблемы и UI-интерфейсом и памятью МК.


        1. An_private
          12.01.2023 18:49
          +2

          На али по 100 рублей


          1. shornikov
            12.01.2023 19:21

            Такой пробовал.

            Проблема с "калибровкой" и контролем. Дискретное "горит/негорит", думаю, удобнее. Но, возможно, что окажется не лучше.

            Деталей тоже рублей на 100, если штучно закупаться.


        1. DonAgosto
          12.01.2023 20:31

          вертикальности/горизонтальности
          если сверлить стену, без компаса наверно не обойтись


          1. peacemakerv
            12.01.2023 21:47

            отвес с wifi
            https://play.google.com/store/apps/details?id=peacemaker.plumb

            устарел, оказывается, android_id не читает


        1. rrrad
          12.01.2023 23:51

          У вас отклонение показаний из-за вибраций от перфоратора, небось, будет превышать размер ожидаемого сигнала при отклонении угла.


          1. shornikov
            13.01.2023 01:03

            А моде

            А может загнëтся от помех с движка. Посмотрим)


        1. Uadance
          13.01.2023 10:20

          Люфт сверла в патррнк перфоратора будет нивелировать всю "точность" измерения))


          1. shornikov
            13.01.2023 14:53

            Нет. Речь о глубоких отверстиях - там это актуально. Точно-точно делать нужды нет, достаточно не облажаться по-крупному

            Я сверлил шахту под вентиляцию в газобетоне на 80 см глубины. И там мне бы это помогло сильно (наверное).


  1. Dark_Purple
    12.01.2023 12:14
    +5

    Меньше точно не бывает!

    Бывает))


    1. ENGIN33RRR Автор
      12.01.2023 12:28
      +3

      Ну это не серьезно, там же аж 20 ног! :)


      1. vadimk91
        12.01.2023 12:51

        Похоже эта штука кроме измерения напряжения ещё что-то умеет


        1. Dark_Purple
          12.01.2023 13:07

          Не так уж и много, умеет адекватно показывать напряжение до 24 вольт, кушать 2мкА в спячке, просыпаться по дабл тапу.


      1. Dark_Purple
        12.01.2023 13:01
        +1

        Так мы количеством меряемся или всё таки размерами? ))


    1. seri0shka
      12.01.2023 23:41

      Думал, как у меня дисплей, 0,42" 72х40, но на моём 16 ног. Какой здесь стоит?


  1. Gudd-Head
    12.01.2023 13:09
    +2

    с плечем 3.5

    С плечом.

    У меня на телефоне нет Ctrl+Enter


    1. ENGIN33RRR Автор
      12.01.2023 17:11

      Спасибо, поправил.


  1. iShrimp
    12.01.2023 18:39

    Отличная идея! Интересно, сильно ли вырастет прошивка, если в фоне (например, на каждом втором кадре) выводить осциллограмму сигнала. Насколько я помню, SSD1306 может принимать данные по столбцам, т.е. теоретически данные с АЦП можно не хранить, а сразу отправлять в порт.


    1. rrrad
      12.01.2023 23:48

      подозреваю, что осциллограмма в память не влезет


      1. sim2q
        13.01.2023 06:11

        использовать граф.память самого дисплея, но придётся отдать место на алгоритмы синхронизации


        1. rrrad
          13.01.2023 11:18
          +1

          т.е., сразу рисовать кривую? Можно, если хватит пропускной способности шины.


          1. sim2q
            13.01.2023 18:10
            +1

            Думал - рисовать по кусочкам. Но боюсь не хватит места на алгоритм. Ваш вариант конечно проще, но да - если только что то не быстрое.
            ps по аналогии когда-то думал как затащить ТВ сигнал, скорости и памяти мне не хватало, но можно было по частям.



  1. OldFashionedEngineer
    12.01.2023 21:18
    +4

    не пугайтесь картинке, Microchip купила Atme

    А чего пугаться то? Уже 9 лет прошло, как покупка состоялась)))

    Но я был немного обескуражен, когда очередной раз посетив сайт atmel.com был перенаправлен на микрочип!


    1. kulhaker478
      13.01.2023 11:07
      +1

      Ещё больше был обескуражен когда походил по старым ссылкам, вот например:
      http:/www.atmel.com/devices/atmega8.aspx?tab=overview
      http://www.atmel.com/Images/doc8103.pdf

      А ведь могли забить и не делать перенаправление, но нет, запилили таки, похвально


  1. seri0shka
    12.01.2023 23:19
    +2

    На обратной стороне платы деталей нет. Провода для прошивки. Извините за качество фото, всё никак не переставлю симки в новый смартфон.

    Вольтметр с этим дисплеем и Attiny10 был в планах, не дошли руки пока.


    1. nafikovr
      13.01.2023 15:35

      не мое, но более интересное https://youtu.be/6wBrOV2FJM8


      1. seri0shka
        13.01.2023 22:53

        Да, видел 2 недели назад, но там чуть ли не процессор управляет этим дисплеем, это из пушки по воробьям.