Author Archives: heqichen

Food is the most important element in Chinese culture. Shanghai being one of the biggest city in China has its long traditional and broad selection of foods. We mixed Shanghai Sandwich and Littlebits to bring one of the most famous breakfast of Shanghai to life.

Shanghai Sandwich is the perfect breakfast in Shanghai! It is one of the most famous local dishes with long tradition and full of flavors. Our project uses littleBits to help to make a perfect Shanghai Sandwich.

Instructions

sketch01

sketch02

sketch03

sketch04

sketch05

sketch06

sketch07

  1. Step 1. Get all the ingredients and materials ready. See the illustration we had as the recipe for the Shanghai Sandwich.

...continue reading

1,917 total views, 2 views today

细细想来,为了这个东西上天已经折腾了一年的时间了,试了无数的方案,也受到了无数人的帮助。终于是上天了,下面就是整机的照片。样子有点丑,各位hold住。

img

这个飞行器是以上天为目标,所以机架什么都是最低成本制作。用两块钱买来的PVC管子加上一个捡来的饮用水桶就成了四轴的机架。

用了两块电池,kk飞控,四个新西达1000kv电机,四个新西达30A电调。下面是控制部分的特写。

img

严格意义上来说还不能称之为我自己的四轴飞行器,仍然用了现成的飞控板,我自己的飞控板还在继续研制中,估计还要等上一段时间了。呵呵。

下面是第一次飞行视频。


http://v.youku.com/v_show/id_XMzA0NDI3MjYw.html

1,689 total views, no views today

很长时间没折腾了,因为前段时间忙家里的事情、学校的事情,所以就耽搁了。昨天搞了一个通宵,搞定了今天上午的一个报告,下午就继续搞飞机了。

我们原定的目标就是通过Arduino来作为四轴飞行器的控制板,那么必然就需要用Arduino来控制四个电机的转速,其实就是多PWM输出。在去年我已经实现了单电机的输出,发现了不少问题。

首先,舵机的信号格式和我们用的电调的信号格式是相同的,一般来说,航模上的电调信号线接于接收器的三号通道上,但是,如果接在别的通道上也是能正常工作的,这也证明了他们之间信号是相同的。

但是,上次通过Arduino上的Servo库来控制电机时,发现Servo库输出的pwm宽度会超过电调接收的范围,从而导致电机无法启动。然而,通过遥控器遥控时就不存在这个问题。所以,我今天就首先对遥控器的pwm信号进行测量,然后对Arduino输出的pwm信号进行测量。然后计算出控制方式。注意:这里的pwm信号是通过Arudino上Servo库输出的pwm信号,它是脉冲宽度调制,不是Arduino默认的pwm,默认的pwm是通过占空比来模拟一个模拟量。

好了,不多说,上图。

首先,测试电池是否有能力带动两个电机同时稳定地工作,我用遥控器电路对他们进行了测试。先搭建了一个下图所示的电路,进行测试。

img


http://v.youku.com/v_show/id_XMjcwNzAxNzY0.html

然后就需要测量遥控器输出的脉冲宽度和Arduino输出的脉冲宽度,搭了下面这个电路。为此我还去买了能测占空比的ut10a,但是那个万用表实在不给力,根本没有办法量到数据。-_-b

这张图当中电调只是起到供电的作用,所以并没有连电机。

img

无奈,但是发现Arduino有pulseIn()这个函数,可以计算一个高电平或低电平持续时间,正好,把数据拿下了。

最高位:	1900us
最低位:	1100us

那么就碰到了另外一个问题,既然没有仪器来测量脉冲宽度,那如何去测量Arduino输出的PWM脉冲的宽度呢?我在万念俱灰的情况下,把两个Arduino上的数字端口连在了一起,就像下面图中的一样,看看是否能自己测量自己。

img

结果很出乎意料,居然得到数据了,真的很佩服Arduino写底层库的人,中断控制得如此完美:-)

img
img

可以看到,Servo库在输出0时,对应的脉冲宽度为522ms;而输出180时,对应的脉冲宽度为2373ms。远远大于遥控器输出的范围,所以导致一开始电调无法识别Arduino的pwm信号。这样经过简单的计算就可得出,电调的最低位应为56度,最高位应为133度。:-D

