Servon liikeradan mittaus on Raspberry Pi Pico -mikrokontrollerille kehitetty ohjelma, joka mittaa servomoottorin liikeradan kolmiakselisella kiihtyvyysanturilla (ADXL335). Ohjelma ohjaa servoa 0-180 asteen kulmavälillä ja kerää kiihtyvyysdataa servon liikkeen aikana.
Normaalitoiminta: Servo liikkuu osana laitteen normaalia toimintaa ja suorittaa sille kuuluvan käyttösyklin.
Ennakoiva kunnonvalvonta: Servon liikkeen aikana mitataan kiihtyvyyttä mittaussyklin muodostamiseksi ja data välitetään jatkokäsittelyä varten.
Ohjelma on rakennettu modulaariseksi seuraavien komponenttien avulla:
Servon ohjaus käyttää tilakonetta seuraavilla tiloilla:
| Määritys | Arvo | Kuvaus |
|---|---|---|
UART_ID |
uart0 | Käytettävä UART-kanava |
BAUD_RATE |
115200 | Nopeus bps |
UART_TX_PIN |
0 | Lähetyspin |
UART_RX_PIN |
1 | Vastaanottopin |
| Määritys | Arvo | Kuvaus |
|---|---|---|
SERVO_PIN |
16 | Servon PWM-ohjauspin |
SWITCH_PIN |
15 | Painikkeen tulo |
| Määritys | Arvo | Kuvaus |
|---|---|---|
X_AXIS_PIN |
26 | X-akselin analogitulo |
Y_AXIS_PIN |
27 | Y-akselin analogitulo |
Z_AXIS_PIN |
28 | Z-akselin analogitulo |
ADC_VOLTAGE |
3.3f | Käyttöjännite (V) |
ADC_RESOLUTION |
4095.0f | 12-bittinen AD-muunnin |
| Määritys | Arvo | Kuvaus |
|---|---|---|
PWM_WRAP |
12500 | 20ms jakso (50Hz) |
SERVO_MIN |
400 | 0.8ms pulssi (0°) |
SERVO_NEUTRAL |
1500 | 1.5ms pulssi (90°) |
SERVO_MAX |
2600 | 2.0ms pulssi (180°) |
SERVO_UPDATE_MS |
15 | Päivitysväli (ms) |
| Määritys | Arvo | Kuvaus |
|---|---|---|
MAX_MEASUREMENTS |
1000 | Mittausten enimmäismäärä yhdessä mittausjaksossa |
Kiihtyvyysmittauksen tietue
typedef struct {
int angle; // Servon kulma mittauksen hetkellä
uint16_t x, y, z; // Raaka ADC-arvo per akseli
uint32_t total; // Yhdistetty suuruus
absolute_time_t timestamp; // Aikaleima
} accel_data_t;
Servon tilakoneen tilat
typedef enum {
SERVO_IDLE, // Odotetaan painiketta
SERVO_MOVING_TO_MAX, // Liikutaan kohti maksimikulmaa
SERVO_MOVING_TO_MIN, // Palataan takaisin nollakulmaan
SERVO_CYCLE_DONE // Yksi sykli suoritettu
} ServoState;
Ohjelman pääsilmukka suorittaa seuraavat toimenpiteet:
| Laite | Pico Pin | Kuvaus |
|---|---|---|
| Servo signaali | GPIO 16 | PWM-ohjaus |
| Painike | GPIO 15 | Active LOW |
| ADXL335 X | GPIO 26 | ADC0 |
| ADXL335 Y | GPIO 27 | ADC1 |
| ADXL335 Z | GPIO 28 | ADC2 |
| UART TX | GPIO 0 | Datan lähetys |
| UART RX | GPIO 1 | Datan vastaanotto |
Mittausjakson lopuksi laite lähettää ensin 4 tavun pituuskentän (big-endian), jonka jälkeen itse JSON-datan. Tämä helpottaa vastaanottavaa päätä lukemaan koko viestin yhtenä kokonaisuutena.
{
"measurements": [
{
"time_ms": 0,
"angle": 0,
"acceleration": {
"x": 2048,
"y": 2048,
"z": 2048,
"total": 3547
}
},
// ... lisää mittauksia
],
"total_measurements": 1000,
"duration_ms": 5400
}
printf() -lauseita tilakoneen seuraamiseen