[项目]水上浮岛 精华

11185浏览
查看: 11185|回复: 11

[项目] 水上浮岛

[复制链接]
本帖最后由 安卓机器人 于 2016-5-17 06:57 编辑
【新路历程】夺取保卫美丽的钓鱼岛,人人有责;
水上浮岛图1
演练抢滩登陆台湾岛这是我军正在进行的必修课。
水上浮岛图2
以上都得有运输工具才行吧?于是,陪着儿子搜索家里现有的破烂玩意儿,就自造了这个永不沉没的可控“浮岛”,模拟侦察,运输,抢滩,有一定的可玩性。
【实现功能】及【展示】
三部分:1.【带蓝牙】安卓手机,
2.【蓝牙转Zigbee串口+ArduinoUNO】中转遥控器,
3.【带Zigbee串口+双L298N+ArduinoNANO】浮岛体
【工作原理】安卓手机用蓝牙发出命令, 遥控器上的蓝牙模块接收并被UNO处理后转由UNO上软串口上的Zigbee模块再次发出命令,远处水面上“浮岛”体上另一Zigbee模块接收并被NANO处理控制2个L298N电机模块,从而控制3个电机的方向与速度,以此来实现200米范围内的“浮岛”体的左右转,前进,加速前进,后退等。
【疑问先答】你可能会问:为什么不直接用手机蓝牙控制水面上的“浮岛”体,省去遥控器呢?答:目前蓝牙距离传输最多60米,万一“浮岛”体冲到湖中心,失联了,回不了家!所以中转由我目前用的200多米的Zigbee模块。

水面控制测试


三部分岸边测试(最后自动停机是因没电了)

【制作过程】
Step 1 首先试验小电机在水中是否能较稳定地工作,把玩具电扇接通电源浸入水中至少一个小时,之后观察工作正常,奠定我继续下一步的信心。【安全提示:仅小电机可试】

Step 2 找来一块增强密度的泡沫板作为浮体(不用考虑浮力和漏水)

水上浮岛图4
前进方向稍作修整,利于减少阻力。
水上浮岛图3

Step 3 固定三电机
水上浮岛图5
我儿子开始制作的双电机支架(后来想来个加速,添加第三个电机,这个就否定了)


水上浮岛图6

水上浮岛图7

水上浮岛图9
加速电机(点击“加速前进”三个电机并行运行)

水上浮岛图8
双电机

水上浮岛图10
“加速“模式---三电机启动运行

Step 4 “浮岛”体成型【自始至终要考虑重心落在中心】
水上浮岛图12
面包板+ArduinoNANO

水上浮岛图22
水上浮岛图11
一个L298N能同时控制2个电机的方向与速度

水上浮岛图14
电源7.4V置于中央并用电工胶带粘牢

水上浮岛图13


水上浮岛图18
三电机两L298N模块均用扎带固定

水上浮岛图16
开始发现桨露出水面一点点会有较多水花飞溅,可能使控制板失灵,故而增加垫层

水上浮岛图15
电机完全浸没水中,水面平衡测试,吃水测试





Step 5 遥控器组装
水上浮岛图17
1个蓝牙模块+1个Zigbee模块分别安装在硬软串口上(UNO只有一个硬串口)

Step 6 利用MIT的AI制作APK(或者干脆网搜个呗)
水上浮岛图21
下载附件APKBOAT3M.zip

室内测试一下

水上浮岛图19
放在室外湖面上准备ing

水上浮岛图20
“集结”完毕
【代码1:可控“浮岛”体】
// 20160507
// + 在双电机基础上增加第3个电机(速度更快),因此也须配另一个L298N
// Zigbee->arduino nano->L298N->双电机遥控船,备注:
// 此L298N,当方向为HIGH时,则速度值为0->255相当于速度从最大->最小(零)!!!
// 此L298N,当方向为LOW时,则速度值为0->255相当于速度从最小->最大!!!
// 手机遥控界面:
//        AA   
//  LL  SS   RR
//        BB   
// HC-06我的蓝牙模块(先与手机配对)、Zigbee手机端程序功能:
// 手机发送字符串“SS”,Zigbee接收到后机器人调用停止函数“boatStop();”
// 手机发送字符串“AA”,Zigbee接收到后机器人调用前进函数“boatAdvance(0,0);”
// 手机发送字符串“BB”,Zigbee接收到后机器人调用后退函数“boatBack(255,255);”
// 手机发送字符串“LL”,Zigbee接收到后机器人调用左转函数“boatTurnLeft(255,0);”
// 手机发送字符串“RR”,Zigbee接收到后机器人调用右转函数“boatTurnRight(0,255);”
// 接线方式ARDUINO为4576-->L298N的IN1234为5476
// Zigbee的TX接NANO的RX
const int speedPin_M3 = 3;    // 第2个L298N连接第3个电机
const int directionPin_M3 = 2;
const int speedPin_M1 = 5;     // M1 Speed Control
const int speedPin_M2 = 6;     // M2 Speed Control
const int directionPin_M1 = 4;     // M1 Direction Control
const int directionPin_M2 = 7;     // M2 Direction Control
const int ledPin = 13;

String APKStr ="**";  // 利用字符串对象暂存来自手机的命令以准备ARDUINO处理

void setup() {
  Serial.begin(115200);
  pinMode(ledPin,OUTPUT);
}
/////////////////////////
void loop() {
//  digitalWrite(ledPin,HIGH);  // 内置LED13一直保持亮
  while(Serial.available())
  {
    APKStr = Serial.readString(); // 读串口的字符串
//    Serial.println(APKStr); //  检验从手机遥控端发来的信号是否是所需要信号[OK]
    if(APKStr == "SS")      // 此处若用SWITCH(APKStr)则无法通过编译,报非integer
    {
        boatStop();
        for(int i=0;i<9;i++)  // 停止时闪烁9次共约3.6S
        {
          digitalWrite(ledPin,HIGH);
          delay(200);
          digitalWrite(ledPin,LOW);
          delay(200);
        }
    }else if(APKStr == "AA")  // if(APKStr == "AA"||APKStr == "")由于手机没有发送空串命令,此处后半无效
    {
        boatAdvance(0,0);
    }else if (APKStr == "BB")
    {      
        boatBack(255,255);
    }else if (APKStr == "LL")
    {      
        boatTurnLeft(255,0);
    }else if (APKStr == "RR")
    {      
        boatTurnRight(0,255);
    }else if (APKStr == "ADDSPEED")  // 当长按手机按钮执行“加速前进”命令时,3个电机全力启动向前进
    {      
        boatAdvance(0,0);   // 1,2电机全力向前
        boatAddSpeed();     // 3电机全力向前
    } // END IF
  }  // END WHILE
}  // END LOOP
//////////////////////////////////////////////
//////////////////////////////////////////////
void blinkLED13()   // 用于测试串口收发是否正确
{   // 如果接收到相应的字符串,则LED13快闪3次,打印出接收字符串
        for(int i=0;i<3;i++)
        {         
          digitalWrite(ledPin,HIGH);
          delay(200);
          digitalWrite(ledPin,LOW);
          delay(200);
        }
        Serial.println(APKStr);  
}
////////////////////////////////////////////
void boatStop(){                 //  3 Motor Stop
  digitalWrite(directionPin_M1,LOW);    // + 当停止命令执行时,3个电机同时停机
  analogWrite(speedPin_M3,0);           // +
  digitalWrite(directionPin_M2,LOW);
  digitalWrite(directionPin_M3,LOW);
  analogWrite(speedPin_M1,0);   // 此L298N 当以上为LOW时,则此处必须为0才能停止!
  analogWrite(speedPin_M2,0);

}   
//////////////////////////////////////////////
void boatAdvance(int leftSpeed,int rightSpeed){         //Move forward
  digitalWrite(directionPin_M1,HIGH);   
  digitalWrite(directionPin_M2,HIGH);
  digitalWrite(directionPin_M3,LOW);   // + 当执行前进命令时,第3个电机停机
  analogWrite(speedPin_M3,0);          // +   
  analogWrite(speedPin_M1,leftSpeed);  //  此L298N,当以上为HIGH时,则此处为0->255相当于
  analogWrite(speedPin_M2,rightSpeed); //  速度从最大->最小(零)!!!
}
//////////////////////////////////////////////
void boatBack(int leftSpeed,int rightSpeed){       //Move backward
  digitalWrite(directionPin_M1,LOW);   
  digitalWrite(directionPin_M2,LOW);
  digitalWrite(directionPin_M3,LOW);   // + 当执行后退命令时,第3个电机停机
  analogWrite(speedPin_M3,0);          // +
  analogWrite(speedPin_M1,leftSpeed);  //  此L298N,当以上为LOW时,则此处为0->255相当于
  analogWrite(speedPin_M2,rightSpeed); //  速度从最小->最大

}
//////////////////////////////////////////////
void boatTurnRight(int leftSpeed,int rightSpeed){           //Turn Right   
  digitalWrite(directionPin_M1,HIGH);   
  digitalWrite(directionPin_M2,LOW);
  digitalWrite(directionPin_M3,LOW);   // + 当执行此命令时,第3个电机停机
  analogWrite(speedPin_M3,0);          // +
  analogWrite(speedPin_M1,leftSpeed);    // 注意数值大小
  analogWrite(speedPin_M2,rightSpeed);
}
//////////////////////////////////////////////
void boatTurnLeft(int leftSpeed,int rightSpeed){          //Turn Left
  digitalWrite(directionPin_M1,LOW);
  digitalWrite(directionPin_M2,HIGH);
  digitalWrite(directionPin_M3,LOW);   // + 当执行此命令时,第3个电机停机
  analogWrite(speedPin_M3,0);          // +
  analogWrite(speedPin_M1,leftSpeed);   
  analogWrite(speedPin_M2,rightSpeed);  // 注意数值大小
}
////////////////////////////////////////////// +
void boatAddSpeed(){
  digitalWrite(directionPin_M3,HIGH);   // + 当长按手机按钮执行“加速前进”命令时,第3个电机全力启动仅向前进
  analogWrite(speedPin_M3,0);          // +     
}
////////////////////////////////////////////// +


