Сканаторная голова, запустить под Linux

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
tooshka
Почётный участник
Почётный участник
Сообщения: 1803
Зарегистрирован: 24 окт 2012, 14:26
Репутация: 209
Настоящее имя: Андрей
Откуда: Нижний Новгород
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение tooshka »

Nick писал(а):Кстати, интересно, где можно взять дистрибутив винды, чтобы его поставить в виртуалбоксе? И какой лучше брать?
На форуме запрещены ссылки на пиратский контент))).
Милая, ты услышь меня
под окном стою со своим я ЧПУ! (Протяжно; с надрывом; форте)
Внимание!!! Чрезмерное увлечение ЧПУ приводит к проблемам в семейных отношениях!
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

Черт, я так и думал :)


Кстати, если сделать
cat /dev/bus/usb/005/010
(/dev/bus/usb/005/010 это плата)
то выдает следующее:

Код: Выделить всё

12 01 01 01 00 00 00 40 51 04 01 90 05 05 01 02 00 01 09 02
20 00 01 01 00 c0 00 09 04 00 00 02 00 00 00 00 07 05 01 02
40 00 00 07 05 81 02 40 00 00 
Вложения
Снимок экрана.png (3358 просмотров) <a class='original' href='./download/file.php?id=52653&sid=1ebeea13df325307693709208ea45e03&mode=view' target=_blank>Загрузить оригинал (143.99 КБ)</a>
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

scanlab, зараза, отказывается отправлять спеки... Ок, пойдем трудным путем... :freak:


Взял я usb сниффер и наснифил следующее:
1.html.zip
(2.49 КБ) 331 скачивание
Видно, что комп отправляет:

Код: Выделить всё

00000000  14 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000010  00 00 00 00 00 C7 09 16 00                       .........       
На что получает ответ:

Код: Выделить всё

00000000  94 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000010  00 00 00 00 00 87 09 00 00                       .........       
где 87 09 - желаемая величина.

Теперь вопрос, как все это послать плате?

Нашел такую штуку: https://github.com/walac/pyusb/blob/mas ... torial.rst
Но с ней не удается прочитать из девайса - вроде как ничего не отправляет...

Код: Выделить всё

Traceback (most recent call last):
  File "1.py", line 138, in <module>
    main()
  File "1.py", line 109, in main
    dev.write(1, raw)
  File "/usr/local/lib/python2.6/dist-packages/usb/core.py", line 921, in write
    self.__get_timeout(timeout)
  File "/usr/local/lib/python2.6/dist-packages/usb/backend/libusb0.py", line 528, in bulk_write
    data, timeout)
  File "/usr/local/lib/python2.6/dist-packages/usb/backend/libusb0.py", line 611, in __write
    timeout
  File "/usr/local/lib/python2.6/dist-packages/usb/backend/libusb0.py", line 425, in _check
    raise USBError(errmsg, ret)
usb.core.USBError: [Errno None] Connection timed out
Вот мой код:

Код: Выделить всё


#!/usr/bin/python

import os
import sys
import time

import usb.core
import usb.util



packet_len = 64

# Packing a request. Please see HexWax documentation for the list of all commands
# Packets are 64 bytes long, most of the commands are 4 bytes long. So up to 18
# can be batched into a packet. For example command with bytes [0x94, 0x0, 0x0, 0x0]
# is getting firmware id
def pack_request(*arguments):
	packet = [0x0] * packet_len
	i = 0
	for arg in arguments:
		packet[i] = arg
		i += 1
	#packet[0:4] = [0x94, 0x0, 0x0, 0x0] #get firmware id
	return ''.join([chr(c) for c in packet])

# Logs error to the error output
def log_error(functionName, ret):
	sys.stderr.write(functionName + (" failed with return code %d\n" % ret))

# Logs result onto standard output. Result is 64 bytes as decimal numbers
# Response is 64 bytes long
def show_result(bytes):
	print ("Result:")
	print (''.join(['%d ' % abyte for abyte in bytes]))

