• Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
CAP33

Модуль onionGpio на Python3

5 posts in this topic

Всем привет! Мне понадобилось поработать  с контактами GPIO на Omega-2+. Программирую на Python3. Установил модуль:

root@Omega-D90D:~# opkg install python3 pyOnionGpio
Package python3 (3.6.0-2) installed in root is up to date.
Installing pyOnionGpio (0.2-1) to root...
Downloading http://repo.onion.io/omega2/packages/onion/pyOnionGpio_0.2-1_mipsel_24kc.ipk
Installing python-base (2.7.14-5) to root...
Downloading http://downloads.lede-project.org/releases/17.01-SNAPSHOT/packages/mipsel_24kc/packages/python-base_2.7.14-5_mipsel_24kc.ipk
Configuring python-base.
Configuring pyOnionGpio.

Импортировал модуль:

import onionGpio

Но при запуске программы через Python3 возникает ошибка:

ModuleNotFoundError: No module named 'onionGpio'

Подскажите, это я где-то косячу, или проблема в другом?

Share this post


Link to post
Share on other sites
В 25.08.2018 в 14:46, CAP33 сказал:

 


import onionGpio

Но при запуске программы через Python3 возникает ошибка:


ModuleNotFoundError: No module named 'onionGpio'

Подскажите, это я где-то косячу, или проблема в другом?

Вы уверены, что при импорте указали название модуля правильно?

Возможно он называется не "onionGpio", а "pyOnionGpio"?

Скорее всего у вас ошибка в названии модуля при вызове его в Python 3.

Share this post


Link to post
Share on other sites
В 27.08.2018 в 06:33, Alexey сказал:

Вы уверены, что при импорте указали название модуля правильно?

Возможно он называется не "onionGpio", а "pyOnionGpio"?

Скорее всего у вас ошибка в названии модуля при вызове его в Python 3.

Я не ошибся в названии модуля. Я делал по инструкции: https://docs.onion.io/omega2-docs/gpio-python-module.html.

Только заменил python-light на python3.

PS

Я уже решил проблему. Взял файл данной библиотеки от python 2.7 и переделал для python 3, как указано здесь:

https://community.onion.io/topic/2590/oniongpio-for-python3/4.

Edited by CAP33

Share this post


Link to post
Share on other sites
В 28.08.2018 в 17:42, CAP33 сказал:

Я уже решил проблему. Взял файл данной библиотеки от python 2.7 и переделал для python 3, как указано здесь:

https://community.onion.io/topic/2590/oniongpio-for-python3/4.

Выложите, пожалуйста,  измененный файл под Python 3 в этой теме, чтобы другие могли его просто скачать, а не переделывать сами вручную.

Share this post


Link to post
Share on other sites
1 час назад, Alexey сказал:

Выложите, пожалуйста,  измененный файл под Python 3 в этой теме, чтобы другие могли его просто скачать, а не переделывать сами вручную.

В директории /usr/lib/python3.6 нужно создать файл onionGpio.py и вставить в него этот код:

import sys


__version__ = "0.1"


_EXIT_SUCCESS			= 0
_EXIT_FAILURE			= -1


GPIO_BASE_PATH 					= '/sys/class/gpio'
GPIO_EXPORT 					= GPIO_BASE_PATH + '/export'
GPIO_UNEXPORT 					= GPIO_BASE_PATH + '/unexport'
			
GPIO_PATH 						= GPIO_BASE_PATH + '/gpio%d'
GPIO_VALUE_FILE					= 'value'
GPIO_DIRECTION_FILE				= 'direction'
GPIO_ACTIVE_LOW_FILE			= 'active_low'

_GPIO_INPUT_DIRECTION			= 'in'
_GPIO_OUTPUT_DIRECTION			= 'out'
_GPIO_OUTPUT_DIRECTION_LOW		= 'low'
_GPIO_OUTPUT_DIRECTION_HIGH		= 'high'

_GPIO_ACTIVE_HIGH				= 0
_GPIO_ACTIVE_LOW				= 1


