使用Arduino读取motor encoder马达编码器

实验室的巨型马达需要维修,上面的光学编码器好像也坏了。所以第一步是要学会编码器是什么玩意。

鄙人纯软件出身,我知道我写的这些在硬件人士眼中都是儿歌。。。

网上有很多资料可以查,magnetic encoder, optical encoder 等等。 工作方式都大同小异。当初导师骗我来说让我focus on machine learning & computer vision。 想一想现在我在学什么我就想笑。。。。

总而言之,树莓派读取编码器比较困难, 用arduino可行性比较高。而编码器本身都没有什么区别。基本4~5个针脚的比较多。 我在实验室地上捡到了2个惠普的HEDS-9100 编码器。盒子已经黄了,可能是打印机喷墨头用的吧我猜。。。。
HEDS-9100
HEDS-9100

网上搜了一堆资料,好像这款编码器还挺流行,很多厂家的资料都有详细的描述。5个针脚从左到右分别是ChB,5V,ChA,N/A,GND. 4号针脚意义不明,我也没有去较真。反正另外4个也够我用了。要注意的是很多编码器是带马达供电的,所以会有更多针脚。

连接本身也没有什么太多可说的,Arduino在硬件操作上比树莓派简单多了,也不需要模拟PWM。 除了编码器的供电接口接在arduino的5v和GND上,AB 两个channel接在arduino的ANALOG-IN的0和1上以读取其值。 另外我接了个喇叭在DIGITAL8 上给反馈。喇叭是从旁边的PC主板上拔下来的。。。。LOL 脑海中浮现出FALLOUT 4,我是快乐的破烂王。
Arduino
呃。。。。找不到合适的东西,就插了个吸管进去。。。。还挺fit…..

代码如下,转动encoder,喇叭会响。赋值那部分有点绕,我也没改,之前玩的时候写了别的没删干净见谅。

代码中的if判断句里面的值选择1000是我观察了它们大概的读数后估计着瞎写的,并没有什么特别意义。但是太敏感的话喇叭会一直响,隔壁的斯里兰卡大哥会不开心。

int pin=8;
int analogPin0 = 0;
int analogPin1 = 1;
int val0 = 0;
int val1 = 0;

void setup() {
// put your setup code here, to run once:
pinMode (pin, OUTPUT);
Serial.begin(9600);
}

void loop() {

if ((val0-analogRead(analogPin0) > 1000)||(val0-analogRead(analogPin0) < -1000))
{
digitalWrite (pin, HIGH);
delay(300);
digitalWrite (pin, LOW);
delay(300);
}
else if((val1-analogRead(analogPin1) > 1000)||(val1-analogRead(analogPin1) < -1000))
{
digitalWrite (pin, HIGH);
delay(300);
digitalWrite (pin, LOW);
delay(300);
}

val0 = analogRead(analogPin0);
val1 = analogRead(analogPin1);
Serial.println(val0, val1); // debug value
}

已经学会了读取惠普的小编码器,下一步是看看实验室机器人身上的编码器

E3

加载评论框需要翻墙