ruby arduino hacking - 串口通讯

ruby和串口通讯可以通过[url=http://ruby-serialport.rubyforge.org/]serialport[/url]这个gem来实现,这个gem的用法很简单,先来看一个简单的串口输入输出例子:


require 'rubygems'
require 'serialport'

sp = SerialPort.new "/dev/ttyUSB0", 9600
sp.write "abcd"


2行代码,代表用9600的波特率连接/dev/ttyUSB0串口设备,往串口输入abcd

然后我们upload如下的代码,将串口接收到的数据通过串口输出:

int b = 0;

void setup() {
Serial.begin(9600);
}

void loop() {
if (Serial.available() > 0) {
b = Serial.read();

Serial.print("I received: ");
Serial.println(b, DEC);
}
}


我们可以通过arduino IDE的Serial Monitor来看到运行的结果,当然也可以再用serialport这个gem:

require 'rubygems'
require 'serialport'

sp = SerialPort.new "/dev/ttyUSB0", 9600
while r = sp.readlines
puts r
sleep 1
end


串口通讯常用来采集数据,比如这篇文章中的[url=http://www.danielandrade.net/2008/07/05/temperature-sensor-arduino/]LM35温度传感器[/url],我们只需将写少量ruby代码,就可以将串口的数据保存到数据库供后续使用。你还可以在这篇文章的基础上加上DSM501A粉尘传感器之类的,用weibo api每天定时发布自己家的PM2.5,或者添加更多的湿度,压力等传感器,就是一个小型的个人气象站了。


除了采集数据,接下去来看前一篇博客中提到的:
[quote]
将代码放在PC端运行,通过串口通讯写入和读取arduino上的各种输入输出口,这样的好处有2个:1复杂的控制代码(比如互联网,计算,数据库)可以不受限于arduino语言。 2方便快速调试,不需要编写,上传,烧入这样麻烦。
[/quote]

用一个蜂鸣器演奏乐曲来举例子,来看两只老虎的简谱:

[img]http://dl.iteye.com/upload/attachment/0074/6591/84ab8c38-f361-39d2-aa14-eeed902acb9b.png[/img]

如果直接upload代码,我们只需要反复调用[url=http://arduino.cc/en/Reference/Tone]tone[/url]函数就可以了,如需要演奏不同的乐曲,就upload不同的代码,这就是烧入一次,执行一次。
我们可以通过串口通讯和自定义协议,来实现演奏不同的乐曲。以上面的简谱为例子,我们定义数字1~7分别对应简谱的1~7,定义‘*’为1拍,‘-’为2拍,‘_’为1/2拍,‘.’为1又1/2拍。arduino代码如下:

#include "pitches.h"
int pitches[] = {
NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4
};
char c;

void setup() {
Serial.begin(9600);
pinMode(8, OUTPUT);
}

void loop() {
if (Serial.available() > 0) {
c = Serial.read();
if (c == '-') {
delay(1600);
} else if (c == '.') {
delay(600);
} else if (c == '*') {
delay(400);
} else if (c == '_') {
delay(200);
} else if (c == '0') {
noTone(8);
} else {
tone(8, pitches[c - '0']);
}
}
}


ruby代码如下:

require 'rubygems'
require 'serialport'

sp = SerialPort.new "/dev/ttyUSB0", 9600
string = "12311231345-345-5.6_5.4_315.6_5.4_31151-151-0"
string.scan(/\d[_|\-|\.]?/) do |i|
sp.write i.ljust(2, '*')
end

需要说明的是,因为不想在每个1拍的音符后面都加个*,所以代码多了2行,否则就是很简单的一个each block中依次串口输出就可以了。
我们如果需要换个歌曲,就将string的内容更换,重新执行一次即可,这样就实现了一次烧入,多次运行的效果。

在上面这个例子中,我们自定义了一个tone的协议,实际中用到最多的是digitalWrite/Read和analogWrite/Read,所以只要针对他们做一个简单协议,就能很方便地控制,https://github.com/HashNuke/arduino 就是这样的一个项目。而 https://github.com/chrismetcalf/ruby-firmata 则是针对[url=http://firmata.org/wiki/Main_Page]Firmata[/url]这个通用协议的ruby实现。

通过ruby控制arduino除了唱两只老虎哄哄小孩,还能做很多实用或者有趣的事情,请等待下篇...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值