Posts Tagged ‘Arduino’

Android wifi机器人视频传输接收端的实现

星期三, 五月 8th, 2013 323 views

本篇的开发基于已将S605摄像头挂载在Openwrt系统上,并且已通过网页测试访问 http://192.168.1.1:8080/?action=snapshot 摄像头视频数据流成功的基础上。
上述过程的实现,大家可以自行在论坛里查找相关资料。本篇重点讲述如何通过Android手机端实现网页端相同的视频接收功能。

首先我们需要了解到这是一个MJPEG图片视频流,是以发送逐帧的JPEG图片数据连贯起来的动画视频。Android端通过访问目标Openwrt系统上的指定服务器端口,获取这个图片流数据,并逐帧播放出来。了解此原理之后,我们的工作即可简化为在Android端创建一个socket长连接,并对目标服务器端口发送请求,并接受请求。因为数据的传输都是以字节流的形式的,所以基本传输原理与常用的socket传输方式无基本差别,主要在用字节流的解析过程,将其还原成JPEG格式的信号。

在Android的中对于视频的显示处理通常使用surfaceView这个类,继承该类实现一个自定义的surfaceView组件即可。
surfaceView有两种创建方式,一种是在Activity中正常New出来,另一种是在UI设计界面下拖拽出一个surfaceView控件,并在xml中强制转换为自定义的surfaceView类型。
下面说下这两种方式的实现区别与用途,第一种通常用于整个界面的跳转,并且new出来的surfaceView是不受UI设计界面控制的,因此无法控制其图层的顺序,并且与其他Layout控件并存等等。实现方式是直接new即可,在我们自定义的VideoSurfaceView类里,使用第一个构造函数:

1
2
3
4
public VideoSurfaceView(Context context)
{
    super(context);
}

(更多…)

Android触摸事件及触摸屏滑动在游戏视角中的应用

星期二, 四月 23rd, 2013 53 views

Android触摸事件是建立于Ontuch事件相应机制上的,首先我们需要为Activity窗体添加一个OnTouchListener,实现OnTouchListener接口即可

1
2
3
4
5
6
7
8
9
10
11
public class MainActivity extends Activity implements OnTouchListener {

Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
                button = (Button) findViewById(R.id.button1);
                button.setOnTouchListener(this);
    }
}

(更多…)

C++ for Arduino EventTimer(事件定时器)循环队列

星期六, 四月 20th, 2013 167 views

我们知道在Arduino中是没有线程这个概念的,如果需要同时按照时间间隔执行多个事件,使用系统自带的delay()进行阻塞势必会影响到后面的事件。例如在loop()中我们需要不间断的向电机发送脉冲信号使之行走,同时每间隔1s向控制端发送一次数据。如果采用delay(1000)的方法,电机则会每隔1s才获得一次脉冲信号,这不是我们想要的。所以,我们需要为此自定义一个事件定时器。

事件定时器类的C++代码如下:
EventTimer.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma once
#include "Arduino.h"
typedef void (*LPFUNC)();//typedef定义一个函数指针
class EventTimer
{
public:
    EventTimer(void);
    ~EventTimer(void);
    void Init();//初始化
    void Looper();//事件循环
    void AddEvent(LPFUNC fun,int delay,int repeat);//添加一个事件
   
private:
        /*事件结构体*/
    struct EventNode{
        LPFUNC fun;//事件函数体
        int delay;//执行延时
        int repeat;//执行次数
        int lasttime;//上一个时间
        EventNode * next,* prior;//上一级、下一级指针

    };
    EventNode *head;
    EventNode *tail;
};

(更多…)

Arduino机器人开发指南(七)电机驱动篇

星期二, 四月 2nd, 2013 229 views

之前我们研究了如何用Arduino驱动舵机,本次我们将一起探究一下如何用Arduino驱动直流电机。Arduino本事是无法对直流电机进行控制的,需要通过一块电机驱动板来控制电机的正转反转。这里我们选择的是L298驱动板,当然也有其他同类驱动板或者扩展板可供选择。如图,L298:

这块板子可以驱动两路电机,电机线已经接在板子的motora上了,motora中间的是外接电源的输出口,这里接在电池盒上。
简单介绍下黄色部分的8个引脚:

ENA 电机A模拟值输出端,用来控制电机的转速
IN1 为电机A提供电流,控制正反转
IN2 为电机A提供电流,控制正反转

ENB 电机B模拟值输出端,用来控制电机的转速
IN3 为电机B提供电流,控制正反转
IN4 为电机B提供电流,控制正反转

GND 接地
+5V 正极
(更多…)

Arduino机器人开发指南(六)wifi通信篇

星期六, 三月 30th, 2013 1,021 views

这里的wifi模块即之前已经采购的TP-LINK wr703n无线路由器。
在使用之前,我们需要对路由器进行改装,主要硬件工作如图

引出TTL的RX线及TX线,这里将其连接到了miniUSB口上了。自制一根miniUSB排线,另外加天线及扩展内存、闪存(这个属于非必须工作,扩展后性能会有一个提升)

软件方面的工作是刷路由系统为openwrt,安装ser2net(串口命令转发,tcp向ttl转发,感兴趣的朋友可以去看看源码 )及摄像头支持组件(mjpg-streamer 如果不用到摄像头也可以不装)

这些在论坛上有详细的资料和方法(需要注意,刷机风险很大,容易变砖),或者可以直接购买改装路由,改装路由是已经刷好系统并安装好组件的。
详细过程不在本篇的介绍范围,有机会的话,后续会开篇。

测试前,首先在Arduino上烧入一个串口监听程序,由于有了LCD模块,所以一并用上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "Wire.h"
#include "LiquidCrystal.h"
String incomingStr;
LiquidCrystal lcd(0);

void setup() {

    Serial.begin(9600);
    lcd.begin(16, 2);
    lcd.setBacklight(HIGH);

}

void loop() {

    if (Serial.available() > 0) {

        lcd.setCursor(0, 0);
        lcd.clear();

        while(Serial.available() > 0){
            incomingStr += char(Serial.read());
        }
        lcd.print(incomingStr);
        Serial.print("I received: ");
        Serial.println(incomingStr);
        incomingStr = "";
    }

}

此程序用于在LCD及监视端回显串口信息,大家可以根据自己的情况更改。
(更多…)

Arduino机器人开发指南(五)LCD篇

星期四, 三月 28th, 2013 172 views

LCD即我们常见的液晶显示屏,通过LCD我们可以有效并即时的获取Arduino的信息。本篇中选用的LCD为常见的1062字符型LCD,同时需要一块 IIC-LCD 转接板,如果没有的话也可以实现,连线稍微复杂一些。而通过转接版将能够节约4个端口。

在此篇中我们将用到IIC通信协议,在不同的Arduino主板上,IIC通信协议的端口略有不同:

Board I2C / TWI pins
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Due 20 (SDA), 21 (SCL), SDA1, SCL1

SLC为时钟信号,SDA为数据信号。转接板背面如图:

根据自己的arduino版本找到对应的SDA、SCL端口,DAT连接SDA,CLK连接SCL,注意DAT端口右侧的螺丝,是一个可调电位器,用于调整LCD显示,以显示出清晰的图片。

Mega加上传感器扩展板后的接线如图,红黑为正负,白线为数据线,棕线为时钟线

  (更多…)

Arduino机器人开发指南(四)舵机篇

星期三, 三月 27th, 2013 132 views

首先了解一下本篇所选用舵机的一些参数

这里我们注意两点即可:
无负载操作速度:0.1秒/60度(4.8V)
扭矩:1.6kg·cm(4.8V)
角速度为 0.1s/60°,那么在满载情况下旋转一周需要0.6s。
扭矩表示力矩大小,1.6kg·cm意为在使用1cm的杠杆时可以举起1.6kg的物体。

此舵机基本满足摄像头或超声波云台的旋转速度及动力,如果要做到反应更加迅捷灵敏,则需要更换更好的舵机。(此舵机市场价格为¥10上下)
关于舵机的运行原理,不在本篇的介绍范围,大家感兴趣可以自行百度。

舵机接线如同

(更多…)

Arduino机器人开发指南(三)超声波传感器篇

星期二, 三月 26th, 2013 199 views

首先认识一下两个新的模块

如图,左边的是传感器扩展版,这里选择的是 Electronic Brick Shield 系列,另一个是超声波发射接收装置。

传感器扩展版将Arduino复杂的传感器线路连接进行了规整,类似于一个线路整理器,我们可以看到在上面除去两个电阻之外就没有别的元件了,基本上都是引脚的归纳。同时,扩展版是支持完美插入Arduino板卡的,在后面的图片中可以看到。
(更多…)

Arduino机器人开发指南(二)串口篇

星期二, 三月 26th, 2013 200 views

本篇主要讲解一下Arduino的串口及其编程方法。

串口是Arduino与其他设备进行通信的接口,需要用到“Serial”系列函数。

一共有以下10个子函数(新版本加入了更多):
Serial.begin() //开启串口
Serial .end() //关闭串口
Serial .available() //判断串口缓冲器是否有数据装入
Serial .read() //读取串口数据
Serial .peek() //返回下一个字节(字符)输入数据,但不删除它
Serial .flush() //清空串口缓存
Serial .print() //写入字符串数据到串口
Serial .println() //写入字符串数据带换行到串口
Serial .write() //写入二进制数据到串口
Serial .SerialEvent() //read时触发的事件函数
Serial.readBytes(buffer, length) //读取固定长度的二进制流

先看例子吧

1
2
3
4
5
6
7
void setup() {                
    Serial.begin(9600);  
}

void loop() {
    Serial.println("BeiTown");
}

(更多…)

Arduino机器人开发指南(一)基础篇

星期六, 三月 23rd, 2013 115 views

首先是硬件部分的知识,关于Arduino开发板的相关资料及选择,开发者论坛上有很多,这里主要阐述一下整个软件编码部分的开发流程及技术难点。板子选择的是MEGA2560,如图:

黑白两根线分别为电源和数据线,黄灯为板载灯L,绿灯为Power。其他的串口后面用到的时候再说吧。

首先是搭建Arduino的开发环境。Arduino是基于C语言开发的,在VS及Eclipse上均有插件,不过设置略显麻烦。简单起见,选择官方自己的IDE吧(下载地址)
(更多…)