#!/usr/bin/env python3 import sys from spotmicroai.utilities.log import Logger import multiprocessing from spotmicroai.motion_controller.motion_controller import MotionController from spotmicroai.abort_controller.abort_controller import AbortController from spotmicroai.lcd_screen_controller.lcd_screen_controller import LCDScreenController from spotmicroai.remote_controller.remote_controller import RemoteControllerController log = Logger().setup_logger() def process_abort_controller(communication_queues): abort = AbortController(communication_queues) abort.do_process_events_from_queue() def process_motion_controller(communication_queues): motion = MotionController(communication_queues) motion.do_process_events_from_queues() def process_remote_controller_controller(communication_queues): remote_controller = RemoteControllerController(communication_queues) remote_controller.do_process_events_from_queues()
import signal import RPi.GPIO as GPIO import sys from spotmicroai.utilities.log import Logger from spotmicroai.utilities.config import Config import spotmicroai.utilities.queues as queues log = Logger().setup_logger('Abort controller') class AbortController: gpio_port = None def __init__(self, communication_queues): try: log.debug('Starting controller...') signal.signal(signal.SIGINT, self.exit_gracefully) signal.signal(signal.SIGTERM, self.exit_gracefully) self.gpio_port = Config().get(Config.ABORT_CONTROLLER_GPIO_PORT) GPIO.setmode(GPIO.BCM) GPIO.setup(self.gpio_port, GPIO.OUT) self._abort_queue = communication_queues[queues.ABORT_CONTROLLER] self._lcd_screen_queue = communication_queues[queues.LCD_SCREEN_CONTROLLER] self.abort()
import os from spotmicroai.utilities.log import Logger log = Logger().setup_logger('System') class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class System(metaclass=Singleton): def __init__(self): try: log.debug('Loading system...') except Exception as e: log.error('Problem while loading the configuration file', e) def temperature(self): try: temp = os.popen("vcgencmd measure_temp").readline() # log.debug("System temperature: " + temp.replace("temp=", "")[:-5]) return temp.replace("temp=", "")[:-5] except:
#!/home/pi/spotmicroai/venv/bin/python3 -u from spotmicroai.lcd_screen_controller import LCD_16x2_I2C_driver from spotmicroai.utilities.log import Logger from spotmicroai.utilities.config import Config import time log = Logger().setup_logger('Test LCD Screen') log.info('Testing LCD screen...') i2c_address = Config().get('lcd_screen_controller[0].lcd_screen[0].address') log.info('Use the command "i2cdetect -y 1" to list your i2c devices connected and') log.info('write your lcd screen i2c address in your configuration file ~/spotmicroai.json') log.info('Current configuration value is: ' + str(i2c_address)) input("Press Enter to start the tests...") lcd_screen = LCD_16x2_I2C_driver.lcd(address=int(i2c_address, 0)) def test_0(): log.info('Test0') lcd_screen.lcd_clear() lcd_screen.backlight(0) time.sleep(1) lcd_screen.backlight(1) time.sleep(1)
import json import sys import os from spotmicroai.utilities.log import Logger import jmespath # http://jmespath.org/tutorial.html import shutil from pathlib import Path log = Logger().setup_logger('Configuration') class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class Config(metaclass=Singleton): ABORT_CONTROLLER_GPIO_PORT = 'abort_controller[0].gpio_port' LCD_SCREEN_CONTROLLER_I2C_ADDRESS = 'lcd_screen_controller[0].lcd_screen[0].address' REMOTE_CONTROLLER_CONTROLLER_DEVICE = 'remote_controller_controller[0].remote_controller[0].device' MOTION_CONTROLLER_BOARDS_PCA9685_1_ADDRESS = 'motion_controller[*].boards[*].pca9685_1[*].address | [0] | [0] | [0]' MOTION_CONTROLLER_BOARDS_PCA9685_1_REFERENCE_CLOCK_SPEED = 'motion_controller[*].boards[*].pca9685_1[*].reference_clock_speed | [0] | [0] | [0]' MOTION_CONTROLLER_BOARDS_PCA9685_1_FREQUENCY = 'motion_controller[*].boards[*].pca9685_1[*].frequency | [0] | [0] | [0]' MOTION_CONTROLLER_BOARDS_PCA9685_2_ADDRESS = 'motion_controller[*].boards[*].pca9685_2[*].address | [0] | [0] | [0]' MOTION_CONTROLLER_BOARDS_PCA9685_2_REFERENCE_CLOCK_SPEED = 'motion_controller[*].boards[*].pca9685_2[*].reference_clock_speed | [0] | [0] | [0]' MOTION_CONTROLLER_BOARDS_PCA9685_2_FREQUENCY = 'motion_controller[*].boards[*].pca9685_2[*].frequency | [0] | [0] | [0]'
#!/home/pi/spotmicroai/venv/bin/python3 -u # Released by rdb under the Unlicense (unlicense.org) # Based on information from: # https://www.kernel.org/doc/Documentation/input/joystick-api.txt import os, struct, array from fcntl import ioctl from spotmicroai.utilities.log import Logger from spotmicroai.utilities.config import Config log = Logger().setup_logger('Testing remote controller') # Iterate over the joystick devices. print('Available devices:') for fn in os.listdir('/dev/input'): if fn.startswith('js'): log.info((' /dev/input/%s' % (fn))) # We'll store the states here. axis_states = {} button_states = {} # These constants were borrowed from linux/input.h axis_names = { 0x00: 'x', 0x01: 'y', 0x02: 'z', 0x03: 'rx',
#!/home/pi/spotmicroai/venv/bin/python3 -u import busio from board import SCL, SDA from adafruit_pca9685 import PCA9685 from adafruit_motor import servo from pick import pick import time import os import sys import RPi.GPIO as GPIO from spotmicroai.utilities.log import Logger from spotmicroai.utilities.config import Config log = Logger().setup_logger('CALIBRATE SERVOS') log.info('Calibrate rest position...') pca = None gpio_port = Config().get(Config.ABORT_CONTROLLER_GPIO_PORT) GPIO.setmode(GPIO.BCM) GPIO.setup(gpio_port, GPIO.OUT) GPIO.output(gpio_port, False) i2c = busio.I2C(SCL, SDA) while True: options = {
import signal import sys import time import queue from spotmicroai.utilities.log import Logger from spotmicroai.lcd_screen_controller import LCD_16x2_I2C_driver from spotmicroai.utilities.config import Config from spotmicroai.utilities.system import System import spotmicroai.utilities.queues as queues log = Logger().setup_logger('LCD Screen controller') class LCDScreenController: is_alive = False lcd_screen_controller = None abort_controller = None remote_controller_controller = None motion_controller_1 = None motion_controller_2 = None def __init__(self, communication_queues): try: log.debug('Starting controller...') signal.signal(signal.SIGINT, self.exit_gracefully) signal.signal(signal.SIGTERM, self.exit_gracefully)
#!/home/pi/spotmicroai/venv/bin/python3 -u import busio from board import SCL, SDA from adafruit_pca9685 import PCA9685 from adafruit_motor import servo import time from spotmicroai.utilities.log import Logger from spotmicroai.utilities.config import Config import RPi.GPIO as GPIO log = Logger().setup_logger('Test Motion') log.info('Testing Motion...') pca9685_1_address = int( Config().get( 'motion_controller[*].boards[*].pca9685_1[*].address | [0] | [0] | [0]' ), 0) pca9685_1_reference_clock_speed = int(Config().get( 'motion_controller[*].boards[*].pca9685_1[*].reference_clock_speed | [0] | [0] | [0]' )) pca9685_1_frequency = int(Config().get( 'motion_controller[*].boards[*].pca9685_1[*].frequency | [0] | [0] | [0]')) boards = 1 try: pca9685_2_address = int( Config().get(
#!/home/pi/spotmicroai/venv/bin/python3 -u import RPi.GPIO as GPIO import time from spotmicroai.utilities.log import Logger from spotmicroai.utilities.config import Config log = Logger().setup_logger('Test Abort') log.info('Testing abort mechanism...') gpio_port = Config().get('abort_controller[0].gpio_port') log.info( 'Make sure you have connected your GPIO pin to the 0E port in the PCA9685 boards' ) log.info('GPIO information for RaspberryPi can be found here: ') log.info(' https://www.raspberrypi.org/documentation/usage/gpio/') log.info('Current configuration value is: ' + str(gpio_port)) input("Press Enter to start the tests...") try: GPIO.setmode(GPIO.BCM) GPIO.setup(gpio_port, GPIO.OUT) GPIO.cleanup() GPIO.output(gpio_port, True) time.sleep(2)
import time import os import struct import array from fcntl import ioctl import signal import sys from spotmicroai.utilities.log import Logger from spotmicroai.utilities.config import Config import spotmicroai.utilities.queues as queues log = Logger().setup_logger('Remote controller') class RemoteControllerController: def __init__(self, communication_queues): try: log.debug('Starting controller...') signal.signal(signal.SIGINT, self.exit_gracefully) signal.signal(signal.SIGTERM, self.exit_gracefully) # We'll store the states here. self.connected_device = False self.axis_states = {} self.button_states = {} self.button_map = [] self.axis_map = [] self.jsdev = None