DR HACK

itafsqarhyazeubebgcazh-CNzh-TWhrcsdanlenettlfifrglkadeelhtiwhihuisidgajakolvltmkmsmtnofaplptrorusrskslesswsvthtrukurvicyyi

RoboZak

In questa sezione viene fatto un esempio di un'app per il progetto IOIO RoboZak

Classe per il controllo dei motori:

package robozak.examples.simple;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import ioio.lib.api.Uart;

public class Motore {
	int min_pos;
	int max_pos;
	int cur_pos ;
	int tmr_out ;
	int motor_id;
	
	int buff_siz = 7;	
	byte[] buff_out = new byte[buff_siz];
	byte[] buff_inp = new byte[buff_siz];
	
	InputStream uart_rx;
	OutputStream uart_tx;
	 
	public Motore(){
		 min_pos = 600;
		 max_pos = 2400;
		 cur_pos = (min_pos + max_pos)/2;
		 tmr_out = 100;
		 motor_id = 0;
	 }

	public Motore(Uart urt, int id, int speed, StringBuilder msg) throws IOException{
		 min_pos = 600;
		 max_pos = 2400;
		 cur_pos = (min_pos + max_pos)/2;
		 tmr_out = 100;
		 motor_id = 0;
		 
		 set_uart(urt);
     	 set_motor_id(id);
     	 msg.append(Motor_off() + "- ");
     	 msg.append(Motor_speed(speed));
     	 
	 }
	
    byte Tx_chk() {
    	return (byte)(256 - (int)((int)((int)buff_out[0] + (int)buff_out[1] + (int)buff_out[2] + (int)buff_out[3]) % 256) % 256);
    }

    byte Rx_chk() {
    	return (byte)(256 - (int)((int)((int)buff_inp[0] + (int)buff_inp[1] + (int)buff_inp[2] + (int)buff_inp[3]) % 256) % 256);
    }
    
    String Motor_send() throws IOException{
        StringBuilder sb = new StringBuilder();
        
        buff_out[4] = Tx_chk();
    	buff_out[5] = (byte)0x00;
    	buff_out[6] = (byte)0x00;  
    	
    	sb.append(flush_rx());
    	
    	uart_tx.write(buff_out);
    	uart_tx.flush();
		
		try{
			long tout = System.currentTimeMillis() + tmr_out;					
			while(uart_rx.available() < buff_siz){
				Thread.yield();
				if (System.currentTimeMillis() > tout){
					break;
				}
			}
			uart_rx.read(buff_inp, 0, buff_siz); 
            for (byte x : buff_inp){
            	sb.append(String.format("%02X ", x));
            }
            if (Tx_chk() != Rx_chk()) {
            	sb.append("Error crc");
            } else if (buff_out[1] == (byte)0xE9){
        		cur_pos = (((int)buff_inp[5] * 256) + (int)buff_inp[6]) ;
        	}
		} catch(Exception e) {
			sb.append("Error input");
		}
		return sb.toString();    	
    }
    
	public String flush_rx() throws IOException{
		StringBuilder sb = new StringBuilder();		
		int inav = uart_rx.available();
		
		if(inav > 0){
			byte[] buff_tmp = new byte[inav];
			uart_rx.read(buff_tmp, 0, inav); 

            for (byte x : buff_tmp){
            	sb.append(String.format("%02X ", x));
            }
		} else {
			//sb.append("No input");			
		}
		
        return sb.toString();	
	}
	
	public int get_cur_pos(){
		return cur_pos;
	}
	
    public void set_uart(Uart urt){
    	uart_tx = urt.getOutputStream();
    	uart_rx = urt.getInputStream();
    }
    
    public void set_motor_id(int id){
    	motor_id = id;
    } 
    
    public void set_min_pos(int pos){
    	min_pos = pos;
    } 

    public void set_max_pos(int pos){
    	max_pos = pos;
    } 
    
    public String Motor_off() throws IOException{
    	buff_out[0] = (byte)0x80;
    	buff_out[1] = (byte)0xEB;
    	buff_out[2] = (byte)motor_id;
    	buff_out[3] = (byte)0x00;
    	
    	return Motor_send();
    	
    }
    
    public String Motor_on() throws IOException{
    	buff_out[0] = (byte)0x80;
    	buff_out[1] = (byte)0xEB;
    	buff_out[2] = (byte)motor_id;
    	buff_out[3] = (byte)0x01;
    	
    	return Motor_send();
    	
    }
    
    public String Motor_speed(int speed) throws IOException{
    	if (speed < 0){
    		speed = 0;
    	} else if(speed > 100) {
    		speed = 100;
    	}    	
    	
    	buff_out[0] = (byte)0x80; 
    	buff_out[1] = (byte)0xE9;
    	buff_out[2] = (byte)motor_id;
    	buff_out[3] = (byte)speed;
    	
    	return Motor_send();
	
    }
    
    public String Motor_pos(int pos) throws IOException{
    	if (pos < min_pos){
    		pos = min_pos;
    	} else if (pos > max_pos) {
    		pos = max_pos;
    	}    	
    	
		buff_out[0] = (byte)0x80;
		buff_out[1] = (byte)motor_id;
		byte hit = (byte)(int)(pos / 256);
		buff_out[2] = hit;
		byte low = (byte)(pos % 256);
		buff_out[3] = low;
    	
		cur_pos = pos;
		
    	return Motor_send();
			
    }
    
}

File Activity main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

	<LinearLayout
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:orientation="vertical"
	    android:paddingTop="20px" >

		<ToggleButton
		    android:id="@+id/toggleButton3"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:text="ToggleButton"
		    android:textOff="LED OFF"
		    android:textOn="LED ON" />

		<SeekBar
		    android:id="@+id/seekBar1"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:max="@integer/IDMOTORI"
		    android:paddingLeft="20dp"
		    android:paddingRight="20dp"
		    android:progress="0" />

		<SeekBar
		    android:id="@+id/seekBar2"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
		    android:max="@integer/GRADIMOTORE"
		    android:paddingLeft="20dp"
		    android:paddingRight="20dp"
		    android:progress="1" />

		<ToggleButton
		    android:id="@+id/toggleButton1"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:text="ToggleButton"
		    android:textOff="MOTOR OFF"
		    android:textOn="MOTOR ON" />

		<SeekBar
		    android:id="@+id/seekBar3"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
		    android:max="@integer/IDMOTORI"
		    android:paddingLeft="20dp"
		    android:paddingRight="20dp"
		    android:progress="0" />

		<SeekBar
		    android:id="@+id/seekBar4"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
		    android:max="@integer/GRADIMOTORE"
		    android:paddingLeft="20dp"
		    android:paddingRight="20dp"
		    android:progress="1" />

		<ToggleButton
		    android:id="@+id/toggleButton2"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:text="ToggleButton"
		    android:textOff="MOTOR OFF"
		    android:textOn="MOTOR ON" />

		<SeekBar
		    android:id="@+id/seekBar5"
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:max="100"
		    android:paddingLeft="20dp"
		    android:paddingRight="20dp"
		    android:progress="50" />
	
	</LinearLayout>

	<TextView
	    android:id="@+id/textView1"
	    android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    android:textAppearance="?android:attr/textAppearanceSmall" />

</LinearLayout>

File RoboZakApp.java

package robozak.examples.simple;

import java.io.IOException;
import ioio.lib.api.DigitalOutput;
import ioio.lib.api.IOIO;
import ioio.lib.api.Uart;
import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.util.BaseIOIOLooper;
import ioio.lib.util.IOIOLooper;
import ioio.lib.util.android.IOIOActivity;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.ToggleButton;

public class RoboZakApp extends IOIOActivity {
	 TextView textView_;
	 SeekBar seekBar1;
	 SeekBar seekBar2;
	 SeekBar seekBar3;
	 SeekBar seekBar4;
	 SeekBar seekBar5;
	 ToggleButton toggleButton3;
	 ToggleButton toggleButton1;
	 ToggleButton toggleButton2;
	 int oldpos1;
	 int oldpos2;
	 int oldsped;
	 int oldmot1;
	 int oldmot2;
	 boolean oldmotoronoff1;
	 boolean oldmotoronoff2;
	 int cnrlog = 0;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        textView_ = (TextView)findViewById(R.id.textView1);
        seekBar1 = (SeekBar)findViewById(R.id.seekBar1);
        seekBar2 = (SeekBar)findViewById(R.id.seekBar2);
        seekBar3 = (SeekBar)findViewById(R.id.seekBar3);
        seekBar4 = (SeekBar)findViewById(R.id.seekBar4);
        seekBar5 = (SeekBar)findViewById(R.id.seekBar5);
        toggleButton3 = (ToggleButton)findViewById(R.id.toggleButton3);
        toggleButton1 = (ToggleButton)findViewById(R.id.toggleButton1);
        toggleButton2 = (ToggleButton)findViewById(R.id.toggleButton2);
        
