Läst RPM från Arduino-baserad IR-varvräknare med MATLAB GUI (2 / 3 steg)
Steg 2: Skriva koden
ARDUINO KOD
Koden för arduino är i princip samma som du hittar här: men eftersom här jag bara vill visa rpm värde (rps värdet och all "rps" och "rpm" text) så jag redigerade några rader (de som har Serial.print(), eftersom tidigare programmet var utformat för att presentera behandlingen på notepad-stil seriell övervaka men nu behöver vi bara rpm värde för att mata till statisk textsträng). OK, för att göra det snabbt och enkelt jag kopiera koden kan här, du kontrollera av dig själv för jämförelse med tidigare kod. Kom ihåg att det huvudsakliga syftet med arduino koden är bara att skickar ett värde till seriell comm, så att detta program är bara som ett exempel, om du har ett eget program som skriver ut värdet på någon sensor läsa att seriell sedan ignorera detta gå vidare till MATLAB-kod.
int sensorvalue; < br > int state1 = hög;
int state2;
float rps;
float varvtal.
lång prevMillis = 0;
långa intervall = 100;
långa currentTime;
lång prevTime = 1;
lång diffTime;
int sensorthreshold = 30. Detta värde anger gräns mellan mörka och ljusa,
Det måste provas som kan komma att ändras enligt på den
avståndet lysdioderna placeras.
för att se vilket nummer är bra, kolla sensorvalue variabelvärdet
som skrivs ut i den seriella monitorn < /p >< p > void setup()
{
Serial.BEGIN(9600);
pinMode(13,OUTPUT); tilldela stift 13 ledde som indikator eftersom vi inte kan se IR-ljus
}
void loop()
{
sensorvalue = analogRead(0); läsa från stift 0
IF(sensorvalue < sensorthreshold)
state1 = hög;
annat
state1 = låg;
digitalWrite(13,state1); som iR är ljus osynligt för oss, det ledde på stiftet 13
Ange status för kretsen.
IF(state2!=state1) {//counts när staten ändrar, som är från (mörk till ljus) eller
från (ljus till mörk), kom ihåg att IR-ljus är osynligt för oss.
om (state2 > state1) {
currentTime = micros(); Får arduino tid i mikrosekunder
diffTime = currentTime - prevTime; beräkna skillnaden från den senaste sensorer möta upp
RPS = 1000000/diffTime; beräkna hur många rev per sekund - bra att veta
RPM = 60000000/diffTime; beräkna hur många rev per minut
osignerade långa currentMillis = millis();
skriva ut till serial varje intervall - definieras vid variabler deklaration
om (currentMillis - prevMillis > intervall) {/ / se om nu redan ett intervall lång
prevMillis = currentMillis;
Serial.println(rpm); denna linje är redigerad från koden i föregående instructable
}
prevTime = currentTime;
}
state2 = state1;
}
/ * bara för test för att bestämma sensorthreshold
Delay(500);
Serial.println(sensorvalue);
*/
}
MATLAB-KOD
I din MATLAB GUI fönstret layout design, klicka på Visa - Editor (eller hitta en bild på papper och penna utan hand i verktygsfältet). En redaktör fönster öppnas med några kodifierar skriftligt redan, skrev MATLAB dem för dig utan problem. Bara skriva callback-funktionen för knappen, resten av koden kan lämnas orörd. I mitt fall döpte jag min växlingsknapp OnOffToggle, så den funktionen som jag skrev koden är funktionen OnOffToggle_Callback (hObject, eventdata, handtag).
Alla data som skickas via seriella hämtas här som en variabel rpmdata, så vi vill bara skriva ut det rpm data på skärmen, det är det. En sak till, kontrollera att du ansluter din arduino till rätt COM-port som du skriver i koden. I den här koden skrev jag COM3 eftersom jag anslutit min arduino till COM3.
Spara sedan din m-fil.
Nedan följer den fullständiga koden (Redigera bara funktionen OnOffToggle_Callback):
fungera varargout = gui(varargin)
% GUI MATLAB-kod för gui.fig
% GUI, av sig själv, skapar en ny GUI eller höjer de befintliga
% singleton *.
%
% H = GUI Returnerar referensen till en ny GUI eller handtaget för att
% den befintliga singleton *.
%
% GUI('CALLBACK',hObject,eventData,handles,...) kallar lokalen
% funktion som heter MOTRINGNING i GUI. M med viss indataargumenten.
%
% GUI('Property','Value',...) skapar en ny GUI eller höjer den
% befintliga singleton *. Start från vänster, är egenskapen värdepar
% tillämpas på GUI innan gui_OpeningFcn anropas. En
% okänd egenskapsnamn eller ogiltigt värde gör property ansökan
% stop. Alla ingångar överförs till gui_OpeningFcn via varargin.
%
% * Se GUI alternativ på GUIDENS Verktyg-menyn. Välj "GUI kan endast en
%-instansen ska köras (singleton) ".
%
% Se även: GUIDE, GUIDATA, GUIHANDLES
% Redigera texten ovan att ändra svaret för att hjälpa gui
% Senast ändrad av GUIDE v2.5 14-Mar-2015 01:06:09 < /p >< p > % börja initieringskod - redigera inte
gui_Singleton = 1;
gui_State = struct ('gui_Name', mfilename,...
'gui_Singleton', gui_Singleton...
'gui_OpeningFcn'...
'gui_OutputFcn'...
"gui_LayoutFcn", []...
"gui_Callback", []);
om nargin & & ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
slutet
om nargout
[varargout {1:nargout}] = gui_mainfcn (gui_State, varargin {:});
annat
gui_mainfcn (gui_State, varargin {:});
slutet
% Slutet initieringskod - inte redigera
%---Kör precis innan gui görs synliga.
funktion gui_OpeningFcn (hObject, eventdata, handtag, varargin)
% Denna funktion har ingen utgång args, se OutputFcn.
% hObject handtag till figur
% eventdata reserverade - definieras i en framtida version av MATLAB
% hanterar struktur med handtag och användardata (se GUIDATA)
% varargin befalla lina argumentera till gui (se VARARGIN)
% Väljer standard kommandoraden utdata för gui
handles.output = hObject;
% Uppdateringen hanterar struktur
guidata (hObject, handtag);
% UIWAIT gör gui vänta på användarsvar (se UIRESUME)
% uiwait(handles.figure1);
%---Utgångar från denna funktion returneras till kommandoraden.
fungera varargout = gui_OutputFcn (hObject, eventdata, handtag)
% varargout cell array för att returnera utdataargument (se VARARGOUT);
% hObject handtag till figur
% eventdata reserverade - definieras i en framtida version av MATLAB
% hanterar struktur med handtag och användardata (se GUIDATA)
% Få standard kommandoraden utdata från handtag struktur
varargout {1} = handles.output;
funktion currentEdit_Callback (hObject, eventdata, handtag)
funktion currentEdit_CreateFcn (hObject, eventdata, handtag)
% Ledtråd: redigeringskontroller har oftast en vit bakgrund på Windows.
% Se ISPC och dator.
om ispc & & isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
slutet
funktion OnOffToggle_Callback (hObject, eventdata, handtag)
button_state = get(hObject,'Value');
om button_state == get(hObject,'Max')
uppsättning (handtag. OnOffToggle, 'Sträng', 'Sluta');
drawnow;
Jag = 2;
medan jag > 1
rpmdata = serial('COM3','BaudRate',9600); % denna baudhastighet bör vara samma som det i Arduino kodifierar
fclose(instrfindall);
fopen(rpmdata);
b = fscanf(rpmdata);
set(handles.textCurrent,'String',b);
drawnow;
Delete(rpmdata)
om get(hObject,'Value') == get(hObject,'Min')
Break
slutet
slutet
uppsättning (handtag. OnOffToggle, 'Sträng', 'Start');
drawnow;
rpmdata = serial('COM3','BaudRate',9600);
fclose(rpmdata);
slutet