ruby arduino hacking - 串口通讯_Ruby_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > Ruby > ruby arduino hacking - 串口通讯

ruby arduino hacking - 串口通讯

 2013/7/10 4:37:02  QuakeWang  程序员俱乐部  我要评论(0)
  • 摘要:ruby和串口通讯可以通过serialport这个gem来实现,这个gem的用法很简单,先来看一个简单的串口输入输出例子:require'rubygems'require'serialport'sp=SerialPort.new"/dev/ttyUSB0",9600sp.write"abcd"2行代码,代表用9600的波特率连接/dev/ttyUSB0串口设备,往串口输入abcd然后我们upload如下的代码,将串口接收到的数据通过串口输出:intb=0;voidsetup(){Serial
  • 标签:Ruby 串口通讯
ruby和串口通讯可以通过serialport这个gem来实现,这个gem的用法很简单,先来看一个简单的串口输入输出例子

class="ruby" name="code">
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
  • 查看图片附件
发表评论
用户名: 匿名