安卓机器人 发表于 2016-5-16 23:31:39

水上浮岛

本帖最后由 安卓机器人 于 2016-5-17 06:57 编辑

【新路历程】{:5_159:}夺取保卫美丽的钓鱼岛,人人有责;

{:5_168:}演练抢滩登陆台湾岛这是我军正在进行的必修课。

以上都得有运输工具才行吧?于是,陪着儿子搜索家里现有的破烂玩意儿,就自造了这个永不沉没的可控“浮岛”,模拟侦察,运输,抢滩,有一定的可玩性。
【实现功能】及【展示】
{:5_196:}三部分:1.【带蓝牙】安卓手机,
2.【蓝牙转Zigbee串口+ArduinoUNO】中转遥控器,
3.【带Zigbee串口+双L298N+ArduinoNANO】浮岛体
【工作原理】安卓手机用蓝牙发出命令, 遥控器上的蓝牙模块接收并被UNO处理后转由UNO上软串口上的Zigbee模块再次发出命令,远处水面上“浮岛”体上另一Zigbee模块接收并被NANO处理控制2个L298N电机模块,从而控制3个电机的方向与速度,以此来实现200米范围内的“浮岛”体的左右转,前进,加速前进,后退等。
【疑问先答】你可能会问:为什么不直接用手机蓝牙控制水面上的“浮岛”体,省去遥控器呢?答:目前蓝牙距离传输最多60米,万一“浮岛”体冲到湖中心,失联了,回不了家!所以中转由我目前用的200多米的Zigbee模块。
http://v.youku.com/v_show/id_XMTU3Mjc5MDE5Mg==.html
水面控制测试

http://v.youku.com/v_show/id_XMTU3MjgzODMyNA==.html
三部分岸边测试(最后自动停机是因没电了)

【制作过程】
Step 1 首先试验小电机在水中是否能较稳定地工作,把玩具电扇接通电源浸入水中至少一个小时,之后观察工作正常,奠定我继续下一步的信心。【安全提示:仅小电机可试】
http://v.youku.com/v_show/id_XMTU3Mjg3Nzk1Ng==.html
Step 2 找来一块增强密度的泡沫板作为浮体(不用考虑浮力和漏水)


前进方向稍作修整,利于减少阻力。


Step 3 固定三电机

我儿子开始制作的双电机支架(后来想来个加速,添加第三个电机,这个就否定了)







加速电机(点击“加速前进”三个电机并行运行)


双电机


“加速“模式---三电机启动运行

Step 4 “浮岛”体成型【自始至终要考虑重心落在中心】

面包板+ArduinoNANO



一个L298N能同时控制2个电机的方向与速度


电源7.4V置于中央并用电工胶带粘牢





三电机两L298N模块均用扎带固定


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


电机完全浸没水中,水面平衡测试,吃水测试





Step 5 遥控器组装

1个蓝牙模块+1个Zigbee模块分别安装在硬软串口上(UNO只有一个硬串口)

Step 6 利用MIT的AI制作APK(或者干脆网搜个呗)


http://v.youku.com/v_show/id_XMTU3Mjk3MjkxNg==.html
室内测试一下


放在室外湖面上准备ing


“集结”完毕
【代码1:可控“浮岛”体】
// 20160507
// + 在双电机基础上增加第3个电机(速度更快),因此也须配另一个L298N
// Zigbee->arduino nano->L298N->双电机遥控船,备注:
// 此L298N,当方向为HIGH时,则速度值为0->255相当于速度从最大->最小(零)!!!
// 此L298N,当方向为LOW时,则速度值为0->255相当于速度从最小->最大!!!
// 手机遥控界面:
//      AA   
//LLSS   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); //检验从手机遥控端发来的信号是否是所需要信号
    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(仅供参考)】

手机APK界面设计


块语言代码截图(第一部分)

块语言代码截图(第二部分)

【可以不回顾】
http://v.youku.com/v_show/id_XMTU3MzAwNDc3Mg==.html






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

好简陋的“岛”啊

安卓机器人 发表于 2016-5-17 08:45:21

本帖最后由 安卓机器人 于 2016-5-17 09:03 编辑

dsweiliang 发表于 2016-5-17 08:16
好简陋的“岛”啊
是啊,大家可以想像加入更多传感器或设备呀。{:5_166:}
我最近在履带车机器人上安装了二自由度摄像机也可以移植到这小“岛”上哟
http://v.youku.com/v_show/id_XMTU3MzMwODA0NA==.html二自由度小蚁摄像云台


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

安卓机器人 发表于 2016-5-17 09:00:30

更多芬享准备ing...






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





{:5_132:}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电机还能水下使用
页: [1]
查看完整版本: 水上浮岛