|
PS:其实非常简单
看朋友希望我增加一些实现细节,这里整理一下:
请看上面的图形(想看更清楚的,请下载附件)
首先列一下我用到的硬件 和 编程框架(语言、框架、协议):
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口。- car = Car.new(:ea=>18,:i2=>15,:i1=>14,:eb=>4,:i4=>3,:i3=>2)
- EM.run {
- EM::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws|
- ws.onopen { |handshake|
- puts "WebSocket connection open"
- # Access properties on the EM::WebSocket::Handshake object, e.g.
- # path, query_string, origin, headers
- # Publish message to the client
- ws.send "Welcome,the client has successful connected."
- }
- ws.onclose {
- car.stop
- puts "Connection closed" }
- ws.onmessage { |msg|
- case msg
- when "go"
- car.goahead
- when "right"
- car.goright
- when "left"
- car.goleft
- when "back"
- car.goback
- else
- car.stop
- end
- puts "Recieved message: #{msg}"
- ws.send "server: #{msg} recieved!"
- }
- end
- }
复制代码 Android手机上,我开发了一个APK(Java语言),实现了控制界面,通过Web Socket,把控制信息传递给树莓PI的WebSocket Server。 其连接代码如下:- private void connectTo(){
- webClient = new WebSocketClient(URI.create(wsAddress), new WebSocketClient.Listener() {
- @Override
- public void onConnect() {
- Log.d(TAG, "Connected!");
- MainActivity.this.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- connectButton.setText(R.string.disconnect);
- }
- });
- }
- @Override
- public void onMessage(String message) {
- log(message);
- Log.d(TAG, String.format("Got string message! %s", message));
- }
- @Override
- public void onMessage(byte[] data) {
- Log.d(TAG, data.toString());
- }
- @Override
- public void onDisconnect(int code, String reason) {
- Log.d(TAG, String.format("Disconnected! Code: %d Reason: %s", code, reason));
- MainActivity.this.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- connectButton.setText(R.string.connect);
- }
- });
- }
- @Override
- public void onError(final Exception error) {
- Log.e(TAG, "Error!", error);
- MainActivity.this.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- if(webClient!=null){
- webClient = null;
- }
- connectButton.setText(R.string.connect);
- log("Error:"+error.getMessage());
- }
- });
- }
- }, null);
- webClient.connect();
- }
复制代码 至于Android手机的重力感应,这个其实只是Android手机本身的特性,通过判断重力感应变化,发送的不同的命令,只是实现控制的手段。
4.电源部分
电源我使用的是华美电源,有两个口,一个1A给树莓Pi供电,一个2.1A刚好给步进电机供电(驱动板有两条电路,一个是做逻辑供电,一个是给步进电机供电,步进电机需要的电流要大)。
2.1A给步进电机供电,我是把一条废弃的USB线间断,把其中用于供电的正负极接到了步进电机驱动板上。
差不多就是这样,大家如何有问题,可以再问我,需要代码也可以。
最后给一下我最新的Android控制界面,已经开始添加视频相关了
------------------- 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
手机客户端界面可以看这里
|
|