#1 2024-01-06 16:14:52

AndDay
Учасник
Зареєстрований: 2024-01-06
Повідомлень: 7

K-POWER Цифровой серво-привод DM0900

Приветствую.
Неделю не могу подружить сервопривод с компом.
Уже и ардуино пробовал, ни как.
Хотя на видео красиво работает
https://youtu.be/_syxCwIINN8?si=Rms5gVFGZDeGqiBT

Есть у кого готовое решение, или хоть наработки ?

Неактивний

#2 2024-01-07 06:14:21

dIma5
Гість

Re: K-POWER Цифровой серво-привод DM0900

https://www.youtube.com/watch?v=S0tb3jnfdw4&t=1s тут прекрасно все описано если непонятно и не заработает отпешитесь

#3 2024-01-07 09:46:16

AndDay
Учасник
Зареєстрований: 2024-01-06
Повідомлень: 7

Re: K-POWER Цифровой серво-привод DM0900

dIma5 пише:

https://www.youtube.com/watch?v=S0tb3jnfdw4&t=1s тут прекрасно все описано если непонятно и не заработает отпешитесь

На видео сервопривод управляется по ШИМ, а этот по TTL

Неактивний

#4 2024-01-07 20:56:55

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 137

Re: K-POWER Цифровой серво-привод DM0900

AndDay пише:

Неделю не могу подружить сервопривод с компом.

Покажіть cхему підключення і код керування. Чи відповідає servo ID в коді дійсному ідентифікатору серво? Покажіть дамп трафіку пакетів. Чи видає серво підтвердження прийому пакетів? Чи пробували різні бодрейти UART: 9600, 19200, 57600, 115200?

Неактивний

#5 2024-01-07 23:42:18

AndDay
Учасник
Зареєстрований: 2024-01-06
Повідомлень: 7

Re: K-POWER Цифровой серво-привод DM0900

dimich пише:

Покажіть cхему підключення


ttl_ser.jpg

Прошивка переходника на Attiny13A

		.DSEG		; Сегмент ОЗУ
		.CSEG
		.org 0                 ;Задание нулевого адреса старта программы
		rjmp reset          ;Безусловный переход к метке reset
		.org 1
		reti ;Prer
		.org 2
		reti ;Pin Change Interrupt0
		.org 3
		reti ;timer0_ovf 
		.org 4
		reti ;EEPROM write complete
		.org 5
		reti ;Analog Comparator Interrupt
		.org 6
		reti ;timerA;Timer_Counter0A; Compare Match A
		.org 7
		reti ;Timer_Counter0B; Compare Match B
		.org 8
		reti ;Watchdog Timeout
		.org 9
		reti ;conversion;ADC Conversion Complete Handle 
reset:	

		wdr; Reset Watchdog Timer
		;ldi r16,24
		;out WDTCR, r16;
		;ldi r16,12 
		;out WDTCR, r16;
		LDI	ZL,Low(SRAM_START)	; Адрес начала ОЗУ в индекс
		LDI	ZH,High(SRAM_START)
		CLR	R16			; Очищаем R16
Flush:	ST 	Z+,R16			; Сохраняем 0 в ячейку памяти
		CPI	ZH,High(RAMEND+1)	; Достигли конца оперативки?
		BRNE	Flush			; Нет? Крутимся дальше!
		CPI	ZL,Low(RAMEND+1)	; А младший байт достиг конца?
		BRNE	Flush
		CLR	ZL			; Очищаем индекс
		CLR	ZH
		LDI	ZL, 30		; Адрес самого старшего регистра	
		CLR	ZH		; А тут у нас будет ноль
		DEC	ZL		; Уменьшая адрес
		ST	Z, ZH		; Записываем в регистр 0
		BRNE	PC-2		; Пока не перебрали все не успокоились		
		ldi r16, RAMEND ;Загрузка в регистр r16 адреса верхней границы ОЗУ
		out SPL, r16


		cbi DDRB, 0
		cbi PORTB, 0
		cbi DDRB, 1
		cbi PORTB, 1
		cbi DDRB, 2
		cbi PORTB, 2
		cbi DDRB, 3
		cbi PORTB, 3
		cbi DDRB, 4
		sbi PORTB, 4
		ldi r16,0

main:

sbic PINB,1 ;пропустить если бит в регистре очищен
rjmp t_in_test

		sbi DDRB, 0 ; установить
		cbi DDRB, 2 ;out очистить
		cbr r16, 1 ; очистить бит 0 в r16

