×

使用Python进行伺服PWM控制的MaaxBoard设置

消耗积分:0 | 格式:zip | 大小:0.60 MB | 2022-12-15

手托初梦

分享资料个

描述

介绍

这些是有关如何设置 MaaXBoard 以使用精确的 PWM 外部附加卡驱动多个伺服系统的分步说明。

目标是能够使用 Python 控制这些电机。我们将重用最初由Adafruit的 Tony DiCola 为 RaspberryPi 编写的代码(感谢 Tony)。只需进行少量修改,即可在 MaaXBoard 上运行一切。

先决条件:

首先在这里完成 MaaXBoard 无头设置

组件列表

除了威廉希尔官方网站 板本身,我们还需要一些外部部件:

PCA9685伺服驱动器

外部控制将使用 PCA9685 芯片,该芯片允许利用单个 I2C 总线控制多达 16 个独立通道(即 16 个伺服)。有多个为 Raspberry Pi 制造的带有 PCA9685 的防护罩。我们可以使用Adafruit 的盾牌,或者作为替代方案WaveShare 的盾牌

GPIO 适配器(可选)

由于 MaaxBoard 上的散热器非常高,如果您使用 WaveShare 的屏蔽罩,您可能还需要一个适配器来安装它。我们可以为树莓派使用GPIO 立管直角 GPIO 适配器这将允许“垂直”安装任何外部屏蔽,如果您在 MaaxBoard 散热器上安装了风扇,这将更加方便。

伺服电机

在为您的项目选择伺服电机的类型时,您需要注意您使用的电机类型。标准标签很少(SG90、MG90S、MG995、MG996R 等),但 PCA9685 兼容大多数变体。

集会

一旦你有了所有的零件,你需要安装伺服驱动器并将伺服器连接到它上面。

pYYBAGOX-XeAeta7AAKen8CFk7A712.png
来自 https://learn.adafruit.com/assets/69564
 

注意:Adafruit 的防护罩与 Waveshare 的防护罩不同。Waveshare 版本使用板载 5V/3A 稳压器为舵机供电(最终使用电池作为备用电源),而 Adafruit 版本让您可以灵活地使用外部电源为舵机提供 5V 电压。如果您计划使用多个伺服系统(最多 16 个),Adafruit 版本可能是更好的选择,因为您不会直接从树莓电源 (5V) 为伺服系统供电。

软件安装

I2c工具

连接屏蔽后,我们需要确保硬件已被识别。为此,我们需要安装i2ctools 包通过 SSH 连接到您的开发板并安装软件包

sudo apt install i2c-tools

为了允许我们的用户在不使用 sudo 的情况下访问 i2c-dev hw,我们需要添加一个自定义规则。我们首先创建一个自定义规则文件

sudo touch /etc/udev/rules.d/50-i2c.rules

然后使用 nano 编辑器编辑文件:

sudo nano /etc/udev/rules.d/50-i2c.rules

并确保内容如下

SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660"

现在我们将用户添加到“i2c”组并设置权限:

sudo adduser ebv i2c
sudo chmod g+rw /dev/i2c-*
sudo reboot

重新启动板后,通过 ssh 连接到它并检查是否检测到屏蔽。跑:

sudo i2cdetect -y 1

i2cdetect 的输出(对于 /dev/i2c-dev-1)应如下所示:

poYBAGOX-XmAWQt8AAA3If9Chc8496.png
 

Python 库

要将设备与 Python 一起使用,我们需要安装一些库。

sudo apt install git build-essential python-dev

Adafruit 库

要使用 Python 控制 GPIO 和 PWM,我们需要直接从 GitHub 下载 Adafruit 的三个库。创建一个工作文件夹并将库拉入其中。

cd ~/
mkdir example
cd example
git clone https://github.com/adafruit/Adafruit_Python_PureIO.git
git clone https://github.com/adafruit/Adafruit_Python_GPIO.git
git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git

安装树,以便您可以检查目录:

sudo apt install tree

现在打印目录树:

tree -d

示例目录的树应如下所示:

pYYBAGOX-XuAJjOfAAAltaYnsWs034.png
 

需要修改 Adafruit 库才能在 MaaxBoard 上运行。幸运的是,这只是一个小改动。像这样创建“测试”文件夹:

cd ~/
cd example
mkdir test
cd test

创建我们将用于我们的简单测试 Python 应用程序的实际 Python 库的符号链接:

ln -s ../Adafruit_Python_GPIO/Adafruit_GPIO/ .
ln -s ../Adafruit_Python_PureIO/Adafruit_PureIO/ .
ln -s ../Adafruit_Python_PCA9685/Adafruit_PCA9685/ .

注意:我们也可以编译和安装这些库(系统范围安装),但是这样做允许我们直接修改代码并逐个使用它。

现在我们需要修改 GPIO 库的两个文件,以确保 MaaXBoard 被识别为 linux 系统(就像它是 RaspberryPi 一样)。

要修改的两个文件是I2C.pyPlatform.Py

使用 nano 打开 I2C.py:

cd Adafruit_GPIO
nano I2C.py

我们需要通过添加粗体的 elif 语句在 get_default_bus() (大约第 40 行)函数中添加一行:

elif plat == Platform.BEAGLEBONE_BLACK:

# Beaglebone Black has multiple I2C buses, default to 1 (P9_19 and P9_20).

return 1

elif plat == Platform.MAAXBOARD:

return 1

对于 Platform.py,我们需要再添加一个定义来选择 MAAXBOARD。还是在 test/Adafruit_GPIO 目录下,在 nano 中打开 Platform.py:

nano Platform.py

在下面添加粗体行(第 24 行附近):

# Platform identification constants.

UNKNOWN = 0

RASPBERRY_PI = 1

BEAGLEBONE_BLACK = 2

MINNOWBOARD = 3

JETSON_NANO = 4

MAAXBOARD = 5

在 def platform_detect() 函数中,添加粗线:

...

# Handle Beaglebone Black

# TODO: Check the Beaglebone Black /proc/cpuinfo value instead of reading

# the platform.

plat = platform.platform()

print(plat)

if plat.lower().find('armv7l-with-debian') > -1:

return BEAGLEBONE_BLACK

...

elif plat.lower().find('tegra-aarch64-with-ubuntu') > -1:

return JETSON_NANO

elif plat.lower().find('aarch64-with-debian') > -1:

return MAAXBOARD

...

最终 Platform.py 应如下所示:

poYBAGOX-X2AGAowAACvw80DW9Y470.png
 

Python 应用程序

现在我们准备使用 Adafruit 提供的示例之一。由于 Python 代码的可移植性,这里不需要修改。我们将simpletest.py文件复制到我们的测试目录中:

cd example
cp Adafruit_Python_PCA9685/examples/simpletest.py test

执行测试文件。

cd example/test
python ./simpletest.py

如果一切正常,您的伺服电机将移动,直到您使用 CTRL-C 退出脚本。

注意:在本例中,我们控制的是 N.0 通道,因此请确保将您的伺服器连接到屏蔽位置零的编号接头。

结论

现在,您可以控制多个伺服电机,用于您的机械装配,例如云台变焦或电子动画或工业原型。当您计划在外部屏蔽上使用多个伺服时,请始终确保控制伺服类型和最大额定电流,最终添加一个专用于伺服屏蔽的特定电源。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用Python进行伺服PWM控制的MaaxBoard设置',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);