В продолжение к прошлой статье решил пощупать и 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)
BerkutEagle
12.01.2023 07:43Можно залить верх эпоксидкой, и сшлифовать текстолит до самой меди :) Получится ещё меньше
ENGIN33RRR Автор
12.01.2023 08:16У меня есть стеклотекстолит толщиной 0.2мм. Правда работать с ним тот еще геморрой.
MikeVC
12.01.2023 08:13Хотел маленький ЖК индикатор приделать на батарею чтоб всегда показывал напряжение и при этом не разряжал. Обнаружил что таких не найдешь. Казалось бы, что может быть проще.
ENGIN33RRR Автор
12.01.2023 11:21Можно использовать E-Ink, они работают даже после отключения питания. Мк во сне тоже почти ничего не потребляют.
MikeVC
12.01.2023 11:23+2Есть такая идея. Но они дороги и выбор мал.
Вобще, обычный ЛСД в часах от одной крошечной батарейки годами работает, стоит копейки. Но почему-то таких напряжометров не делают.
chapai22
12.01.2023 14:06+1ну так часы и возьмите и разберите заради экранчика. делов то.
tormozedison
13.01.2023 23:53Тут чувак попробовал таким индикатором (с динамической индикацией, да) поуправлять.
https://github.com/vishalsoniindia/Hack-Digital-Watch-LCD
Не вникал пока, постоянным током, или переменным. Лучше переменным, чтобы электролиза не было. Индикатор дольше протянет.
kulhaker478
14.01.2023 22:48Если не ошибаюсь (может и правда плохо тему копал), то важно просто обеспечить разность уровней с быстрым переключением, переменка не обязательна. Очень сомневаюсь, что LCDшки в тех же калькуляторах и градусниках кормят переменкой
По проекту ничего особенного, а в местный...кхм с позволения, код, так вообще не рекомендую лезть, если психика слаба...tormozedison
14.01.2023 23:28+1Глянул код. Напомнило случай, когда в редакцию журнала "Горизонты техники для детей" некий читатель прислал программу для ZX Spectrum, рисующую голову мультперсонажа под названием Smurf. Программа состояла из одних PLOT и DRAW, тогда как можно было упаковать весь массив векторов в DATA и написать короткую программу, вытаскивающую эти данные по очереди и обрабатывающую. Но сотрудник редакции не поленился набрать эту простыню, запустить и показать дочери. Она его узнала. :)
Уж не знаю, было ли это толстым троллингом редакции, или программист оказался действительно настолько начинающим, что не знал про DATA и READ.
KbRadar
12.01.2023 08:57+10912 байт - вот это пример правильного ПО. А то в последнее время уже прошивки начали мегабайтами начинать измерять...
ENGIN33RRR Автор
12.01.2023 09:44+2Самый большой мой код был для ESP32. Около 6 -7 мегабайт. Но там и были- 4 дюймовый сенсорный дисплей, полноценный звук на I2S из BT, ну и естественно общение с сервером.
HEXFFFFFFFF
12.01.2023 09:10+2АЦП у таких контроллеров очень посредственный, нормальный вольтметр не получится. Дисплеи кстати бывают совсем маленькие из той же серии 8×12мм
ENGIN33RRR Автор
12.01.2023 11:22+1АЦП вполне обычный. Разве что опорное с питания берет, но хорошо стабилизировать питание при потреблении самого МК в несколько мА не проблема.
dem0crypt
12.01.2023 18:57По-моему там обычный для AVR АЦП стоит, только без опорного напряжения внешнего
spesso
12.01.2023 09:17Attiny10 самый маленький МК
А как же Freescale Kinetis KL03? 1,6 на 2,0 мм, правда BGA.
ENGIN33RRR Автор
12.01.2023 11:24+2Не вырывайте слова из контекста
Attiny10 самый маленький МК, из AVR точно
An_private
12.01.2023 09:50+1Есть способ сделать конструкцию еще тоньше, но это уже ЛУТом не получится.
Для каждой детали выфрезеровывается соответствующее отверстие в плате и деталь "утапливается" в плату. Результат выглядит странно, но вполне работоспособно.
ENGIN33RRR Автор
12.01.2023 11:30+1Я за толщиной не гнался. Как я говорил выше, у меня есть стеклотекстолит толщиной 0.2мм. На фото не лист медной фольги, а именно фольгированный стеклотекстолит, причем двусторонний.
BobovorTheCommentBeast
12.01.2023 10:17-1Меньше можно на ПИК10 каком с OTP. (по стоимости конешн). Когда первый раз увидел аттини10 - смутила ее цена. (в 2016 была под 250р розницы в терре вроде).
shornikov
12.01.2023 10:32Ребят, проконсультируйте поверхностно, пожалуйста.
Хочу на attiny13 + гироскоп MPU-6050 + светодиодики + CR батарейка + кнопка
собрать "брелок" который будет моргать при отклонении от 90°, размером чуть больше этой самой батарейки.
Я по питанию и мозгам пройду или 100% ерунда выходит?
До этого баловался ардуинками.
An_private
12.01.2023 11:37+1Пройдёшь, конечно. У MPU питание 2.375V-3.46V, у attiny от 2.7В. Если взять с индексом V, то вообще от 1.8В
ENGIN33RRR Автор
12.01.2023 11:58+2Тяжело будет. Процедура калибровки 6050 и количество данных могут не поместится в 1кБ. На какой-нибудь аттини85 вообще без проблем. Причем тот же OLED можно повесить и смотреть положение в пространстве.
KbRadar
12.01.2023 16:19Какое отклонение и с какой точностью надо ловить? Может и контроллера не надо а достаточно датчика наклона с капелькой ртути...
shornikov
12.01.2023 17:43Про ртутные датчики я слышал, но надо почитать что у них с точностью и прочим. Думаю - не пойдет.
Хочу примочку на перфоратор для контроля вертикальности/горизонтальности/задания угла.
Но с заданием угла - это не точно. Проблемы и UI-интерфейсом и памятью МК.
An_private
12.01.2023 18:49+2На али по 100 рублей
shornikov
12.01.2023 19:21Такой пробовал.
Проблема с "калибровкой" и контролем. Дискретное "горит/негорит", думаю, удобнее. Но, возможно, что окажется не лучше.
Деталей тоже рублей на 100, если штучно закупаться.
DonAgosto
12.01.2023 20:31вертикальности/горизонтальности
если сверлить стену, без компаса наверно не обойтисьpeacemakerv
12.01.2023 21:47отвес с wifi
https://play.google.com/store/apps/details?id=peacemaker.plumb
устарел, оказывается, android_id не читает
Uadance
13.01.2023 10:20Люфт сверла в патррнк перфоратора будет нивелировать всю "точность" измерения))
shornikov
13.01.2023 14:53Нет. Речь о глубоких отверстиях - там это актуально. Точно-точно делать нужды нет, достаточно не облажаться по-крупному
Я сверлил шахту под вентиляцию в газобетоне на 80 см глубины. И там мне бы это помогло сильно (наверное).
Dark_Purple
12.01.2023 12:14+5Меньше точно не бывает!
Бывает))
ENGIN33RRR Автор
12.01.2023 12:28+3Ну это не серьезно, там же аж 20 ног! :)
vadimk91
12.01.2023 12:51Похоже эта штука кроме измерения напряжения ещё что-то умеет
Dark_Purple
12.01.2023 13:07Не так уж и много, умеет адекватно показывать напряжение до 24 вольт, кушать 2мкА в спячке, просыпаться по дабл тапу.
seri0shka
12.01.2023 23:41Думал, как у меня дисплей, 0,42" 72х40, но на моём 16 ног. Какой здесь стоит?
iShrimp
12.01.2023 18:39Отличная идея! Интересно, сильно ли вырастет прошивка, если в фоне (например, на каждом втором кадре) выводить осциллограмму сигнала. Насколько я помню, SSD1306 может принимать данные по столбцам, т.е. теоретически данные с АЦП можно не хранить, а сразу отправлять в порт.
rrrad
12.01.2023 23:48подозреваю, что осциллограмма в память не влезет
sim2q
13.01.2023 06:11использовать граф.память самого дисплея, но придётся отдать место на алгоритмы синхронизации
rrrad
13.01.2023 11:18+1т.е., сразу рисовать кривую? Можно, если хватит пропускной способности шины.
sim2q
13.01.2023 18:10+1Думал - рисовать по кусочкам. Но боюсь не хватит места на алгоритм. Ваш вариант конечно проще, но да - если только что то не быстрое.
ps по аналогии когда-то думал как затащить ТВ сигнал, скорости и памяти мне не хватало, но можно было по частям.
OldFashionedEngineer
12.01.2023 21:18+4не пугайтесь картинке, Microchip купила Atme
А чего пугаться то? Уже 9 лет прошло, как покупка состоялась)))
Но я был немного обескуражен, когда очередной раз посетив сайт atmel.com был перенаправлен на микрочип!
kulhaker478
13.01.2023 11:07+1Ещё больше был обескуражен когда походил по старым ссылкам, вот например:
http:/www.atmel.com/devices/atmega8.aspx?tab=overview
http://www.atmel.com/Images/doc8103.pdf
А ведь могли забить и не делать перенаправление, но нет, запилили таки, похвально
seri0shka
12.01.2023 23:19+2На обратной стороне платы деталей нет. Провода для прошивки. Извините за качество фото, всё никак не переставлю симки в новый смартфон.
Вольтметр с этим дисплеем и Attiny10 был в планах, не дошли руки пока.
nafikovr
13.01.2023 15:35не мое, но более интересное https://youtu.be/6wBrOV2FJM8
seri0shka
13.01.2023 22:53Да, видел 2 недели назад, но там чуть ли не процессор управляет этим дисплеем, это из пушки по воробьям.
anzay911
Меньше можно на семисегментном.
Sau
Можно меньше - мигать светодиодом азбукой Морзе!
kulhaker478
Тогда понадобится специально обученный (не обязательно маленький) человек-декодер)
tormozedison
Выучить на морзянке одни цифры можно за несколько минут, там есть закономерность.
kulhaker478
Есть тут у меня один претендент)
Осталось подружить МК и LCD...
nafikovr
stm32l вам в помощь
kulhaker478
Слишком просто, хех-хе. А так да, вариант адекватный
Kudriavyi
Есть ещё stm8l, посложнее, зато сильно дешевле. И на удивление купить их до сих пор несложно
kulhaker478
Опять просто, (хотя относительно, надо на новые камни переучиваться) хочу с AVR подружить.. Ждите, не хочу спойлерить и загадывать сильно :3
nafikovr
дешевле ли...
ENGIN33RRR Автор
Тут подойдет что-то в корпусе tssop20, иначе плата будет значительно больше дисплея. Именно поэтому я и ставлю везде SSD1306- нужно всего 2 ноги МК. С вашим дисплеем нужно 10.
Mirn
а как же ресет? или этому дисплею все (включая аппаратный сброс после сбоя питания например) можно сделать по i2c/spi?
ENGIN33RRR Автор
Не часто вижу reset на i2c устройствах. У дисплея он конечно есть, но как обычно- просто заглушен подтяжкой на плюс. При сбое питания дисплей перезагрузится вместе с МК, точно так же как при обычном включении.
Mirn
просто на одной поделке у меня был опыт когда дисплей с другим контроллером SSD13xy, где х точно не нуль (не помню уже точно номер), этот дисплей не выключился при разряде батареи а странно заглючил и подзарядка и софтовый сброс не помог, только отключение и разрядка в нуль. Исправил тем что пришлось подпаять аппаратный сброс - проблема ушла.
sim2q
Пишут, что некоторые i2c устройства зависают просаживая CLK и только питание дёрнуть помогает. Актуально наверное только для каких то удалённых устройств.