annuncio

Comprimi
Ancora nessun annuncio.

KaptainKuk controller board! eccola!

Comprimi
X
  • Filtro
  • Ora
  • Visualizza
Elimina tutto
nuovi messaggi

  • Tanto per comincare sembra che la batteria stabilizzi un bel pò i valori.
    per ora uso 50000 valori per trovare la media, poi lavoro su 1 valore, pensavo di provare la media di 10 o 20 valori.
    Comunque dal sito l'atmega impiega circa 100uS per un'analogread, abbassabili a 50 con perdita di precisione (settando il prescaler).
    ora sto cercando di limitare l'errore, per ora eliminando i valori che differiscono meno di 1,5 dalla media ottengo un'ottima lettura a gyro fermo (vel. angolare == 0), però non vede per rotazioni molto lente.
    il codice attuale, si può notare che ho anche cercato di moltiplicare il tempo per la velocità angolare (come fisica insegna), ma forse anche per il tempo dovrei usare una media (però deve essere calcolata nel loop, altrimenti sarà irreale, dunque i primi valori avranno privi di questo controllo). ma bando alle chiacchere:
    codice:
    void setup() {
      analogReference(EXTERNAL);
      Serial.begin(57600);
      Serial.println("Pronto!");
      calibrazione();
    }
    
    int sensorPin = 0; //pin analogico da cui leggere il dato
    int sensorValue;
    long valueReaded=0;
    float media;
    long CALIBRATIONDELAY = 50000;
    
    unsigned long time;
    
    
    void   calibrazione(){
      long sommaMedia=0;
      long i;
      for (i=0;i<CALIBRATIONDELAY;i++){
    
        sensorValue = analogRead(sensorPin);
        valueReaded++;
        sommaMedia += sensorValue;
        
        //Serial.print("Ultima lettura:");
        //  Serial.println(sensorValue);
    
      }
    
      media = (float)sommaMedia/(float)valueReaded;
      //digitalWrite(13, LOW);
      valueReaded=0;
    
      Serial.print("Mid:");
      Serial.println(media, 10);
      Serial.print("Last value:");
      Serial.println(sensorValue, 10);
      time = micros();
    }
    
    float tempDiff, diff=0;
    
    long mediaControllo=0;
    
    long error=0;
    unsigned long oldTime;
    
    void loop() {
      sensorValue = analogRead(sensorPin);
      valueReaded++;
    
      tempDiff= ((float)sensorValue)-media;
    
      if ( abs(tempDiff)<1.5 ){
        tempDiff=0;
        //Serial.println("Zero");
      }else{
      //  Serial.print("Angular rotation:");
      //  Serial.println(tempDiff);
        //Serial.print("Error read: ");
        //Serial.println(sensorValue);
        error++;
      }
      
      oldTime=time;
      time = micros();
      diff+= tempDiff;//*(time-oldTime);
      
      
      mediaControllo += sensorValue;
      
      if (valueReaded % 1000==0){      
    //    Serial.print("Absolute angle: ");
        Serial.println(diff, 10);
        
        Serial.print("Last read: ");
        Serial.println(sensorValue);
    
        Serial.print("Last timediff: ");
        Serial.println((time-oldTime));
        
        Serial.print("Errors on 1000 read: ");
        Serial.println(error);
        error=0;
        
        Serial.print("mid: ");
        Serial.println(media, 10);
        
        if (valueReaded >= CALIBRATIONDELAY){
          float tempMedia = (float)mediaControllo/(float)(valueReaded);
        
          Serial.print("mid on last ");
          Serial.print(valueReaded);
          Serial.print(" read: ");
          Serial.println(tempMedia, 10);
          mediaControllo=0;
          valueReaded=0;
          //if (abs(media-tempMedia)<0.2 || abs(tempMedia-media)<0.2)
            //media = tempMedia;
        }
      }
    
    }
    piccola cosa divertente: settate l'errore a 0.5, e divertitevi ad avvicinare un dito al gyro senza toccarlo: vedrete i valori errati salire di botto.
    già che ci sono vi posto pure la controparte java che legge l'angolo assoluto e disegna un simpatico orizzonte artificiale, necessita un'immagine esterna di supporto di nome "giro.png"

    Se volete fare a gara tra il mio codice e il gyro senza modifiche, è semplice: collegate il gyro alla ricevente, sia il bianco-rosso-nero che il giallo.
    poi inserite nel bianco che va al servo un cavo che finirà in un pin digitale dell'arduino. settate il canale sul giallo fichè non si accende la luce fissa (AVC mode) a questo punto basta un pulsein() per ottenere un valore, che diviso per 4000, nel mio caso, dà l'angolo in radianti necessario alla funzione calcola() (l'ultima in basso, in pratica orizon=-numero/40000; diventa orizon=-numero/4000;)
    ATTENZIONE: alimentare l'arduino e la ricevente con lo stesso Voltaggio
    codice:
    import gnu.io.CommPort;
    import gnu.io.CommPortIdentifier;
    import gnu.io.SerialPort;
    
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.image.BufferedImage;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Enumeration;
    
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    
    
    public class test_stringa extends JFrame{
    	
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	double orizon =0;
    	Image image; //contains the image to modify
    	Graphics2D g2d; //used to modify the image
    	JTextField orizonText;
    	
    	public static void main ( String[] args )
        {
        	boolean portFound = false;
        	String defaultPort;
        	
        	// determine the name of the serial port on several operating systems
        	String osname = System.getProperty("os.name","").toLowerCase();
        	if ( osname.startsWith("windows") ) {
        	   // windows
        	   defaultPort = "COM1";
        	} else if (osname.startsWith("linux")) {
        	   // linux
        	  defaultPort = "/dev/ttyUSB0";
        	} else if ( osname.startsWith("mac") ) {
        	   // mac
        	   defaultPort = "????";
        	} else {
        	   System.out.println("Sorry, your operating system is not supported");
        	   return;
        	}
        	
        	if (args.length > 0) {
        		defaultPort = args[0];
        	}
        	
        	System.out.println("Set default port to "+defaultPort);
        	
        	Enumeration<?> portList = CommPortIdentifier.getPortIdentifiers();
        	CommPortIdentifier portId;
        	while (portList.hasMoreElements()) {
        		portId = (CommPortIdentifier) portList.nextElement();
        		if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        			System.out.println("Serial found port: "+defaultPort);
        			if (portId.getName().equals(defaultPort)) {
        				System.out.println("Found port: "+defaultPort);
        				portFound = true;
        			}
        		}
        	}
        	
        	if (!portFound) {
        	   System.out.println("port " + defaultPort + " not found.");
        	   System.exit(0);
        	}
        	
        	
            try{
                (new test_stringa()).connect(defaultPort);
            }
            catch ( Exception e )
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    	
    	void connect ( String portName ) throws Exception
        {
    		orizonText =new JTextField("orizzonte"); 
    		
    		
    		image = Toolkit.getDefaultToolkit().getImage("./giro.png");
    		BufferedImage bim = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB);
    		g2d = (Graphics2D)(bim.createGraphics());
    		ImageIcon orizzonteIMG = new ImageIcon(bim);
    		
    		JLabel gyro = new JLabel("Gyroscope Only",orizzonteIMG,JLabel.CENTER);
    		add(gyro);
    		//add(orizonText);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(200,200);
    		setVisible(true);
    		System.out.println("do you see frame?");
    		
            CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
            if ( portIdentifier.isCurrentlyOwned() )
            {
                System.out.println("Error: Port is currently in use");
            }
            else
            {
                CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
                
                if ( commPort instanceof SerialPort )
                {
                    SerialPort serialPort = (SerialPort) commPort;
                    serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
                    
                    InputStream in = serialPort.getInputStream();
                    //OutputStream out = serialPort.getOutputStream();
                    
                    leggi(in);
    
                }
                else
                {
                    System.out.println("Error: Only serial ports are handled by this example.");
                }
            }     
        }
    	
    	private double MEDIA = 0;
    	private double diff = 0;
    	
    	private void leggi(InputStream in) {
    		boolean finito=false;
    		double input = 0;
    		long readCount = 0;
    		int calibrateCount = 0;
    		int delay = 200;
    		
    		while (!finito){
    			
    			 BufferedReader bufferedReader
    			   = new BufferedReader(new InputStreamReader(in));
    			
    			try {
    				while(bufferedReader.ready()){
    					String inputstring = bufferedReader.readLine();
    					input = 0;
    					
    					if(!inputstring.isEmpty()){
    						
    						try{
    						input = Double.parseDouble(inputstring);
    						System.out.println("Input: "+input);
    						calcola(input);						
    						}catch (Exception e){
    							System.out.println("Input: "+inputstring);
    						}
    						
    					}
    					
    					
    					
    				}
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}		
    			
    			
    		}
    		
    		
    	}	
    	
    	private void calcola(double numero) {
    		//numero-=1370;
    		orizon=-numero/40000;
    		g2d.rotate(orizon,50,50);
    		g2d.drawImage(image,0,0,100,100,null);
    		repaint();
    		g2d.rotate(-orizon,50,50);		
    	}
    
    }
    la banda del buco ringrazia per la gentile attenzione

    Commenta


    • Originariamente inviato da elettro Visualizza il messaggio
      Tanto per comincare sembra che la batteria stabilizzi un bel pò i valori.
      per ora uso 50000 valori per trovare la media, poi lavoro su 1 valore, pensavo di provare la media di 10 o 20 valori.
      Comunque dal sito l'atmega impiega circa 100uS per un'analogread, abbassabili a 50 con perdita di precisione (settando il prescaler).
      ora sto cercando di limitare l'errore, per ora eliminando i valori che differiscono meno di 1,5 dalla media ottengo un'ottima lettura a gyro fermo (vel. angolare == 0), però non vede per rotazioni molto lente.
      il codice attuale, si può notare che ho anche cercato di moltiplicare il tempo per la velocità angolare (come fisica insegna), ma forse anche per il tempo dovrei usare una media (però deve essere calcolata nel loop, altrimenti sarà irreale, dunque i primi valori avranno privi di questo controllo). ma bando alle chiacchere:
      codice:
      void setup() {
        analogReference(EXTERNAL);
        Serial.begin(57600);
        Serial.println("Pronto!");
        calibrazione();
      }
      
      int sensorPin = 0; //pin analogico da cui leggere il dato
      int sensorValue;
      long valueReaded=0;
      float media;
      long CALIBRATIONDELAY = 50000;
      
      unsigned long time;
      
      
      void   calibrazione(){
        long sommaMedia=0;
        long i;
        for (i=0;i<CALIBRATIONDELAY;i++){
      
          sensorValue = analogRead(sensorPin);
          valueReaded++;
          sommaMedia += sensorValue;
          
          //Serial.print("Ultima lettura:");
          //  Serial.println(sensorValue);
      
        }
      
        media = (float)sommaMedia/(float)valueReaded;
        //digitalWrite(13, LOW);
        valueReaded=0;
      
        Serial.print("Mid:");
        Serial.println(media, 10);
        Serial.print("Last value:");
        Serial.println(sensorValue, 10);
        time = micros();
      }
      
      float tempDiff, diff=0;
      
      long mediaControllo=0;
      
      long error=0;
      unsigned long oldTime;
      
      void loop() {
        sensorValue = analogRead(sensorPin);
        valueReaded++;
      
        tempDiff= ((float)sensorValue)-media;
      
        if ( abs(tempDiff)<1.5 ){
          tempDiff=0;
          //Serial.println("Zero");
        }else{
        //  Serial.print("Angular rotation:");
        //  Serial.println(tempDiff);
          //Serial.print("Error read: ");
          //Serial.println(sensorValue);
          error++;
        }
        
        oldTime=time;
        time = micros();
        diff+= tempDiff;//*(time-oldTime);
        
        
        mediaControllo += sensorValue;
        
        if (valueReaded % 1000==0){      
      //    Serial.print("Absolute angle: ");
          Serial.println(diff, 10);
          
          Serial.print("Last read: ");
          Serial.println(sensorValue);
      
          Serial.print("Last timediff: ");
          Serial.println((time-oldTime));
          
          Serial.print("Errors on 1000 read: ");
          Serial.println(error);
          error=0;
          
          Serial.print("mid: ");
          Serial.println(media, 10);
          
          if (valueReaded >= CALIBRATIONDELAY){
            float tempMedia = (float)mediaControllo/(float)(valueReaded);
          
            Serial.print("mid on last ");
            Serial.print(valueReaded);
            Serial.print(" read: ");
            Serial.println(tempMedia, 10);
            mediaControllo=0;
            valueReaded=0;
            //if (abs(media-tempMedia)<0.2 || abs(tempMedia-media)<0.2)
              //media = tempMedia;
          }
        }
      
      }
      piccola cosa divertente: settate l'errore a 0.5, e divertitevi ad avvicinare un dito al gyro senza toccarlo: vedrete i valori errati salire di botto.
      già che ci sono vi posto pure la controparte java che legge l'angolo assoluto e disegna un simpatico orizzonte artificiale, necessita un'immagine esterna di supporto di nome "giro.png"

      Se volete fare a gara tra il mio codice e il gyro senza modifiche, è semplice: collegate il gyro alla ricevente, sia il bianco-rosso-nero che il giallo.
      poi inserite nel bianco che va al servo un cavo che finirà in un pin digitale dell'arduino. settate il canale sul giallo fichè non si accende la luce fissa (AVC mode) a questo punto basta un pulsein() per ottenere un valore, che diviso per 4000, nel mio caso, dà l'angolo in radianti necessario alla funzione calcola() (l'ultima in basso, in pratica orizon=-numero/40000; diventa orizon=-numero/4000;)
      ATTENZIONE: alimentare l'arduino e la ricevente con lo stesso Voltaggio
      codice:
      import gnu.io.CommPort;
      import gnu.io.CommPortIdentifier;
      import gnu.io.SerialPort;
      
      import java.awt.Graphics2D;
      import java.awt.Image;
      import java.awt.Toolkit;
      import java.awt.image.BufferedImage;
      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.util.Enumeration;
      
      import javax.swing.ImageIcon;
      import javax.swing.JFrame;
      import javax.swing.JLabel;
      import javax.swing.JTextField;
      
      
      public class test_stringa extends JFrame{
      	
      	/**
      	 * 
      	 */
      	private static final long serialVersionUID = 1L;
      	double orizon =0;
      	Image image; //contains the image to modify
      	Graphics2D g2d; //used to modify the image
      	JTextField orizonText;
      	
      	public static void main ( String[] args )
          {
          	boolean portFound = false;
          	String defaultPort;
          	
          	// determine the name of the serial port on several operating systems
          	String osname = System.getProperty("os.name","").toLowerCase();
          	if ( osname.startsWith("windows") ) {
          	   // windows
          	   defaultPort = "COM1";
          	} else if (osname.startsWith("linux")) {
          	   // linux
          	  defaultPort = "/dev/ttyUSB0";
          	} else if ( osname.startsWith("mac") ) {
          	   // mac
          	   defaultPort = "????";
          	} else {
          	   System.out.println("Sorry, your operating system is not supported");
          	   return;
          	}
          	
          	if (args.length > 0) {
          		defaultPort = args[0];
          	}
          	
          	System.out.println("Set default port to "+defaultPort);
          	
          	Enumeration<?> portList = CommPortIdentifier.getPortIdentifiers();
          	CommPortIdentifier portId;
          	while (portList.hasMoreElements()) {
          		portId = (CommPortIdentifier) portList.nextElement();
          		if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
          			System.out.println("Serial found port: "+defaultPort);
          			if (portId.getName().equals(defaultPort)) {
          				System.out.println("Found port: "+defaultPort);
          				portFound = true;
          			}
          		}
          	}
          	
          	if (!portFound) {
          	   System.out.println("port " + defaultPort + " not found.");
          	   System.exit(0);
          	}
          	
          	
              try{
                  (new test_stringa()).connect(defaultPort);
              }
              catch ( Exception e )
              {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
          }
      	
      	void connect ( String portName ) throws Exception
          {
      		orizonText =new JTextField("orizzonte"); 
      		
      		
      		image = Toolkit.getDefaultToolkit().getImage("./giro.png");
      		BufferedImage bim = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB);
      		g2d = (Graphics2D)(bim.createGraphics());
      		ImageIcon orizzonteIMG = new ImageIcon(bim);
      		
      		JLabel gyro = new JLabel("Gyroscope Only",orizzonteIMG,JLabel.CENTER);
      		add(gyro);
      		//add(orizonText);
      		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      		setSize(200,200);
      		setVisible(true);
      		System.out.println("do you see frame?");
      		
              CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
              if ( portIdentifier.isCurrentlyOwned() )
              {
                  System.out.println("Error: Port is currently in use");
              }
              else
              {
                  CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
                  
                  if ( commPort instanceof SerialPort )
                  {
                      SerialPort serialPort = (SerialPort) commPort;
                      serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
                      
                      InputStream in = serialPort.getInputStream();
                      //OutputStream out = serialPort.getOutputStream();
                      
                      leggi(in);
      
                  }
                  else
                  {
                      System.out.println("Error: Only serial ports are handled by this example.");
                  }
              }     
          }
      	
      	private double MEDIA = 0;
      	private double diff = 0;
      	
      	private void leggi(InputStream in) {
      		boolean finito=false;
      		double input = 0;
      		long readCount = 0;
      		int calibrateCount = 0;
      		int delay = 200;
      		
      		while (!finito){
      			
      			 BufferedReader bufferedReader
      			   = new BufferedReader(new InputStreamReader(in));
      			
      			try {
      				while(bufferedReader.ready()){
      					String inputstring = bufferedReader.readLine();
      					input = 0;
      					
      					if(!inputstring.isEmpty()){
      						
      						try{
      						input = Double.parseDouble(inputstring);
      						System.out.println("Input: "+input);
      						calcola(input);						
      						}catch (Exception e){
      							System.out.println("Input: "+inputstring);
      						}
      						
      					}
      					
      					
      					
      				}
      			} catch (IOException e) {
      				// TODO Auto-generated catch block
      				e.printStackTrace();
      			}		
      			
      			
      		}
      		
      		
      	}	
      	
      	private void calcola(double numero) {
      		//numero-=1370;
      		orizon=-numero/40000;
      		g2d.rotate(orizon,50,50);
      		g2d.drawImage(image,0,0,100,100,null);
      		repaint();
      		g2d.rotate(-orizon,50,50);		
      	}
      
      }
      la banda del buco ringrazia per la gentile attenzione
      Bravo Elettro ,
      complimenti ben fatto .. domani lo provo ..
      Saluti
      Roberto
      Redfox74
      Virtual Robotix ( Arducopter DEVTEAM )
      http://www.virtualrobotix.com
      Canale di supporto FB
      https://www.facebook.com/groups/1606596929592397/

      Commenta


      • Originariamente inviato da elettro Visualizza il messaggio
        Tanto per comincare sembra che la batteria stabilizzi un bel pò i valori.
        per ora uso 50000 valori per trovare la media, poi lavoro su 1 valore, pensavo di provare la media di 10 o 20 valori.
        Comunque dal sito l'atmega impiega circa 100uS per un'analogread, abbassabili a 50 con perdita di precisione (settando il prescaler).
        ora sto cercando di limitare l'errore, per ora eliminando i valori che differiscono meno di 1,5 dalla media ottengo un'ottima lettura a gyro fermo (vel. angolare == 0), però non vede per rotazioni molto lente.
        il codice attuale, si può notare che ho anche cercato di moltiplicare il tempo per la velocità angolare (come fisica insegna), ma forse anche per il tempo dovrei usare una media (però deve essere calcolata nel loop, altrimenti sarà irreale, dunque i primi valori avranno privi di questo controllo). ma bando alle chiacchere:
        codice:
        void setup() {
          analogReference(EXTERNAL);
          Serial.begin(57600);
          Serial.println("Pronto!");
          calibrazione();
        }
        
        int sensorPin = 0; //pin analogico da cui leggere il dato
        int sensorValue;
        long valueReaded=0;
        float media;
        long CALIBRATIONDELAY = 50000;
        
        unsigned long time;
        
        
        void   calibrazione(){
          long sommaMedia=0;
          long i;
          for (i=0;i<CALIBRATIONDELAY;i++){
        
            sensorValue = analogRead(sensorPin);
            valueReaded++;
            sommaMedia += sensorValue;
            
            //Serial.print("Ultima lettura:");
            //  Serial.println(sensorValue);
        
          }
        
          media = (float)sommaMedia/(float)valueReaded;
          //digitalWrite(13, LOW);
          valueReaded=0;
        
          Serial.print("Mid:");
          Serial.println(media, 10);
          Serial.print("Last value:");
          Serial.println(sensorValue, 10);
          time = micros();
        }
        
        float tempDiff, diff=0;
        
        long mediaControllo=0;
        
        long error=0;
        unsigned long oldTime;
        
        void loop() {
          sensorValue = analogRead(sensorPin);
          valueReaded++;
        
          tempDiff= ((float)sensorValue)-media;
        
          if ( abs(tempDiff)<1.5 ){
            tempDiff=0;
            //Serial.println("Zero");
          }else{
          //  Serial.print("Angular rotation:");
          //  Serial.println(tempDiff);
            //Serial.print("Error read: ");
            //Serial.println(sensorValue);
            error++;
          }
          
          oldTime=time;
          time = micros();
          diff+= tempDiff;//*(time-oldTime);
          
          
          mediaControllo += sensorValue;
          
          if (valueReaded % 1000==0){      
        //    Serial.print("Absolute angle: ");
            Serial.println(diff, 10);
            
            Serial.print("Last read: ");
            Serial.println(sensorValue);
        
            Serial.print("Last timediff: ");
            Serial.println((time-oldTime));
            
            Serial.print("Errors on 1000 read: ");
            Serial.println(error);
            error=0;
            
            Serial.print("mid: ");
            Serial.println(media, 10);
            
            if (valueReaded >= CALIBRATIONDELAY){
              float tempMedia = (float)mediaControllo/(float)(valueReaded);
            
              Serial.print("mid on last ");
              Serial.print(valueReaded);
              Serial.print(" read: ");
              Serial.println(tempMedia, 10);
              mediaControllo=0;
              valueReaded=0;
              //if (abs(media-tempMedia)<0.2 || abs(tempMedia-media)<0.2)
                //media = tempMedia;
            }
          }
        
        }
        piccola cosa divertente: settate l'errore a 0.5, e divertitevi ad avvicinare un dito al gyro senza toccarlo: vedrete i valori errati salire di botto.
        già che ci sono vi posto pure la controparte java che legge l'angolo assoluto e disegna un simpatico orizzonte artificiale, necessita un'immagine esterna di supporto di nome "giro.png"

        Se volete fare a gara tra il mio codice e il gyro senza modifiche, è semplice: collegate il gyro alla ricevente, sia il bianco-rosso-nero che il giallo.
        poi inserite nel bianco che va al servo un cavo che finirà in un pin digitale dell'arduino. settate il canale sul giallo fichè non si accende la luce fissa (AVC mode) a questo punto basta un pulsein() per ottenere un valore, che diviso per 4000, nel mio caso, dà l'angolo in radianti necessario alla funzione calcola() (l'ultima in basso, in pratica orizon=-numero/40000; diventa orizon=-numero/4000;)
        ATTENZIONE: alimentare l'arduino e la ricevente con lo stesso Voltaggio
        codice:
        import gnu.io.CommPort;
        import gnu.io.CommPortIdentifier;
        import gnu.io.SerialPort;
        
        import java.awt.Graphics2D;
        import java.awt.Image;
        import java.awt.Toolkit;
        import java.awt.image.BufferedImage;
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.util.Enumeration;
        
        import javax.swing.ImageIcon;
        import javax.swing.JFrame;
        import javax.swing.JLabel;
        import javax.swing.JTextField;
        
        
        public class test_stringa extends JFrame{
        	
        	/**
        	 * 
        	 */
        	private static final long serialVersionUID = 1L;
        	double orizon =0;
        	Image image; //contains the image to modify
        	Graphics2D g2d; //used to modify the image
        	JTextField orizonText;
        	
        	public static void main ( String[] args )
            {
            	boolean portFound = false;
            	String defaultPort;
            	
            	// determine the name of the serial port on several operating systems
            	String osname = System.getProperty("os.name","").toLowerCase();
            	if ( osname.startsWith("windows") ) {
            	   // windows
            	   defaultPort = "COM1";
            	} else if (osname.startsWith("linux")) {
            	   // linux
            	  defaultPort = "/dev/ttyUSB0";
            	} else if ( osname.startsWith("mac") ) {
            	   // mac
            	   defaultPort = "????";
            	} else {
            	   System.out.println("Sorry, your operating system is not supported");
            	   return;
            	}
            	
            	if (args.length > 0) {
            		defaultPort = args[0];
            	}
            	
            	System.out.println("Set default port to "+defaultPort);
            	
            	Enumeration<?> portList = CommPortIdentifier.getPortIdentifiers();
            	CommPortIdentifier portId;
            	while (portList.hasMoreElements()) {
            		portId = (CommPortIdentifier) portList.nextElement();
            		if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
            			System.out.println("Serial found port: "+defaultPort);
            			if (portId.getName().equals(defaultPort)) {
            				System.out.println("Found port: "+defaultPort);
            				portFound = true;
            			}
            		}
            	}
            	
            	if (!portFound) {
            	   System.out.println("port " + defaultPort + " not found.");
            	   System.exit(0);
            	}
            	
            	
                try{
                    (new test_stringa()).connect(defaultPort);
                }
                catch ( Exception e )
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        	
        	void connect ( String portName ) throws Exception
            {
        		orizonText =new JTextField("orizzonte"); 
        		
        		
        		image = Toolkit.getDefaultToolkit().getImage("./giro.png");
        		BufferedImage bim = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB);
        		g2d = (Graphics2D)(bim.createGraphics());
        		ImageIcon orizzonteIMG = new ImageIcon(bim);
        		
        		JLabel gyro = new JLabel("Gyroscope Only",orizzonteIMG,JLabel.CENTER);
        		add(gyro);
        		//add(orizonText);
        		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        		setSize(200,200);
        		setVisible(true);
        		System.out.println("do you see frame?");
        		
                CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
                if ( portIdentifier.isCurrentlyOwned() )
                {
                    System.out.println("Error: Port is currently in use");
                }
                else
                {
                    CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
                    
                    if ( commPort instanceof SerialPort )
                    {
                        SerialPort serialPort = (SerialPort) commPort;
                        serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
                        
                        InputStream in = serialPort.getInputStream();
                        //OutputStream out = serialPort.getOutputStream();
                        
                        leggi(in);
        
                    }
                    else
                    {
                        System.out.println("Error: Only serial ports are handled by this example.");
                    }
                }     
            }
        	
        	private double MEDIA = 0;
        	private double diff = 0;
        	
        	private void leggi(InputStream in) {
        		boolean finito=false;
        		double input = 0;
        		long readCount = 0;
        		int calibrateCount = 0;
        		int delay = 200;
        		
        		while (!finito){
        			
        			 BufferedReader bufferedReader
        			   = new BufferedReader(new InputStreamReader(in));
        			
        			try {
        				while(bufferedReader.ready()){
        					String inputstring = bufferedReader.readLine();
        					input = 0;
        					
        					if(!inputstring.isEmpty()){
        						
        						try{
        						input = Double.parseDouble(inputstring);
        						System.out.println("Input: "+input);
        						calcola(input);						
        						}catch (Exception e){
        							System.out.println("Input: "+inputstring);
        						}
        						
        					}
        					
        					
        					
        				}
        			} catch (IOException e) {
        				// TODO Auto-generated catch block
        				e.printStackTrace();
        			}		
        			
        			
        		}
        		
        		
        	}	
        	
        	private void calcola(double numero) {
        		//numero-=1370;
        		orizon=-numero/40000;
        		g2d.rotate(orizon,50,50);
        		g2d.drawImage(image,0,0,100,100,null);
        		repaint();
        		g2d.rotate(-orizon,50,50);		
        	}
        
        }
        la banda del buco ringrazia per la gentile attenzione


        Sei un grande... ora butta gli HK401b e fai tutto con i giroscopi del WII.

        ... quindi da quel che ho capito questi giroscopi sono sensibili a fonti RF e addirittura a sorgenti elettrostatiche, come 1 nostro dito.

        Questo spiega molti problemi che ho avuto con questa board.

        Per esempio avvicinando la punta dell'antenna alla scheda, i giroscopi si reinizializzano. L'altro problema sono gli ESC e i motori che, generando molte spurie rf, e combinando il tutto con la vicinanza della ricevente, può causare letture sballate dei gyro, e capovolgere completamente il tricottero.

        Problema risolto con ricevente da 2,4ghz , ma non con ricevente a 72mhz.

        Potresti provare ad avvolgere in un foglio d'alluminio il giroscopio per vedere se i valori vengono ancora falsati da questi disturbi esterni?

        Se funziona posso fare una scatola a cnc per la scheda. Un panino tipo balsa da 2mm, foglio d'alluminio e balsa da 2mm.

        Commenta


        • Osservando il codice di kaptainkuk mi sono accorto che lui fa una media su 20 valori. Allora ecco come funziona il mio codice: riempie un array di interi grande 100 elementi con le letture,shiftando i vecchi valori, in modo da poter fare una media sugli ultimi 100 valori ogni loop. Poi effettuo la media anche con 20 valori, infine printo via seriale (per ora ad ogni loop per fare dei test).
          A questo punto un programmino java legge i valori e li disegna su un grafico XY.
          Risultati dei primi test:
          1. usare la USB, senza usare mouse o altri dispositivi USB, è molto meglio che usare una batteria esterna collegata direttamente (forse voltaggio più stabile? purtroppo non ho un oscilloscopio per verificare )
          2. definitivamente la vicinanza dell'essere umano a meno di un paio di metri sballa i valori. Per ora nei test mi allontano, ma sto procedendo a costruire una gabbia di faraday, in pratica un tubo dello scottex ricoperto di carta stagnola collegata a massa in cui infilerò il giroscopio + cavo in modo da proteggerlo dai campi magnetici.
          3. A gyro fermo con condizioni precedenti soddisfatte, si può notare che le medie hanno un regime sinusoidale. Ora effettuerò nuovi esperimenti per stabilirne la frequenza e i valori di picco, in modo da creare una funzione che modifichi la media seguendo l'andamento, attenendo così valori molto più "puliti".
          4. Urgono test sulle frequenze di trasmittenti che incasinano il gyro. Spero comunque che il tentativo del punto 2 elimini anche questa forma di errore, così da non avere troppi problemi in fase di costruzione.

          vi passo il codice per l'arduino, se volete quello in java fate richiesta che non ho voglia al momento di fare e uppare il .zip del codice. Lo farò quando avrò qualcosa di più "degno" tra le mani.

          p.s.: si, lo so, il codice può essere otimizzato, ad esempio si può inglobari i for delle medie in qeullo dello shift elementi in modo da avere un for unico, ma per ora mi serve essere sicuro di ciò che succede, quando funzionerà passerò all'otimizzazione brutale
          codice:
          #define CALIBRATIONDELAY 20000
          #define gyroPinAnalog 0
          #define numberRead1 100 //attenzione! DEVE esse numberRead1 > numberRead2
          #define numberRead2 20
          
          void setup() {
            analogReference(EXTERNAL);
            Serial.begin(57600);
            Serial.println("Pronto!");
            calibrazione();
          }
          
          float media;
          
          void calibrazione(){
            int sensorValue;
            long sommaMedia=0;
            long i;
            for (i=0;i<CALIBRATIONDELAY;i++){
              //delay(20);
              sensorValue = analogRead(gyroPinAnalog);
              sommaMedia += sensorValue;
            }
          
            media = (float)sommaMedia/(float)CALIBRATIONDELAY;
            //digitalWrite(13, LOW);
          
            Serial.print("\r\nMid:");
            Serial.println(media, 10);
            Serial.print("Last value:");
            Serial.println(sensorValue, 10);
          }
          
          
          int lastRead[numberRead];
          int actualRead=0;
          int sensorValue;
          
          void loop() {
            sensorValue = analogRead(gyroPinAnalog);
            Serial.print("Valore base: ");
            Serial.println(sensorValue);
            
            //calculate media
            if (actualRead < numberRead){
              actualRead++;
            }
            
            int i;
            
            for (i=0; i<actualRead-1;i++){
              lastRead[i] = lastRead[i+1];
            }
            lastRead[actualRead-1]=sensorValue;
            
            float media1=0;
            for (i=0;i<actualRead1;i++){
              media1 += lastRead[i];
            }
            media1/=(float)actualRead;
            Serial.print("Media su ");
            Serial.print(numberRead1);
            Serial.print(" valori: ");
            Serial.println(media1, 10);
            
            float media2=0;
            for (i=max(0, actualRead-numberRead2); i<actualRead;i++){
              media2 += lastRead[i];
            }
            media2/=(float)min(actualRead, numberRead2);
            Serial.print("Media su ");
            Serial.print(numberRead2);
            Serial.print(" valori: ");
            Serial.println(media2, 10);
          }

          Commenta


          • appena hai un file pronto per programmare l'atmega, fammelo sapere che lo provo. Uso AVR studio 4 e come programmatore l'AVRISP tarocco, ma ben funzionante.

            Commenta


            • non hai l'uscita seriale? così puoi usare direttamente la suite di arduino!

              Commenta


              • ho il portatile senza seriale, ma dovrei avere un'adattatore BELKIN usb-seriale.

                CMQ per me meglio usare AVR studio, ho già tutto settato per l'atmega 28 pin.

                Commenta


                • quali differenze ci sono con la nuova scheda v6?
                  e il nuovo firmware v4.5 cosa comporta in termini di prestazioni?
                  speriamo che tornino disponibili le nuove schede
                  non ce la faccio più ad aspettare.

                  pragamichele@alice.it

                  www.pragamichele.it

                  Commenta


                  • ...visto che il mio saldatore di fiducia non ne vuol sapere di scrive..lo farò io(in dondo la scheda è la mia)...

                    la mia KK non ne vuol sapere di funzionare...o meglio, funziona tutto egregiamente tranne la gestione delle correzioni sul cabra picchia..

                    provate tutte le verianti, ma nulla, non sente nulla.

                    la scheda è stata saldata con tutti i crismi dal buon antonio, c'è venuto il buddio si fosse fritto il sensore del gyro che gestisce il cabra/picchia(che ho dissaldato io)...
                    dopo aver ritoccato tutte le saldatore l'unica cosa da fare era provare a cambiarlo....risultato???NULLA....

                    non funziona....

                    prima di regalare tutto al bidone sotto casa(kk+tricottero) vi chiedo se per caso qualcuno a qualche prova da poter fare prima di cestinare tutto..
                    ad antonio è venuto in mente che possa essere la eprom(si scrive così?) programmata male...ma mi pare strano...


                    grassiee

                    Commenta


                    • Originariamente inviato da pragamichele Visualizza il messaggio
                      quali differenze ci sono con la nuova scheda v6?
                      e il nuovo firmware v4.5 cosa comporta in termini di prestazioni?
                      speriamo che tornino disponibili le nuove schede
                      non ce la faccio più ad aspettare.
                      l'hardware è sempre lo stesso, cambia solo il layout, quindi stai tranquillo che dalla terza versione in su l'hardware non e' cambiato.

                      Detto questo sono in contatto con un'Inglese che tra 2 settimane ne offrirà una nuova con giroscopi mems (già testata in versione beta da warthox).

                      Con questi giroscopi non ci sarà più bisogno di trimmare durante il volo, in quanto gli sbalzi di temperatura non gli danno fastidio.

                      Il firmware in seguito alla versione 4.2 invece apporta dei miglioramenti che aiutano il settaggio, in quanto rendono i potenziometri meno sensibili e quindi più facili da settare, inoltre introducono una sequenza da fare con lo stick del timone per armare il multicottero. Inoltre diminuiscono le corse su elev e alettone in modo da non esser costretti a mettere gli endpoint al 30% per un uso diciamo come piattaforma FPV e fotografica.

                      Questi firmware però non sono buoni per fare flip e acrobazie perchè anche mettendo le corse al 100% non sono sufficienti a fare i flip e altre pazzie.

                      il 4.2 resta la versione più acrobatica.

                      Commenta


                      • Originariamente inviato da mekfly Visualizza il messaggio
                        ...visto che il mio saldatore di fiducia non ne vuol sapere di scrive..lo farò io(in dondo la scheda è la mia)...

                        la mia KK non ne vuol sapere di funzionare...o meglio, funziona tutto egregiamente tranne la gestione delle correzioni sul cabra picchia..

                        provate tutte le verianti, ma nulla, non sente nulla.

                        la scheda è stata saldata con tutti i crismi dal buon antonio, c'è venuto il buddio si fosse fritto il sensore del gyro che gestisce il cabra/picchia(che ho dissaldato io)...
                        dopo aver ritoccato tutte le saldatore l'unica cosa da fare era provare a cambiarlo....risultato???NULLA....

                        non funziona....

                        prima di regalare tutto al bidone sotto casa(kk+tricottero) vi chiedo se per caso qualcuno a qualche prova da poter fare prima di cestinare tutto..
                        ad antonio è venuto in mente che possa essere la eprom(si scrive così?) programmata male...ma mi pare strano...


                        grassiee

                        Commenta


                        • Originariamente inviato da mekfly Visualizza il messaggio
                          ...visto che il mio saldatore di fiducia non ne vuol sapere di scrive..lo farò io(in dondo la scheda è la mia)...

                          la mia KK non ne vuol sapere di funzionare...o meglio, funziona tutto egregiamente tranne la gestione delle correzioni sul cabra picchia..

                          provate tutte le verianti, ma nulla, non sente nulla.

                          la scheda è stata saldata con tutti i crismi dal buon antonio, c'è venuto il buddio si fosse fritto il sensore del gyro che gestisce il cabra/picchia(che ho dissaldato io)...
                          dopo aver ritoccato tutte le saldatore l'unica cosa da fare era provare a cambiarlo....risultato???NULLA....

                          non funziona....

                          prima di regalare tutto al bidone sotto casa(kk+tricottero) vi chiedo se per caso qualcuno a qualche prova da poter fare prima di cestinare tutto..
                          ad antonio è venuto in mente che possa essere la eprom(si scrive così?) programmata male...ma mi pare strano...


                          grassiee
                          Se vuoi posso riprogrammarti la eprom e provare il processore in volo sulla mia scheda se le spese di spedizione sono a tuo carico.

                          L'altra opzione è quella di comprare un paio d'atmega48 di ricambio (con bootloader Arduino) qui :
                          2pcs ATMEL ATMEGA48-20PU IC AVR MCU 4K 20MHZ 5V 28DIP - eBay (item 260502439753 end time Oct-01-10 21:52:34 PDT)

                          7€ inclusa spedizione, e farmeli arrivare direttamente a casa.

                          Ho già tutto settato per riprogrammare questi chip, impiego 5 secondi a chip.

                          la spedizione di ritorno è a carico mio, ma mi tengo uno dei due, che dovrebbe compensare le spese di spedizioni mie.

                          Commenta


                          • Originariamente inviato da mekfly Visualizza il messaggio
                            ...visto che il mio saldatore di fiducia non ne vuol sapere di scrive..lo farò io(in dondo la scheda è la mia)...

                            la mia KK non ne vuol sapere di funzionare...o meglio, funziona tutto egregiamente tranne la gestione delle correzioni sul cabra picchia..

                            provate tutte le verianti, ma nulla, non sente nulla.

                            la scheda è stata saldata con tutti i crismi dal buon antonio, c'è venuto il buddio si fosse fritto il sensore del gyro che gestisce il cabra/picchia(che ho dissaldato io)...
                            dopo aver ritoccato tutte le saldatore l'unica cosa da fare era provare a cambiarlo....risultato???NULLA....

                            non funziona....

                            prima di regalare tutto al bidone sotto casa(kk+tricottero) vi chiedo se per caso qualcuno a qualche prova da poter fare prima di cestinare tutto..
                            ad antonio è venuto in mente che possa essere la eprom(si scrive così?) programmata male...ma mi pare strano...


                            grassiee
                            Se vuoi posso riprogrammarti la eprom e provare il processore in volo sulla mia scheda se le spese di spedizione sono a tuo carico.

                            L'altra opzione è quella di comprare un paio d'atmega48 di ricambio (con bootloader Arduino) qui :
                            eBay - New & used electronics, cars, apparel, collectibles, sporting goods & more at low prices

                            7€ inclusa spedizione, e farmeli arrivare direttamente a casa.

                            Ho già tutto settato per riprogrammare questi chip, impiego 5 secondi a chip.

                            la spedizione di ritorno è a carico mio, ma mi tengo uno dei due, che dovrebbe compensare le spese di spedizioni mie.

                            Commenta


                            • Originariamente inviato da MarcAntonio Visualizza il messaggio
                              l'hardware è sempre lo stesso, cambia solo il layout, quindi stai tranquillo che dalla terza versione in su l'hardware non e' cambiato.

                              Detto questo sono in contatto con un'Inglese che tra 2 settimane ne offrirà una nuova con giroscopi mems (già testata in versione beta da warthox).

                              Con questi giroscopi non ci sarà più bisogno di trimmare durante il volo, in quanto gli sbalzi di temperatura non gli danno fastidio.

                              Il firmware in seguito alla versione 4.2 invece apporta dei miglioramenti che aiutano il settaggio, in quanto rendono i potenziometri meno sensibili e quindi più facili da settare, inoltre introducono una sequenza da fare con lo stick del timone per armare il multicottero. Inoltre diminuiscono le corse su elev e alettone in modo da non esser costretti a mettere gli endpoint al 30% per un uso diciamo come piattaforma FPV e fotografica.

                              Questi firmware però non sono buoni per fare flip e acrobazie perchè anche mettendo le corse al 100% non sono sufficienti a fare i flip e altre pazzie.

                              il 4.2 resta la versione più acrobatica.
                              l'inglese per caso è
                              niall ?
                              mi ha detto che tra qualche giorno arriva tutto.

                              pragamichele@alice.it

                              www.pragamichele.it

                              Commenta


                              • Originariamente inviato da pragamichele Visualizza il messaggio
                                l'inglese per caso è
                                niall ?
                                mi ha detto che tra qualche giorno arriva tutto.
                                Non è Niall, si chiama Chris.

                                Queste board con i mems st, sono ancora in beta diciamo, ancora non sono in vendita tra i vari venditori.

                                Commenta

                                Sto operando...
                                X