Guest User

Untitled

a guest
Apr 28th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.34 KB | None | 0 0
  1.  
  2.  
  3. // include libraries
  4. #include <PS2X_lib.h>
  5. #include <Wire.h>
  6. #include <Adafruit_PWMServoDriver.h>
  7. #include <Ultrasonic.h>
  8.  
  9.  
  10. Ultrasonic ultrasonic(2,3); // (Trig PIN,Echo PIN)
  11. Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
  12.  
  13. #define SERVOMIN  150 // This is the 'minimum' pulse length count (out of 4096)
  14. #define SERVOMAX  600 // This is the 'maximum' pulse length count (out of 4096)
  15. #define USMIN  600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
  16. #define USMAX  2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
  17. #define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
  18.  
  19.  
  20. #define BRAKEVCC 0                  // определяем значение резкого тормоза
  21. #define CW   1                      // определяем значение вращения по часовой стрелке
  22. #define CCW  2                      // определяем значение вращения против часовой стрелки
  23. #define BRAKEGND 3                  // определяем значение остановки
  24.  
  25. const uint8_t inApin[2] = {7, 4};   // определяем выводы ключей A
  26. const uint8_t inBpin[2] = {8, 9};   // определяем выводы ключей B
  27. const uint8_t pwmpin[2] = {5, 6};   // определяем выводы ШИМ
  28. const uint8_t cspin[2]  = {A2, A3}; // определяем выводы считывания тока
  29. const uint8_t enpin[2]  = {A0, A1}; // определяем выводы состояния ключей AB. Ключи открываются, если притянуть к 0.
  30.  
  31. char thisChar;
  32. byte availableBytes;
  33. String strData = "";
  34. boolean recievedFlag;
  35. int motor1, motor2, delay1;
  36. int servo1, servo2, servo3;
  37.  
  38. uint8_t servonum1 = 0;
  39. uint8_t servonum2 = 1;
  40. uint8_t servonum3 = 2;
  41.  
  42.  
  43.  
  44. PS2X ps2x; // create PS2 Controller Class
  45.  
  46. //right now, the library does NOT support hot pluggable controllers, meaning
  47. //you must always either restart your Arduino after you conect the controller,
  48. //or call config_gamepad(pins) again after connecting the controller.
  49. int error = 0;
  50. byte type = 0;
  51. byte vibrate = 0;
  52.  
  53. void setup(){
  54.  
  55.    for (int i=0; i<2; i++)
  56.   {
  57.     pinMode(inApin[i], OUTPUT);     // выводы ключей A
  58.     pinMode(inBpin[i], OUTPUT);     // выводы ключей B
  59.     pinMode(pwmpin[i], OUTPUT);     // выводы ШИМ
  60.   }
  61.   // инициируем моторы выключенными
  62.   motorOff(0);
  63.   motorOff(1);
  64.  
  65.  // Start serial communication
  66.  Serial.begin(57600);
  67.  
  68.  delay(2000);
  69.  
  70.  error = ps2x.config_gamepad(13,11,10,12, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
  71.  
  72.   // Check for error
  73.  if(error == 0){
  74.   Serial.println("Found Controller, configured successful");
  75.  }
  76.    
  77.  else if(error == 1)
  78.   Serial.println("No controller found, check wiring or reset the Arduino");
  79.    
  80.  else if(error == 2)
  81.   Serial.println("Controller found but not accepting commands");
  82.  
  83.  else if(error == 3)
  84.   Serial.println("Controller refusing to enter Pressures mode, may not support it.");
  85.    
  86.  // Check for the type of controller
  87.  type = ps2x.readType();
  88.  switch(type) {
  89.   case 0:
  90.     Serial.println("Unknown Controller type");
  91.     break;
  92.   case 1:
  93.     Serial.println("DualShock Controller Found");
  94.     break;
  95.   case 2:
  96.     Serial.println("GuitarHero Controller Found");
  97.     break;
  98.   }
  99.  
  100.  pwm.begin();
  101.  
  102.  pwm.setOscillatorFrequency(27000000);
  103.  pwm.setPWMFreq(SERVO_FREQ);  // Analog servos run at ~50 Hz updates
  104.  
  105.  delay(10);
  106. }
  107.  
  108. void motorOff(int motor)            
  109. {
  110.   for (int i=0; i<2; i++)
  111.   {
  112.     digitalWrite(inApin[i], LOW);
  113.     digitalWrite(inBpin[i], LOW);
  114.   }
  115.   analogWrite(pwmpin[motor], 0);
  116. }
  117.  
  118.  
  119. // функция включения мотора:
  120. void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)  
  121. {
  122. // если номер мотора правильный:
  123.   if (motor <= 1)
  124.   {
  125. // если направление совпадает со значениями направлений:
  126.     if (direct <=3)
  127.     {
  128. // если направление мотора по часовой или плавный стоп,
  129. // устанавливаем соответствующие значения ключа А выбранного мотора:
  130.       if (direct <=1)
  131.         digitalWrite(inApin[motor], HIGH);
  132.       else
  133.         digitalWrite(inApin[motor], LOW);
  134.  
  135. // если направление мотора по часовой или резкий стоп,
  136. // устанавливаем соответствующие значения ключа B выбранного мотора:
  137.       if ((direct==0)||(direct==2))
  138.         digitalWrite(inBpin[motor], HIGH);
  139.       else
  140.         digitalWrite(inBpin[motor], LOW);
  141. // устанавливаем ШИМ выбранного мотора
  142.       analogWrite(pwmpin[motor], pwm);
  143.     }
  144.   }
  145. }
  146. // Main loop
  147. void loop(){
  148. Serial.print("L");
  149. Serial.println(ultrasonic.Ranging(CM)); // CM or INC
  150.  
  151. if (Serial.available() > 0) {                 // если есть что то на вход
  152. strData = "";                               // очистить строку
  153. while (Serial.available() > 0) {            // пока идут данные
  154. strData += (char)Serial.read();           // забиваем строку принятыми данными
  155. delay(2);                                 // обязательно задержка, иначе вылетим из цикла раньше времени
  156. }
  157. recievedFlag = true;  // поднять флаг что получили данные
  158. //Serial.print(strData);
  159. }
  160. if (recievedFlag) {                           // если есть принятые данные
  161. int intVal = strData.substring(2).toInt();  // перевести в int всю строку кроме первых двух символов!
  162. String header = strData.substring(0, 2);    // создать мини строку, содержащую первые два символа
  163. if (strData.startsWith("m1"))               // если строка начинается с m1
  164. motor1 = intVal;
  165. if (strData.startsWith("m2"))               // если строка начинается с m2
  166. motor2 = intVal;
  167. if (strData.startsWith("m3"))               // если строка начинается с m3
  168. {
  169.   motor1 = intVal;
  170.   motor2 = intVal;
  171. }
  172. if (strData.startsWith("m4"))               // если строка начинается с m3
  173. {
  174.   motor1 = intVal;
  175.   motor2 = -intVal;
  176. }
  177. if (strData.startsWith("d1"))               // если строка начинается с m1
  178. delay1 = intVal;
  179. if (strData.startsWith("s1"))               // если строка начинается с b1
  180. {
  181.   servo1 = intVal;
  182.   if (servo1>SERVOMIN && servo1<543)
  183.   {
  184.   Serial.println(servo1);
  185.   pwm.setPWM(servonum1, 0, servo1);
  186.   }
  187. }  
  188. if (strData.startsWith("s2"))               // если строка начинается с b2
  189. {
  190.   servo2 = intVal;
  191.   if (SERVOMIN<servo2 && servo2<543)
  192.   {
  193.   Serial.println(servo2);
  194.   pwm.setPWM(servonum2, 0, servo2);
  195.   }
  196.  
  197. }
  198. if (strData.startsWith("s3"))               // если строка начинается с b2
  199. {
  200.   servo3 = intVal;
  201.   if (SERVOMIN<servo3 && servo3<543)
  202.   {
  203.   Serial.println(servo3);
  204.   pwm.setPWM(servonum3, 0, servo3);
  205.   }
  206.  
  207. }
  208. if (strData.startsWith("stop"))               // если строка начинается с b2
  209. {
  210.   motorOff(0);
  211.   motorOff(1);
  212.   }
  213.  
  214. }
  215. recievedFlag = false;                       // данные приняты, мой капитан!
  216. // выводим в порт для отладки
  217.  
  218.  
  219.  
  220.      if(motor1>50 && motor2==0) {
  221.         motorGo(0, CW, 255);
  222.         delay(delay1);
  223.         motor1 = 0;
  224.         delay1 = 0;
  225.      }
  226.      if(motor1<-50 && motor2==0) {
  227.         motorGo(0, CCW, 255);
  228.         delay(delay1);
  229.         motor1 = 0;
  230.         delay1 = 0;
  231.      }    
  232.      if(motor2>50 && motor1==0) {
  233.         motorGo(1, CW, 255);
  234.         delay(delay1);
  235.         motor2 = 0;
  236.         delay1 = 0;
  237.      }
  238.      if(motor2<-50 && motor1==0){
  239.         motorGo(1, CCW, 255);
  240.         delay(delay1);
  241.         motor2 = 0;
  242.         delay1 = 0;
  243.      }
  244.      if(motor2<-50 && motor1<-50){
  245.         motorGo(0, CCW, 255);
  246.         motorGo(1, CW, 255);
  247.         delay(delay1);
  248.         motor1 = 0;
  249.         motor2 = 0;
  250.         delay1 = 0;
  251.      }
  252.       if(motor2>50 && motor1>50){
  253.         motorGo(0, CW, 255);
  254.         motorGo(1, CCW, 255);
  255.         delay(delay1);
  256.         motor1 = 0;
  257.         motor2 = 0;
  258.         delay1 = 0;
  259.      }
  260.       if((motor2>50 && motor1<-50) or (motor2<-50 && motor1>50)){
  261.         if (motor1>0)
  262.           {motorGo(0, CW, 125);
  263.           motorGo(1, CW, 125);}
  264.         if (motor1<0)
  265.           {motorGo(0, CCW, 125);
  266.           motorGo(1, CCW, 125);}        
  267.         delay(delay1);
  268.         motor1 = 0;
  269.         motor2 = 0;
  270.         delay1 = 0;
  271.      }
  272.  
  273.  if(error == 1)
  274.  {//skip loop if no controller found
  275.   return;
  276.  }
  277.  else { //DualShock Controller
  278.  
  279.      ps2x.read_gamepad(false, vibrate); // disable vibration of the controller
  280.  
  281.     int nJoyLY = ps2x.Analog(PSS_LY); // read left stick
  282.     int nJoyRY = ps2x.Analog(PSS_RY); // read right stick
  283.     int nJoyLX = ps2x.Analog(PSS_LX); // read left stick
  284.     int nJoyRX = ps2x.Analog(PSS_RX); // read right stick
  285.    
  286.     nJoyLY = map(nJoyLY, 0, 255, 255, -255);
  287.     nJoyRY = map(nJoyRY, 0, 255, 255, -255);
  288.     nJoyLX = map(nJoyLX, 0, 255, -255, 255);
  289.     nJoyRX = map(nJoyRX, 0, 255, -255, 255);
  290.  
  291.      //вперед
  292.      if(nJoyLY>50 && abs(nJoyLX)<50) {
  293.         motorGo(0, CCW, 255);
  294.         motorGo(1, CW, 255);
  295.      }
  296.      //назад
  297.      if(nJoyLY<-50 && abs(nJoyLX)<50) {
  298.         motorGo(0, CW, 255);
  299.         motorGo(1, CCW, 255);      
  300.      }
  301.      //вправо
  302.      if(nJoyLX>50 && abs(nJoyLY)<50) {
  303.         motorGo(0, CW, 125);
  304.         motorGo(1, CW, 125);
  305.      }
  306.      //влево
  307.      if(nJoyLX<-50 && abs(nJoyLY)<50) {
  308.         motorGo(0, CCW, 125);
  309.         motorGo(1, CCW, 125);      
  310.      }
  311.      if (abs(nJoyLX)<50 && abs(nJoyLY)<50) {
  312.         analogWrite(pwmpin[1], 0);
  313.         analogWrite(pwmpin[0], 0);
  314.      }
  315. //     if(nJoyRY>50 && nJoyRX<50){
  316. //      pwm.setPWM(servonum2, 0, 500);
  317. //      pwm.setPWM(servonum3, 0, 540);
  318. //     }
  319. //      if(nJoyRY>50 && nJoyRX>50){
  320. //      pwm.setPWM(servonum2, 0, 500);
  321. //      pwm.setPWM(servonum3, 0, 160);
  322. //     }
  323. //      if(nJoyRY<50 && nJoyRX<50){
  324. //      pwm.setPWM(servonum2, 0, 250);
  325. //      pwm.setPWM(servonum3, 0, 540);
  326. //     }
  327. //      if(nJoyRY<50 && nJoyRX>50){
  328. //      pwm.setPWM(servonum2, 0, 250);
  329. //      pwm.setPWM(servonum3, 0, 160);
  330. //     }
  331. //     if (abs(nJoyRX)<50 && abs(nJoyRY)<50) {
  332. //      pwm.setPWM(servonum2, 0, 400);
  333. //      pwm.setPWM(servonum3, 0, 350);
  334. //     }
  335.  
  336.  
  337.  delay(50);
  338.  
  339.        
  340.  if(ps2x.Button(PSB_PAD_RIGHT)){
  341.  
  342.   pwm.setPWM(servonum1, 0, 151);
  343.   }
  344.       // TURN LEFT
  345.  if(ps2x.Button(PSB_PAD_LEFT)){
  346.  
  347.   pwm.setPWM(servonum1, 0, 542);
  348.   }
  349.    if(ps2x.Button(PSB_PAD_UP)){
  350.  
  351.   pwm.setPWM(servonum1, 0, 346);
  352.   }
  353.  
  354.  
  355.  if(ps2x.Button(PSB_GREEN)){
  356.  
  357.   pwm.setPWM(servonum2, 0, 500);
  358.   }
  359.    if(ps2x.Button(PSB_BLUE)){
  360.  
  361.   pwm.setPWM(servonum2, 0, 250);
  362.   }
  363.    if(ps2x.Button(PSB_PINK)){
  364.  
  365.   pwm.setPWM(servonum3, 0, 540);
  366.   }
  367.    if(ps2x.Button(PSB_RED)){
  368.  
  369.   pwm.setPWM(servonum3, 0, 160);
  370.   }
  371.   if(ps2x.Button(PSB_R1)){
  372.  
  373.   pwm.setPWM(servonum3, 0, 350);
  374.   pwm.setPWM(servonum2, 0, 400);
  375.   }
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383. // Serial.print("nJoyRX=");
  384. //// Serial.println(ps2x.Analog(PSS_RY), DEC);
  385. // Serial.println(nJoyRX);
  386. //  Serial.print("nJoyRY=");
  387. //// Serial.println(ps2x.Analog(PSS_RY), DEC);
  388. // Serial.println(nJoyRY);
  389. //  Serial.print("nJoyLX=");
  390. //// Serial.println(ps2x.Analog(PSS_RY), DEC);
  391. // Serial.println(nJoyLX);
  392. //  Serial.print("nJoyLY=");
  393. //// Serial.println(ps2x.Analog(PSS_RY), DEC);
  394. // Serial.println(nJoyLY);
  395.  
  396.  
  397. //Serial.print("motor1= "); Serial.print(motor1); Serial.print(" ");
  398. //Serial.print("delay1= "); Serial.print(delay1); Serial.print(" ");
  399. //Serial.print("motor2= "); Serial.print(motor2); Serial.print(" ");
  400. //Serial.print("servo1= "); Serial.print(servo1); Serial.print(" ");
  401. //Serial.print("servo2= "); Serial.print(servo2); Serial.print(" ");
  402. //Serial.print("servo3= "); Serial.print(servo3); Serial.println();
  403.  
  404.  
  405.  
  406. }
  407. }
Add Comment
Please, Sign In to add comment