【代码2:中转遥控器】


// 20160410
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX :蓝牙模块TX->RX(UNO_D10)所连软串口
/////////////////////////////////////////
void setup() {
  Serial.begin(115200);   // UNO硬串口连 Zigbee 模块
  mySerial.begin(9600);   // 应与蓝牙模块设置值一致
}
/////////////////////////////////////////
void loop() {
  if (mySerial.available()) {
    Serial.print(mySerial.readString());
  }
}
/////////////////////////////////////////

【代码3:手机APK(仅供参考)】

水上浮岛图25
手机APK界面设计

水上浮岛图23
块语言代码截图(第一部分)
水上浮岛图24
块语言代码截图(第二部分)

【可以不回顾】







Screenshot_2016-05-08-15-25-04_com.miui.gallery.png

dsweiliang  初级技神

发表于 2016-5-17 08:16:16

好简陋的“岛”啊
回复

使用道具 举报

安卓机器人  中级技神
 楼主|

发表于 2016-5-17 08:45:21

本帖最后由 安卓机器人 于 2016-5-17 09:03 编辑
dsweiliang 发表于 2016-5-17 08:16
好简陋的“岛”啊

是啊,大家可以想像加入更多传感器或设备呀。
我最近在履带车机器人上安装了二自由度摄像机也可以移植到这小“岛”上哟
二自由度小蚁摄像云台
水上浮岛图1

履带车手机端控制小车和摄像机

回复

使用道具 举报

安卓机器人  中级技神
 楼主|

发表于 2016-5-17 09:00:30

更多芬享准备ing...

水上浮岛图1




越障,爬坡,防撞,远程侦察摄像,展开你的想像力!


水上浮岛图2


X-MEN ROBOT 17自由度,可以加TTS语音模块...



回复

使用道具 举报

svw  初级技匠

发表于 2016-5-17 19:45:30

颜值有点低:(
回复

使用道具 举报

svw  初级技匠

发表于 2016-5-17 19:45:56

材料好像是螃蟹王国买的吧?
回复

使用道具 举报

安卓机器人  中级技神
 楼主|

发表于 2016-5-17 21:32:28

svw 发表于 2016-5-17 19:45
材料好像是螃蟹王国买的吧?

蓝色的是的哟
回复

使用道具 举报

gada888  版主

发表于 2016-5-19 07:29:20

zigbee的品牌是什么?能传输多远的距离?
回复

使用道具 举报

安卓机器人  中级技神
 楼主|

发表于 2016-5-19 10:53:38

gada888 发表于 2016-5-19 07:29
zigbee的品牌是什么?能传输多远的距离?

中联创新,我的地面上1.5米距离150稳定,空中应该200-250米吧
回复

使用道具 举报

gada888  版主

发表于 2016-5-19 11:58:36

安卓机器人 发表于 2016-5-19 10:53
中联创新,我的地面上1.5米距离150稳定,空中应该200-250米吧

谢谢,是叫深联创新。
回复

使用道具 举报

安卓机器人  中级技神
 楼主|

发表于 2016-6-2 13:20:00

liangyuteng 发表于 2016-6-2 12:00
楼主可以试试接受命令部分用switch cast
可以试着加上国旗~~

:victory::loveliness:您的建议很贴合主题哟,谢谢!我想试试。先前我用SWITCH CASE 似乎只能CASE 单个字符,我这里用了字符串,好像不得不用IF~ELSE
回复

使用道具 举报

20060606  高级技匠

发表于 2020-8-17 05:49:05

原来130电机还能水下使用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail