Posts Tagged ‘小车’

金灿灿的4WD小车

前几天机器人基地的Arduino 4WD小车送到了。打开一看,哇塞,金灿灿的,心情顿时像捡了一捆钱似的亮堂了起来,哈哈。

Arduino小车

趁圈圈被带出去遛弯的时候,我把它组装了起来。这个小车是镀金铝板的车身,质感非常好,而且安装很简单,大概用十分钟就足够了。安装前的装箱图:

小车的零件们

这个小车之所以叫Arduino小车,是因为它是针对Arduino的板子和扩展插件们设计的。上面打了很多窟窿,这可不是偷工减料,将来需要安装小板子的时候就知道好处了。

因为相关的家伙还没有配齐,所以这次只是把它简单组装了一下看看效果,有兴趣的同学可以去店家那里看看介绍,说的还比较详细。地址在这里:http://item.taobao.com/item.htm?id=9504307833

虽然还没有开始使用,但是简单构思了一下使用方式。其实我个人觉得4驱的小车并不见得比2驱的好控制。因为4个轮子需要同时控制才能和谐运动,如果每个电机都单独控制的话,会增加控制的难度。比较偷懒的办法是把同一侧的两个轮子并联到同一个电源,这样转弯和前进用一个L298N的板子就够了。这样相当于还是左右两组动力,但是同样两个电机接上相同的电压,转速也不见得完全相同,所以这样的动力源有点冗余。不过看RobotBase也有2WD的小车卖,可能是针对不同的用户考虑的吧。

装完小车,回想起我去年的小爱计划。于是把当时做的小车从床底下拖出来,发现打磨的钢轴都已经生锈了,还真有点伤感。没办法,在家里加工零件太难,也太危险。对比一下这两个小车的尺寸吧,雪碧是参照物:

两个小车

两个小车

这个小车的轮子是滑板车的配件,万向轮是家居的配件,轴承和固定齿轮是麻将桌的配件,用了一个多月才拼拼凑凑起来,可以承重20公斤。之所以选择自己动手做,是因为我想把小爱做成一个跟真人小孩差不多大的机器人,而市面上基本都是小尺寸的底盘小车。在此呼吁各公司们也开发点大配件吧,我就不用在家里敲敲打打的了 :)

嗯,在这里给自己打打气,小爱计划只是暂停,不会就这么结束的。这个阶段就先玩玩小车好了,至于拿它做什么,先卖个关子。可以肯定是是会把手头的Android手机变成遥控器,准备用Arduino的蓝牙扩展卡连接。有个叫zxspace的同学已经用iphone遥控Android了,果粉们可以先去围观一下。

蓝牙手机变身小车遥控器 (3)

发现已经一星期没有更新博客了,真是非常抱歉。上周做完手机遥控器以后,一直没有其他进展,也没来得及发攻略。接下来的时间可能会更忙,只能先跟大家说声抱歉了。在此严重羡慕一下大苹果同学,这个家伙周末带mm飞去武汉大学看樱花了,眼红啊。。。

今天跟大家分享一下在Windows Mobile环境里,如何配置和调用Web Service(就是上次说的四个程序中的第二个)。

一、首先配置开发环境,需要安装下面的几个东东:
1,VS2008 及其 SP1
2,Windows Mobile 6 Professional SDK Refresh.msi
3,Windows Mobile 6.5 Professional Developer Tool Kit (CHS).msi

安装之后,在“新建工程”菜单里,就可以看到智能手机的选项:

新建智能手机项目

新建智能手机项目

新建智能手机项目只有一个选项,输入项目名称后,单击进入下一步,选择平台版本:

选择手机版本

选择手机版本

单击确定,一个新的手机项目就建好了。

新建的工程

新建的工程

二、控件,编译和部署
试着拖两个按钮到手机界面上去,你可以发现跟普通的windows应用程序开发是类似的。我添加了三个按钮,分别是“启动”,“停止”和“退出”。双击“退出”按钮,对按钮添加相应的事件,其他两个按钮稍后再说:

private void ExitButton_Click(object sender, EventArgs e)
{
    this.Dispose();
    this.Close();
}

选择菜单中的“编译->编译项目”,然后到这个项目的文件夹目录里面翻一翻,在 \PhoneRemoteControl\bin\Debug目录下,可以发现多了个exe文件。

先别激动,这个文件在电脑上双击是不能运行的。必须要复制到手机上,用你的手指头单击它,然后发现……还是不能运行。

嗯,这是因为你的人品不够好,弥补办法是去微软网站上下载一个叫“NET Compact Framework”的东西并安装上。

好了,再用一阳指点一下,这次可以看到软件的界面了,再点一下“退出”按钮,程序就退出了(好像是废话)

三、调用Web Service
首先要在工程中引用WebService:在工程名字上用右键,弹出的菜单中选择“add web reference”。我这个是英文版,不知道中文版里叫什么,参考一下吧:

add reference

add reference

在接下来的设置窗口里,输入上一步中做好的web service地址,另外给它起个名字叫“PingService”:

输入service地址

输入service地址

添加了service之后,咱们看看怎么调用,非常简单,用一个函数就可以了:

private void WCFRequestCall(string data)
{
    PingService.Ping client = new PhoneRemoteControl.PingService.Ping();
    client.Url = "http://chenwu03/service/ping.asmx";
    client.SetData(data);
}

这里有一句 client.Url=”…”; 这个为部署修改用的,例如你开发的时候用chenwu03,将来可能换到另一台电脑上,那么在这里改成chenwu04就可以了。建议把这个参数放到配置文件里,这样如果需要修改的话,不需要改代码重新编译,直接用写字板改一下配置文件即可。

四、在手机上画方向盘
其实想要遥控小车,用前进后退,左转右转几个按钮就可以了。但是为了捍卫Dev的尊严,我决定做的花哨一点,于是很骚包的画了一个方向盘。在Form中绘图,可以在一个叫Form1_Paint的函数中添加程序,不说废话,看代码吧:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    int windowWidth = 480;
    int borderOffset = 40;
    int topStart = 160;
    int lineOffset = 25;
    int r = windowWidth / 2 - borderOffset;

    Graphics g = this.CreateGraphics();

    Pen pen = new Pen(Color.Red);
    pen.Width = 3;
    pen.DashStyle = DashStyle.Dash;
    g.DrawLine(pen, borderOffset-lineOffset, topStart + r, windowWidth - borderOffset+lineOffset, topStart + r);
    g.DrawLine(pen, windowWidth / 2, topStart - lineOffset, windowWidth / 2, topStart + 2 * r + lineOffset);

    pen.Color = Color.Blue;
    pen.DashStyle = DashStyle.Solid;
    pen.Width = 8;
    g.DrawEllipse(pen, borderOffset, topStart, 2 * r, 2 * r);

    steeringWheel.CenterX = windowWidth / 2;
    steeringWheel.CenterY = topStart + r;
    steeringWheel.R = r;
}

画出来的效果如下:

在手机上的效果

在手机上的效果

五,计算小车的速度
因为Arduino中,直流电机的控制是通过PWM管脚输出的,值范围是0~1023;所以我让手机发出的数据就是简单的“VLeft,VRight”,值的范围都是从0到1023,用正负号表示前进还是后退。

设计的思路是,点击圆圈的正上方时,两个轮子都向前走,离圆心越近速度越慢,最远的地方发送的数据是“1023,1023”;
类似的,点击最下面时,发送的数据是“-1023,-1023”;
当点击圆圈的左边时,我会把右侧的速度变大,左侧的速度变小,这样小车就向左转了;
当点击到圆圈外面时,直接忽略掉。

需要注意的是,在实际操作中,当输出速度低于300时,电机其实已经带不动了,所以我把低于300的值全都重置成0。这部分代码就不贴了,反正大家可以按照自己的喜好编写控制代码。需要的同学可以下载代码回去参考下。
至于上面提到的“启动”和“停止”按钮,我们就发送“600,600”,“0,0”两组数据即可

六、发送数据
当你的咸猪手在手机上乱摸时,我是用Form1_MouseMove来响应事件的。事实证明,这个数据发送的频率太高了,每秒钟会发送几百组速度。为了回避这个问题,我们设置一个定时器,每隔150毫秒执行一次,中间MouseMove的事件全部扔掉。

private string currentCommand = "";
private string lastCommand = "";

private void SendTimer_Tick(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(lastCommand))
    {
        currentCommand = lastCommand;
        lastCommand = "";
    }
    if (!string.IsNullOrEmpty(currentCommand))
    {
        WCFRequestCall(currentCommand);
        currentCommand = "";
    }
}

好了,接下来是检查工作成果。用手指头在屏幕上一阵乱摸,可以从端口监视器里看到不断跳出来的数组:

端口监视器

端口监视器

有经验的同学可能有两个问题:
1,为什么不直接用WebRequest发起请求呢?
这个我试过,手机容易死机,原因还不清楚
2,为什么不直接用TCP/IP发送数据到PC端口呢,绕这么大一圈?
这个我也试过,程序不会出错,但是电脑上也没有接到数据,原因依然不清楚

不管怎么说,反正试出来一个可行的方法。这篇博客中提到的源代码在这里下载,其他部分下回继续:
http://www.diy-robots.com/Resources/XiaoI/PhoneRemoteControl.zip

底盘小车 – 框架

春节期间给小爱做了一个测试版的底盘小车,这两周工作太忙,没有什么进展。今天先补上记录。

话说上个月有个网友,问能不能参观一下我的工作室。其实我是一个标准IT宅男,俗称闭家锁,一般不参加网友活动,更别说请人回家参观了。不过我在网上就非常好客,比如可以参观一下我的豪华工作台:

打孔的地方

打孔的地方

下面那个脏兮兮的玻璃台子曾经是个鱼缸,小金鱼们已经被放生到昆玉河,目前下落不明。观察力敏锐的同学会发现工作环境光线很好。没错,其实我的工作室不仅光线好,还视野宽阔,空气清新,唯一的缺点是冬天有点冷:

工作室就是我家的阳台

工作室就是我家的阳台

不说废话了,首先看看之前做好的轮子,预留了一个方便安装的直线轴承。

轮子和轴承

轮子和轴承

量好尺寸,根据小爱将来的宽度做一点计算,然后用铅笔在铝条上划线。

划线

划线

现在需要在铝条上折出两个直角。没想到3mm厚的铝条居然这么硬,如果直接用钳子掰的话,只能弯成一个大圆弧形。不过不要紧,工程师是不会被工具难倒的。想起之前拆的那个鞋架子。用两个木条做成夹棍,把铝条用螺丝固定在中间,最后垫在那块万能菜板上使劲敲,这样就弯出了比较完美的直角:

木条制作的“老虎钳”

木条制作的“老虎钳”

接下来就是在我的豪华工作台上打孔了。那个手持的小电钻真是不太好用,钻头晃的很厉害。这里给大家介绍一个小经验,用钉子在划线的地方敲一个小坑,然后用钻头顶住小坑再开始打孔,这样位置就精确了,而且打孔速度会快很多。看看打好孔的铝条:

打孔后的铝条

打孔后的铝条

临时装上轮子看看装配的尺寸是否合适

检查打孔的尺寸

检查打孔的尺寸

好了,既然尺寸还凑合,拆下轮子继续划线打孔,把整个底盘的架子装好。

底盘架子

底盘架子

接下来是安装轮子和直流电机:

轮子和直流电机

轮子和直流电机

驱动小车用两个直流电机就够了,另外一端使用的是两个万向轮:

万向轮

万向轮

最终的成果是这样的:

大功告成

大功告成