有了这个重要的数据,下面就可以用它来控制电机了。不过首先还是先让程序控制舵机,保证他能正常运行,呵呵。

img

测试通过之后,就上电机啦。通过控制板上的两个旋钮,其实就是可变电阻,来控制电机的速度。

img

上视频


http://v.youku.com/v_show/id_XMjcwNzA0MDAw.html

控制板特写

img

右边的电源模块特写,整个系统的动力电源和控制电源分为两路,控制电源由我自己做的手机电池包来提供.

img

电机特写,呵呵,山寨味道太浓了

img

最后,我测了下电机的电流,在两个电机空载,半油门的情况下,电流为4A左右。这两个电机都是经过风风雨雨的,什么坠机、落水都经历过,轴已经有点不正常了,所以也只是带大概估计一下。

img

下面就是测试程序

#include <Servo.h>

//Author:	HE Qichen
//Date:	2011-5-27
//Website:	http://heqichen.cn
//Email:	heqichen(a)gmail.com

#define inputPin1  A8
#define inputPin2  A9

#define motorPin1  5
#define motorPin2  6

Servo motor1;
Servo motor2;

void setup()
{
  motor1.attach(motorPin1);
  motor2.attach(motorPin2);
  motor1.write(motorSpeedTransfer(0));
  motor2.write(motorSpeedTransfer(0));
  Serial.begin(9600);
}

void loop()
{
  int input1, input2;
  int speed1, speed2;
  input1 = analogRead(inputPin1);
  input2 = analogRead(inputPin2);
  speed1 = motorSpeedTransfer(input1);
  speed2 = motorSpeedTransfer(input2);
  motor1.write(speed1);
  motor2.write(speed2);
  Serial.print("#1 value: ");
  Serial.print(speed1, DEC);
  Serial.print("    #2 value: ");
  Serial.println(speed2, DEC);

  delay(500);
}

int motorSpeedTransfer(int s)
{
  return (s/13 + 56);
}

2,399 total views, no views today

今天完成了遥控车的改造,这是自主控制的第一步。这辆车是在淘宝上买的,结构很简单,控制很简陋。方向就是将电机打死,这时候电流会非常大,而且对于将来的自主移动的精细控制带来不利因素。所以很早就想把它改成舵机控制的了,下面就是整个改造的过程。

这就是需要改造的部分。

photo

先将需要改造的部分画下来,便于设计框架结构。我不是机械出身的,所以就画个大概吧。

photo

结构图完成

photo

在图纸上设计新的结构

photo

根据设计切割材料

photo

最后完成的样子,由于是临时电路,也就没固定,看上去有点像垃圾车-_-b

photo

改造部分的特写

photo

再来一张

photo

这些只是机械部份,然后就是控制部份。由于舵机能够转动的角度范围到180度,而该车的转向轮仅能转动在30-40度之间。同时,自主移动机器人目标是在Arduino上面开发。所以我就一步到位,先用Arduino读取天地飞的pwm信号,然后经过转换,输出新的pwm信号给舵机,这样就不会因为卡住而损坏舵机了。

最后效果如下


http://v.youku.com/v_show/id_XMjYzOTc2NzA4.html

使用的程序非常简单,如下:


#include <Servo.h>

//Author:	HE Qichen
//Date:	2011-5-3
//Website:	http://heqichen.cn
//Email:	heqichen(a)gmail.com

Servo directionServo;

void setup()
{
  pinMode(2, INPUT);
  directionServo.attach(3);
  
}

void loop()
{
  int t, a;
  t = pulseIn(2, HIGH);
  a = map(t, 1000, 2000, 65, 115);
  directionServo.write(a);
  
  
}

1,420 total views, no views today

在四轴飞行器上除了要有陀螺仪外,还要有个重要的传感器就是重力传感器。由于它们各自的误差,若使用单一的传感器会造成严重的精读问题,使飞行器丧失稳定性。所以要用两个传感器进行相互矫正。

现在重力传感器应用非常广,目前iphone等智能手机上都有重力传感器,包括笔者的一台山寨手机上都有重力传感器。

