1. #include "BLEDevice.h"
  2. #define FR_MotorIN1 0 // (ch)
  3. #define FR_MotorIN2 1
  4. #define RR_MotorIN3 2
  5. #define RR_MotorIN4 3
  6. #define FL_MotorIN1 4
  7. #define FL_MotorIN2 5
  8. #define RL_MotorIN3 6
  9. #define RL_MotorIN4 7
  10. #define connect_LED 13
  11. char* data;
  12. int number, r_val, pwm_val;
  13. int pwm = 70; // 起動時のスピードを設定
  14. // Online UUID Generator https://www.uuidgenerator.net/     *こちらでUUIDを取得します。
  15. #define SERVICE_UUID "********-4458-11e9-b210-************"
  16. #define CHARACTERISTIC_UUID "********-4458-11e9-b210-************"
  17. #define SERVER_NAME "ESP32_BLE"
  18. static BLEUUID serviceUUID(SERVICE_UUID);
  19. static BLEUUID charUUID(CHARACTERISTIC_UUID);
  20. static BLEAddress *pServerAddress;
  21. static boolean doConnect = false;
  22. static boolean connected = false;
  23. static BLERemoteCharacteristic* pRemoteCharacteristic;
  24. static void notifyCallback(
  25.   BLERemoteCharacteristic* pBLERemoteCharacteristic,
  26.   uint8_t* pData,
  27.   size_t length,
  28.   bool isNotify) {
  29. }
  30. class MyClientCallback : public BLEClientCallbacks {
  31.     void onConnect(BLEClient* pclient) {
  32.     }
  33.     void onDisconnect(BLEClient* pclient) {
  34.       connected = false;
  35.       Serial.println("onDisconnect");
  36.     }
  37. };
  38. bool connectToServer(BLEAddress pAddress) {
  39.   Serial.print("Forming a connection to ");
  40.   Serial.println(pAddress.toString().c_str());
  41.   BLEClient* pClient = BLEDevice::createClient();
  42.   Serial.println(" - Created client");
  43.   pClient->setClientCallbacks(new MyClientCallback());
  44.   // Connect to the remove BLE Server.
  45.   pClient->connect(pAddress);
  46.   Serial.println(" - Connected to server");
  47.   pClient->setMTU(517); //set client to request maximum MTU from server
  48.   BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
  49.   Serial.print(" - Connected to server :");
  50.   Serial.println(serviceUUID.toString().c_str());
  51.   if (pRemoteService == nullptr) {
  52.     Serial.print("Failed to find our service UUID: ");
  53.     Serial.println(serviceUUID.toString().c_str());
  54.     pClient->disconnect();
  55.     return false;
  56.   }
  57.   pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
  58.   if (pRemoteCharacteristic == nullptr) {
  59.     Serial.print("Failed to find characteristic UUID: ");
  60.     Serial.println(charUUID.toString().c_str());
  61.     pClient->disconnect();
  62.     return false;
  63.   }
  64.   Serial.print(" - Found characteristic UUID: ");
  65.   Serial.println(charUUID.toString().c_str());
  66.   // Read the value of the characteristic.
  67.   if (pRemoteCharacteristic->canRead()) {
  68.     std::string value = pRemoteCharacteristic->readValue();
  69.     Serial.print("The characteristic value was: ");
  70.     Serial.println(value.c_str());
  71.   }
  72.   return true;
  73. }
  74. class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
  75.     void onResult(BLEAdvertisedDevice advertisedDevice) {
  76.       Serial.print("BLE Advertised Device found: ");
  77.       Serial.println(advertisedDevice.toString().c_str());
  78.       Serial.println(advertisedDevice.getName().c_str());
  79.       if (advertisedDevice.getName() == SERVER_NAME) {
  80.         Serial.println(advertisedDevice.getAddress().toString().c_str());
  81.         advertisedDevice.getScan()->stop();
  82.         pServerAddress = new BLEAddress(advertisedDevice.getAddress());
  83.         doConnect = true;
  84.       }
  85.     }
  86. };
  87. void get_scan() {
  88.   BLEScan* pBLEScan = BLEDevice::getScan();
  89.   Serial.println("getScan");
  90.   pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  91.   Serial.println("setAdvertisedDeviceCallbacks");
  92.   pBLEScan->setActiveScan(true);
  93.   pBLEScan->start(10);
  94.   Serial.println("");
  95.   Serial.println("End of scan");
  96. }
  97. void setup() {
  98.   Serial.begin(115200);
  99.   BLEDevice::init(SERVER_NAME);
  100.   BLEScan* pBLEScan = BLEDevice::getScan();
  101.   Serial.println("getScan");
  102.   pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  103.   Serial.println("setAdvertisedDeviceCallbacks");
  104.   pBLEScan->setActiveScan(true);
  105.   pBLEScan->start(10);
  106.   Serial.println("");
  107.   Serial.println("End of setup");
  108.   delay(200);
  109.   ledcSetup(FR_MotorIN1, 500, 8); // (ch、frequency(Hz)、duty(Bit))
  110.   ledcSetup(FR_MotorIN2, 500, 8);
  111.   ledcSetup(RR_MotorIN3, 500, 8);
  112.   ledcSetup(RR_MotorIN4, 500, 8);
  113.   ledcSetup(FL_MotorIN1, 500, 8);
  114.   ledcSetup(FL_MotorIN2, 500, 8);
  115.   ledcSetup(RL_MotorIN3, 500, 8);
  116.   ledcSetup(RL_MotorIN4, 500, 8);
  117.   ledcAttachPin(26, FR_MotorIN1);
  118.   ledcAttachPin(25, FR_MotorIN2);
  119.   ledcAttachPin(33, RR_MotorIN3);
  120.   ledcAttachPin(32, RR_MotorIN4);
  121.   ledcAttachPin(19, FL_MotorIN1);
  122.   ledcAttachPin(18, FL_MotorIN2);
  123.   ledcAttachPin(17, RL_MotorIN3);
  124.   ledcAttachPin(16, RL_MotorIN4);
  125.   pinMode(connect_LED, OUTPUT);
  126.   digitalWrite(connect_LED, LOW);
  127. }
  128. void loop() {
  129.   if (doConnect == true) {
  130.     if (connectToServer(*pServerAddress)) {
  131.       connected = true;
  132.     } else {
  133.       connected = false;
  134.     }
  135.     doConnect = false;
  136.   }
  137.   if (connected) { // コネクトしたら受信を開始
  138.     std::string value = pRemoteCharacteristic->readValue();
  139.     String strVal = value.c_str();
  140.     char strNum = strVal.toInt();
  141.     data = new char[strVal.length() + 1];
  142.     strcpy(data, value.c_str());
  143.     if (sscanf(data, "%d,%d", &number, &pwm_val) == 2) {} // numberとpwm_valのデータを取り出す。
  144.     Serial.println(data);
  145.   switch (number) { // switch-caseによりデータの選別とモータドライブ関数の選択
  146.     case '1':
  147.       moveFrontleft();
  148.       // Serial.println("moveFrontleft"); 左斜め前方移動
  149.       break;
  150.     case '2': // moveForward
  151.       moveForward();
  152.       // Serial.println("moveForward"); 前進
  153.       break;
  154.     case '3': // moveFrontright
  155.       moveFrontright();
  156.       // Serial.println("moveFrontright"); 右斜め前方移動
  157.       break;
  158.     case '4': // moveLeft
  159.       moveLeft();
  160.       // Serial.println("moveLeft"); 左横方向移動
  161.       break;
  162.     case '6': // moveRight
  163.       moveRight();
  164.       // Serial.println("moveRight"); 右横方向移動
  165.       break;
  166.     case '7': // moveRearleft
  167.       moveRearleft();
  168.       // Serial.println("moveRearleft"); 左斜め後方移動
  169.       break;
  170.     case '8': // moveBackward
  171.       moveBackward();
  172.       // Serial.println("moveBackward"); 後進
  173.       break;
  174.     case '9': // moveRearright
  175.       moveRearright();
  176.       // Serial.println("moveRearright"); 右斜め後方移動
  177.       break;
  178.     case '*': // turnLeft
  179.       turnLeft();
  180.       // Serial.println("turnLeft"); 左旋回
  181.       break;
  182.     case '#': // turnRight
  183.       turnRight();
  184.       // Serial.println("turnRight"); 右旋回
  185.       break;
  186.     case 'S': // Stop
  187.       Stop();
  188.       // Serial.println("Stop"); 停止
  189.       break;
  190.     default:
  191.       break;
  192.   }
  193.   switch (pwm_val) { // 選択した文字に対しPWM値を割り付ける。
  194.     case 'A': // 低速
  195.       pwm = 70;
  196.       break;
  197.     case 'B':
  198.       pwm = 105;
  199.       break;
  200.     case 'C':
  201.       pwm = 140;
  202.       break;
  203.     case 'D':
  204.       pwm = 175;
  205.       break;
  206.     case 'E':
  207.       pwm = 220;
  208.       break;
  209.     case 'F': // 高速
  210.       pwm = 255;
  211.       break;
  212.     default:
  213.       break;
  214.   }
  215.     digitalWrite(connect_LED, HIGH);
  216.     //Serial.println("connected");
  217.   } else {
  218.     digitalWrite(connect_LED, LOW);
  219.     //Serial.println("Not connected");
  220.     doConnect = true;
  221.     get_scan();
  222.   }
  223.   delay(10);
  224. }
  225. void moveForward() { // 前進
  226.   ledcWrite(FR_MotorIN1, pwm);
  227.   ledcWrite(FR_MotorIN2, 0);
  228.   ledcWrite(RR_MotorIN3, pwm);
  229.   ledcWrite(RR_MotorIN4, 0);
  230.   ledcWrite(FL_MotorIN1, pwm);
  231.   ledcWrite(FL_MotorIN2, 0);
  232.   ledcWrite(RL_MotorIN3, pwm);
  233.   ledcWrite(RL_MotorIN4, 0);
  234. }
  235. void moveBackward() { // 後進
  236.   ledcWrite(FR_MotorIN1, 0);
  237.   ledcWrite(FR_MotorIN2, pwm);
  238.   ledcWrite(RR_MotorIN3, 0);
  239.   ledcWrite(RR_MotorIN4, pwm);
  240.   ledcWrite(FL_MotorIN1, 0);
  241.   ledcWrite(FL_MotorIN2, pwm);
  242.   ledcWrite(RL_MotorIN3, 0);
  243.   ledcWrite(RL_MotorIN4, pwm);
  244. }
  245. void moveLeft() { // 左横方向移動
  246.   ledcWrite(FR_MotorIN1, pwm);
  247.   ledcWrite(FR_MotorIN2, 0);
  248.   ledcWrite(RR_MotorIN3, 0);
  249.   ledcWrite(RR_MotorIN4, pwm);
  250.   ledcWrite(FL_MotorIN1, 0);
  251.   ledcWrite(FL_MotorIN2, pwm);
  252.   ledcWrite(RL_MotorIN3, pwm);
  253.   ledcWrite(RL_MotorIN4, 0);
  254. }
  255. void moveRight() { // 右横方向移動
  256.   ledcWrite(FR_MotorIN1, 0);
  257.   ledcWrite(FR_MotorIN2, pwm);
  258.   ledcWrite(RR_MotorIN3, pwm);
  259.   ledcWrite(RR_MotorIN4, 0);
  260.   ledcWrite(FL_MotorIN1, pwm);
  261.   ledcWrite(FL_MotorIN2, 0);
  262.   ledcWrite(RL_MotorIN3, 0);
  263.   ledcWrite(RL_MotorIN4, pwm);
  264. }
  265. void moveFrontleft() { // 左斜め前方移動
  266.   ledcWrite(FR_MotorIN1, pwm);
  267.   ledcWrite(FR_MotorIN2, 0);
  268.   ledcWrite(RR_MotorIN3, 0);
  269.   ledcWrite(RR_MotorIN4, 0);
  270.   ledcWrite(FL_MotorIN1, 0);
  271.   ledcWrite(FL_MotorIN2, 0);
  272.   ledcWrite(RL_MotorIN3, pwm);
  273.   ledcWrite(RL_MotorIN4, 0);
  274. }
  275. void moveFrontright() { // 右斜め前方移動
  276.   ledcWrite(FR_MotorIN1, 0);
  277.   ledcWrite(FR_MotorIN2, 0);
  278.   ledcWrite(RR_MotorIN3, pwm);
  279.   ledcWrite(RR_MotorIN4, 0);
  280.   ledcWrite(FL_MotorIN1, pwm);
  281.   ledcWrite(FL_MotorIN2, 0);
  282.   ledcWrite(RL_MotorIN3, 0);
  283.   ledcWrite(RL_MotorIN4, 0);
  284. }
  285. void moveRearleft() { // 左斜め後方移動
  286.   ledcWrite(FR_MotorIN1, 0);
  287.   ledcWrite(FR_MotorIN2, 0);
  288.   ledcWrite(RR_MotorIN3, 0);
  289.   ledcWrite(RR_MotorIN4, pwm);
  290.   ledcWrite(FL_MotorIN1, 0);
  291.   ledcWrite(FL_MotorIN2, pwm);
  292.   ledcWrite(RL_MotorIN3, 0);
  293.   ledcWrite(RL_MotorIN4, 0);
  294. }
  295. void moveRearright() { // 右斜め後方移動
  296.   ledcWrite(FR_MotorIN1, 0);
  297.   ledcWrite(FR_MotorIN2, pwm);
  298.   ledcWrite(RR_MotorIN3, 0);
  299.   ledcWrite(RR_MotorIN4, 0);
  300.   ledcWrite(FL_MotorIN1, 0);
  301.   ledcWrite(FL_MotorIN2, 0);
  302.   ledcWrite(RL_MotorIN3, 0);
  303.   ledcWrite(RL_MotorIN4, pwm);
  304. }
  305. void turnRight() { // 左旋回
  306.   ledcWrite(FR_MotorIN1, pwm);
  307.   ledcWrite(FR_MotorIN2, 0);
  308.   ledcWrite(RR_MotorIN3, pwm);
  309.   ledcWrite(RR_MotorIN4, 0);
  310.   ledcWrite(FL_MotorIN1, 0);
  311.   ledcWrite(FL_MotorIN2, pwm);
  312.   ledcWrite(RL_MotorIN3, 0);
  313.   ledcWrite(RL_MotorIN4, pwm);
  314. }
  315. void turnLeft() { // 右旋回
  316.   ledcWrite(FR_MotorIN1, 0);
  317.   ledcWrite(FR_MotorIN2, pwm);
  318.   ledcWrite(RR_MotorIN3, 0);
  319.   ledcWrite(RR_MotorIN4, pwm);
  320.   ledcWrite(FL_MotorIN1, pwm);
  321.   ledcWrite(FL_MotorIN2, 0);
  322.   ledcWrite(RL_MotorIN3, pwm);
  323.   ledcWrite(RL_MotorIN4, 0);
  324. }
  325. void Stop() { // 停止
  326.   ledcWrite(FR_MotorIN1, 0);
  327.   ledcWrite(FR_MotorIN2, 0);
  328.   ledcWrite(RR_MotorIN3, 0);
  329.   ledcWrite(RR_MotorIN4, 0);
  330.   ledcWrite(FL_MotorIN1, 0);
  331.   ledcWrite(FL_MotorIN2, 0);
  332.   ledcWrite(RL_MotorIN3, 0);
  333.   ledcWrite(RL_MotorIN4, 0);
  334. }