        seekBar1.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				setText("CNL 1 > MOT " + Integer.toString(seekBar1.getProgress() + 1));
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}   

        });   

        seekBar2.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				setText("CNL 1 > POS " + Integer.toString(seekBar2.getProgress() + 600));
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}   

        });   
        
        seekBar3.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				setText("CNL 2 > MOT " + Integer.toString(seekBar3.getProgress() + 1));
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}   

        });    

        seekBar4.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				setText("CNL 2 > POS " + Integer.toString(seekBar4.getProgress() + 600));
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}   

        });         
        
        seekBar5.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				setText("CNL x > VEL " + Integer.toString(seekBar5.getProgress() + 1));
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub				
			}   

        }); 
        
        enableUi(false);
        
    }
	
	class Looper extends BaseIOIOLooper {
		 DigitalOutput led_;
		 Uart uart1;
		 Uart uart2;

		 Motore[] sin = new Motore[11];
		 Motore[] des = new Motore[11];
        
		@Override
		public void setup() throws ConnectionLostException, InterruptedException {
			try {
				oldpos1 = -1;
				oldpos2 = -1;
				oldsped = -1;
				oldmot1 = -1;
				oldmot2 = -1;
				
				led_ = ioio_.openDigitalOutput(IOIO.LED_PIN, true);
				uart1 = ioio_.openUart(5, 3, 19200, Uart.Parity.NONE, Uart.StopBits.TWO);
				uart2 = ioio_.openUart(6, 4, 19200, Uart.Parity.NONE, Uart.StopBits.TWO);

		        oldmotoronoff1 =! toggleButton1.isChecked();
		        oldmotoronoff2 =! toggleButton2.isChecked();
		        
		        for (int i=0;i<11;i++){
		        	StringBuilder sb = new StringBuilder();
		        	sin[i] = new Motore(uart1, i+1, seekBar5.getProgress(), sb);
		        	setText(sb.toString());
					
		        	sb = new StringBuilder();
		        	des[i] = new Motore(uart2, i+1, seekBar5.getProgress(), sb);
		        	setText(sb.toString());	        
		        }

				enableUi(true);
				
			} catch (ConnectionLostException e) {
				setText("Connection Lost Exception");
				enableUi(false);
				throw e;
			} catch (IOException e) {
				// TODO Blocco catch generato automaticamente
				e.printStackTrace();
			}
					
	}
		
		@Override
		public void loop() throws ConnectionLostException {
			try {

				led_.write(!toggleButton3.isChecked());

				if (toggleButton1.isChecked()!=oldmotoronoff1){
					oldmotoronoff1 = toggleButton1.isChecked();
					
					if (oldmotoronoff1 == true) {
						setText(sin[seekBar1.getProgress()].Motor_on());						
					} else {
						setText(sin[seekBar1.getProgress()].Motor_off());						
					}
				}

				if (toggleButton2.isChecked()!=oldmotoronoff2){
					oldmotoronoff2 = toggleButton2.isChecked();
					
					if (oldmotoronoff1 == true) { 
						setText(des[seekBar1.getProgress()].Motor_on());
					} else {
						setText(des[seekBar1.getProgress()].Motor_off());
					}
				}
				
				if (oldmot1 != seekBar1.getProgress()) {
					oldmot1 = seekBar1.getProgress();
					
					setText(sin[seekBar1.getProgress()].Motor_speed(seekBar5.getProgress()));
					setTextseekBar2(sin[seekBar1.getProgress()].get_cur_pos() - 600);
				}
				
				if (oldpos1 != seekBar2.getProgress()) {
					oldpos1 = seekBar2.getProgress();
					
					setText(sin[seekBar1.getProgress()].Motor_pos(seekBar2.getProgress() + 600));

				}
				
				if (oldmot2 != seekBar3.getProgress()) {
					oldmot2 = seekBar3.getProgress();
					
					setText(des[seekBar3.getProgress()].Motor_speed(seekBar5.getProgress()));
					setTextseekBar4(des[seekBar3.getProgress()].get_cur_pos() - 600);
				}
				
				if (oldpos2 != seekBar4.getProgress()) {
					oldpos2 = seekBar4.getProgress();
					
					setText(des[seekBar3.getProgress()].Motor_pos(seekBar4.getProgress() + 600));
			        
				}

				if (oldsped != seekBar5.getProgress()) {
					oldsped = seekBar5.getProgress();
					
					oldmot1 = -1;
					oldmot2 = -1;
					
				}				
				
				Thread.sleep(10);
			} catch (InterruptedException e) {
				setText("Interrupted Exception");
				ioio_.disconnect();
				enableUi(false);
			} catch (ConnectionLostException e) {
				setText("Connection Lost Exception");
				enableUi(false);
				throw e;
			} catch (IOException e) {
				setText("IO Exception");
				e.printStackTrace();
			}
			
		}
	}

	@Override
	protected IOIOLooper createIOIOLooper() {
		return new Looper();
	}

	private void enableUi(final boolean enable) {
		runOnUiThread(new Runnable() {
			@Override
			public void run() {
				seekBar1.setEnabled(enable);
				seekBar2.setEnabled(enable);
				seekBar3.setEnabled(enable);
				seekBar4.setEnabled(enable);
				seekBar5.setEnabled(enable);
				toggleButton3.setEnabled(enable);
				toggleButton1.setEnabled(enable);
				toggleButton2.setEnabled(enable);
				setText("Connesso " + Boolean.toString(enable));
			}
		});
	}
	
	private void setText(final String str) {
		runOnUiThread(new Runnable() {
			@Override
			public void run() {
				
				if (cnrlog < 50){
					cnrlog +=1;
					textView_.setText(str + "\n" + textView_.getText());
				} else {
					cnrlog =0;
					textView_.setText(str);
				}				
			}
		});
	}
	
	private void setTextseekBar2(final int prog) {
		runOnUiThread(new Runnable() {
			@Override
			public void run() {
				
				seekBar2.setProgress(prog);	
			}
		});
	}
	
	private void setTextseekBar4(final int prog) {
		runOnUiThread(new Runnable() {
			@Override
			public void run() {
				
				seekBar4.setProgress(prog);	
			}
		});
	}
	
}

File integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="GRADIMOTORE">3000</integer>
    <integer name="IDMOTORI">10</integer>
</resources>

Aggiungi commento


Codice di sicurezza
Aggiorna

We use cookies to improve our website and your experience when using it. Cookies used for the essential operation of the site have already been set. To find out more about the cookies we use and how to delete them, see our privacy policy.

I accept cookies from this site.

EU Cookie Directive Module Information