{"id":436,"date":"2024-12-25T09:10:12","date_gmt":"2024-12-25T01:10:12","guid":{"rendered":"https:\/\/aimc.skyate.com\/?p=436"},"modified":"2025-02-04T09:34:56","modified_gmt":"2025-02-04T01:34:56","slug":"aia-t","status":"publish","type":"post","link":"https:\/\/aimc.skyate.com\/index.php\/2024\/12\/25\/aia-t\/","title":{"rendered":"\u3010AIMC\u9879\u76ee\u3011 AIA-T Mini\u8f66\u6a21"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">1 \u9879\u76ee\u7b80\u4ecb<\/h1>\n\n\n\n<p>\u672c\u9879\u76ee\u662f\u57fa\u4e8eESP32\u5355\u7247\u673a\u7684\u667a\u80fd\u7269\u8054\u7f51\u5c0f\u8f66\uff0c\u65e8\u5728\u53c2\u4e0e\u7b2c\u4e8c\u5c4a\u4eba\u5de5\u667a\u80fd\u521b\u65b0\u6280\u80fd\u7ade\u8d5b\uff08\u667a\u80fd\u7269\u8054\u7f51\u5c0f\u8f66\u8d5b\u9053\uff09\uff0c\u6b64\u5904\u89c1\u5b98\u7f51\u94fe\u63a5\u3002\u5c0f\u8f66\u5177\u5907\u5faa\u8ff9\u3001\u901f\u5ea6\u63a7\u5236\u3001\u5149\u7167\u5f3a\u5ea6\u68c0\u6d4b\u3001\u8ddd\u79bb\u6d4b\u91cf\u3001\u706f\u5149\u63a7\u5236\u7b49\u529f\u80fd\uff0c\u5e76\u901a\u8fc7\u84dd\u7259\u6216WiFi\u4e0e\u4e0a\u4f4d\u673a\u8fdb\u884c\u901a\u4fe1\uff0c\u5b9e\u73b0\u8fdc\u7a0b\u64cd\u63a7\u548c\u6570\u636e\u5904\u7406\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5faa\u8ff9: \u5229\u7528\u7ea2\u5916\u53cd\u5c04\u4f20\u611f\u5668\u5b9e\u73b0\u81ea\u4e3b\u5faa\u8ff9\uff0c\u5b8c\u6210\u8d5b\u9053\u4e0a\u7684\u884c\u9a76\u4efb\u52a1\u3002<\/li>\n\n\n\n<li>\u901f\u5ea6\u63a7\u5236: \u901a\u8fc7\u4e0a\u4f4d\u673a\u6216\u6309\u952e\u8bbe\u7f6e\u76ee\u6807\u8f66\u901f\uff0c\u5e76\u63a7\u5236\u5c0f\u8f66\u4ee5\u76ee\u6807\u901f\u5ea6\u884c\u9a76\u3002<\/li>\n\n\n\n<li>\u5149\u7167\u5f3a\u5ea6\u68c0\u6d4b: \u5229\u7528\u5149\u654f\u7535\u963b\u4f20\u611f\u5668\u6d4b\u91cf\u5149\u7167\u5f3a\u5ea6\uff0c\u5e76\u5728\u8f66\u8f7d\u663e\u793a\u5c4f\u548c\u4e0a\u4f4d\u673a\u4e0a\u663e\u793a\u7ed3\u679c\u3002<\/li>\n\n\n\n<li>\u8ddd\u79bb\u6d4b\u91cf: \u5229\u7528\u8d85\u58f0\u6ce2\u4f20\u611f\u5668\u6d4b\u91cf\u5c0f\u8f66\u4e0e\u8def\u969c\u4e4b\u95f4\u7684\u8ddd\u79bb\uff0c\u5e76\u63a7\u5236\u5c0f\u8f66\u5728\u6307\u5b9a\u8ddd\u79bb\u5185\u505c\u8f66\u3002<\/li>\n\n\n\n<li>\u706f\u5149\u63a7\u5236: \u652f\u6301\u8fdc\u7a0b\u63a7\u5236\u548c\u81ea\u52a8\u63a7\u5236\u4e24\u79cd\u6a21\u5f0f\uff0c\u53ef\u63a7\u5236RGB\u706f\u7684\u989c\u8272\u548c\u52a8\u4f5c\u3002<\/li>\n\n\n\n<li>\u8fdc\u7a0b\u64cd\u63a7: \u901a\u8fc7\u84dd\u7259\u6216WiFi\u4e0e\u4e0a\u4f4d\u673a\u8fdb\u884c\u901a\u4fe1\uff0c\u5b9e\u73b0\u8fdc\u7a0b\u64cd\u63a7\u5c0f\u8f66\u884c\u9a76\u3002<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e3b\u63a7: ESP32S3\u6838\u5fc3\u677f\uff1b<\/li>\n\n\n\n<li>\u7535\u673a\u9a71\u52a8: TB6612FNG\u6a21\u5757\uff1b<\/li>\n\n\n\n<li>\u5faa\u8ff9\u4f20\u611f\u5668: TCRT5000\u6a21\u5757\uff1b<\/li>\n\n\n\n<li>\u7535\u673a: N20 \u51cf\u901f\u7535\u673a\uff1b<\/li>\n\n\n\n<li>\u7535\u6c60: \u5355\u828218650 \u7535\u6c60\uff1b<\/li>\n\n\n\n<li>\u4f20\u611f\u5668\u63a5\u53e3: \u652f\u6301\u62d3\u5c55\u5149\u7167\u5f3a\u5ea6\u4f20\u611f\u5668\u3001\u8d85\u58f0\u6ce2\u4f20\u611f\u5668\u7b49<\/li>\n\n\n\n<li>\u901a\u4fe1\u65b9\u5f0f: \u84dd\u7259\u3001WiFi<\/li>\n\n\n\n<li>\u4f20\u611f\u5668\u652f\u67b6 \u89c1\u9644\u4ef6<\/li>\n<\/ul>\n\n\n\n<p>\u529f\u80fd\u6d4b\u8bd5\u4ee3\u7801\uff1a<a href=\"https:\/\/gitee.com\/anysets\/aia-t-car-test-program\">AIA-T Car Test Program<\/a><\/p>\n\n\n\n<p>\u5f00\u6e90\u8d44\u6599\u5730\u5740\uff1a<a href=\"https:\/\/oshwhub.com\/an__kang\/xun-xian-xiao-che\">AIA-T-Car \u5de1\u7ebf\u5c0f\u8f66 &#8211; \u7acb\u521b\u5f00\u6e90\u786c\u4ef6\u5e73\u53f0<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.1 \u7ec4\u88c5\u6559\u7a0b<\/h2>\n\n\n\n<iframe loading=\"lazy\" src=\"\/\/player.bilibili.com\/player.html?isOutside=true&#038;aid=113708739073325&#038;bvid=BV1zhkoYTEFK&#038;cid=27513850924&#038;p=1\" scrolling=\"no\" border=\"0\" width=\"800px\" height=\"540px\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"><\/iframe>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5c0f\u8f66\u7ec6\u8282\u56fe<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"886\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21.jpeg\" alt=\"\u6b64\u56fe\u7247\u7684 alt \u5c5e\u6027\u4e3a\u7a7a\uff1b\u6587\u4ef6\u540d\u4e3a 5B0D6EECC5E9C29D140F9FC831FD94F7-1024x886.jpg\" class=\"wp-image-541\" style=\"width:556px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21.jpeg 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21-300x260.jpeg 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21-768x665.jpeg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"886\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/19B46755456E6084896352129E4D6124-1024x886.jpg\" alt=\"\" class=\"wp-image-439\" style=\"width:550px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/19B46755456E6084896352129E4D6124-1024x886.jpg 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/19B46755456E6084896352129E4D6124-300x260.jpg 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/19B46755456E6084896352129E4D6124-768x664.jpg 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/19B46755456E6084896352129E4D6124-1536x1329.jpg 1536w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/19B46755456E6084896352129E4D6124.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">1.2 \u57fa\u672c\u5faa\u8ff9\u529f\u80fd<\/h2>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/b1577ada14b0baea3d9780c8e0761d25.mp4\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">1.3 \u9065\u63a7\u4e0e\u6444\u50cf\u5934\u56fe\u4f20<\/h2>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 960 \/ 720;\" width=\"960\" controls src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/0b0c9d4793614e80645c77276221b5e6_WC-EditVideo_1_20250127_22143579.mp4\"><\/video><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">2 \u5c0f\u8f66\u8fd0\u52a8\u5b66\u6a21\u578b<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">2.1 \u57fa\u7840\u8fd0\u52a8\u5b66\u6a21\u578b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u8fd0\u52a8\u5f62\u5f0f<\/strong><\/h3>\n\n\n\n<p>\u8f6e\u5f0f\u673a\u5668\u4eba\u4e00\u79cd\u5e38\u89c1\u7684\u6784\u578b\u5982\u4e0b\uff0c\u7531\u4e24\u4e2a\u72ec\u7acb\u9a71\u52a8\u7684\u8f6e\u5b50\u9a71\u52a8(\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u968f\u52a8\u8f6e\u6765\u652f\u6491)\uff0c\u5982\u4e0b\u56fe\u6240\u793a:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"653\" height=\"495\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-13.png\" alt=\"\" class=\"wp-image-517\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-13.png 653w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-13-300x227.png 300w\" sizes=\"auto, (max-width: 653px) 100vw, 653px\" \/><\/figure>\n\n\n\n<p>o_motion\u4e3a\u5706\u5f27\u8fd0\u52a8\u5706\u5fc3<\/p>\n\n\n\n<p>o_robot\u4e3a\u673a\u5668\u4eba\u51e0\u4f55\u8d28\u5fc3<\/p>\n\n\n\n<p>v\u4e3a\u5c0f\u8f66\u8f66\u4f53\u8d28\u5fc3\u8fd0\u52a8\u901f\u5ea6<\/p>\n\n\n\n<p>\u03c9\u4e3a\u5c0f\u8f66\u7ed5\u8f74\u8f6c\u901f<\/p>\n\n\n\n<p><strong>\u5f53v1=v2\u65f6<\/strong><\/p>\n\n\n\n<p>\u673a\u5668\u4eba\u4f5c\u76f4\u7ebf\u8fd0\u52a8\uff0c\u6b64\u65f6\u5706\u5f27\u8fd0\u52a8\u5706\u5fc3o_motion\u4f4d\u4e8e\u65e0\u7a77\u8fdc\u5904\uff0cv=v1=v2<\/p>\n\n\n\n<p><strong>\u5f53v1!=v2\u65f6<\/strong><\/p>\n\n\n\n<p>\u5f53v1\u4e0ev2\u4e3a\u540c\u65b9\u5411\u65f6\uff0c \u673a\u5668\u4eba\u7ed5\u8fdc\u5904\u5706\u5fc3o_motion\uff0c\u505a\u5706\u5468\u8fd0\u52a8\uff0c\u673a\u5668\u4eba\u4f5c\u5706\u5f27\u8fd0\u52a8\uff0c\u6b64\u65f6\u6709<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"290\" height=\"76\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-14.png\" alt=\"\" class=\"wp-image-518\"\/><\/figure>\n\n\n\n<p>\u5176\u4e2dH\u4e3a\u4e24\u4e2a\u9a71\u52a8\u8f6e\u7684\u8ddd\u79bb\uff0c&nbsp;R\u4e3a\u4e24\u8f6e\u4e2d\u5fc3\u7684\u8fd0\u52a8\u534a\u5f84\u3002<\/p>\n\n\n\n<p><strong>\u5f53v1,v2\u5f02\u53f7\u6216\u5176\u4e2d\u4e00\u4e2a\u4e3a\u96f6\u65f6<\/strong><\/p>\n\n\n\n<p>\u5dee\u52a8\u673a\u5668\u4eba\u4f5c\u7ed5\u81ea\u8eab\u4e2d\u5fc3\u7684\u81ea\u8f6c(\u56e0\u4e3a\u529b\u77e9\u4e2d\u5fc3\u4f4d\u4e8e\u673a\u5668\u4eba\u4e24\u8f6e\u4e2d\u5fc3)\uff0c\u673a\u5668\u4eba\u4e2d\u5904\u7684\u7ebf\u901f\u5ea6v\u4e3a\u96f6\uff0c\u5176\u89d2\u901f\u5ea6\u03c9\u4e3a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"154\" height=\"70\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-15.png\" alt=\"\" class=\"wp-image-519\"\/><\/figure>\n\n\n\n<p>\u901a\u8fc7\u4e0a\u5f0f\u53ef\u6c42\u89e3\u673a\u5668\u4eba\u505a\u5706\u5468\u8fd0\u52a8\u65f6\u4e24\u8f6e\u901f\u5ea6\u4e0e\u4e24\u8f6e\u4e2d\u5fc3\u5904\u7684v,w\u4e4b\u95f4\u7684\u89e3\u7b97\u5173\u7cfb\u3002<\/p>\n\n\n\n<p>\u5df2\u77e5v1,v2\u6c42\u89e3v,\u03c9\u79f0\u4f5c<strong>\u6b63\u8fd0\u52a8\u5b66:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"200\" height=\"134\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-16.png\" alt=\"\" class=\"wp-image-520\"\/><\/figure>\n\n\n\n<p>\u5df2\u77e5v,\u03c9\u6c42\u89e3v1,v2\u79f0\u4f5c<strong>\u9006\u8fd0\u52a8\u5b66\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"183\" height=\"115\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-17.png\" alt=\"\" class=\"wp-image-521\"\/><\/figure>\n\n\n\n<p>\u4e0a\u9762\u4fbf\u662f\u673a\u5668\u4eba\u5f53\u4e2d\u7684\u6b63\u9006\u89e3\u7684\u6982\u5ff5\uff0c\u4e5f\u5b8c\u6210\u4e86\u8f6e\u901f\u4e0e\u8fd0\u52a8\u7ebf\u901f\u5ea6\u4e0e\u89d2\u901f\u5ea6\u4e4b\u95f4\u7684\u63a8\u5bfc\u3002<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.2 AIA-T \u5c0f\u8f66 \u9006\u8fd0\u52a8\u5b66\u6a21\u578b<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"570\" height=\"693\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-18.png\" alt=\"\" class=\"wp-image-522\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-18.png 570w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-18-247x300.png 247w\" sizes=\"auto, (max-width: 570px) 100vw, 570px\" \/><\/figure>\n<\/div>\n\n\n<p>\u5982\u56fe\u6240\u793a\u4e3a\u5c0f\u8f66\u7684\u8bbe\u8ba1\u5c3a\u5bf8\uff08\u5b9e\u9645\u5c3a\u5bf8\u9700\u6839\u636e\u5b9e\u9645\u88c5\u914d\u60c5\u51b5\u6d4b\u91cf\uff09\uff0c\u53ef\u5f97\u5c0f\u8f66\u7684\u8f6e\u8ddd\u4e3a95.4mm\u3002<\/p>\n\n\n\n<p>\u5219\u53ef\u7f16\u5199\u5c0f\u8f66\u7684\u9006\u8fd0\u52a8\u5b66\u7b97\u6cd5\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5b9a\u4e49\u8f6e\u5b50\u4e4b\u95f4\u7684\u8ddd\u79bb\uff08\u8f74\u8ddd\uff09\uff0c\u5355\u4f4d\uff1amm\n#define WHEEL_BASE 95.4 \n\n\n\/\/ \u9006\u8fd0\u52a8\u5b66\u51fd\u6570\nvoid inverse_kinematics(double v, double omega, double *left_wheel_speed, double *right_wheel_speed) {\n    \/\/ \u8ba1\u7b97\u5de6\u53f3\u8f6e\u7684\u901f\u5ea6\n    *left_wheel_speed = v - omega * WHEEL_BASE \/ 2.0;\n    *right_wheel_speed = v + omega * WHEEL_BASE \/ 2.0;\n}<\/pre>\n\n\n\n<p>\u8be5\u51fd\u6570\u53ef\u4f20\u5165\u76ee\u6807\u901f\u5ea6v\u548c\u03c9\uff0c\u4f20\u5165\u5de6\u8f6e\u901f\u5ea6\u548c\u53f3\u8f6e\u901f\u5ea6\u7ed3\u679c\u53d8\u91cf\u7684\u6307\u9488\u3002<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">3. \u5149\u7535\u5faa\u8ff9\u5c0f\u8f66\u5faa\u8ff9\u539f\u7406<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">3.1\u5faa\u8ff9\u539f\u7406<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"712\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180835-1-1024x712.png\" alt=\"\" class=\"wp-image-471\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180835-1-1024x712.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180835-1-300x209.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180835-1-768x534.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180835-1-1536x1069.png 1536w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180835-1.png 1610w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u5c0f\u8f66\u5faa\u8ff9\u7684\u539f\u7406\u662f\u6839\u636e\u524d\u97625\u4e2a\u5149\u7535\u7ba1\u6240\u8bfb\u53d6\u76845\u4e2a\u6570\u636e\u8fdb\u884c\u68c0\u6d4b\u5730\u9762\u4e0a\u7684\u9ed1\u7ebf\uff0c\u5f53\u4f20\u611f\u5668\u68c0\u6d4b\u5230\u9ed1\u7ebf\u65f6\uff0c\u4f1a\u53d1\u51fa\u4fe1\u53f7\uff0c\u7136\u540e\u6839\u636e\u8fd9\u4e9b\u4fe1\u53f7\u5224\u65ad\u5c0f\u8f66\u7684\u4f4d\u7f6e\uff0c\u5e76\u901a\u8fc7\u8c03\u6574\u5de6\u53f3\u8f6e\u5b50\u7684\u901f\u5ea6\u6765\u7ea0\u6b63\u5c0f\u8f66\u7684\u884c\u8fdb\u65b9\u5411\uff0c\u786e\u4fdd\u5c0f\u8f66\u80fd\u591f\u6cbf\u7740\u9ed1\u7ebf\u884c\u9a76\u3002<\/p>\n\n\n\n<p>\u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u901a\u8fc75\u4e2a\u5149\u7535\u7ba1\u8f93\u51fa\u7684\u4e0d\u540c\u4fe1\u53f7\u8fdb\u884c\u6392\u5217\u5e76\u5224\u65ad\u5c0f\u8f66\u7684\u72b6\u6001\uff0c\u4ece\u800c\u8fdb\u884c\u4e0d\u4e00\u6837\u7684\u8c03\u6574<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3.2\u5149\u7535\u7ba1<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"714\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180848-1-1024x714.png\" alt=\"\" class=\"wp-image-472\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180848-1-1024x714.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180848-1-300x209.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180848-1-768x536.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180848-1-1536x1071.png 1536w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180848-1.png 1607w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u5bf9\u4e8e\u8f93\u51fa\u4fe1\u53f7\u7684\u5149\u7535\u7ba1\u9700\u8981\u8fdb\u884c\u9002\u5f53\u7684\u4e86\u89e3\uff1a\u5149\u7535\u7ba1\u662f\u4e00\u79cd\u5229\u7528\u5149\u7535\u6548\u5e94\u5c06\u5149\u80fd\u8f6c\u6362\u4e3a\u7535\u80fd\u7684\u654f\u611f\u5668\u4ef6\u3002\u5c31\u662f\uff0c\u5176\u4f1a\u6839\u636e\u4e0d\u540c\u7684\u5149\u4eae\u7a0b\u5ea6\u8f93\u51fa\u4e0d\u4e00\u6837\u7684\u4fe1\u53f7\u3002<\/p>\n\n\n\n<p>\u800c\u8f93\u51fa\u7684\u4fe1\u53f7\u53c8\u6709\u533a\u522b\uff0c\u5206\u4e3a\u6a21\u62df\u91cf\u548c\u6570\u5b57\u91cf\u3002\u4ed6\u4eec\u6700\u5927\u7684\u533a\u522b\u5c31\u662f\u6a21\u62df\u91cf\u662f\u8fde\u7eed\u7684\u91cf\uff0c\u53ef\u4ee5\u53d6\u65e0\u9650\u591a\u4e2a\u503c\uff0c\u800c\u6570\u5b57\u91cf\u662f\u79bb\u6563\u7684\uff0c\u53ea\u80fd\u53d6\u6709\u9650\u4e2a\u7279\u5b9a\u7684\u503c\u3002\u56e0\u4e3a\uff0c\u6a21\u62df\u91cf\u8f93\u51fa\u7684\u662f\u4e00\u4e2a\u8fde\u7eed\u53d8\u5316\u7684\u7535\u538b\u6216\u7535\u6d41\u4fe1\u53f7\uff0c\u8fd9\u4e2a\u4fe1\u53f7\u7684\u5f3a\u5ea6\u4e0e\u63a5\u6536\u5230\u7684\u5149\u5f3a\u5ea6\u6210\u6b63\u6bd4\uff0c\u6570\u5b57\u91cf\u8f93\u51fa\u7684\u662f\u6570\u5b57\u4fe1\u53f7\uff0c\u901a\u5e38\u662f0\u548c1\uff0c\u8868\u793a\u5149\u662f\u5426\u5b58\u5728\u6216\u8005\u662f\u5426\u8fbe\u5230\u67d0\u4e2a\u9608\u503c\u3002<\/p>\n\n\n\n<p>\u7279\u522b\u7684\uff0c\u5149\u7535\u7ba1\u540e\u9762\u7ea2\u8272\u7684\u952e\u5e3d\u5c31\u662f\u63a7\u5236\u4ec0\u4e48\u8f93\u51fa\u4fe1\u53f7\u7684\uff0c\u56fe\u4e2d\uff0c\u5c31\u662f\u6a21\u62df\u91cf\u8f93\u51fa\u4fe1\u53f7\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3.3 \u4fe1\u606f\u5904\u7406<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"714\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180946-1-1024x714.png\" alt=\"\" class=\"wp-image-473\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180946-1-1024x714.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180946-1-300x209.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180946-1-768x535.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180946-1-1536x1071.png 1536w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180946-1.png 1607w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u6b63\u5982\u4e4b\u524d\u6240\u8bf4\u7684\uff0c\u901a\u8fc75\u4e2a\u5149\u7535\u7ba1\u8f93\u51fa\u7684\u4e0d\u540c\u4fe1\u53f7\u8fdb\u884c\u6392\u5217\u5e76\u5224\u65ad\u5c0f\u8f66\u7684\u72b6\u6001\uff0c\u4ece\u800c\u8fdb\u884c\u4e0d\u4e00\u6837\u7684\u8c03\u6574\u3002\u8fd9\u91cc\uff0c\u67095\u4e2a\u5149\u7535\u7ba1\uff0c\u8bbe\u4e3a\uff1aD1,D2,D3,D4,D5\u3002\u5219\u4ed6\u4eec\u5206\u522b\u4e58\u4e0a10000\uff0c1000\uff0c100\uff0c10\uff0c1\uff0c\u53ef\u5f97\u5230\u4e00\u4e2a\u4ee3\u8868\u5c0f\u8f66\u5f53\u524d\u72b6\u6001\u7684\u503c\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u901a\u8fc7\u8fd9\u4e2a\u503c\u8fdb\u884c\u5224\u65ad\uff0c\u662f\u5426\u8fdb\u884c\u4ec0\u4e48\u64cd\u4f5c\u3002\u6bd4\u5982\uff1a00100\uff0c\u4e5f\u5c31\u662f100\uff0c\u5c31\u662f\u6b63\u4e2d\u95f4\u7684\u5149\u7535\u7ba1\u68c0\u6d4b\u5230\u4e86\u9ed1\u7ebf\uff0c\u5c31\u4e0d\u505a\u4efb\u4f55\u53d8\u5316\u3002\u9664\u4e86\u8fd9\u4e9b\u8fd8\u5f15\u8fdb\u4e86\u53d8\u91cferror\u548ca\uff0cerror\u662f\u7528\u6765\u5224\u65ad\u504f\u79fb\u65b9\u5411\uff0c\u7528\u6765\u5224\u65ad\u504f\u79fb\u7a0b\u5ea6\u7684\u3002\u540e\u9762\u4ee3\u7801\u518d\u8be6\u7ec6\u8bb2\u600e\u4e48\u7528\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3.4 \u5c0f\u8f66\u8f6c\u901f\u8c03\u6574<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"715\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180959-1-1024x715.png\" alt=\"\" class=\"wp-image-474\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180959-1-1024x715.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180959-1-300x210.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180959-1-768x536.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180959-1-1536x1073.png 1536w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-02-180959-1.png 1602w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u5c31\u662ferror\u548ca\u7684\u7528\u5904\u4e86\uff0c\u4e24\u8fb9\u7535\u673a\u5206\u522b\u7528\u4e00\u4e2a\u57fa\u7840\u503c\u52a0\u4e0e\u51cferror * a\uff0c\u4ece\u800c\u5b9e\u73b0\u4e24\u8f6e\u7684\u5dee\u901f\uff0c\u4ece\u800c\u5b9e\u73b0\u5c0f\u8f66\u5fae\u8c03\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3.5 \u5b9e\u7269\u5c55\u793a<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"998\" height=\"749\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-3.png\" alt=\"\" class=\"wp-image-475\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-3.png 998w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-3-300x225.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-3-768x576.png 768w\" sizes=\"auto, (max-width: 998px) 100vw, 998px\" \/><\/figure>\n\n\n\n<p>\u770boled\u5c4f\uff0c\u524d\u4e24\u884c\uff0c\u7b2c\u4e00\u884c\u662f\u5de6\u8f6epwm\u503c\uff0c\u7b2c\u4e8c\u884c\u662f\u53f3\u8f6epwm\u503c\uff0c\u7b2c\u4e09\u884c\u662f\u4e94\u4e2a\u5149\u7535\u7ba1\u7684\u6a21\u62df\u91cf\u5f52\u4e00\u5316\u540e\u7684\u503c\uff0c\u7b2c\u4e09\u884c\u662f\u5bf9\u5f52\u4e00\u5316\u540e\u7684\u503c\u6539\u6210\u6570\u5b57\u91cf\u7684\u503c\u3002\u800c\u4e3a\u4ec0\u4e48\u8981\u8bfb\u53d6\u6a21\u62df\u91cf\uff0c\u518d\u6539\u6210\u6570\u5b57\u91cf\uff0c\u56e0\u4e3a\u8fd9\u6837\u7684\u8bdd\uff0c\u6211\u4eec\u7684\u9608\u503c\u5c31\u80fd\u81ea\u5df1\u63a7\u5236\u4e86\uff0c\u66f4\u65b9\u4fbf\u8c03\u8f66\u3002<\/p>\n\n\n\n<p>\u8fd9\u662f00100\u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u6211\u8bbe\u7684\u9608\u503c\u4e3a15\uff0c\u90a3\u6211D3\u7684\u503c51\u5927\u4e8e15\uff0c\u4e5f\u5c31\u53d8\u62101\u4e86\uff0c\u5176\u4f59\u7684\u90fd\u5c0f\u4e8e15\uff0c\u4e5f\u5c31\u662f0\u4e86\uff0c\u53ef\u4ee5\u770b\u5230\u4e24\u8fb9\u7684pwm\u662f\u4e00\u6837\u7684\uff0c\u4e5f\u5c31\u662f\u76f4\u884c\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"998\" height=\"748\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-4.png\" alt=\"\" class=\"wp-image-476\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-4.png 998w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-4-300x225.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-4-768x576.png 768w\" sizes=\"auto, (max-width: 998px) 100vw, 998px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1023\" height=\"767\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-5.png\" alt=\"\" class=\"wp-image-477\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-5.png 1023w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-5-300x225.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-5-768x576.png 768w\" sizes=\"auto, (max-width: 1023px) 100vw, 1023px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"985\" height=\"739\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-6.png\" alt=\"\" class=\"wp-image-478\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-6.png 985w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-6-300x225.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-6-768x576.png 768w\" sizes=\"auto, (max-width: 985px) 100vw, 985px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"998\" height=\"748\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-7.png\" alt=\"\" class=\"wp-image-479\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-7.png 998w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-7-300x225.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-7-768x576.png 768w\" sizes=\"auto, (max-width: 998px) 100vw, 998px\" \/><\/figure>\n\n\n\n<p>\u4e0a\u9762\u56db\u5f20\u56fe\u5206\u522b\u662f\u5411\u5de6\u6216\u8005\u53f3\u504f\u79fb\u7684\u4e0d\u540c\u60c5\u51b5\uff0c\u5206\u522b\u5c31\u662fD1,D2,D4,D5\u5728\u9ed1\u7ebf\u4e0a\u7684\u60c5\u51b5\uff0c\u8fd9\u91cc\u660e\u663e\u770b\u5230\u4e24\u8fb9pwm\u503c\u662f\u4e0d\u4e00\u6837\u7684\uff0c\u800c\u504f\u79fb\u7a0b\u5ea6\u4e0d\u4e00\u6837\uff0cpwm\u5dee\u4e5f\u4f1a\u66f4\u5927\uff0c\u56e0\u4e3a\u6211\u6539\u4e86a\u7684\u5927\u5c0f\uff0c\u800cerror\u7684\u6b63\u8d1f\u5219\u51b3\u5b9a\u4e86\u504f\u79fb\u7684\u65b9\u5411<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1280\" style=\"aspect-ratio: 720 \/ 1280;\" width=\"720\" controls src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/9d18a7b9db97010544e8b1d9ca3b9852-1.mp4\"><\/video><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"567\" height=\"756\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-9.png\" alt=\"\" class=\"wp-image-483\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-9.png 567w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/image-9-225x300.png 225w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><\/figure>\n<\/div>\n\n\n<p>\u8fd9\u5c31\u662f\u5728\u76f4\u89d2\u7684\u60c5\u51b5\uff1a00111\uff0c\u8fd9\u91cc\u6211\u5c06a\u7684\u503c\u8c03\u7684\u5f88\u5927\uff0c\u5bfc\u81f4\u8f6e\u5b50pwm\uff0c\u4e00\u4e3a255\uff0c\u53e6\u4e00\u4e2a\u4e3a0\uff0c\u5219\u5b9e\u73b0\u4e86\u76f4\u89d2\u8f6c\u5f2f\u7684\u6548\u679c\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">4 \u8f66\u8f7dRGB\u5c0f\u706f\u63a7\u5236<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">4<strong>.1 RGB LED\u7684\u4ecb\u7ecd<\/strong><\/h2>\n\n\n\n<p>\u9996\u5148\u4ecb\u7ecd\u4e00\u4e0b\u5173\u4e8ergb\u7684\u90e8\u5206\uff1a<\/p>\n\n\n\n<p>RGB LED \u5143\u4ef6\u901a\u5e38\u6307\u7684\u662f\u80fd\u591f\u53d1\u51fa\u7ea2\u3001\u7eff\u3001\u84dd\u4e09\u79cd\u989c\u8272\u7684\u7535\u5b50\u5143\u4ef6\uff0c\u539f\u7406\u662f\u901a\u8fc7\u6df7\u5408\u4e0d\u540c\u6bd4\u4f8b\u7684\u7ea2\u3001\u7eff\u3001\u84dd\u5149\u7ebf\u6765\u751f\u6210\u5404\u79cd\u989c\u8272\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u7684RGB LED\u5219\u7528\u7684\u662fWS2812B \u82af\u7247<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u662f\u5173\u4e8e\u8be5\u82af\u7247\u7684\u5f15\u811a\u5b9a\u4e49\u548c\u5f15\u51fa\u7aef\u529f\u80fd\uff1a\u5305\u62ec\u6570\u636e\u8f93\u51fa\u4e0e\u8f93\u5165\uff0c\u903b\u8f91\u7535\u6e90\uff0c\u4f9b\u7535\u7535\u6e90\uff0c\u63a5\u5730<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"876\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-223951-1024x876.png\" alt=\"\" class=\"wp-image-500\" style=\"width:550px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-223951-1024x876.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-223951-300x257.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-223951-768x657.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-223951.png 1182w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>4.2 \u8c03\u7528RGB\u7684\u5e93<\/strong><\/h2>\n\n\n\n<p>\u800c\u8c03\u7528RGB\u7684\u5e93\u76f8\u5f53\u591a\uff0c\u6211\u4eec\u8fd9\u91cc\u4e3b\u8981\u7528\u7684\u662fAdafruit_NeoPixel\u5e93\uff0c\u5b83\u662f\u7b2c\u4e09\u65b9\u5e93\uff0c\u4e5f\u662f\u9700\u8981\u4e0b\u8f7d\u7684\uff1a<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"599\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224420-1024x599.png\" alt=\"\" class=\"wp-image-501\" style=\"width:695px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224420-1024x599.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224420-300x175.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224420-768x449.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224420-1536x898.png 1536w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224420-2048x1198.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224517-1024x576.png\" alt=\"\" class=\"wp-image-502\" style=\"width:695px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224517-1024x576.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224517-300x169.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224517-768x432.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224517-1536x864.png 1536w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-224517-2048x1151.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Pio\u63d2\u4ef6\u4e2dLibraries\u4e2d\uff0c\u76f4\u63a5\u641c\u7d22Adafruit_NeoPixel\u5373\u53ef\uff0c\u7b2c\u4e00\u4e2a39\u4e07\u4e0b\u8f7d\u7684\u5c31\u662f\u4e86\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4.3 \u4ee3\u7801\u5b9e\u73b0<\/strong><\/h2>\n\n\n\n<p>Rgb\u8fd0\u7528\u7684\u4ee3\u7801\u4e3b\u8981\u7684\u7ec4\u6210\u5305\u62ec\uff1a\u5f15\u5165\u5934\u6587\u4ef6\uff0c\u5b9a\u4e49\u5f15\u811a\uff0c\u521b\u5efa NeoPixel \u5bf9\u8c61\uff0c\u521d\u59cb\u5316 NeoPixel\uff0c\u8bbe\u7f6e\u4eae\u5ea6\uff0c\u63a7\u5236 LED \u989c\u8272\u5e76\u663e\u793a\uff1a<\/p>\n\n\n\n<p>\u5f15\u5165\u5934\u6587\u4ef6<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"606\" height=\"96\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-230207.png\" alt=\"\" class=\"wp-image-503\" style=\"width:423px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-230207.png 606w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-230207-300x48.png 300w\" sizes=\"auto, (max-width: 606px) 100vw, 606px\" \/><\/figure>\n\n\n\n<p>\u5982\u679c\u4e0b\u8f7d\u597d\u4e86\u7b2c\u4e09\u65b9\u5e93\uff0c\u76f4\u63a5\u5982\u4e0a\u8c03\u7528<em><\/em><\/p>\n\n\n\n<p>\u5b9a\u4e49\u5f15\u811a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"555\" height=\"96\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225002.png\" alt=\"\" class=\"wp-image-504\" style=\"width:435px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225002.png 555w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225002-300x52.png 300w\" sizes=\"auto, (max-width: 555px) 100vw, 555px\" \/><\/figure>\n\n\n\n<p>\u5b9a\u4e49\u6211\u4eec\u6240\u7528RGB\u7684\u5f15\u811a\uff0c\u65b9\u4fbf\u540e\u9762\u7684\u5efa\u7acb\u5b9e\u4f8b\u5bf9\u8c61\uff0c\u6211\u4eec\u4e24RGB\u5de6\u8fb9\u5c31\u662fg6\uff0c\u53f3\u8fb9\u5c31\u662fg7<\/p>\n\n\n\n<p>\u521b\u5efa NeoPixel \u5bf9\u8c61<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"714\" height=\"105\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225024.png\" alt=\"\" class=\"wp-image-505\" style=\"width:437px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225024.png 714w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225024-300x44.png 300w\" sizes=\"auto, (max-width: 714px) 100vw, 714px\" \/><\/figure>\n\n\n\n<p>\u5206\u522b\u521b\u5efa\u4e86\u4e24\u4e2a&nbsp;Adafruit_NeoPixel&nbsp;\u7c7b\u7684\u5b9e\u4f8b&nbsp;RGB1&nbsp;\u548c&nbsp;RGB2\uff0c\u7528\u4e8e\u63a7\u5236\u4e24\u4e2a\u4e0d\u540c\u7684 NeoPixel LED\u3002\u6784\u9020\u51fd\u6570&nbsp;Adafruit_NeoPixel&nbsp;\u6709\u4e09\u4e2a\u53c2\u6570\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u50cf\u7d20\u6570\u91cf<\/strong>&nbsp;(int numPixels)\uff1a\u8fd9\u4e2a\u53c2\u6570\u6307\u5b9a\u4e86\u8981\u63a7\u5236\u7684 NeoPixel LED \u7684\u6570\u91cf\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c1&nbsp;\u8868\u793a\u6bcf\u4e2a\u5bf9\u8c61\u53ea\u63a7\u5236\u4e00\u4e2a LED\u3002<\/li>\n\n\n\n<li><strong>\u6570\u636e\u5f15\u811a<\/strong>&nbsp;(int pin)\uff1a\u8fd9\u4e2a\u53c2\u6570\u6307\u5b9a\u4e86\u8fde\u63a5\u5230 NeoPixel LED \u6570\u636e\u8f93\u5165\u7684\u5fae\u63a7\u5236\u5668\u5f15\u811a\u3002RGB1&nbsp;\u548c&nbsp;RGB2&nbsp;\u662f\u4e4b\u524d\u5b9a\u4e49\u7684\u5b8f\u6216\u5e38\u91cf\uff0c\u5b83\u4eec\u4ee3\u8868\u4e86\u8fde\u63a5\u5230\u6bcf\u4e2a NeoPixel LED \u7684\u7279\u5b9a\u5f15\u811a\u7f16\u53f7\u3002<\/li>\n\n\n\n<li><strong>\u50cf\u7d20\u7c7b\u578b<\/strong>&nbsp;(uint8_t type)\uff1a\u8fd9\u4e2a\u53c2\u6570\u6307\u5b9a\u4e86 NeoPixel&nbsp;LED \u7684\u989c\u8272\u7f16\u7801\u987a\u5e8f\u548c\u6570\u636e\u4f20\u8f93\u901f\u7387\u3002\u5b83\u662f\u7531\u4e24\u4e2a\u9884\u5b9a\u4e49\u7684\u5e38\u91cf\u7ec4\u5408\u800c\u6210\u7684\uff1a\n<ul class=\"wp-block-list\">\n<li><span style=\"color: initial;\"><strong>NEO_GRB<\/strong>\uff1a\u8868\u793a\u989c\u8272\u7f16\u7801\u987a\u5e8f\u662f\u7eff\u8272\u3001\u7ea2\u8272\u3001\u84dd\u8272\uff08GRB\uff09\u3002\u8fd9\u662f\u6700\u5e38\u89c1\u7684\u7f16\u7801\u987a\u5e8f\uff0c\u4f46\u6839\u636e\u4e0d\u540c\u7684 NeoPixel \u4ea7\u54c1\uff0c\u8fd8\u53ef\u80fd\u662f&nbsp;RGB\u3001GRBW\uff08\u52a0\u4e0a\u767d\u8272\uff09\u7b49\u3002<\/span><\/li>\n\n\n\n<li><strong>NEO_KHZ800<\/strong>\uff1a\u8868\u793a\u6570\u636e\u4f20\u8f93\u901f\u7387\u662f&nbsp;800 kHz\u3002\u8fd9\u662f NeoPixel \u7684\u6807\u51c6\u901a\u4fe1\u901f\u7387\uff0c\u4f46\u4e5f\u6709\u5176\u4ed6\u901f\u7387\u5982 400 kHz\uff08NEO_KHZ400\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u521d\u59cb\u5316 NeoPixel<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"487\" height=\"114\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225044.png\" alt=\"\" class=\"wp-image-506\" style=\"width:340px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225044.png 487w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225044-300x70.png 300w\" sizes=\"auto, (max-width: 487px) 100vw, 487px\" \/><\/figure>\n\n\n\n<p>\u521d\u59cb\u5316\u662f\u5e93\u5b9a\u4e49\u597d\u7684\uff0c\u76f4\u63a5\u7528\u5c31\u53ef\u4ee5\u4e86<\/p>\n\n\n\n<p>\u8bbe\u7f6e\u4eae\u5ea6<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"691\" height=\"87\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225317.png\" alt=\"\" class=\"wp-image-507\" style=\"width:470px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225317.png 691w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-225317-300x38.png 300w\" sizes=\"auto, (max-width: 691px) 100vw, 691px\" \/><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u7684\u65b9\u6cd5\u51fd\u6570\u5c31\u662f\u8c03\u8282rgb\u7684\u4eae\u5ea6\uff0c256\u662f\u6ee1\u4eae\u5ea6\uff0c64\u5c31\u662f1\/4\u4e86<\/p>\n\n\n\n<p>\u63a7\u5236 LED \u989c\u8272\u5e76\u663e\u793a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"790\" height=\"85\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-230430.png\" alt=\"\" class=\"wp-image-509\" style=\"width:582px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-230430.png 790w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-230430-300x32.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-12-230430-768x83.png 768w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/figure>\n\n\n\n<p>\u6700\u540e\u4e5f\u662f\u6700\u5173\u952e\u7684\u4e00\u6b65\uff0c<\/p>\n\n\n\n<p>.clear()\u5c06RGB\u989c\u8272\u8bbe\u7f6e\u4e3a&nbsp;(0, 0, 0)\uff0c\u5373\u5173\u95ed\u7ea2\u8272\u3001\u7eff\u8272\u548c\u84dd\u8272\u901a\u9053\u3002<\/p>\n\n\n\n<p>setPixelColor(0, rgb1.Color(0, 0, 255))\u7ed9RGB\u4e09\u4e2a\u901a\u9053\u5206\u522b\u7ed9\u4e0d\u4e00\u6837\u7684\u503c\uff0c\u4ee5\u6b64\u5b9e\u73b0\u4e0d\u4e00\u6837\u7684\u989c\u8272\u663e\u793a<\/p>\n\n\n\n<p>\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u50cf\u7d20\u7684\u7d22\u5f15\u3002\u5728\u6211\u4eec\u7684\u5b9e\u4f8b\u4e2d\uff0c0&nbsp;\u662f\u7b2c\u4e00\u4e2a\u50cf\u7d20\u7684\u7d22\u5f15\u3002\u7531\u4e8e&nbsp;rgb1&nbsp;\u5bf9\u8c61\u88ab\u521d\u59cb\u5316\u4e3a\u53ea\u5305\u542b\u4e00\u4e2a\u50cf\u7d20\uff08Adafruit_NeoPixel rgb1(1, RGB1, NEO_GRB + NEO_KHZ800);\uff09\uff0c\u6240\u4ee5\u53ea\u6709\u4e00\u4e2a\u50cf\u7d20\uff0c\u5176\u7d22\u5f15\u4e3a&nbsp;0\u3002<\/p>\n\n\n\n<p>\u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u50cf\u7d20\u7684\u989c\u8272\uff0c\u7531&nbsp;.Color()&nbsp;\u65b9\u6cd5\u8fd4\u56de\u3002.Color()&nbsp;\u65b9\u6cd5\u63a5\u53d7\u4e09\u4e2a\u53c2\u6570\uff0c\u5206\u522b\u4ee3\u8868\u7ea2\u8272\u3001\u7eff\u8272\u548c\u84dd\u8272\u7684\u4eae\u5ea6\u503c\uff0c\u8303\u56f4\u4ece&nbsp;0&nbsp;\u5230&nbsp;255\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c.Color(0, 0, 255)&nbsp;\u8bbe\u7f6e\u989c\u8272\u4e3a\u84dd\u8272\uff0c\u56e0\u4e3a\u53ea\u6709\u84dd\u8272\u901a\u9053\u7684\u4eae\u5ea6\u88ab\u8bbe\u7f6e\u4e3a\u6700\u5927\u3002<\/p>\n\n\n\n<p>.show()&nbsp;\u5c06\u6240\u6709\u901a\u8fc7&nbsp;.setPixelColor()&nbsp;\u8bbe\u7f6e\u7684\u989c\u8272\u66f4\u6539\u5e94\u7528\u5230\u5b9e\u9645\u7684 NeoPixel LED \u4e0a\uff0c\u8fd9\u6837\u5c06\u4f1a\u53d1\u9001\u6570\u636e\u5230 LED\uff0c\u4f7f\u5176\u663e\u793a\u65b0\u7684\u989c\u8272\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4.4 \u6574\u4f53\u601d\u8def<\/strong><\/h2>\n\n\n\n<p>\u7528\u4e00\u4e2aswitch\u653e\u5faa\u73af\u91cc<\/p>\n\n\n\n<p>\u5efa\u7acb\u4e00\u4e2a\u6807\u5fd7\u4f4d<\/p>\n\n\n\n<p>\u6807\u5fd7\u4f4d\u7684\u4e0d\u540c\u503c\u4e3aRGB\u7684\u4e0d\u540c\u4eae\u60c5\u51b5<\/p>\n\n\n\n<p>\u5982\uff1a<\/p>\n\n\n\n<p>\u76f4\u884c\uff0c\u6807\u5fd7\u4f4d\u8d4b\u4e880\uff1a RGB\u4eae\u60c5\u51b5\u4e3a\u4e24\u8fb9RGB\u5e38\u4eae<\/p>\n\n\n\n<p>\u5de6\u8f6c\uff0c\u6807\u5fd7\u4f4d\u8d4b\u4e881\uff1a RGB\u4eae\u60c5\u51b5\u4e3a\u5de6RGB\u95ea\u70c1<\/p>\n\n\n\n<p>\u53f3\u8fb9\uff0c\u6807\u5fd7\u4f4d\u8d4b\u4e882\uff1a RGB\u4eae\u60c5\u51b5\u4e3a\u53f3RGB\u95ea\u70c1<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">5 \u901f\u5ea6\u95ed\u73af\u63a7\u5236<\/h1>\n\n\n\n<p>\u5173\u4e8e\u95ed\u73af\u63a7\u5236\u7684\u601d\u60f3\u53ef\u4ee5\u67e5\u770b<a href=\"https:\/\/aimc.skyate.com\/index.php\/2025\/01\/27\/ai_system_introduction\/\">\u3010\u667a\u80fd\u7cfb\u7edf\u8bbe\u8ba1\u6559\u7a0b \u9636\u6bb5\u4e8c 7 \u667a\u80fd\u63a7\u5236\u6982\u8ff0\u3011<\/a>\u76f8\u5173\u5185\u5bb9\uff0c\u6b64\u5904\u4e0d\u518d\u4ecb\u7ecd\u3002\u95ed\u73af\u63a7\u5236\u4e3b\u8981\u5c31\u662f\u6839\u636e\u88ab\u63a7\u5bf9\u8c61\u7684\u72b6\u6001\u52a8\u6001\u8c03\u6574\u63a7\u5236\u91cf\u7684\u8f93\u51fa\u4ece\u800c\u8ba9\u88ab\u63a7\u5bf9\u8c61\u5728\u9762\u5bf9\u5916\u754c\u6270\u52a8\u7684\u4f5c\u7528\u65f6\u4f9d\u65e7\u7ef4\u6301\u5728\u6211\u4eec\u60f3\u8981\u7684\u76ee\u6807\u4e0a\u3002<\/p>\n\n\n\n<p>\u8981\u5b9e\u73b0\u95ed\u73af\u63a7\u5236\u9700\u8981\u6709\u4e09\u4e2a\u73af\u8282\uff1a\u611f\u77e5\u2192\u8ba1\u7b97\u2192\u6267\u884c\uff0c\u5206\u522b\u5bf9\u5e94\u4e86\u4f20\u611f\u5668\u3001\u63a7\u5236\u5668\uff08\u63a7\u5236\u7b97\u6cd5\uff09\u3001\u6267\u884c\u5668\u3002\u5177\u4f53\u5230\u6211\u4eec\u7684\u5c0f\u8f66\u901f\u5ea6\u95ed\u73af\u63a7\u5236\u6765\u770b\uff0c\u4f20\u611f\u5668\u9700\u8981\u611f\u53d7\u5c0f\u8f66\u8f66\u8f6e\u7684\u8f6c\u901f\u3001\u63a7\u5236\u5668\uff08\u63a7\u5236\u7b97\u6cd5\uff09\u9700\u8981\u6839\u636e\u5f53\u524d\u901f\u5ea6\u548c\u76ee\u6807\u901f\u5ea6\u7684\u8bef\u5dee\u6765\u8ba1\u7b97\u9700\u8981\u4f55\u79cd\u5927\u5c0f\u7684\u63a7\u5236\u91cf\u3001\u6267\u884c\u5668\u9700\u8981\u6839\u636e\u63a7\u5236\u91cf\u6765\u63a7\u5236\u7535\u673a\u8fdb\u800c\u5f71\u54cd\u8f66\u8f6e\u8f6c\u901f\u3002\u5219\uff1a<\/p>\n\n\n\n<p><strong>\u4f20\u611f\u5668<\/strong>\uff1a\u7f16\u7801\u5668<\/p>\n\n\n\n<p><strong>\u63a7\u5236\u5668\uff08\u63a7\u5236\u7b97\u6cd5\uff09<\/strong>\uff1aPID\u7b97\u6cd5<\/p>\n\n\n\n<p><strong>\u6267\u884c\u5668<\/strong>\uff1a\u7535\u673a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5.1 \u901f\u5ea6\u83b7\u53d6<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"551\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-20-1024x551.png\" alt=\"\" class=\"wp-image-582\" style=\"width:614px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-20-1024x551.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-20-300x162.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-20-768x414.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-20-1536x827.png 1536w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-20.png 1569w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u5176\u4e2d\u7f16\u7801\u5668\u548c\u7535\u673a\u96c6\u6210\u5728\u4e00\u8d77\uff0c\u5728\u7535\u673a\u7684\u5c3e\u90e8\u6709\u4e00\u4e2a\u9ed1\u8272\u5706\u5f62\u5757\uff0c\u8fd9\u662f\u4e00\u4e2a\u5f84\u5411\u78c1\u4f53\uff08\u4ec0\u4e48\u662f\u5f84\u5411\u78c1\u94c1\u89c1\u4e0b\u56fe\uff09\uff0c\u5728\u767d\u8272\u7535\u8def\u677f\u4e0a\u6709\u970d\u5c14\u4f20\u611f\u5668\u53ef\u4ee5\u611f\u53d7\u78c1\u573a\u53d8\u5316\u3002\u8fd9\u91cc\u6211\u4eec\u7b80\u5355\u7406\u89e3\u4e00\u4e0b\u5373\u78c1\u94c1\u8f6c\u4e00\u5708\uff0c\u970d\u5c14\u4f20\u611f\u5668\u4f1a\u8f93\u51fa7\u4e2a\u8109\u51b2\u4fe1\u53f7\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"575\" height=\"217\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-19.png\" alt=\"\" class=\"wp-image-581\" style=\"width:289px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-19.png 575w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-19-300x113.png 300w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/figure>\n<\/div>\n\n\n<p>\u7531\u4e8e\u8fd9\u4e2a\u78c1\u4f53\u662f\u8fde\u63a5\u5728\u7535\u673a\u8f93\u51fa\u8f74\u7684\uff0c\u800c\u7535\u673a\u8f93\u51fa\u8f74\u5230\u8f66\u8f6e\u9700\u8981\u7ecf\u8fc7\u51cf\u901f\u5668\u673a\u6784\uff0c\u56e0\u6b64\u8f66\u8f6e\u8f6c\u901f\u548c\u8109\u51b2\u4e4b\u95f4\u8fd8\u9700\u8981\u6362\u7b97\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"569\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21-1024x569.png\" alt=\"\" class=\"wp-image-583\" style=\"width:595px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21-1024x569.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21-300x167.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21-768x427.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21-1536x853.png 1536w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-21.png 1615w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>AIA-T\u8f66\u6a21\u4f7f\u7528\u7684\u662f\u51cf\u901f\u6bd4\u4e3a50\u7684N20\u7535\u673a\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"447\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-22-1024x447.png\" alt=\"\" class=\"wp-image-584\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-22-1024x447.png 1024w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-22-300x131.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-22-768x335.png 768w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-22.png 1211w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u56e0\u6b64\u8f66\u8f6e\u65cb\u8f6c\u4e00\u5468\uff0c\u5219\u7f16\u7801\u5668\u5e94\u8f93\u51fa350\u4e2a\u8109\u51b2\u3002\u800c\u6839\u636e\u8109\u51b2\u8ba1\u7b97\u8f6e\u901f\u5219\u6709\u4e24\u79cd\u65b9\u6cd5\uff0c\u5206\u522b\u4e3a\u5468\u671f\u6cd5\u548c\u9891\u7387\u6cd5\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.1.1 \u9891\u7387\u6cd5\u8ba1\u7b97\u8f6e\u901f<\/h3>\n\n\n\n<p>\u5728\u7ed9\u5b9a\u65f6\u95f4\u5185\uff0c\u8ba1\u7f16\u7801\u5668\u4ea7\u751f\u7684\u8109\u51b2\u6570\u3002\u7136\u540e\u7531\u4e0b\u5f0f\u6c42\u51fa\u5176\u8f6c\u901f<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"618\" height=\"96\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-23.png\" alt=\"\" class=\"wp-image-585\" style=\"width:508px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-23.png 618w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-23-300x47.png 300w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><\/figure>\n<\/div>\n\n\n<p>\u5176\u4e2dN1\u662f\u7ed9\u5b9a\u65f6\u95f4\u5185\u7f16\u7801\u5668\u4ea7\u751f\u7684\u8109\u51b2\u6570\u91cf\uff0ct\u662f\u7ed9\u5b9a\u7684\u65f6\u95f4\u957f\u5ea6\uff0cN\u662f\u8f6e\u5b50\u8f6c\u4e00\u5708\u6240\u5e94\u4ea7\u751f\u7684\u8109\u51b2\u6570\u91cf\u3002<\/p>\n\n\n\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f<strong>\u8fd9\u91cc\u8ba1\u7b97\u51fa\u7684\u8f6e\u901f\u662f\u8f6c\u901f\uff0c\u8fd8\u9700\u4e58\u8f6e\u5b50\u7684\u5468\u957f\u624d\u80fd\u5f97\u5230\u7ebf\u901f\u5ea6\u3002<\/strong><\/p>\n\n\n\n<p>\u4f8b\u5982<strong> \u8bbe\u67d0\u7f16\u7801\u5668\u7684\u989d\u5b9a\u5de5\u4f5c\u53c2\u6570\u662f<\/strong><strong> N<\/strong><strong>\uff1d<\/strong><strong>2048 <\/strong><strong>\u8109\u51b2<\/strong><strong>\/<\/strong><strong>\u8f6c<\/strong><strong>\uff0c\u5728<\/strong><strong>0.2 S<\/strong><strong>\u65f6\u95f4\u5185\u6d4b\u5f97<\/strong><strong>8192<\/strong><strong>\u4e2a\u8109\u51b2\uff0c\u6c42\u5176\u8f6c\u901f\u3002<\/strong><\/p>\n\n\n\n<p><strong>\u89e3\uff1a\u6839\u636e\u4e0a\u5f0f\u6709\uff1a<\/strong><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"527\" height=\"86\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-24.png\" alt=\"\" class=\"wp-image-586\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-24.png 527w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-24-300x49.png 300w\" sizes=\"auto, (max-width: 527px) 100vw, 527px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">5.1.2 \u5468\u671f\u6cd5\u6c42\u8f6c\u901f<\/h3>\n\n\n\n<p>\u901a\u8fc7\u8ba1\u6570\u7f16\u7801\u5668\u4e00\u4e2a\u8109\u51b2\u95f4\u9694\u5185\uff08\u534a\u4e2a\u8109\u51b2\u5468\u671f\uff09\u6807\u51c6\u65f6\u949f\u8109\u51b2\u4e2a\u6570\u6765\u8ba1\u7b97\u5176\u8f6c\u901f\uff0c\u56e0\u6b64\uff0c\u8981\u6c42\u65f6\u949f\u8109\u51b2\u7684\u9891\u7387\u5fc5\u987b\u9ad8\u4e8e\u7f16\u7801\u5668\u8109\u51b2\u7684\u9891\u7387\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"628\" height=\"108\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-25.png\" alt=\"\" class=\"wp-image-587\" style=\"width:474px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-25.png 628w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-25-300x52.png 300w\" sizes=\"auto, (max-width: 628px) 100vw, 628px\" \/><\/figure>\n<\/div>\n\n\n<p>\u540c\u65f6\u4e5f\u8981\u6ce8\u610f\u4ee5\u4e0a\u4e24\u79cd\u65b9\u6cd5\u53ea\u662f\u8ba1\u7b97\u51fa\u4e86\u901f\u5ea6\u6570\u503c\uff0c\u672a\u4f5c\u65b9\u5411\u8fa8\u522b\u3002\u5982\u4f55\u8fa8\u522b\u65b9\u5411\uff0c\u6211\u4eec\u53ef\u4ee5\u4ee5\u5149\u5b66\u7f16\u7801\u5668\u4e3a\u4f8b\u6765\u4e86\u89e3\u4e00\u4e0b\u3002<\/p>\n\n\n\n<p>\u8109\u51b2\u76d8\u5f0f\u7f16\u7801\u5668\u662f\u5728\u5706\u76d8\u4e0a\u5f00\u6709\u5185\u3001\u5916\u4e24\u5708\u76f8\u7b49\u89d2\u77e9\u7684\u7f1d\u9699\uff0c<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">\u5185\u3001\u5916\u5708\u7684\u76f8\u90bb\u4e24\u7f1d\u9699\u4e4b\u95f4\u7684\u8ddd\u79bb\u9519\u5f00\u534a\u6761\u7f1d\u5bbd\u3002<\/mark><\/strong>\u5728\u5185\u5916\u5708\u4e4b\u5916\u7684\u67d0\u4e00\u5f84\u5411\u4f4d\u7f6e\uff0c\u4e5f\u5f00\u6709\u4e00\u7f1d\u9699\uff0c\u8868\u793a\u7801\u76d8\u7684\u96f6\u4f4d\uff0c\u7801\u76d8\u6bcf\u8f6c\u4e00\u5708\uff0c\u96f6\u4f4d\u5bf9\u5e94\u7684\u5149\u654f\u5143\u4ef6\u5c31\u4ea7\u751f\u4e00\u4e2a\u8109\u51b2\uff0c\u79f0\u4e3a\u201c\u96f6\u4f4d\u8109\u51b2\u201d\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"851\" height=\"593\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-27.png\" alt=\"\" class=\"wp-image-589\" style=\"width:666px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-27.png 851w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-27-300x209.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-27-768x535.png 768w\" sizes=\"auto, (max-width: 851px) 100vw, 851px\" \/><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"713\" height=\"908\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-26.png\" alt=\"\" class=\"wp-image-588\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-26.png 713w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-26-236x300.png 236w\" sizes=\"auto, (max-width: 713px) 100vw, 713px\" \/><\/figure>\n\n\n\n<p>\u5149\u680f\u677f\u4e0a\u6709\u4e24\u4e2a\u72ed\u7f1d\uff0c\u5176\u8ddd\u79bb\u662f\u7801\u76d8\u4e0a\u4e24\u4e2a\u76f8\u90bb\u72ed\u7f1d\u8ddd\u79bb\u7684\u56db\u5206\u4e4b\u4e00\u500d\uff0c\u5e76\u8bbe\u7f6e\u4e86\u4e24\u7ec4\u5bf9\u5e94\u7684\u5149\u654f\u5143\u4ef6\uff0c\u5bf9\u5e94\u56fe\u4e2d\u7684A\u3001B\u4e24\u4e2a\u4fe1\u53f7\uff08\u56db\u5206\u4e4b\u4e00\u95f4\u8ddd\u5dee\u4fdd\u8bc1\u4e86\u4e24\u8def\u4fe1\u53f7\u7684\u76f8\u4f4d\u5dee\u4e3a90\u00b0\uff0c\u4fbf\u4e8e\u8fa8\u5411\uff09\uff0cC\u4fe1\u53f7\u4ee3\u8868\u96f6\u4f4d\u8109\u51b2\u3002<\/p>\n\n\n\n<p>\u5f53\u7801\u76d8\u968f\u88ab\u6d4b\u5de5\u4f5c\u8f74\u8f6c\u52a8\u65f6\uff0c\u6bcf\u8f6c\u8fc7\u4e00\u4e2a\u7f1d\u9699\u5c31\u53d1\u751f\u4e00\u6b21\u5149\u7ebf\u660e\u6697\u7684\u53d8\u5316\uff0c\u901a\u8fc7\u5149\u654f\u5143\u4ef6\u4ea7\u751f\u4e00\u6b21\u7535\u4fe1\u53f7\u7684\u53d8\u5316\uff0c\u6240\u4ee5\u6bcf\u5708\u7801\u9053\u4e0a\u7684\u7f1d\u9699\u6570\u5c06\u7b49\u4e8e\u5176\u5149\u654f\u5143\u4ef6\u6bcf\u4e00\u8f6c\u8f93\u51fa\u7684\u8109\u51b2\u6570\u3002\u5229\u7528\u8ba1\u6570\u5668\u8bb0\u5f55\u8109\u51b2\u6570\uff0c\u5c31\u80fd\u53cd\u6620\u7801\u76d8\u8f6c\u8fc7\u7684\u89d2\u5ea6\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"713\" height=\"908\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-28.png\" alt=\"\" class=\"wp-image-590\" style=\"width:533px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-28.png 713w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-28-236x300.png 236w\" sizes=\"auto, (max-width: 713px) 100vw, 713px\" \/><\/figure>\n<\/div>\n\n\n<p>\u5149\u654f\u5143\u4ef61\u548c2\u7684\u8f93\u51fa\u4fe1\u53f7\u7ecf\u653e\u5927\u6574\u5f62\u540e\uff0c\u4ea7\u751f\u77e9\u5f62\u8109\u51b2P1\u548cP2\uff0c\u5b83\u4eec\u5206\u522b\u63a5\u5230D\u89e6\u53d1\u5668\u7684D\u7aef\u548cC\u7aef\uff0cD\u89e6\u53d1\u5668\u5728C\u8109\u51b2\uff08\u5373P2 \uff09\u7684\u4e0a\u5347\u6cbf\u89e6\u53d1\u3002\u4e24\u4e2a\u77e9\u5f62\u8109\u51b2\u76f8\u5dee\u56db\u5206\u4e4b\u4e00\u4e2a\u5468\u671f\uff08\u6216\u76f8\u4f4d\u76f8\u5dee90\u00b0\uff09\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.1.3 \u8f6c\u901f\u6d4b\u91cf\u7f16\u7a0b<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;ESP32Encoder.h>\n#define L_Encoder_A 11  \/\/\u5de6\u7f16\u7801\u5668A\u76f8\n#define L_Encoder_B 12  \/\/\u5de6\u7f16\u7801\u5668B\u76f8\n\n#define R_Encoder_A 13  \/\/\u53f3\u7f16\u7801\u5668A\u76f8\n#define R_Encoder_B 14  \/\/\u53f3\u7f16\u7801\u5668B\u76f8\n\n#define diameter 18              \/\/\u76f4\u5f84(mm)\n#define Control_Frequency 100   \/\/\u8bfb\u53d6\u500d\u9891\n#define EncoderMultiples 4      \/\/\u500d\u9891\u6570\n#define Reduction_Ratio 50      \/\/\u51cf\u901f\u6bd4\n#define Encoder_precision 7     \/\/\u7f16\u7801\u5668\u7cbe\u5ea6\n\n\/\/\u521d\u59cb\u5316\u7f16\u7801\u5668\nvoid MotorEncoder_Init(void)\n{\n    \/\/\u521d\u59cb\u5316\u7f16\u7801\u5668\uff0c\u5411\u4e0a\u8ba1\u6570\n    ESP32Encoder::useInternalWeakPullResistors = puType::up;\n\n    encoder_L.attachSingleEdge(L_Encoder_A, L_Encoder_B);\n    encoder_L.clearCount();\n\n    encoder_R.attachSingleEdge(R_Encoder_A, R_Encoder_B);\n    encoder_R.clearCount();\n\n    \/\/\u7ed1\u5b9a\u4e2d\u65ad\u51fd\u6570\uff0c\u6bcf10ms\u8fdb\u5165\u4e00\u6b21\u4e2d\u65ad\n    drive_control_intterupt.attach_ms(interrupt_time, PID_TIM_IRQHandler);\n}\n\n\/\/\u5de6\u901f\u5ea6\nfloat Get_Left_Velocity_Form_Encoder(int encoder_value_L)\n{ \t\n\tfloat Rotation_Speed_L;\n\tfloat Velocity_Left;\n\n    \/\/\u7535\u673a\u8f6c\u901f \u8f6c\u901f=\u7f16\u7801\u5668\u8bfb\u6570(10ms\u8bfb\u4e00\u6b21) * \u8bfb\u53d6\u500d\u9891(100Hz)\/\u500d\u9891\u6570\/\u51cf\u901f\u6bd4\/\u7f16\u7801\u5668\u7cbe\u5ea6\t\t\t\t\n\tRotation_Speed_L = float(encoder_value_L)*Control_Frequency\/EncoderMultiples\/Reduction_Ratio\/Encoder_precision;\n    \/\/\u7f16\u7801\u5668\u8f6c\u901f(mm\/s) = \u8f6c\u901f * \u5468\u957f\n\tVelocity_Left = Rotation_Speed_L * (PI * diameter);\n\n    return Velocity_Left;\n}\n\n\/\/\u53f3\u901f\u5ea6\nfloat Get_Right_Velocity_Form_Encoder_R(int encoder_value_R)\n{ \t\n\tfloat Rotation_Speed_R;\n\tfloat Velocity_Right;\n\n    \/\/\u7535\u673a\u8f6c\u901f \u8f6c\u901f=\u7f16\u7801\u5668\u8bfb\u6570(10ms\u8bfb\u4e00\u6b21) * \u8bfb\u53d6\u500d\u9891(100Hz)\/\u500d\u9891\u6570\/\u51cf\u901f\u6bd4\/\u7f16\u7801\u5668\u7cbe\u5ea6\t\t\n\tRotation_Speed_R = float(encoder_value_R)*Control_Frequency\/EncoderMultiples\/Reduction_Ratio\/Encoder_precision;\n    \/\/ Serial.printf(\"Rotation_Speed_R =%f\\n\",Rotation_Speed_R);\n\n    \/\/\u7f16\u7801\u5668\u8f6c\u901f(mm\/s) = \u8f6c\u901f * \u5468\u957f\n\tVelocity_Right = Rotation_Speed_R * (PI * diameter);\n\n    return Velocity_Right;\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5.2 PID\u95ed\u73af\u8f6c\u901f\u63a7\u5236<\/h2>\n\n\n\n<p>\u5173\u4e8e\u7535\u673a\u7684PWM\u6ce2\u8f6c\u901f\u63a7\u5236\u6b64\u5904\u4e0d\u518d\u8d58\u8ff0\uff0c\u53ef\u67e5\u770b \u667a\u80fd\u7cfb\u7edf\u8bbe\u8ba1\u6559\u7a0b <a href=\"https:\/\/aimc.skyate.com\/index.php\/2024\/11\/16\/esp32_part2_pwm\/\">\u3010\u9636\u6bb5\u4e00\u30112 PWM\u4e0e\u7535\u673a\u63a7\u5236 \u2013 AIMC\u667a\u80fd\u8fd0\u63a7\u5b9e\u9a8c\u5ba4<\/a>\u7ae0\u8282\u5185\u5bb9\u3002<\/p>\n\n\n\n<p>PID\u7b97\u6cd5\u5305\u62ec\u6bd4\u4f8b\u3001\u5fae\u5206\u3001\u79ef\u5206\u4e09\u4e2a\u73af\u8282\u3002\u8fd9\u4e09\u4e2a\u73af\u8282\u5206\u522b\u662f\u4ee5\u8bef\u5dee\u3001\u8bef\u5dee\u7684\u5fae\u5206\u3001\u8bef\u5dee\u7684\u79ef\u5206\u4e3a\u53d8\u91cf\u8fdb\u884c\u8ba1\u7b97\u7684\u3002\u800c<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">\u5728\u5c0f\u8f66\u8f6e\u901f\u95ed\u73af\u63a7\u5236\u4e2d\uff0c\u6240\u8c13\u8bef\u5dee\u5c31\u662f\u901a\u8fc7\u7f16\u7801\u5668\u83b7\u53d6\u7684\u5b9e\u9645\u8f6e\u901f\u548c\u76ee\u6807\u901f\u5ea6\u4e4b\u95f4\u7684\u5dee\u503c<\/mark><\/strong>\u3002<\/p>\n\n\n\n<p>\u800cPID\u7b97\u6cd5\u7684\u8f93\u51fa\u503c\u5219\u662f\u63a7\u5236\u7535\u673a\u7684PWM\u5360\u7a7a\u6bd4\u3002\u5047\u8bbe\u5360\u7a7a\u6bd4\u53ef\u8c03\u8282\u8303\u56f4\u4e3a-255~+255\u3002\u5176\u4e2d\u5360\u7a7a\u6bd4\u7684\u6b63\u8d1f\u53f7\u4ee3\u8868\u8f6e\u5b50\u7684\u65cb\u8f6c\u65b9\u5411\u3002\u6211\u4eec\u53ef\u4ee5\u7f16\u5199\u4e00\u4e2aC++\u7c7b\u6765\u5b9e\u73b0PID\u63a7\u5236\u5668\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PIDController {\nprivate:\n    double Kp;  \/\/ \u6bd4\u4f8b\u7cfb\u6570\n    double Ki;  \/\/ \u79ef\u5206\u7cfb\u6570\n    double Kd;  \/\/ \u5fae\u5206\u7cfb\u6570\n\n\n    double prev_error;  \/\/ \u4e0a\u4e00\u6b21\u7684\u8bef\u5dee\n    double integral;  \/\/ \u79ef\u5206\u9879\n\n\n    double target_speed;  \/\/ \u76ee\u6807\u901f\u5ea6\uff0c\u5355\u4f4d\uff1amm\/s\n\n\npublic:\n    PIDController(double Kp, double Ki, double Kd, double target_speed)\n        : Kp(Kp), Ki(Ki), Kd(Kd), prev_error(0), integral(0), target_speed(target_speed) {}\n\n\n    \/\/ \u8ba1\u7b97 PID \u63a7\u5236\u91cf\n    int compute(double current_speed) {\n        \/\/ \u8ba1\u7b97\u8bef\u5dee\n        double error = target_speed - current_speed;\n        \/\/ \u8ba1\u7b97\u79ef\u5206\u9879\n        integral += error;\n        \/\/ \u8ba1\u7b97\u5fae\u5206\u9879\n        double derivative = error - prev_error;\n        \/\/ \u8ba1\u7b97 PID \u8f93\u51fa\n        double output = Kp * error + Ki * integral + Kd * derivative;\n        \/\/ \u66f4\u65b0\u4e0a\u4e00\u6b21\u7684\u8bef\u5dee\n        prev_error = error;\n        \/\/ \u9650\u5236\u8f93\u51fa\u5728 -255 \u5230 255 \u4e4b\u95f4\n        if (output > 255) {\n            output = 255;\n        } else if (output &lt; -255) {\n            output = -255;\n        }\n        return static_cast&lt;int>(output);\n    }\n\n\n    \/\/ \u8bbe\u7f6e\u65b0\u7684\u76ee\u6807\u901f\u5ea6\n    void setTargetSpeed(double new_target_speed) {\n        target_speed = new_target_speed;\n    }\n};<\/pre>\n\n\n\n<p>\u800c\u540e\u5b9e\u4f8b\u5316\u4e24\u4e2aPIDController \u7c7b\u5206\u522b\u7528\u4e8e\u5de6\u53f3\u7535\u673a\u7684\u63a7\u5236\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">PIDController L_Ctr(1.0, 0.1, 0.05, 0), R_Ctr(1.0, 0.1, 0.05, 0);<\/pre>\n\n\n\n<p>\u5b9e\u4f8b\u5316\u65f6\u4f20\u5165KI\u3001KD\u3001KP\u4e09\u4e2a\u53c2\u6570\u3002<\/p>\n\n\n\n<p>\u6b64\u540e\u4ee5\u4e00\u5b9a\u7684\u9891\u7387\u8c03\u7528PIDController \u7c7b\u4e2d\u7684\u65b9\u6cd5\u4e0d\u65ad\u7684\u6839\u636e\u5b9e\u9645\u8f6e\u901f\u8ba1\u7b97\u4e0b\u4e00\u65f6\u523b\u5e94\u8be5\u8f93\u51fa\u7684PWM\u5360\u7a7a\u6bd4\u7684\u503c\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/\u5bf9\u7535\u673a\u901f\u5ea6\u8fdb\u884cPI\u63a7\u5236\u4e2d\u65ad\u51fd\u6570\nvoid PID_TIM_IRQHandler(void)\n{\n    if (run_flag)\n    {\n        \/\/\u6bcf\u6b21\u4e2d\u65ad\u89e6\u53d1\u65f6\u8bfb\u53d6\u7f16\u7801\u5668\u503c\n        encoder_value_L = -encoder_L.getCount();        \n        encoder_value_R = encoder_R.getCount();\n        \n        \/\/\u6e05\u9664\u7f16\u7801\u5668\u672c\u6b21\u8bfb\u53d6\u7684\u6570\u503c\n        encoder_L.clearCount();\n        encoder_R.clearCount();\n\n        Velocity_Left = -L_Filter.filter(Get_Left_Velocity_Form_Encoder(encoder_value_L));       \/\/\u83b7\u53d6\u5de6\u7535\u673a\u901f\u5ea6\n        Velocity_Right = R_Filter.filter(Get_Right_Velocity_Form_Encoder_R(encoder_value_R));   \/\/\u83b7\u53d6\u53f3\u7535\u673a\u901f\u5ea6\n\n\n        \/\/\u5bf9\u5de6\u53f3\u7535\u673a\u8fdb\u884c\u95ed\u73af\u63a7\u5236\n        L_Ctr.setTargetSpeed(TargetVelocity_L);\n        R_Ctr.setTargetSpeed(TargetVelocity_R);\n        int pwm_duty_L = L_Ctr.compute(Velocity_Left);\n        int pwm_duty_R = R_Ctr.compute(Velocity_Right);\n        Serial.printf(\"L:%d|R:%d\\r\\n\", pwm_duty_L, pwm_duty_R);\n        Set_Pwm(pwm_duty_L, pwm_duty_R);\n        \n\n        \/\/\u6253\u5370\u5de6\u53f3\u901f\u5ea6\u6ce2\u5f62\n        Serial.printf(\"channels: %f, %f, %d, %d\\n\",Velocity_Left, Velocity_Right, TargetVelocity_L, TargetVelocity_R);\n    }\n    else\n    {\n        Set_Pwm(0, 0);\n    }\n}<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">6 \u56fe\u4f20\u529f\u80fd<\/h1>\n\n\n\n<p>AIA-T\u5c0f\u8f66\u8f66\u6a21\u9884\u7559\u4e86\u4e00\u4e2a\u6444\u50cf\u5934\u63a5\u53e3\uff0c\u652f\u6301\u8fde\u63a5OV2640\u6444\u50cf\u5934\uff0c\u5df2\u6d4b\u8bd5\u4e0b\u5217\u6444\u50cf\u5934\u6a21\u5757\uff1a<\/p>\n\n\n\n<p><a href=\"https:\/\/item.taobao.com\/item.htm?_u=rvgo0q383b5&amp;id=604535176005&amp;pisk=ghc8ssYoTnxkaB-94bJ0-NebjaTDoK0ru0u1tkqldmnxvVQoEJq3dWnZXJ1HU72L9mZmZu0uNywIxcMuVYqh9Xnq2_f3NDALAVk28u4oZwUIh0CnE4qoHwFriYf3q3PKRcVpjhAMs4uzQWtMjmPSp8F_Wg65x8sXGW4Kn46l54uzTk9PaV9tzMp6B777RkTYGyUOVWw7Fs1b0yQ7RDZ7hiaT7WNQODwbcP4ONMa5Oo6b0PqCOzZ5GSa_SkZQPDgXkPqbAWwSaapYYTZG9AITjryvfzCCOjU8HK07ciyIGzF0X4gfZ_bUy8EsPoKGqO24h2yKTw5LK4MZYPi5VHEEMqGSCctcEuMTJVDKfeXzoJhzMkGW_NEjw2hYUxj5FPF82RGScN8ikJMxM7cWYOumkuwTixv2qJV-2AraFK-qvqEoAbef2nqnIqc7HctcMDyKdbVjNnOO4kci6C6ljlUhFELAL9y7uC4oG8_xXVD8klY0r9WUHKzYjELAL9y7urEMogXFL-pV.&amp;spm=a1z09.2.0.0.74082e8dW95o7Q\">OV2640\u6444\u50cf\u5934OV5640\u6a21\u5757200W\u50cf\u7d20\u786c\u4ef6\u517c\u5bb9\u53cb\u5546 STM32F103ZE\/F4\/F7-\u6dd8\u5b9d\u7f51<\/a><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"800\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-29.png\" alt=\"\" class=\"wp-image-599\" style=\"width:454px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-29.png 750w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-29-281x300.png 281w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"800\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-30.png\" alt=\"\" class=\"wp-image-600\" style=\"width:458px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-30.png 750w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-30-281x300.png 281w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"800\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-31.png\" alt=\"\" class=\"wp-image-601\" style=\"width:506px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-31.png 750w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-31-281x300.png 281w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/figure>\n<\/div>\n\n\n<p>\u7531\u4e8eESP32\u7684\u5f15\u811a\u6570\u91cf\u6709\u9650\uff0c\u5c0f\u8f66\u8fde\u63a5\u6444\u50cf\u5934\u65f6\u8bf7\u52ff\u540c\u65f6\u4f7f\u7528\u5149\u7535\u5bf9\u7ba1\u4f20\u611f\u5668\u3001\u5149\u654f\u7535\u963b\u4f20\u611f\u5668\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"804\" height=\"612\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-32.png\" alt=\"\" class=\"wp-image-602\" style=\"width:516px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-32.png 804w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-32-300x228.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-32-768x585.png 768w\" sizes=\"auto, (max-width: 804px) 100vw, 804px\" \/><\/figure>\n<\/div>\n\n\n<p>\u4f8b\u7a0b\u91c7\u7528esp_cam\u5e93\u9a71\u52a8ov2640\u6444\u50cf\u5934\u6a21\u5757\uff0c\u5173\u4e8eesp_cam\u7684\u8bf4\u660e\u53ef\u53c2\u8003\u9879\u76ee\u5f00\u6e90\u5730\u5740\uff1a<a href=\"https:\/\/github.com\/espressif\/esp32-camera\">espressif\/esp32-camera<\/a>\uff0c\u672c\u6559\u7a0b\u63d0\u4f9b\u4e00\u4e2a\u57fa\u4e8eUDP\u534f\u8bae\u914d\u5408python\u4e0a\u4f4d\u673a\u7684\u56fe\u4f20\u4f8b\u7a0b\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;WiFi.h>\n#include \"esp_camera.h\"\n#include &lt;WiFiUdp.h>\n\n#define CAM_PIN_PWDN -1  \/\/power down is not used\n#define CAM_PIN_RESET 46 \/\/software reset will be performed\n#define CAM_PIN_XCLK -1\n#define CAM_PIN_SIOD 2\n#define CAM_PIN_SIOC 1\n\n#define CAM_PIN_D7 5\n#define CAM_PIN_D6 18\n#define CAM_PIN_D5 4\n#define CAM_PIN_D4 17\n#define CAM_PIN_D3 10\n#define CAM_PIN_D2 16\n#define CAM_PIN_D1 9\n#define CAM_PIN_D0 15\n#define CAM_PIN_VSYNC 20\n#define CAM_PIN_HREF 3\n#define CAM_PIN_PCLK 8\n\n\/\/ ===========================\n\/\/ Enter your WiFi credentials\n\/\/ ===========================\n\nconst char* ssid = \"CMCC\";\nconst char* password = \"*************\";\n\nWiFiUDP udp1;\nconst char* udpAddress = \"192.168.3.83\"; \/\/ Python \u7aef\u7684 IP\nconst int udpPort = 12345;  \/\/ \u76ee\u6807\u7aef\u53e3\nint packetSize = 1024; \/\/ \u6bcf\u4e2a\u6570\u636e\u5305\u7684\u6700\u5927\u5927\u5c0f\uff08\u5b57\u8282\uff09\n\n\nconst int serverPort = 12345;\nconst char* serverIP = \"192.168.3.83\";  \/\/ \u66ff\u6362\u4e3a Python \u670d\u52a1\u7aef\u7684 IP \u5730\u5740\nWiFiClient client;\n\nvoid setup() {\n    Serial.begin(115200);\n    delay(10000);\n    Serial.setDebugOutput(true);\n    Serial.println();\n    Moter_Init();\n    MotorEncoder_Init();\n    camera_config_t config;\n    config.ledc_channel = LEDC_CHANNEL_0;\n    config.ledc_timer = LEDC_TIMER_0;\n    config.pin_pwdn = CAM_PIN_PWDN,\n    config.pin_reset = CAM_PIN_RESET,\n    config.pin_xclk = CAM_PIN_XCLK,\n    config.pin_sccb_sda = CAM_PIN_SIOD,\n    config.pin_sccb_scl = CAM_PIN_SIOC,\n\n    config.pin_d7 = CAM_PIN_D7,\n    config.pin_d6 = CAM_PIN_D6,\n    config.pin_d5 = CAM_PIN_D5,\n    config.pin_d4 = CAM_PIN_D4,\n    config.pin_d3 = CAM_PIN_D3,\n    config.pin_d2 = CAM_PIN_D2,\n    config.pin_d1 = CAM_PIN_D1,\n    config.pin_d0 = CAM_PIN_D0,\n    config.pin_vsync = CAM_PIN_VSYNC,\n    config.pin_href = CAM_PIN_HREF,\n    config.pin_pclk = CAM_PIN_PCLK,\n    config.xclk_freq_hz = 24000000;\n    config.frame_size = FRAMESIZE_240X240 ;\n    config.pixel_format = PIXFORMAT_JPEG; \/\/ for streaming\n    \/\/config.pixel_format = PIXFORMAT_RGB565; \/\/ for face detection\/recognition\n    config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;\n    config.fb_location = CAMERA_FB_IN_PSRAM;\/\/ \u8bb2\u56fe\u50cf\u7f13\u5b58\u5728PSRAM\u4e2d\uff0c\u65e0PSRAM\u9700\u66f4\u6539\n    config.jpeg_quality = 12;\n    config.fb_count = 1;\n\n    \/\/ camera init\n    esp_err_t err = esp_camera_init(&amp;config);\n    if (err != ESP_OK) {\n        Serial.printf(\"Camera init failed with error 0x%x\", err);\n        return;\n    }\n\n    sensor_t * s = esp_camera_sensor_get();\n    \/\/ initial sensors are flipped vertically and colors are a bit saturated\n    if (s->id.PID == OV2640_PID) {\n        s->set_vflip(s, 1); \/\/ flip it back\n        s->set_brightness(s, 1); \/\/ up the brightness just a bit\n        s->set_saturation(s, -2); \/\/ lower the saturation\n    }\n\n    WiFi.mode(WIFI_STA);\n    WiFi.begin(ssid, password);\n    while (!WiFi.isConnected())\n    {\n        delay(500);\n        Serial.print(\".\");\n    }\n    Serial.println(\"Connected\");\n    Serial.print(\"IP Address:\");\n    Serial.println(WiFi.localIP());\n\n    udp1.begin(udpPort);\n    HttpServerInit();\n}\n\n\nvoid sendImageUDP(const uint8_t* buffer, size_t length) {\n  size_t offset = 0;\n  while (offset &lt; length) {\n    size_t chunkSize = min((size_t)packetSize, length - offset);\n    udp1.beginPacket(udpAddress, udpPort);\n    udp1.write(buffer + offset, chunkSize);\n    if (udp1.endPacket() &lt;= 0) {\n      Serial.println(\"Failed to send packet\");\n      return; \/\/ \u53d1\u9001\u5931\u8d25\u65f6\uff0c\u9000\u51fa\u51fd\u6570\n    }\n    offset += chunkSize;\n    delay(1);  \/\/ \u6bcf\u4e2a\u7247\u6bb5\u53d1\u9001\u540e\u52a0\u4e00\u70b9\u5ef6\u65f6\uff0c\u907f\u514d\u7f51\u7edc\u62e5\u585e\n  }\n\n  \/\/ \u53d1\u9001\u7ed3\u675f\u6807\u5fd7\n  uint8_t endFlag = 0xFF; \/\/ \u7ed3\u675f\u6807\u5fd7\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u9009\u62e9\u5176\u4ed6\u503c\n  udp1.beginPacket(udpAddress, udpPort);\n  udp1.write(&amp;endFlag, sizeof(endFlag));\n  udp1.endPacket();\n}\nvoid loop() {\n    camera_fb_t *pic = esp_camera_fb_get();\n    sendImageUDP(pic->buf, pic->len);\n    esp_camera_fb_return(pic);\n    delay(10);\n}<\/pre>\n\n\n\n<p>\u8be5\u4f8b\u7a0b\u4f1a\u4e0d\u65ad\u7684\u83b7\u53d6\u4e00\u5e27\u56fe\u50cf\uff0c\u5e76\u6839\u636e\u8bbe\u7f6e\u7684\u6700\u5927\u6570\u636e\u5e27\u5927\u5c0f\u5c06\u56fe\u50cf\u5e27\u6570\u636e\u5206\u5272\uff0c\u800c\u540e\u901a\u8fc7UDP\u534f\u8bae\u53d1\u9001\u81f3\u6307\u5b9a\u7684\u5730\u5740\u548c\u7aef\u53e3\u4e0a\u3002\u5bf9\u5e94\u7684python\u4e0a\u4f4d\u673a\u7a0b\u5e8f\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import socket\nimport cv2\nimport numpy as np\n\nUDP_IP = \"0.0.0.0\"  # \u672c\u5730\u76d1\u542c\u5730\u5740\nUDP_PORT = 12345  # \u4e0e ESP32 \u7aef\u7684\u76ee\u6807\u7aef\u53e3\u4e00\u81f4\nBUFFER_SIZE = 1472  # \u6839\u636e\u7f51\u7edc MTU \u8fdb\u884c\u8bbe\u7f6e\uff0c\u6700\u5927\u5e94\u4e3a 1472\n\nsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\nsock.bind((UDP_IP, UDP_PORT))\n# \u8c03\u6574\u56fe\u50cf\u4eae\u5ea6\u548c\u5bf9\u6bd4\u5ea6\u7684\u51fd\u6570\ndef adjust_brightness_contrast(image, alpha=1.2, beta=50):\n    adjusted = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)\n    return adjusted\n\n\n# \u8c03\u6574\u56fe\u50cf\u5c3a\u5bf8\u7684\u51fd\u6570\ndef resize_image(image, width=640, height=480):\n    resized = cv2.resize(image, (width, height), interpolation=cv2.INTER_LINEAR)\n    return resized\n\n\ndef receive_image():\n    img_data = bytearray()\n    while True:\n        try:\n            # \u63a5\u6536\u6765\u81ea ESP32 \u7684\u6570\u636e\n            data, addr = sock.recvfrom(BUFFER_SIZE)  # \u63a5\u6536\u6bcf\u4e2a\u7247\u6bb5\n            # print(len(data))\n\n            if data:  # \u5982\u679c\u63a5\u6536\u5230\u6570\u636e\n                img_data.extend(data)\n\n            # \u68c0\u67e5\u662f\u5426\u63a5\u6536\u5230\u7ed3\u675f\u6807\u5fd7\n            if img_data and img_data[-1] == 0xFF:  # 0xFF \u662f\u7ed3\u675f\u6807\u5fd7\n                # \u53bb\u6389\u7ed3\u675f\u6807\u5fd7\n                img_data = img_data[:-1]\n\n                # \u786e\u4fdd\u8f6c\u6362\u4e3a NumPy \u6570\u7ec4\u65f6\u6570\u636e\u6709\u6548\n                if len(img_data) > 0:\n                    np_data = np.frombuffer(img_data, dtype=np.uint8)\n                    frame = cv2.imdecode(np_data, cv2.IMREAD_COLOR)\n\n                    # \u5982\u679c\u89e3\u7801\u6210\u529f\uff0c\u663e\u793a\u56fe\u50cf\n                    if frame is not None:\n                        # \u8c03\u6574\u4eae\u5ea6\u548c\u5bf9\u6bd4\u5ea6\n                        frame = adjust_brightness_contrast(frame, alpha=1.5, beta=50)\n\n                        cv2.imshow('Received Image', frame)\n                        cv2.waitKey(1)\n                    else:\n                        print(\"Failed to decode image data\")\n\n                # \u6e05\u7a7a\u7f13\u51b2\u533a\uff0c\u51c6\u5907\u63a5\u6536\u4e0b\u4e00\u5e27\n                img_data = bytearray()\n\n        except Exception as e:\n            print(f\"Error receiving data: {e}\")\n\nif __name__ == \"__main__\":\n    receive_image()\n<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">7 \u57fa\u4e8eWiFi HTTP\u534f\u8bae\u7684\u8fdc\u7a0b\u63a7\u5236<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">7.1 \u5c0f\u8f66\u7aef\u8fdc\u7a0b\u63a7\u5236API<\/h2>\n\n\n\n<p>ESP32 \u662f\u4e50\u946b\u516c\u53f8\u63a8\u51fa\u7684\u4e00\u6b3e\u9ad8\u5ea6\u96c6\u6210\u7684\u7269\u8054\u7f51\u82af\u7247\uff0c\u5177\u6709\u4f4e\u529f\u8017\u3001\u9ad8\u6027\u80fd\u7b49\u7279\u70b9\uff0c\u5185\u7f6e\u4e86\u4e30\u5bcc\u7684\u901a\u4fe1\u63a5\u53e3\uff0c\u5176\u4e2d WiFi \u529f\u80fd\u5c24\u4e3a\u5f3a\u5927\u3002\u5b83\u652f\u6301 802.11b\/g\/n \u6807\u51c6\uff0c\u53ef\u5de5\u4f5c\u5728 STA\uff08Station\uff0c\u5ba2\u6237\u7aef\u6a21\u5f0f\uff09\u3001AP\uff08Access Point\uff0c\u63a5\u5165\u70b9\u6a21\u5f0f\uff09\u4ee5\u53ca STA+AP \u5171\u5b58\u6a21\u5f0f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.1.1 \u5de5\u4f5c\u6a21\u5f0f<\/h3>\n\n\n\n<p><strong>STA \u6a21\u5f0f\uff1a<\/strong>ESP32 \u4f5c\u4e3a\u5ba2\u6237\u7aef\u8fde\u63a5\u5230\u73b0\u6709\u7684 WiFi \u7f51\u7edc\uff0c\u5c31\u50cf\u624b\u673a\u8fde\u63a5\u5230\u5bb6\u91cc\u7684\u65e0\u7ebf\u8def\u7531\u5668\u4e00\u6837\u3002\u5728\u8fdc\u7a0b\u63a7\u5236\u5c0f\u8f66\u7684\u573a\u666f\u4e2d\uff0cESP32 \u901a\u5e38\u4ee5 STA \u6a21\u5f0f\u8fde\u63a5\u5230\u5bb6\u5ead\u6216\u529e\u516c\u7f51\u7edc\uff0c\u4ee5\u4fbf\u4e0e\u8fdc\u7a0b\u670d\u52a1\u5668\u6216\u63a7\u5236\u7aef\u8fdb\u884c\u901a\u4fe1\u3002<br><strong>AP \u6a21\u5f0f\uff1a<\/strong>ESP32 \u4f5c\u4e3a\u63a5\u5165\u70b9\uff0c\u5176\u4ed6\u8bbe\u5907\u53ef\u4ee5\u8fde\u63a5\u5230\u5b83\u521b\u5efa\u7684 WiFi \u7f51\u7edc\u3002\u8fd9\u79cd\u6a21\u5f0f\u9002\u7528\u4e8e\u9700\u8981\u72ec\u7acb\u7ec4\u7f51\u7684\u573a\u666f\uff0c\u4f8b\u5982\u5c0f\u8f66\u81ea\u6210\u4e00\u4e2a\u7f51\u7edc\uff0c\u624b\u673a\u7b49\u63a7\u5236\u8bbe\u5907\u76f4\u63a5\u8fde\u63a5\u5230\u5c0f\u8f66\u7684 ESP32 \u70ed\u70b9\u8fdb\u884c\u63a7\u5236\u3002<br><strong>STA+AP \u5171\u5b58\u6a21\u5f0f\uff1a<\/strong>ESP32 \u65e2\u53ef\u4ee5\u8fde\u63a5\u5230\u5176\u4ed6 WiFi \u7f51\u7edc\uff0c\u53c8\u53ef\u4ee5\u521b\u5efa\u81ea\u5df1\u7684\u70ed\u70b9\uff0c\u5b9e\u73b0\u66f4\u7075\u6d3b\u7684\u901a\u4fe1\u65b9\u5f0f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.1.2 ESP32 WiFi \u8fde\u63a5\u6d41\u7a0b<\/h3>\n\n\n\n<p>\u5728\u4ee3\u7801\u4e2d\uff0c\u4f7f\u7528 WiFi.begin(ssid, password) \u51fd\u6570\u8fde\u63a5\u5230\u6307\u5b9a\u7684 WiFi \u7f51\u7edc\uff0cssid \u662f\u7f51\u7edc\u540d\u79f0\uff0cpassword \u662f\u7f51\u7edc\u5bc6\u7801\u3002\u901a\u8fc7 WiFi.isConnected() \u51fd\u6570\u68c0\u67e5\u8fde\u63a5\u72b6\u6001\uff0c\u82e5\u672a\u8fde\u63a5\u5219\u5faa\u73af\u7b49\u5f85\uff0c\u76f4\u5230\u8fde\u63a5\u6210\u529f\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">WiFi.begin(ssid, password);\nwhile (!WiFi.isConnected())\n{\n    delay(500);\n    Serial.print(\".\");\n}\nSerial.println(\"Connected\");\nSerial.print(\"IP Address:\");\nSerial.println(WiFi.localIP());<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7.1.3 HTTP \u534f\u8bae\u6982\u8ff0<br><\/h3>\n\n\n\n<p><strong>HTTP\uff08Hypertext Transfer Protocol\uff0c\u8d85\u6587\u672c\u4f20\u8f93\u534f\u8bae\uff09<\/strong>\u662f\u4e00\u79cd\u7528\u4e8e\u4f20\u8f93\u8d85\u6587\u672c\u7684\u534f\u8bae\uff0c\u5b83\u57fa\u4e8e\u8bf7\u6c42 &#8211; \u54cd\u5e94\u6a21\u578b\uff0c\u662f\u4e92\u8054\u7f51\u4e0a\u5e94\u7528\u6700\u4e3a\u5e7f\u6cdb\u7684\u4e00\u79cd\u7f51\u7edc\u534f\u8bae\u3002HTTP \u534f\u8bae\u5de5\u4f5c\u5728 TCP\/IP \u534f\u8bae\u65cf\u7684\u5e94\u7528\u5c42\uff0c\u5177\u6709\u65e0\u72b6\u6001\u3001\u7b80\u5355\u5feb\u901f\u3001\u7075\u6d3b\u7b49\u7279\u70b9\u3002<\/p>\n\n\n\n<p><strong>GET\uff1a<\/strong>\u7528\u4e8e\u8bf7\u6c42\u6307\u5b9a\u8d44\u6e90\uff0c\u901a\u5e38\u7528\u4e8e\u83b7\u53d6\u6570\u636e\uff0c\u5982\u83b7\u53d6\u7f51\u9875\u5185\u5bb9\u3001\u56fe\u7247\u7b49\u3002\u8bf7\u6c42\u53c2\u6570\u901a\u5e38\u9644\u52a0\u5728 URL \u540e\u9762\uff0c\u4f8b\u5982 http:\/\/example.com\/api\/data?id=1\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"993\" height=\"85\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-33.png\" alt=\"\" class=\"wp-image-676\" style=\"width:486px;height:auto\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-33.png 993w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-33-300x26.png 300w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-33-768x66.png 768w\" sizes=\"auto, (max-width: 993px) 100vw, 993px\" \/><\/figure>\n<\/div>\n\n\n<p><strong>POST\uff1a<\/strong>\u7528\u4e8e\u5411\u670d\u52a1\u5668\u63d0\u4ea4\u6570\u636e\uff0c\u901a\u5e38\u7528\u4e8e\u8868\u5355\u63d0\u4ea4\u3001\u6587\u4ef6\u4e0a\u4f20\u7b49\u573a\u666f\u3002\u8bf7\u6c42\u6570\u636e\u653e\u5728\u8bf7\u6c42\u4f53\u4e2d\uff0c\u76f8\u5bf9 GET \u65b9\u6cd5\u66f4\u5b89\u5168\uff0c\u53ef\u4f20\u8f93\u7684\u6570\u636e\u91cf\u4e5f\u66f4\u5927\u3002\u5728\u8fdc\u7a0b\u63a7\u5236\u5c0f\u8f66\u7684\u4ee3\u7801\u4e2d\uff0c\u4f7f\u7528 POST \u65b9\u6cd5\u5411 \/ctr \u8def\u5f84\u53d1\u9001\u8fd0\u52a8\u63a7\u5236\u6307\u4ee4\u3002<\/p>\n\n\n\n<p><br><strong>\u8bf7\u6c42\u7ed3\u6784\uff1a<\/strong>\u7531\u8bf7\u6c42\u884c\u3001\u8bf7\u6c42\u5934\u548c\u8bf7\u6c42\u4f53\u7ec4\u6210\u3002\u8bf7\u6c42\u884c\u5305\u542b\u8bf7\u6c42\u65b9\u6cd5\u3001\u8bf7\u6c42 URL \u548c HTTP \u7248\u672c\uff1b\u8bf7\u6c42\u5934\u5305\u542b\u4e00\u4e9b\u989d\u5916\u7684\u4fe1\u606f\uff0c\u5982\u7528\u6237\u4ee3\u7406\u3001\u5185\u5bb9\u7c7b\u578b\u7b49\uff1b\u8bf7\u6c42\u4f53\u5305\u542b\u8981\u53d1\u9001\u7684\u6570\u636e\u3002<br><strong>\u54cd\u5e94\u7ed3\u6784\uff1a<\/strong>\u7531\u72b6\u6001\u884c\u3001\u54cd\u5e94\u5934\u548c\u54cd\u5e94\u4f53\u7ec4\u6210\u3002\u72b6\u6001\u884c\u5305\u542b HTTP \u7248\u672c\u3001\u72b6\u6001\u7801\u548c\u72b6\u6001\u6d88\u606f\uff1b\u54cd\u5e94\u5934\u5305\u542b\u4e00\u4e9b\u989d\u5916\u7684\u4fe1\u606f\uff0c\u5982\u670d\u52a1\u5668\u7c7b\u578b\u3001\u5185\u5bb9\u957f\u5ea6\u7b49\uff1b\u54cd\u5e94\u4f53\u5305\u542b\u670d\u52a1\u5668\u8fd4\u56de\u7684\u6570\u636e\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.1.4 \u5728 ESP32 \u4e2d\u4f7f\u7528 HTTP \u670d\u52a1\u5668<\/h3>\n\n\n\n<p>\u4f7f\u7528 ESPAsyncWebServer \u5e93\u53ef\u4ee5\u5728 ESP32 \u4e0a\u8f7b\u677e\u642d\u5efa\u4e00\u4e2a\u5f02\u6b65 HTTP \u670d\u52a1\u5668\u3002\u901a\u8fc7 server.on() \u65b9\u6cd5\u7ed1\u5b9a\u4e0d\u540c\u7684\u8def\u5f84\u548c\u8bf7\u6c42\u65b9\u6cd5\uff0c\u5904\u7406\u76f8\u5e94\u7684\u8bf7\u6c42\u3002\u4f8b\u5982\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">server.on(\"\/ctr\", HTTP_POST, InterinalRequestDefault, 0, API_Post_MotionCtr);<\/pre>\n\n\n\n<p>\u4e0a\u8ff0\u4ee3\u7801\u8868\u793a\u5f53\u6709 POST \u8bf7\u6c42\u53d1\u9001\u5230 \/ctr \u8def\u5f84\u65f6\uff0c\u8c03\u7528 API_Post_MotionCtr \u51fd\u6570\u8fdb\u884c\u5904\u7406\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.1.5 JSON \u7f16\u89e3\u7801\u6982\u8ff0<\/h3>\n\n\n\n<p><strong>JSON\uff08JavaScript Object Notation\uff0cJavaScript \u5bf9\u8c61\u8868\u793a\u6cd5\uff09<\/strong>\u662f\u4e00\u79cd\u8f7b\u91cf\u7ea7\u7684\u6570\u636e\u4ea4\u6362\u683c\u5f0f\uff0c\u6613\u4e8e\u4eba\u7c7b\u9605\u8bfb\u548c\u7f16\u5199\uff0c\u540c\u65f6\u4e5f\u6613\u4e8e\u673a\u5668\u89e3\u6790\u548c\u751f\u6210\u3002\u5b83\u57fa\u4e8e JavaScript \u7684\u4e00\u4e2a\u5b50\u96c6\uff0c\u91c7\u7528\u952e\u503c\u5bf9\u7684\u5f62\u5f0f\u5b58\u50a8\u6570\u636e\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u7c7b\u578b\uff0c\u5982\u5b57\u7b26\u4e32\u3001\u6570\u5b57\u3001\u5e03\u5c14\u503c\u3001\u6570\u7ec4\u548c\u5bf9\u8c61\u7b49\u3002<br><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n    \"en\": true,\n    \"v\": 1.5,\n    \"w\": 0.5\n}<\/pre>\n\n\n\n<p>\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d\uff0cen \u662f\u4e00\u4e2a\u5e03\u5c14\u7c7b\u578b\u7684\u503c\uff0c\u8868\u793a\u662f\u5426\u542f\u7528\u63a7\u5236\uff1bv \u548c w \u5206\u522b\u662f\u7ebf\u901f\u5ea6\u548c\u89d2\u901f\u5ea6\uff0c\u4e3a\u6570\u5b57\u7c7b\u578b\u3002\u8fd9\u79cd\u7ed3\u6784\u975e\u5e38\u9002\u5408\u5728\u7f51\u7edc\u901a\u4fe1\u4e2d\u4f20\u8f93\u7ed3\u6784\u5316\u7684\u6570\u636e\uff0c\u6bd4\u5982\u5728\u8fdc\u7a0b\u63a7\u5236\u5c0f\u8f66\u7684\u573a\u666f\u4e2d\uff0c\u7528\u4e8e\u4f20\u9012\u8fd0\u52a8\u63a7\u5236\u6307\u4ee4\u3002<\/p>\n\n\n\n<p><br>JSON \u7f16\u7801\u662f\u5c06\u7a0b\u5e8f\u4e2d\u7684\u6570\u636e\u7ed3\u6784\u8f6c\u6362\u4e3a JSON \u5b57\u7b26\u4e32\u7684\u8fc7\u7a0b\u3002\u5728 Arduino \u73af\u5883\u4e2d\uff0c\u4f7f\u7528 ArduinoJson \u5e93\u53ef\u4ee5\u65b9\u4fbf\u5730\u8fdb\u884c JSON \u7f16\u7801\u3002\u4f8b\u5982\uff0c\u82e5\u8981\u521b\u5efa\u4e00\u4e2a\u5305\u542b\u8fd0\u52a8\u63a7\u5236\u6307\u4ee4\u7684 JSON \u5bf9\u8c61\u5e76\u7f16\u7801\u4e3a\u5b57\u7b26\u4e32\uff0c\u53ef\u4ee5\u8fd9\u6837\u505a\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"ArduinoJson.h\"\n\nvoid createJsonCommand() {\n    const int capacity = JSON_OBJECT_SIZE(3);\n    DynamicJsonDocument doc(capacity);\n\n    doc[\"en\"] = true;\n    doc[\"v\"] = 1.5;\n    doc[\"w\"] = 0.5;\n\n    String jsonString;\n    serializeJson(doc, jsonString);\n    Serial.println(jsonString);\n}<\/pre>\n\n\n\n<p>\u5728\u4e0a\u8ff0\u4ee3\u7801\u4e2d\uff0c\u9996\u5148\u521b\u5efa\u4e00\u4e2a DynamicJsonDocument \u5bf9\u8c61 doc\uff0c\u5e76\u6307\u5b9a\u5176\u5bb9\u91cf\u3002\u7136\u540e\u5411 doc \u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9\uff0c\u6700\u540e\u4f7f\u7528 serializeJson \u51fd\u6570\u5c06 doc \u7f16\u7801\u4e3a JSON \u5b57\u7b26\u4e32 jsonString\u3002<br><\/p>\n\n\n\n<p><strong>JSON \u89e3\u7801<\/strong>\u662f\u5c06 JSON \u5b57\u7b26\u4e32\u89e3\u6790\u4e3a\u7a0b\u5e8f\u4e2d\u7684\u6570\u636e\u7ed3\u6784\u7684\u8fc7\u7a0b\u3002\u5728\u63a5\u6536\u7aef\uff0c\u5982 ESP32 \u5c0f\u8f66\u63a7\u5236\u4ee3\u7801\u4e2d\uff0c\u9700\u8981\u5bf9\u63a5\u6536\u5230\u7684 JSON \u5b57\u7b26\u4e32\u8fdb\u884c\u89e3\u7801\uff0c\u63d0\u53d6\u5176\u4e2d\u7684\u5173\u952e\u4fe1\u606f\u3002\u4ee3\u7801\u793a\u4f8b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"ArduinoJson.h\"\n\nvoid decodeJsonCommand(const char* jsonString) {\n    const int capacity = JSON_OBJECT_SIZE(3);\n    DynamicJsonDocument doc(capacity);\n\n    DeserializationError error = deserializeJson(doc, jsonString);\n    if (error) {\n        Serial.print(F(\"deserializeJson() failed: \"));\n        Serial.println(error.f_str());\n        return;\n    }\n\n    bool en = doc[\"en\"];\n    double v = doc[\"v\"];\n    double w = doc[\"w\"];\n\n    Serial.print(\"en: \");\n    Serial.println(en);\n    Serial.print(\"v: \");\n    Serial.println(v);\n    Serial.print(\"w: \");\n    Serial.println(w);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7.1.6 \u6574\u4f53\u6d41\u7a0b<\/h3>\n\n\n\n<p>ESP32 \u521d\u59cb\u5316\uff1a\u5728 setup \u51fd\u6570\u4e2d\uff0cESP32 \u9996\u5148\u521d\u59cb\u5316\u4e32\u53e3\u901a\u4fe1\uff0c\u7136\u540e\u8fde\u63a5\u5230\u6307\u5b9a\u7684 WiFi \u7f51\u7edc\u3002\u8fde\u63a5\u6210\u529f\u540e\uff0c\u542f\u52a8 HTTP \u670d\u52a1\u5668\uff0c\u76d1\u542c\u7279\u5b9a\u7684\u8def\u5f84\u548c\u8bf7\u6c42\u65b9\u6cd5\u3002<br>\u63a7\u5236\u7aef\u53d1\u9001\u6307\u4ee4\uff1a\u63a7\u5236\u7aef\uff08\u5982\u624b\u673a\u5e94\u7528\u3001\u7f51\u9875\u7b49\uff09\u901a\u8fc7 HTTP POST \u8bf7\u6c42\u5c06\u8fd0\u52a8\u63a7\u5236\u6307\u4ee4\u4ee5 JSON \u683c\u5f0f\u53d1\u9001\u5230 ESP32 \u7684\u6307\u5b9a\u8def\u5f84\uff08\u5982 \/ctr\uff09\u3002<br>ESP32 \u63a5\u6536\u5e76\u5904\u7406\u6307\u4ee4\uff1aESP32 \u7684 HTTP \u670d\u52a1\u5668\u63a5\u6536\u5230\u8bf7\u6c42\u540e\uff0c\u8c03\u7528\u76f8\u5e94\u7684\u5904\u7406\u51fd\u6570\uff08\u5982 API_Post_MotionCtr\uff09\u5bf9\u8bf7\u6c42\u4f53\u4e2d\u7684 JSON \u6570\u636e\u8fdb\u884c\u89e3\u7801\uff0c\u63d0\u53d6\u51fa\u5173\u952e\u4fe1\u606f\uff08\u5982 en\u3001v\u3001w\uff09\u3002<br>\u8ba1\u7b97\u76ee\u6807\u901f\u5ea6\uff1a\u6839\u636e\u63d0\u53d6\u7684\u7ebf\u901f\u5ea6 v \u548c\u89d2\u901f\u5ea6 w\uff0c\u901a\u8fc7\u9006\u8fd0\u52a8\u5b66\u51fd\u6570\u8ba1\u7b97\u51fa\u5de6\u53f3\u8f6e\u7684\u76ee\u6807\u901f\u5ea6\u3002<br>\u63a7\u5236\u5c0f\u8f66\u8fd0\u52a8\uff1a\u901a\u8fc7\u524d\u8ff0\u4e2d\u5c0f\u8f66\u8fd0\u52a8\u63a7\u5236\u4ee3\u7801\u5b8c\u6210\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u662f\u793a\u4f8b\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;drive.h>\n#include &lt;tb6612.h>\n#include &lt;WiFi.h>\nextern bool run_flag;\nextern int distance;\nextern int pwmA_set;\nextern int pwmB_set;\n#include &lt;WiFi.h>\n\n#include \"ArduinoJson.h\"\n#define JSON_BUFFER_SIZE 128\nStaticJsonDocument&lt;JSON_BUFFER_SIZE> doc;\n\n\/\/ ===========================\n\/\/ Enter your WiFi credentials\n\/\/ ===========================\nconst char* ssid = \"CMCC\";\nconst char* password = \"*************\";\nint TargetVelocity_L=20;  \/\/\u76ee\u6807\u901f\u5ea6\nint TargetVelocity_R=20;  \/\/\u76ee\u6807\u901f\u5ea6\ndouble L_M = 0.0;\ndouble R_M = 0.0;\n\/\/ \u5b9a\u4e49\u8f6e\u5b50\u4e4b\u95f4\u7684\u8ddd\u79bb\uff08\u8f74\u8ddd\uff09\uff0c\u5355\u4f4d\uff1amm\n#define WHEEL_BASE 95.4 \n\/\/ \u9006\u8fd0\u52a8\u5b66\u51fd\u6570\nvoid inverse_kinematics(double v, double omega, double *left_wheel_speed, double *right_wheel_speed) {\n    \/\/ \u8ba1\u7b97\u5de6\u53f3\u8f6e\u7684\u901f\u5ea6\n    *left_wheel_speed = v - omega * WHEEL_BASE \/ 2.0;\n    *right_wheel_speed = v + omega * WHEEL_BASE \/ 2.0;\n}\n#include &lt;AsyncTCP.h>\n#include &lt;ESPAsyncWebServer.h>\nAsyncWebServer server(80);\nvoid InterinalRequestDefault(AsyncWebServerRequest *request)\n{\n    \n}\n\nvoid API_GetWWWRoot(AsyncWebServerRequest *request)\n{\n\n}\n\nvoid API_Post_MotionCtr(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)\n{\n    if(!index)\n    {       \n        DeserializationError error = deserializeJson(doc, data);\n        Serial.printf(\"%s\\r\\n\", data);\n        bool hasCommand_en = doc.containsKey(\"en\");\n        bool hasCommand_v = doc.containsKey(\"v\");\n        bool hasCommand_w = doc.containsKey(\"w\");\n        if (hasCommand_en &amp;&amp; hasCommand_v &amp;&amp; hasCommand_w)\n        {\n            if (doc[\"en\"])\n            {\n                run_flag = true;\n                inverse_kinematics(doc[\"v\"], doc[\"w\"], &amp;L_M, &amp;R_M);\n                TargetVelocity_L = int(L_M);\n                TargetVelocity_R = int(R_M);\n            }\n            else\n            {\n                run_flag = false;\n                TargetVelocity_L = 0;\n                TargetVelocity_R = 0;\n            }        \n        }\n        request->send(200, \"text\/plain\", \"success\");  \n    }\n}\nvoid HttpServerInit(void)\n{     \n    \/\/ \u7ed1\u5b9a\u76d1\u542c\u8def\u5f84\n    \/\/ server.on(\"\/\", handleRoot);\n    server.on(\"\/ctr\", HTTP_POST, InterinalRequestDefault, 0, API_Post_MotionCtr);\n    \n    \/\/ \u542f\u52a8\u670d\u52a1\u5668\n    server.begin();\n    Serial.print(\"HTTP server started\\r\\n\");\n}\n\nvoid setup() {\n    Serial.begin(115200);\n    delay(10000);\n    WiFi.mode(WIFI_STA);\n    WiFi.begin(ssid, password);\n    while (!WiFi.isConnected())\n    {\n        delay(500);\n        Serial.print(\".\");\n    }\n    Serial.println(\"Connected\");\n    Serial.print(\"IP Address:\");\n    Serial.println(WiFi.localIP());\n    HttpServerInit();\n}\n\n\nfloat Velcity_Kp=0.4,  Velcity_Ki=0.5,  Velcity_Kd=0; \/\/PID\u53c2\u6570\nvoid loop() {\n    delay(10);\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7.2 python\u4e0a\u4f4d\u673a<\/h2>\n\n\n\n<p>\u5728\u8fd9\u91cc\u7ed9\u51fa\u4e00\u4e2a\u4f7f\u7528PS4\u624b\u67c4\u8fde\u63a5\u7535\u8111\uff0c\u7528python\u8bfb\u53d6\u624b\u67c4\u64cd\u4f5c\u52a8\u4f5c\u63a7\u5236\u5c0f\u8f66\u8fd0\u52a8\u4ee3\u7801\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"717\" height=\"554\" src=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-34.png\" alt=\"\" class=\"wp-image-677\" srcset=\"https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-34.png 717w, https:\/\/aimc.skyate.com\/wp-content\/uploads\/2024\/12\/image-34-300x232.png 300w\" sizes=\"auto, (max-width: 717px) 100vw, 717px\" \/><\/figure>\n<\/div>\n\n\n<p>\u4ee3\u7801\u5229\u7528&nbsp;<code>pygame<\/code>&nbsp;\u5e93\u6765\u8bfb\u53d6 Xbox One \u63a7\u5236\u5668\u7684\u8f93\u5165\uff0c\u5e76\u6839\u636e\u63a7\u5236\u5668\u7684\u64cd\u4f5c\u751f\u6210\u76f8\u5e94\u7684\u8fd0\u52a8\u63a7\u5236\u6307\u4ee4\uff08\u7ebf\u901f\u5ea6&nbsp;<code>v<\/code>\u3001\u89d2\u901f\u5ea6&nbsp;<code>w<\/code>&nbsp;\u548c\u4f7f\u80fd\u6807\u5fd7&nbsp;<code>en<\/code>\uff09\u3002\u7136\u540e\uff0c\u4f7f\u7528&nbsp;<code>requests<\/code>&nbsp;\u5e93\u5c06\u8fd9\u4e9b\u6307\u4ee4\u4ee5 JSON \u683c\u5f0f\u901a\u8fc7 HTTP POST \u8bf7\u6c42\u53d1\u9001\u5230\u6307\u5b9a\u7684 ESP32 \u670d\u52a1\u5668\uff08<code>http:\/\/192.168.3.126:80\/ctr<\/code>\uff09\uff0c\u4ee5\u5b9e\u73b0\u5bf9\u5c0f\u8f66\u7684\u8fdc\u7a0b\u63a7\u5236\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pygame\nfrom pygame.locals import *\nimport requests\nimport json<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>pygame<\/code>\uff1a\u4e00\u4e2a\u7528\u4e8e\u5f00\u53d1\u6e38\u620f\u548c\u591a\u5a92\u4f53\u5e94\u7528\u7684 Python \u5e93\uff0c\u8fd9\u91cc\u4e3b\u8981\u7528\u4e8e\u8bfb\u53d6 Xbox One \/ PS4\u63a7\u5236\u5668\u7684\u8f93\u5165\u3002<\/li>\n\n\n\n<li><code>pygame.locals<\/code>\uff1a\u5305\u542b\u4e86&nbsp;<code>pygame<\/code>&nbsp;\u4e2d\u7684\u4e00\u4e9b\u5e38\u91cf\uff0c\u4f8b\u5982\u4e8b\u4ef6\u7c7b\u578b\uff08\u5982&nbsp;<code>QUIT<\/code>\u3001<code>JOYBUTTONDOWN<\/code>&nbsp;\u7b49\uff09\u3002<\/li>\n\n\n\n<li><code>requests<\/code>\uff1a\u4e00\u4e2a\u7528\u4e8e\u53d1\u9001 HTTP \u8bf7\u6c42\u7684 Python \u5e93\uff0c\u65b9\u4fbf\u5411\u670d\u52a1\u5668\u53d1\u9001 POST \u8bf7\u6c42\u3002<\/li>\n\n\n\n<li><code>json<\/code>\uff1aPython \u7684\u5185\u7f6e\u5e93\uff0c\u7528\u4e8e\u5904\u7406 JSON \u6570\u636e\u7684\u7f16\u7801\u548c\u89e3\u7801\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u521d\u59cb\u5316PyGame\npygame.init()\n\n# \u521d\u59cb\u5316Xbox One\u63a7\u5236\u5668\njoystick = pygame.joystick.Joystick(0)\njoystick.init()<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>pygame.init()<\/code>\uff1a\u521d\u59cb\u5316&nbsp;<code>pygame<\/code>&nbsp;\u5e93\u7684\u6240\u6709\u6a21\u5757\uff0c\u4e3a\u540e\u7eed\u7684\u64cd\u4f5c\u505a\u597d\u51c6\u5907\u3002<\/li>\n\n\n\n<li><code>pygame.joystick.Joystick(0)<\/code>\uff1a\u521b\u5efa\u4e00\u4e2a&nbsp;<code>Joystick<\/code>&nbsp;\u5bf9\u8c61\uff0c<code>0<\/code>&nbsp;\u8868\u793a\u4f7f\u7528\u7b2c\u4e00\u4e2a\u8fde\u63a5\u7684\u6e38\u620f\u624b\u67c4\uff08\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u662f Xbox One \u63a7\u5236\u5668\uff09\u3002<\/li>\n\n\n\n<li><code>joystick.init()<\/code>\uff1a\u521d\u59cb\u5316\u8be5\u6e38\u620f\u624b\u67c4\uff0c\u4f7f\u5176\u53ef\u4ee5\u6b63\u5e38\u5de5\u4f5c\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u6e38\u620f\u5faa\u73af\nrunning = True\n\nv_max = 50.0\n\nv = 0\nw = 0\nen = False\n\nchange_flag = False<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>running<\/code>\uff1a\u4f5c\u4e3a\u6e38\u620f\u5faa\u73af\u7684\u63a7\u5236\u53d8\u91cf\uff0c\u5f53&nbsp;<code>running<\/code>&nbsp;\u4e3a&nbsp;<code>False<\/code>&nbsp;\u65f6\uff0c\u5faa\u73af\u7ed3\u675f\uff0c\u7a0b\u5e8f\u9000\u51fa\u3002<\/li>\n\n\n\n<li><code>v_max<\/code>\uff1a\u6700\u5927\u7ebf\u901f\u5ea6\uff0c\u521d\u59cb\u503c\u4e3a 50.0\u3002<\/li>\n\n\n\n<li><code>v<\/code>\uff1a\u5f53\u524d\u7ebf\u901f\u5ea6\uff0c\u521d\u59cb\u503c\u4e3a 0\u3002<\/li>\n\n\n\n<li><code>w<\/code>\uff1a\u5f53\u524d\u89d2\u901f\u5ea6\uff0c\u521d\u59cb\u503c\u4e3a 0\u3002<\/li>\n\n\n\n<li><code>en<\/code>\uff1a\u4f7f\u80fd\u6807\u5fd7\uff0c\u7528\u4e8e\u63a7\u5236\u5c0f\u8f66\u662f\u5426\u8fd0\u52a8\uff0c\u521d\u59cb\u503c\u4e3a&nbsp;<code>False<\/code>\uff0c\u8868\u793a\u5c0f\u8f66\u505c\u6b62\u3002<\/li>\n\n\n\n<li><code>change_flag<\/code>\uff1a\u6807\u5fd7\u53d8\u91cf\uff0c\u7528\u4e8e\u6807\u8bb0\u63a7\u5236\u6307\u4ee4\u662f\u5426\u53d1\u751f\u53d8\u5316\uff0c\u521d\u59cb\u503c\u4e3a&nbsp;<code>False<\/code>\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">while running:\n    # \u5904\u7406\u4e8b\u4ef6\n    for event in pygame.event.get():\n        if event.type == QUIT:\n            running = False<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>pygame.event.get()<\/code>\uff1a\u83b7\u53d6\u5f53\u524d\u961f\u5217\u4e2d\u7684\u6240\u6709\u4e8b\u4ef6\uff0c\u901a\u8fc7\u904d\u5386\u8fd9\u4e9b\u4e8b\u4ef6\u6765\u5904\u7406\u4e0d\u540c\u7684\u7528\u6237\u8f93\u5165\u3002<\/li>\n\n\n\n<li><code>event.type == QUIT<\/code>\uff1a\u5f53\u7528\u6237\u70b9\u51fb\u7a97\u53e3\u7684\u5173\u95ed\u6309\u94ae\u65f6\uff0c\u5c06&nbsp;<code>running<\/code>&nbsp;\u8bbe\u7f6e\u4e3a&nbsp;<code>False<\/code>\uff0c\u9000\u51fa\u6e38\u620f\u5faa\u73af\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">elif event.type == JOYBUTTONDOWN:\n    # \u83b7\u53d6\u6309\u4e0b\u7684\u6309\u94ae\u7f16\u53f7\n    button = event.button\n    print(\"Button\", button, \"pressed\")\n    if button == 7:\n        en = not en\n        change_flag = True\n    if button == 9:\n        v_max = - v_max\n        print(v_max)<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>event.type == JOYBUTTONDOWN<\/code>\uff1a\u5f53\u68c0\u6d4b\u5230\u6e38\u620f\u624b\u67c4\u4e0a\u7684\u6309\u94ae\u88ab\u6309\u4e0b\u65f6\uff0c\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\u3002<\/li>\n\n\n\n<li><code>button = event.button<\/code>\uff1a\u83b7\u53d6\u88ab\u6309\u4e0b\u7684\u6309\u94ae\u7f16\u53f7\u3002<\/li>\n\n\n\n<li><code>button == 7<\/code>\uff1a\u5982\u679c\u6309\u4e0b\u7684\u662f\u7f16\u53f7\u4e3a 7 \u7684\u6309\u94ae\uff0c\u5c06&nbsp;<code>en<\/code>&nbsp;\u53d6\u53cd\uff08\u5373\u5207\u6362\u4f7f\u80fd\u72b6\u6001\uff09\uff0c\u5e76\u5c06&nbsp;<code>change_flag<\/code>&nbsp;\u8bbe\u7f6e\u4e3a&nbsp;<code>True<\/code>\uff0c\u8868\u793a\u63a7\u5236\u6307\u4ee4\u53d1\u751f\u4e86\u53d8\u5316\u3002<\/li>\n\n\n\n<li><code>button == 9<\/code>\uff1a\u5982\u679c\u6309\u4e0b\u7684\u662f\u7f16\u53f7\u4e3a 9 \u7684\u6309\u94ae\uff0c\u5c06&nbsp;<code>v_max<\/code>&nbsp;\u53d6\u53cd\uff08\u6539\u53d8\u6700\u5927\u7ebf\u901f\u5ea6\u7684\u65b9\u5411\uff09\uff0c\u5e76\u6253\u5370\u65b0\u7684&nbsp;<code>v_max<\/code>&nbsp;\u503c\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">elif event.type == JOYAXISMOTION:\n    # \u83b7\u53d6\u6447\u6746\u7684\u4f4d\u7f6e\n    axis = event.axis\n    value = round(event.value, 3)\n    print(\"Axis\", axis, \"moved to\", value)\n    if axis == 4:\n       v = ((value + 1)\/2) * v_max\n       change_flag = True\n    elif event.type == JOYAXISMOTION:\n        # \u83b7\u53d6\u6447\u6746\u7684\u4f4d\u7f6e\n        axis = event.axis\n        value = round(event.value, 3)\n        print(\"Axis\", axis, \"moved to\", value)\n        if axis == 4:\n            v = ((value + 1)\/2) * v_max\n            change_flag = True\n        elif axis == 0:\n            w = -(value\/5)\n            change_flag = True<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>event.type == JOYAXISMOTION<\/code>\uff1a\u5f53\u68c0\u6d4b\u5230\u6e38\u620f\u624b\u67c4\u4e0a\u7684\u6447\u6746\u53d1\u751f\u79fb\u52a8\u65f6\uff0c\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\u3002<\/li>\n\n\n\n<li><code>axis = event.axis<\/code>\uff1a\u83b7\u53d6\u53d1\u751f\u79fb\u52a8\u7684\u6447\u6746\u8f74\u7f16\u53f7\u3002\u4e0d\u540c\u7684\u8f74\u7f16\u53f7\u5bf9\u5e94\u624b\u67c4\u4e0a\u4e0d\u540c\u7684\u6447\u6746\uff0c\u5177\u4f53\u7684\u6620\u5c04\u5173\u7cfb\u53d6\u51b3\u4e8e\u624b\u67c4\u7684\u786c\u4ef6\u8bbe\u8ba1\u3002<\/li>\n\n\n\n<li><code>value = round(event.value, 3)<\/code>\uff1a\u83b7\u53d6\u6447\u6746\u5728\u8be5\u8f74\u4e0a\u7684\u4f4d\u7f6e\u503c\uff0c\u5e76\u5c06\u5176\u4fdd\u7559\u4e09\u4f4d\u5c0f\u6570\u3002\u6447\u6746\u7684\u4f4d\u7f6e\u503c\u901a\u5e38\u5728 -1.0 \u5230 1.0 \u4e4b\u95f4\uff0c-1.0 \u8868\u793a\u6447\u6746\u5411\u4e00\u4e2a\u65b9\u5411\u63a8\u5230\u5e95\uff0c1.0 \u8868\u793a\u5411\u53e6\u4e00\u4e2a\u65b9\u5411\u63a8\u5230\u5e95\uff0c0.0 \u8868\u793a\u6447\u6746\u5904\u4e8e\u4e2d\u95f4\u4f4d\u7f6e\u3002<\/li>\n\n\n\n<li><code>axis == 4<\/code>\uff1a\u5982\u679c\u662f\u7f16\u53f7\u4e3a 4 \u7684\u8f74\u53d1\u751f\u79fb\u52a8\uff0c\u6839\u636e\u8be5\u8f74\u7684\u4f4d\u7f6e\u503c\u8ba1\u7b97\u5f53\u524d\u7ebf\u901f\u5ea6&nbsp;<code>v<\/code>\u3002\u8ba1\u7b97\u516c\u5f0f&nbsp;<code>((value + 1)\/2) * v_max<\/code>&nbsp;\u7684\u4f5c\u7528\u662f\u5c06\u6447\u6746\u4f4d\u7f6e\u503c\u4ece -1.0 \u5230 1.0 \u7684\u8303\u56f4\u6620\u5c04\u5230 0 \u5230&nbsp;<code>v_max<\/code>&nbsp;\u7684\u8303\u56f4\u3002\u4f8b\u5982\uff0c\u5f53\u6447\u6746\u63a8\u5230\u6700\u524d\u65b9\uff08<code>value = 1.0<\/code>\uff09\u65f6\uff0c<code>v<\/code>&nbsp;\u7b49\u4e8e&nbsp;<code>v_max<\/code>\uff1b\u5f53\u6447\u6746\u5904\u4e8e\u4e2d\u95f4\u4f4d\u7f6e\uff08<code>value = 0.0<\/code>\uff09\u65f6\uff0c<code>v<\/code>&nbsp;\u7b49\u4e8e&nbsp;<code>v_max \/ 2<\/code>\uff1b\u5f53\u6447\u6746\u63a8\u5230\u6700\u540e\u65b9\uff08<code>value = -1.0<\/code>\uff09\u65f6\uff0c<code>v<\/code>&nbsp;\u7b49\u4e8e 0\u3002\u8ba1\u7b97\u5b8c\u6210\u540e\uff0c\u5c06&nbsp;<code>change_flag<\/code>&nbsp;\u8bbe\u7f6e\u4e3a&nbsp;<code>True<\/code>\uff0c\u8868\u793a\u63a7\u5236\u6307\u4ee4\u53d1\u751f\u4e86\u53d8\u5316\u3002<\/li>\n\n\n\n<li><code>axis == 0<\/code>\uff1a\u5982\u679c\u662f\u7f16\u53f7\u4e3a 0 \u7684\u8f74\u53d1\u751f\u79fb\u52a8\uff0c\u6839\u636e\u8be5\u8f74\u7684\u4f4d\u7f6e\u503c\u8ba1\u7b97\u5f53\u524d\u89d2\u901f\u5ea6&nbsp;<code>w<\/code>\u3002\u8ba1\u7b97\u516c\u5f0f&nbsp;<code>-(value\/5)<\/code>&nbsp;\u662f\u5c06\u6447\u6746\u4f4d\u7f6e\u503c\u6309\u4e00\u5b9a\u6bd4\u4f8b\u7f29\u653e\u540e\u53d6\u53cd\uff0c\u4f5c\u4e3a\u89d2\u901f\u5ea6\u7684\u503c\u3002\u540c\u6837\uff0c\u8ba1\u7b97\u5b8c\u6210\u540e\u5c06&nbsp;<code>change_flag<\/code>&nbsp;\u8bbe\u7f6e\u4e3a&nbsp;<code>True<\/code>\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">if change_flag:\n    change_flag = False\n    # \u521b\u5efa\u8981\u53d1\u9001\u7684 JSON \u6570\u636e\n    data = {\n        \"en\": en,\n        \"v\": v,\n        \"w\": w\n    }\n    json_data = json.dumps(data)\n    url = \"http:\/\/192.168.3.126:80\/ctr\"\n    headers = {\n        \"Content-Type\": \"application\/json\"\n    }\n    try:\n        # \u53d1\u9001 POST \u8bf7\u6c42\n        response = requests.post(url, data=json_data, headers=headers)\n\n        # \u68c0\u67e5\u54cd\u5e94\u72b6\u6001\u7801\n        if response.status_code == 200:\n            print(\"\u8bf7\u6c42\u6210\u529f\")\n            print(\"\u54cd\u5e94\u5185\u5bb9:\", response.text)\n        else:\n            print(f\"\u8bf7\u6c42\u5931\u8d25\uff0c\u72b6\u6001\u7801: {response.status_code}\")\n    except requests.RequestException as e:\n        print(f\"\u8bf7\u6c42\u53d1\u751f\u9519\u8bef: {e}\")<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>if change_flag<\/code>\uff1a\u5982\u679c&nbsp;<code>change_flag<\/code>&nbsp;\u4e3a&nbsp;<code>True<\/code>\uff0c\u8868\u793a\u63a7\u5236\u6307\u4ee4\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u9700\u8981\u5c06\u65b0\u7684\u6307\u4ee4\u53d1\u9001\u7ed9\u670d\u52a1\u5668\u3002\u9996\u5148\u5c06&nbsp;<code>change_flag<\/code>&nbsp;\u91cd\u7f6e\u4e3a&nbsp;<code>False<\/code>\uff0c\u4ee5\u4fbf\u4e0b\u6b21\u68c0\u6d4b\u65b0\u7684\u53d8\u5316\u3002<\/li>\n\n\n\n<li><code>data = {\"en\": en, \"v\": v, \"w\": w}<\/code>\uff1a\u521b\u5efa\u4e00\u4e2a Python \u5b57\u5178\uff0c\u5305\u542b\u5f53\u524d\u7684\u4f7f\u80fd\u6807\u5fd7&nbsp;<code>en<\/code>\u3001\u7ebf\u901f\u5ea6&nbsp;<code>v<\/code>&nbsp;\u548c\u89d2\u901f\u5ea6&nbsp;<code>w<\/code>\u3002<\/li>\n\n\n\n<li><code>json_data = json.dumps(data)<\/code>\uff1a\u4f7f\u7528&nbsp;<code>json.dumps()<\/code>&nbsp;\u51fd\u6570\u5c06 Python \u5b57\u5178\u8f6c\u6362\u4e3a JSON \u683c\u5f0f\u7684\u5b57\u7b26\u4e32\u3002<\/li>\n\n\n\n<li><code>url = \"http:\/\/192.168.3.126:80\/ctr\"<\/code>\uff1a\u6307\u5b9a\u8981\u53d1\u9001\u8bf7\u6c42\u7684\u670d\u52a1\u5668\u5730\u5740\u548c\u8def\u5f84\uff0c\u8fd9\u91cc\u5047\u8bbe ESP32 \u670d\u52a1\u5668\u7684 IP \u5730\u5740\u662f&nbsp;<code>192.168.3.126<\/code>\uff0c\u7aef\u53e3\u53f7\u662f 80\uff0c\u8def\u5f84\u662f&nbsp;<code>\/ctr<\/code>\u3002<\/li>\n\n\n\n<li><code>headers = {\"Content-Type\": \"application\/json\"}<\/code>\uff1a\u8bbe\u7f6e\u8bf7\u6c42\u5934\uff0c\u6307\u5b9a\u8bf7\u6c42\u4f53\u7684\u5185\u5bb9\u7c7b\u578b\u4e3a JSON\u3002<\/li>\n\n\n\n<li><code>response = requests.post(url, data=json_data, headers=headers)<\/code>\uff1a<code>requests<\/code>&nbsp;\u5e93\u7684&nbsp;<code>post<\/code>&nbsp;\u65b9\u6cd5\u5411\u6307\u5b9a\u7684&nbsp;<code>url<\/code>&nbsp;\u53d1\u9001\u4e00\u4e2a HTTP POST \u8bf7\u6c42\u3002<code>data<\/code>&nbsp;\u53c2\u6570\u4f20\u5165\u4e4b\u524d\u8f6c\u6362\u597d\u7684 JSON \u683c\u5f0f\u5b57\u7b26\u4e32&nbsp;<code>json_data<\/code>\uff0c<code>headers<\/code>&nbsp;\u53c2\u6570\u6307\u5b9a\u8bf7\u6c42\u5934\uff0c\u544a\u77e5\u670d\u52a1\u5668\u8bf7\u6c42\u4f53\u7684\u5185\u5bb9\u7c7b\u578b\u662f&nbsp;<code>application\/json<\/code>\u3002<code>requests.post<\/code>&nbsp;\u65b9\u6cd5\u4f1a\u8fd4\u56de\u4e00\u4e2a&nbsp;<code>Response<\/code>&nbsp;\u5bf9\u8c61\uff0c\u8be5\u5bf9\u8c61\u5305\u542b\u4e86\u670d\u52a1\u5668\u8fd4\u56de\u7684\u54cd\u5e94\u4fe1\u606f\uff0c\u5b58\u50a8\u5728&nbsp;<code>response<\/code>&nbsp;\u53d8\u91cf\u4e2d\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"atomic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    # \u68c0\u67e5\u54cd\u5e94\u72b6\u6001\u7801\n    if response.status_code == 200:\n        print(\"\u8bf7\u6c42\u6210\u529f\")\n        print(\"\u54cd\u5e94\u5185\u5bb9:\", response.text)\n    else:\n        print(f\"\u8bf7\u6c42\u5931\u8d25\uff0c\u72b6\u6001\u7801: {response.status_code}\")<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>response.status_code<\/code>&nbsp;\u8868\u793a\u670d\u52a1\u5668\u8fd4\u56de\u7684 HTTP \u72b6\u6001\u7801\u3002HTTP \u72b6\u6001\u7801\u662f\u4e00\u4e2a\u4e09\u4f4d\u6570\u5b57\uff0c\u7528\u4e8e\u8868\u793a\u8bf7\u6c42\u7684\u7ed3\u679c\u3002\u5e38\u89c1\u7684\u72b6\u6001\u7801\u5982&nbsp;<code>200<\/code>&nbsp;\u8868\u793a\u8bf7\u6c42\u6210\u529f\uff0c<code>404<\/code>&nbsp;\u8868\u793a\u8bf7\u6c42\u7684\u8d44\u6e90\u672a\u627e\u5230\uff0c<code>500<\/code>&nbsp;\u8868\u793a\u670d\u52a1\u5668\u5185\u90e8\u9519\u8bef\u7b49\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u72b6\u6001\u7801\u4e3a&nbsp;<code>200<\/code>\uff0c\u8bf4\u660e\u8bf7\u6c42\u6210\u529f\u53d1\u9001\u5230\u670d\u52a1\u5668\u5e76\u88ab\u6b63\u786e\u5904\u7406\uff0c\u6253\u5370\u51fa \u201c\u8bf7\u6c42\u6210\u529f\u201d \u5e76\u8f93\u51fa\u670d\u52a1\u5668\u8fd4\u56de\u7684\u54cd\u5e94\u5185\u5bb9\uff08\u5b58\u50a8\u5728&nbsp;<code>response.text<\/code>&nbsp;\u4e2d\uff09\u3002<\/li>\n\n\n\n<li>\u5982\u679c\u72b6\u6001\u7801\u4e0d\u662f&nbsp;<code>200<\/code>\uff0c\u5219\u6253\u5370\u51fa \u201c\u8bf7\u6c42\u5931\u8d25\u201d \u5e76\u663e\u793a\u5177\u4f53\u7684\u72b6\u6001\u7801\uff0c\u65b9\u4fbf\u8c03\u8bd5\u548c\u5b9a\u4f4d\u95ee\u9898\u3002<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1 \u9879\u76ee\u7b80\u4ecb \u672c\u9879\u76ee\u662f\u57fa\u4e8eESP32\u5355\u7247\u673a\u7684\u667a\u80fd\u7269\u8054\u7f51\u5c0f\u8f66\uff0c\u65e8\u5728\u53c2\u4e0e\u7b2c\u4e8c\u5c4a\u4eba\u5de5\u667a\u80fd\u521b\u65b0\u6280\u80fd\u7ade\u8d5b\uff08\u667a\u80fd\u7269\u8054\u7f51\u5c0f\u8f66 [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":437,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[63],"tags":[46,40],"class_list":["post-436","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aimc_project","tag-esp32","tag-opencv"],"_links":{"self":[{"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/posts\/436","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/comments?post=436"}],"version-history":[{"count":22,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/posts\/436\/revisions"}],"predecessor-version":[{"id":698,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/posts\/436\/revisions\/698"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/media\/437"}],"wp:attachment":[{"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/media?parent=436"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/categories?post=436"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aimc.skyate.com\/index.php\/wp-json\/wp\/v2\/tags?post=436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}