这个小车做好以后,我把Arduino实验板,直流电机控制板,电源,笔记本都架在小车上做了一个实验。可以顺利完成前进后退和转弯的动作。不过电机控制使用的是笔记本+USB线,所以暂时还不能实现遥控。这几天正在试验把我的手机作成遥控器,如果能搞定的话发上来跟大家分享。另外萝卜头的攻略还差几篇,接下来这段时间争取把它们写完。

工具啊工具

今天早上一直在露台上锯东西,下午右肩膀开始酸痛,晚上已经疼到举不动东西,估计接下来的几天要歇着了。据老丈人说,我那个锯弓不稳,锯条齿太细,所以锯起来太累。下回送我什锦锉的时候,顺便再送我几根粗牙锯条。

这几天北京大风降温,我在露台上叮叮咣咣的干了几天活,冻了个半死。便携式的电钻真是不够结实,打十几个孔以后钻头就开始打滑;砂轮也是,磨一根45#钢的轴,能把砂轮片打掉一半。这要是在工厂,连磨带钻也就是一两个小时的时间。

果然是“工欲善其事,必先利其器”。过段时间准备买一个小型台钻,这样打孔能方便点。如果有北京的朋友可以联系到加工厂或者车间,能够方便实惠的加工点东西,希望给我介绍一下。多谢了!

春节快过完了,休息几天就得收心回去上班了。发一张目前进度的照片吧,过几天再发详细点的攻略。

有点雏形的小车底盘

有点雏形的小车底盘

底盘小车的制作 – 轮子

春节期间老丈人和丈母娘来北京了。本来我还非常担心,如果老人们发现我每天捣腾这些东西,一方面可能觉得我不务正业,一方面也可能会觉得自己的闺女生活在水深火热之中。

老丈人曾经做过十多年的铣工,知道我这点小爱好以后,非常有兴趣,这几天一直跟我一起探讨和制作机械部分,还说回家以后要送我一套什锦锉。哈哈,也许男人就是天生的机器人爱好者 :D
废话不多说了,先看看最近几天的进展。

首先是订制的几根45#钢的小轴,春节前终于送到了。下面是我手绘的加工图和送到的小轴:

小车的轴

小车的轴

非常杯具的事情:我只标注了Φ8的直径,没有标注公差,所以寄来的小轴比轴承粗了0.2毫米。用磨刀石磨了半天,发现45#钢真是太硬了,这样下去胳膊磨细了轴也细不了。用砂轮打的话,又担心打不圆。经过和老丈人的讨论,决定制作一个小型“车床”,用来打磨这根轴。正好可以用小车的电机来驱动。这是从百宝箱里搜刮出来的各种杂物:

各种车床配件

各种车床配件

家里最可怜的菜板,一直被我用来做各种实验,这次它会变成一个车床。

百变菜板

百变菜板

直流电机需要一块角铁做支架,百宝箱里找不到合适的配件,我在家里寻摸了半天,终于发现电脑桌下面有几块合适的角铁,趁着老婆去午睡的机会把它拆了。作为补偿,让电脑桌也上个镜头:

电脑桌下面的角铁

电脑桌下面的角铁

看,和直流电机简直就是天生的一对

直流电机的支架

直流电机的支架

再用一块不知道从那里捡来的T型铁皮做成支架,一个简易的小车床就制作完成了:

小型车床

小型车床

接下来就是用砂轮打磨了,老丈人亲自操刀上阵,看看战斗现场:

打磨短轴

打磨短轴

经过打磨的短轴终于可以安装到轴承里了,事先套上一个直线轴承,然后装上传说中的无敌风火轮:

安装轮子

安装轮子

在轮子的另一面,用一个锥型齿轮,把动配合变成静配合,再用螺丝拧紧固定:

锥齿轮固定

锥齿轮固定

最后把打磨用的直流电机拆下来,用联轴器连上。把上面的工序一式两份,底盘小车的两个驱动轮就完成了。明天的计划用铝条和角铝把两个轮子连上,然后再添加两个万向轮制作成底盘。两个直流电机的功率还没有试过,希望能带的动二十公斤的重量。

做好的轮子

做好的轮子