树莓派学习笔记18:IIC驱动_PCA9685(16路舵机驱动模块)

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)

本人所用树莓派4B 装载的系统与版本如下:

 版本可用命令 (lsb_release -a) 查询:

​​

 Python 版本3.7.3:

​​

 IIC驱动_PCA9685(16路舵机驱动模块)

文章提供测试代码讲解,整体代码贴出、测试效果图

目录

 开启树莓派IIC配置:

启用IIC:

验证启用:

连接硬件:

代码编写:

测试效果图:

 网上学习资料贴出:


开启树莓派IIC配置:

启用IIC:

sudo raspi-config

pip3 install adafruit-pca9685

(这里的pi是你的用户名,这一步用于授权IIC)

sudo usermod -a -G i2c pi

重启树莓派

验证启用:

i2cdetect  -l

i2cdetect -y 1

连接硬件:

代码编写:

改代码实现了循环0-180度转动MG996R舵机:

# -*- coding: utf-8 -*-

from __future__ import division
import time

import Adafruit_PCA9685

pwm = Adafruit_PCA9685.PCA9685()
servo_min = 150  # Min pulse length out of 4096
servo_max = 600  # Max pulse length out of 4096

def set_servo_pulse(channel, pulse):
    pulse_length = 1000000    # 1,000,000 us per second
    pulse_length //= 60           # 60 Hz
    print('{0}us per period'.format(pulse_length))
    pulse_length //= 4096     # 12 bits of resolution
    print('{0}us per bit'.format(pulse_length))
    pulse *= 1000
    pulse //= pulse_length
    pwm.set_pwm(channel, 0, pulse)

def set_servo_angle(channel,angle):
    angle=4096*((angle*11)+500)/20000
    pwm.set_pwm(channel,0,int(angle))

#设置PCA9685的PWM频率为50Hz,这是控制伺服器时常用的频率。
pwm.set_pwm_freq(50)

print('Moving servo on channel 0, press Ctrl-C to quit...')


#代码后面设置的是channel 4和5的伺服器

while True:
    set_servo_angle(4,0)
    time.sleep(1)   
    set_servo_angle(5,0)
    time.sleep(1)


    set_servo_angle(4,45)
    time.sleep(1)    
    set_servo_angle(5,45)
    time.sleep(1)

    set_servo_angle(4,90)
    time.sleep(1)    
    set_servo_angle(5,90)
    time.sleep(1)

    set_servo_angle(4,180)
    time.sleep(1)    
    set_servo_angle(5,180)
    time.sleep(1)

测试效果图:

 网上学习资料贴出:

 避坑指南!树莓派使用Adafruit_PCA9685驱动_adafruit-pca9685-CSDN博客

 树莓派4B-Python-使用PCA9685控制舵机云台+跟随人脸转动-CSDN博客

[树莓派基础]10.树莓派二维云台舵机调零视频讲解_哔哩哔哩_bilibili

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用I2C2驱动PCA968516通道PWM代码,需要先初始化I2C2和PCA9685: ```c #include "stm32f4xx.h" #define PCA9685_ADDR 0x40 // PCA9685的I2C地址 void I2C2_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; I2C_InitTypeDef I2C_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2); I2C_DeInit(I2C2); I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStruct.I2C_OwnAddress1 = 0x00; I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStruct.I2C_ClockSpeed = 100000; I2C_Init(I2C2, &I2C_InitStruct); I2C_Cmd(I2C2, ENABLE); } void PCA9685_Init(void) { uint8_t data[2]; data[0] = 0x00; // MODE1寄存器地址 data[1] = 0x01; // 设置PCA9685为普通模式 I2C_GenerateSTART(I2C2, ENABLE); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C2, PCA9685_ADDR, I2C_Direction_Transmitter); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C2, data[0]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C2, data[1]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C2, ENABLE); data[0] = 0xFE; // PRE_SCALE寄存器地址 data[1] = 0x03; // 设置PWM时钟频率为50Hz I2C_GenerateSTART(I2C2, ENABLE); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C2, PCA9685_ADDR, I2C_Direction_Transmitter); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C2, data[0]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C2, data[1]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C2, ENABLE); data[0] = 0x00; // MODE1寄存器地址 data[1] = 0x81; // 设置PCA9685为自动增量模式 I2C_GenerateSTART(I2C2, ENABLE); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C2, PCA9685_ADDR, I2C_Direction_Transmitter); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C2, data[0]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C2, data[1]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C2, ENABLE); } void PCA9685_SetPWM(uint8_t channel, uint16_t on, uint16_t off) { uint8_t data[5]; data[0] = 0x06 + 4 * channel; // LED0_ON_L寄存器地址 data[1] = on & 0xFF; // LED0_ON_L data[2] = on >> 8; // LED0_ON_H data[3] = off & 0xFF; // LED0_OFF_L data[4] = off >> 8; // LED0_OFF_H I2C_GenerateSTART(I2C2, ENABLE); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C2, PCA9685_ADDR, I2C_Direction_Transmitter); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C2, data[0]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C2, data[1]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C2, data[2]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C2, data[3]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C2, data[4]); while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C2, ENABLE); } int main(void) { I2C2_Init(); PCA9685_Init(); while (1) { // 设置PWM输出 PCA9685_SetPWM(0, 0, 2048); // 50%占空比 PCA9685_SetPWM(1, 0, 4096); // 100%占空比 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NULL指向我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值