2024年9月1日日曜日

ドローン製作⑪ ESP8266 MPU6050 VL53 MadgwickFilter PID


MPU6050 6軸モーションセンサからMadgwickFilter・PID制御に加えてVL53レーザー測距センサモジュールを取付けテストを行いましたが、VL53の処理に45-12=33㎳かかりました。
回路図

















プログラムの実行とスキップ(コメントアウト)
RemoteXY → 101_ //RemoteXY_Handler ();
VL53     → 102_ //dist = gVL530X.readRangeContinuousMillimeters();

シリアルモニター①
RemoteXY(実行)
VL53(実行)
 
VL53の処理に時間がかかる
45-12=33㎳












RemoteXY(スキップ)
VL53(実行)
VL53の処理に時間がかかる
508-469=39㎳













RemoteXY(実行)
VL53(スキップ)
MadgwickFilter PID処理に影響少ない














RemoteXY(スキップ)
VL53(スキップ)
MadgwickFilter PID処理に影響少ない


















シリアルモニター確認用プログラム
  1. //////////////////////////////////////////////
  2. // RemoteXY include library //
  3. //////////////////////////////////////////////
  4. // you can enable debug logging to Serial at 115200
  5. //#define REMOTEXY__DEBUGLOG
  6. // RemoteXY select connection mode and include library
  7. #define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
  8. #include <ESP8266WiFi.h>
  9. // RemoteXY connection settings
  10. #define REMOTEXY_WIFI_SSID "RemoteXY"
  11. #define REMOTEXY_WIFI_PASSWORD "12345678"
  12. #define REMOTEXY_SERVER_PORT 6377
  13. #include <RemoteXY.h>
  14. // RemoteXY GUI configuration
  15. #pragma pack(push, 1)
  16. uint8_t RemoteXY_CONF[] = // 71 bytes
  17.   { 255,6,0,0,0,64,0,17,0,0,0,139,1,106,200,1,1,5,0,5,
  18.   4,7,94,94,0,204,191,31,1,10,159,36,35,1,2,31,67,0,10,59,
  19.   159,38,35,49,4,26,31,85,80,0,31,79,70,70,0,4,3,109,100,16,
  20.   128,205,26,4,3,129,100,16,128,205,26 };
  21.   
  22. // this structure defines all the variables and events of your control interface
  23. struct {
  24.     // input variables
  25.   int8_t joystick_01_x; // from -100 to 100
  26.   int8_t joystick_01_y; // from -100 to 100
  27.   uint8_t button_01; // =1 if button pressed, else =0
  28.   uint8_t pushSwitch_01; // =1 if state is ON, else =0
  29.   int8_t slider_01; // from 0 to 100
  30.   int8_t slider_02; // from 0 to 100
  31.     // other variable
  32.   uint8_t connect_flag; // =1 if wire connected, else =0
  33. } RemoteXY;
  34. #pragma pack(pop)
  35.  
  36. /////////////////////////////////////////////
  37. // END RemoteXY include //
  38. /////////////////////////////////////////////
  39. #include "MPU6050.h"
  40. MPU6050 accelgyro;
  41. #include <MadgwickAHRS.h>
  42. Madgwick MadgwickFilter;
  43. #include <VL53L0X.h>
  44. VL53L0X gVL530X;
  45. int16_t ax, ay, az;//加速度 int16_tは2バイトの符号付き整数
  46. int16_t gx, gy, gz;//角速度 同上
  47. float ROLL, PITCH, YAW;
  48. float ROLL_P, ROLL_I, ROLL_D, ROLL_M;
  49. float PITCH_P, PITCH_I, PITCH_D, PITCH_M;
  50. float R, P, Y;
  51. float Kp, Kd, Ki;
  52. int dist;
  53. int throttle;
  54. #define M1 12
  55. #define M2 13
  56. #define M3 14
  57. #define M4 15
  58. #define PWN_FREQ 1000 // PWM frequency: 1000Hz(1kHz)
  59. #define PWN_RANGE 100 // PWN range: 100
  60. void setup()
  61. {
  62.   RemoteXY_Init ();
  63.   pinMode(M1, OUTPUT);
  64.   pinMode(M2, OUTPUT);
  65.   pinMode(M3, OUTPUT);
  66.   pinMode(M4, OUTPUT);
  67.   Wire.begin();
  68.   Serial.begin(115200);
  69.   accelgyro.initialize();//I2Cデバイスの初期化
  70.   delay(300);
  71.   MadgwickFilter.begin(100);//フィルタのサンプリングを100Hzで
  72.   analogWriteFreq(PWN_FREQ);
  73.   analogWriteRange(PWN_RANGE);
  74.   R = 0;
  75.   P = 0;
  76.   Y = 0;
  77.   gVL530X.init();
  78.   gVL530X.setTimeout(500);
  79.   gVL530X.startContinuous();
  80.   }
  81. void loop()
  82. {
  83.   //RemoteXY_Handler ();
  84.   //dist = gVL530X.readRangeContinuousMillimeters();
  85.   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  86.   MadgwickFilter.updateIMU(gx / 131.0, gy / 131.0, gz / 131.0, ax / 16384.0, ay / 16384.0, az / 16384.0);
  87.   ROLL = MadgwickFilter.getRoll();
  88.   PITCH = MadgwickFilter.getPitch();
  89.   YAW = MadgwickFilter.getYaw();
  90.   YAW = YAW - 180;
  91.   YAW = 0 * YAW;
  92.   // 角速度値を分解能で割って角速度に変換する
  93.   float dpsX = gx / 131.0;
  94.   float dpsY = gy / 131.0;
  95.   float dpsZ = gz / 131.0;
  96.   //定数
  97.   Kp = 50;
  98.   Ki = 0.1;
  99.   Kd = 10;
  100.   // PID制御
  101.   ROLL_P = ROLL / 90; // P成分:傾き-90〜90度 → -1〜1
  102.   ROLL_I += ROLL_P; // I成分:傾きの積算。
  103.   if (10 < abs(ROLL_I)) ROLL_I = 0; //上限設定
  104.   ROLL_D = dpsX / 250; // D成分:角速度-250〜250dps → -1〜1
  105.   ROLL_M = ROLL_P * Kp +
  106.            ROLL_I * Ki +
  107.            ROLL_D * Kd;
  108.   PITCH_P = PITCH / 90; // P成分:傾き-90〜90度 → -1〜1
  109.   PITCH_I += PITCH_P; // I成分:傾きの積算。
  110.   if (10 < abs(PITCH_I)) PITCH_I = 0; //上限設定
  111.   PITCH_D = dpsY / 250; // D成分:角速度-250〜250dps → -1〜1
  112.   PITCH_M = PITCH_P * Kp +
  113.             PITCH_I * Ki +
  114.             PITCH_D * Kd;
  115.   // Serial.print("Kp:");Serial.print(Kp); Serial.print("| ");
  116.   // Serial.print("Ki:");Serial.print(Ki); Serial.print("| ");
  117.   // Serial.print("Kd:");Serial.print(Kd); Serial.print("| ");
  118.   Serial.print("ROLL:");Serial.print(ROLL); Serial.print("| ");
  119.   Serial.print("PITCH:");Serial.print(PITCH); Serial.print("| ");
  120.   // Serial.print("YAW:");Serial.print(YAW); Serial.print("| ");
  121.   // Serial.print("ROLL_P:");Serial.print(ROLL_P); Serial.print("| ");
  122.   // Serial.print("ROLL_I:");Serial.print(ROLL_I); Serial.print("| ");
  123.   // Serial.print("ROLL_D:");Serial.print(ROLL_D); Serial.print("| ");
  124.   // Serial.print("ROLL_M:");Serial.print(ROLL_M); Serial.print("| ");
  125.   // Serial.print("PITCH_P:");Serial.print(PITCH_P); Serial.print("| ");
  126.   // Serial.print("PITCH_I:");Serial.print(PITCH_I); Serial.print("| ");
  127.   // Serial.print("PITCH_D:");Serial.print(PITCH_D); Serial.print("| ");
  128.   // Serial.print("PITCH_M:");Serial.print(PITCH_M); Serial.print("| ");
  129.   Serial.print("dist:");Serial.print(dist); Serial.print("| ");
  130.   Serial.print("\n");
  131.   //シリアルプロッタ
  132.   //Serial.print(ROLL); Serial.print(",");
  133.   //Serial.print(ROLL_P); Serial.print(",");
  134.   //Serial.print(ROLL_I); Serial.print(",");
  135.   //Serial.print(ROLL_D); Serial.print(",");
  136.   //Serial.println(ROLL_M);
  137.   //Serial.print(PITCH); Serial.print(",");
  138.   //Serial.print(PITCH_P); Serial.print(",");
  139.   //Serial.print(PITCH_I); Serial.print(",");
  140.   //Serial.print(PITCH_D); Serial.print(",");
  141.   //Serial.println(PITCH_M);
  142.  
  143.  delay(5);
  144. }









0 件のコメント:

コメントを投稿

Raspberry Pi Donkey Car スマートカー

  2020年に製作したDonkey Car スマートカー について記事にしました。 Donkey CarはRaspberry Pi のカメラからコースを ディープラーニングさせ自動走行を行います。(動画は白線上を自動走行)   動画