本帖最后由 gada888 于 2022-4-19 14:32 编辑  
 
做了个小车。游戏手柄控制,远距离遥控。除了能用遥杆控制小车的左右转和前进,停止外,还能通过遥控扩展板上的那四个按钮控制一个伺服,一个镭射灯和额外两个马达。这个小车是外表和普通小车差不多,但是本意是做个Tank的。之所以还不是Tank。是因为炮塔因为各种原因还没到货。而代码是写来驱动Tank的。这个贴文讲小车的基本功能。遥杆的上是前进,下是停止,左是左转,右是右转。而开炮部分不做解释。有兴趣的可以看看代码。里面都涵盖了。 
 
问:为什么用HC12遥控模块。 
因为这个模块控制的距离远达1KM. 
问:为什么用遥控扩展模块而不是蓝牙什么的 
因为1.不用担心掉在地上摔坏,2,提供了足够多的8个按键。 
 
 
  
 
 
 
一-先奉上照片一览 
全家福 
  
发射端的帅照 
  
接收端的帅照 
  
 
二-硬件清单 
|  序号 |  产品名称 |  数量 |  备注和链接 |  |  1 |  Arduino uno |  1 |    |  |  2 |  arduuino nano |  1 |    |  |  3 |  nano扩展板 |  1 |    |  |  4 |  HC12 |  2 |    |  |  5 |  小车底盘 |  1 |    |  |  6 |  L298N电机驱动 |  1 |    |  |  7 |  joystick module |  1 |    |  |  8 |  36CM车轮 | 2  |    |  |  9 |  小车前轮 |  1 |    |  |  10 |  直流电机 |  2 |    |  |  11 |  7.4V锂电池 |  2 |    |   三-下面重点说一下无线模块 
 
  
  
  
  
  
  
重点:HC12因为是串口模块。调试其实很方便。发射端手动发射信号时候,你观察接收端主控,我这里是arduino nano。主控的信号led会亮。这就表示接受到了信号。我没使用AT指令,嫌麻烦。 
 
四-接线图 
 
1.发射端接线图 
  
2.接收端接线图 
  
 
五,代码部分。 
代码内容只是对重点部分有做了注释,虽然两段代码一共200多行。但其实涵盖很多基础内容。堪称一个项目半本书。 
 
  
 
发射端代码 
			
			
			- /*这个炮车程序由gada888于2022-04-18原创首发于DFRobot论坛,如需转载请注明来源。谢谢*/
 - 
 - #define joyX A0
 - #define joyY A2
 - int up_button     = 2; // btn- A
 - int down_button   = 4; // btn - C 
 - int left_button   = 5; // btn - D 
 - int right_button  = 3; // btn - B
 - int xValue = 0;
 - int yValue = 0;
 - int Value = 0;
 - int buttons[]={up_button, down_button,left_button,right_button};
 - //=============RUN ONCE AREA==========
 - void setup()   
 - {
 -    for(int i; i <4 ; i++)
 -      {
 -       pinMode(buttons[i],INPUT);
 -       digitalWrite(buttons[i],HIGH);  
 -      } 
 - 
 -   Serial.begin(9600);
 - }
 - //==========LOOPING AREA==============
 - void loop()  
 - {
 -  int xValue = analogRead(joyX);
 -  int yValue = analogRead(joyY);
 - 
 -    if (xValue < 10) 
 -   {
 -    Serial.write(45); 
 -    delay(500);
 -   }
 -     if (xValue > 1000)
 -   {
 -     Serial.write(46);
 -     delay(500);
 -   }
 -   if (yValue < 10)
 -   {
 -     Serial.write(47);
 -     delay(500);
 -   }
 -   if (yValue > 1000) 
 -   {
 -     Serial.write(48);
 -     delay(500);
 -   }
 -    if(digitalRead(up_button)==LOW){
 -     Serial.write(49);
 -     delay(500);
 -    }
 -    if(digitalRead(down_button)==LOW)
 -    {
 -     Serial.write(50);
 -     delay(500);
 -    }
 -    if(digitalRead(left_button)==LOW)
 -    {
 -     Serial.write(51);
 -     delay(500);
 -    }
 -    if(digitalRead(right_button)==LOW)
 -    {
 -     Serial.write(52);
 -     delay(500);
 -    }
 -   }
 
  复制代码 接收端代码 
- /*这个炮车程序由gada888于2022-04-18原创首发于DFRobot论坛,如需转载请注明来源。谢谢*/
 - 
 - #include<Servo.h> 
 - //定义用于控制引脚的引脚,IN_1,IN_2以及IN_3,IN_4分别是电机1和电机2的正反转脚。
 - int IN_1 = 4;
 - int IN_2 = 5;
 - int IN_3 = 6;
 - int IN_4 = 7;
 - const int laserPin = 8;
 - const int gun1Pin = 10;
 - const int gun2Pin = 11;
 - 
 - Servo esc;
 - int byteRead;
 - //==========RUN ONCE AREA=========
 - void setup() {
 -   esc.attach(9);
 -   pinMode(IN_1, OUTPUT);
 -   pinMode(IN_2, OUTPUT);
 -   pinMode(IN_3, OUTPUT);
 -   pinMode(IN_4, OUTPUT);
 -   pinMode(laserPin, OUTPUT);
 -   pinMode(gun1Pin, OUTPUT);
 -   pinMode(gun2Pin, OUTPUT);
 -  
 -   Serial.begin(9600);      // start Serial
 -   //delay(3000);
 - }
 - //==========RUN FOREVER AREA============
 - void loop() {
 - while(Serial.available()) {        // If Serial module has data
 -     byteRead = Serial.read();
 -       Serial.print(byteRead);   //data to Serial monitor
 -     if (byteRead==45) { //received number 1
 -       motorB('L');
 -     }else if (byteRead==46){
 -       motorB('R');
 -     }else if (byteRead==47){
 -       motorB('P');
 -     }else if (byteRead==48){
 -       motorB('F');
 -     }else if (byteRead==49){
 -      esc.write(90);
 -      delay(500);
 -     }else if (byteRead==50){
 -      digitalWrite(laserPin, HIGH);
 -     }else if (byteRead==51){
 -      digitalWrite(laserPin, LOW);
 -     }else if (byteRead==52){
 -      digitalWrite(gun1Pin, HIGH);
 -      digitalWrite(gun2Pin, HIGH);
 -      delay(500);
 -    }
 -  }
 - }
 - //==========FUNCTION AREA=================
 - void motorB(char d){
 -     if(d =='L'){
 -     // Turn left motor on 
 -       digitalWrite(IN_1, HIGH);
 -       digitalWrite(IN_2, LOW); 
 -     }
 -     else if(d =='R'){
 -     // Turn right motor on,这里实际应该用电机2做右转的,但因为电机2转的慢。改用了电机1来完成。
 -       digitalWrite(IN_1, LOW);
 -       digitalWrite(IN_2, HIGH);   
 -     }
 -     else if(d =='P'){
 -     // Turn both motors OFF      
 -      digitalWrite(IN_1, LOW);
 -      digitalWrite(IN_2, LOW); 
 -      digitalWrite(IN_3, LOW);
 -      digitalWrite(IN_4, LOW);
 -     } 
 -     else if(d =='F'){
 -     // Turn both motors Forward      
 -      digitalWrite(IN_1, HIGH);
 -      digitalWrite(IN_4, HIGH);
 -     }  
 -   }
 
  复制代码
  
 
 
 
 
 
 
 
 
 
 
 |