当前位置:   article > 正文

基于 Arduino和WiFi 远程控制小车加机械臂_在遥控车上加一个机械臂

在遥控车上加一个机械臂

 花了两周的时间的,和同学一起做了一个遥控小车,上面又加了一个机械臂。总之收获颇丰。

设计使用了一个Arduino UNO 开发板,四个舵机,一个DT-06 TTL WiFi模块,一个L298N电机驱动板(红板) ,两个电机。和机械臂的支架,小车框架等。小车是两轮驱动的,后轮是一个万向轮。机械臂是四自由的。本来我们的Arduino是有扩展板的,但是坏了,然后我们又不想再买,就将这一个arduino开发板插满了。拿了咱们平常用的充电宝给整个设计供电。

实物图如下:

代码如下:

  1. #include <Servo.h>
  2. //--------------------------------------------------舵机引脚
  3. #define PIN_SERV7 7 //舵机号(IO口)
  4. #define PIN_SERV8 8 //舵机号(IO口)
  5. #define PIN_SERV9 9 //舵机号(IO口)
  6. #define PIN_SERV10 10 //舵机号(IO口)
  7. //--------------------------------------------------小车引脚
  8. #define input1 3 // 定义uno的pin 3 向 input1 输出
  9. #define input2 4 // 定义uno的pin 4 向 input2 输出----//3、4引脚控制左轮
  10. #define input3 5 // 定义uno的pin 5 向 input3 输出
  11. #define input4 6 // 定义uno的pin 6 向 input4 输出----//5、6引脚控制右轮
  12. //-----------------------------------------------------------------------------------
  13. //两驱动小车
  14. Servo myservo_7, myservo_8, myservo_9, myservo_10;
  15. //----------------------小车控制函数--------------------------------------------------
  16. char Forward() //前进
  17. {
  18. digitalWrite(input1, HIGH); //给高电平1
  19. digitalWrite(input2, LOW); //给低电平0
  20. digitalWrite(input3, HIGH); //给高电平1
  21. digitalWrite(input4, LOW); //给低电平0
  22. while(1)
  23. {
  24. if(Serial.available()) // 如果要选择新的模式:逆时针转,停止
  25. {
  26. Serial.println(Serial.available());
  27. char mode = Serial.read();
  28. Stop();
  29. return mode; // 返回新的指令
  30. }
  31. }
  32. }
  33. char Backward() //后退
  34. {
  35. digitalWrite(input1, LOW);
  36. digitalWrite(input2, HIGH);
  37. digitalWrite(input3, LOW);
  38. digitalWrite(input4, HIGH);
  39. while(1)
  40. {
  41. if(Serial.available()) // 如果要选择新的模式:逆时针转,停止
  42. {
  43. Serial.println(Serial.available());
  44. char mode = Serial.read();
  45. Stop();
  46. return mode; // 返回新的指令
  47. }
  48. }
  49. }
  50. void Stop()//------------------停止
  51. {
  52. digitalWrite(input1, LOW);
  53. digitalWrite(input2, LOW);
  54. digitalWrite(input3, LOW);
  55. digitalWrite(input4, LOW);
  56. }
  57. char TurnRight()//-------------右转
  58. {
  59. digitalWrite(input1, HIGH);
  60. digitalWrite(input2, LOW);
  61. digitalWrite(input3, HIGH);
  62. while(1)
  63. {
  64. digitalWrite(input4, LOW);
  65. delay(80);
  66. digitalWrite(input4, HIGH);
  67. delay(20);
  68. if(Serial.available()) // 如果要选择新的模式:逆时针转,停止
  69. {
  70. Serial.println(Serial.available());
  71. char mode = Serial.read();
  72. Stop();
  73. return mode; // 返回新的指令
  74. }
  75. }
  76. }
  77. char TurnLeft()//--------------左转
  78. {
  79. digitalWrite(input2, LOW);//左轮
  80. digitalWrite(input3, HIGH);//右轮
  81. digitalWrite(input4, LOW);
  82. while(1)
  83. {
  84. digitalWrite(input1, HIGH);
  85. delay(80);
  86. digitalWrite(input1, LOW);
  87. delay(20);
  88. if(Serial.available()) // 如果要选择新的模式:逆时针转,停止
  89. {
  90. Serial.println(Serial.available());
  91. char mode = Serial.read();
  92. Stop();
  93. return mode; // 返回新的指令
  94. }
  95. }
  96. }
  97. //------------------------舵机控制函数-------------------------------------------------
  98. char clockwise(Servo myservo, int stop_angle=0) //顺时针 角度减小 后 下 抓 顺
  99. { // 2, 4, 5, 7
  100. int start_angle = myservo.read();//读取舵机目前角度
  101. for(int i=start_angle; i>stop_angle; i--)
  102. {
  103. myservo.write(i); //使舵机转动至指定角度
  104. delay(30);
  105. if(Serial.available()) // 如果要选择新的模式:逆时针转,停止
  106. {
  107. Serial.println(Serial.available());
  108. char mode = Serial.read();
  109. return mode; // 返回新的指令
  110. }
  111. }
  112. return '9';
  113. }
  114. char anticlockwise(Servo myservo, int stop_angle=180)//逆时针 角度增大 前 上 放 逆
  115. { // 1, 3, 6, 8
  116. int start_angle = myservo.read(); //读取舵机目前角度
  117. for(int i=start_angle; i<stop_angle; i++)
  118. {
  119. myservo.write(i);
  120. delay(30);
  121. if(Serial.available()) // 如果要选择新的模式:顺时针转,停止
  122. {
  123. Serial.println(Serial.available());
  124. char mode = Serial.read();
  125. return mode;
  126. }
  127. }
  128. return '9';
  129. }
  130. //-----------------------------------------------------------------------------------
  131. void setup()
  132. {
  133. Serial.begin(9600); //初始化串口
  134. myservo_7.attach(PIN_SERV7);// 将Servo变量附加到引脚,将7号引脚设置为7号舵机控制端口
  135. myservo_8.attach(PIN_SERV8);
  136. myservo_9.attach(PIN_SERV9);
  137. myservo_10.attach(PIN_SERV10);
  138. pinMode(input1, OUTPUT);//小车串口设置为输出模式
  139. pinMode(input2, OUTPUT);
  140. pinMode(input3, OUTPUT);
  141. pinMode(input4, OUTPUT);
  142. }
  143. //-----------------------------------------------------------------------------------
  144. void loop()
  145. {
  146. if(Serial.available()) // 等待接收控制信号(非阻塞)
  147. {
  148. Serial.print("read words: ");
  149. Serial.println(Serial.available());
  150. char mode_9g = Serial.read(); // 读取模式选择指令
  151. int jump=1;
  152. while(1)
  153. {
  154. switch(mode_9g)
  155. {
  156. case '1': //-----前 角度增大
  157. {
  158. mode_9g = anticlockwise(myservo_8);// 93/110 --> 180
  159. break;
  160. }
  161. case '2': //-----后 角度减小
  162. {
  163. mode_9g = clockwise(myservo_8, 110);// 180 --> 110
  164. break;
  165. }
  166. case '3': //-----上 角度增大
  167. {
  168. mode_9g = anticlockwise(myservo_9);// 93/65/80 -->180
  169. break;
  170. }
  171. case '4': //-----下 角度减小
  172. {
  173. int zz=myservo_8.read();
  174. if (zz>115)
  175. mode_9g = clockwise(myservo_9, 65);// 180 --> 65
  176. else
  177. mode_9g = clockwise(myservo_9, 85);// 93/180 --> 80
  178. break;
  179. }
  180. case '5': //-----抓 角度减小
  181. {
  182. mode_9g = clockwise(myservo_10,90);// 93/180 --> 90
  183. break;
  184. }
  185. case '6': //-----放 角度增大
  186. {
  187. mode_9g = anticlockwise(myservo_10);// 93/85 --> 180
  188. break;
  189. }
  190. case '7': //-----底座右转(顺) 角度减小
  191. {
  192. mode_9g = clockwise(myservo_7); // 93/180 --> 0
  193. break;
  194. }
  195. case '8': //----底座左转(逆) 角度增大
  196. {
  197. mode_9g = anticlockwise(myservo_7);// 93/0 --> 180
  198. break;
  199. }
  200. case 'a': //左转
  201. {
  202. mode_9g = TurnLeft();
  203. break;
  204. }
  205. case 'w': //前进
  206. {
  207. mode_9g = Forward();
  208. break;
  209. }
  210. case 'd': //右转
  211. {
  212. mode_9g = TurnRight();
  213. break;
  214. }
  215. case 's': //后退
  216. {
  217. mode_9g = Backward();
  218. break;
  219. }
  220. case 'p': //停止
  221. {
  222. Stop();
  223. jump = 0;
  224. break;
  225. }
  226. default:
  227. {
  228. if(mode_9g=='9') // 模式 9 结束转动 或 因转到极限位置而停止
  229. Serial.println("over");
  230. else
  231. Serial.println("Input error");
  232. jump = 0;
  233. Stop();
  234. break;
  235. }
  236. }
  237. if (jump==0)//跳出 while 以接收新的模式指令
  238. {
  239. break;
  240. }
  241. }
  242. }
  243. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/1013094
推荐阅读
相关标签
  

闽ICP备14008679号