ruby arduino hacking - 串口通讯

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方便快速调试,不需要编写,上传,烧入这样麻烦。


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

ruby arduino hacking - 串口通讯_第1张图片

如果直接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除了唱两只老虎哄哄小孩,还能做很多实用或者有趣的事情,请等待下篇...

你可能感兴趣的:(Ruby,arduino)