Advertisement
saimun1

Untitled

May 30th, 2017
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.70 KB | None | 0 0
  1.  
  2. /*
  3. Author : Simeon Simeonov
  4. Name : Bolid Arduino project
  5. Ver: Dancho micro optimizing
  6. */
  7. #include <Arduino.h>
  8. #include <PWM.h>
  9.  
  10. #include "pitches.h"
  11. #include <stdio.h> // for function sprintf
  12.  
  13. #include <SoftwareSerial.h>
  14. //--------------------- PIN definitions -----------
  15.  
  16. #define RIGHT_EDGE A2 // A0
  17. #define RIGHT_POS A3 // A1
  18. #define CENTERR_POS A4 // A2
  19. #define CENTERL_POS A5 // A2
  20. #define LEFT_POS A6 // A3
  21. #define LEFT_EDGE A7 // A4
  22.  
  23. #define LEFT_PWM 9
  24. #define RIGHT_PWM 10
  25. #define LEFT_DIR 5
  26. #define RIGHT_DIR 6
  27.  
  28. #define PWM_FREQ 50000
  29.  
  30.  
  31. //-------------- Beep ----------
  32. #define BEEP 13
  33.  
  34. //-------------- Buttons -----------
  35. #define BUTT1 7
  36. #define BUTT2 11
  37.  
  38.  
  39. int bluetoothTx = 1; // TX-O пин от bluetooth на пин D2
  40. int bluetoothRx = 2; // RX-I пин от bluetooth на пин D3
  41.  
  42. byte PS_16 = (1 << ADPS2);
  43. //byte PS_32 = (1 << ADPS2) | (1 << ADPS0);
  44. //byte PS_64 = (1 << ADPS2) | (1 << ADPS1);
  45. byte PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
  46.  
  47. //--------------------------------
  48. int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 };
  49. // note durations: 4 = quarter note, 8 = eighth note, etc.:
  50. int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 };
  51. SoftwareSerial bluetooth(bluetoothTx, bluetoothRx); // създаване на bluetooth
  52.  
  53.  
  54. void setup() {
  55.  
  56. Serial.begin(9600); // серийна комуникация
  57. bluetooth.begin(9600); // Стартиране на bluetooth
  58. pinMode(RIGHT_EDGE, INPUT);
  59.  
  60. pinMode(LEFT_DIR, OUTPUT);
  61. pinMode(RIGHT_DIR, OUTPUT);
  62.  
  63. // --- Изходи ---
  64. // pinMode(GREEN_LED, OUTPUT);
  65. //pinMode(RED_LED, OUTPUT);
  66. pinMode(BEEP, OUTPUT);
  67.  
  68. // --- Входове ---
  69. pinMode(BUTT1, INPUT);
  70. pinMode(BUTT2, INPUT);
  71.  
  72. //---- PWM инициализация за управление на моторите
  73. InitTimersSafe();
  74. if ( SetPinFrequencySafe(LEFT_PWM, PWM_FREQ))
  75. {
  76. pinMode(LEFT_PWM, OUTPUT);
  77. }
  78. if (SetPinFrequencySafe(RIGHT_PWM, PWM_FREQ))
  79. {
  80. pinMode(RIGHT_PWM, OUTPUT);
  81. }
  82.  
  83. // set sample rate to XXXX X001 => 16 micros readings
  84. ADCSRA &= ~PS_128;
  85. ADCSRA |= PS_16;
  86.  
  87. // initialize serial communication at 9600 bits per second:
  88. Serial.begin(9600);
  89.  
  90. tone(BEEP, 2400, 400);
  91. delay(2000);
  92. noTone(BEEP);
  93. // Изчакване натискането на бутон
  94. while (digitalRead (BUTT1) == HIGH);
  95.  
  96.  
  97.  
  98. // // --- Изпълняване на мелодията ---
  99. ///*
  100. for (int thisNote = 0; thisNote < 8; thisNote++) {
  101. // to calculate the note duration, take one second
  102. // divided by the note type. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
  103. int noteDuration = 1000 / noteDurations[thisNote];
  104. tone(BEEP, melody[thisNote], noteDuration);
  105. // to distinguish the notes, set a minimum time between them.
  106. // the note's duration + 30% seems to work well:
  107. int pauseBetweenNotes = noteDuration * 1.30;
  108. delay(pauseBetweenNotes);
  109. // stop the tone playing:
  110. noTone(BEEP);
  111. }
  112. //*/
  113.  
  114. // Изчакване натискането на бутон
  115. // while (digitalRead (BUTT1) == HIGH) {
  116. // read_position();
  117. // sprintf(tmp_str, "%d \t %d \t %d \t %d \t %d \t %d",
  118. // sensor_values[0], sensor_values[1], sensor_values[2],
  119. // sensor_values[3], sensor_values[4], sensor_values[5]);
  120. // Serial.println(tmp_str);
  121. // delay(100);
  122. }
  123.  
  124. //}
  125.  
  126. void loop()
  127. {
  128.  
  129.  
  130. char inp_char;
  131. // Има ли получен символ от сериен канал 4 ( Bluetooth модула)
  132. if (bluetooth.available()>0) {
  133.  
  134. inp_char = bluetooth.read();
  135. Serial.write(inp_char); // Ехо на получения символ на серийния монитор
  136. int FORWARD_SPEED = 20;
  137. if (inp_char == '0'){
  138. FORWARD_SPEED=0;}
  139. else if (inp_char == '1'){
  140. FORWARD_SPEED=60;}
  141. else if (inp_char == '2'){
  142. FORWARD_SPEED=60;}
  143. else if (inp_char == '3'){
  144. FORWARD_SPEED=60;}
  145. else if (inp_char == '4'){
  146. FORWARD_SPEED=120;}
  147. else if (inp_char == '5') {
  148. FORWARD_SPEED=120;}
  149. else if (inp_char == '6') {
  150. FORWARD_SPEED=120;}
  151. else if (inp_char == '7') {
  152. FORWARD_SPEED =180;}
  153. else if (inp_char == '8') {
  154. FORWARD_SPEED = 180;}
  155. else if (inp_char == '9') {
  156. FORWARD_SPEED == 255;}
  157.  
  158. // Реакция на робота според получения символ
  159. switch (inp_char)
  160. {
  161. case 'F': // движение напред
  162. left_motor_speed(FORWARD_SPEED);
  163. right_motor_speed(FORWARD_SPEED);
  164. delay(100);
  165. break;
  166. case 'G': // движение напред и наляво / Диагонал
  167. left_motor_speed(FORWARD_SPEED);
  168. right_motor_speed(FORWARD_SPEED*0.75);
  169. delay(100);
  170. break;
  171. case 'I': // движение напред и надясно / Диагонал
  172. left_motor_speed(FORWARD_SPEED*0.75);
  173. right_motor_speed(FORWARD_SPEED);
  174. delay(100);
  175. break;
  176. case 'B': // движение назад
  177. left_motor_speed(-FORWARD_SPEED);
  178. right_motor_speed(-FORWARD_SPEED);
  179. delay(100);
  180. break;
  181. case 'H': // движение назад и наляво / Диагонал
  182. left_motor_speed(50);
  183. right_motor_speed(50);
  184. delay(100);
  185. break;
  186. case 'J': // движение назад и надясно / Диагонал
  187. left_motor_speed(-FORWARD_SPEED);
  188. right_motor_speed(-FORWARD_SPEED*0.75);
  189. delay(100);
  190. break;
  191. case 'R': // завой надясно
  192. left_motor_speed(80);
  193. right_motor_speed(0);
  194. delay(100);
  195. break;
  196. case 'L': // завой наляво
  197. left_motor_speed(0);
  198. right_motor_speed(80);
  199. delay(100);
  200. break;
  201. case 'S': // спиране
  202. left_motor_speed(-10);
  203. right_motor_speed(-10);
  204. delay(50);
  205. left_motor_speed(0);
  206. right_motor_speed(0);
  207. delay(100);
  208. break;
  209. } // END Switch
  210. } // END IF
  211. } //END LOOP
  212. void left_motor_speed(signed int motor_speed) {
  213. if (motor_speed == 0)
  214. motor_speed = 1;
  215.  
  216. if (motor_speed > 0) {
  217. // digitalWrite(LEFT_DIR, HIGH);
  218. PORTD |= B00100000; // set LEFT_DIR on HIGH
  219. }
  220. else {
  221. // digitalWrite(LEFT_DIR, LOW);
  222. PORTD &= B11011111; // set LEFT_DIR on LOW
  223. }
  224. motor_speed = abs(motor_speed);
  225. if (motor_speed > 255)
  226. motor_speed = 255;
  227.  
  228. pwmWrite(LEFT_PWM, motor_speed);
  229. }
  230.  
  231. //---------------------------------------
  232. void right_motor_speed(signed int motor_speed) {
  233. if (motor_speed == 0)
  234. motor_speed = 1;
  235.  
  236. if (motor_speed > 0) {
  237. // digitalWrite(RIGHT_DIR, HIGH);
  238. PORTD |= B01000000; // set RIGHT_DIR on HIGH
  239. }
  240. else {
  241. // digitalWrite(RIGHT_DIR, LOW);
  242. PORTD &= B10111111; // set RIGHT_DIR on LOW
  243. }
  244. motor_speed = abs(motor_speed);
  245. if (motor_speed > 255)
  246. motor_speed = 255;
  247.  
  248. pwmWrite(RIGHT_PWM, motor_speed);
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement