14318浏览
查看: 14318|回复: 3

[项目] 自制手机App控制Wifi视频车

[复制链接]
IMG_20220123_210103.jpg

很久之前买的一个Arduino—Wifi视频车,手机App在我的手机上不能用了。我决定自己重新用MIT App Inventor2编写一个上位机。下面简单记录一下整个过程。

【Wifi视频车结构】


IMG_20220123_155709.jpg


SunJanuary-202201233062..png

注意事项:
1、Wifi模块占用了Arduino的TX、RX引脚,所以给Arduino下载程序时要拔下。
2、扩展板上有个主开关,被拆并用热熔胶粘住,如松了无电。
3、视频http地址:http://192.168.1.1:8080/?action=stream
4、TCP控制IP地址:192.168.1.1,端口:2001
5、Wifi路由地址:192.168.1.1,连接上Wifi模块AP热点,修改ssid为robots

【扩展板】
SunJanuary-202201231681..png
扩展板电机与Arduino引脚对应关系:
5引脚电机1使能,6引脚电机2使能。 7引脚, 8引脚电机1接口,12引脚,13引脚电机2接口。
【Arduino程序】

通信协议:

前进:FF000100FF
后退:FF000200FF
左转:FF000300FF
右转:FF000400FF
停止:FF000500FF

舵机水平:FF0101(角度)FF
舵机垂直:FF0102(角度)FF

