Salve a tutti, avrei bisogno di direttive riguardo alla realizzazione di un codice Matlab per la simulazione del comportamento di un nastro trasportatore per la cernita dei pomodori. C'è un nastro continuo che per una prima parte presenta telecamere per il riconoscimento dei pomodori attraverso le tecniche di computer vision, e in secondo momento (sempre sul nastro, andando più avanti) c'è un ugello ad aria compressa che con un movimento getta via i pomodori difettosi. ho un'altra alternativa in mente, ma avrei bisogno di una mano per una bozza di codice.
avevo ipotizzato una cosa così, però non sono programmatrice:
% =========================================================================
% Simulazione Cinematica di un Nastro Trasportatore Industriale
% =========================================================================
%% 1. Parametri del Nastro
lunghezza_nastro = 10; % Lunghezza in metri
velocita_nastro = 0.8; % Velocità (m/s)
dt = 0.05; % Passo temporale della simulazione (s)
tempo_totale = 15; % Durata totale simulazione (s)
% Posizioni delle stazioni
pos_telecamera = 4; % Posizione della telecamera
pos_ugello = 7; % Posizione dell'ugello di scarto pneumatico
%% 2. Generazione Oggetti (Pomodori)
num_pomodori = 8;
% Generiamo posizioni iniziali negative (prima che entrino sul nastro)
posizioni = linspace(-1, -8, num_pomodori);
% Assegnazione casuale difetti: 0 = Buono (Rosso), 1 = Marcio (Verde)
difettosi = randi([0, 1], 1, num_pomodori);
stati = zeros(1, num_pomodori); % 0 = in transito, 1 = scartato, 2 = fine nastro
%% 3. Setup Finestra Grafica (Animazione)
figure('Name', 'Simulazione Nastro Cernita Pomodori', 'NumberTitle', 'off');
axis([-2, lunghezza_nastro + 2, -2, 3]);
hold on; grid on;
% Disegno degli elementi statici dell'impianto
plot([0, lunghezza_nastro], [0, 0], 'k-', 'LineWidth', 6); % Nastro
plot(0, 0, 'ko', 'MarkerSize', 12, 'MarkerFaceColor', 'k'); % Rullo Iniziale
plot(lunghezza_nastro, 0, 'ko', 'MarkerSize', 12, 'MarkerFaceColor', 'k'); % Rullo Finale
% Sensori e Attuatori
plot(pos_telecamera, 1, 'bv', 'MarkerSize', 12, 'MarkerFaceColor', 'b'); % Telecamera
plot(pos_ugello, -0.5, 'r^', 'MarkerSize', 12, 'MarkerFaceColor', 'r'); % Ugello aria
% Inizializzazione grafica dei pomodori
% Uso rosso per i buoni e verde per i marci
colori = repmat([1 0 0], num_pomodori, 1); % Default Rosso
colori(difettosi == 1, :) = repmat([0 1 0], sum(difettosi), 1); % Verde se marcio
h_pomodori = scatter(posizioni, ones(1, num_pomodori)*0.3, 150, colori, 'filled', 'MarkerEdgeColor', 'k');
%% 4. Loop di Simulazione (Tempo Reale)
disp('Avvio del nastro trasportatore...');
for t = 0:dt:tempo_totale
% Calcolo della nuova posizione per ogni pomodoro
for i = 1:num_pomodori
if stati(i) == 0 % Se è sul nastro
posizioni(i) = posizioni(i) + velocita_nastro * dt;
end
% Logica dell'impianto
% A. Identificazione alla telecamera
if posizioni(i) >= pos_telecamera && posizioni(i) < pos_telecamera + (velocita_nastro*dt)
if difettosi(i) == 1
disp(['T = ', num2str(t,'%.2f'), 's | Telecamera: Rilevato pomodoro MARCIO (ID: ', num2str(i), ')']);
else
disp(['T = ', num2str(t,'%.2f'), 's | Telecamera: Pomodoro OK (ID: ', num2str(i), ')']);
end
end
% B. Scarto all'ugello pneumatico
if posizioni(i) >= pos_ugello && stati(i) == 0
if difettosi(i) == 1
stati(i) = 1; % Marca come scartato
disp(['---> SOFFIO ARIA! Pomodoro ', num2str(i), ' espulso dal nastro.']);
end
end
% C. Uscita fine linea
if posizioni(i) >= lunghezza_nastro && stati(i) == 0
stati(i) = 2; % Arrivato a destinazione
end
end
% Aggiornamento Grafica in tempo reale
y_pos = ones(1, num_pomodori) * 0.3; % Altezza nastro
y_pos(stati == 1) = -1.5; % Altezza cesto di scarto (cadono giù)
% Aggiorna le posizioni nel grafico (h_pomodori)
set(h_pomodori, 'XData', posizioni, 'YData', y_pos);
title(sprintf('Simulazione Impianto | Tempo trascorso: %.2f sec', t));
drawnow; % Forza l'aggiornamento della grafica
% Controlla se l'utente ha chiuso la finestra
if ~ishghandle(h_pomodori), break; end
end
disp('Simulazione completata.');