%
%  Kontakt zu Arduino mit Basic-Befehlen
%    vorher den Sketch laden: ./ArduinoIO/pde/adioes/adioes.pde   
%
function a = startArduino()

   % COM-Port für das Arduino-Board angeben, z.B. COM3, COM4, ... 
   %   siehe Systemsteuerung / Hardware und Sound / Geräte und Drucker 
   comPort='DEMO'; 
   comPort='COM6';   % mögliche Ports 
   comPort='COM4';   % 
   
   % noch keine serielle Schnittstelle angemeldet 
   instrSer = instrfind( 'Type', 'serial' ) 
   
   % Seriellen Port erzeugen 
   a.aser = serial( comPort, 'BaudRate', 115200 );
   
   % serielle Schnittstellen anzeigen 
   instrSer = instrfind( 'Type', 'serial' ) 
    %    Serial Port Object : Serial-DEMO
    %    Communication Settings 
    %       Port:               DEMO
    %       BaudRate:           115200
    %       Terminator:         'LF'
    %    Communication State 
    %       Status:             closed
    %       RecordStatus:       off
    %    Read/Write State  
    %       TransferStatus:     idle
    %       BytesAvailable:     0
    %       ValuesReceived:     0
    %       ValuesSent:         0
   
   % weitere mögliche Abfragen: 
   instrfind({'Port'},{comPort})
   get( a.aser,{'Type','Name','Port'})  
   % ans =  'serial'    'Serial-COM6'    'COM6'
   isSerial = isa(a.aser,'serial') 
   isValid  = isvalid(a.aser)
   aStatus  = get(a.aser,'Status')
   % aStatus = closed
   aPort =get(a.aser,'Port') 
   
   
   %
   %  Port öffnen  
   %
   fopen( a.aser );
        
   instrSeriell = instrfind( 'Type', 'serial' )
   %    Communication State 
   %       Status:             open
      
   % it takes several seconds before any operation could be attempted
   fprintf(1,'Attempting connection .');
   for i=1:12,
     pause(1);
     fprintf(1,'.');
   end
   fprintf(1,'\n');
   
   % flush serial buffer before sending anything 
   %    reads all the bytes available (if any) 
   %    in the computer's serial port buffer, 
   %    therefore clearing said buffer.
   val=-1;
   if( a.aser.BytesAvailable > 0 )
     val = fread( a.aser, a.aser.BytesAvailable );
   end   
    
%    
%  Analog and Digital Input and Output Server for MATLAB  
% 
%  commands:
%    
%    0e0 : assigns digital pin #4 (e) as input
%    0f1 : assigns digital pin #5 (f) as output
%    0n1 : assigns digital pin #13 (n) as output   
%    
%    1c  : reads digital pin #2 (c) 
%    1e  : reads digital pin #4 (e) 
%
%    2n0 : sets digital pin #13 (n) low
%    2n1 : sets digital pin #13 (n) high
%    2f1 : sets digital pin #5 (f) high
%    2f0 : sets digital pin #5 (f) low 
%
%    4j2 : sets digital pin #9 (j) to  50=ascii(2) over 255
%    4jz : sets digital pin #9 (j) to 122=ascii(z) over 255
% 
%    3a  : reads analog pin #0 (a) 
%    3f  : reads analog pin #5 (f) 
% 
%    R0    : sets analog reference to DEFAULT
%    R1    : sets analog reference to INTERNAL
%    R2    : sets analog reference to EXTERNAL
%   
%    X3    : roundtrip example case returning the input (ascii(3)) 
%    99    : returns script type (0 adio.pde ... 3 motor.pde )    
%    
   % Befehl '0x1': x = 97 + pin    
   % '0n1' : assigns digital pin #13 ('n') as output  
   %   int32('n') = 110 = 97 + 13  ('a' = 97 = 97 + 0: Pin 0)
   % val = 49 = '1': 'output'  |  val = 48 = '0': 'input' 
   

   % Befehl '99':  
   %   query sketch type: char( [57 57] ) = '99' 
   fwrite( a.aser, [57 57], 'uchar' );
   a.sktc = fscanf( a.aser, '%d' ) 
   
   
   % 48: Pin 13 als Output definieren: 
   %   Befehl '0n1' = char( [48 97+13 49] ) 
   pin = 13; 
   val=1;       % 'output' => 48 + val = '1' 
   fwrite( a.aser, [48 97+pin 48+val], 'uchar' );
   
   
   % 50: digitalWrite, Pin 13 auf HIGH (Strom durch LED)
   %   Befehl '2n1' = char( [50 97+13 49] ) 
   dv = 1;
   fwrite( a.aser, [50 97+pin 48+dv], 'uchar' );   
   
   % Pin 13 auf LOW (LED ausschalten)
   %   Befehl '2n0' = char( [50 97+13 48] ) 
   fwrite( a.aser, [50 97+pin 48+0], 'uchar' );   
   
   
   % 49: digitalRead, Status von Pin 13 auslesen 
   %   Befehl '1n' = [49 97+pin]: reads digital pin #13 (n) 
   fwrite( a.aser, [49 97+pin], 'uchar' );   
   % get value: val =  0
   val = fscanf( a.aser, '%d ')
   
   
   % 51: analogRead, Status von Analog-Pin 0 auslesen 
   %    '3a' =  [51 97+aPin]: reads analog pin #0 (a) 
   aPin = 0;
   fwrite( a.aser, [51 97+aPin], 'uchar' );   
   val = fscanf( a.aser, '%d ')  
   
   % Befehl 48: Pin 9 ('j') als Output ('1') definieren: 
   %   Befehl '0j1' = char( [48 97+9 49] )  
   fwrite( a.aser, [48 97+9 48+1], 'uchar' );
   
   % 52: Befehl 52: Digital Pin 9 setzen, Werte zwischen 0 und 255
   %   Befehl '4jz' = [52 97+9 122]: 122 = ascii(z)   
   fwrite( a.aser, [52 97+9 122], 'uchar' );   

   % Befehl 52: Digital Pin 9 auf 255 setzen: [52 97+9 255]: 
   fwrite( a.aser, [52 97+9 255], 'uchar' ); 

   
   % Beenden 
   if isobject( a.aser ),
      fclose( a.aser )
      delete( a.aser );
   end
    