Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.12 KB | None | 0 0
  1. #include "ESP8266WiFi.h"
  2. #include "WiFiUDP.h"
  3. #include "OSCMessage.h"
  4. #include "Wire.h"
  5. #include "I2Cdev.h"
  6. #include "MPU6050.h"
  7.  
  8. //WiFiの定義
  9. IPAddress myIP(192, 168, 4, 1);
  10. IPAddress HOSTIP (192, 168, 4, 2);
  11. const char *ssid = "TROBOT";
  12. const char *password = "12345678";
  13. int localPort = 8000;
  14. WiFiUDP Udp;
  15.  
  16. //ジャイロセンサーの定義
  17. MPU6050 accelgyro;
  18. MPU6050 initialize;
  19. int16_t ax, ay, az;
  20. int16_t gx, gy, gz;
  21. #define Gyr_offset 0.0 //The offset of the gyro
  22. #define Gyr_Gain 16.348
  23. #define Driving_Angle 45
  24. #define pi 3.1415692
  25. float Angle_offset = -4.8 ;
  26.  
  27. //機体の定義
  28. float kp, ki, kd;
  29. float Angle_Raw, Angle_Filtered, omega;
  30. float Turn_Speed = 0, Turn_Speed_K = 0;
  31. float Run_Speed = 0, Run_Speed_K = 0;
  32. float LOutput,ROutput;
  33. float Input, Output;
  34. float errSum, dErr, error, lastErr;
  35. unsigned long preTime = 0;
  36. unsigned long lastTime;
  37. int timeChange;
  38. int led = 12; // Head Lump
  39. int distance;
  40. int value;
  41.  
  42. //モータードライバDRV8835の接続
  43. int AN1 = 14;
  44. int AN2 = 13;
  45. int BN1 = 2;
  46. int BN2 = 16;
  47.  
  48. void setup() {
  49. WiFi.softAP(ssid, password);
  50. IPAddress myIP = WiFi.softAPIP();
  51. Udp.begin(localPort);
  52. Serial.begin(115200);
  53. int tries = 0;
  54. while (WiFi.status() != WL_CONNECTED) {
  55. delay(500);
  56. tries++;
  57. if (tries > 30) {
  58. break;
  59. }
  60. }
  61. Wire.begin();
  62. accelgyro.initialize();
  63. initialize.setFullScaleGyroRange(MPU6050_GYRO_FS_2000);
  64. for(int i = 0; i < 200; i++) {
  65. Filter();
  66. }
  67. if (abs(Angle_Filtered) < Driving_Angle) {
  68. omega = Angle_Raw = Angle_Filtered = 0;
  69. Filter();
  70. Output = error = errSum = dErr = Run_Speed = Turn_Speed = 0;
  71. myPID();
  72. }
  73. pinMode(AN1, OUTPUT);
  74. pinMode(AN2, OUTPUT);
  75. pinMode(BN1, OUTPUT);
  76. pinMode(BN2, OUTPUT);
  77. pinMode(A0,OUTPUT);
  78. }
  79.  
  80. void OSCMsgReceive() {
  81. OSCMessage msgIN;
  82. int size;
  83. if ((size = Udp.parsePacket()) > 0) {
  84. while (size--)
  85. msgIN.fill(Udp.read());
  86. if (!msgIN.hasError()) {
  87. msgIN.route("/micro_BR/fader1",fader1);//turn left & right
  88. msgIN.route("/micro_BR/fader2",fader2);//forward & reverse
  89. }
  90. }
  91. }
  92.  
  93. void fader1(OSCMessage &msg, int addrOffset ){ //turn left & right
  94. int value1 = msg.getFloat(0);
  95. delayMicroseconds(10);
  96. if (value1 >= 145) {
  97. Turn_Speed = map(value1, 145, 255, 0, 125);
  98. }
  99. else if (value1 <= 110) {
  100. Turn_Speed = map(value1, 110, 0, 0, -125);
  101. }
  102. else {
  103. Turn_Speed = 0;
  104. }
  105. }
  106.  
  107. void fader2(OSCMessage &msg, int addrOffset) { //forward & reverse
  108. int value2 = msg.getFloat(0);
  109. delayMicroseconds(10);
  110. if (value2 >= 145) {
  111. Run_Speed_K = map(value2, 145, 255, 0, 125);
  112. Run_Speed += Run_Speed_K;
  113. }
  114. else if (value2 <= 110) {
  115. Run_Speed_K = map(value2, 110, 0, 0, -125);
  116. Run_Speed += Run_Speed_K;
  117. }
  118. else {
  119. Run_Speed_K = 0;
  120. }
  121. }
  122.  
  123. void loop() {
  124. OSCMsgReceive();
  125. Filter();
  126. Serial.print(" Angle = ");
  127. Serial.println(Angle_Filtered);
  128. if (abs(Angle_Filtered) < Driving_Angle) {
  129. myPID();
  130. PWMControl();
  131. LED_ONOFF();
  132. }
  133. else { // Stop the wheels
  134. analogWrite(BN2, 0);
  135. analogWrite(AN2, 0);
  136. for(int i = 0; i < 100; i++) {
  137. Filter();
  138. }
  139. if(abs(Angle_Filtered) < Driving_Angle) {
  140. for(int i = 0; i <= 500; i++) {
  141. omega = Angle_Raw = Angle_Filtered = 0;
  142. Filter();
  143. Output = error = errSum = dErr = Run_Speed = Turn_Speed = 0;
  144. myPID();
  145. }
  146. }
  147. }
  148. distance_from_object();
  149. if( distance < 10){
  150. for(int i = 0; i <= 1
  151. 00; i++) {
  152. digitalWrite(AN1, HIGH);
  153. digitalWrite(BN1, LOW);
  154. analogWrite(AN2, 150 );
  155. analogWrite(BN2, 150 );
  156. Filter();
  157. myPID();
  158. }
  159. }
  160. }
  161.  
  162. void Filter() {
  163. accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  164. Angle_Raw = (atan2(ay, az) * 180/ pi) + Angle_offset;
  165. omega = gx / Gyr_Gain + Gyr_offset;
  166. unsigned long now = millis();
  167. float dt = (now - preTime) / 1000.00;
  168. preTime = now;
  169. float K = 0.8;
  170. float A = K / (K + dt);
  171. Angle_Filtered = A * (Angle_Filtered + omega * dt) + (1 - A) * Angle_Raw;
  172. }
  173.  
  174. void myPID() {
  175. //PID係数
  176. kp = 20;
  177. ki = 0.40;
  178. kd = 250;
  179. // Calculating the output values using the PID values.
  180. unsigned long now = millis();
  181. timeChange = (now - lastTime);
  182. lastTime = now;
  183. error = Angle_Filtered; // Proportion
  184. errSum += error * timeChange; // Integration
  185. dErr = (error - lastErr) / timeChange; // Differentiation
  186. Output = kp * error + ki * errSum + kd * dErr;
  187. lastErr = error;
  188. LOutput = Output + Turn_Speed + Run_Speed;
  189. ROutput = Output - Turn_Speed + Run_Speed;
  190. }
  191.  
  192. void PWMControl() {
  193. if (LOutput > 0) {
  194. digitalWrite(BN1, HIGH);
  195. }
  196. else if (LOutput < 0) {
  197. digitalWrite(BN1, LOW);
  198. }
  199. else {
  200. digitalWrite(BN1, LOW);
  201. }
  202. if (ROutput > 0) {
  203. digitalWrite(AN1, HIGH);
  204. }
  205. else if (ROutput < 0) {
  206. digitalWrite(AN1, LOW);
  207. }
  208. else {
  209. digitalWrite(AN1, LOW);
  210. }
  211. float Lrpm = min(600, abs(LOutput) );
  212. float Rrpm = min(600, abs(ROutput) );
  213. analogWrite(BN2, Lrpm);
  214. analogWrite(AN2, Rrpm);
  215. }
  216.  
  217. void LED_ONOFF() {
  218. if(millis() % 500 > 250) {
  219. analogWrite(led, 255);
  220. }
  221. else {
  222. analogWrite(led, 0);
  223. }
  224. }
  225.  
  226. void distance_from_object(){ //測距
  227. value = analogRead(A0);
  228. distance = (6787/(value-3))-4;
  229. Serial.print(distance);
  230. Serial.println("cm");
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement