Ruby Ruby 写 Arduino 不靠谱!

hlxwell · 2013年08月06日 · 最后由 hlxwell 回复于 2013年08月08日 · 5657 次阅读

玩了几天 Arduino,本来想做一个基于 wifi 能够收集数据在家里,然后能够通过远程控制家里的空调或者什么设备打开。只是玩玩而已。

一开始我用 c 去写的,因为全部例子都是 c 的代码。因为淘宝上买的 wifi shield 大部分都是用 https://github.com/asynclabs/WiShield 作为驱动的。所以你必须下载这个驱动。然后有时候还编译不通过,你得根据网上的教程吧源代码里的东西改改。

后来当用 c 完成例子之后就想用 ruby 去试验一下,后来发现只有 RAD 这个 gem 才能够把程序烧录到 arduino 上,其他的都是烧一个程序上去先,然后通过串口或者网络实时跟电脑连接然后传输数据,代码虽然是 ruby 但是不能把 ruby 代码上传上去。

当我要把 wifi 模块的代码改写成 ruby 的时候,我发现问题来了。很多 c 代码我都不知道怎么转,文档奇缺,也没有很多人用,比如 wifi 模块通过一些外部变量去设置 ip 地址:

extern U8 local_ip[];

我都不知道怎么去用 ruby 去定义这个

unsigned char local_ip[] = {192,168,1,2};

然后又能被驱动读懂。

有个方法似乎是写 ArduinoPlugin,这个是什么东西呢?

class YourPlugin < ArduinoPlugin
  >>>> ALL IS **** C CODE <<<<<
end

其实很多时候你做一些简单的教程上的例子还好,可能 ruby 刚好有写好的 plugin 或者模块,直接调用就可以了。否则如果你要写一些自定义的东西,绝对不靠谱

最重要的是 Arduino 的 c,不是我们想想的那么难的 c,其实是非常非常简单的 c。 这里有了所有的 arduino api,包括字符串操作的也有,也麻烦不到哪里去,关键是有教程,有很多人用出了问题找到到原因。 http://arduino.cc/en/Reference/HomePage

推荐一款免费 arduino 开发帮助应用

https://itunes.apple.com/cn/app/arduino-companion/id501635254?l=en&mt=8

用合适的工具做合适的事情,不能手里拿这锤子,看什么都是钉子。

前面在树莓派上面用 ruby,用来代替 u 盘加 pc,测试运行还不错。arduino 还没时间玩。

身边朋友老建议偶,这些常规需求用 c 写挺容易的,一直让我用 c。

#2 楼 @hlxwell 个人认为直接用官方的 Arduino IDE 写 C 挺省心的。没必要用 Ruby,人为又加一层和官方文档的距离。

@hlxwell try this one http://artoo.io/

前段时间看到的,很新的项目

RAD 是一个将 ruby 代码编译成 C 代码的编译器 https://github.com/atduskgreg/rad。例子在这里:https://github.com/atduskgreg/rad/tree/master/lib/examples。实现得好的话,C 能做的它也能做,不能做的就嵌入 C(像那个 plugin 那样)。

unsigned char local_ip[] = {192,168,1,2};

[192,168,1,2].map{|x| x.chr}.join.unpack('L')[0]

L | Integer | 32-bit unsigned, native endian (uint32_t) http://ruby-doc.org/core-2.0/String.html#method-i-unpack

#7 楼 @sevk L | Integer | 32-bit unsigned, native endian (uint32_t) 是什么意思? 你怎么再赋值给 c 代码写的驱动?

#6 楼 @reus 既然你不能避免写 c,干嘛要写 ruby?

#4 楼 @reyesyang 做测试嘛。大家都说 ruby 可以写,你不试一下怎么知道他不好用呢。

#9 楼 @hlxwell

unsigned char local_ip[] 这个赋值回去应该是: local_ip = [192,168,1,2].map{|x| x.chr}.join

[192,168,1,2].map{|x| x.chr}.join 这个得到的是 char[4] , 可以赋值给 local_ip

#10 楼 @hlxwell 如果 20% c+ 80% ruby 还是可以接受的。不过倒是两个语言都要理解。

unsigned char local_ip[] = {192,168,1,2};

这个可以直接在 ruby 中

local_ip = "\xC0\xA8\x1\x2"

这种只是一个包装,你可以按 ruby 语法写。

class YourPlugin < ArduinoPlugin
  >>>> ALL IS **** C CODE <<<<<
end

用 firmata,可以让 ruby 代码运行在 PC 或者 mini pc 控制 Arduino,实现烧入一次,运行多次。

https://github.com/shokai/arduino_firmata

不知道用 arduino 做这个需要哪些模块啊,楼主能详细介绍下吗?

#15 楼 @otinn 最好买 ethernet 模块不要买 wifi,然后 arduino mega(如果要添加很多 sensor + LCD + ethernet,你的接口肯定不够的,需要这个 mega),再加上一个扩展版,方便添加组件。 sensor 大概是:红外线接受和发送头,温度适度感应器 DHT11 就差不多了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号