#1 Re: Програмування Arduino » не працює ArduinoISP » 2025-03-20 21:02:25

Спробуйте зробити за допомогою avrdude з командного рядка по цій інструкції https://forum.arduino.ua/viewtopic.php?id=2904
Також подивіться, що за ArduinoISP.ino ви компілюєте, його потрібно брати з arduino-examples, бо в інеті валяється купа його непрацюючих модифікацій.

#2 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-15 15:39:17

float floatval = 26.4212;
int intval = floatval * 100 + 0.5;
Send_ar[6] = intval >> 8;
Send_ar[7] = intval & 0xff;

#3 Re: Програмування Arduino » Ошибка компиляции » 2025-03-07 12:38:24

vigor53 пише:

Доброго всем здоровья!
Просветите пожалуйста строчка в коде что означает  4000000.0F

#define resistorValue  4000000.0F   // change this to whatever resistor value you are using

F - суфікс для константи типу float
https://en.wikipedia.org/wiki/C_data_types

#4 Re: Програмування Arduino » Циклічний (коловий) масив » 2025-01-03 21:42:24

Основною фішкою рінгбуфера (якщо не псувати "оптимізаціями" стандартну реалізацію) є можливість виконувати запис і читання в двох окремих потоках без будь-яких синхронізацій між ними.

#5 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-02 09:41:05

Зробіь масив int random_index[16]; спочатку заповніть його числами від 0 до 15, а потім їх перетасуйте (google: shuffle), з масиву послідовно берете індекс і заповнюєте цей стовпчик

#6 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-01 18:44:36

Вилазите за межі масива
i=4 замінити на i=3
i<=4 замінити на i<4

#7 Re: Апаратні питання » Усилтель напряжения с 5 на 10 вольт или АЦП 10 вольт » 2024-12-23 18:47:33

shrek пише:

Как не крути переменный резистор, на выходе всегда 11.2.

У Вас входи підсилювача закорочені між собою.

#9 Re: Проекти » Моніторинг батареї UPS через інтернет » 2024-12-21 09:55:48

З езернет інтерфейсом https://github.com/honechko/snmpvm
Ще поки руки не дійшли замовити в китаї платки та оформити в пристойному вигляді

#10 Re: Програмування Arduino » Нужна консультация ардуино + Nextion экран. Заплачу. » 2024-10-27 10:13:27

dimich пише:

Вставив картинкою бо форумний двіжок зʼїдає бекслеші в тексті

Ставте два бекслеша підряд. При використанні "попередній перегляд" один бекслеш зникає в вікні вводу тексту, тому доводиться ще раз розставляти дублі.

#11 Re: Проекти » Майстер шини 1-wire + Linux » 2024-10-17 16:30:51

Оффтоп: може кому пригодиться така ідея конвертера логічних рівнів для ESP-01 на основі цієї платки, використовував її при розробці прошивки, також можна використати для отримання 5-вольтового 1-wire.
P1150223_s.jpg
P1150224_s.jpgP1150225_s.jpg

#12 Re: Проекти » Майстер шини 1-wire + Linux » 2024-10-17 14:38:29

Зарезервований коментар, якщо тема розростеться, щоб робити тут посилання по темі.

#13 Проекти » Майстер шини 1-wire + Linux » 2024-10-17 14:37:09

Honey
відповідей: 3

Для тих, хто працює з 1-wire під Linux, доступні два способи роботи з адаптером (майстром шини 1-wire): з простору користувача (найпопулярнішим ПЗ є OWFS) і через драйвер в ядрі. В OWFS реалізована робота майже з усіма існуючими адаптерами, а от в ядрі не густо, є драйвери GPIO-адаптера (w1-gpio), USB-адаптера (ds2490), I2C-адаптера (ds2482), але чомусь не було UART-адаптера (ds2480b).

Коли я вибирав, на якій мікросхемі зробити готовий пристрій, то, незважаючи на це, вибрав UART-інтерфейс, оскільки для моїх задач була необхідна гальванічна розв'язка і зробити її значно простіше на однонаправлених лініях, а з драйвером вирішив "розібратися" пізніше. Є ще й друга причина вибору саме послідовного інтерфейсу, але про це згодом.

Отже, Linux-драйвер для ось такого готового майстра шини 1-wire на мікросхемі ds2480b вже є і його можна взяти звідси. В цій темі намагатимусь допомагати з компіляцією драйвера.

1-wire bus master

Якщо адаптер підключено до комп'ютера з Linux через USB-UART або до пінів Raspberry Pi ось так:
UART 5V
Raspberry Pi
Тоді "приєднати" драйвер до відповідного послідовного порта (/dev/ttyUSB0 або /dev/ttyAMA0) можна командою:

ser1wm_attach /dev/ttyUSB0

Виконувати цю команду можна доручити udevd, щоб він її виконував щоразу, коли до USB підключається USB-UART, до якого підключено майстер шини 1-wire. Наприклад так:

ACTION=="add", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb",\
 ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A50285BI",\
 RUN+="/usr/local/bin/ser1wm_attach /dev/%k"

В Linux є така утиліта socat, за допомогою якої послідовний порт по TCP можна "передати" на інший хост:

1) на боці реального послідовного порта піднімаєм сервер на TCP-порту:
socat tcp-l:4232,bind=10.0.0.4,reuseaddr /dev/ttyUSB0,raw,echo=0,b9600,cs8

2) на іншому боці підключаємось і утворюєм віртуальний послідовний порт:
socat tcp:10.0.0.4:4232 pty,raw,echo=0,link=/dev/ttyvirt0

До такого віртуального послідовного порта також можна приєднати даний драйвер:

ser1wm_attach /dev/ttyvirt0

Але в ser1wm_attach реалізована можливість робити це напряму без другої команди socat (її функціонал вбудовано), ось так:

ser1wm_attach 10.0.0.4:4232

Кмітливі вже здогадалися, що і першу команду socat також можна в щось вбудувати, наприклад реалізувати її на мікроконтролері з мережевим інтейфейсом, до якого підключено майстер шини 1-wire (або навіть і майстер шини реалізувати програмно). Це і є та друга причина, по якій вибрано послідовний інтерфейс, оскільки його без будь-яких алгоритмів і overhead можна передавати по TCP.

В якості proof-of-concept викладаю прошивку, яка перетворить ESP-01 на майстер шини 1-wire (на піні RX), а по TCP дозволяє приєднати даний драйвер за допомогою останньої наведеної команди ser1wm_attach.

WiFi 1-wire bus master
Для переведення прошивки в режим конфігурування потрібно при подачі живлення закоротити між собою (але не на землю) піни IO0 та IO2. В режимі конфігурування (на це вказує блимання світлодіодом) підключитися до точки доступу ser1wm_setup, зайти браузером на http://192.168.1.1/ і виконати налаштування.

В планах є також реалізація "Ethernet to 1-wire", тому драйвер назвав не ds2480b а більш загально - ser1wm (скорочення від serial 1-wire master).

Добре, "приєднали" драйвер до послідовного порта чи ESP, а що далі?

В dmesg маємо побачити щось подібне:

serio: Serial port pts9
ser1wm serio3: attaching 1-wire bus master
w1_master_driver w1_bus_master1: Attaching one wire slave 28.0000023ccaeb crc 45

Ядро саме буде періодично (раз на 10 сек) опитувати шину 1-wire і писати в dmesg про знайдені слейви. Кожен слейв, поки він присутній на шині, буде мати свій каталог в /sys/bus/w1/devices в якому будуть файли для роботи з слейвом, які саме файли - залежить від сімейства слейва. Наприклад, для DS18B20:

cat /sys/bus/w1/devices/28-0000023ccaeb/w1_slave
78 01 1e 00 7f ff 08 10 e1 : crc=e1 YES
78 01 1e 00 7f ff 08 10 e1 t=23500

#14 Re: Програмування Arduino » переривання по usart atmega » 2024-10-12 10:33:17

Можу зробити те, що ви хочете, на m8a або m328p, звертайтесь в пошту.

#15 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-16 08:41:30

Cherep_VM пише:

датчик з газ.лічильника - геркон

Можна використати SS49E (аналоговий датчик Холла), але він потребує налаштування threshold-ів, це робиться записом в пам'ять лічильника і я для цієї процедури написав веб-інтерфейс (інструкція), що вже вимагає щоб лічильник був підключений до лінукса на якому має бути запущений owhttpd. Тут один користувач викладав урізану лише для ds2423 "емуляцію" owhttpd на мікроконтролері.

#16 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-15 22:49:46

Якщо піни вашого МК не толерантні до 5В, то скористайтесь такою схемою (фактично схема перетворювача логічних рівнів):
large_image9.jpg
Між GPIO4 на схемі (це ваш вихід МК) і +3.3V можна додати резистор 10-100кОм, або програмно використати вбудований в МК.

#17 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-10 09:17:45

Cherep_VM пише:

Тепер, коли буду щось писати в сторінку, то теж, в підрахунок CRC включати байти команди та адреса, я правильно розумію?

Треба дивитися даташит, шукаєте там Memory function flow chart, вам спочатку потрібна буде команда OFh для запису в скретчпад, бачите там "Master RX CRC16 of Command, Address, Data" - це значить, що потрібно включати, наступною командою 55h потрібно скопіювати скретчпад в сторінку.

#18 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-09 15:34:25

Я б ось це

#define inBit1Wire(inBit)
	LineWire	=0;				delay_us( 8);
	LineWire	=1;				delay_us( 1);
	inBit		=LineWire;		delay_us(40);
	LineWire	=1;				delay_us(90);

змінив на таке

#define inBit1Wire(inBit)
	LineWire	=0;				delay_us( 8);
	LineWire	=1;				delay_us(11);
	inBit		=LineWire;		delay_us(30);
	LineWire	=1;				delay_us(90);

бо лінія може не встигнути піднятись за 1мкс

#19 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-09 14:08:14

Приблизно так (псевдокод):
write_0 {
  bus_low
  delay 59
  bus_hiz
  delay 11
}
write_1_read {
  bus_low
  delay 10
  bus_hiz
  delay 5
  r = bus_read
  delay 55
  return r
}

#20 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-09 13:54:08

У вас трохи неправильні таймінги. Відправка нуля - це ~59мкс нуль на шині і не менше 1мкс одиниця, відправка одиниці - 5..10мкс нуль і ~55мкс одиниця. Слейв робить зчитування шини через 30-35мкс після падаючого фронту (тобто десь посередині) і визначає, там передали 0 чи 1. А якщо слейв хоче передати нуль, то він по падаючому фронту замикає шину на землю на 30-40мкс, тобто мастер повинен робити зчитування десь посередині - приблизно на 15..20й мікросекунді.

#21 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-09 13:40:29

Це штатний режим роботи, при напрузі зовнішнього живлення <~4.5V (VCC або паразитного через DQ), лічильник вимикає 1-wire інтерфейс але продовжує рахувати імпульси. Пов'язано це з тим, що споживання лічильника йде з трьох джерел - з батарейки, з VCC, з DQ - кожне через діод, яка напруга більша, звідти і споживання, коли зовнішнє живлення (VCC, DQ) лічильник вважає низьким, то щоб менше споживати від батарейки, він вимикає інтерфейсну частину. Тобто VCC або DQ має бути >4.5V, про це сказано в характеристиках пристрою, що VCC і DQ мають бути в межах 4.5 .. 5.5V.
При паразитному живленні струм споживання йде через резистор підтяжки і напруга DQ, звичайно, просідає. При підтяжці 1кОм можна заживити 1, максимум 2 лічильники (я не робив детальних досліджень). Мінімум, що допускає специфікація 1-wire це підтяжка 500 Ом.

#22 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-09 11:28:24

На правах реклами)
Коли відточите навички читання/записування сторінок, спробуйте ось цей мій пристрій.

#23 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-09 10:33:06

Для вашого прикладу на фото:

#include <stdio.h>
#include <stdint.h>

uint16_t crc16_update(uint16_t crc, uint8_t a)
{
  int i;
  crc ^= a;
  for (i = 0; i < 8; ++i) {
    if (crc & 1)
      crc = (crc >> 1) ^ 0xA001;
    else
      crc = (crc >> 1);
  }
  return crc;
}

int main()
{
  uint8_t buf[45] = {
    0xa5, 0xc0, 0x01, // READMEMCOUNTER, address
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0xbb,0x00,0x00,0x60,0x00,0xed,0x00,0x41,
    0x31,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
    0xe3, 0x1b
  };
  uint16_t crc;
  int i;

  crc = 0;
  for (i = 0; i < 43; i++)
    crc = crc16_update(crc, buf[i]);
  printf("crc = 0x%02x 0x%02xn", (uint8_t)~(crc & 0xff), (uint8_t)~(crc >> 8));

  crc = 0;
  for (i = 0; i < 45; i++)
    crc = crc16_update(crc, buf[i]);
  if (crc == 0xb001)
    printf("crc okn");
  else
    printf("crc errorn");
}

Вивід:

crc = 0xe3 0x1b
crc ok

#24 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-09 10:03:43

Ось вам приклад, щоб розібратися:

#include <stdio.h>
#include <stdint.h>

uint16_t crc16_update(uint16_t crc, uint8_t a)
{
  int i;
  crc ^= a;
  for (i = 0; i < 8; ++i) {
    if (crc & 1)
      crc = (crc >> 1) ^ 0xA001;
    else
      crc = (crc >> 1);
  }
  return crc;
}

int main()
{
  uint8_t buf[10] = {11, 12, 13, 14, 15, 16, 17, 18};
  uint16_t crc;
  int i;

  /* додавання crc до повідомлення */
  crc = 0;
  for (i = 0; i < 8; i++)
    crc = crc16_update(crc, buf[i]);
  buf[i++] = ~(crc & 0xff);
  buf[i++] = ~(crc >> 8);

  /* перевірка повідомлення з crc */
  crc = 0;
  for (i = 0; i < 10; i++)
    crc = crc16_update(crc, buf[i]);
  if (crc == 0xb001)
    printf("crc okn");
  else
    printf("crc errorn");
}

Перевіряти контрольну суму можна тим же способом, що і заповнювали, або використати властивість, що контрольна сума повідомлення разом його інвертованою контрольною сумою завжди буде 0xb001.

Звичайно crc16_update() можна оптимізувати, наприклад, як у вашому прикладі з oddparity.

Зверніть увагу, що в ds2423 при першому читанні сторінки контрольна сума обчислюється не лише над даними, чотирма нульовими байтами і чотирма байтами лічильника, але ще спочатку і над самою командою (0xa5) і двома байтами адреси (а для наступних сторінок, якщо читаємо далі підряд, вже лише над всіма байтами сторінки, 4 нульовими байтами і 4 байтами лічильника). Також не обов'язково вичитувати всі 32 байти сторінки, якщо потрібен лише лічильник, можна почати з останнього байту сторінки, ось тут приклад, як найпростіше прочитати лише байти лічильника.

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