这次就是要用Android来读取重力传感器的数据。这个重力传感器模块是从淘宝购买的,模块非常简单,自己够买芯片来焊接也不成问题。根据它的datasheet,就能够知道如何使用这款重力加速度模块了。下面就进行详细的介绍

这个模块使用的芯片型号是MMA7260Q,(datasheet下载[PDF,229KB]),测试中的电路就是下面图片中的样子

photo

控制的目标是通过重力传感器的数据来控制舵机的转动。但是发现会有少量的抖动,于是在程序中加入了一个简单的滤波器,阶数没有仔细调,但是基本上能够进行控制了。


http://v.youku.com/v_show/id_XMjYzNjIyODIw.html

下面是芯片的特写

photo
photo
...continue reading

1,304 total views, 1 views today

今天拿到了四轴飞行器的一个重要部件,就是陀螺仪。^_^ 下面这张图上的就是了,这是一个三轴陀螺仪,seeedstudio GROVE套装的一个部件。

gyro

这个陀螺仪使用ITG3200芯片,可以直接使用了I2C接口连接到Arduino上面。默认的地址是0x68,但是可以修改成0x69,只要将板子上的JP1连起来就可以修改。接口四个针脚的定义就像下面这张图中所画的。

photo

是的。。你没看错,他们用红色作为地线 -_-b
...continue reading

1,490 total views, 1 views today

今天看到一台嵌入之梦的小车,但是上电之后发了疯似的乱跑,所以刷之。但新车间却没有网络,没办法,自己一点一点试。。结果如下

CT1	接受pwm,控制速度
CT2	前进控制信号,高电位转动
CT3	后退控制信号,高电位转动

但是由于小车上的UNO与我的Ubuntu连接有问题,貌似只有Windows是好的,Mac OS有时也会出问题。所以最后车上改用了Mega 1280。

但是又发现一个问题,就是Arduino使用USB供电的时候很正常,然而,使用车上接出来的5V电源时,程序就会混乱,完全没有一点规律。猜测可能是由于电机转动导致整个系统的电压下降,无法提供足够的电压给Arduino的板子上。这大概也是之前uno不会发疯的原因。没办法,在小车上再接一块9V层叠式电池,作为Arduino的电源。最后终于行了。

后面程序的作用是往前走,遇到前方有物体是后退,打弯,然后继续往前,一个简单的壁障程序。没有用到速度控制。下面就是这个小车最后的样子,手机拍的,将就看吧

photo
...continue reading

1,352 total views, no views today

找两个一样的易拉罐,这次可口可乐和百事可乐终于有机会合体了:-P

01

将其中一个易拉罐的底挖去,作为酒精炉的上盖,为了下面描述方便,把可口可乐易拉罐就叫红罐,百事的就叫蓝罐了。

02
...continue reading

2,079 total views, no views today

1 Comment

EZW算法简析

何琪辰 上海大学计算机工程与科学学院 10720955

heqichen(a)gmail.com
http://heqichen.cn

1.简介

EZW算法是1993年由Jerome M. Shapiro提出的基于小波变换的算法。该算法的结果能够经过熵编码后有很高的压缩效率。

E代表了Embedded。嵌入式编码就是渐进式编码。意思是先把最重要的部分进行编码,然后再将次要的部份进行编码。如果把一幅图像进行序列化,低频信号往往是占主要地位的。所以,进过小波变换之后的图像,把左上角放低频信号,右下角放高频信号。并且,编码的扫描线也是从左上方开始扫描,最后到右下角,这样来做到先将图像的重要信息进行编码。http://heqichen.cn

W代表了wavelet transform。图像在进入EZW编码器之前先要进行小波变换,分离高低频信息。所以EZW是基于小波变换的算法。

Z代表了Zerotree。称之为“零数”。到目前为止,没有对零树有统一的严格的定义。零树是EZW作者为了方便阐述其算法思想而构造的一种数据结构。并认为,若一棵树能满足特定的几点特定要求,就称之为零树。因为原为中对零数要求在文章中分得十分散,都是用到了再讲,我也没有时间来整理这方面的内容所以零数的具体定义我也没能给出。

文中提到的教材指清华大学出版社的《多媒体技术基础(第3版)》林福宗编著。

...continue reading

5,490 total views, 14 views today