rjmp main

t_in_test:
		sbrc r16, 0 ; Пропустить если бит 0 в r16 очищен
rjmp rxrid
		cbi DDRB, 0 ; очистить
		sbr r16, 1 ; Установить бит 0 в r16
		nop
		nop
		nop
		nop
rjmp main

rxrid:
sbic PINB,0 ;пропустить если бит в регистре очищен
rjmp rx_test

		sbi DDRB, 2 ; установить
		cbr r16, 2 ; очистить бит 1 в r16

rjmp main

rx_test:
		sbrc r16, 1 ; Пропустить если бит 1 в r16 очищен
rjmp main
		cbi DDRB, 2 ; очистить
		sbr r16, 2 ; Установить бит 1 в r16
		nop
		nop
		nop
		nop
rjmp main

Аналог схемы
2024-01-07_230008.jpg
https://arduino.ua/files/1_USB-TTL_sch.pdf

photo_2024-01-07_22-06-23.jpg
2024-01-07_222758.jpg
2024-01-07_222902.jpg



Режим сканера, на разных скоростях

2024-01-07_223501.jpg
2024-01-07_224156.jpg
2024-01-07_224305.jpg

Остання редакція AndDay (2024-01-08 00:09:43)

Неактивний

#6 2024-01-08 00:26:38

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 137

Re: K-POWER Цифровой серво-привод DM0900

Якщо вірити даташиту зі сторінки цього серво, пакет має бути в форматі:
req-repl.png

У вас після хідера 0xFFFF іде 0x01, що не схоже на коректне значення поля size. І двох байтів контрольної суми теж немає.
Не та версія протокола?

// Attiny в ролі буфера з відкритим колектором - це сильно  smile

Неактивний

#7 2024-01-08 00:41:09

AndDay
Учасник
Зареєстрований: 2024-01-06
Повідомлень: 7

Re: K-POWER Цифровой серво-привод DM0900

dimich пише:

Не та версія протокола?

Родной бы документ от него, или хотя бы рабочий проект, там бы возможно разобрался бы по командам
Документ, что прилагается не от него, от похожего
https://www.pololu.com/file/0J1212/A1-16_datasheet_20151229.pdf



dimich пише:

// Attiny в ролі буфера з відкритим колектором - це сильно  smile

Готового решения сразу не нашел )

Хотя ранее были https://arduino.ua/ru/prod3963-ttlusb-adapter-dlya-ypravleniya-servoprivodom-sovmestima-s-arduino

Ну и на соседних есть, как оказалось https://electroradiogroup.com.ua/ua/p2008450927-adapter-ttlusb-dlya.html

Неактивний

#8 2024-01-08 00:46:03

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 137

Re: K-POWER Цифровой серво-привод DM0900

Доречі, в прошивці для Attiny не бачу конфігурування CLKPR. Якщо Attiny працює від внутрішнього осциллятора на 9.6 МГц і фʼюз CKDIV8 не скинуто, то його тактова частота - 1.2 МГц. Один такт - це біля 10% від такту для 115200 бод. Далеко не всякий UART буде нормально працювати при такій похибці.

Неактивний

#9 2024-01-08 00:57:43

AndDay
Учасник
Зареєстрований: 2024-01-06
Повідомлень: 7

Re: K-POWER Цифровой серво-привод DM0900

dimich пише:

9.6 МГц і фʼюз CKDIV8

9.6 , делитель снят, тоесть на полной скорости

Неактивний

#10 2024-01-08 02:20:41

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 137

Re: K-POWER Цифровой серво-привод DM0900

AndDay пише:

Документ, что прилагается не от него, от похожего

А він точно з керуванням по послідовному протоколу?
На сайті виробника по назві DM0900 знаходиться два серво:
DM0900 10.5KG Digital Metal Gear Servo
Digital Metal Gear Servo DM0900
Обидва з PWM-керуванням. У маркетологів PWM також вважається "digital" smile

Може в описі товару тупо переплутали, написавши про послідовну шину. Таке буває.

Так, програма у вас видає Dynamixel Protocol 1.0.
Ще є Protocol 2.0. А на сторінці товару посилання на даташит для A1-16, де протокол схожий, але несумісний ні з Dynamixel 1.0, ні з 2.0. Кожен виробник модифікує протокол як хоче, аби було несумісно з продукцією конкурентів.

AndDay пише:

Готового решения сразу не нашел )

Теоретично, якщо зі сторони серво відкритий колектор з підтяжкою, то одного діода Шотткі з серво на TX має бути достатньо. Принаймні debugWIRE для AVRок у мене так працює без проблем.

Але мені все ж здається, що там не послідовний протокол, а звичайний PWM.

Остання редакція dimich (2024-01-08 02:31:48)

Неактивний

#11 2024-01-08 10:22:07

AndDay
Учасник
Зареєстрований: 2024-01-06
Повідомлень: 7

Re: K-POWER Цифровой серво-привод DM0900

dimich пише:

А він точно з керуванням по послідовному протоколу?
На сайті виробника по назві DM0900 знаходиться два серво:
DM0900 10.5KG Digital Metal Gear Servo
Digital Metal Gear Servo DM0900
Обидва з PWM-керуванням. У маркетологів PWM також вважається "digital" smile
Може в описі товару тупо переплутали, написавши про послідовну шину. Таке буває.

PWM так же пробовал, результа 0

MG996R - работает норм по ШИМ
https://youtube.com/shorts/umBPXf9SeYQ


dimich пише:

Так, програма у вас видає Dynamixel Protocol 1.0.
Ще є Protocol 2.0. А на сторінці товару посилання на даташит для A1-16, де протокол схожий, але несумісний ні з Dynamixel 1.0, ні з 2.0. Кожен виробник модифікує протокол як хоче, аби було несумісно з продукцією конкурентів.

Протоколы все перепробовал, качал еще пару альтернативных программ

Так же, что нашел по примерам ардуино, все глухо.

dimich пише:

Теоретично, якщо зі сторони серво відкритий колектор з підтяжкою

Нет подтяжки.

На плате сервопривода, два резистора 1кОм припаяны вместе, отводы распаяны на разные входы микросхемы.

Неактивний

#12 2024-01-08 11:58:58

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 137

Re: K-POWER Цифровой серво-привод DM0900

AndDay пише:

Протоколы все перепробовал, качал еще пару альтернативных программ

Я би все-таки спробував той протокол, що для A1-16. Тільки не сторонньою програмою, а своєю, щоб гарантовано видавала правильно сформований пакет. Наприклад, STAT для ID 1: 0xFF 0xFF 0x07 0x01 0x07 0x01 0x00. З перебором ID від 1 до 20 і перерахуванням байтів контрольної суми. Також з перебором чотирьох бодрейтів. І дивитись, чи прийде відповідь хоч на один. Всього-то 80 варіантів smile Ну або впевнетись, що альтернативні програми генерують пакет, відповідний протоколу.

dimich пише:

На плате сервопривода, два резистора 1кОм припаяны вместе, отводы распаяны на разные входы микросхемы.

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

Неактивний

#13 2024-01-08 20:59:36

AndDay
Учасник
Зареєстрований: 2024-01-06
Повідомлень: 7

Re: K-POWER Цифровой серво-привод DM0900

2024-01-08_193659.jpg

check_sum_1 = (N^ID^CMD^data[0]^data[1]^...^data[N-8]) & 0xFE   -   (N XOR ID XOR CMD XOR data[0] XOR data[1] XOR ... XOR data[N-8])  И   0xFE

сheck_sum_2 = (~check_sum_1) & 0xFE  -  (~check_sum_1)  И   0xFE

Я правильно понял, все через логическое XOR и в конце, через И ?

Остання редакція AndDay (2024-01-08 21:52:00)

Неактивний

#14 2024-01-09 00:44:07

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 137

Re: K-POWER Цифровой серво-привод DM0900

AndDay пише:

Я правильно понял, все через логическое XOR и в конце, через И ?

Так, щось типу такого:

    unsigned char pkt[] =
    //       0     1     2     3     4     5     6
        { 0xFF, 0xFF, 0x07, 0x00, 0x07, 0x00, 0x00 }; // cmd STAT, no data

    for (int id = 1; id <= 20; ++id) {
        pkt[3] = id;
        pkt[5] = 0;   // zero check_sum_1
        pkt[6] = 0;   // zero check_sum_2

        unsigned char checksum = 0;
        for (int i = 2; i < sizeof(pkt); ++i) {
            checksum ^= pkt[i];
        }

        pkt[5] = checksum & 0xFE;
        pkt[6] = ~pkt[5] & 0xFE;

        send_packet(pkt, sizeof(pkt));
        wait_response();
    }

Дивний і ненадійний алгоритм контрольної суми, але так написано  hmm

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

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