# Turns LED on the bord on or off depending on input parameter on. 0 is turning
# the led on 1 is turning it off. The command is 0x9F set port bit (set output
# pin value), port is 0x03 (port C), 0x06 is bit index (so this is 7th bit),
# and the last bit is 0 for clear, 1 for set
def set_led(on, dev):
	if on:
		param = 0x00
	else:
		param = 0x01

	raw = pack_request(0x9F, 0x03, 0x06, param) #set port bit - 0 to turn it on 1 to turn it off

	dev.write(1, raw, 0, 100)

	bytes = dev.read(0x81, packet_len, 0, 100)
	show_result(bytes)



def main():
	#initialising debuging - don't have a clue if this will work
	os.environ['PYUSB_LOG_FILENAME'] = 'debug'

	dev = usb.core.find(idVendor=0x0451, idProduct=0x9001)
	cfg = dev.get_active_configuration()	
	alt = usb.util.find_descriptor(cfg, find_all=True, bInterfaceNumber=1)
	print alt
	intf = cfg[(0,0)]
	ep = usb.util.find_descriptor(
	intf,
	# match the first OUT endpoint
	custom_match = \
	lambda e: \
		usb.util.endpoint_direction(e.bEndpointAddress) == \
		usb.util.ENDPOINT_OUT)
	print ep

	
	# was it found?
	if dev is None:
		raise ValueError('Device not found')

	try:
#		dev.detach_kernel_driver(0)
		print "ok"
	except: # this usually mean that kernel driver has already been dettached
		print "not ok"
		pass

	# set the active configuration, the device has 2 configurations you can see them
	# by using: lsusb -vvv -d 0x0b40:
	# this device has configurations 1 and 2 I'm using the first one, not sure at the
	# moment if 2nd would work the same
	dev.set_configuration(1)


	#removed following lines if you're running this from command line
	#my netbeans didn't want to show standard output so I had to redirect it to
	#a file
#	fsock = open('out.log', 'w')
#	sys.stdout = fsock
#	fsock2 = open('out.err', 'w')
#	sys.stderr = fsock2


	#prepare our own command - this is get firmware id, only the first byte is
	#significant
	raw = pack_request(0x14,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x09,0x16,0x00)

	#send the packet
	dev.write(1, raw)
	raw = pack_request(0x94, 0x00, 0x06, 0x00, 0x00)
	dev.write(1, raw)
	

	#then read the result
	try: 
		bytes = dev.read(1, 1, 1000)
		show_result(bytes)		
	except:
		pass	


	#prepare another request
	#set register TRISC bit 6 - port C bit 6 to be output
	#mind though 0x9B command can be used to write any register, so check the
	#microcontroller's datasheet
#	raw = pack_request(0x94, 0x00, 0x06, 0x00, 0X00)

#	dev.write(1, raw, 0, 100)

#	bytes = dev.read(packet_len, 100)
#	show_result(bytes)





if __name__ == '__main__':
  main()
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

хммм... там в функции read есть endpoint, но я не могу понять, откуда его брать?
https://github.com/walac/pyusb/blob/mas ... re.py#L924
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

О, и еще, там в коде есть такие строчки

Код: Выделить всё

	try:
		dev.detach_kernel_driver(0)
	except: # this usually mean that kernel driver has already been dettached
		pass
По ходу он еще не может драйвер ядра отсоединить... но не факт, что это важно...
raise USBError(errmsg, ret)
usb.core.USBError: [Errno None] could not detach kernel driver from interface 0: No data available
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

Ухты... она начала что-то отвечать.... походу надо было определенное количество байт ей запихукть - в сумме надо 35 байт...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

хммм... точнее надо послать 25, потом два раза по 5 байт...
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение selenur »

При подключении usb устройства, компьютер от устройства получает id идентификаторы, потом список конечных точек, в твоем случае только одна точка (а бывает и больше, например при подключении всего 1-го разъма usb, в системе появляется мышь и клавиатура), после этого у конечной точки запрашивается протокол обмена, для приема и передачи(по отдельности), так вот тут передается размер данных, в твоем случае 35 байт, нельзя изменять размер этих данных, т.к. пакеты будут игнорироваться. :-) а так ты вообще молодец!
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение selenur »

Nick писал(а):хммм... точнее надо послать 25, потом два раза по 5 байт...
странно....
Я просто сейчас изучаю протокол usb, и такие посылки не должны работать, пожет твой код остаток данных нулями заполняет?
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение selenur »

да и размер данных делают обычно 8,16,32, или 64 байта
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

хммм... как-то оно странно себя ведет... то ему надо один раз отправить 0x94, 0x00, 0x06, 0x00, 0x00, то два раза, иначе вываливает в ошибку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

ха, вроде начинаю его побеждать! :)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

Вроде победил :). Хотя надо еще с головой проверить, пока плату тестирую на столе :).

В итоге, он шлет пакеты, есть несколько типов:
1. комманда
14 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 -- (25, 'bytes')
последние 2 байта - номер команды, дальше с конца могут быть арументы.

2. запись в лист
1 байт - длинна пакета
2-3 - оффет (если все не вместилось в предыдущий пакет)
потом два байта хрен знает что, но если они = 04 00, то это вопсринемается как запись во внутренний лист
и потом подряд записи в лист, а именно по 8 байт,
1-2 - номер команды
2-6 - параметры
например
03 00 FF FF AA AA 00 00 - маркировать в точку (x,y) (FFFF, AAAA)

Если отправляем 0x94, 0x00, 0x06, 0x00, 0x00, то плата шлет нам какой-то ответ... Желательно после каждой записи получать ответик... :)

Вот как-то так :). Делаю я это в первый раз - делаю как могу :monkey:


PS Самое главное - Итог - плата работает из под Linux и из python! :cheesy:
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение selenur »

Вот немного информации, по устройству протокола USB.
Пример свойств, моего устройства (которое показал снифер): 1) Собственно описание usb устройства
2) Описание того какое количество устройств, будет в системе, и прочее
далее идет описание интерфейса, того самого единого устройства.
3) параметры порта/канала для передачи от компьютера к USB устройству (желтым выделено направление, и тот самый адрес что ты спрашивал пару постов назад), а красным выделил сколько байт обязательно нужно посылать в устройство.
4) параметры порта/канала для передачи от USB устройства в компьютер, а также адрес, и размер пакетов.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

selenur писал(а):а красным выделил сколько байт обязательно нужно посылать в устройство.
Вот это то и интересно, что у меня нужно отправлять пакет не фиксированной длины... если отправлять фиксированной (пустое место добиваем нулями), то плата начинает тупить.
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение selenur »

Nick писал(а):
selenur писал(а):а красным выделил сколько байт обязательно нужно посылать в устройство.
Вот это то и интересно, что у меня нужно отправлять пакет не фиксированной длины... если отправлять фиксированной (пустое место добиваем нулями), то плата начинает тупить.
Есть возможность под windows сниффером получить данные, при запуске родного ПО? (сниффер: http://www.usblyzer.com/ 30 дней бесплатно работает).
Т.к. странно, и интересно, почему с нефиксированной длиной у тебя работает....
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

Вот тут запакованные данные, как раз от этого сниффера и от родного ПО:
Re: Сканаторная голова, запустить под Linux #23
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение selenur »

А можешь описание USB устройства показать...
т.к. и в правду есть поссылки в устройство разной длины...
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение Nick »

Только если вечером... и то не факт - плата уже на производстве, а там винды вообще нет...
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Сканаторная голова, запустить под Linux

Сообщение selenur »

Ну ладно.... :-) просто интересно как так получается....
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Ответить

Вернуться в «LinuxCNC»