Tag Archives: nxt

[Android 結合 Google Chart API] 機器人原地轉一圈產生雷達圖

機器人原地轉一圈之後,將超音波感測器值透過藍牙送給Android 手機,再呼叫 Google Chart API 雲端圖表功能來取得雷達圖。可以畫出非常精美的圖表。重點在於靈活應用 Google Chart API  的語法就可以囉!

直接點選以下連結就可以看到雷達圖,詳細參數設定請參閱 Google Chart API 官網或以下延伸閱讀

https://chart.googleapis.com/chart?cht=r&chs=320×320&chxt=x&chxl=0:|0|45|90|135|180|225|270|315&chd=t:60,40,30,100,76,99,22,57,80

本範例是結合樂高機器人的超音波感測器來達到簡易地圖掃描的效果,歡迎試試看。以下範例是2014年淡江大學智慧型行動裝置整合機器人控制課程的作業之一。感謝電機系周煜同學(已畢業)做出相當好的版本呢。

 

12345

[youtube=http://www.youtube.com/watch?v=DBvhrxkb24M]

延伸閱讀:

Google Chart API 教學

Google Chart 隨機產生折線圖

淡江電機 Android 機器人整合課程網站

140523淡江電機 Android 行動裝置整合機器人控制課程,期末專題展示

Code Android端

package com.example.nxtsense;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Set;
import java.util.UUID;



import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build;

public class MainActivity extends ActionBarActivity {
	private BluetoothAdapter adapter;
	private BluetoothSocket nxtSocket;
	public DataInputStream nxtDataIn;
	public DataOutputStream nxtDataOut;
    public final int MODE_CONNECT_NXT = 0, MODE_CONTROL = 1;
    private int mode;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        adapter = BluetoothAdapter.getDefaultAdapter();
    	if(adapter==null)
        {
        	Toast.makeText(this, "No Bluetooth adapter found", Toast.LENGTH_SHORT).show();
        	this.finish();
        }
    	if(!adapter.isEnabled())
			startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);
    	
    	try {
			setMode(MODE_CONNECT_NXT);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    	Button getvalue=(Button)findViewById(R.id.get);
    	getvalue.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				try {
					CommandNXT();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		});
        
    }

    public void CommandNXT() throws IOException{
    	String y="";
    		nxtDataOut.writeInt(1);
    		nxtDataOut.flush();
    	
    	//	int x=nxtDataIn.readInt();
    		y=String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt());
    	
					//TextView tv=(TextView)findViewById(R.id.value);
			    	//tv.setText(String.valueOf(x));
		
    	String myURL =" https://chart.googleapis.com/chart?cht=r&chs=320x320&chxt=x&chxl=0:|0|45|90|135|180|225|270|315&chd=t:"+y;         
        WebView myBrowser=(WebView)findViewById(R.id.mybrowser);  
  
        WebSettings websettings = myBrowser.getSettings();   
        websettings.setJavaScriptEnabled(true);  
         
        myBrowser.setWebViewClient(new WebViewClient());  
  
        myBrowser.loadUrl(myURL);  	
    	
    	
    	
    }
    public void setMode(int _mode) throws IOException
    {
    	Button connect=(Button)findViewById(R.id.buttonConnect);
    	mode = _mode;
    	if(mode==MODE_CONNECT_NXT)
    	{
    		
    		connect.setOnClickListener(new Button.OnClickListener() {
    			public void onClick(View arg0) {
    				connectNxt();
    				}
            });
    	}
    	
    	else if(mode==MODE_CONTROL)
    	{
    		connect.setEnabled(false);
    	}
    	else 
    		throw new IllegalArgumentException();
    }
    
    private void connectNxt()
    {
    	if(mode!=MODE_CONNECT_NXT) //檢查模式
    		throw new IllegalArgumentException();
    	
    	String name;
    	BluetoothDevice nxt = null;
    	
    	if((name = ((EditText) findViewById(R.id.editNxtName)).getText().toString()).equals("")) //檢查是否為空字串
    	{
    		Toast.makeText(this, "Please provide the name of your NXT", Toast.LENGTH_SHORT).show();
    		return;
    	}
    	
        Set<BluetoothDevice> devicesSet = adapter.getBondedDevices(); //取得裝置清單
        
        if(devicesSet.size()==0) //找不到裝置
        {
        	Toast.makeText(this, "No devices found", Toast.LENGTH_SHORT).show();
        	return;
        }
        
        for (BluetoothDevice device : devicesSet) //搜尋裝置
        {
            if (device.getName().equals(name))
            {
            	nxt = device;
                break;
            }
        }
        
        if(nxt==null) //找不到裝置
        {
        	Toast.makeText(this, "NXT not found", Toast.LENGTH_SHORT).show();
        	return;
        }
        
        try
        {
        	//建立nxt socket
			nxtSocket = nxt.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
			nxtSocket.connect();
			nxtDataOut = new DataOutputStream(nxtSocket.getOutputStream());
			nxtDataIn = new DataInputStream(nxtSocket.getInputStream());
		}
        catch(IOException e)
		{
        	Toast.makeText(this, "Connection failure", Toast.LENGTH_SHORT).show();
        	return;
		}

    	Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
		try {
			setMode(MODE_CONTROL);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }




   

}
Code. Android receive ultrasonic value from Lego robot

