diff --git a/ESP-IDF_Robot/tutorial/docs/build/doctrees/data.doctree b/ESP-IDF_Robot/tutorial/docs/build/doctrees/data.doctree index 59d42e478..4ed3ead3a 100644 Binary files a/ESP-IDF_Robot/tutorial/docs/build/doctrees/data.doctree and b/ESP-IDF_Robot/tutorial/docs/build/doctrees/data.doctree differ diff --git a/ESP-IDF_Robot/tutorial/docs/build/doctrees/environment.pickle b/ESP-IDF_Robot/tutorial/docs/build/doctrees/environment.pickle index be361f1b4..91b9fafd2 100644 Binary files a/ESP-IDF_Robot/tutorial/docs/build/doctrees/environment.pickle and b/ESP-IDF_Robot/tutorial/docs/build/doctrees/environment.pickle differ diff --git a/ESP-IDF_Robot/tutorial/docs/build/html/_sources/data.rst.txt b/ESP-IDF_Robot/tutorial/docs/build/html/_sources/data.rst.txt index 8cd5b8d1e..0a1e1bb54 100644 --- a/ESP-IDF_Robot/tutorial/docs/build/html/_sources/data.rst.txt +++ b/ESP-IDF_Robot/tutorial/docs/build/html/_sources/data.rst.txt @@ -24,8 +24,8 @@ When used with communication protocols like ESP-NOW, this struct is **encoded** **transmitted** at regular intervals or in response to user input, and finally **decoded** on the receiving end to control hardware. -Struct Walkthrough ------------------- +Data Payload +------------ *x_axis* and *y_axis* fields capture analog input from a joystick, determining direction and speed. *nav_bttn* represents a joystick push-button. @@ -35,7 +35,7 @@ Struct Walkthrough *motor1_rpm_pwm* to *motor4_rpm_pwm* provide individual PWM signals to four DC motors. This enables fine-grained speed control, supports differential drive configurations, and even allows for maneuvering in multi-directional platforms like omni-wheel robots. -Why Use __attribute((packed))? +Why use __attribute((packed))? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ESP-NOW uses fixed-size data packets (up to 250 bytes). The *__attribute__((packed))* removes compiler-added padding for precise byte alignment. diff --git a/ESP-IDF_Robot/tutorial/docs/build/html/data.html b/ESP-IDF_Robot/tutorial/docs/build/html/data.html index 8439b9176..6a1ea7ad1 100644 --- a/ESP-IDF_Robot/tutorial/docs/build/html/data.html +++ b/ESP-IDF_Robot/tutorial/docs/build/html/data.html @@ -54,15 +54,15 @@ It’s intended to be sent from a transmitting device (like a remote control or
When used with communication protocols like ESP-NOW, this struct is encoded into a byte stream, then transmitted at regular intervals or in response to user input, and finally decoded on the receiving end to control hardware.
-x_axis and y_axis fields capture analog input from a joystick, determining direction and speed. nav_bttn represents a joystick push-button.
led allows the transmitter to toggle an onboard LED and is used for status indication (e.g. pairing, battery warning, etc).
motor1_rpm_pwm to motor4_rpm_pwm provide individual PWM signals to four DC motors. This enables fine-grained speed control, supports differential drive configurations, and even allows for maneuvering in multi-directional platforms like omni-wheel robots.
ESP-NOW uses fixed-size data packets (up to 250 bytes). The __attribute__((packed)) removes compiler-added padding for precise byte alignment.
As packed attribute tells the compiler not to add any padding between fields in memory, this makes the struct:
@@ -107,7 +107,7 @@ This enables fine-grained speed control, supports differential drive configuratiINTRODUCTION HOW DOES IT WORK? DATA STRUCT TRANSMITTER diff --git a/ESP-IDF_Robot/tutorial/docs/build/html/index.html b/ESP-IDF_Robot/tutorial/docs/build/html/index.html index a63434947..053c56bcb 100644 --- a/ESP-IDF_Robot/tutorial/docs/build/html/index.html +++ b/ESP-IDF_Robot/tutorial/docs/build/html/index.html @@ -45,7 +45,7 @@DATA STRUCT TRANSMITTER diff --git a/ESP-IDF_Robot/tutorial/docs/build/html/searchindex.js b/ESP-IDF_Robot/tutorial/docs/build/html/searchindex.js index 430bd0977..7f26e423d 100644 --- a/ESP-IDF_Robot/tutorial/docs/build/html/searchindex.js +++ b/ESP-IDF_Robot/tutorial/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles":{"ByteRider documentation":[[1,null]],"Chassis":[[4,"chassis"]],"DATA STRUCT":[[0,null]],"Data Encapsulation":[[6,"data-encapsulation"]],"Direction and Speed":[[3,"direction-and-speed"]],"Finished Work":[[4,"finished-work"]],"Fusion of Software with Hardware":[[3,"fusion-of-software-with-hardware"]],"HOW DOES IT WORK?":[[3,null]],"INTRODUCTION":[[2,null]],"Motor Wires Harness":[[4,"motor-wires-harness"]],"RECEIVER":[[5,null]],"Reserved Pins & GPIOs":[[3,"reserved-pins-gpios"]],"Schematic":[[3,"schematic"]],"Struct Walkthrough":[[0,"struct-walkthrough"]],"TRANSMITTER":[[6,null]],"WORK-IN-PROGRESS WALK THROUGH":[[4,null]],"Why Use __attribute((packed))?":[[0,"why-use-attribute-packed"]],"Wiring":[[4,"wiring"]],"x- and y- axis":[[3,"x-and-y-axis"]]},"docnames":["data","index","intro","overview","progress","receiver","transmitter"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["data.rst","index.rst","intro.rst","overview.rst","progress.rst","receiver.rst","transmitter.rst"],"indexentries":{},"objects":{},"objnames":{},"objtypes":{},"terms":{"":0,"0":3,"04x":3,"0x":3,"1":3,"100":3,"15":3,"16":3,"2":3,"250":0,"3":3,"4":[0,3],"47":3,"48":3,"5":3,"50":[],"6":3,"7":3,"8":3,"90":3,"91":3,"95":[],"A":3,"As":0,"IN":1,"IT":1,"If":3,"In":[0,3],"It":0,"NOT":3,"ON":0,"The":[0,3],"__attribut":[],"__attribute__":0,"__gpio6__":[],"_static":[],"across":0,"ad":0,"adapt":3,"adc1_ch0":3,"adc1_ch1":3,"add":0,"addit":0,"address":3,"align":0,"all":0,"alloc":3,"allow":0,"an":0,"analog":0,"ani":[0,3],"ar":3,"arg":3,"assign":3,"attribut":0,"axi":[],"back":3,"bacl":3,"bandwidth":0,"base":3,"batteri":0,"being":3,"below":[],"between":0,"bitbyterid":3,"board":3,"bool":0,"breadboard":3,"brief":3,"buf":3,"buffer":3,"button":[0,3],"byte":0,"c3":3,"call":3,"can":3,"captur":0,"car":3,"chang":3,"channel":3,"chassi":1,"clockwis":3,"code":3,"column":[],"command":0,"commun":0,"compact":0,"compat":0,"compil":0,"complet":4,"configur":0,"consequ":3,"constraint":3,"contain":0,"content":[],"contin":3,"control":[0,3,4],"correspond":3,"counter":3,"crc":3,"cycl":3,"data":[1,3],"data_len":3,"dc":[0,3,4],"declar":3,"decod":0,"dedic":3,"defin":3,"deletep":3,"design":0,"detail":[],"determin":[0,3],"devboard":3,"develop":3,"developmemt":3,"devic":0,"diagon":3,"differenti":0,"direct":0,"displai":3,"doe":1,"drive":0,"duti":3,"e":[0,3],"each":3,"els":3,"embed":0,"enabl":0,"encapsul":[0,1],"encod":0,"end":0,"ensur":0,"error":3,"esp":[0,3],"esp32":3,"esp_log":3,"esp_logi":3,"esp_logw":3,"esp_now_is_peer_exist":3,"esp_now_send":3,"esp_now_send_status_t":3,"etc":0,"even":0,"event":3,"everi":3,"evok":3,"exact":0,"exist":[],"expect":0,"field":0,"final":0,"fine":0,"finish":1,"fix":0,"follow":3,"four":[0,3],"from":0,"front":3,"function":3,"fusion":1,"g":0,"get":3,"gpio":1,"gpio0":3,"gpio1":3,"gpio4":3,"gpio5":3,"gpio6":3,"gpio7":3,"grain":0,"group":3,"har":1,"hardwar":[0,1],"harn":4,"hexadecim":3,"hold":3,"how":1,"i":[0,3],"ideal":0,"idf_robot_schemat":[],"illustr":3,"imag":3,"indic":0,"individu":0,"input":0,"insid":4,"instal":4,"int":[0,3],"intend":0,"interpret":0,"interv":0,"introduct":1,"joystick":[0,3],"lastli":3,"latenc":0,"layout":0,"led":0,"ledc_channel_0":3,"ledc_channel_1":3,"ledc_channel_2":3,"ledc_channel_3":3,"left":3,"length":3,"like":0,"low":0,"mac":3,"mac_addr":3,"mai":0,"make":0,"maneuv":0,"master":0,"maxim":0,"mean":3,"measur":3,"memori":[0,3],"messag":3,"microcontrol":[0,3],"minim":0,"motor":[0,1,3],"motor1_rpm_pcm":[],"motor1_rpm_pwm":[0,3],"motor2_rpm_pcm":[],"motor2_rpm_pwm":[0,3],"motor3_rpm_pcm":[],"motor3_rpm_pwm":[0,3],"motor4_rpm_pcm":[],"motor4_rpm_pwm":[0,3],"motors_rpm":3,"move":3,"movement":3,"multi":0,"nav_bttn":[0,3],"note":3,"now":[0,3],"number":3,"off":0,"ok":3,"omni":0,"onboard":0,"ondatareceiv":3,"ondatas":3,"onli":[3,4],"oper":[0,3],"oscilloscop":3,"other":3,"over":0,"pack":[],"packet":[0,3],"pad":0,"pair":[0,3],"particular":3,"payload":0,"period":3,"pin":1,"platform":0,"png":[],"pointer":3,"porttick_period_m":3,"posit":[0,3],"possibl":3,"power":3,"precis":0,"predict":0,"progress":1,"protocol":0,"provid":[0,3],"purpos":3,"push":[0,3],"pwm":[0,3],"rc":3,"rc_send_data_task":3,"receiv":[0,1,3],"receiver_mac":3,"record":[],"regist":3,"regular":0,"relev":0,"remot":0,"remov":0,"repres":0,"requir":3,"reserv":1,"resp":3,"respons":[0,3],"restructuredtext":[],"result":3,"right":3,"robot":0,"rotat":3,"row":[],"run":3,"same":[],"schemat":1,"second":3,"secur":4,"see":[],"send":[0,3],"senddata":3,"sensor":0,"sensors_data_t":[0,3],"sent":[0,3],"serial":0,"serv":0,"side":3,"sidewai":3,"signal":0,"similarli":3,"size":0,"sizeof":3,"softwar":1,"speed":0,"state":0,"static":3,"statu":[0,3],"store":3,"stream":0,"struct":[1,3],"suffici":3,"summar":3,"summari":3,"support":0,"syntax":[],"system":0,"tabl":3,"tag":3,"task":3,"telemetri":0,"tell":0,"thi":[0,3],"those":3,"through":1,"toggl":0,"transmiss":0,"transmit":[0,3],"transmitt":[0,1],"true":3,"turn":3,"two":3,"typedef":0,"uart":0,"uint8_t":[0,3],"up":0,"updat":3,"us":[],"user":0,"valu":3,"variou":3,"vehicl":0,"void":3,"voltag":3,"vtaskdelai":3,"wa":3,"walk":1,"walkthrough":1,"warn":0,"well":[],"wheel":0,"when":[0,3],"while":3,"why":[],"wire":[1,3],"work":1,"wroom":3,"x":0,"x_axi":[0,3],"y":0,"y_axi":[0,3],"you":0,"your":[]},"titles":["DATA STRUCT","ByteRider documentation","INTRODUCTION","HOW DOES IT WORK?","WORK-IN-PROGRESS WALK THROUGH","RECEIVER","TRANSMITTER"],"titleterms":{"IN":4,"IT":3,"__attribut":0,"axi":3,"byterid":1,"chassi":4,"data":[0,6],"direct":3,"document":1,"doe":3,"encapsul":6,"finish":4,"fusion":3,"gpio":3,"har":4,"hardwar":3,"how":3,"introduct":2,"motor":4,"pack":0,"pin":3,"progress":4,"receiv":5,"reserv":3,"schemat":3,"softwar":3,"speed":3,"struct":0,"through":4,"transmitt":6,"us":0,"walk":4,"walkthrough":0,"why":0,"wire":4,"work":[3,4],"x":3,"y":3}}) \ No newline at end of file +Search.setIndex({"alltitles":{"ByteRider documentation":[[1,null]],"Chassis":[[4,"chassis"]],"DATA STRUCT":[[0,null]],"Data Encapsulation":[[6,"data-encapsulation"]],"Data Payload":[[0,"data-payload"]],"Direction and Speed":[[3,"direction-and-speed"]],"Finished Work":[[4,"finished-work"]],"Fusion of Software with Hardware":[[3,"fusion-of-software-with-hardware"]],"HOW DOES IT WORK?":[[3,null]],"INTRODUCTION":[[2,null]],"Motor Wires Harness":[[4,"motor-wires-harness"]],"RECEIVER":[[5,null]],"Reserved Pins & GPIOs":[[3,"reserved-pins-gpios"]],"Schematic":[[3,"schematic"]],"TRANSMITTER":[[6,null]],"WORK-IN-PROGRESS WALK THROUGH":[[4,null]],"Why use __attribute((packed))?":[[0,"why-use-attribute-packed"]],"Wiring":[[4,"wiring"]],"x- and y- axis":[[3,"x-and-y-axis"]]},"docnames":["data","index","intro","overview","progress","receiver","transmitter"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["data.rst","index.rst","intro.rst","overview.rst","progress.rst","receiver.rst","transmitter.rst"],"indexentries":{},"objects":{},"objnames":{},"objtypes":{},"terms":{"":0,"0":3,"04x":3,"0x":3,"1":3,"100":3,"15":3,"16":3,"2":3,"250":0,"3":3,"4":[0,3],"47":3,"48":3,"5":3,"50":[],"6":3,"7":3,"8":3,"90":3,"91":3,"95":[],"A":3,"As":0,"IN":1,"IT":1,"If":3,"In":[0,3],"It":0,"NOT":3,"ON":0,"The":[0,3],"__attribut":[],"__attribute__":0,"__gpio6__":[],"_static":[],"across":0,"ad":0,"adapt":3,"adc1_ch0":3,"adc1_ch1":3,"add":0,"addit":0,"address":3,"align":0,"all":0,"alloc":3,"allow":0,"an":0,"analog":0,"ani":[0,3],"ar":3,"arg":3,"assign":3,"attribut":0,"axi":[],"back":3,"bacl":3,"bandwidth":0,"base":3,"batteri":0,"being":3,"below":[],"between":0,"bitbyterid":3,"board":3,"bool":0,"breadboard":3,"brief":3,"buf":3,"buffer":3,"button":[0,3],"byte":0,"c3":3,"call":3,"can":3,"captur":0,"car":3,"chang":3,"channel":3,"chassi":1,"clockwis":3,"code":3,"column":[],"command":0,"commun":0,"compact":0,"compat":0,"compil":0,"complet":4,"configur":0,"consequ":3,"constraint":3,"contain":0,"content":[],"contin":3,"control":[0,3,4],"correspond":3,"counter":3,"crc":3,"cycl":3,"data":[1,3],"data_len":3,"dc":[0,3,4],"declar":3,"decod":0,"dedic":3,"defin":3,"deletep":3,"design":0,"detail":[],"determin":[0,3],"devboard":3,"develop":3,"developmemt":3,"devic":0,"diagon":3,"differenti":0,"direct":0,"displai":3,"doe":1,"drive":0,"duti":3,"e":[0,3],"each":3,"els":3,"embed":0,"enabl":0,"encapsul":[0,1],"encod":0,"end":0,"ensur":0,"error":3,"esp":[0,3],"esp32":3,"esp_log":3,"esp_logi":3,"esp_logw":3,"esp_now_is_peer_exist":3,"esp_now_send":3,"esp_now_send_status_t":3,"etc":0,"even":0,"event":3,"everi":3,"evok":3,"exact":0,"exist":[],"expect":0,"field":0,"final":0,"fine":0,"finish":1,"fix":0,"follow":3,"four":[0,3],"from":0,"front":3,"function":3,"fusion":1,"g":0,"get":3,"gpio":1,"gpio0":3,"gpio1":3,"gpio4":3,"gpio5":3,"gpio6":3,"gpio7":3,"grain":0,"group":3,"har":1,"hardwar":[0,1],"harn":4,"hexadecim":3,"hold":3,"how":1,"i":[0,3],"ideal":0,"idf_robot_schemat":[],"illustr":3,"imag":3,"indic":0,"individu":0,"input":0,"insid":4,"instal":4,"int":[0,3],"intend":0,"interpret":0,"interv":0,"introduct":1,"joystick":[0,3],"lastli":3,"latenc":0,"layout":0,"led":0,"ledc_channel_0":3,"ledc_channel_1":3,"ledc_channel_2":3,"ledc_channel_3":3,"left":3,"length":3,"like":0,"low":0,"mac":3,"mac_addr":3,"mai":0,"make":0,"maneuv":0,"master":0,"maxim":0,"mean":3,"measur":3,"memori":[0,3],"messag":3,"microcontrol":[0,3],"minim":0,"motor":[0,1,3],"motor1_rpm_pcm":[],"motor1_rpm_pwm":[0,3],"motor2_rpm_pcm":[],"motor2_rpm_pwm":[0,3],"motor3_rpm_pcm":[],"motor3_rpm_pwm":[0,3],"motor4_rpm_pcm":[],"motor4_rpm_pwm":[0,3],"motors_rpm":3,"move":3,"movement":3,"multi":0,"nav_bttn":[0,3],"note":3,"now":[0,3],"number":3,"off":0,"ok":3,"omni":0,"onboard":0,"ondatareceiv":3,"ondatas":3,"onli":[3,4],"oper":[0,3],"oscilloscop":3,"other":3,"over":0,"pack":[],"packet":[0,3],"pad":0,"pair":[0,3],"particular":3,"payload":1,"period":3,"pin":1,"platform":0,"png":[],"pointer":3,"porttick_period_m":3,"posit":[0,3],"possibl":3,"power":3,"precis":0,"predict":0,"progress":1,"protocol":0,"provid":[0,3],"purpos":3,"push":[0,3],"pwm":[0,3],"rc":3,"rc_send_data_task":3,"receiv":[0,1,3],"receiver_mac":3,"record":[],"regist":3,"regular":0,"relev":0,"remot":0,"remov":0,"repres":0,"requir":3,"reserv":1,"resp":3,"respons":[0,3],"restructuredtext":[],"result":3,"right":3,"robot":0,"rotat":3,"row":[],"run":3,"same":[],"schemat":1,"second":3,"secur":4,"see":[],"send":[0,3],"senddata":3,"sensor":0,"sensors_data_t":[0,3],"sent":[0,3],"serial":0,"serv":0,"side":3,"sidewai":3,"signal":0,"similarli":3,"size":0,"sizeof":3,"softwar":1,"speed":0,"state":0,"static":3,"statu":[0,3],"store":3,"stream":0,"struct":[1,3],"suffici":3,"summar":3,"summari":3,"support":0,"syntax":[],"system":0,"tabl":3,"tag":3,"task":3,"telemetri":0,"tell":0,"thi":[0,3],"those":3,"through":1,"toggl":0,"transmiss":0,"transmit":[0,3],"transmitt":[0,1],"true":3,"turn":3,"two":3,"typedef":0,"uart":0,"uint8_t":[0,3],"up":0,"updat":3,"us":[],"user":0,"valu":3,"variou":3,"vehicl":0,"void":3,"voltag":3,"vtaskdelai":3,"wa":3,"walk":1,"walkthrough":[],"warn":0,"well":[],"wheel":0,"when":[0,3],"while":3,"why":[],"wire":[1,3],"work":1,"wroom":3,"x":0,"x_axi":[0,3],"y":0,"y_axi":[0,3],"you":0,"your":[]},"titles":["DATA STRUCT","ByteRider documentation","INTRODUCTION","HOW DOES IT WORK?","WORK-IN-PROGRESS WALK THROUGH","RECEIVER","TRANSMITTER"],"titleterms":{"IN":4,"IT":3,"__attribut":0,"axi":3,"byterid":1,"chassi":4,"data":[0,6],"direct":3,"document":1,"doe":3,"encapsul":6,"finish":4,"fusion":3,"gpio":3,"har":4,"hardwar":3,"how":3,"introduct":2,"motor":4,"pack":0,"payload":0,"pin":3,"progress":4,"receiv":5,"reserv":3,"schemat":3,"softwar":3,"speed":3,"struct":0,"through":4,"transmitt":6,"us":0,"walk":4,"walkthrough":[],"why":0,"wire":4,"work":[3,4],"x":3,"y":3}}) \ No newline at end of file diff --git a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/.buildinfo b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/.buildinfo index 6b7ea25fd..c64d0fa6e 100644 --- a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/.buildinfo +++ b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file records the configuration used when building these files. When it is not found, a full rebuild will be done. -config: c7af3d195780d92aa8671f9064b2c06a +config: d34a004e496198515034b25931fe275c tags: 62a1e7829a13fc7881b6498c52484ec0 diff --git a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/esp-idf_espnow_rc-car.pdf b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/esp-idf_espnow_rc-car.pdf index f27dee39b..029852cdd 100644 Binary files a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/esp-idf_espnow_rc-car.pdf and b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/esp-idf_espnow_rc-car.pdf differ diff --git a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/index.html b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/index.html index dbc784677..214af2562 100644 --- a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/index.html +++ b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/index.html @@ -93,8 +93,8 @@ @@ -650,10 +650,10 @@ It’s intended to be sent from a transmitting device (like a remote control on the receiving end to control hardware. -
+ - Struct Walkthrough - + Data Payload + ¶
@@ -690,7 +690,7 @@ This enables fine-grained speed control, supports differential drive configurati- Why Use __attribute((packed))? + Why use __attribute((packed))? ¶ diff --git a/ESP-IDF_Robot/tutorial/docs/source/data.rst b/ESP-IDF_Robot/tutorial/docs/source/data.rst index 8cd5b8d1e..0a1e1bb54 100644 --- a/ESP-IDF_Robot/tutorial/docs/source/data.rst +++ b/ESP-IDF_Robot/tutorial/docs/source/data.rst @@ -24,8 +24,8 @@ When used with communication protocols like ESP-NOW, this struct is **encoded** **transmitted** at regular intervals or in response to user input, and finally **decoded** on the receiving end to control hardware. -Struct Walkthrough ------------------- +Data Payload +------------ *x_axis* and *y_axis* fields capture analog input from a joystick, determining direction and speed. *nav_bttn* represents a joystick push-button. @@ -35,7 +35,7 @@ Struct Walkthrough *motor1_rpm_pwm* to *motor4_rpm_pwm* provide individual PWM signals to four DC motors. This enables fine-grained speed control, supports differential drive configurations, and even allows for maneuvering in multi-directional platforms like omni-wheel robots. -Why Use __attribute((packed))? +Why use __attribute((packed))? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ESP-NOW uses fixed-size data packets (up to 250 bytes). The *__attribute__((packed))* removes compiler-added padding for precise byte alignment.