调速左轮:FF0201(速度)FF
调速右轮:FF0202(速度)FF
调速两轮:FF0203(速度)FF

  1. #include <Servo.h>
  2. Servo servoX;
  3. Servo servoY;
  4. #define BAUDRATE 9600
  5. #define ENA  5    //MOTO_A PMW
  6. #define IN1  7
  7. #define IN2  8
  8. #define ENB  6    //MOTO_B PMW
  9. #define IN3  12
  10. #define IN4  13
  11. void carGoFwd()
  12. {
  13.   digitalWrite(IN1,HIGH);
  14.   digitalWrite(IN2,LOW);
  15.   digitalWrite(IN3,HIGH);
  16.   digitalWrite(IN4,LOW);
  17.   //Serial.print("forward");
  18.   delay(5);
  19. }
  20. void carGoBwd()
  21. {
  22.   digitalWrite(IN1,LOW);
  23.   digitalWrite(IN2,HIGH);
  24.   digitalWrite(IN3,LOW);
  25.   digitalWrite(IN4,HIGH);
  26.   //Serial.print("Backward");
  27.   delay(5);
  28. }
  29. void carTurnL()
  30. {
  31.   digitalWrite(IN1,HIGH);
  32.   digitalWrite(IN2,LOW);
  33.   digitalWrite(IN3,LOW);
  34.   digitalWrite(IN4,HIGH);
  35.   //Serial.print("TurnL");
  36.   delay(5);
  37. }
  38. void carTurnR()
  39. {
  40.   digitalWrite(IN1,LOW);
  41.   digitalWrite(IN2,HIGH);
  42.   digitalWrite(IN3,HIGH);
  43.   digitalWrite(IN4,LOW);
  44.   //Serial.print("TurnR");
  45.   delay(5);
  46. }
  47. void carStop()
  48. {
  49.   digitalWrite(IN1,LOW);
  50.   digitalWrite(IN2,LOW);
  51.   digitalWrite(IN3,LOW);
  52.   digitalWrite(IN4,LOW);
  53.   //Serial.print("carStop");
  54.   delay(5);
  55. }
  56. //CAR SPEED
  57. void CHNSpeed(int wheelDIR, int wheelSpeed)
  58. {
  59.   // Serial.print("CHNSpeed");
  60.   int pwm = 100+wheelSpeed;
  61.   if(wheelDIR == 0X01) //LEFT WHEEL
  62.   {
  63.     analogWrite(ENA,pwm);
  64.   }
  65.   else if(wheelDIR == 0X02) //RIGHT WHEEL
  66.   {
  67.     analogWrite(ENB,pwm);
  68.   }
  69.   else if(wheelDIR == 0X03) //RIGHT WHEEL
  70.   {
  71.     analogWrite(ENA,pwm);
  72.     analogWrite(ENB,pwm);
  73.   }
  74. }
  75. //SERVO TURN
  76. void servoSet(int servoNum, int pos)
  77. {
  78.   //Serial.print("servoSet:");
  79.   //Serial.println(pos);
  80.   if(pos > 180) pos = 160;
  81.   else if(pos < 0) pos = 0;
  82.   switch(servoNum)
  83.   {
  84.     case 0X01:
  85.     servoX.write(pos);
  86.     //Serial.print("X:");
  87.     //Serial.print(pos);
  88.     break;
  89.     case 0X02:
  90.     servoY.write(pos);
  91.     //Serial.print("Y:");
  92.     //Serial.print(pos);
  93.     break;
  94.   }
  95. }
  96. #define UART_FLAG 0XFF
  97. #define MOTO 0X00
  98. #define SERVO 0X01
  99. #define MOTOSPEED 0X02
  100. #define FORWARD 0X01 //MOTO COMMAND
  101. #define BACKWARD 0X02
  102. #define TURNLEFT 0X03
  103. #define TURNRIGHT 0X04
  104. #define CARSTOP 0X05
  105. int n = 1;
  106. int flagCount = 0;
  107. int tempData = 0;
  108. int UARTReveived = 0;
  109. int rxData[5];
  110. void setup() {
  111.   // put your setup code here, to run once:
  112.   Serial.begin(BAUDRATE);//SERIAL INIT
  113.   analogWrite(ENA,150);//INIT MOTOSPEED
  114.   analogWrite(ENB,150);
  115.   pinMode(IN1, OUTPUT);//DEFINE MOTO PINS MODE
  116.   pinMode(IN2, OUTPUT);
  117.   pinMode(IN3, OUTPUT);
  118.   pinMode(IN4, OUTPUT);
  119.   servoX.attach(9);//定义舵机控制口
  120.   servoY.attach(10);
  121.   servoX.write(90);//输出舵机初始位置为90度
  122.   servoY.write(90);//输出舵机初始位置为90度
  123.   carGoFwd();
  124.   delay(2000);
  125.   carStop();
  126. }
  127. void loop() {
  128.   // put your main code here, to run repeatedly:
  129. if(Serial.available())
  130.   {
  131.      tempData = Serial.read();
  132.      //Serial.println(tempData);
  133.     delay(3);
  134.     if(tempData == UART_FLAG && flagCount < 2)
  135.     {
  136.       rxData[0] = tempData;
  137.       flagCount++;
  138.     }
  139.     else
  140.     {
  141.       rxData[n] = tempData;
  142.       n++;
  143.     }
  144.     if(flagCount == 2)
  145.     {
  146.       rxData[4] == UART_FLAG;
  147.       UARTReveived = 1;
  148.       n = 1;
  149.       flagCount = 0;
  150.       tempData = 0;
  151.       Serial.flush();
  152.     }
  153.   }
  154.   if(UARTReveived == 1)
  155.   {
  156.     if(rxData[1] == MOTO)
  157.     {
  158.        switch(rxData[2])
  159.        {
  160.          case FORWARD:
  161.          carGoFwd();
  162.          break;
  163.          case BACKWARD:
  164.          carGoBwd();
  165.          break;
  166.          case TURNLEFT:
  167.          carTurnL();
  168.          break;
  169.          case TURNRIGHT:
  170.          carTurnR();
  171.          break;
  172.          case CARSTOP:
  173.          carStop();
  174.          break;
  175.        }
  176.        UARTReveived = 0;
  177.     }
  178.     else if(rxData[1] == SERVO)
  179.     {
  180.       servoSet(rxData[2], rxData[3]);
  181.       UARTReveived = 0;
  182.     }
  183.     else if(rxData[1] == MOTOSPEED)
  184.     {
  185.       CHNSpeed(rxData[2], rxData[3]);
  186.       UARTReveived = 0;
  187.     }
  188.   }
  189.    
  190.   
  191. }
复制代码


注意:Serial.print()会对串口数据接收造成干扰,慎用!


【手机App】

IMG_20220123_210115_edit_56769094684566.jpg

1、需要用到两个扩展:(1)wifi扩展——用于程序初始化时,直接连接Wifi热点。(2)TCP扩展——向Wifi模块发送指令
app_invertor.zip (50.42 KB, 下载次数: 49)

阿邱  学徒

发表于 2022-2-16 17:52:20

冒昧一问,摄像头怎么连接的?
回复

使用道具 举报

云天  高级技匠
 楼主|

发表于 2022-2-16 21:04:52

阿邱 发表于 2022-2-16 17:52
冒昧一问,摄像头怎么连接的?

摄像头连接到WIFI模块,模块上有USB接口。
回复

使用道具 举报

阿邱  学徒

发表于 2022-2-18 16:33:11

云天 发表于 2022-2-16 21:04
摄像头连接到WIFI模块,模块上有USB接口。

谢谢了
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail