14945| 11
|
[项目] 水上浮岛 |
本帖最后由 安卓机器人 于 2016-5-17 06:57 编辑 【新路历程】夺取保卫美丽的钓鱼岛,人人有责; 演练抢滩登陆台湾岛这是我军正在进行的必修课。 以上都得有运输工具才行吧?于是,陪着儿子搜索家里现有的破烂玩意儿,就自造了这个永不沉没的可控“浮岛”,模拟侦察,运输,抢滩,有一定的可玩性。 【实现功能】及【展示】 三部分:1.【带蓝牙】安卓手机, 2.【蓝牙转Zigbee串口+ArduinoUNO】中转遥控器, 3.【带Zigbee串口+双L298N+ArduinoNANO】浮岛体 【工作原理】安卓手机用蓝牙发出命令, 遥控器上的蓝牙模块接收并被UNO处理后转由UNO上软串口上的Zigbee模块再次发出命令,远处水面上“浮岛”体上另一Zigbee模块接收并被NANO处理控制2个L298N电机模块,从而控制3个电机的方向与速度,以此来实现200米范围内的“浮岛”体的左右转,前进,加速前进,后退等。 【疑问先答】你可能会问:为什么不直接用手机蓝牙控制水面上的“浮岛”体,省去遥控器呢?答:目前蓝牙距离传输最多60米,万一“浮岛”体冲到湖中心,失联了,回不了家!所以中转由我目前用的200多米的Zigbee模块。 水面控制测试 三部分岸边测试(最后自动停机是因没电了) 【制作过程】 Step 1 首先试验小电机在水中是否能较稳定地工作,把玩具电扇接通电源浸入水中至少一个小时,之后观察工作正常,奠定我继续下一步的信心。【安全提示:仅小电机可试】 Step 2 找来一块增强密度的泡沫板作为浮体(不用考虑浮力和漏水) 前进方向稍作修整,利于减少阻力。 Step 3 固定三电机 我儿子开始制作的双电机支架(后来想来个加速,添加第三个电机,这个就否定了) 加速电机(点击“加速前进”三个电机并行运行) 双电机 “加速“模式---三电机启动运行 Step 4 “浮岛”体成型【自始至终要考虑重心落在中心】 面包板+ArduinoNANO 一个L298N能同时控制2个电机的方向与速度 电源7.4V置于中央并用电工胶带粘牢 三电机两L298N模块均用扎带固定 开始发现桨露出水面一点点会有较多水花飞溅,可能使控制板失灵,故而增加垫层 电机完全浸没水中,水面平衡测试,吃水测试 Step 5 遥控器组装 1个蓝牙模块+1个Zigbee模块分别安装在硬软串口上(UNO只有一个硬串口) Step 6 利用MIT的AI制作APK(或者干脆网搜个呗) APKBOAT3M.zip 室内测试一下 放在室外湖面上准备ing “集结”完毕 【代码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(仅供参考)】 手机APK界面设计 块语言代码截图(第一部分) 块语言代码截图(第二部分) 【可以不回顾】 |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed