#1 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 20:18:13

Антончик пише:
Honey пише:

digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
перенесіть із loop в setup, вони і дають "ШІМ"

це і справді допомогло, але ви незнаєте чому це не заважало коду який написав до перериву?

Тому, що:

analogRead(sensor);
digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
...
digitalWrite(vbochku, LOW);

дає ШІМ з більшим коефіцієнтом заповнення нулем (це відповідає замкненому реле), ніж:

digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
analogRead(sensor);
...
digitalWrite(vbochku, LOW);

по причині того, що analogRead(sensor); дає значну затримку в часі.
Тобто і там також була та ж проблема з ШІМ, але реле не встигало розмикатись.

#2 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:53:33

digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
перенесіть із loop в setup, вони і дають "ШІМ"

#3 Re: Програмування Arduino » Допоможіть обійти бутлоадер Arduino Nano в PlatformIO. » 2023-09-26 15:16:45

А якщо вимкнути Boot Reset vector Enabled? тобто ось так:
avrdude -c USBasp -p m328pb -U hfuse:w:0xd7:m

PS: скомпілював і залив Ваш код на m168p - працює, як від нього і очікується.
Ф'юзи: -p m168p -U lfuse:w:0xff:m -U hfuse:w:0xdd:m -U efuse:w:0xff:m
Прошивка: 1.hex світлодіод на PD2
Порівняйте, можливо Ваш компілятор щось від себе додає.

#5 Re: Програмування Arduino » Допоможіть обійти бутлоадер Arduino Nano в PlatformIO. » 2023-09-25 22:54:59

Ви попросили вимкнути бутлоадер, цей рецепт його правильно і повністю вимикає. Якщо ви прошили в область бутлоадера нулі, то це також спрацює, просто буде виконуватись 512 або 2048 разів команда NOP (це кілька десятків мікросекунд, ви їх і не помітите).
Те, що не працює вочдог - окреме питання. Викладайте код, як ви його ініціалізуєте, і яким шляхом ви очікуєте, щоб програма йшла.

#6 Re: Програмування Arduino » Допоможіть обійти бутлоадер Arduino Nano в PlatformIO. » 2023-09-25 09:20:36

Вам потрібно за допомогою ф'юзів відключити бутлоадер. Для цього спочатку читаєте поточні ф'юзи:

avrdude -c USBasp -p m328p -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h

Вводите отримані значення в калькулятор ф'юзів (виберіть свій процесор ATmega328P) і в ньому редагуєте (те, що вас цікавить - прибрати галочку з Boot Reset vector Enabled):
https://www.engbedded.com/fusecalc/

Калькулятор видасть значення, які можна підставити в наступну команду. Потім записуєте (значення підставляєте свої):

avrdude -c USBasp -p m328p -U lfuse:w:0xff:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m

Тут інструкція по використанню avrdude під віндою:
https://forum.arduino.ua/viewtopic.php?id=2904

#8 Re: Різне » Срочное изготовление печатных плат (1-3 дня) фотоспособом » 2023-09-03 20:49:37

renoshnik пише:

По факту нужно будет посчитать с учетом бешеного аппетита НовойПочты, может ваша "маркетинговая срочность" будет выгоднее почтовой жадности ....  smile

Гляньте pcb24, я давав посилання, на сайті обіцяють безкоштовну пересилку. Ось знайшов фото плати, замовлялась у них в 2021:
pcb24.jpg
Якраз перевірите правдивість цін і розкажете яка у них зараз якість.

#9 Re: Програмування Arduino » Допоможіть будь ласка з скетчем для реле. » 2023-09-02 15:20:32

Даю підказку: дільника 2048 можна досягти за допомогою WGM mode=8,9,10,11, не доведеться сповільнювати процесор.
Ну і якщо вже так пропонуєте, використайте фітчу Toggle OC1A on compare match, взагалі буде хардварно вмикатися/вимикатися.

#10 Re: Різне » Срочное изготовление печатных плат (1-3 дня) фотоспособом » 2023-09-02 11:52:37

Якщо погуглити, то можна знайти в Україні і термінове фабричне виготовлення плат, ось перше ж посилання, причому з цінами, які не приховуються: https://www.pcb24.com.ua/
Моя плата, за яку Ви захотіли 506грн, у них коштує 499грн, це при тому, що вони роблять і металізацію отворів, і маску, і шовкографію (один раз в них замовляв - якість значно гірша ніж в китаї).
Приведу діаграму Венна для "ціна-швидкість-якість":
diagramma-venna-utopia.png
Самі зробіть висновок, де на діаграмі Ваші послуги.

#12 Re: Різне » Срочное изготовление печатных плат (1-3 дня) фотоспособом » 2023-08-29 12:01:22

sputnic1436 пише:

Вариант с фрезеровкой я вообще не расматриваю - т. к. сама технология ущербна и не в какое сравнение с фотоспособом не идет!

Самому було цікаво перевірити цей спосіб, тому замовив. Цікаво було б почути експертну оцінку:
frez.jpeg

sputnic1436 пише:

И то что дядя Вася сделает за 1-2 недели дешевле ...

Не з метою Вас якось образити, але коли на олх бачимо три пропозиції від трьох приватних осіб, то важко встановити, хто з них не "дядя Вася".

#13 Re: Різне » Срочное изготовление печатных плат (1-3 дня) фотоспособом » 2023-08-28 22:00:11

Васятко пише:

Неужели так тяжело написать "эти платы обошлись заказчику в ХХХ грн." ? Или это большая коммерческая тайна?

Щоб дізнатися і порівняти ціни я таки витратив час і зробив трасування плати в електронному вигляді, потім розіслав з запитом ціни по двом іншим знайденим пропозиціям на олх (об'яви ТС там також є, впізнати їх ви зможете по їх кількості). Просто приведу ціни за досить просту плату 120х59мм = 0.7кв.дм, односторонню, кількість 1шт:
1) (від ТС) 422/506 грн (без/з лудінням відповідно) способом фоторезист;
2) 187.13/231.98 грн (без/з лудінням відповідно) способом фоторезист;
3) 200грн/кв.дм без лудіння (менше 1кв.дм оплачується як за 1) способом фрезерування.

#14 Re: Різне » Обмін, продаж, то що... » 2023-08-21 22:05:34

image1.jpg
Купувалась в arduino.ua (посилання), використовувалась кілька днів і дуже акуратно.
Віддам зі знижкою 100грн.

#15 Re: Апаратні питання » Функція автоматичного вимкнення/увімкнення повербанку » 2023-08-16 21:53:47

Подивіться схему свого понижуючого DC-DC, принцип в ньому приблизно такий:
Buck-Converter-Circuit-Diagram.jpg
В точці між діодом і індуктивністю буде ШІМ з коефіцієнтом заповнення пропорційним струму споживача, пропускаєте ШІМ через RC-фільтр і вимірюєте напругу.

#16 Re: Програмування Arduino » Потрібна допомога у виправленні коду » 2023-08-14 20:09:27

Є ідея реалізації:
Ініціалізуємо 16-бітний таймер з дільником частоти 128, це дискретність 8мкс, переповнення через півсекунди.
В PCINT від IR приймача тупо записуєм в рінгбуфер значення таймера.
Під час вигрузки бітів в стрічку, коли переривання заборонені, цю ж функцію виконує код між вигрузкою бітів.
Коли вільні, вичитуєм з рінгбуфера і декодуємо.
Нажаль, програмування цього всього буде коштувати в рази дорожче, ніж ще одна ардуіна)

#17 Re: Різне » Срочное изготовление печатных плат (1-3 дня) фотоспособом » 2023-08-14 15:06:13

Просто скажіть ПОРЯДОК ЦІНИ при замовленні 1шт плати такої ж складності і площі, або саме цієї вказаної плати, якщо вам так принципово мати конкретне трасування (воно ж у вас є від попереднього замовника).
Перед тим, як витрачати час на підготовку трасування для замовлення, я хочу дізнатися порядок ціни. Бо я планував паяти на макетці з сіткою отворів 2.54x2.54, а для цього я не роблю трасування в електронному вигляді.

#18 Re: Програмування Arduino » Потрібна допомога у виправленні коду » 2023-08-14 14:15:18

Те, що ви хочете, (майже) неможливо реалізувати на одному AVR мікроконтролері.
IR приймач може видавати фронти з мінімальним інтервалом 562.5мкс, їх близько 30 на одне натиснення.
Стрічці потрібно передати один цілий нерозривний потік бітів, "відстань" між якими 1.25мкс, кількість бітів пропорційна довжині стрічки.
При 16MHz це відповідно 9000 і 20 тактів процесора. Якщо дуже гарно постаратися, то в цих 20 тактах можна якось обробляти дані з IR приймача, але це потрібно реалізовувати на ASM.
У вашому випадку краще взяти два мікроконтролери, один буде обробляти сигнали з IR приймача і відправляти в UART один символ на одне натиснення. Інший буде працювати по вашому алгоритму, але читатиме символи з UART, апаратний UART дозволить прийняти один символ під час запису на стрічку.

#19 Re: Різне » Срочное изготовление печатных плат (1-3 дня) фотоспособом » 2023-08-14 12:56:31

Плата точнісінько як на останньому фото сама нижня центральна, 95x70мм, одностороння, замовлення 1шт, скільки буде коштувати?

#20 Re: Програмування Arduino » Потрібна допомога. два леди та дві кнопки., а можливо і більше))) » 2023-08-03 11:31:49

#define TIMER_FREQ_HZ 1
void timer_init(void) {
  ICR1   = (62500 / TIMER_FREQ_HZ) - 1;
  TCCR1A = (2 << WGM10);
  TCCR1B = (3 << WGM12) | (4 << CS10); // 16MHz/256=62500
  TIMSK1 = (1 << TOIE1);
}
ISR(TIMER1_OVF_vect) { secund++; }

По таблиці з даташиту це WGM mode 14 = Fast PWM, але працює так само як mode 12 = CTC, плюс додатково смикає OVF_vect. Не звертайте увагу, що це Fast PWM, - поки біти COM1xn нульові, піни працюють у звичайному режимі.

#22 Re: Проекты » Модуль розширення портів + Linux » 2023-07-31 23:07:47

Придбав екранчик ssd1306 128x64 версію з SPI інтерфейсом щоб підключити до модуля розширення портів напряму, без Ардуіно, але виявилося, що в версії з SPI є нюанси, тому розкажу про підключення детальніше.

У екранчика є звичайні входи SPI: CS, SCK, MOSI - тут все добре, і є також входи RES і D/C - от з ними розберемося.
Одразу приведу робочу схему підключення і поясню призначення частин.
ssd1306.png
Нижні три деталі виконують "підтяжку з затримкою" для RES, щоб входи мікросхеми, які відповідають за вибір інтерфейсу обміну (I2C, SPI та ще кілька), встигли встановитись. При підтяжці одним лише резистором робота буде дуже нестабільною, в чому особисто переконався. Конденсатор робить наростання напруги на RES при включенні живлення повільним, а діод потрібен, щоб при вимкненні живлення швидко розрядити конденсатор. Номінали вказані приблизні, можна взяти резистор 4.7k або 20k, конденсатор - 1uF або 10uF. Доречі, ця схема є в версії плати з I2C інтерфейсом.

Якщо в протоколі I2C для цього екранчика першим байтом вказувався тип даних, які записуються - дані (0x40) чи команди (0x00), то в SPI цей байт не передаємо, а за вибір типу відповідає вхід D/C (data - high / command - low). Спочатку я використовував схему без верхнього діода, P0 (на схемі CS0) через підсистему gpio керував станом D/C, а весь обмін був через spi.1 (CS1 керує сигналом CS). Схема робоча, але виявилась незручною, тоді я придумав красивіше рішення: spi.1 зробити для надсилання даних, а spi.0 - для надсилання команд. Для цього CS0 і CS1 повинні мати змогу незалежно один від одного понижувати рівень одного й того ж CS, це і реалізується за допомогою верхнього діода, таблиця станів виглядає так:

       CS0 CS1 => CS  D/C
