#76 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 16:38:30

jokeR пише:

Але в такому записі легко допустити помилку, і компілятор її нормально пропустить.

Компілятор взагалі багато чого нормально пропускає. Для того і потрібна прокладка між стільцем та клавіатурою.

#define ARRAY_SIZE(x)  (sizeof(x)/sizeof(*(x)))

Або взагалі std::array без кофеіну:

template <typename T, size_t N>
struct array
{
    T data[N];
    constexpr size_t size() const noexcept { return N; }
};

А там можна і оператор [] перевантажити, і ітератори прикрутити.

#77 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 16:07:24

jokeR пише:
sizeof(data)/sizeof(*data)

Не люблю.

Не смію вам перешкоджати щось не любити, маєте на це повне право wink

jokeR пише:

І щось мені здається що там помилка wink

Аргументуйте, в чому саме помилка.

jokeR пише:
#define DATA_SIZE 10
int data[DATA_SIZE];

Просто і зрозуміло.

Просто і зрозуміло - це std::array та std::vector. А в ардуіно - що маємо, те маємо.

#78 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 15:59:33

filat18 пише:

1 Якщо приходить повідомлення в вигляді цислового масива не визначеної довжини (від 1 до до 5, наприклад: 1/24/35 або 759/ або1/0/245/657/841 або...) треба занесті відповідні числа у масив rArr.

А якщо приходить більше ніж 5 чисел, решта має ігноруватись?
Чи потрібно передати 5 уже отриманих чисел, а решту розглядати як наступний рядок?
Чи весь такий рядок має ігноруватись до наступного?

filat18 пише:

2. після отриманя числовиго массина та розкладання його у rArr, потрібно викликати зовнішний void.

Спробую вгадати, що "викликати зовнішний void" - це передати масив у іншу функцію?

filat18 пише:

3. ящо у повідомленні є символи, що не належать числовому масиву, всі значення rArr потрібно перетворити у 0  і перейти до очикування наступного сповіщення.

Тобто ігнорувати цей рядок.
А якщо число 32768 чи більше, яке не влазить в AVR'івський int? Яке максимально допустиме значення, і що програма має робити зі значеннями, які його перевищують?

#79 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 15:35:57

UPD: запостив приклад до того як побачив ваші наступні повідомлення з описом задачі.

filat18 пише:

Ділянки масиву, що не отримали новид даних, повинні отримати 0.

Так обнуліть їх перед тим як передавати кудись той масив.

Якщо так вже кортить обнуляти весь масив перед отриманням нового рядка, то

memset(rArr, 0, sizeof(rArr));

Або, те ж саме:

for (auto &it : rArr) {
    it = 0;
}

Або, те ж саме:

for (auto *p = rArr; p < rArr + sizeof(rArr)/sizeof(*rArr);) {
    *p++ = 0;
}

Або, те ж саме:

for (size_t i = 0; i < sizeof(rArr)/sizeof(*rArr); i++) {
    rArr[i] = 0;
}

Можна навигадувати ще багато способів обнулити масив в C++.

#80 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 15:17:58

filat18 пише:

!? як що закоментувати позначений рядок - маю наступну відповідь, при однаковому сповіщєнні

Тому що rIndex=0 у вас не там де він повинен бути.

filat18 пише:

Але чи не простіше було б просто надрукувати уривок коду, що дійсно працює?

Та мабуть, простіше. Тільки розуміння того, що таке "дійсно працює", у нас з вами, мабуть, дуже різне.
Ось вам приклад. Написав якомога простіше, по-ардуінівськи. Ніякої обробки помилок у вхідних даних нема: що не влазить, те ігнорується, що atoi() повертає, те і записується. Обробка помилок на вході - то вже на ваc.

void setup()
{
    Serial.begin(115200);
}

size_t idx { 0 };
size_t str_idx { 0 } ;

int data[10];
char str[7];

void push_number()
{
    if (idx < sizeof(data)/sizeof(*data)) {
        str[str_idx] = '\0';
        data[idx++] = atoi(str);
    }
}

void loop()
{
    for (int c; (c = Serial.read()) != -1;)
    {
        switch (c) {
            case '/':
                push_number();
                str_idx = 0;
                break;

            case '\n':
            case '\r':
                if (idx == 0 && str_idx == 0) {
                    break;
                }
                push_number();

                for (size_t i = 0; i < idx; i++) {
                    Serial.print(F("data["));
                    Serial.print(i);
                    Serial.print(F("] = "));
                    Serial.println(data[i]);
                }

                idx = 0;
                str_idx = 0;
                break;

            default:
                if (str_idx < sizeof(str)/sizeof(*str) - 1) {
                    str[str_idx++] = c;
                }
                break;
        }
    }
}

#81 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-05 13:17:23

filat18 пише:

як можно зменшити затримку часа?

Ніяку затримку зменшувати не треба, бо її там взагалі не має бути.

Спробую ще раз. У вашій програмі дві помилки, через які програма не працює як очікується. Решта "зауважень" - просто підказки щодо вдосконалення коду, вони до проблеми не відносяться.

Перша помилка: ви обнуляєте rIndex не в тому місці. Його потрібно обнуляти перед отриманням нового рядка, тобто на початку роботи програми, а також після обробки попереднього рядка.

Зараз він у вас обнуляється перед очікуванням кожного символа. Прийшов перший символ на Serial, ви його прочитали. Нових символів у Serial ще нема. Виклик Serial.available() повертає 0, цикл while завершується. loop() виконується знову, rIndex обнуляється.   
Коли ви додаєте delay(1), то поки виконується ця затримка, в Serial встигає прийти решта символів. Цикл while в цьому випадку не завершується, rIndex не обнуляється, всі наявні символи обробляються. Це відповідь на ваше питання "чому це відбувається".

Але delay(1) не є коректним вирішенням проблеми. Просто перенесіть rIndex=0 в те місце, яке виконується після обробки всього рядка. тобто в кінець блоку під

if (inChar == '\n') {

Друга помилка: ви звертаєтесь до неіснуючого елемента масива rArr[10]. В C++ елементи масивів індексуються з нуля. Якщо у вас масив з 10 елементів:

int rArr[10];

то індекси його елементів від 0 до 9. Перший елемент rArr[0], останній елемент rArr[9]. А ви записуєте в rArr[10], тобто за межі масива.

(Тут вам повезло, що компілятор так розмістив змінні в памʼяті, що одразу за масивом rArr[] йде rIndex, і "rArr[10] = { 0 }" насправді також обнуляє rIndex, і ніяких інших даних не пошкоджує. Але ні в якому разі не можна на це розраховувати. Ще раз: доступ за межі масива, хоч запис, хоч читання - це помилка!).

Навіщо взагалі обнуляти той масив? Ви все одно перезаписуєте комірки новими значеннями тут:

rArr[rIndex ] = textcom.toInt();

rIndex у вас уже визначає, скільки комірок заповнені. Виводьте їх значення до rIndex:

    for (int i = 0; i < rIndex; i++) {
        Serial.println(rArr[i]);
    }

Я би навіть написав робочий скетч, якби були озвучені вимоги до реакції програми на некоректні вхідні дані. Що програма має робити, коли замість цифри прийшов інший символ, який не є '/' або '\n'. Коли число завелике і не вміщається в int. Коли приходить два '/' підряд. Коли приходить більше 10 чисел в одному рядку. Чи очікуються відʼємні значення з '-' на початку.

У реальній програмі ви ж прочитані значення не назад в Serial будете видавати, а якось використовувати. А то напишу як розумію сам, ви почнете використовувати цей код, потім виявиться, що обробляти помилкові дані вам потрібно по-іншому, і ви вирішите, що це я хєрню написав.

#82 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-04 21:07:20

filat18 пише:

Запомним, что значения ячеек массивов не заполняются нулями автоматически.

Взагалі-то глобальні обʼєкти, а також локальні обʼєкти з класом розміщення static ініціалізуються нулями автоматично. Але нічого страшного, якщо ініціалізувати явно - компілятор все одно заоптимізує. До того ж, це правило хорошого тону, щоб тим, хто читає код, було зрозуміліше.

filat18 пише:

Чтобы это произошло, необходимо заполнить хотя бы один елемент.

Тільки це не "заповнення", а ініціалізація.

filat18 пише:

Например, если с самого начала нужно записать нули во все ячейки массива, то следует объявить его в программе с одним нулем в фигурных скобках.

Ключове слово тут: "объявить". У вас масив обʼявляється на самому початку:

int rArr[10];

І він у вашому випадку неявно ініціалізується нулями.

А тут:

rArr[10] = {0};

неіснуючому елементу з індексом 10 ви намагаєтесь присвоїти brace-enclosed initializer list з одним елементом int, який конвертується у просто int. Доступ до неіснуючого елемента масива - це помилка, яка призводить до Undefined Behavior. Навіть якщо наче б то "все працює".

filat18 пише:

https://geekmatic.in.ua/arduino_arrays_lesson

Я б не радив вивчати C++ по якихось сумнівних джерелах.

#83 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-04 14:16:25

dimich пише:

Парсити такий формат вхідних даних можна (і потрібно) без проміжної змінної типу String. При отриманні кожної цифри додавайте її до накопичуваного значення:

arr[rIndex] *= 10;
arr[rIndex] += inChar - '0';

Зауважу, це працюватиме тільки для невідʼємних чисел. Якщо потрібно також відʼємні, то можна або трохи ускладнити парсер, або таки парсити з atoi() чи strtol(). Але буфер типу String все одно не потрібний: у вас валідне значення для int не перевищує 6 символів (якщо відсутні лідируючі нулі). Як краще реалізувати - залежить від того, як вам потрібно обробляти невідповідність вхідних даних до очікуваного формату.

#84 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-04 12:15:21

jokeer пише:

Не люблю запису в 1 рядок wink Це не те що має смисл економити. Перфокарти вже давно не використовуються.

Можна і в два:

int inChar;
while ((inChar = Serial.read()) != -1) { 

Або, якщо "паралельно" з посимвольною обробкою даних потрібно ще щось виконувати в loop():

int inChar = Serial.read();
if (inChar != -1) {

Тут сенс не в кількості рядків, а в зайвій перевірці. Serial.read() і так перевіряє наявність даних, і повертає -1 якщо даних нема. Звісно,  тут це не критично, працюватиме і так. Але лаконічніший код зазвичай легше читається. Ну, то справа смаку.

#85 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-04 11:39:09

Також замість

  while (Serial.available() > 0) {
    int inChar = Serial.read();

можна написати в один рядок

  for (int inChar; (inChar = Serial.read()) != -1;) {

#86 Re: Програмування Arduino » Чому повідомлення не вдається розкласти в масив без затримки часу » 2025-08-04 11:29:19

Як уже сказано, у вас змінні інціалізуються на кожній ітерації, тобто після кожної порції вхідних даних. Коли додаєте delay(1), за цю мілісекунду решта даних встигає прийти у буфер, тому "while (Serial.available() > 0)" продовжує виконуватись і обробляє всі дані, що прийшли.
Скидання змінних на початкові значення тільки після обробки попередніх має виправити проблему.

Також тут у вас доступ за межі масиву:

rArr[10] = {0};

Це Undefined Behavior ("невизначена поведінка"). У масива з 10 елементів індекс останнього елемента 9.

Оффтоп:
* замість (inChar == 47) можна написати (inChar == '/') без коментаря, що це за символ.

* У вас немає контролю вхідних даних. Достатньо велика кількість елементів у вхідних даних також призведе до переповнення масиву, а достатньо довге значення елементу - до переповнення памʼяті.

* Парсити такий формат вхідних даних можна (і потрібно) без проміжної змінної типу String. При отриманні кожної цифри додавайте її до накопичуваного значення:

arr[rIndex] *= 10;
arr[rIndex] += inChar - '0';

#87 Re: Програмування Arduino » 74hc595 не стандартна реалізація індикаціі на 2х чіпах » 2025-07-29 11:05:11

khalimon пише:

Якщо можна, напишіть це на с++ з урахуванням синтаксису. Якщо запрацює, я віддячу

Вибачте, мені це не цікаво. Тут я не заради заробітку, принаймні не зараз. Задача тривіальна, може хтось зацікавиться, у кого є час та натхнення. Успіхів у пошуку.

#88 Re: Програмування Arduino » 74hc595 не стандартна реалізація індикаціі на 2х чіпах » 2025-07-28 17:25:35

khalimon пише:

Напишіть, як  з вами зв'язатись.

Та навіщо? Пишіть тут, якщо будуть якісь питання. Звісно, є ймовірність, що міг щось не врахувати чи переплутати.

#89 Re: Програмування Arduino » 74hc595 не стандартна реалізація індикаціі на 2х чіпах » 2025-07-28 16:37:02

khalimon пише:

Є готова промислова індикація, яку змінювати, перепаювати не можна. З самого початку це я обізначив.

Питання ж було поставлене так, наче ви вже знаєте як керувати схемою, де "Зазвичай задіяні піни 14 ( данні ), 11 та 12 ( защьолка та тактування )."

khalimon пише:

Те що є в інтернеті є, не працює повинним чином, тому що там апаратно по іншому реалізовано.

Тобто проблема виникла з тим, що лінія тактування інвертована транзистором, і замість Low її потрібно ставити в High, а замість High - в Low?

khalimon пише:

я хочу отримати алгоритм керування.

Нехай у вас є масив бітового зображення:
uint8_t M[8] = { ... };

Лінію даних назвем DS, пін тактування/защолки - CLK, пін OE - OE.

Алгоритм керування:

1. Конфігуруєте піни DS, CLK та OE в output.
2. Ініціалізуєте лічильник секцій: uint8_t section=0
3. Ініціалізуєте маску секцій: uint8_t mask = 0x80

Приблизно раз на мілісекунду, можна і частіше:
1. OE = High
2. Виводите 16 біт на лінію даних з тактуванням. Ці 16 біт складаються з байта масиву зображення та інвертованої маски секції. Значення, що виводиться (LSB first):

uint16_t val = (~mask << 8) | M[section]

for i від 0 до 15 {
    CLK = High
    DS = val & 1;
    CLK = Low;
    val >>= 1;
}
CLK=High

3. OE = Low
4. section = (section + 1) % 8
5. mask >>= 1; if (mask==0) mask = 0x80;

#90 Re: Програмування Arduino » 74hc595 не стандартна реалізація індикаціі на 2х чіпах » 2025-07-28 09:40:36

jokeer пише:

Може замість матриці - шматриці в процесі обдумування перейдете на rgb стрічку.

Якщо задача - індикація полем світлодіодів, чому б тоді не взяти MAX7219 чи MAX7221, замість того щоб городити город з транзисторів та 74HC595.

#91 Re: Програмування Arduino » 74hc595 не стандартна реалізація індикаціі на 2х чіпах » 2025-07-28 07:45:10

khalimon пише:

Щоб увімкнути світлодіод треба на першому чіпі ( де транзистори) подати  лог одиницю на відповідний пін ( щоб увімкнувся транзистор та подався плюс живлення )

Щоб увімкнувся PNP транзистор, струм має потекти з емітера в базу, тобто на базу потрібно подати нуль. Коли на емітері високий рівень (плюс живлення) і на базі високий рівень, то струм емітер-база не тече, транзистор закритий.

khalimon пише:

З цим ясно, питання в керуванні - тоб то алгоритм ( код програми/ скетч )

Ну ви навіть не сказали, що саме ви хочете відображати, звідки програма має брати це зображення і які функції виконувати ще.
Якщо просто показати яку небудь картинку 8x8, то можна обійтись і чисто ардуінівськими digitalWrite() та delay().
Якщо програма має виконувати ще щось паралельно, можна реалізувати конечний автомат на millis(). Можна задіяти апаратний SPI контролер, щоб не тіліпати піни бітбенгом. Можна задіяти другий апаратний таймер, прямий запис в GPIO, якщо критичні таймінги. Варіантів реалізації тут безліч.
Алгоритм уже описаний вище. Код програми/скетч - це реалізація алгоритма. За основу можете взяти будь-який скетч для "arduino LED matrix 8x8 74HC595" і адаптувати для свєї схеми.

khalimon пише:

Готов віддячити грошима за рішення..

То ви просто шукаєте виконавця? Так зразу б і написали, може когось зацікавить.

#92 Re: Програмування Arduino » 74hc595 не стандартна реалізація індикаціі на 2х чіпах » 2025-07-28 06:03:22

Якщо правильно зрозумів, що між базами та виходами U1 є резистори, а емітери підключені до плюса живлення, то маска секції інвертована: секція, яку увімкнути, задається нулем, а решта - одиниці. Тобто

 біти, що виводяться¹    значення маски в hex
  xxxxxxxx² 01111111         7F
  xxxxxxxx  10111111         BF
  xxxxxxxx  11011111         DF
  xxxxxxxx  11101111         EF
  xxxxxxxx  11110111         F7
  xxxxxxxx  11111011         FB
  xxxxxxxx  11111101         FD
  xxxxxxxx  11111110         FE

¹ тут порядок виводу зліва направо
² визначає стан світлодіодів у секції. Якщо правильно вгадав схему, то світлодіоди теж вмикаються нулем. Там, де в xxxxxxxx нульовий біт, там світлодіод світиться.

#93 Re: Програмування Arduino » 74hc595 не стандартна реалізація індикаціі на 2х чіпах » 2025-07-28 05:42:52

khalimon пише:

Цікавить саме алгоритм керування

Пошук за запитом "arduino dynamic LED matrix 8x8 74HC595" видає безліч результатів.

У вашої схеми особливість в тому, що latch (защолка) спрацьовує автоматично після кожного біта, по спадаючому фронту тактування. А щоб під час передачі даних в 74HC595 світлодіоди не мерехтіли, перед виводом їх потрібно вимкнути (OE в High), а після виводу увімкнути (OE в Low). В решті алгоритм класичний для динамічної матриці. Дані, що виводяться: 8 біт стан світлодіодів у секції, 8 біт маска секції.
Якщо тимчасово забути про OE і залишити виходи завжди увімкненими (OE в Low), то якусь картинку вже маєте побачити. Тільки зайві світлодіоди теж трохи світитимуться. А коли покажете код, то куди додати керування OE вже підкажем.

#94 Re: Програмування Arduino » 74hc595 не стандартна реалізація індикаціі на 2х чіпах » 2025-07-28 02:38:57

Взагалі, дивна схема. Якщо в базах транзисторів нема опорів, то вони, мабуть, включені по схемі зі спільним колектором (емітерні повторювачі). Але тоді колектори PNP-транзисторів мають підключатись до плюса живлення, а секції світлодіодів послідовно з резисторами - до еміттерів. А на вашій схемі на підключення світлодіодів виведено колектори. Схоже, або забути домалювати резистори між базами та виходами U1, або переплутали колектори з емітерами.
В будь-якому разі, перші 8 біт (які потрапляють в U2) визначають стан світлодіодів у секції, один біт з 8 наступних (які потрапляють в U1) визначає секцію.

#95 Re: Програмування Arduino » 74hc595 не стандартна реалізація індикаціі на 2х чіпах » 2025-07-28 00:56:17

khalimon пише:

Натякніть будь ласка як засвітити потрібну ячейку...

Судячи з того, що виходи однієї мікросхеми керують транзисторами, а на виходах другої - резистори, це матриця 8x8 з 64 світлодіодів, так? Тоді в кожний момент часу ви можете засвічувати тільки одну секцію з 8 світлодіодів:
Вимикаєте виходи: OE=1.
Всуваєте 16 біт. 8 біт із них обитають секцію, зазвичай тільки одну. Її біт виставлений, в решті нулі (або навпаки, в залежності від схеми). 8 інших біт задають стан світлодіодів у цій секції. Вмикаєте виходи: OE=0.
Щоб керувати всіма 64 світлодіодами, потрібно перемикати секції послідовно з потрібною частотою (від 60 Гц і вище), щоб створювалась ілюзія безперервного світіння. Читайте про динамічну індикацію.
В які саме значення потрібно ставити біти - залежить від вашої схеми підключення світлодіодів. З одним умовно намальованим світлодіодом це незрозуміло.

#96 Re: Апаратні питання » Живлення від type-c » 2025-07-27 00:20:06

jokeR пише:

Упсь. Без резистора 3.48В. Походу підтяжка 5.1к на 3.3в.

Мабуть 4.7k, що відповідає можливостям зарядки віддавати 3A @ 5V.

jokeR пише:

Упсь №2. Якщо підключити тільки 1 резистор, а другу лінію залишити вільною - запускається.

Ну, все логічно. Писав про це вище. Раз ви не використовуєте type-C кабель, то ваш пристрій має виглядати для зарядки як кабель. Отже, у вас на розʼємі піни не CC1/CC2, а CC/VCONN.
Кабель може бути або пасивний: CC 5.1k pull-down у пристрої на іншому кінці, VCONN відключений. Або активний/E-marked: CC 5.1k pull-down у пристрої на іншому кінці, VCONN 0.8-1.2k pull-down в самому кабелі. Але в останньому випадку зарядка може захотіти поспілкуватись з ним на тему PowerDelivery.
А з 5.1k pull-down на обох пінах конфігурація не відповідає жодній валідній з цієї таблиці.
(Поки пояснював, то і сам почав розуміти  big_smile )

UPD: лінка на статтю з таблицею чомусь перестала працювати. Схожа таблиця тут:
Microchip AN1953: Introduction to USB Type-C™, Розділ 3.4 Cable Attach and Removal Detection, таблиця 8. Згідно з нею, якщо на обох пінах Rd (4.7k), це відповідає "Debug Accessory Mode connected".

#97 Re: Апаратні питання » Живлення від type-c » 2025-07-26 12:20:18

jokeR пише:

Сорян, радіоринок на Караваєвих дачах wink

А, тепер пойняв. Я не з тих країв, мені "Кутузка" ближче smile

jokeR пише:

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

То мабуть через ємність напруга просідає до необхідного порогу спрацьовування. Спробуйте зменшити резистори до 4.7k чи навіть 3.9k.
Взагалі, цікаво було би заміряти, яка там напруга на підтяжці без резистора, а також струм замикання на землю, щоб визначити номінал pull-up в самій зарядці.
У мене на одній зарядці там 5 В через 47 кОм, але вона 5 В дає завжди, без будь-яких резисторів з боку девайса. На повербанку 3.3 В через 5.1 кОм, а на смартфоні 2.8 В через 33 кОм. Обидва вмикають 5 В при замиканні СС на землю через 4.7 кОм (5.1k не пробував бо нема).

#98 Re: Апаратні питання » Живлення від type-c » 2025-07-26 01:19:55

Взагалі має працювати і з обома резисторами. Хоча згідно схеми з цієї статті, один з резисторів має бути 800-1200 Ом. Але у різних зарядок може бути різна логіка, не завжди стандартна. Ще би точно знати, які лінії куди на вашому розʼємі виведені.
Якщо нічого не допомагає, я би взяв який-небудь простенький пристрій з type-C, тільки без всяких PowerDelivery і підключив би до тієї зарядки. Якщо заряджається, тоді можна дослідити, що куди підтягується якими резисторами, і відтворити таку саму конфігурацію на вашому розʼємі.

#99 Re: Апаратні питання » Живлення від type-c » 2025-07-26 00:35:32

jokeer пише:

Це роз'єм такого виду
https://arduino.ua/prod3769-razem-usb-type-c-razbornii

Тобто "папа", який ви підключаєте безпосередньо в зарядку, без кабеля? Підключіть резистор 5.1k до одного з CC в землю, другий залиште непідключеним.

jokeer пише:

тільки з кардач.

Не розпарсив hmm

#100 Re: Апаратні питання » Живлення від type-c » 2025-07-25 19:04:48

jokeR пише:

перепаюю резистори. Все одно не працює.

На місце тих що були на 56k? Вони ж там pull-up, а вам потрібно pull-down.

jokeR пише:

На резисторах падає 1.6В, зарядка напругу не віддає sad

Це дивно. Виглядає, наче у вас pull-up та pull-down одного номіналу, так не має бути.
На стороні зарядки вже мають бути 56k. Якщо заміряти струм КЗ з CC1/CC2 зарядки на землю, має бути порядка 60-90 мкА. На 5.1k pull-down напруга має бути близька до нуля, 0.25-0.5 В.
Може ви підключаєте через якийсь хитрий кабель, з вбудованими резисторами, чи взагалі активний?
Також перевірте, що там на CC1 та CC2 зі сторони девайса. Чи вони часом не замкнені між собою.

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