模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

2843查看 | 7回复

荡漾在求索溪里的Arduino遥控船

[复制链接]
发表于 2016-12-9 13:37:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 东方不掰 于 2016-12-9 13:43 编辑

荡漾在求索溪里的Arduino遥控船(三峡大学学生制作)

荡漾在求索溪里的Arduino遥控船 纯手工活,图书馆,教科书,电烙铁,螺旋桨 作者:东方不掰 510


   美丽的校园、灵秀的求索溪,如果小溪里有一条船,荡漾其中,势必会引来路人的目光。我们在一个明媚的午后,相约分别从寝室、教室和图书馆走出来,放下了教科书,拿起榔头、锯子、电烙铁,还有万能胶,打造了一条木质小船,加上Arduino电控,然后放到水中,玩了玩遥控船的游戏。通过这样的科技娱乐活动,或许可以学到一些知识,体验到一种课本以外的实践经历。
    因为之前完全没有造船经验、又要求手工制作,而且经费还有限,所以, 遥控船的打造实在是一件不容易的事。用最方便、最原始的工具,以及木块、木皮和万能胶材料,硬是把它做出来了。起初一直担心,船体内的电机与船外的螺旋桨的连接轴孔部分,如果处理不好,容易漏水,后来用黄油填满了轴孔,这样才把防水的问题解决了。但是实际测试时,才发现了新的问题,由于船体制作得比较狭长,就像玩具商店里买的静态航模一样的比例,后来发现小船老是往一个方向打转。原因很简单,由于纯手工活,船的长度方向上的中心线不能居中于船后方的两个螺旋桨。如果当初能把船体做宽些就好了,因为船体宽,布局两个螺旋桨时,它们的中心距可以拉开些,这样产生的扭转力矩会增大,而且船的中心线也容易做到相对居中。好在电控是用Arduino单片机控制,可以通过软件,给两个螺旋桨设置不同的转速来纠偏,我们通过验证,这种方法很奏效。
     相对小船机械部分的手工制作,电控部分的添加就容易得多,因为有利器---Arduino,一种易学易用的开源单片机硬件,它还配置了丰富的周边电子积木,根据说明书把它们正确连线,再把我演练过多次的遥控程序,下载到Arduino,接上电源,然后一次就运行成功了。     
遥控船视频:
http://v.youku.com/v_show/id_XNDYxNzc2MzQ4.html


荡漾在求索溪里的Arduino遥控船 纯手工活,图书馆,教科书,电烙铁,螺旋桨 作者:东方不掰 5483
美丽的校园和灵秀的求索溪:
荡漾在求索溪里的Arduino遥控船 纯手工活,图书馆,教科书,电烙铁,螺旋桨 作者:东方不掰 7713
荡漾在求索溪里的Arduino遥控船 纯手工活,图书馆,教科书,电烙铁,螺旋桨 作者:东方不掰 1913

国外乐高大牛的遥控船:
(这个船用的是 乐高设备,是早期“明轮船”的方案,设计得有创意,是否可以按照这样的思路也做个Arduino遥控船呢。)


   这次依然是 的DFRobot公司的Arduino电子积木,小船上的电控由Arduino UNO控制板、XBee传感器扩展板V5、APC220无线数传和
2A大功率H桥 L298N双路直流电机驱动板组成,遥控器
由Arduino UNO控制板、PS2游戏杆扩展板、APC220无线数传组成。对于PS2游戏杆扩展板的使用,可以参看我的博客文章,网址:http://blog.chinaaet.com/detail/28854.html。APC220使用参见网址:http://blog.chinaaet.com/detail/25849.html。这篇文章新出现的电控积木是
2A大功率H桥 L298N双路直流电机驱动板
(DF-MD V1.3),所以下面重点讲讲。
   这个直流电机驱动板是为了做ROBOT而开发的东东。当然,如果你有更好的想法,比如用于驱动步进电机也行。这个DF-MD V1.3大功率直流电机驱动板增加了散热器,可以承受更大的电流;控制端口为4个,这样可以节约控制器端口,而且控制方式也更为简单。采用LGS公司优秀大功率电机专用驱动芯片L298N,可直接驱动直流电机,驱动电流达2A。
驱动板产品说明书网址:http://goo.gl/QTfxO
DF-MD V1.3功能图:(双击图片,可以放大观看。)
荡漾在求索溪里的Arduino遥控船 纯手工活,图书馆,教科书,电烙铁,螺旋桨 作者:东方不掰 9719
Arduino控制板与直流电机驱动板的硬件连线与电源供给:
荡漾在求索溪里的Arduino遥控船 纯手工活,图书馆,教科书,电烙铁,螺旋桨 作者:东方不掰 2547

   看上图,我的标注部分,值得注意,“9V电池扣”电池单独为Arduino控制板供电,“电机驱动电源”只给298N驱动板供电,“VD=VS”跳线帽插上,“电机驱动电源”同时为驱动板的逻辑部分和电机部分供电。Arduino控制板与298N驱动板接成“共地”。
      硬件端口按照上图连接好后,再把下面的Arduino程序下载到硬件控制板上,遥控船电控系统就打点妥当了。
遥控器程序:
  1. /*主机遥控器程序任务:采集游戏杆扩展板上的PS摇杆和按键信息,处理后,
  2. 通过APC220无线数传串口,向从机遥控船发送单字符命令,这些命令分别控制
  3. 船的前后左右行走、以及调节船行驶的速度。*/
  4. int JoyStick_X = 1; //游戏杆扩展板的PS摇杆X轴连在模拟端口1
  5. int JoyStick_Y = 0; //游戏杆扩展板的PS摇杆Y轴连在模拟端口0

  6. int button_Grab =3;     //红色B按键连在数字端口3
  7. int button_Release =4;  //蓝色C按键连在数字端口4

  8. //B按键控制遥控船为高速
  9. //C按键控制遥控船为低速
  10. int B,C;//存储游戏杆扩展板的开关量按键的当前读取值
  11. int x,y;  //存储游戏杆扩展板的模拟量PS摇杆X,Y轴的当前读取值

  12. char flag;//存储主机向从机发送的单“字符”命令
  13. //初始化
  14. void setup()
  15. {
  16.   //把游戏杆扩展板上两个按键设置为开关量输入模式
  17.   pinMode(button_Grab, INPUT);
  18.   pinMode(button_Release, INPUT);
  19.   //启动串行通信
  20.   Serial.begin(9600);//设置串行通信的波特率
  21. }
  22. //主程序
  23. void loop()
  24. {
  25.     x=analogRead(JoyStick_X);//读取PS摇杆X轴的模拟量信息
  26.     y=analogRead(JoyStick_Y);//读取PS摇杆Y轴的模拟量信息
  27.     //读取游戏杆扩展板上三个按键“是否按下”的状态
  28.      B= digitalRead(button_Grab);
  29.      C= digitalRead(button_Release);
  30.         
  31.     //如果PS摇杆Y轴向前摇动
  32.     if(y>812)
  33.     {
  34.        //向从机遥控船发送前进命令
  35.        flag='a';
  36.        Serial.print(flag);
  37.     }
  38.     //如果PS摇杆Y轴向后摇动
  39.     else if(y<212)
  40.     {
  41.        //向从机遥控船发送后退命令
  42.        flag='b';
  43.        Serial.print(flag);
  44.     }
  45.     //如果PS摇杆X轴向左摇动
  46.     else if(x>812)
  47.     {
  48.        //向从机遥控船发送左转命令
  49.        flag='c';
  50.        Serial.print(flag);
  51.     }
  52.     //如果PS摇杆X轴向右摇动
  53.     else if(x<212)
  54.     {
  55.        //向从机遥控船发送右转命令
  56.        flag='d';
  57.        Serial.print(flag);
  58.     }   
  59.     //如果B按键为按下状态,同时C按键为松开状态
  60.     else if((B ==LOW)&&(C==HIGH))
  61.     {
  62.       //向从机遥控船发送“高速”行驶命令
  63.       flag='e';
  64.       Serial.print(flag);
  65.     }
  66.     //如果C按键为按下状态,同时B按键为松开状态
  67.    else if((C==LOW)&&(B==HIGH))
  68.     {
  69.       //向从机遥控船发送“低速”行驶命令
  70.       flag='f';
  71.       Serial.print(flag);
  72.     }  
  73.    else
  74.     {flag='n';
  75.        Serial.print(flag);//向从机遥控船发送停止命令
  76.     }
  77.     delay(20);//延时,等待数据发送成功   
  78. }
复制代码


遥控船程序:

  1. //L298N直流电机驱动板与Arduino控制板的端口连接设置
  2. int E_right =5; //连接电机1的使能端口到数字接口5
  3. int M_right =4; //连接电机1的转向端口到数字接口4
  4. int E_left =6;//连接电机2的使能端口到数字接口6
  5. int M_left=7; //连接电机2的转向端口到数字接口7
  6. int val;//存储遥控器主机向遥控车上的从机发送数据
  7. /*由于船的机械结构是纯手工打造,而且船体狭长,船的中心线不与
  8. 船后方的两个螺旋桨居中,所以如果驱动螺旋桨的两个电机转速一样,
  9. 会使船偏转打转,于是把两个电机的转速设置得不同,用来纠偏。
  10. 左右螺旋桨电机的具体值应该实验来确定。*/
  11. float velocity1=250;//右螺旋桨电机速度调节
  12. float velocity2=200;//左螺旋桨电机速度调节
  13. float velocity=250;//转弯时船速调节

  14. void setup()  //初始化
  15. {
  16.    //给各数字接口设置输入输出状态  
  17.    pinMode(M_right, OUTPUT);
  18.    pinMode(E_right, OUTPUT);
  19.    pinMode(M_left, OUTPUT);
  20.    pinMode(E_left, OUTPUT);   
  21.   //启动串行通信
  22.   Serial.begin(9600);//设置串行通信的波特率
  23. }
  24. void advance()//船前进
  25. {
  26.      digitalWrite(M_right,HIGH);
  27.      analogWrite(E_right,int(velocity1));
  28.      digitalWrite(M_left,HIGH);
  29.      analogWrite(E_left,int(velocity2));
  30. }
  31. void back()//船后退
  32. {
  33.      digitalWrite(M_right,LOW);
  34.      analogWrite(E_right,int(velocity1));
  35.      digitalWrite(M_left,LOW);
  36.      analogWrite(E_left,int(velocity2));
  37. }
  38. void left()//船左转
  39. {
  40.      digitalWrite(M_right,HIGH);
  41.      analogWrite(E_right,int(velocity));
  42.      digitalWrite(M_left,LOW);
  43.      analogWrite(E_left,int(velocity));
  44. }
  45. void right()//船右转
  46. {
  47.      digitalWrite(M_right,LOW);
  48.      analogWrite(E_right,int(velocity));
  49.      digitalWrite(M_left,HIGH);
  50.      analogWrite(E_left,int(velocity));     
  51. }
  52. void Stop()//船停止
  53. {
  54.      digitalWrite(E_right, LOW); //右电机停
  55.      digitalWrite(E_left, LOW); //左电机停
  56. }
  57. //主程序
  58. void loop()
  59. {
  60.   if(Serial.available()>0) //查询串口有无数据
  61.   {
  62.         val=Serial.read();//读取遥控器主机发送的数据
  63.         if(val=='a')//如果主机发送字符'a',
  64.         {
  65.           advance();//前进         
  66.         }
  67.         if(val=='b')//如果主机发送字符'b',
  68.         {
  69.            back();//后退           
  70.         }
  71.         if(val=='c')//如果主机发送字符'c',
  72.         {
  73.           left();//左转   
  74.                      
  75.         }
  76.         if(val=='d')//如果主机发送字符'd',
  77.         {
  78.            right();//右转         
  79.         }
  80.         if(val=='n')//如果主机发送字符'n',
  81.         {
  82.           Stop();//停止
  83.          }
  84.         if(val=='e')//如果主机发送字符'e',
  85.         {
  86.           velocity1=250;//船速度设置为高速
  87.           velocity2=200;
  88.          }
  89.         if(val=='f')//如果主机发送字符'f',
  90.         {  
  91.           velocity1=200;////船速度设置为低速
  92.           velocity2=150;
  93.         }
  94.   }   
  95. }
复制代码


    同样的硬件配置,同样的程序设计,既可以用在遥控船上,也可以控制遥控车,下面就是采用慧鱼积木作为车体的遥控车图片和视频。
荡漾在求索溪里的Arduino遥控船 纯手工活,图书馆,教科书,电烙铁,螺旋桨 作者:东方不掰 418

荡漾在求索溪里的Arduino遥控船 纯手工活,图书馆,教科书,电烙铁,螺旋桨 作者:东方不掰 8631



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


发表于 2016-12-9 14:12:49 | 显示全部楼层
路过,66666666
发表于 2016-12-9 14:42:54 | 显示全部楼层
在到此一游!~
发表于 2016-12-9 15:34:30 | 显示全部楼层
遥控器怎么牛逼的
发表于 2016-12-9 16:44:52 | 显示全部楼层
                         感人
发表于 2016-12-9 16:46:14 | 显示全部楼层
路过,666666666
发表于 2016-12-11 09:37:51 | 显示全部楼层
技术贴,必顶!
发表于 2016-12-11 15:18:01 | 显示全部楼层
手艺不错,帮你顶贴。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!