idle   1   1      1   1
spi.0  0   1      0   0
spi.1  1   0      0   1

Розділення на різні інтерфейси дозволяє не так плутатися, в якому режимі D/C зараз знаходимось, крім того можна для інтерфейсу даних окремо встановити, наприклад, порядок передачі бітів у байті (LSB замість MSB).

Для створення двох spidev виконуєм команди:

# echo 0 spidev >/sys/devices/w1_bus_master1/20-594e480f4241/spi_bind
# echo 1 spidev >/sys/devices/w1_bus_master1/20-594e480f4241/spi_bind

З'являться два пристрої:

# ls -ld /dev/spi*
crw-rw-rw- 1 root root 153, 0 Jul 31 14:21 /dev/spidev0.0
crw-rw-rw- 1 root root 153, 1 Jul 31 14:21 /dev/spidev0.1
lrwxrwxrwx 1 root root      9 Jul 31 14:21 /dev/spidev_20-594e480f4241.0 -> spidev0.0
lrwxrwxrwx 1 root root      9 Jul 31 14:21 /dev/spidev_20-594e480f4241.1 -> spidev0.1

Як ми знаємо, SPI - повнодуплексний інтерфейс, тому в Linux для роботи з файловим дескриптором spidev використовується не read/write а ioctl для одночасного запису і читання. Як виявляється, і про це сказано в документації, можна використовувати і read і/або write, але обмін буде напівдуплексним. А оскільки у екранчика і так передача лише в один бік, тому сміливо можна просто перенаправляти вивід в файл spidev (підсистема ядра зробить все, що потрібно - понизить відповідний CS, передасть дані і поверне високий рівень CS).

