Делать вещи (управлять сервоприводами, включать светодиод) с помощью джойстика - PullRequest
0 голосов
/ 09 мая 2019

Я создаю базового робота DVa Mech (хобби).Это не двуногий.Колесное шасси.Весь код на питоне.

Как непрерывно выполнять действия, удерживая нажатой кнопку, нажимая джойстик?И могу ли я даже сделать два (или больше) одновременно: двигать колеса вперед, поворачивать торс, стрелять из пушек?

Я хорошо читаю ввод данных с джойстика.Сервоприводы тоже работают.Кажется, я не могу понять логические циклы «пока нажата кнопка - сделай что-нибудь - и продолжай сканировать для большего ввода»

Пробовал разные вещи ... они не работали, поэтому они вышли изкод ниже.

Запуск 6 непрерывных сервоприводов (4 для шасси, два для мини-пушек) Джойстик Logitech F710

from evdev import InputDevice, categorize, ecodes, KeyEvent
from adafruit_servokit import ServoKit
import time
kit = ServoKit(channels = 16)
gamepad = InputDevice('/dev/input/event7')
print (gamepad)
for event in gamepad.read_loop():
    if event.type == ecodes.EV_KEY:
            keyevent = categorize(event)
            if keyevent.keystate == KeyEvent.key_down:
                    print(keyevent)
                    ....
                    elif keyevent.keycode == 'BTN_TL':
                            print ("Guns")
    elif event.type == ecodes.EV_ABS:
            absevent = categorize(event)
            print(absevent.event.code)
            if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_HAT0X':
                    if absevent.event.value == -1:
                            print('left')
                    elif absevent.event.value == 1:
                            print('right')
            if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_HAT0Y':
                    if absevent.event.value == -1:
                            print('forward')
                    elif absevent.event.value == 1:
                            print('back')

Довольно просто ... при нажатии BTN_TL, сервоприводы 5 и 6должен вращаться до тех пор, пока кнопка не будет отпущена

Аналогично с HAT0X и 0Y сервоприводы должны двигаться вперед / назад / влево / вправо при нажатии.

Я пробовал циклы while и еще много чего ... нов джойстике есть логическая / временная последовательность, которую я не помещаю в нужное место

1 Ответ

0 голосов
/ 10 мая 2019

Для серво детали и на основе Сервокит документации есть два способа управления сервоприводами:

  1. Установить желаемый угол вала:
    kit.servo[servonum].angle = 180
Укажите направление вращения (1: вперед, -1: назад, 0: останов), например:
    kit.continuous_servo[servonum].throttle = 1 
    kit.continuous_servo[servonum].throttle = -1
    kit.continuous_servo[servonum].throttle = 0

Я бы предпочел использовать углы, даже если бы яЯ должен увеличивать / уменьшать их значения (в зависимости от времени) в цикле.Это даст вам представление о скорости (или кривой скорости) и положении.

Для части Джойстик , «Учебное пособие» Эрика Гобелбекера , которое стоит прочитать.

РЕДАКТИРОВАТЬ: Решение с continuous_servo (для дальнейшего чтения)

ABS_HAT0{X,Y} уведомляет событие ВНИЗ с -1 или +1 на активной оси.И UP со значением 0.

axis_servo = {
    'ABS_HAT0X': 5,
    'ABS_HAT0Y': 6,
}

[...]
        axis = ecodes.bytype[absevent.event.type][absevent.event.code]
        if axis == 'ABS_HAT0X':
            servonum = axis_servo[axis]
            kit.continuous_servo[servonum].throttle = absevent.event.value
        if axis == 'ABS_HAT0Y':
            servonum = axis_servo[axis]
            # Reverse Y axis (1 -> up direction)
            kit.continuous_servo[servonum].throttle = -absevent.event.value

Без continuous_servo следует рассмотреть возможность использования select() с timeout (select([gamepad], [], [], timeout)), как описано в readthedoc:python-evdev .

Тайм-аут позволит вычислить угол.

...