Arduino рдкрд░ рдПрдХ рдмреИрд▓реЗрдВрд╕рд░ рд░реЛрдмреЛрдЯ рдмрдирд╛рдирд╛

рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХреБрдЫ рдЬрдЯрд┐рд▓ рддрдВрддреНрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдЬреАрд╡рди рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╕реЗ рдкреНрд░реЗрддрд╡рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╡рд┐рдХрд▓реНрдк рдЙрд▓рдЯреЗ рдкреЗрдВрдбреБрд▓рдо рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛ред рд╡реАрдбрд┐рдпреЛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:







рдЧрдгрд┐рддреАрдп рдореЙрдбрд▓



рдореИрдВ рдЧрддрд┐ рдХреЗ рд╕рдореАрдХрд░рдгреЛрдВ рдХреА рд╡реНрдпреБрддреНрдкрддреНрддрд┐ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рд╕рднреА рд╕рдорд╛рди рд╣реИрдВ, рдпрд╣ рд╕рдВрд╕реНрдерд╛рди рдХрд╛ рддреАрд╕рд░рд╛ рдкрд╛рдареНрдпрдХреНрд░рдо рд╣реИред рдЬреЛ рд▓реЛрдЧ рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ:





рдПрдХ рдкреЗрдВрдбреБрд▓рдо рдПрдХ рджреНрд░рд╡реНрдпрдорд╛рди m p рд╣реИ рдЬреЛ рд▓рдВрдмрд╛рдИ l рдХреЗ рднрд╛рд░рд╣реАрди рдЫрдбрд╝ рдХреЗ рдЕрдВрдд рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рд╢рд╛рдлреНрдЯ рдХреЗ рджреВрд╕рд░реЗ рдЫреЛрд░ рд╕реЗ рдПрдХ рдореЛрдЯрд░ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХрддрдо рдХреНрд╖рдг M k рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реА рд╣реИ рдФрд░ рдЗрд╕реЗ рдорд╛рд╕ m w рдФрд░ рддреНрд░рд┐рдЬреНрдпрд╛ r рдХреЗ рдПрдХ рдкрд╣рд┐рдпреЗ рддрдХ рдкрд╣реБрдВрдЪрд╛рддреА рд╣реИред

рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдп рдПрдХ рд▓рдВрдмрд╡рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреЗрдВрдбреБрд▓рдо рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдФрд░ рдкрд╣рд┐рдпрд╛ рдХреЛ рдЕрдкрдиреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИред



рдЙрд▓рдЯреЗ рдкреЗрдВрдбреБрд▓рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЧрддрд┐ рдХреЗ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:





рд╡реЗ рдмрд▓реНрдХрд┐ рдЕрдкреНрд░рд┐рдп рд▓рдЧрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░реЛрдмреЛрдЯ рдЦреБрдж рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдПрдХ рд░реИрдЦрд┐рдХ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд:





рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд┐рдВрдЧ рдирд┐рдпрдВрддреНрд░рдг



рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдИрд░реНрд╖реНрдпрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдкреАрдЖрдИрдбреА тАЛтАЛрдирд┐рдпрдВрддреНрд░рдХ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЧреБрдгрд╛рдВрдХ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдИ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдП, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рдпреЛрдЧреНрдп рдкрд░рд┐рдгрд╛рдо рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдиреЗ рдПрдХ рд░реИрдЦрд┐рдХ-рджреНрд╡рд┐рдШрд╛рдд рдирд┐рдпрд╛рдордХ ( рд╡рд┐рдХреА ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреАред рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ, рдкреАрдЖрдИрдбреА тАЛтАЛрдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреНрд░рддреНрдпреЗрдХ рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрд╕ рдЕрдкрдиреЗ рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдПрдХ рдЙрддреНрдкрд╛рдж рд╣реИред рд╡реНрдпреБрддреНрдкрдиреНрди рдФрд░ рдЕрднрд┐рдиреНрди рдХреЗ рдХреЛрдИ рдЕрд╕рддрдд рдПрдирд╛рд▓реЙрдЧред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдореЙрдбрд▓ рдФрд░ рд░рд┐рдХреНрддреА рд╕рдореАрдХрд░рдг рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдорддрд▓рд╛рдмред



рдорддрд▓рд╛рдм рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдЧрдгрдирд╛ рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ:

A=[0 1.0 0 0;0 0 -140 0;0 0 0 1.0;0 0 28 0] B=[0;212.85;0;-19.15] Q=[5 0 0 0;0 5 0 0;0 0 1 0;0 0 0 1] R=1500 [K,S,e]=lqr(A,B,Q,R)
      
      





рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ A рд░реЛрдмреЛрдЯ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрдЯреНрд░рд┐рд╕реЗрд╕ A рдФрд░ B рд░реЗрдЦреАрдпрдХреГрдд рдореЙрдбрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИрдВред

рдХреНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореВрд▓, рдиреЛрдЯ рд╕реЗ рднрдЯрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХрд┐рддрдирд╛ рдЬреБрд░реНрдорд╛рдирд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рдордиреНрд╡рдп рдореЗрдВ рдЧрддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЖрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рджреНрд╡рд╛рд░рд╛ рдКрд░реНрдЬрд╛ рдХреА рдмрд░реНрдмрд╛рджреА рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХрд┐рддрдирд╛ рдЬреБрд░реНрдорд╛рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдЪрд░ K рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдЧреБрдгрд╛рдВрдХ рд╣реЛрдВрдЧреЗред



рд╕рд┐рдореБрд▓реЗрд╢рди



рдорддрд▓рд╛рдм рд╕рд┐рдореБрд▓рд┐рдВрдХ рдореЗрдВ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЧрдгрд┐рддреАрдп рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдХрд╛ рд▓рд┐рдВрдХ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдореИрдВ рдХреЗрд╡рд▓ рд░реЗрдЦрд╛рдВрдХрди рджреВрдВрдЧрд╛ред

рдкреЗрдВрдбреБрд▓рдо рд╡рд┐рдХреНрд╖реЗрдкрдг рдХреЛрдг:



рдкрд╣рд┐рдпрд╛ рд╡рд┐рдХреНрд╖реЗрдкрдг рдХреЛрдг:



рдЗрдВрдЬрди рдЯреЛрдХрд╝:





рд▓реЛрд╣реЗ рдореЗрдВ рдмреЛрдз



рд░реЛрдмреЛрдЯ рдХрд╛ рдлреНрд░реЗрдо рд╕реНрд╡рдпрдВ рдПрд▓реНрдпреВрдореАрдирд┐рдпрдо рдкреНрд░реЛрдлрд╛рдЗрд▓ 12 рдорд┐рдореА рдФрд░ 14 рдорд┐рдореА рд╣реИ, рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВред Rivets рджреНрд╡рд╛рд░рд╛ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХреНрд╕ рдЕрдХреНрд╖рд░ T рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╛рдЗрдмрд░рдЧреНрд▓рд╛рд╕ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред рдореЛрдЯрд░реНрд╕ рдХреЛ рдПрдХ рдлрд╛рдЗрдмрд░ рдЧреНрд▓рд╛рд╕ рдПрдбрд╛рдкреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред





рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ рдЗрди рдореЛрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:



рдЗрдирдХрд╛ рдЯреЙрд░реНрдХ 2.2kg * cm рдпрд╛ 0.2Nm рд╣реИред рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдиреНрдп рдореЛрдЯрд░реНрд╕ рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛:



рдирд┐рд░реНрдорд╛рддрд╛ рд╕рдВрджрд░реНрдн

рдЕрдзрд┐рдХрддрдо рдЯреЛрдХрд╝ 14 рдХрд┐рдЧреНрд░рд╛ * рд╕реЗрдореА рдпрд╛ 1.4Nmред рд╡реЗ 5 рдП рддрдХ рд╡рд░реНрддрдорд╛рди рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП Arduino рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдмреАрдЪ рд▓реЛрдХрдкреНрд░рд┐рдп L293D, рдпрд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред



рдХреЛрдг рдФрд░ рдХреЛрдгреАрдп рд╡реЗрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ IMU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдЬрд╛рдЗрд░реЛрд╕реНрдХреЛрдк рдФрд░ рдПрдХ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ред L3G рдЧрд╛рдпрд░реЛрд╕реНрдХреЛрдк рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдмреЛрд░реНрдб рдФрд░ LSM303 рдореИрдЧрдиреЗрдЯреЛрдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрдбрд╝рд╛ рдерд╛ред рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдорд╛рди рдмреЛрд░реНрдб рд╣реИрдВ рдФрд░ рдореИрдВ рд╕реЗрдВрд╕рд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реЗрдВрд╕рд░ рдХреА рд░реАрдбрд┐рдВрдЧ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧрд╛рдпрд░реЛрд╕реНрдХреЛрдк рд▓рдЧрд╛рддрд╛рд░ рдЫреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдПрдХреНрд╕реАрд▓реЗрд░реЛрдореАрдЯрд░ рд╢реЛрд░ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЭреВрда рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ рдЕрдЧрд░ рд░реЛрдмреЛрдЯ рдХреЛрдг рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЪрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред

рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ рдХрд▓рдорди рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдЖрд░рд╕реА рдлрд╝рд┐рд▓реНрдЯрд░ (рдкреВрд░рдХ рдлрд╝рд┐рд▓реНрдЯрд░)ред рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

 float lastCompTime=0; float filterAngle=1.50; float dt=0.005; float comp_filter(float newAngle, float newRate) { dt=(millis()-lastCompTime)/1000.0; float filterTerm0; float filterTerm1; float filterTerm2; float timeConstant; timeConstant=0.5; filterTerm0 = (newAngle - filterAngle) * timeConstant * timeConstant; filterTerm2 += filterTerm0 * dt; filterTerm1 = filterTerm2 + ((newAngle - filterAngle) * 2 * timeConstant) + newRate; filterAngle = (filterTerm1 * dt) + filterAngle; lastCompTime=millis(); return filterAngle; }
      
      





рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред



рдЕрдЧрд▓рд╛ рд╕реЗрдВрд╕рд░ рдореЛрдЯрд░ рдкрд░ рдПрдХ рдХреНрд╡рд╛рдбрд░реЗрдЪрд░ рдПрдирдХреЛрдбрд░ рд╣реИред рдпрд╣ рдЕрдкрдиреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╕реЗ 2 рдкрд░ рдЖрдпрддрд╛рдХрд╛рд░ рджрд╛рд▓реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:



рдЙрдиреНрд╣реЗрдВ рдпрд╛ рддреЛ рд╡реНрдпрд╡рдзрд╛рди рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд▓реВрдк рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝рдХрд░ред Arduino рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╢рд╛рдирджрд╛рд░ рд▓реЗрдЦ рд╣реИ ред



рдпрд╣ рдкрд╣рд┐рдпрд╛ рдХреЗ рдХреЛрдгреАрдп рд╡реЗрдЧ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣рд╛рдВ рд╕реНрдХреВрд▓ рдХрд╛ рдлрд╛рд░реНрдореВрд▓рд╛ рддрдп рдХреА рдЧрдИ рджреВрд░реА / рд╕рдордп рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред

 #define ToPhiRad(x) ((x)*0.00280357142) timer_old = timer; timer=millis(); G_Dt = (timer-timer_old)/1000.0; dPhi=(ToPhiRad(encoder0Pos)-lastPhi)/G_Dt;
      
      





ToPhiRad рдПрдирдХреЛрдбрд░ рдХреЗ рдЯрд┐рдХреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд╣рд┐рдпрд╛ рдХреЗ рдХреЛрдиреЗ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ, рдореЗрд░рд╛ рдПрдирдХреЛрдбрд░ рдкреНрд░рддрд┐ рдХреНрд░рд╛рдВрддрд┐ рд▓рдЧрднрдЧ 2240 рдЯрд┐рдХреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдХреЛрдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЯрд┐рдХреНрдХреЛрдВ рдХреЛ 2 рдкрд╛рдИ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреВрд░реНрдг рдкрд╣рд┐рдпрд╛ рдШреБрдорд╛рд╡ рдкрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред



рд╕реЗрдВрд╕рд░ рд░реАрдбрд┐рдВрдЧ LQR рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддреА рд╣реИ:

 float K1=0.1,K2=0.29,K3=6.5,K4=1.12; long getLQRSpeed(float phi,float dphi,float angle,float dangle){ return constrain((phi*K1+dphi*K2+K3*angle+dangle*K4)*285,-400,400); }
      
      





Matlab рд╕реЗ рдЧреБрдгрд╛рдВрдХ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдкрд╣рд▓реЗ 2 рдЧреБрдгрд╛рдВрдХ рдХреЛ рд╕рд╣реА рдХрд┐рдпрд╛ред

рдореЗрд░рд╛ рдбреНрд░рд╛рдЗрд╡рд░, рдпрд╛ рдЗрд╕рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА, -400 рд╕реЗ 400 рддрдХ рдорд╛рди рд▓реЗрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдорд╛рдирд╛ рдХрд┐ 400 рдореЗрдВ рдпрд╣ 12V рдореЛрдЯрд░ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдореЛрдЯрд░ рдПрдХ рдЕрдзрд┐рдХрддрдо рдЯреЛрдХрд╝ (1.4Nm) рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛ рд╣реИред 400 рдХреЛ 1.4 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ Nm рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛рд░рдХ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ LQR рдХреЛ рджреЗрддрд╛ рд╣реИ, рдРрд╕реЗ рдорд╛рди рдЬреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред



рдмрд╕ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд░реЛрдмреЛрдЯ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреАрдЯреА-рдореЙрдбреНрдпреВрд▓ рдПрдЪрд╕реА -05 рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдореЙрдбреНрдпреВрд▓ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ 5V рдкрд░ 3.3V, рдФрд░ Arduino рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╡реЛрд▓реНрдЯреЗрдЬ рдбрд┐рд╡рд╛рдЗрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рд╛рдкреНрдд рдЗрдирдкреБрдЯ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдХрдиреЗрдХреНрд╢рди рдЖрд░реЗрдЦ рд╣реИ:



рдЪрдХреНрд░ рдХреЗ рджреМрд░рд╛рди, рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

 float phiDif=0.f; float factorDif=0.f; float getPhiAdding(float dif){ //       - if(dif<200 && dif>-200){return 0.f;} float ret = dif*0.08; return ret; } float getFactorAdding(float dif){//      if(dif<200 && dif>-200){return 0.f;} float ret = dif/500*20; return ret; } //======== if (Serial.available()){ BluetoothData=Serial.read(); if(BluetoothData=='w'){ phiDif=200; } else if(BluetoothData=='s'){ phiDif=-200; } else if(BluetoothData=='a'){ factorDif=200; } else if(BluetoothData=='d'){ factorDif=-200; } else if(BluetoothData=='c'){ factorDif=0; phiDif=0; } }
      
      





рдЕрдВрддрддрдГ, рд╕реЗрдВрд╕рд░ рд░реАрдбрд┐рдВрдЧ рдирд┐рдпрд╛рдордХ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рднрд╛рд╡ рдореЛрдЯрд░реЛрдВ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ:

  encoder0Pos+=getPhiAdding(phiDif); lastPhi=ToPhiRad(encoder0Pos); spd=getLQRSpeed(ToPhiRad(encoder0Pos),dPhi,balanceAt-angle,gyroRate[coordY]); float factorL=getFactorAdding(factorDif); md.setSpeeds(spd-factorL,spd+factorL);
      
      





рд╣рд░ 50 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдмрд╛рд░ рд░реЛрдмреЛрдЯ рдХрд╛ рдЯреЗрд▓реАрдореЗрдЯреНрд░реА рдХреЛрдг рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  if(millis()%50==0){ Serial.println(angle); }
      
      







рд░реЗрдбрд┐рдпреЛ рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝реЗрдВ



рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдлреЛрди рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред



рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдирд╛ рд╣реИ, рдмреАрдЯреА-рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлреЛрди (рдорд╛рдирдХ рдХреЛрдб 1234) рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 BluetoothAdapter bluetooth; String []boundedItems; protected static final int RECIEVE_MESSAGE = 1; @Override protected void onCreate(Bundle savedInstanceState) { //... bluetooth = BluetoothAdapter.getDefaultAdapter(); if(bluetooth != null){ if (!bluetooth.isEnabled()) { bluetooth.enable(); } } Set<BluetoothDevice> bounded=bluetooth.getBondedDevices(); boundedItems=new String[bounded.size()]; int i=0; for (BluetoothDevice bluetoothDevice : bounded) { boundedItems[i++]=bluetoothDevice.getName(); } showListDialog(); //... } public void showListDialog(){ AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Pick a device"); builder.setItems(boundedItems, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { connectTo(item); } }); AlertDialog alert = builder.create(); alert.show(); }
      
      





рдбрд┐рд╡рд╛рдЗрд╕ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рдж, рдЙрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:

  private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); BluetoothSocket btSocket; public void connectTo(int id){ Set<BluetoothDevice> bounded=bluetooth.getBondedDevices(); for (BluetoothDevice bluetoothDevice : bounded) { if(bluetoothDevice.getName().equalsIgnoreCase(boundedItems[id])){ try { btSocket=bluetoothDevice.createRfcommSocketToServiceRecord(MY_UUID); btSocket.connect(); ct=new ConnectionThread(btSocket); ct.start(); } catch (IOException e) { e.printStackTrace(); try { btSocket.close(); } catch (IOException e1) { e1.printStackTrace(); } showListDialog(); } return; } } }
      
      





рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рд╡рд╛рд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рд░реЛрдмреЛрдЯ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИ:

 private class ConnectionThread extends Thread{ private final InputStream mmInStream; private final BufferedReader br; private final OutputStream mmOutStream; public ConnectionThread(BluetoothSocket socket) throws IOException { mmInStream = socket.getInputStream(); br=new BufferedReader(new InputStreamReader(mmInStream)); mmOutStream = socket.getOutputStream(); } public void run() { while (true) { try { String line=br.readLine(); h.obtainMessage(RECIEVE_MESSAGE, line).sendToTarget(); } catch (IOException e) { e.printStackTrace(); } } } public void sendCmd(char cmd){ try{ mmOutStream.write(cmd); }catch (IOException e) { e.printStackTrace(); } } }
      
      





рдереНрд░реЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдореБрдЦреНрдп рдереНрд░реЗрдб рдХреЛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 h = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case RECIEVE_MESSAGE: String line=(String)msg.obj; try{ float a=Float.parseFloat(line.trim()); balancerView.setAngle((float) (a-Math.PI/2.f)); }catch (Exception e) { } break; } }; };
      
      







balancerView SurfaceView рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рд╡рдВрд╢рдЬ рд╣реИ, рдпрд╣ рд░реЛрдмреЛрдЯ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИред

рдпрд╣рд╛рдБ рдЙрд╕рдХреА redraw рд╡рд┐рдзрд┐ рд╣реИ:

 public void draw(Canvas canvas) { Paint paint=new Paint(); paint.setStrokeWidth(3); canvas.save(); canvas.rotate((float) (angle*180.f/Math.PI), cx, cy); paint.setColor(Color.BLACK); canvas.drawRect(cx-15, cy-150, cx+15, cy, paint); paint.setColor(Color.WHITE); canvas.drawRect(cx-12, cy-147, cx+12, cy-3, paint); paint.setColor(Color.BLACK); canvas.drawCircle(cx, cy, 30, paint); paint.setColor(Color.WHITE); canvas.drawCircle(cx, cy, 25, paint); canvas.restore(); }
      
      





рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ рд░реЛрдмреЛрдЯ рдХреЛ рдХрдорд╛рдВрдб рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдмрдЯрди рджрдмрд╛рдХрд░ рдЖрдк рд░реЛрдмреЛрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВред

  @Override public boolean onTouch(View v, MotionEvent me) { if(me.getAction()==MotionEvent.ACTION_UP){ ct.sendCmd('c'); return false; } if(v==wB){ ct.sendCmd('w'); }else if(v==aB){ ct.sendCmd('a'); }else if(v==sB){ ct.sendCmd('s'); }else if(v==dB){ ct.sendCmd('d'); } return false; }
      
      







рдирд┐рд╖реНрдХрд░реНрд╖



рдкреВрд░реА рдЗрдорд╛рд░рдд рдореЗрдВ рд╕рдмрд╕реЗ рд╕реБрдЦрдж рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЧрдгрд┐рддреАрдп рдореЙрдбрд▓ рднреМрддрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕рд╣рдордд рдерд╛ред рд▓реЛрд╣реЗ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕реНрд╡рдпрдВ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╣реА рдореЛрдЯрд░реНрд╕ рдХрд╛ рдЪрдпрди, рд░реЛрдмреЛрдЯ рдХреА рдКрдВрдЪрд╛рдИ, рдКрдкрд░ рд╕реЗ рднрд╛рд░ рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рд╕рдВрд╢реНрд▓реЗрд╖рдг рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рдо рд╣реИред



рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдПрдХ рдкрд╣рд┐рдпрд╛ рдкрд░ рдПрдХ рдЙрд▓реНрдЯреЗ рдкреЗрдВрдбреБрд▓рдо рдХреА рдЧрддрд┐ рдХреЗ рд╕рдореАрдХрд░рдгреЛрдВ рдХреА рд╡реНрдпреБрддреНрдкрддреНрддрд┐: рд╕рдореАрдХрд░рдгреЛрдВ рдХреА рд╡реНрдпреБрддреНрдкрддреНрддрд┐ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛

рдЧрд┐рддреБрдм рднрдВрдбрд╛рд░



All Articles