2026-04-29 23:10:16 +02:00
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
|
# =========================
|
|
|
|
|
# CONFIGURAZIONE
|
|
|
|
|
# =========================
|
|
|
|
|
m1pwmap =40
|
|
|
|
|
m1pwmch=60
|
|
|
|
|
m2pwmap=70
|
|
|
|
|
m2pwmch= 70
|
|
|
|
|
m3pwmap= 35
|
|
|
|
|
m3pwmch= 40
|
|
|
|
|
m4pwmap= 40
|
|
|
|
|
m4pwmch= 40
|
|
|
|
|
m1rampstart= 20
|
|
|
|
|
m2rampstart= 20
|
|
|
|
|
m3rampstart= 20
|
|
|
|
|
m4rampstart= 20
|
|
|
|
|
t1ap= 280
|
|
|
|
|
t2ap= 4
|
|
|
|
|
t3ap= 10
|
|
|
|
|
t4ap= 40
|
|
|
|
|
twap= 1
|
|
|
|
|
t1ch= 27
|
|
|
|
|
t2ch= 10
|
|
|
|
|
t3ch= 30
|
|
|
|
|
t4ch= 1
|
|
|
|
|
twch= 1
|
|
|
|
|
# 0,
|
|
|
|
|
# 0,
|
|
|
|
|
# 0,
|
|
|
|
|
tramp1= 100
|
|
|
|
|
m1pwmMan= 60
|
|
|
|
|
m2pwmMan= 70
|
|
|
|
|
m3pwmMan= 40
|
|
|
|
|
m4pwmMan= 40
|
|
|
|
|
trampman= 50
|
2026-05-02 13:05:31 +02:00
|
|
|
tramp= 10
|
|
|
|
|
|
|
|
|
|
apM1start= 310
|
|
|
|
|
apM1stop= 450
|
|
|
|
|
apM2start= 30
|
|
|
|
|
apM2stop= 310
|
|
|
|
|
apM3start= 350
|
|
|
|
|
apM3stop= 450
|
|
|
|
|
apM4start= 450
|
|
|
|
|
apM4stop= 850
|
|
|
|
|
|
2026-04-29 23:10:16 +02:00
|
|
|
# Ogni fase è:
|
|
|
|
|
# (tempo_inizio, tempo_fine, velocita_iniziale, velocita_finale)
|
|
|
|
|
|
|
|
|
|
motori = {
|
|
|
|
|
"Motore1": [
|
2026-05-02 13:05:31 +02:00
|
|
|
(apM1start, apM1start+tramp, m1rampstart, m1pwmap),
|
|
|
|
|
(apM1start+tramp, apM1stop, m1pwmap, m1pwmap),
|
|
|
|
|
(apM1stop, apM1stop+tramp, m1pwmap, 0)
|
2026-04-29 23:10:16 +02:00
|
|
|
],
|
|
|
|
|
"Motore2": [
|
2026-05-02 13:05:31 +02:00
|
|
|
(apM2start, apM2start+tramp, m2rampstart, m2pwmap),
|
|
|
|
|
(apM2start+tramp, apM2stop, m2pwmap, m2pwmap),
|
|
|
|
|
(apM2stop, apM2stop+tramp, m2pwmap, 0)
|
2026-04-29 23:10:16 +02:00
|
|
|
],
|
|
|
|
|
"Motore3": [
|
2026-05-02 13:05:31 +02:00
|
|
|
(apM3start, apM3start+tramp, m3rampstart, m3pwmap),
|
|
|
|
|
(apM3start+tramp, apM3stop, m3pwmap, m3pwmap),
|
|
|
|
|
(apM3stop, apM3stop+tramp, m3pwmap, 0)
|
2026-04-29 23:10:16 +02:00
|
|
|
],
|
|
|
|
|
"Motore4": [
|
2026-05-02 13:05:31 +02:00
|
|
|
(apM4start, apM4start+tramp, m4rampstart, m4pwmap),
|
|
|
|
|
(apM4start+tramp, apM4stop, m4pwmap, m4pwmap),
|
|
|
|
|
(apM4stop, apM4stop+tramp, m4pwmap, 0)
|
2026-04-29 23:10:16 +02:00
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Buzzer ON/OFF: (inizio, fine)
|
|
|
|
|
buzzer = [
|
|
|
|
|
(20, 21),
|
|
|
|
|
(22, 23),
|
|
|
|
|
(24, 25),
|
|
|
|
|
(26, 27),
|
|
|
|
|
(28, 29),
|
|
|
|
|
(30, 31),
|
|
|
|
|
(32, 33),
|
|
|
|
|
(34, 35),
|
|
|
|
|
(36, 37),
|
|
|
|
|
(38, 39),
|
|
|
|
|
(40, 41),
|
|
|
|
|
(42, 43),
|
|
|
|
|
(44, 45),
|
|
|
|
|
(46, 47),
|
|
|
|
|
(48, 49),
|
|
|
|
|
(50, 55),
|
|
|
|
|
(60, 65),
|
|
|
|
|
(70, 75),
|
|
|
|
|
(80, 85),
|
|
|
|
|
(90, 95),
|
|
|
|
|
(100, 105),
|
|
|
|
|
(110, 115),
|
|
|
|
|
(120, 125),
|
|
|
|
|
(130, 135),
|
|
|
|
|
(140, 145),
|
|
|
|
|
(150, 155),
|
|
|
|
|
(160, 165),
|
|
|
|
|
(170, 175),
|
|
|
|
|
(180, 185),
|
|
|
|
|
(190, 195),
|
|
|
|
|
(200, 205),
|
|
|
|
|
(210, 215),
|
|
|
|
|
(220, 225),
|
|
|
|
|
(230, 235),
|
|
|
|
|
(240, 245),
|
|
|
|
|
(250, 255),
|
|
|
|
|
(260, 265),
|
|
|
|
|
(270, 275),
|
|
|
|
|
(280, 285),
|
|
|
|
|
(290, 295),
|
|
|
|
|
(300, 305),
|
|
|
|
|
(310, 315),
|
|
|
|
|
(320, 325),
|
|
|
|
|
(330, 335),
|
|
|
|
|
(340, 345),
|
|
|
|
|
(350, 355),
|
|
|
|
|
(360, 365),
|
|
|
|
|
(370, 375),
|
|
|
|
|
(380, 385),
|
|
|
|
|
(390, 395),
|
|
|
|
|
(400, 405),
|
|
|
|
|
(410, 415),
|
|
|
|
|
(420, 425),
|
|
|
|
|
(430, 435),
|
|
|
|
|
(440, 445),
|
|
|
|
|
(450, 455),
|
|
|
|
|
(460, 465),
|
|
|
|
|
(470, 475),
|
|
|
|
|
(480, 485),
|
|
|
|
|
(490, 495),
|
|
|
|
|
(500, 505),
|
|
|
|
|
(510, 515),
|
|
|
|
|
(520, 525),
|
|
|
|
|
(530, 535),
|
|
|
|
|
(540, 545),
|
|
|
|
|
(550, 555),
|
|
|
|
|
(560, 565),
|
|
|
|
|
(570, 575),
|
|
|
|
|
(580, 585),
|
|
|
|
|
(590, 595),
|
|
|
|
|
(600, 605),
|
|
|
|
|
(610, 615),
|
|
|
|
|
(620, 625),
|
|
|
|
|
(630, 635),
|
|
|
|
|
(640, 645),
|
|
|
|
|
(650, 655),
|
|
|
|
|
(660, 665),
|
|
|
|
|
(670, 675),
|
|
|
|
|
(680, 685),
|
|
|
|
|
(690, 695),
|
|
|
|
|
(700, 705),
|
|
|
|
|
(710, 715),
|
|
|
|
|
(720, 725),
|
|
|
|
|
(730, 735),
|
|
|
|
|
(740, 745),
|
|
|
|
|
(750, 755),
|
|
|
|
|
(760, 765),
|
|
|
|
|
(770, 775),
|
|
|
|
|
(780, 785),
|
|
|
|
|
(790, 795),
|
|
|
|
|
(800, 805),
|
|
|
|
|
(810, 815),
|
|
|
|
|
(820, 825),
|
|
|
|
|
(830, 835),
|
|
|
|
|
(840, 845),
|
|
|
|
|
(850, 855),
|
|
|
|
|
(860, 865),
|
|
|
|
|
(870, 875),
|
|
|
|
|
(880, 885),
|
|
|
|
|
(890, 895),
|
|
|
|
|
(900, 905),
|
|
|
|
|
(910, 915),
|
|
|
|
|
(920, 925),
|
|
|
|
|
(930, 935),
|
|
|
|
|
(940, 945),
|
|
|
|
|
(950, 955),
|
|
|
|
|
(960, 965),
|
|
|
|
|
(970, 975),
|
|
|
|
|
(980, 985),
|
|
|
|
|
(990, 995),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
tasto = [
|
|
|
|
|
(0, 30),
|
|
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# =========================
|
|
|
|
|
# CREAZIONE GRAFICO
|
|
|
|
|
# =========================
|
|
|
|
|
|
|
|
|
|
fig, ax = plt.subplots(figsize=(13, 6))
|
|
|
|
|
|
2026-05-02 13:05:31 +02:00
|
|
|
colori = {
|
|
|
|
|
"Motore1": "blue",
|
|
|
|
|
"Motore2": "lightgreen",
|
|
|
|
|
"Motore3": "orange",
|
|
|
|
|
"Motore4": "purple"
|
|
|
|
|
}
|
2026-04-29 23:10:16 +02:00
|
|
|
# Motori: linee di velocità
|
|
|
|
|
for nome, fasi in motori.items():
|
|
|
|
|
tempi = []
|
|
|
|
|
velocita = []
|
|
|
|
|
|
|
|
|
|
for start, end, v0, v1 in fasi:
|
|
|
|
|
t = np.linspace(start, end, 50)
|
|
|
|
|
v = np.linspace(v0, v1, 50)
|
|
|
|
|
|
|
|
|
|
tempi.extend(t)
|
|
|
|
|
velocita.extend(v)
|
|
|
|
|
|
2026-05-02 13:05:31 +02:00
|
|
|
ax.plot(tempi, velocita, marker="o", markersize=2, label=nome, color=colori[nome])
|
2026-04-29 23:10:16 +02:00
|
|
|
|
|
|
|
|
# Buzzer: riga separata in basso
|
2026-05-02 13:05:31 +02:00
|
|
|
y_buzzer = -10
|
2026-04-29 23:10:16 +02:00
|
|
|
|
|
|
|
|
for start, end in buzzer:
|
|
|
|
|
ax.broken_barh(
|
|
|
|
|
[(start, end - start)],
|
|
|
|
|
(y_buzzer, 8),
|
|
|
|
|
facecolors="red",
|
|
|
|
|
alpha=0.7
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Scritta "Buzzer"
|
|
|
|
|
ax.text(
|
|
|
|
|
-120,
|
|
|
|
|
y_buzzer + 4,
|
|
|
|
|
"Buzzer",
|
|
|
|
|
va="center",
|
|
|
|
|
ha="right"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# tasto: riga separata in basso
|
2026-05-02 13:05:31 +02:00
|
|
|
y_tasto = -20
|
2026-04-29 23:10:16 +02:00
|
|
|
|
|
|
|
|
for start, end in tasto:
|
|
|
|
|
ax.broken_barh(
|
|
|
|
|
[(start, end - start)],
|
|
|
|
|
(y_tasto, 8),
|
|
|
|
|
facecolors="yellow",
|
|
|
|
|
alpha=0.7
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Scritta "tasto"
|
|
|
|
|
ax.text(
|
|
|
|
|
-120,
|
|
|
|
|
y_tasto + 4,
|
|
|
|
|
"Tasto",
|
|
|
|
|
va="center",
|
|
|
|
|
ha="right"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# =========================
|
|
|
|
|
# FORMATTAZIONE
|
|
|
|
|
# =========================
|
|
|
|
|
|
2026-05-02 13:05:31 +02:00
|
|
|
ax.set_xlabel("Tempo (decimi di secondo)")
|
2026-04-29 23:10:16 +02:00
|
|
|
ax.set_ylabel("Velocità motore (%)")
|
2026-05-02 13:05:31 +02:00
|
|
|
ax.set_title("Timeline APERTURA motori con rampe + buzzer")
|
2026-04-29 23:10:16 +02:00
|
|
|
|
2026-05-02 13:05:31 +02:00
|
|
|
ax.set_ylim(-20, 110)
|
2026-04-29 23:10:16 +02:00
|
|
|
ax.grid(True)
|
|
|
|
|
ax.legend()
|
|
|
|
|
|
|
|
|
|
# Salva immagine
|
|
|
|
|
plt.savefig("timeline_completa.png", dpi=300, bbox_inches="tight")
|
|
|
|
|
|
|
|
|
|
plt.show()
|