ruby和
串口通讯可以通过serialport这个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
串口通讯常用来采集数据,比如这篇文章中的LM35温度传感器,我们只需将写少量ruby代码,就可以将串口的数据保存到数据库供后续使用。你还可以在这篇文章的基础上加上DSM501A粉尘传感器之类的,用weibo api每天定时发布自己家的PM2.5,或者添加更多的湿度,压力等传感器,就是一个小型的个
人气象站了。
除了采集数据,接下去来看前一篇博客中提到的:
引用
将代码放在PC端运行,通过串口通讯写入和读取arduino上的各种输入输出口,这样的好处有2个:1复杂的控制代码(比如互联网,计算,数据库)可以不受限于arduino语言。 2方便快速调试,不需要编写,上传,烧入这样麻烦。
用一个蜂鸣器演奏乐曲来举例子,来看两只老虎的简谱:
如果直接upload代码,我们只需要反复调用tone函数就可以了,如需要演奏不同的乐曲,就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 则是针对Firmata这个通用协议的ruby实现。
通过ruby控制arduino除了唱两只老虎哄哄小孩,还能做很多实用或者有趣的事情,请等待下篇...
- 大小: 3.7 KB