Hi!
I try to use this dockerfile to control servo:
# Base l4t container with Jetpack 5.0
FROM nvcr.io/nvidia/l4t-base:r34.1.1
WORKDIR /usr/src/car/utils
ADD . /usr/src/car/utils
RUN apt-get update
RUN apt-get install -y python3-opencv && apt-get install -y python3-pip
# Setting up Servo control
RUN apt-get install -y python3-pip
RUN pip3 install Jetson.GPIO
RUN apt-get install -y python3-smbus
RUN usermod -aG i2c root
RUN groupadd -f -r gpio
RUN usermod -a -G gpio root
Then I run the container using command docker run -it --runtime nvidia --volume /dev/video0:/dev/video0 --device /dev/video0 --volume /home/vovinsa/Documents/SelfDrivingCar/car/utils:/usr/src/car/utils --volume /tmp/argus_socket:/tmp/argus_socket --volume /dev/i2c-1:/dev/i2c-1 --device /dev/i2c-1 9b
and use this simple script to control servo:
from servo import Servo
pwm = Servo()
pwm.set_pwm_freq(50)
pwm.set_rotation_angle(channel=0, angle=180)
P.S. the Servo class:
import time
import math
import smbus
class Servo:
"""
Control Servo Jetson Nano
"""
__SUBADR1 = 0x02
__SUBADR2 = 0x03
__SUBADR3 = 0x04
__MODE1 = 0x00
__MODE2 = 0x01
__PRESCALE = 0xFE
__LED0_ON_L = 0x06
__LED0_ON_H = 0x07
__LED0_OFF_L = 0x08
__LED0_OFF_H = 0x09
__ALLLED_ON_L = 0xFA
__ALLLED_ON_H = 0xFB
__ALLLED_OFF_L = 0xFC
__ALLLED_OFF_H = 0xFD
def __init__(self, address=0x40):
self.bus = smbus.SMBus(1)
self.address = address
self.write(self.__MODE1, 0x00)
def write(self, reg, value):
self.bus.write_byte_data(self.address, reg, value)
def read(self, reg):
result = self.bus.read_byte_data(self.address, reg)
return result
def set_pwm_freq(self, freq):
prescaleval = 25000000.0 # 25MHz
prescaleval /= 4096.0 # 12-bit
prescaleval /= float(freq)
prescaleval -= 1.0
prescale = math.floor(prescaleval + 0.5)
oldmode = self.read(self.__MODE1)
newmode = (oldmode & 0x7F) | 0x10 # sleep
self.write(self.__MODE1, newmode) # go to sleep
self.write(self.__PRESCALE, int(math.floor(prescale)))
self.write(self.__MODE1, oldmode)
time.sleep(0.005)
self.write(self.__MODE1, oldmode | 0x80)
self.write(self.__MODE2, 0x04)
def set_pwm(self, channel, on, off):
self.write(self.__LED0_ON_L + 4 * channel, on & 0xFF)
self.write(self.__LED0_ON_H + 4 * channel, on >> 8)
self.write(self.__LED0_OFF_L + 4 * channel, off & 0xFF)
self.write(self.__LED0_OFF_H + 4 * channel, off >> 8)
def set_servo_pulse(self, channel, pulse):
pulse = pulse * 4096 / 20000 # PWM frequency is 50HZ,the period is 20000us
self.set_pwm(channel, 0, int(pulse))
def set_rotation_angle(self, channel, angle):
if 0 <= angle <= 180:
temp = angle * (2000 / 180) + 501
self.set_servo_pulse(channel, temp)
else:
print("Angle out of range")
def exit_servo(self):
self.write(self.__MODE2, 0x00)
And it doesn’t work
Also I have trued to import Jetson.GPIO in the container and I have this error:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.8/dist-packages/Jetson/GPIO/__init__.py", line 1, in <module>
from .gpio import *
File "/usr/local/lib/python3.8/dist-packages/Jetson/GPIO/gpio.py", line 33, in <module>
raise RuntimeError("The current user does not have permissions set to "
RuntimeError: The current user does not have permissions set to access the library functionalites. Please configure permissions or use the root user to run this
How can I fix this?