本帖最后由 云天 于 2023-10-1 13:23 编辑  
 
 
 
【项目背景】 
 
 
最近在DF商城发现一款主板Arduino Nano ESP32开发板, Arduino Nano ESP32: 小巧便携,功能强大。集成了Arduino和ESP32的优势,支持WiFi和蓝牙通信,适用于物联网和智能设备开发,Arduino Nano ESP32将Arduino品牌的易用性和支持与ESP32-S3的强大功能。 
 
个人认为设备特点:1.输入标准电压:5~18V DC。2.USB连接:USB-C。3.支持WiFi和低功耗蓝牙 
【项目设计】 
1.本体感遥控车,通过Arduino Nano ESP32的低功耗蓝牙实现与手机APP进行无线连接通信。 
2.Arduino Nano ESP32主控编程使用Arduino IDE。 
3.手机APP编写使用WxBit的App Inventor2图形化编程。 
4.电机使用“金属齿轮减速电机 减速比30:1” 
5.电机驱动模块使用“微型双路1.5A直流电机驱动模块” 
6.供电电源使用2个9V无汞电池。 
7.电路板使用嘉立创免费打板。 
【电路板】 
 
 
 
 
 
【硬件组装】 
1.焊接电机、电源排针,主控排母 
 
2.焊接电机杜邦线 
 
3.安装主控、电机驱动模块、电机 
 
4.安装电源 
 
 
【编写手机APP】 
1.界面设计 
 
 
2.逻辑设计 
首先通过蓝牙扫描,找到名称为“UART Service”(Arduino IDE编程设置)的蓝牙地址。找到后修改程序——蓝牙扫描找到设备后对蓝牙地址进行检查,如匹配进行连接。 
 
发送数据时,填写服务UUID及特征UUID(Arduino IDE编程设置) 
 
完整程序 
 
 
【Arduino Nano ESP32主控编程】 
1.测试电机驱动模块,确定电机转动方向 
			
			
			- 
 - void setup() {
 -   // initialize digital pin LED_BUILTIN as an output.
 -   pinMode(LED_BUILTIN, OUTPUT);
 -   pinMode(D2, OUTPUT);
 -   pinMode(D3, OUTPUT);
 -   pinMode(D4, OUTPUT);
 -   pinMode(D5, OUTPUT);
 - }
 - 
 - // the loop function runs over and over again forever
 - void loop() {
 -   //正转
 -   digitalWrite(D2,LOW); 
 -   analogWrite(D3, 50); 
 -   digitalWrite(D5,LOW); 
 -   analogWrite(D4, 50); 
 -   delay(5000); 
 - 
 -   digitalWrite(D2,LOW); 
 -   analogWrite(D3, 0); 
 -   digitalWrite(D5,LOW); 
 -   analogWrite(D4, 0); 
 -   delay(5000); 
 - 
 -   //反转
 -   digitalWrite(D3,LOW); 
 -   analogWrite(D2, 50); 
 -   digitalWrite(D4,LOW); 
 -   analogWrite(D5, 50); 
 -   delay(5000); 
 -   digitalWrite(D3,LOW); 
 -   analogWrite(D2, 0); 
 -   digitalWrite(D4,LOW); 
 -   analogWrite(D5, 0); 
 -   delay(5000);         
 - }
 
  复制代码
  
 
2.蓝牙连接测试 
复制代码
  
3.蓝牙连接与电机控制结合(完整程序) 
- 
 - 
 - #include <BLEDevice.h>
 - #include <BLEServer.h>
 - #include <BLEUtils.h>
 - #include <BLE2902.h>
 - 
 - BLEServer *pServer = NULL;
 - BLECharacteristic * pTxCharacteristic;
 - bool deviceConnected = false;
 - bool oldDeviceConnected = false;
 - uint8_t txValue = 0;
 - uint8_t bs = 0;
 - // See the following for generating UUIDs:
 - // [url]https://www.uuidgenerator.net/[/url]
 - 
 - #define SERVICE_UUID           "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
 - #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
 - #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
 - 
 - 
 - class MyServerCallbacks: public BLEServerCallbacks {
 -     void onConnect(BLEServer* pServer) {
 -       deviceConnected = true;
 -     };
 - 
 -     void onDisconnect(BLEServer* pServer) {
 -       deviceConnected = false;
 -     }
 - };
 - 
 - class MyCallbacks: public BLECharacteristicCallbacks {
 -     void onWrite(BLECharacteristic *pCharacteristic) {
 -       std::string rxValue = pCharacteristic->getValue();
 -       int speed=80;
 -       if (rxValue.length() > 0) {
 -         if (rxValue[0]=='G'){
 -           bs=1;
 -           GO(speed);
 -         }
 -         if (rxValue[0]=='L'){
 -           bs=1;
 -           LEFT(speed);
 -         }
 -         if (rxValue[0]=='R'){
 -           bs=1;
 -           RIGHT(speed);
 -         }
 -         if (rxValue[0]=='B'){
 -           bs=2;
 -           BACK(speed);
 -         }
 -         if (rxValue[0]=='S'){
 -           if(bs==1){
 -           STOPG();
 -           }
 -           if(bs==2){
 -           STOPB();
 -           }
 -         }
 -       }
 -     };
 -     void GO(int speed){
 -     //正转
 -        digitalWrite(D2,LOW); 
 -        analogWrite(D3, speed); 
 -        digitalWrite(D5,LOW); 
 -        analogWrite(D4, speed+50); 
 -      };
 -      void LEFT(int speed){
 -     //左转
 -        digitalWrite(D2,LOW); 
 -        analogWrite(D3, speed); 
 -        digitalWrite(D5,LOW); 
 -        analogWrite(D4, 0); 
 -      };
 -      void RIGHT(int speed){
 -     //右转
 -        digitalWrite(D2,LOW); 
 -        analogWrite(D3, 0); 
 -        digitalWrite(D5,LOW); 
 -        analogWrite(D4, speed); 
 -      };
 -      void BACK(int speed){
 -     //反转
 -        digitalWrite(D3,LOW); 
 -        analogWrite(D2, speed); 
 -        digitalWrite(D4,LOW); 
 -        analogWrite(D5, speed+50); 
 -      };
 - 
 -      void STOPG(){
 -        //停止前进
 -        digitalWrite(D2,LOW); 
 -        analogWrite(D3, 0); 
 -        digitalWrite(D5,LOW); 
 -        analogWrite(D4, 0); 
 -      };
 -      void STOPB(){
 -        //停止后退
 -        digitalWrite(D3,LOW); 
 -        analogWrite(D2, 0); 
 -        digitalWrite(D4,LOW); 
 -        analogWrite(D5, 0); 
 -      };
 - };
 - 
 - 
 - void setup() {
 -   Serial.begin(115200);
 - 
 -   // Create the BLE Device
 -   BLEDevice::init("UART Service");
 - 
 -   // Create the BLE Server
 -   pServer = BLEDevice::createServer();
 -   pServer->setCallbacks(new MyServerCallbacks());
 - 
 -   // Create the BLE Service
 -   BLEService *pService = pServer->createService(SERVICE_UUID);
 - 
 -   // Create a BLE Characteristic
 -   pTxCharacteristic = pService->createCharacteristic(
 -                                                                                 CHARACTERISTIC_UUID_TX,
 -                                                                                 BLECharacteristic::PROPERTY_NOTIFY
 -                                                                         );
 -                       
 -   pTxCharacteristic->addDescriptor(new BLE2902());
 - 
 -   BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
 -                                                                                          CHARACTERISTIC_UUID_RX,
 -                                                                                         BLECharacteristic::PROPERTY_WRITE
 -                                                                                 );
 - 
 -   pRxCharacteristic->setCallbacks(new MyCallbacks());
 - 
 -   // Start the service
 -   pService->start();
 - 
 -   // Start advertising
 -   pServer->getAdvertising()->start();
 -   Serial.println("Waiting a client connection to notify...");
 - 
 -   pinMode(D2, OUTPUT);
 -   pinMode(D3, OUTPUT);
 -   pinMode(D4, OUTPUT);
 -   pinMode(D5, OUTPUT);
 - }
 - 
 - void loop() {
 - 
 -     if (deviceConnected) {
 -         pTxCharacteristic->setValue(&txValue, 1);
 -         pTxCharacteristic->notify();
 -         txValue++;
 -                 delay(10); // bluetooth stack will go into congestion, if too many packets are sent
 -         }
 - 
 -     // disconnecting
 -     if (!deviceConnected && oldDeviceConnected) {
 -         delay(500); // give the bluetooth stack the chance to get things ready
 -         pServer->startAdvertising(); // restart advertising
 -         Serial.println("start advertising");
 -         oldDeviceConnected = deviceConnected;
 -     }
 -     // connecting
 -     if (deviceConnected && !oldDeviceConnected) {
 -                 // do stuff here on connecting
 -         oldDeviceConnected = deviceConnected;
 -     }
 - }
 - 
 
  复制代码 【演示视频】 
 
 
 
 |