class OnionGpio:
	"""Base class for sysfs GPIO access"""

	def __init__(self, gpio, verbose=0):
		self.gpio = gpio
		self.path = GPIO_PATH%(self.gpio)

		self.verbose = verbose

		if self.verbose > 0:
			print ('GPIO%d path: %s'%(self.gpio, self.path))
		

	def _initGpio(self):
		"""Write to the gpio export to make the gpio available in sysfs"""
		with open(GPIO_EXPORT, 'w') as fd:
			fd.write(str(self.gpio))
			fd.close()
			return _EXIT_SUCCESS

		return _EXIT_FAILURE

	def _freeGpio(self):
		"""Write to the gpio unexport to release the gpio sysfs instance"""
		with open(GPIO_UNEXPORT, 'w') as fd:
			fd.write(str(self.gpio))
			fd.close()
			return _EXIT_SUCCESS

		return _EXIT_FAILURE

	# value functions
	def getValue(self):
		"""Read current GPIO value"""
		# generate the gpio sysfs instance
		status 	= self._initGpio()

		if status == _EXIT_SUCCESS:
			gpioFile = self.path + "/" + GPIO_VALUE_FILE
			value = 0

			with open(gpioFile, 'r') as fd:
				value = fd.read()
				fd.close()

			# release the gpio sysfs instance
			status = self._freeGpio()

			return value

		return _EXIT_FAILURE

	def setValue(self, value):
		"""Set the desired GPIO value"""
		ret = _EXIT_FAILURE
		# generate the gpio sysfs instance
		status = self._initGpio()

		if status == _EXIT_SUCCESS:
			gpioFile = self.path + "/" + GPIO_VALUE_FILE

			with open(gpioFile, 'w') as fd:
				fd.write(str(value))
				fd.close()
				ret = _EXIT_SUCCESS
				
			# release the gpio sysfs instance
			status 	= self._freeGpio()

			return ret

		return _EXIT_FAILURE


	# direction functions
	def getDirection(self):
		"""Read current GPIO direction"""
		# generate the gpio sysfs instance
		status 	= self._initGpio()

		if status == _EXIT_SUCCESS:
			gpioFile = self.path + "/" + GPIO_DIRECTION_FILE
			direction = _EXIT_FAILURE

			# read from the direction file
			with open(gpioFile, 'r') as fd:
				direction 	= fd.read()
				fd.close()

			# release the gpio sysfs instance
			status 	= self._freeGpio()

			return direction

		return _EXIT_FAILURE

	def _setDirection(self, direction):
		"""Set the desired GPIO direction"""
		ret = _EXIT_FAILURE

		# check the direction argument
		if direction != _GPIO_INPUT_DIRECTION and direction != _GPIO_OUTPUT_DIRECTION and direction != _GPIO_OUTPUT_DIRECTION_LOW and direction != _GPIO_OUTPUT_DIRECTION_HIGH:
			return _EXIT_FAILURE

		# generate the gpio sysfs instance
		status 	= self._initGpio()

		if status == _EXIT_SUCCESS:
			gpioFile 	= self.path + "/" + GPIO_DIRECTION_FILE

			# write to the direction file
			with open(gpioFile, 'w') as fd:
				fd.write(direction)
				fd.close()
				ret = _EXIT_SUCCESS

			# release the gpio sysfs instance
			status 	= self._freeGpio()

			return ret

		return _EXIT_FAILURE

	def setInputDirection(self):
		ret = self._setDirection(_GPIO_INPUT_DIRECTION)
		return 	ret

	def setOutputDirection(self, initial=-1):
		argument	= _GPIO_OUTPUT_DIRECTION
		if initial == 0:
			argument = _GPIO_OUTPUT_DIRECTION_LOW
		elif initial == 1:
			argument = _GPIO_OUTPUT_DIRECTION_HIGH

		ret = self._setDirection(argument)
		return 	ret


	# active-low functions
	def getActiveLow(self):
		"""Read if current GPIO is active-low"""
		# generate the gpio sysfs instance
		status 	= self._initGpio()

		if status == _EXIT_SUCCESS:
			gpioFile 	= self.path + "/" + GPIO_ACTIVE_LOW_FILE
			activeLow	= _EXIT_FAILURE

			with open(gpioFile, 'r') as fd:
				activeLow 	= fd.read()
				fd.close()
				if self.verbose > 0:
					print ('onionGpio:getActiveLow:: Reading %s file ... Read %s'%(gpioFile, activeLow))

			# release the gpio sysfs instance
			status 	= self._freeGpio()

			return activeLow

		return _EXIT_FAILURE

	def _setActiveLow(self, activeLow):
		"""Set the desired GPIO direction"""
		ret = _EXIT_FAILURE
		# generate the gpio sysfs instance
		status 	= self._initGpio()

		if status == _EXIT_SUCCESS:
			gpioFile 	= self.path + "/" + GPIO_ACTIVE_LOW_FILE

			if activeLow == _GPIO_ACTIVE_HIGH or activeLow == _GPIO_ACTIVE_LOW:
				with open(gpioFile, 'w') as fd:
					if self.verbose > 0:
						print ('onionGpio:_setActiveLow:: Writing %s to %s file'%(str(activeLow), gpioFile))
					fd.write(str(activeLow))
					fd.close()
					ret = _EXIT_SUCCESS

			# release the gpio sysfs instance
			status 	= self._freeGpio()
			# note: active_low setting is reset when the gpio sysfs interface is released!

			return ret

		return _EXIT_FAILURE

	def setActiveHigh(self):
		ret = self._setActiveLow(_GPIO_ACTIVE_HIGH)
		return 	ret

	def setActiveLow(self):
		ret = self._setActiveLow(_GPIO_ACTIVE_LOW)
		return 	ret

Не забудьте сохранить.

Теперь вы можете пользоваться библиотекой onionGpio на Python 3.

1 person likes this

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now