西西河

主题:发个小广告 linux, android 编程,电机控制 -- 雷达

共:💬19 🌺73 新:
全看树展主题 · 分页 下页
家园 发个小广告 linux, android 编程,电机控制

河里有没有了解 “raspberry pi” 下编程的河友。

手上有个小项目,需要用“raspberry pi”控制一种电机。

具体到“raspberry pi”这边,需要在 linux 或者 android 下做个程序,通过usb 口控制电机,包括发送不同驱动命令以及接收显示状态。

有兴趣的河友请私信我。

确定下来以后,启动前我这边会先付部分预付款,所以不用担心我骗你。

你那边,需要是一个实体公司,最好有一定研发经历,可以提供资质证明,也要比较靠谱才好。

如有电机控制方面经验的也可以联系一下。基本上是需要研制一种直流线性电机控制器,需要有usb通讯能力,可以控制电机进、退、停动作,并且可检测若干控制电平。这个我这边基本可以搞定,担心后续其他项目忙不过来时可以外包一下。

关键词(Tags): #linux android 电机
家园 问一下,需要进行闭环控制吗?

如果是简单的前进,后退,通过gpio控制h桥就行了。如果是闭环控制,电流环的话比较复杂

家园 友情帮顶一下

玩过raspberry pi,写过闭环控制电机的程序,可是没在raspberry pi上写过电机控制....

现在改方向了,平时都用python啥的,所以帮不上忙了。但还是帮顶一下~

家园 libusb不难上手 自己研究一下 简单的通讯命令应该不
家园 我这边有Linux高手和步进电机控制的经验。
家园 谈谈我的方案

我之前在RPi上做过类似的东西,用来控制一个实验用的自动化平台,涉及步进电机和伺服电机的控制。这个是内部使用,代码不能公开,但是估摸设计的思路对你还是有帮助的。

首先我没用USB来控制。我个人的经验是USB在工控环境下可靠性太差。涉及USB的板载设计及布线要求深厚的经验,否则在有干扰的环境中经常性地随机丢连接。我自己缺乏这样的经验,在实际工作中我也发现过很多市售的组件设计不良,所以我能避开USB就避开USB。还有一个很重要地原因是很难或者不可能在USB上实现实时控制,因为这要求自行编写USB host controller的驱动,否则其他USB设备的中断请求会破坏程序实时性的保证。不过后一个原因不是主要原因,因为在我们的项目中PC发给RPi的命令并不要求实时,RPi控制电机的操作才是实时的。我是用以太网连接PC和RPi,然后RPi通过SPI和串口控制电机控制电路。

然后是控制程序。我选择LinuxCNC(EMC2)作为基础。这里我强烈推荐LinuxCNC,首先它实现了闭环控制的算法,我不需要从头写这一部分。然后就是它的一堆优点:开源,很容易移植到RPi上;有一堆模块,例如G-code的解码和多种图形控制界面;它也有一个良好的设计框架,实时部分和非实时部分有清晰的划分。基于LinuxCNC我只需要编写控制电机控制板的模块。

然后是电机控制。如果要求不高用RPi做软实时就行。网上很容易搜到为RPi编译Xenomai内核的教程。我为了省事,每一个电机用一块ARM单片机做硬实时,RPi通过SPI和ARM单片机通讯。然后RPi上跑一个控制界面,可以让用户通过web,或者通过telnet,控制自动化平台的运行。

通宝推:jent,
家园 多谢。很好的建议

我正在考虑用哪一种接口,我最熟的RS-232但现在很多机器不支持了。usb是客户要求的,但我可以考虑说服他们换网口。

那么请问用网口有没有什么不利的方面呢?

家园 几种接口的个人看法

因为工作的原因几种常见的接口我都用过,这是我个人的一些看法:

1. 首先我在之前的回帖中少写了一个不推荐USB的原因,就是USB和RS-232一样,要求上位机和下位机共地。虽然从理论上讲这个是能办到而且很容易办到的,但是实际操作中总有很多缺陷或者疏忽存在。电机这样的感性负载启动时有一个很大的电流,如果哪里接地不良会烧上位机。不久前我用一个笔记本接USB串口线调试一个泵,一合闸啪的一下笔记本就黑了,然后就永久地挂了。在这个电机一侧有一个光耦做隔离,这个光耦没问题,USB串口线也没事,应该就是唯一直接相连的公共地线上的冲击传到笔记本上。如果总线是浮动的,用光耦做隔离就不会出现这个问题。所以在这里推荐RS485、CAN或者是Ethernet来规避这个问题。

2. 第二个问题就是编程的方便程度。一个是单片机上的支持,另一个是PC端的驱动/程序库的支持。显然RS232/RS485对两边而言都是最简单的,Ethernet的话PC端很简单,单片机上则要求有网络栈,现在好的单片机这点上都没问题,但是需要谨慎一些,有些网络栈的实现有小bug,毕竟网络协议在实际中的运作还是有点复杂的,还有一些没有实现一些功能,比如DHCP有可能都不支持。更好的板子,如RPi,上面跑的是嵌入式linux,和普通linux一样。USB的话对两边都很麻烦,而且有平台移植的问题。下面有河友提到libusb,这个在windows上勉强可用,在mac上是完全不可用,不是找不到设备就是无法获得设备的控制权。为此我报告过,得到libusb的开发者的回复是他们没有mac系统来调试libusb,所以一段时间内其mac支持都不会有进展。

3. 一个硬性指标是带宽或者波特率。串口的波特率一般到115200,再高不是不可能,但是PC端和板子都要动脑筋,不划算。如果这个速度够用,那就用串口,如果不够用再上USB或Ethernet。对PC端可以用USB转串口或者Ethernet转串口的转换器,下位机保持使用串口。这两种转换器我测试过很多厂商的产品,很多不能长时间稳定工作。最后认定还是一分价钱一分货,前者选Keyspan的USA-19HS或USA-49WG,后者选Digi的Connect SP系列。

4. 还有就是设备的分布。USB、RS232串口基本上都要求控制的PC和设备不能距离太远。RS485、CAN和Ethernet都可以有几十米的距离,大大放宽了设计上的限制。而且USB和RS232基本上都是一台机器控制一台设备,RS485、CAN和Ethernet可以一台机器控制多个设备。Ethernet还可以升级成无线网络的。

5. 我做的东西一向对成本不敏感,哪个好用用哪个,所以对这些方案之间的成本差异没感觉。唯一有感觉的就是CAN,我们买一个PC上CAN的适配器要1000多美元,要不是买来的设备是CAN的我们是绝对不会选CAN的。

元宝推荐:铁手, 通宝推:哼哼哼,shinji,bayerno,jent,雷达,
家园 用LINUX/EPICS嵌入式系统

使用ARM+Linux/EPICS嵌入式系统,可控制步进/伺服

很方便把这些系统组网,在OPI就能控制上百个、乃至上千个电机

家园

送花赞扬 关闭

送花成功。恭喜:你意外获得 8 铢钱。1通宝=16铢

作者,声望:1;铢钱:0。你,乐善:1;铢钱:7。本帖花:1

家园 嘿嘿,果然没人了解啊

楼主礼貌送花

EPICS在工业上用的太少了

知道的人不多

和Linux一样是开源的

做好驱动之后

控制一个电机就只需要向一个通道写入数据

每个通道一个IP

这样可以用以太网组成一个庞大的系统

家园 刚看到也有人用EPICS

这个本来是设计给加速器之类的科学设备的,工控的标准和这个还是不一样的,估计这个是没有人考虑这个系统的原因吧.工控还是PLC或者VME主导的吧?

不过现在也有新的设备提供EPICS的接口的了,只是还是少数派.基本上短距离还是GPIB/RS232之类的吧?

家园 我不做,但转张实现的帖子给你

英文原文

几周之前,我展示了最近为父亲做的一个项目:Remotely controlling IR/RF devices with an Arduino,他却抱怨道我还没有为他开发一个可远程控制得灌溉系统。我们有几英亩地需要灌溉,以前是通过中央水泵加管道的方式灌溉,现在他需要远程控制水泵。

他告诉我他需要一个允许他向一个手机号打电话或者发短信以控制远程的水泵开始或者关闭,以及如果灌溉系统出现问题,系统会发送短息并及时关闭水泵。

灌溉线缆

以前灌溉就是大量线轴连接到水泵上,但是仍然会存在一些问题,比如缺电、管道连接不正确或管道需要加压等。由于以上问题出现的突然性,一个及时提醒你并保存现场数据的系统是非常宝贵的, 即使你在事发12小时之后回到农场仍然会发现管道破损之前5分钟灌溉现场状况。

使用开源智能硬件方案:Arduino

Arduino非常适合这样的项目:低成本、只需要一个电源、没有系统会冻结/挂起、拥有众多的标准周边设备。通过互联网搜索到Arduino GSM模块,发现一个模块以及开发库只需要30美元,非常便宜。完整的系统成本大约50美元,和大多数其他系统成本700美元形成鲜明对照。

GSMLib很容易使用,我一找出哪些针脚能用到,哪些没用就开始动手去做。一个简短的例子,当一个认证的手机号发短息给你时,你需要做的就是:

1 stat = call.CallStatusWithAuth(number, 1, 3);if(stat == CALL_INCOM_VOICE_AUTH) {

2 call.HangUp();

3 sms.SendSMS(number, value_str);}

系统描述

最终的水泵控制系统是相当简单的。开始或者关闭的方法通过一个继电器或者两个继电器系统模拟开/关按钮实现。我想要的是两种方法都支持,这并不是很困难。

除了输出之外,也有输入。当系统启动并运行时,相应的继电器开启和关闭;当有一个错误时(断电、低压、高温),三个继电器可能会开启。我们的软件一 般需要发送短信,当系统开始和停止运行时(无论任何原因,无论你是否通过电话开启系统),当一个错误继电器触发时,一条带有具体错误原因的短信将发送。

我们也想要一种取消SMS发送的方法,与确保你不会得到无关紧要的信息,如果你手动开启/关闭系统,而你在水泵身旁(显而易见的是当你站在水泵旁边时,关闭水泵,压力消失,你不在需要接受短信)通过简单的选择输入可实现开启短息发送功能或者关闭。

当然也有一些次要的问题需要考虑,比如错误继电器和其他元件不相关联(当关闭电源后,所有其他的错误继电器将继续运行,所以你只需要发送“电力消失”信息),错误条件具体到错误(例如,关闭系统触发“压力下降”错误),但这都非常简单。

实现错误短信

实现错误短息的函数只需几行。初始时,我们检测继电器的状态是否改变(当一个错误继电器保持激活状态时,我们想要边缘触发以避免虚假循环。例如):

1 for (char i=0; i < INPUT_LENGTH; i++) {

2 pinState = digitalRead(inputPins[i]);

3 if (pinState != pinStates[i]) {

4 // If the pin's state changed, note it.

5 statesChanged[i] = 1;

6 }

7 // Update the state.

8 pinStates[i] = pinState;}

然后我们掌握了所有状态的改变以及新状态,决定接下来做什么就不难了:

01 // Decide what happens.if (statesChanged[0] == 1 && pinStates[0] == OFF) {

02 // Phase dropped, send message regardless.

03 sendSMS("Phase dropped.");} else if (statesChanged[1] == 1 && pinStates[1] == OFF) {

04 sendSMS("Thermal dropped.");} else if ((statesChanged[2] == 1 && pinStates[2] == OFF) &&

05 (statesChanged[3] == 1 && pinStates[3] == OFF)) {

06 // Pressure dropped *and operation stopped simultaneously*.

07 // This is because we don't want to be notified of normal

08 // pressure drops after we stop the system ourselves.

09 sendSMS("Pressure dropped.");} else if (statesChanged[3] == 1 && pinStates[3] == OFF) {

10 sendSMS("Pump shut down.");} else if (statesChanged[3] == 1 && pinStates[3] == ON) {

11 sendSMS("Pump started.");}

结束语

最终完成的系统是即插即用的。如果你想要使用它,并且像我一样拥有兼容好的错误继电器,你可以安装到 Arduino 并且运行它。

完整代码

家园 EPICS只是一个控制软件系统

也支持PLC,VME,只要这些设备有以太网接口

也能在末端使用232HUB支持多个232之类接口

家园 终于见到用Arduino的了

不清楚这东西实时的性能咋样,不过比Raspberry PI肯定要好

全看树展主题 · 分页 下页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河