Ось мінімальна послідовність команд, щоб просто увімкнути екранчик (при цьому на екранчику відобразиться випадковий стан його пам'яті):

# echo -ne "\x8d\x14\xaf" >/dev/spidev_20-594e480f4241.0

Можна встановити, наприклад, вертикальний режим адресації і записати 1024 нульові байти в пам'ять:

# echo -ne "\xc8\x20\x01" >/dev/spidev_20-594e480f4241.0
# head -c 1024 /dev/zero >/dev/spidev_20-594e480f4241.1

Екранчик очиститься, це відбуватиметься зверху вниз, якщо екранчик повернутий як на малюнку на схемі (у портретному режимі, контактами зліва). Якщо бути ще точнішим, то кожен рядок пікселів заповнювався зліва направо, цей напрям був заданий додатковою командою xc8. Я так зробив навмисно, щоб порядок байтів пам'яті екранчика був таким же, як порядок байтів у растрових зображень.

Є такий підходящий формат для монохромних зображень без компресії .pbm (Portable Bitmap), який можна записувати в пам'ять екранчика як є.
В цьому форматі нульові біти відповідають білому кольору, а одиничні - чорному, тому потрібно ввімкнути інверсію (екранчик стане білим, бо в пам'яті нулі):

# echo -ne "\xa7" >/dev/spidev_20-594e480f4241.0

Є ще один нюанс: самий перший, верхній лівий піксель в форматі .pbm відповідає старшому (7-ому) біту першого байту, а в пам'яті екранчика цей самий піксель відповідає молодшому (0-му) біту першого байту, тому потрібно якимось чином змінити порядок бітів у всіх байтах зображення. Це можна зробити переконвертувавши файл, а можна зробити хитріше: SPI-приймач (екранчик) очікує байти в режимі MSB (від старшого до молодшого біта), а передавач (spidev) можна налаштувати в режим LSB (від молодшого до старшого біта). Змінимо режим spidev, який відповідає за передачу даних, за допомогою невеликої програми:

#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
int main(int argc, char **argv) {
  char s = 1;
  int fd = open(argv[1], O_RDWR);
  ioctl(fd, SPI_IOC_WR_LSB_FIRST, &s);
}

Компілюєм і запускаєм:

# gcc spi_lsb.c -o spi_lsb
# ./spi_lsb /dev/spidev_20-594e480f4241.1

Тепер екранчик готовий до прийому зображень.

Підготував ось таке зображення mona.pbm розміром 64x128:
mona.png
Відправляєм його на екранчик, але не весь файл, а частину після заголовків, це рівно 1024 останні байти файлу:

# tail -c 1024 mona.pbm >/dev/spidev_20-594e480f4241.1

Ось, що відобразиться на екранчику:
ssd1306.jpg

Тепер коротко мінімальний список команд:

# echo 0 spidev >/sys/devices/w1_bus_master1/20-594e480f4241/spi_bind
# echo 1 spidev >/sys/devices/w1_bus_master1/20-594e480f4241/spi_bind
# echo -ne "\x8d\x14\xa7\xc8\xaf\x20\x01" >/dev/spidev_20-594e480f4241.0
# ./spi_lsb /dev/spidev_20-594e480f4241.1
# tail -c 1024 mona.pbm >/dev/spidev_20-594e480f4241.1

Перші чотири команди можна доручити udevd виконувати автоматично щоразу при появі на шині 1-wire модуля розширення портів з підключеним екранчиком:

ACTION=="add", SUBSYSTEM=="w1", KERNEL=="20-594e480f4241",\
 ATTR{spi_bind}+="0 spidev", ATTR{spi_bind}+="1 spidev"
ACTION=="add", SUBSYSTEM=="spidev", KERNELS=="20-594e480f4241",\
 DEVPATH=="*/spi0.0/*", SYMLINK+="ssd1306_cmd", MODE="0666",\
 RUN+="/bin/sh -c '/bin/cat /usr/local/share/ssd1306_init.bin >/dev/%k'"
ACTION=="add", SUBSYSTEM=="spidev", KERNELS=="20-594e480f4241",\
 DEVPATH=="*/spi0.1/*", SYMLINK+="ssd1306_data", MODE="0666",\
 RUN+="/usr/local/bin/spi_lsb /dev/%k"

Необхідні файли створюєм один раз так:

# gcc spi_lsb.c -o /usr/local/bin/spi_lsb
# echo -ne "\x8d\x14\xa7\xc8\xaf\x20\x01" >/usr/local/share/ssd1306_init.bin

Правила створять також символьні посилання: /dev/ssd1306_cmd та /dev/ssd1306_data для відправки команд і даних відповідно.

Команди для конвертації будь-яких зображень в формат .pbm розміром 64x128:

# convert -resize 64x128^ -gravity center -crop 64x128+0+0 +repage -monochrome -dither FloydSteinberg mona_big.jpg mona1.pbm
# convert -resize 64x128^ -gravity center -crop 64x128+0+0 +repage -remap pattern:gray50 -dither FloydSteinberg mona_big.jpg mona.pbm

два варіанти на вибір.
Якщо зображення в ландшафтному форматі, то спочатку треба його повернути:

# convert -rotate 90 -resize 64x128^ -gravity center -crop 64x128+0+0 +repage -monochrome -dither FloydSteinberg landscape.jpg img.pbm

#23 Re: Різне » Підскажіть як Заживити HC-06 від CNC Shild? » 2023-07-21 10:31:59

Припаяйте перемичку на шилді між входом +12В і контактом, що відповідає VIN на уно (крайній правий контакт на нижній центральній групі контактів на вашому малюнку).

#24 Re: Апаратні питання » Вимірювання напруги на виході МОСФЕТА у нижньому плечі » 2023-07-17 17:48:48

Якщо достатньо вимірювати лише при відкритому транзисторі, то найдешевший спосіб - обмежити напругу стабілітроном на аналоговому вході.
Використати p-канальний транзистор - проблема відпаде.

#25 Re: Програмування Arduino » BME280 i2c 2 шт на одну ардуину » 2023-07-13 20:53:20

Теоретично має спрацювати так, але сам не пробував:
Adafruit_BME280 bme1;
Adafruit_BME280 bme2;
...
bme1.begin(0x76);
bme2.begin(0x77);
В даташиті пишуть, що SDO задає молодший біт адреси: при SDO=0 буде 0x76, при SDO=VCC буде 0x77, здається, на платі якраз і вивели поряд три контактні майданчики [GND,SDO,VCC].

Підвал форуму