14313| 18
|
漫威之激光“攻击”型履带机器人 |
本帖最后由 安卓机器人 于 2017-5-18 11:34 编辑 漫威之激光“攻击”型履带机器人 ~漫威~其实不怎么清楚【最近越来越喜欢系列】,但机器人我倒要一直玩下去! 漫漫长夜~我在这里: 码安卓代码、玩玩绿激光、指指星星...一张激光机器人蓝图渐渐清晰: 能看、能听、能说、录像、直播...当然肯定会跑(小小障碍不在话下) 最最重要是要有绿激光(522~542nm)夜晚光迹清晰,酷不酷自个玩吧! 比较以下三种“脚”还是全履带的性感;P 制作流程如下: 一、搭建“身体”结构框架 搭机器人支架,上电机【370】 连接履带或准备备用轮子 二、选择“大脑”~控制器 安装机器人控制板【Romeo】并先调试电机 三、安装+独立代码调试各个执行机构~~"手脚眼耳"及“武器” 1、安装两自由度云台+调试Arduino代码 2、安装能看会听会说的WIFI智能摄像机,及其手机APP(独立工作) 3、安装4个红激光一字头和1个绿激光一字头+代码调试 以下紧固件套装(铜柱/尼龙柱),立马解决了底舵机的安装固定问题 固定4个红光头+1个摄像头用泡棉胶~方便! 加入蓝牙模块+ARDUINO相应代码。 四、电路图+调试+注入机器人全部”思想“~~协调前面调试的独立代码为最终代码 [mw_shl_code=cpp,true]// 05/14/2017 // 函数 smoothAngle(int iniAngleOfUp,int iniAngleOfDown)用来平滑处理上下两个舵机到达初始目标位置参数 // 我的蓝牙HC-06(*4321*)手机端程序功能: // 手机发送字母“S”,机器人蓝牙接收到后调用停止函数“carStop()” // 手机发送字母“A”,机器人蓝牙 接收到后调用前进函数“carAdvance()” // 手机发送字母“B”,机器人蓝牙接收到后调用后退函数“carBack()” // 手机发送字母“L”,机器人蓝牙接收到后调用“carTurnLeft()” // 手机发送字母“R”,机器人蓝牙接收到后调用“carTurnRight()” // 默认调用前进函数“carAdvance()” // 手机发送字母“H”,机器人蓝牙接收到后,使摄像机水平扫描0-180 // 手机发送字母“V”,机器人蓝牙接收到后,使摄像机垂直扫描60-180 // 手机发送字母“F”,机器人蓝牙接收到后,使摄像机看向正前方 // 手机发送字母“D”,机器人蓝牙接收到后,使摄像机看向正前方地面 // 手机发送字母“U”,机器人蓝牙接收到后,使摄像机看向正天顶 // 手机发送字母“Z”,机器人蓝牙接收到后,使摄像机看向正左方 // 手机发送字母“Y”,机器人蓝牙接收到后,使摄像机看向正右方 // 手机(长按APK )发送字母“G”,机器人蓝牙接收到后,仅激活 1 Green Laser // 手机(长按APK )发送字母“E”,机器人蓝牙接收到后,激活 4 Red Lasers + 1 Green Laser // 手机(长按APK )发送字母“C”,机器人蓝牙接收到后,关闭 5 Laser5 int speedPin_M1 = 5; // M1 Speed Control int speedPin_M2 = 6; // M2 Speed Control int directionPin_M1 = 4; // M1 Direction Control int directionPin_M2 = 7; // M2 Direction Control int redLaser1Pin = 2; int redLaser2Pin = 3; int redLaser3Pin = 11; int redLaser4Pin = 12; int greenLaserPin = 13; #include <Servo.h> Servo servoOfUp; // create servo object to control a servo Servo servoOfDown; // twelve servo objects can be created on most boards /////////////////////////////////////////////////////// void setup() { Serial.begin(9600); pinMode(greenLaserPin,OUTPUT); pinMode(redLaser1Pin,OUTPUT); pinMode(redLaser2Pin,OUTPUT); pinMode(redLaser3Pin,OUTPUT); pinMode(redLaser4Pin,OUTPUT); servoOfUp.attach(9); servoOfDown.attach(10); } ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// void loop() { while(Serial.available()) { char c = Serial.read(); switch(c) { case 'S': carStop(); // 仅当点击手机APP的“停止”按钮时,小车暂停共1.8秒 for(int i=0;i<3;i++) { // digitalWrite(greenLaserPin,HIGH); delay(300); // digitalWrite(greenLaserPin,LOW); delay(300); } break; case 'B': carBack(180,180); // delay(50); break; case 'L': carTurnLeft(200,200); delay(500); carAdvance(180,180); // c='A'; break; case 'R': carTurnRight(200,200); delay(500); carAdvance(180,180); // c='A'; break; case 'G': digitalWrite(greenLaserPin,HIGH);// 实际接3.3V电源,防止绿光灯烧毁 break; case'E': // 长按APK LASER5 火力全开! digitalWrite(greenLaserPin,HIGH); digitalWrite(redLaser1Pin,HIGH); digitalWrite(redLaser2Pin,HIGH); digitalWrite(redLaser3Pin,HIGH); digitalWrite(redLaser4Pin,HIGH); break; case'C': digitalWrite(greenLaserPin,LOW); digitalWrite(redLaser1Pin,LOW); digitalWrite(redLaser2Pin,LOW); digitalWrite(redLaser3Pin,LOW); digitalWrite(redLaser4Pin,LOW); break; case 'H': SweepHorizontal0_180(); break; case 'V': SweepVertical60_180(); break; case 'F': frontLocation(); break; case 'D': frontDownLocation(); break; case 'U': upLocation(); break; case 'Z': leftLocation(); break; case 'Y': rightLocation(); break; default: carAdvance(180,180); // delay(50); break; } } } ////////////////////////////////////// ////////////////////////////////////// void carStop(){ // Motor Stop digitalWrite(speedPin_M2,0); digitalWrite(directionPin_M1,LOW); digitalWrite(speedPin_M1,0); digitalWrite(directionPin_M2,LOW); } ////////////////////////////// void carAdvance(int leftSpeed,int rightSpeed){ // Move forward analogWrite (speedPin_M2,leftSpeed); // PWM Speed Control digitalWrite(directionPin_M1,HIGH); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M2,HIGH); } ///////////////////////////// void carBack(int leftSpeed,int rightSpeed){ // Move backward analogWrite (speedPin_M2,leftSpeed); digitalWrite(directionPin_M1,LOW); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M2,LOW); } ///////////////////////////////// void carTurnRight(int leftSpeed,int rightSpeed){ // Turn Right analogWrite (speedPin_M2,leftSpeed); digitalWrite(directionPin_M1,LOW); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M2,HIGH); } ////////////////////////////// void carTurnLeft(int leftSpeed,int rightSpeed){ //Turn Left analogWrite (speedPin_M2,leftSpeed); digitalWrite(directionPin_M1,HIGH); analogWrite (speedPin_M1,rightSpeed); digitalWrite(directionPin_M2,LOW); } //////////////////////////////// void SweepHorizontal0_180(){ // H 使摄像机垂直,水平扫描0-180范围 smoothAngle(95,0); // 先平滑过渡到初始位置;使两个舵机平滑地到达初始角度的位置95,0 // 依据实际安装情况而调整的角度(如 95),以使摄像机垂直小车面 for (int pos = 0; pos <= 180; pos += 1) { // in steps of 1 degree servoOfDown.write(pos); delay(20); } for (int pos = 180; pos >= 0; pos -= 1) { servoOfDown.write(pos); delay(20); } smoothAngle(95,90); // 扫描后恢复为正前方位置 } ///////////////////////// void SweepVertical60_180(){ // V 使摄像机从“朝向”正前方地面到“抬头望天顶”范围扫描120度 smoothAngle(60,90); // 上舵机初始位置60,下舵机初始位置定位于90 for ( int pos = 60; pos <= 180; pos += 1) { // in steps of 1 degree servoOfUp.write(pos); delay(20); } for (int pos = 180; pos >= 60; pos -= 1) { servoOfUp.write(pos); delay(20); } smoothAngle(95,90); // 垂直扫描后恢复为正前方位置 } ////////////////////////////// void frontDownLocation(){ // D 使摄像机定住“朝向”正前下方地面 smoothAngle(60,90); // 平滑过渡到目标位置;110使摄像机镜头朝向前倾角度 } ////////////////////////////// void frontLocation(){ // F 使摄像机定住“朝向”正前方 smoothAngle(95,90); // 平滑过渡到目标位置;使摄像机镜头保持垂直小车面 } ////////////////////////////// void upLocation(){ // U 使摄像机定住“朝向”天顶 smoothAngle(180,90); // 平滑过渡到目标位置 } ////////////////////////////// void leftLocation(){ // Z 使摄像机定住“朝向”小车正左方向 smoothAngle(95,180); // 平滑过渡到目标位置 } ////////////////////////////// void rightLocation(){ // Y 使摄像机定住“朝向”小车正右方向 smoothAngle(95,0); // 平滑过渡到目标位置 } ///////////////////////////////////////////////////////////////////////////////////// void smoothAngle(int iniAngleOfUp,int iniAngleOfDown) // 平滑处理上下两个舵机到达初始目标位置参数 { int nowAngleOfUp = servoOfUp.read(); // 读出当前两个舵机的位置角度 int nowAngleOfDown = servoOfDown.read(); if(nowAngleOfDown < iniAngleOfDown ) // 下舵机平滑过渡到初始目标位置角度 iniAngleOfDown { for(int i = nowAngleOfDown; i <= iniAngleOfDown;i++) { servoOfDown.write(i); delay(20); } }else { for(int i = nowAngleOfDown; i >= iniAngleOfDown;i--) { servoOfDown.write(i); delay(20); } } // end if //--------------------------------------------------------- if(nowAngleOfUp < iniAngleOfUp ) // 上舵机平滑过渡到初始目标位置角度 iniAngleOfUp { for(int i = nowAngleOfUp; i <= iniAngleOfUp;i++) { servoOfUp.write(i); delay(20); } }else { for(int i = nowAngleOfUp; i >= iniAngleOfUp;i--) { servoOfUp.write(i); delay(20); } } // end if } ///////////////////////////////////////////////////////////////[/mw_shl_code] 五、利用可视化编程环境APPINVENTOR开发的人类控制机器人的手机控制器 根据蓝牙通讯的ARDUINO代码指令去开发安卓手机APP 安装名称:激光机器人控制器【APKLaser_robot02.zip】 打开APP如下: 最上面是手机蓝牙与机器人蓝牙模块连接; 红色部分是控制电机(机器人)运动; 【安全警报】英文部分三键均必须“长按”操作 【防止小朋友误操作伤眼】: 打开1个绿激光头、打开5个激光头、关闭激光头; 英文下面是两自由度云台操作。 手机操控,夜晚试了下光路,实际效果佳 悟: 核心是创意【永远保持好奇心】; 难点是代码及调试【每一个电子积木搞透】; 其它都不是事【再见】 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed