This is an old revision of the document!


Inverted Pendulum Dev Kit

Made by: Tudor Petracovici

Grupa: 334CC

Asistent: Teodor Dicu

Introducere

Pendulul Invers este in sine o problema si un challenge in lumea sistemelor controlate si al algoritmilor de control. Exista multe variatiuni, unele pe ax fix, iar altele ce au un grad de libertate mult mai mare.

?800

Proiectul implementeaza un Inverted Pendulum Development Kit bazat pe ESP32, ce vine cu toate feature-urile necesare pentru controlarea unui pendul invers, dar putand fii mai departe utilizat in diverse aplicatii dat fiind versatilitatea acestuia.

Ideea de la care am pornit a fost în sine echilibrarea unui pendul, vazand pe internet tot felul de self-balancing robots care mi-au trezit interesul. In plus, mereu am vrut sa step up a notch si sa cresc dificultatea implementarii unui algoritm de PID de la simplii line followers, dar aplicatii de tipul acesta in care sunt mult mai multe forte externe implicate.

Acest Development Kit este foarte facil pentru studentii care vor sa intre mai adanc in lumea algoritmilor de control, pentru ca pot vedea un feedback live la cum afecteaza cele 3 valori (K_p, K_i, K_d) din PID, sistemul.

Descriere generală

Schema bloc a proiectului:

Unghiul actual al pendulului este calculat cu ajutorul a celor 1200 de pulsuri generate de un incremental rotary encoder. Aceasta sunt impartite pentru a putea ajunge la o mapare exacta in cadranul unui cerc, 0 grade fiind pozitia de start, iar 180 de grade fiind pozitia de echilibru al sistemlui, mai exact pe verticala.

Avand 2 core-uri disponibile, am ales sa fac o aplicatie multi-threading. Unul din core-uri se va ocupa cu comunicarea user-ului cu web server-ul pentru a ne asigura ca mereu primim cele mai recente valori pentru PID, iar al doilea core se va ocupa strict cu generarea semnalului PWM, citirea impulsurilor encoder-ului si controlul motorului. Pentru ușurarea sistemului avem urmatoarele surse de input:

Interactiunea componentelor:

Pentru alimentarea circuitului am folosit o sursa in comutatie de 12V si de 6A, deoarece motorul in load maxim poate consuma pana la 3A. Din sursa este alimentat H-bridge-ul de 6A de la Infineon si in acelasi timp un buck converter ce coboara tensiunea la 5V pentru a alimenta ESP-ul prin pin-ul de VIN. In acelasi timp, encoder-ul este alimentat tot la 5V dar cele doua faze de output ale acestuia sunt trase la 3V3 prin 2 rezistene de 2k7 pentru a fi in aceeasi logica de functionare cu cea a ESP-ului. Pendulul este pus in miscare de un motor de 12V cu cuplu mare si 280 de RPM, pentru a putea sustine si greutatea pendulului + encoder-ului, dar si pentru a putea schimba rapid directia pentru stabilizarea pendulului. Ca platforma, am ales ESP32 deoarece este un dual core rapid. Dupa cum am zis, proiectul va ajuta si ca un learning model pentru aplicarea PID-ului, putand schimba valorile K_p, K_i si k_d live.

Pentru ca ESP-ul este rapid, a trebuit sa realizez un semnal de ceas ce functioneaza la 1000Hz ce genereaza o intrerupere la fiecare milisecunda pentru a putea citi la intervale fixe valorile encoder-ului si pentru a putea calcula corect interval-ul intre citiri. Daca nu as fi folosit acest timer, diferenta de timp intre citiri ar fi fost la nivelul micro secundelor, lucru ce incurca funtionarea corecta a pendulului.

Principiu de functionare: Encoder-ul trimite pulsuri catre uC ce sunt citite pe o intrerupere. Aceste impulsuri sunt transformate in grade cu ajutorul unui calcul matematic simplu. Unghiul apoi este bagat ca feedback in PID controller, unde setpoint-ul este setat la 180 de grade (vrem ca pendulul sa stea vertical in sus).

Output-ul ete un semnal pwm generat de ESP ce functioneaza la o frecventa de 1000Hz si o rezolutie de 16 biti. Timer-ul de 1000Hz, asa cum am spus mai sus, este folosit pentru a stii exact intervalul intre citiri si de a nu avea schimbari aleatorii de timp intre citiri.

Hardware Design

Listă de piese:

  • ESP32 DevKit V1 - ESP32-WROOM-32 240Mhz
  • Incremental Rotary Encoder - folosit pentru calcularea unghiului
  • Motor DC 12V, 280RPM
  • Sursa de tensiune in comutatie Meanwell 12V 75W
  • Buck-Converter LM2596HS-ADJ
  • INFINEON IFX9201SG 6A H-bridge motor driver
  • Pendul realizat din fibra de sticla
  • Diverse bracket-uri si componente printate 3D
  • Componente electronice de baza (condensatoare, rezistente, etc.)

Schema electrica motor driver:

Schema electrica full: schematic_invertedpendulum.pdf

Modelul 3D al PCB-ului:

Modelele 3D ale proiectului:

Stare actuala pendul: (Nu a venit inca PCB-ul)

Software Design

Platform.io:

Platform.io este un mediu de dezvoltare built on top of VS Code, mult mai rapid si mai versatil decat simplul Arduino IDE, ce ofera posibilitatea programarii multor environment-uri, printre care si cel de la Esspressif32. Compilarea si upload-ul catre placi este mult mai smooth, putand face si software debug prin serial.

Librarii si surse:

Pentru librarii am folosit Arduino.h si RotaryEncoder.h, care vine cu niste functii mai rapide de a calcula unghiul din cele 1200 de pulsuri folosind un interrupt handler mai eficient.

Algoritmi si structuri: Pe partea de algoritmi, proiectul se bazeaza pe un algoritm de control, mai exact PID, ce se foloseste de unghiul la momentul T al pendulului ca input.

Pseudocod algoritm PID:

k_p = 1
k_i = 0
k_d = 0
 
# Loop forever
interval = 1 #1ms
error_prev = 0
integral = 0
setpoint = 180
while True:
 
    # Get angle from encoder(feedback)
    val = encoder->get_angle()
 
    # Calculate the PID terms
    error = setpoint – val
    integral = integral + (error * interval)
    derivative = (error – error_prev) / interval
    output = (k_p * error) + (k_i * integral) + (k_d * derivative)
 
    # Save value for next iteration
    error_prev = error

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2024/tdicu/tudor.petracovici.1716795870.txt.gz · Last modified: 2024/05/27 10:44 by tudor.petracovici
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0