Code 機器人端使用 leJOS

import lejos.nxt.*;
import lejos.nxt.comm.*;
import lejos.util.Delay;

import java.io.*;
public class motor_control{
	public static void main(String args[]) throws IOException{
		Button.ESCAPE.addButtonListener(new ButtonListener(){
				public void buttonPressed(Button b){
					System.exit(0);
					}
				public void buttonReleased(Button b){
					
				}
		});
		System.out.println("Waiting");
		BTConnection btc = Bluetooth.waitForConnection(0, NXTConnection.RAW);
		DataInputStream dis = btc.openDataInputStream();
		DataOutputStream dos = btc.openDataOutputStream();
		System.out.println("Connected");
		UltrasonicSensor ultrasonic1 = new UltrasonicSensor(SensorPort.S2);
		int Ultrasonicvalue1;
		while(true){
			int a=dis.readInt();
			if(a==1){
				for(int i=0;i<7;i++){
					Motor.A.setSpeed(100);
					Motor.B.setSpeed(100);
					Motor.A.backward();
					Motor.B.forward();
					Delay.msDelay(822);
					Ultrasonicvalue1=ultrasonic1.getDistance();
		//	System.out.println(Ultrasonicvalue1);
			
				try {
					dos.writeInt(Ultrasonicvalue1);
					dos.flush();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
			}
				Motor.A.setSpeed(0);
				Motor.B.setSpeed(0);
				Motor.A.backward();
				Motor.B.backward();
			}
		}
			}
}
Code. Robot send out ultrasonic value to Android (leJOS)

[有趣書籍] Make:樂高機器人與 Arduino 專題製作

http://www.books.com.tw/products/0010632752

Make:樂高機器人與 Arduino 專題製作  /  Make: LEGO and Arduino Projects

作者: John Baichtal 等
譯者:莊啟晃,黃藤毅,莊雯琇,林可凡
出版社:歐萊禮
出版日期:2014/04/17
語言:繁體中文

定價:580

getImage (1)

 

期待這本書很久了,還是全彩的很有質感呢。以下是博客來的書目與章節

結合 Lego Mindstorms NXT 與開源電子的專案製作
運用積木、感測器和微電腦控制器製作機器人

  使用當今最酷炫的 DIY 技術製作神奇的機器人與裝置。本書提供詳盡清楚的操作指引,您將學習到用 Lego Mindstorms NXT2.0 和 Arduino 模型平台製作各種電子裝置,讓您以 Mindstorms 就能創作出令人稱羨的神奇裝置;加上 Arduino 的應用能帶給我們一些意想不到的功能,進而開發出嶄新的應用。

  製作出飲料販賣機、電子音樂聲成器、無線遙控燈具等等

  書中每個有趣且神奇的實驗項目皆有詳盡製作程序及清晰的圖解說明,讓您能夠按部就班的完成各個實驗。您將學習如何設定 Arduino 撰寫程式的環境,下載 sketches 語言和所需要的函式庫,以及協助非程式專業人仕使用 Arduino 程式語言。這本書適用於學生、老師、業餘愛好人仕、製造者、駭客一族以及各個年齡層的孩童。

  透過本書您將學習到
  ‧利用繪圖機器人(Drawbot),本實驗帶您製作一個用畫筆來繪製各種圖案的機器人
  ‧示範如何使用 Mindstorms 馬達製作一個時鐘裝置,顯示精確的時間
  ‧只要按壓一個按鈕,就可以讓巧克力牛奶製造機將牛奶和巧克力糖漿均勻攪拌並放入杯中
  ‧利用滑輪與 Arduino 的護腕裝備以及一組無線控制器所組合而成的魔爪機器人(Gripperbot)
  ‧一個樂高吉他的裝置,安裝各種按鈕和旋鈕可以發出各種電子音樂!
  ‧用智慧手機控制的樂高燈具,具備 on/off 開關與明亮度調整的功能
  ‧藉由認識歐姆定律以及基本電子元件,進而親身體驗美麗的電子世界

  本書範例所引用的作法皆經由經驗豐富的專業製造人仕認證

  John Baichtal 是 MAKE 雜誌作者並負責有線(Wired)雜誌 GeekDad 部落格
  Matthew Beckler 和 Adam Wolf 是提出開源硬體構想 Wayne and Layne, LLC 的共同創辦人

chapter 01 實驗項目:Drawbot
chapter 02 樂高機器人 – 解剖分析
chapter 03 Arduino 的插曲
chapter 04 實驗項目:時鐘裝置
chapter 05 實驗項目:巧克力牛奶機
chapter 06 基本電子理論
chapter 07 魔爪機器人(Gripperbot)
chapter 08 實驗項目:吉他裝置(Keytar)
chapter 09 燈具的實驗項目
chapter 10 實驗項目:進階的技術
appendix 零件表
索引

 

140418 淡江電機 Android 行動裝置整合機器人控制課程,期中專題展示

今天阿吉老師到淡江大學上課,而今天的課程是期中的專題展示,主要的內容是於 Eclipse IDE 中使用 Java程式語言來開發各種機器人控制專題。

這次的主題有保全機器人、路面避障機器人、發射機器人、生活便利機器人、繪圖機器人、堆高機、分類機器人、測速照相機器人、搬運機器人、搖擺彈彈球、搬運機器人、大嘴鱷魚、全景拍照機器人等等。

既然是Android,同學們就要思考Android手機資源要如何與機器人整合,而不是換個程式語言玩碰碰車而已。手機上的動作感測器、GPS、照相機、網路連線、麥克風等等,對機器人來說都是很關鍵的功能啊!

另一方面,各種 Google API例如 Google Map、Google Chart、Google Application Engine 或是較簡單的語音輸入/輸出等,都能讓機器人更豐富。

來看看CAVEDU之前做的 Google Map 結合機器人的概念影片以及 openCV / Android 實作,讓機器人可以透過手機的影像辨識結果來移動。

[youtube=https://www.youtube.com/watch?v=qvI04snZRuU] [youtube=https://www.youtube.com/watch?v=k6Lelf7SNWI]

軟滑小編也有修這堂課喔!會修這堂課是因為,之前大三有修過 leJOS 樂高機器人的課程。想說要更進一步的學更多相關的課程才修的。不過本學期的課程內容比起以往難度提高很多很多,許多同學都為了把專題做的更好,準備了很久。

寫app的方式有很多種,相較起來App Inventer,java的變化更多更複雜,也代表著程式碼更多更難。所以App Inventer真的是很適合學習Android入門的程式語言喔!但換個角度來說,如果要做到更完整的功能,還是要回到 Android 正規開發環境哩,真難抉擇啊

同學們都很認真的上台報告

這組的目標是藉由手機的姿態感測器讓機器人保持在翹翹板中央,做到簡易的動態平衡控制。

來看一下同學們的作品有哪些,有些的機構設計的很不錯!

分類機器人
分類機器人Demo
大嘴鱷魚
全景拍照機器人
推高機

最後由老師講評整個專題展示結果,大家的表現… 還有很大的進步空間啦,希望學期末報告的時候都可以更棒!

阿吉老師講評

閱讀延伸

AppInventor – 圖形化Android

Android相關文章

Arduino + Lego原廠或相容感測器有什麼梗?

Arduino 很方便大家都知道, 但一個系統或機器人的豐富度在於感測器. 如果有許多好玩的感測器或控制裝置的話, 機器人也會更多元豐富. 如果今天手邊的感測器或馬達沒有現成 Arduino 的 library 的話,事情就會變得比較辛苦(雖然這種狀況很少, 但還是會發生).

2012-05-20-19.20.40 IMAG0385 - 複製

因此有許多公司努力地讓Arduino可以接上許多周邊. 其中一片就是 NXShield。NXShield 可以讓 Arduino 接上Lego原廠或相容感測器,還有馬達。對於手邊有樂高機器人的朋友來說,這是延長您或學生機器人學習歷程的好選擇。

除此之外,NXSheild 在板子上就有 6個 伺服馬達腳位(NXShield-D 有6個,-M 有12個!),2個 I2C 腳位以及 12個類比腳位。該適時後來想想怎樣可以把這些腳位塞滿了,哈哈

也因為它是 MindSensors 公司的產品,所以各種 MindSensors 感測器都可使用。CAVEDU 以往也使用這樣的架構做出許多好玩的專題。如果您感興趣的話,歡迎參加本周末的[Arduino / 樂高NXT機器人研習營]研習啦!

延伸閱讀:CAVEDU 實驗室 Arduino 分部,下面是許多 Arduino + NXShield 的應用:

今年五月 Maker Faire 的機器人循跡搬運賽也能這樣來解題喔!

[youtube=”https://www.youtube.com/watch?v=fAupolIfNac”]

NXShield dIMU Segway 雙輪遙控平衡車

[youtube=”https://www.youtube.com/watch?feature=player_embedded&v=isGAGW3oHms”]

Arduino_SumoEye Robot – 物體方向偵測

[youtube=”https://www.youtube.com/watch?v=nDHIvSuOhVc”]

Arduino&LineLeader: LineFollowing Robot

[youtube=”https://www.youtube.com/watch?v=nDHIvSuOhVc”]

Arduino Remote Control Omnibot – PS2手把紅外線遙控全向移動機器人

[youtube=”https://www.youtube.com/watch?v=qTZhjaHxBz0″]

如果您是使用 Arduino Mega ADK的話,還能結合 Android 手機來控制

[youtube=”https://www.youtube.com/watch?v=hHVM_5KmHdA”]

 

 

 

NXT 接收 Android 藍牙字元 – 使用 LabVIEW

http://lab.cavedu.com/labview_nxt_bt   <- 程式碼請由此下載

使用Android 手機與樂高機器人之間藍牙互傳訊息。手機端程式使用App Inventor,機器人端則使用 LabVIEW 與 NXT-G。請由本頁最下方下載程式碼。
 
Android – App Inventor 2程式說明
 
STEP1:在 ListPicker1.BeforePicking事件中,將 BluetoothClient.AddressAndNames指令為 ListPicker1內容,代表點選將其內容連結到手機的已配對藍牙裝置清單。
STEP2:在 ListPicker1.AfterPicking事件中,確認連線成功之後,設定相關按鈕為 enabled/ disabled。
 
STEP3:按下按鈕之後,根據 message變數值的內容來發送 “a” 或 “b”。使用 NxtDirectCommand 對NXT指定的 mailbox (本例為 1號),送出 message變數值( “a” 或 “b”)。

 
NXT端程式說明 – LabVIEW
 
使用 Read NXT Mailbox (String)指令來讀取指定 mailbox 內容之後顯示在 NXT螢幕上。延遲時間為 0.5 秒。

lv3

[2014 Robocon雜誌專欄]輕鬆使用Android 裝置控制樂高機器人:機器人感測器如何結合Google雲端圖表

2014 年3月號的 [輕鬆使用Android 裝置控制樂高機器人] 系列來了,結合了機器人感測器與 Google Chart 雲端圖表功能,讓您的機器人在資料呈現上更豐富有趣。泛科學文章連結:http://pansci.tw/archives/57646

文/曾吉弘(CAVEDU教育團隊

MIT 行動學習中心已發表 App Inventor 2 ,省略了需要使用 Java 才能開啟的 Blocks Editor,將其整合在網頁中即可使用,可說是與 Scratch 愈來愈像了。在操作上也將各指令藉由下拉式選單大幅簡化。不過App Inventor 2在指令上與前一版的App Inventor 是差不多的,相信您可以很快上手。請到App Inventor 中文學習網(http://www.appinventor.tw) 來登入App Inventor 2 開發網站並認識更多新功能。

本次是要把樂高NXT的光感測器值,每十筆為單位更新到GoogleChart 雲端圖表來取得折線圖。只要熟悉基本語法就可以產生各式各樣的圖表, 非常方便! 有接觸過App Inventor 的師長朋友們,歡迎從App Inventor 中文學習網下載原始碼回去加入更多有趣的功能。這次的主題範例需用到網路連線,請先確認您的手機是使用Wi-Fi 或3G 行動網路來連上網路,否則將無法顯示Google 雲端圖表。

 

光感測器

樂高NXT 套件中的光感測器前端有兩個燈泡,一個是普通燈泡,另一個則是光敏電阻,可將前方物體的反射光強度由亮到暗(或由白到黑)回傳100~0 之間的整數(integer)。在App Inventor 中,我們使用NxtLightSensor元件的GetLightLevel 指令來取得光感測器值(圖1)。

01

開始玩機器人

範例的機器人只要將一個光感測器接在NXT 主機的3 號輸入端即可。請確認NXT 主機的藍牙是啟動的,接著將NXT 主機與Android 手機進行藍牙配對(註2),完成之後就可以把機器人放到一邊了。啟動藍牙之後您可以從NXT 主機的螢幕左上角看到藍牙的符號。

接下來依序介紹程式的各個功能:

STEP1 登入畫面:

首次進入程式的畫面如圖2a , 您會看到畫面中央載入了CAVE 技術部落格(http://blog.cavedu.com) 的畫面, 這是WebViewer 元件的最重要功能,可用來載入網頁,本範例的Google 雲端圖表也是以此方式載入。另外, 這時只有「連線」按鈕可以按,其它所有按鈕都無法操作。點選「連線」按鈕後進入藍牙裝置清單(圖2b),請找到剛剛配對完成的NXT 主機名稱(本範例為abc),點選之後就會由Android 裝置對NXT 主機發起藍牙連線。順利連線成功的話, 「連線」按鈕會變成不可按的狀態,只有「斷線」按鈕可以按(圖2c)。

STEP2 程式初始化:

在點選連線清單之前(ListPickerConnect 的BeforePicking 事件),需先將清單內容指定為Android 裝置上的藍牙配對清單(圖3a)。點選之後則先測試連線是否成功,成功則將「NXT 主機/ 連線」設為不可點選,「記錄感測器值」與「斷線」等兩個按鈕設為可點選(圖3b)。


圖3a 指定藍牙配對裝置清單。


圖3b 連線成功後啟動相關元件。

 

STEP3 按鈕記錄光感測器值:

每當我們點擊一次「記錄感測器值」這個按鈕時,就會將光感測器當下的數值搭配一個半形逗號組合到sensorValue 這個字串中。接著, 使用count 這個變數來計算一共記錄了幾次,累計到10 次之後,count 變數值會設定為1 代表要重新開始記錄新的十筆資料。並且「產生圖表」這個按鈕會變為可按(圖4)。

04
圖4 按按鈕記錄光感測器值。

STEP4 按鈕取得Google雲端圖表:

Google Chart 雲端圖表讓我們可用超連結的方式來取得各式圖表。以本範例來說,我們只要將十筆光感測器值組合到chart 字串變數的後方, 再由WebViewer 元件去取得這個超連結就可以了。說穿了就是去操弄這個字串,就能取得我們所需要的圖表。讓我們來看看這個chart 這個字串中的一些重要參數:

.http: / /char t .googleapis.com/chart?
.chs=320×300:圖片尺寸為320 x300像素。
.cht=lc:圖表類型為折線圖(linechart)。
. chd=t : : 圖表資料, 我們就是把sensoValue這個變數組合在chart變數之後來組成一個完整的超連結。每筆資料之間需使用「, 」隔開。其餘的參數請您自行參閱Google Chart API網站。

按下這個按鈕( 圖5), 會先把sensorValue 最後一個字元( 就是半形逗號)刪除,接著使用WebViewer.GoToUrl 來載入chart 與sensorValue兩者所組合成的超連結。並且為了讓下次也能順利執行,最後要把sensorValue 內容清空。


圖5 按下按鈕顯示Google 雲端圖表。

STEP5 斷線:

按下「斷線」按鈕之後,會中止藍牙連線(BluetoothClient.Disconnect指令),並使畫面上的各個元件恢復到程式一開始時的狀態(圖6)。


圖6 按下「斷線」按鈕時中斷藍牙連線。

操作

實際執行的時候,請先確認NXT已經開機且藍牙也啟動了(圖7a)。接著在您的Android 裝置上點選畫面中的「NXT 裝置/ 連線」按鈕, 會進到如圖2b 的藍牙清單畫面,點選您所要的NXT 主機名稱並連線成功後,就能按下「記錄感測器值」按鈕來記錄光感測器值(圖7b),連按十次之後,即可點擊「產生圖表」來產生圖表(圖7c)。


圖7a 程式初始畫面。
圖7b 紀錄感測器值時,數值會同時顯示在螢幕最上方。
圖7c 產生Google 雲端折線圖。

小挑戰

我們為各位讀者準備了小挑戰,要不要挑戰看看呢?

  1. 請將本程式改為計時器版本,與機器人成功連線之後,每秒記錄一次光感測器值, 每10秒更新一次畫面。(提示:使用Clock元件)
  2. 請製作下拉式選單(ListPicker)讓使用者可以調整所要顯示的感測器類型,例如聲音、顏色或超音波感測器等等。
  3. 請製作下拉式選單讓使用者可以調整所要顯示的圖表類型,例如折線圖、長條圖等等。(提示:將lc改為bvs就能將圖表改為長條圖)

本次介紹了如何將機器人感測器值藉由Google 雲端圖表來顯示,與自行畫圖相比,這樣做的話畫面會更漂亮,操作也會更簡單囉!

 

歡迎大家由以下連結或掃描以下的QRCode 來下載本程式:

本程式已上架Google play,請到Google Play 搜尋「CAVEDU 教育團隊」就找得到我們的樂高機器人系列app 了。請在App Inventor 中文教學網上直接下載本範例的App Inventor 原始檔與apk 安裝檔。

註1:想學如何開發App Inventor程式嗎?請到App Inventor中文學習網與我們一同學習。
註2:將Android手機設定為可安裝非Google Play下載的程式以及讓手機與樂高NXT主機連線等說明請參考此連結
註3:與NXT連線後如果出現[Error 402]之錯誤訊息請不必理會,程式依然能正確執行。

文章原文刊載於《ROBOCON》國際中文版2014/3月號

[2014 Robocon雜誌專欄]輕鬆使用Android 裝置控制樂高機器人:一步一步讓樂高機器人玩打鼓遊戲

2014 年第一篇 [輕鬆使用Android 裝置控制樂高機器人] 系列來了,要讓您的手機與樂高NXT機器人一起玩音樂,手機可以控制機器人發出四種音符,機器人也能藉由按下不同的觸碰感測器來改變手機畫面顏色。

7a

本文原文刊登於 Robocon 雜誌國際中文版 2014 1月號

文/曾吉弘(CAVE教育團隊

本篇文章將使用三個樂高NXT 觸碰感測器來進行有趣的聲光效果,按下不同觸碰感測器就會讓手機畫面變色, 除此之外,當您點擊手機畫面時,機器人也會發出音效與您同樂。有接觸過App Inventor 的師長朋友們,歡迎從App Inventor 中文學習網下載原始碼回去加入更多有趣的功能。

觸碰感測器

樂高NXT 套件中的觸碰感測器前端有一個橘色按鍵,可藉此偵測是否撞到物體或被壓下。由於內部構造是一個開關(switch),所以只能判斷前端是否被壓下而無程度上的區別。對應的資料型別是布林(boolean)。在App Inventor 中, 我們使用NxtTouchSensor 元件的IsPressed 指令(圖1)來偵測觸碰感測器是否被壓下,如果被壓下則為true ,反之為false。

圖1 App Inventor 偵測觸碰感測器是否按下

開始玩機器人

今天的機器人有點不一樣,不需要馬達,請拿出三個觸碰感測器分別接在NXT 主機的輸入端1 到3 ,組裝好如圖2(註1)。請確認NXT 主機的藍牙是啟動的,接著將NXT 主機與Android手機進行藍牙配對(註2),完成之後就可以把機器人放到一邊了。啟動藍牙之後您可以從NXT 主機的螢幕左上角看到藍牙的符號。

圖2 組裝好的樂高NXT 機器人。

接下來依序介紹程式的各個功能:

STEP1 登入畫面:首次進入程式的畫面如圖3a , 只有「連線」按鈕可以按,其它所有按鈕都無法操作。點選「連線」按鈕後進入藍牙裝置清單(圖3b),請找到剛剛配對完成的NXT 主機名稱(本範例為abc),點選之後就會由Android裝置對NXT 主機發起藍牙連線。順利連線成功的話,就可看到淺灰色的鼓面,且「連線」按鈕變成不可按的狀態,只有「斷線」按鈕可以按(圖3c)。

圖3a 程式首次執行的畫面。
圖3b 點選連線按鈕後進入藍牙裝置清單。
圖3c 連線成功後才可看到鼓面。

STEP2 程式初始化:在點選連線清單之前(ListPicker Connect 的BeforePicking 事件),需先將清單內容指定為Android 裝置上的藍牙配對清單(圖4a)。點選之後則先測試連線是否成功,成功則將「斷線」按鈕設為不可點選、「斷線」按鈕設為可點選並顯示Canvas 畫布元件(圖4b)。

圖4a 指定藍牙配對裝置清單。

圖4b 連線成功後啟動相關元件。

STEP3 使用副程式管理觸碰感測器狀態:我們宣告了三個變數t1、t2 與t3 來儲存三個觸碰感測器的狀態(圖5a)。接著宣告一個名為checkTouch 的副程式來管理這三個變數,只要某個觸碰感測器被壓下,就會將對應的變數改為1 ,反之則為0 ,最後回傳這三個變數的加總值(圖5b),我們就是根據這個加總值來改變Canvas 畫布元件的背景顏色。

圖5a 三個用來儲存觸碰感測器狀態的變數。

圖5b checkTouch 副程式。

STEP4 改變Canvas背景顏色:為了讓程式能夠持續監控三個觸碰感測器的狀態, 我們使用了一個Clock 元件,並設定其計時器更新頻率為100 ,代表每0.1 秒偵測一次觸碰感測器狀態。在Clock.Timer 事件中, 藉由呼叫checkTouch 副程式並根據它的回傳值(0、1、2、3) 將Canvas 背景顏色改為淺灰色、綠色。這裡回傳的數值代表被按下的觸碰感測器數目, 也就是說當您壓下1 號與3 號觸碰感測器時,這時與您壓下2 號與3 號以及1 號與2 號的意義是相同的,都會使手機畫面變為青綠色( 圖6 中的Cyan)。同時我們也會把目前偵測到被壓下的觸碰感測器個數顯示在手機畫面上。

圖6 每0.1 秒偵測一次觸碰感測器狀態。

STEP5 點擊畫面播放讓機器人播放不同音效:當我們點擊Canvas 元件時, 會根據點擊位置讓機器人發出四種音效。Canvas 元件長寬各為320 像素, 所以我們取中點(160,160) 將畫面分成四等分( 圖7a), 點擊左上、右上、左下與右下時,會讓樂高NXT 機器人發出La、Sol、Mi 與Do 四種音效(圖7b、圖7c), 每次播放長度為0.3秒,這是藉由NxtDirectCommand 的PlayTone 指令所達成的。

圖7a Canvas 元件切成四等分。

圖7b 左上播放La 音, 頻率440/ 右下播放Do 音,頻率262 。

圖7c 右上播放Sol 音,頻率392/ 左下播放Mi 音,頻率330 。

 

STEP6 斷線:按下「斷線」按鈕之後,會中止藍牙連線(BluetoothClient.Disconnect指令),並使畫面上的各個元件恢復到程式一開始時的狀態(圖8)。

圖8 按下「斷線」按鈕時中斷藍牙連線。

 

操作

實際執行的時候,請先確認NXT 已經開機且藍牙也啟動了。接著在您的Android 裝置上點選畫面中的「連線」按鈕,會進到藍牙清單畫面,點選您所要的NXT 主機名稱並連線成功後,就能按下觸碰感測器來控制手機畫面顏色,或者點擊手機畫面來控制機器人發出不同的音效(圖9a ∼ 9c)。

圖9a 按下任一個觸碰感測器,畫面為綠色。
圖9b 按下任兩個觸碰感測器,畫面為青綠色。
圖9c 按下所有的觸碰感測器,畫面為紅色。

 

歡迎大家由此連結或掃描以下的QRCode 來下載本程式:

本程式已上架Google play,請到Google Play 搜尋「CAVE 教育團隊」就找得到我們的樂高機器人系列app 了。請在App Inventor 中文教學網上直接下載本範例的App Inventor 原始檔與apk 安裝檔。

註1: 想學如何開發App Inventor 程式嗎? 請到App Inventor 中文學習網(http://www.appinventor.tw)與我們一同學習。

註2: 將Android 手機設定為可安裝非Google Play 下載的程式以及讓手機與樂高NXT 主機連線等說明請參考:http://www.appinventor.tw/setup。

註3: 與NXT 連線後如果出現[Error 402] 之錯誤訊息請不必理會,程式依然能正確執行。

文章原文刊載於《ROBOCON》國際中文版2014/1月號

[LabVIEW] 使用鍵盤的 2 4 6 8 數字鍵來控制NXT機器人前進後退與左右轉

http://lab.cavedu.com/keyboard-nxt  <- 程式碼請由此下載

本範例使用鍵盤的 2 4 6 8 數字鍵來控制NXT機器人前進後退與左右轉,2 4 6 8 數字鍵可說是許多賽車或是射擊遊戲的預設控制鍵,操作起來相當直覺。
 
本範例的重點在於程式上方的 Connectivity指令取得鍵盤的狀態,使用 Array to Cluster 指令將 Aquire Input Data指令的 keys pressed 欄位拆出來之後,再使用 Ubundle by Name 指令將 cluster 拆成一個個整數純量,每一個按鍵都是由一個不同的整數所代表。接著將第一個 keys pressed [0] 這個整數連到 case structure,代表使用每次按下鍵盤按鍵所代表的數值來控制 case structure。
 
由於每一個鍵盤按鍵都是對應到一個整數值,所以您可以看到 case structure 的 case selector 變成了藍色,在此我們只要讓程式可以辨識到 2 4 6 8 數字鍵是否被按下即可 (當然也要設定機器人的動作),其他的按鍵都會被歸類在 [“0”, Default] 這個 case 中,並讓機器人停下來。
 
 請注意,Aquire Input Data指令的 keys pressed 欄位所丟出的是整數陣列 (integer array),根據您按下按鍵的順序將對應的整數值放入陣列中。
延伸閱讀 [CAVE實驗室 LabVIEW for Arduino分部],使用鍵盤、滑鼠與 XBOX搖桿來控制 Arduino LED閃爍!
 
所以 NUMPAD_6 就設定讓機器人右轉,NUMPAD_2 後退,NUMPAD_8 前進,其他按鍵都會讓機器人停下來。您可下載程式碼之後自行調整機器人的動作參數,或更改為其他的鍵盤按鍵。
 


MindSensors 系列產品 更新 MindSensors for EV3韌體

MindSensors 官方網頁說明

在樂高 EV3 機器人套件上市之後,部分 MindSensors 系列產品需根據 EV3主機來進行最佳化才可以在 EV3主機上來使用 (如果您使用NXT機器人則沒有差別),請根據以下步驟來操作。請注意在此所謂的EV3韌體是指 MindSensors 系列產品的韌體,而非樂高 EV3主機的作業系統版本。以下動作需使用 NXT主機來完成。
 
請參考本篇[如何匯入其它指令模組到EV3環境]來將 MindSensor 的EV3系列指令匯入EV3軟體中。

[Robocon雜誌專欄]輕鬆使用Android 裝置控制樂高機器人:讓機器人前進指定距離

文/曾吉弘(CAVE教育團隊

 

在7 月號的專欄中, 我們介紹了如何使用Slider 滑桿元件來控制樂高機器人馬達的轉速與方向。本期我們將介紹如何使用樂高馬達中的編碼器(encoder)來讓機器人前進指定的距離,並且深入介紹App Inventor 中對於樂高機器人的SetOutputState 低階控制指令。

樂高NXT 伺服馬達

樂高NXT 的馬達是所有樂高馬達中輸出扭矩最大也是最有份量的一款,另一方面,它也是唯一有配置角度感應器的馬達,經過計算之後可求出機器人行走的距離或轉動的方位角,非常方便。

本期專題將使用App Inventor 中,NxtDrive 元件的MoveForward 指令與NxtDirectCommand 的setOutputState 指令來控制樂高NXT 馬達。圖1 中是NxtDrive 的屬性設定欄位,由於本範例要控制機器人上的兩個馬達,所以需要兩個NxtDrive 元件, 將其DriveMotors 欄位分別設為B 與C ,代表控制樂高NXT 機器人的B 與C馬達。WheelDiameter 代表目前所使用的輪胎直徑,單位為公分。以本範例所使用的輪胎直徑為5.6 公分,因此請填入5.6。樂高的輪胎胎皮上都會標示輪胎的尺寸(圖2),請依照您所選用的輪胎填入正確的數字,否則機器人行走的距離就不正確啦。

Continue reading

[文章更新] leJOS 用於樂高的 Java 程式語言

leJOS是什麼?


leJOS NXJ 是可執行於樂高NXT主機上的JVM (Java Virtual Machine)。在2000年,一些程式愛好者提出一個名為「TinyVM」的計畫並推出第一版的leJOS,因此可以在RCX上進行物件導向程式設計,並可以用標準的Java語法來發展機器人應用程式。leJOS的穩定成長可歸功於整合了許多特色和Java的功能,leJOS可以在各種作業系統上開發,例如Windows、Linux 和Mac OS,除此之外,您也可以在Android裝置上來開發機器人應用程式。
 
  時至今日 leJOS 已經是相當成熟的機器人開發環境,除了使用正規Java語法之外,也針對機器人開發出許多對應的套件,例如各種特殊感應器存取,定位與導航等等。另外用於新一代樂高機器人的 leJOS 也即將推出囉,敬請期待,並請參考本團隊出版的 [機器人程式設計與實作   使用JAVA]第二版。

 
從leJOS可以學到什麼?
 

   1. 使用正規Java語法

2. 網路通訊與 Android 行動裝置

 
   3. 藍牙通訊與I2C傳輸應用4. 定位與導航

如何安裝leJOS環境?

CAVE來幫您!2013全國智慧型機器人科技創意競賽@萬能科技大學

想要參加 B組 [行動裝置遙控機器人障礙競速] 的同學, 在 App Inventor 中文學習網 有很詳盡的說明唷, 只要用App Inventor 就能輕鬆寫出自己的手機遙控機器人程式, 樂高或是其它控制器(Arduino)都可以唷!

[youtube=http://www.youtube.com/watch?v=UvvrKMA8gpc]

以下是活動內容:

2013全國智慧型機器人科技創意競賽

一、競賽時間:102 年10月19日(星期六)上午10:00~15:30。

二、競賽報名日期:102/09/01~102/09/30(網路線上報名)。

三、頒獎日期:102 年10月19日(先頒發獎品;獎狀會後郵寄)。

四、競賽地點:本校學生活動中心二樓。

競賽項目:

Continue reading

130911 LabVIEW機器人創新與創作研習營@亞太創意技術學院

09/11   星期三風光明媚的下午, CAVE 來到苗栗頭份的亞太創意技術學院, 講 LabVIEW 控制 NXT機器人,  這是連續三周, 每週三下午的課程。

第一天先由 LabVIEW 基礎開始, 接著是從 LabVIEW 搭配 NXT機器人做為控制端與接收端, 不但可以直接看到NXT感測器與主機狀態的變化, 還可以從畫面上的按鈕或拉霸來控制馬達. 很方便呢!

有興趣的朋友請延伸閱讀 CAVE實驗室的 LabVIEW頁面 , 以及 LabVIEW for Arduino頁面

2013-09-11 12.41.29

 

Continue reading

[Arduino / NXT專案] LineLeader 循跡機器人

LineLeader 光感應器陣列將八個光感應器排成一排。 專門用來處理各種討厭的軌跡, CAVE以往曾經發表數篇文章來說明如何應用一些數學方法來讓機器人循跡的速度更快。

本影片可以從OpenElectrons 官網看到, 由本團隊謝宏恩老師所提供。 使用Arduino UNO + NXShield-D擴充板取代NXT主機。

歡迎到 http://lab.cavedu.com/file 下載謝老師的LineLeader與Arduino結合應用教學文件,以及Arduino source code。

[youtube=https://www.youtube.com/watch?feature=player_embedded&v=tMXys7t-_KQ]

其他更多影片請看:

Arduino line following robot with P control method #1

[youtube=https://www.youtube.com/watch?feature=player_embedded&v=GTxOZX6jK74]

Arduino line following robot with P control method #2

[youtube=https://www.youtube.com/watch?feature=player_embedded&v=1GFVkYbPYGw]

NXT Line Follower – P control

[youtube=https://www.youtube.com/watch?feature=player_embedded&v=0ZMz-CS0bPY]

[Arduino / NXT專案] SumoEyes 避障機器人

SumoEyes感測器特別的地方在於它不是提供距離數值, 而是以較大範圍搭配更廣的可視角。

這樣其實是很實用的, 因為如果我們要用超音波測很遠的物體時, 由於機器人持續在運動, 所以就好像用吸管看東西一樣 -> 視角會變得很窄。 SumoEyes可以先約略提供物體的遠近與方位之後, 再由其他的測距儀來偵測距離。

應該是由不同sensor來專業分工, 而並非期待有一顆萬能的感測器一票玩到底。

也和大家分享一件開心的事, http://mindsensors.com/  MindSensors官網的SumoEyes影片是由CAVE的盧玟攸老師所提供, 拍拍手唷!!

歡迎到 http://lab.cavedu.com/file 下載盧老師的SumoEyes感測器測試報告. 以及Arduino source code。

影片, 使用Arduino UNO + NXShield-D取代NXT主機。

[youtube=https://www.youtube.com/watch?feature=player_embedded&v=nDHIvSuOhVc]