树莓派+TCA9548+PCA9685+舵机:wiringPi实现

2 篇文章 0 订阅
2 篇文章 0 订阅

树莓派+TCA9548+PCA9685+舵机:wiringPi实现

参考:https://blog.csdn.net/weixin_38956024/article/details/95101686

上篇文章《树莓派+PCA9685+舵机控制:wiringPi实现》已讲解树莓派+PCA9685+舵机,本篇文章讲解树莓派+TCA9548+PCA9685+舵机wiringPi实现。
1接线
很简单,本图供参考:
在这里插入图片描述2代码:

#include <stdbool.h>
#include <stdio.h>
#include "wiringPi.h"
#include <wiringPiI2C.h> 
#include <unistd.h>


bool PCA9685Init();
void ResetPca9685();
void PCA9685SetPwmFreq(unsigned short freq);
void PCA9685SetPwm(unsigned char channel, unsigned short on, unsigned short value);
void SetServoPulse(unsigned char channel, unsigned short pulse);



#define TCA9548_ADDRESS			0x70			//tca9548地址


#define PCA9685_ADDRESS			0x40			//pca9685地址
#define PCA9685_CLOCK_FREQ		25000000		//PWM频率25MHz
#define PCA9685_MODE1			0x00
#define PCA9685_MODE2			0x01
#define PCA9685_PRE_SCALE		0xFE
#define PCA9685_LED0_ON_L		0x06
#define PCA9685_LED0_ON_H		0x07
#define PCA9685_LED0_OFF_L		0x08
#define PCA9685_LED0_OFF_H		0x09
#define PCA9685_LED_SHIFT		4



bool WriteByte(int fd, unsigned char regAddr, unsigned char data);
unsigned char ReadByte(int fd, unsigned char regAddr);
bool TCA9548AInit();


bool PCA9685_initSuccess = false;
int PCA9685_fd = 0;
int TCA9548_fd = 0;



int main()
{
	wiringPiSetup();
	TCA9548AInit();
	PCA9685Init();
	
	PCA9685SetPwmFreq(50);//50Hz
	int PCA9865_channel = 15;
	while (1)
	{
		for (int i = 500; i < 2500; i += 10)
		{
			SetServoPulse(PCA9865_channel, i);
			usleep(20000);
		}
	}
	
	return 0;
}
	


bool TCA9548AInit()
{
	//初始化
	TCA9548_fd = wiringPiI2CSetup(TCA9548_ADDRESS);
	if (TCA9548_fd <= 0)
		return false;
	printf("TCA9548_fd:%d\n", TCA9548_fd);
	if (wiringPiI2CWrite(TCA9548_fd, 1<<7) == -1)
	{
		printf("WriteByte TCA9548_fd failure!\n");
		return false;
	}
	int i = 1;
	while (i--)
	{
		int data = wiringPiI2CRead(TCA9548_fd);
		printf("data = %x\n",data);
		usleep(100000);
	}

	return true;
}



bool PCA9685Init() 
{
	//初始化
	PCA9685_fd = wiringPiI2CSetup(PCA9685_ADDRESS);
	if (PCA9685_fd <= 0) 
		return false;
	printf("PCA9685_fd:%d\n", PCA9685_fd);
	PCA9685_initSuccess = true;
	
	WriteByte(PCA9685_fd, PCA9685_MODE1, 0x00);
	WriteByte(PCA9685_fd, PCA9685_MODE2, 0x04);
	usleep(1000);
	//Delay Time is 0, means it always turn into high at the begin
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_L + PCA9685_LED_SHIFT * 0, 0);
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_H + PCA9685_LED_SHIFT * 0, 0);
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_L + PCA9685_LED_SHIFT * 1, 0);
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_H + PCA9685_LED_SHIFT * 1, 0);
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_L + PCA9685_LED_SHIFT * 2, 0);
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_H + PCA9685_LED_SHIFT * 2, 0);
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_L + PCA9685_LED_SHIFT * 3, 0);
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_H + PCA9685_LED_SHIFT * 3, 0);
	usleep(1000);



	return true;
}


void PCA9685SetPwmFreq(unsigned short freq) 
{ //设置频率
	unsigned char preScale = (PCA9685_CLOCK_FREQ / 4096 / freq) - 1;
	unsigned char oldMode = 0;
	printf("set PWM frequency to %d HZ\n", freq);
	//read old mode
	oldMode = ReadByte(PCA9685_fd, PCA9685_MODE1);
	//setup sleep mode, Low power mode. Oscillator off (bit4: 1-sleep, 0-normal)
	WriteByte(PCA9685_fd, PCA9685_MODE1, (oldMode & 0x7F) | 0x10);
	//set freq
	WriteByte(PCA9685_fd, PCA9685_PRE_SCALE, preScale);
	//setup normal mode (bit4: 1-sleep, 0-normal)
	WriteByte(PCA9685_fd, PCA9685_MODE1, oldMode);
	usleep(1000); // >500us
	//setup restart (bit7: 1- enable, 0-disable)
	WriteByte(PCA9685_fd, PCA9685_MODE1, oldMode | 0x80);
	usleep(1000); // >500us
}

void PCA9685SetPwm(unsigned char channel, unsigned short on, unsigned short value)
{
	//设置各个通道的PWM
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_L + PCA9685_LED_SHIFT * channel, on & 0xFF);
	WriteByte(PCA9685_fd, PCA9685_LED0_ON_H + PCA9685_LED_SHIFT * channel, on >> 8);
	WriteByte(PCA9685_fd, PCA9685_LED0_OFF_L + PCA9685_LED_SHIFT * channel, value & 0xFF);
	WriteByte(PCA9685_fd, PCA9685_LED0_OFF_H + PCA9685_LED_SHIFT * channel, value >> 8);
}


void SetServoPulse(unsigned char channel, unsigned short pulse)
{
	pulse = pulse * 4096 / 20000;
	PCA9685SetPwm(channel, 0, pulse);
}







bool WriteByte(int fd, unsigned char regAddr, unsigned char data) 
{
	if (wiringPiI2CWriteReg8(fd, regAddr, data) < 0)
	{
		printf("wiringPiI2CWriteReg8\n");
		return -1;
	}
		
	return 0;
}



unsigned char ReadByte(int fd, unsigned char regAddr) 
{
	unsigned char data; // `data` will store the register data
	data = wiringPiI2CReadReg8(fd, regAddr);
	if (data < 0)
	{
		return -1;
	}
	return data;
}

3、Python版本,需要安装Adafruit_GPIO (有网友说官网安装包下载之后再安装不成功,我也作死了一天,最后放弃了,再安装建议直接sudo pip install Adafruit-GPIO==1.0.0,出现问题请自行百度解决)

from Adafruit_GPIO import I2C
import time
from pca9685 import PCA9685

 
tca = I2C.get_i2c_device(address=0x70)
 
def tca_select(channel):
    if channel > 7:
        return
    tca.writeRaw8(1 << channel)
 
def tca_set(mask):
    if mask > 0xff:
        return
    tca.writeRaw8(mask)


if __name__=='__main__':
    tca_select(7)
    channel = 15
    pwm = PCA9685(0x40, debug=True)
    pwm.setPWMFreq(50)
    while True:
        for i in range(500,2500,10):
            pwm.setServoPulse(channel,i)
            time.sleep(0.02)
#        for i in range(2500,500,-10):
#            pwm.setServoPulse(channel,i)
#            time.sleep(0.02)
 
 
 
 
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1.1python软件的安装 先安装python软件优先,因为其他步骤如果用到sudo apt-get update 会导致python程序不是py2而是py3,就用不了我们的程序了 树莓派鼓励用户使用python和C++作为其开发语言,所以原则上可以不用安装python的编译器,但是树莓派自带的python(IDLE)和Thonny python IDE都过于简陋,不太适合python使用者进行复杂的OpenCV开发。在这里推荐Spyder作为树莓派的python IDE。这种编译器相对上述两种编译器略显笨重,但是对内核和运算值的控制更加灵活。   树莓派安装Spyder非常的方便,在命令行输入: sudo apt-get install spyder 下载时间可能比较长,因为在安装spyder3的同时很多python开发开发必要的依赖也一并被安装到树莓派里了,这也说明牺牲一定的空间下载spyder3是值得的。此时,我们已经可以在树莓派的开始菜单-programming中看到编译器了。注意: 1、 在下载spyder之前请不要输入 “sudo apt-get update/upgrade”, 否则会下载适用于python3.6的spyder,无法正常使用,比如图1-0中的spyder的python版本就是3.6,说明下载出现错误。 2、 如果看不到编译器说明安装过程出错,尝试重新执行:sudo apt-get update和 sudo apt-get install spyder3两条命令。   图 1-0下载完成后,在“start”中已经能看到Spyder编译器了     图 1-00 Spyder3的Python3.6版本 我们可以在preference/syntax coloring scheme中更换自己喜欢的主题,怎么样?是不是已经觉得树莓派和普通PC一样方便了呢?现在我们已经可以用在树莓派上舒适的开发python了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值