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

四月 23rd, 2013 131 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);
    }
}

Read the rest of this entry »

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

四月 20th, 2013 578 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;
};

Read the rest of this entry »

Android 4.0 Socket调试工具制作过程及源码发布

四月 15th, 2013 1,274 views

首先是还是界面设计

分别是IP输入、Port输入、连接按钮、接受信息文本框、输入框、发送按钮。
界面设计好之后,为对应控件添加相应功能。
Read the rest of this entry »

Android 主线程、子线程间的通信问题

四月 14th, 2013 930 views

在Android中,子线程是不可以操作UI界面的,必须在主线程中操作,同时在主线程中也不能使用网络通信,必须在子线程中使用(4.0版本后的新特性)。所以Android中关于线程间的通信便显得相当重要。

这里需要使用Looper和Handler,利用Message进行基于消息队列的线程通信,简单介绍一下几个对象

Looper:管理当前线程的消息队列。
Handler: 向目标线程发送消息Handler.sendMessage(Message msg),处理消息队列中的消息Handler.handleMessage(Message msg);
Message:线程之间传递信息的载体,包含了对消息的描述和任意的数据对象。
Read the rest of this entry »

Android Socket TCP客户端简单实例

四月 10th, 2013 1,571 views

声明:本篇代码仅可用于android 4.0以下版本,4.0以后的版本中网络连接的代码不可在主线程运行。解决方法见后续几篇博客。

由于Android中可以使用java.io.*包和java.net.*包,所以此Demo的逻辑代码和JAVA版本的client没有区别,主要区别还是在于UI和一些接口函数上。
我们抛开UI从最基础的说起。

①建立连接:

先来看建立连接的核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainActivity extends Activity{
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        SocketAddress socketAddress = new InetSocketAddress("192.168.0.1", 2001);
        Socket socket = new Socket();  
       
        try {
            socket.connect(socketAddress,5000);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }      
    }
......
       
}

Read the rest of this entry »

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

四月 2nd, 2013 473 views

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

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

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

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

GND 接地
+5V 正极
Read the rest of this entry »

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

三月 30th, 2013 3,612 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及监视端回显串口信息,大家可以根据自己的情况更改。
Read the rest of this entry »

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

三月 28th, 2013 552 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加上传感器扩展板后的接线如图,红黑为正负,白线为数据线,棕线为时钟线

  Read the rest of this entry »

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

三月 27th, 2013 317 views

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

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

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

舵机接线如同

Read the rest of this entry »

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

三月 26th, 2013 400 views

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

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

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