树莓派论坛

 找回密码
 立即注册

遥控小车阶实现【新增实现细节 2月18日更新】

jlinux 发表于 2013-2-11 23:11:57 | 显示全部楼层 |阅读模式
PS:其实非常简单
看朋友希望我增加一些实现细节,这里整理一下:
屏幕快照 2013-02-18 下午9.45.30.png
请看上面的图形(想看更清楚的,请下载附件)

首先列一下我用到的硬件 和 编程框架(语言、框架、协议):
1.电动小车+步进电机驱动板+4个步进电机,整个是比较标准的智能小车配件,小车配件一般自带步进电机
   步进电机驱动板的工作原理是:驱动板连接步进点击,而树莓Pi或者Arduino连接到驱动板,发送信号给驱动板,由驱动板控制步进电机。具体可以看这篇文章

2.树莓Pi,这个就不说了,需要注意的是
   树莓Pi的GPIO口说明,我在网上找了几篇文章都没有说对,最后还是官网是对的,具体请看这里

3.用的语言、控制框架和协议
   语言我自己用的是Ruby,比较小众,但是已经有很多公共的开源框架可以使用了; 用于控制树莓Pi GPIO框架用于搭建WebSocket的框架
   
    树莓Pi核心为Linux,让我这个网站IT民工很开心,因为有很多我熟悉的解决方案可用。通过在树莓Pi上搭建WebSocket Server,我可以通过web socket连接,直接发送命令。 以下是代码片段,其中Car是我自己定义的小车类,:ea=>18 这些是指定 点击驱动板上的接口对应的GPIO口。
  1. car = Car.new(:ea=>18,:i2=>15,:i1=>14,:eb=>4,:i4=>3,:i3=>2)

  2. EM.run {
  3.   EM::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws|
  4.     ws.onopen { |handshake|
  5.       puts "WebSocket connection open"

  6.       # Access properties on the EM::WebSocket::Handshake object, e.g.
  7.       # path, query_string, origin, headers

  8.       # Publish message to the client
  9.       ws.send "Welcome,the client has successful connected."
  10.     }

  11.     ws.onclose {
  12.         car.stop
  13.         puts "Connection closed" }

  14.     ws.onmessage { |msg|
  15.       case msg
  16.         when "go"
  17.          car.goahead
  18.         when "right"
  19.          car.goright
  20.         when "left"
  21.          car.goleft
  22.         when "back"
  23.          car.goback
  24.         else
  25.          car.stop
  26.         end

  27.       puts "Recieved message: #{msg}"
  28.       ws.send "server: #{msg} recieved!"
  29.     }
  30.   end
  31. }
复制代码
Android手机上,我开发了一个APK(Java语言),实现了控制界面,通过Web Socket,把控制信息传递给树莓PI的WebSocket Server。 其连接代码如下:
  1. private void connectTo(){
  2.         webClient = new WebSocketClient(URI.create(wsAddress), new WebSocketClient.Listener() {
  3.             @Override
  4.             public void onConnect() {
  5.                 Log.d(TAG, "Connected!");
  6.                 MainActivity.this.runOnUiThread(new Runnable() {
  7.                     @Override
  8.                     public void run() {
  9.                         connectButton.setText(R.string.disconnect);
  10.                     }
  11.                 });
  12.             }

  13.             @Override
  14.             public void onMessage(String message) {
  15.                 log(message);
  16.                 Log.d(TAG, String.format("Got string message! %s", message));
  17.             }

  18.             @Override
  19.             public void onMessage(byte[] data) {
  20.                 Log.d(TAG, data.toString());
  21.             }

  22.             @Override
  23.             public void onDisconnect(int code, String reason) {
  24.                 Log.d(TAG, String.format("Disconnected! Code: %d Reason: %s", code, reason));
  25.                 MainActivity.this.runOnUiThread(new Runnable() {
  26.                     @Override
  27.                     public void run() {
  28.                         connectButton.setText(R.string.connect);
  29.                     }
  30.                 });
  31.             }

  32.             @Override
  33.             public void onError(final Exception error) {
  34.                 Log.e(TAG, "Error!", error);
  35.                 MainActivity.this.runOnUiThread(new Runnable() {
  36.                     @Override
  37.                     public void run() {
  38.                         if(webClient!=null){
  39.                             webClient = null;
  40.                         }
  41.                         connectButton.setText(R.string.connect);
  42.                         log("Error:"+error.getMessage());
  43.                     }
  44.                 });
  45.             }
  46.         }, null);
  47.         webClient.connect();
  48.     }
复制代码
至于Android手机的重力感应,这个其实只是Android手机本身的特性,通过判断重力感应变化,发送的不同的命令,只是实现控制的手段。

4.电源部分
   电源我使用的是华美电源,有两个口,一个1A给树莓Pi供电,一个2.1A刚好给步进电机供电(驱动板有两条电路,一个是做逻辑供电,一个是给步进电机供电,步进电机需要的电流要大)。
   2.1A给步进电机供电,我是把一条废弃的USB线间断,把其中用于供电的正负极接到了步进电机驱动板上。

差不多就是这样,大家如何有问题,可以再问我,需要代码也可以。

最后给一下我最新的Android控制界面,已经开始添加视频相关了
device-2013-02-18-125135.png

-------------------  2013-2-12 08:42 之前的内容 -------------------------
趁着春节,完成了远程通过树莓Pi控制小车的

硬件:
1.小车、减速点击、驱动控制板都是用我的以前玩Arduino时买的,这在淘宝搜索robotbase这家店就可以了
2.树莓Pi不说了
3.移动电源用的是@ukonline2000 推荐的华美
4.USB无线网卡用的是:TP-LINK tplink TL-WN725N,推荐,但性能不好,还是小的原因
软件部分
1.服务器端用的是Ruby+em-websocket+pi_piper(GPIO)
2.客户端:Android手机或者网页客户端,通信我选择Websocket的原因就是期望通用,本来不打算自己开发Android App的,但是手机上的网页Button按钮长按事件效果 和Web端不一样,所以自己开发一个Android APP,还好不用美化界面,功能也单一,开发速度也很快,因为做了Android App,所以随便测试了重力感应,还是蛮好玩的

实现效果视频看这里(不包括重力感应的效果)

http://you.video.sina.com.cn/api ... JU2cv4i3xwoaA/s.swf

手机客户端界面可以看这里

device-2013-02-11-225529.png



笔记本 3.pdf

429.61 KB, 下载次数: 139

设计图

树老大 发表于 2013-2-12 19:27:04 | 显示全部楼层
支持一个。
无华0871 发表于 2013-2-15 00:14:27 | 显示全部楼层
支持一个  谢谢楼主分享!!
lookyou123 发表于 2013-2-16 21:21:59 | 显示全部楼层
顶一个  想要求资料 学习一下
diyisoft 发表于 2013-2-17 21:50:39 | 显示全部楼层
能详细分享一下吗
~紫倉~ 发表于 2013-3-4 00:45:20 来自手机 | 显示全部楼层
能详细点就更好了
yzevan 发表于 2013-3-20 16:48:04 | 显示全部楼层
很详细,感谢分享!
铁一学子 发表于 2013-3-21 18:32:43 | 显示全部楼层

支持一个
1234 发表于 2013-7-30 15:34:20 | 显示全部楼层
大大~
是否可以详细说明
树莓端的WebSocket和手机端的控制界面
的资讯呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版 | Archiver | 树莓派论坛 ( 粤ICP备15075382号-1 )