树莓派pico驱动机械臂 使用pca9685 MicroPython编程

树莓派pico小练习

第一章 使用pico+pca9685驱动多个舵机



前言

最近在玩机械臂抓取盒子,正好买了块pico顺便练练手,学习一下。
首先要感谢up在B站关于pico的讲解 邪恶的胖次菌


一、pca9685是什么?

大家可以先去大佬处了解一下PCA9685 多舵机控制器的编程
PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出的芯片,该芯片最初由NXP推出时主要面向LED开关调光,16路12位PWM信号发生器,可用于控制舵机、led、电机等设备,i2c通信,节省主机资源。就是想控制好几台舵机,但太占用引脚资源就想到了这个神器。
其实通俗一点就是,一般一个舵机会占用一个数据引脚和电源正负引脚,如果想直接一个开发板连接多个舵机会很占用引脚资源,而有了舵机驱动板,既解决了电源接线问题也解决了引脚占用问题,非常香!!

二、Pico编程

这里需要一些基础,比如pico烧固件,Thonny的安装使用需要大家自行完成。可以参考树莓派官网教程树莓派pico中文站

1.main.py

大家可以先按照示例的代码进行下载运行
其中i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=10000)中的Pin()中表示的是GPIO0和GPIO1
s.position(0,0)的参数1表示要控制电机驱动板上的第几号位置,参数2表示要控制舵机旋转到多少度
s.position(0,0)表示控制0号位置的舵机旋转到0度的位置
大家可以直接在终端直接输入s.position(0,0)来对舵机进行控制。

from machine import I2C,Pin
import time
from servo import Servos
i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=10000)
s=Servos(i2c,address=0x40)
s.position(0,0)
s.position(1,0)
s.position(0,90)
s.position(1,90)

#pico-PCA9685

#3v3 OUT--VCC
#GND--GND
#GPIO0--SDA
#GPIO1--SCL


#PCA 9685 接线
#0-15为外接舵机
#外接5V电源
#黄色 数据
#红色 5V


2.servo.py

代码如下(示例):

import pca9685
import math


class Servos:
    def __init__(self, i2c, address=0x40, freq=50, min_us=600, max_us=2400,
                 degrees=180):
        self.period = 1000000 / freq
        self.min_duty = self._us2duty(min_us)
        self.max_duty = self._us2duty(max_us)
        self.degrees = degrees
        self.freq = freq
        self.pca9685 = pca9685.PCA9685(i2c, address)
        self.pca9685.freq(freq)

    def _us2duty(self, value):
        return int(4095 * value / self.period)

    def position(self, index, degrees=None, radians=None, us=None, duty=None):
        span = self.max_duty - self.min_duty
        if degrees is not None:
            duty = self.min_duty + span * degrees / self.degrees
        elif radians is not None:
            duty = self.min_duty + span * radians / math.radians(self.degrees)
        elif us is not None:
            duty = self._us2duty(us)
        elif duty is not None:
            pass
        else:
            return self.pca9685.duty(index)
        duty = min(self.max_duty, max(self.min_duty, int(duty)))
        self.pca9685.duty(index, duty)

    def release(self, index):
        self.pca9685.duty(index, 0)



总结

猜你喜欢

转载自blog.csdn.net/lzsm_/article/details/126066031