Category Archives: 未分類資料夾

9月19日CAVEDU Day有什麼?@(九)Raspbook經典款

MG_2556 MG_2551

盡管Raspbook已經推出第二板Raspbook Shield,但Raspbook密底板的文青外殼加上Raspberry pi 創辦人Eben Upton的親筆簽名,使其還是擁有無法令人忘懷的經典啊!

9/19CAVEDU Day讓我們一起來重現經典。

展覽資訊  報名請按我

簡介:

Raspberry Pi是一台單核心電腦但價格便宜且大小與一張信用卡差不多大,但每次要撰寫程式時卻不得額外準備螢幕、鍵盤以及滑鼠,為了要方便能隨身攜帶,起初我想參照邁克爾‧卡斯特(Michael Castor)的《自製Raspberry Pi平板電腦》這篇文章來製作一台Raspberry Pi平板,但考量到獨創性以及現在市售的平板價格比較便宜,所以最後我決定改為製作一臺短時間內可以完成、就算是新手也可以毫無困難地體驗動手做精神的Raspberry Pi筆記型電腦(以下稱為Raspbook),並利用雷射切割機技術來製作外殼。

作品出處:

薛皓云、戴于凱共同發想

作者:

薛皓云、戴于凱

9月19日CAVEDU Day有什麼?@(八)可愛機器人Rapiro

圖片1

可愛的小機器人耶!這次走闔家光臨的路線果然有可愛風格的作品呢~

展覽資訊  報名請按我

簡介:

Rapiro是一個可愛且易於組裝的人形機器人套件,配備了一個Arduno兼容的控制器板和12顆伺服馬達讓RAPIRO能靈活的活動。搭配上Raspberry Pi控制後,RAPIRO無限可能都取決於你創意發揮。

參考網站:

http://www.rapiro.com/

 

9月19日CAVEDU Day有什麼?@(七)arduino智慧安全帽

圖片1

這項作品是今年暑假實習生的作品喔!9/19歡迎對Maker文化有興趣的朋友來CAVEDU Day走走看看~

展覽資訊  報名請按我

簡介:

使用Arduino配合陀螺儀偵測頭部運動,駕駛打瞌睡時,用蜂鳴器及震動馬達叫醒駕駛、警報燈閃燈警示其他用路人。

參考資料:

Jeff Rowberg 陀螺儀函式庫

作者:

陳韋綸

9月19日 CAVEDU Day有什麼?@(三) 東京Maker Fairer 交換物品介紹:Arduino無線供電座

圖片2

CAVEDU Day除了會有展品的展出之外,還會分享本團隊八月初到東京Maker Faire的所見所聞,9/19快來華山找我們玩!

展覽資訊  報名請點我

簡介:

此裝置在板子下方有線圈與電路連接,當放置於無線充電器的上方時,藉由電磁感應原理可讓鋰電池充電。供電給Arduino的方式讓正負極接觸Arduino的正負極腳位

9月19日CAVEDU Day有什麼?@(六)Raspbook Shield

 

shield

Raspnook Shield尚未在台灣展出過,在Tokyo Maker Faire展出時有不錯的評價,9月19日快來CAVEDU Day一睹為快吧!

展覽資訊  報名請按我

簡介:

Raspnook Shield是Raspbook的衍生版本,利用常見的「槍箱」(EVA泡綿與氣密箱)來整合螢幕與Raspberry Pi,更將核心升級為Raspberry Pi 2,也將USB與3.5mm音訊孔延伸至以3D列印做成的IO面板,更加上了散熱風扇確保Raspberry Pi的工作效率。

作者:

游允赫

 

[S4A]Scratch X for Arduino安裝詳解

S4A在小學興起一股熱潮,目前較多使用Scratch 2.0,也就是離線版的Scratch來與Arduino互通,網頁版的S4A,Scratch X在介面上與Scratch 2.0相去不遠,優點是可以線上編輯,不需要再下載Scratch安裝檔,不過要使用網頁版的S4A,也是要經過一番手續才行,幸好並不會太困難,本篇由淡江大學生 邱柏憲撰寫,請依照以下步驟進行:

1.先於Arduino的網站下載Arduino(任意版本皆可),並於安裝後打開裝置管理員確認Arduino的驅動程式已確實安裝。

arduino

2.前往http://scratchx.org/#extensions 選擇Arduino。

S4A1

接下來會出現此圖示 說明此為試用版 點選右邊選項即可

S4A2

出現紅色燈號表示要安裝scratch的plug-in物件

S4A3

3.於google chrome的右上角選單選擇設定→擴充功能→取得更多擴充功能

→輸入scratch後安裝紅框內的程式→重新啟動google chrome。

S4A4

4.啟動後會跳出右上角的訊息框 點選左邊的選項即可

S4A5

5.回到ScratchX Arduino燈號應為黃燈 點擊Arduino會跳出選單,點選About Arduino extension(上方的)→點選Scratch Browser Plugin→點選Windows (other web browsers) →下載完後安裝

S4A6

S4A7

6.在網址部分打上chrome://flags/#enable-npapi將NPAPI的部分設定為啟用

S4A8

7.回到ScratchX如果燈號為綠燈於Arduino端燒入StandardFirmata此程式後即可開始使用S4A

如仍為黃燈請使用下列的方法。

a.於網址: https://www.dropbox.com/s/ceyt4zecwz0386d/GoogleChromePortable_39.0.2171.95.exe?dl=0

下載舊版的GoogleChrome並開啟(此為免安裝版本)

b.重複上列的2到5步驟

c.輸入網址輸入chrome://components接著點擊pepper-flash的檢查更新,之後會自動更新完成

S4A9

d.重新啟動Google Chrome後於右上角選單選擇設定→擴充功能→移除Scratch Device Plugin HelperS4A10

e.回到ScratchX右上方會有個被封鎖的圖示,點擊後將其設定為永久允許並重新啟動Google Chrome後再回到ScratchX  Arduino的燈號即會轉為綠燈於Arduino端燒入StandardFirmata此程式後即可開始使用S4A。

S4A11

150720 漫談 DIY 二輪平衡車@FutureWard

Maker Faire Taipei 結束過了一個半月了,這次找齊了Segway比賽的三組人馬來向大家分享Segway的製作經驗。

01 02 03

第一組上台是使用樹莓派、電動車馬達&摩托車輪胎製作平衡車的 好朋友-Kevin先生

20150712_133724 20150712_131835

第二祖的是使用Arduino開發版、腳踏車輪胎製作機構的馥林文化-郭有迪先生

恩~聽完兩組分享,馬達驅動晶片燒掉好像是必定會發生的劇情

20150712_13474720150712_135912

最後是來自聯發科的黃傑,分享在大學所學習的機構經驗,最後製作出低底盤、鋰電池供電的二輪平衡車,聽他的分享真的會讓人熱血沸騰阿。最後樓下有二輪平衡車試乘會,騎著騎著會讓人想把他騎走,不行不行,想騎的話自己也來做一台吧!!

20150712_14255020150712_132051

樓上也有黃傑與郭有迪先生帶來的藍芽遙控車可以試玩,果然Make後的經驗分享可以幫助大家教學相長,往後還會有相關的經驗分享會,歡迎大家一起來參加。(不用錢喔~…..大概)

20150712_14562920150712_150602

以下是三位分享時所使用的簡報檔案




 

 

[Unity3D] Arduino for Unity控制Led燈亮滅

今天要來跟大家分享如何使用Unity(輸入)來控制Arduino(輸出),在這邊我們會使用到序列通訊(SerialPort)的指令,您可以把序列通訊的角色看成是翻譯,作用在於充當Arduino與Unity之間溝通的橋樑。當然,這一切都只有簡單的幾行程式就能夠做到了喔!(使用Arduino UNO、Untiy5.0)

準備材料:

1.Arduino一塊

2.麵包板一塊

3.Led一顆

4.色碼電阻:紅紅棕

5.跳線

Step1:將Led接在13號腳位,再接一個電阻。

Step2:在Arduino IDE編寫如下的程式碼並上傳至Arduino。

2

在Arduino使用序列通訊會用到的幾個指令

1.Serial.begin():設定鮑率

2.Serial.read():讀取值

3.Serial.print():寫值

程式的架構很簡單,分為二部份:1.讀值;2.Led亮暗。由於我們將Led做為輸出,所以要先設定pingMode(腳位,OUTPUT),接著當Untiy傳過來的值為1時,Led亮digitalWrite(腳位,HIGH);反之值為0時,Led暗digitalWrite(腳位,LOW)。

Step3:在Untiy的Asset下建立一個C#腳本,命名為write,編寫如下程式碼。

3

在Untiy中要與Arduino溝通,同樣要使用到序列通訊SerialPort的指令。

1.using System.IO.Ports:調用控制序列埠的類別。

2.SerialPort 變數 = new SerialPort(“COM8”,9600):設定連接埠與鮑率,請與Arduino實際連接情況一致。

3.變數.Open();變數.IsOpen:開啟序列埠連線,是否開啟。

4.變數.Read();變數.Write():讀值、寫值。

Step4:建立一個空物件,並將write腳本丟進物件。

Step5:設定。在file->Build Settings->Player Settings->Other Settings展開後往底下找到Api Compatibility Level,將.Net 2.0 Subs改為.Net 2.0。如此一來,在調用控制序列埠時才不會出錯。

1

Step6:執行。在Unity遊戲執行畫面中分別按下a、b,我們就可以看到Led的燈亮、燈滅囉!

[Unity3D]初階技能-子彈發射

本周二到建國科大教學Unity3D,介紹了基本操作還有熟悉介面,最後做出子彈發射的應用,其實原理很簡單,就是讓物件每秒能從A點移動到B點,要做到子彈發射的效果,一、複製;二、移動;三、消失,以下簡單步驟講解:

一、複製:子彈發射的效果是按一下按鍵便發射一顆子彈,透過「Instantiate()」這個指令,可在每按一下按鍵便複製一個物件。

二、移動:物件移動指令為「transform.Translate(x,y,z)」。

三、消失:Destroy(gameObject,秒數),此指令為摧毀物件,因為複製品存在場景上會降低執行速度,故用此指令。

STEP1 建立空物件及圓形球體:我們要把空物件當成發射點,圓形球體當成子彈。1-1

STEP2 重新命名並建立prefab:將空物件命名為Fire,球體命名為Bullet,拖曳球體至底下的Asset區變成prefab(預製品)後,刪除本體。建立prefab的好處後面會解釋。

1-2

STEP3 建立二個JavaScript:在Asset區按滑鼠右鍵,建立二個腳本(JavaScript),分別命名為Fire、Bullet後,點二下進入程式編寫畫面。

1-3

STEP4編寫程式:

Fire程式碼

1-4

Bullet程式碼

1-5

在Bullet的程式碼中有Destroy(摧毀)指令,簡單來說它會摧毀物件,預製品不存在於場景上,複製出來的克隆物(clone)被摧毀後,預製品本身不會被摧毀,這是預製品的好處。

STEP5 放入腳本:將腳本Fire放入空物件Fire;腳本Bullet放入預製品Bullet中,在預製品Bullet中的腳本speed變數記得設定數值,Fire物件裡的腳本Bullet變數記得放入預製品。

1-6

1-7

最後執行程式即可看到效果。子彈可以再加入其它的效果,例如逐漸變小、貼上發光材質…等。

1-8

附上打包好的unity檔點此下載,簡單易學好上手喔!!

[Electric Imp 物聯網小惡魔]以網頁模式觀看溫濕度感應器

Electric IMP小惡魔,除了可以在ElectricIMP的網頁上進行coding與上傳資料,我們還能在agent code pane(代理人程式碼區),撰寫程式碼,將我們感測到的溫度數字上傳到一般網頁中。

如果想深入了解IMP小惡魔可以看下列幾篇文章

認識 Electric Imp 線上開發環境環境建置與 BlinkUp app溫濕度感應計

imp01

在執行程式之後,在agent code pane(代理人程式碼區),點選這個device(裝置)專用的網址,我們不僅可以將IMP的數值顯示在開發網頁中,IMP也可以將數值呈現在一個獨立的頁面

imp02

IMP的程式是以C語言、JAVESCRIPT與HTML的語法為基礎做撰寫,要達成下列效果,必須下列使用IMP專屬的函式,將agent code pane(代理人程式碼區)、device code pane(裝置程式碼區)之間做連結,進行資料傳遞。

1、agent.on(string, function)

2、agent.send(string, object)

3、device.on(string, function)

 

我們在device code pane(裝置程式碼區)使用agent.on(string, function)agent.send(string, object)這兩個函式,裝置接險與程式碼可以參考這篇溫濕度感應計,文章最下方有附device code pane的完整程式碼,主要傳遞訊息的部分在176-213行,讓我們先直接看這個部分。

1、我們使用agent.on(“pong”, returnFromImp)等待從agent code pane(代理人程式碼區)傳來的識別資訊”pong”,並將資訊的數值傳送到副函式returnFromImp之中。

2、將溫度感應器的溫度數值藉由agent.send(“ping”, data_temp)函式,將一個識別資訊”ping”,以及想要傳送的溫度資訊data_temp,傳送至agent code pane(代理人程式碼區)

function loop() {
    imp.wakeup(INTERVAL, loop);
    local data = dht11.read();
    local data_hum,data_temp;
    server.log("Running "+imp.getsoftwareversion()+", Free Memory: "+imp.getmemoryfree());
    data_hum= data.rh;
    server.log(format("Relative Humidity: %0.1f",data_hum)+" %");
    //server.log(format("Relative Humidity: %0.1f",data.rh)+" %");
    data_temp= data.temp;
    server.log(format("Temperature: %0.1f C",data_temp));
    //server.log(format("Temperature: %0.1f C",data.temp));
    ping(data_temp);
}

spi         <- hardware.spi257;
clkspeed    <- spi.configure(MSB_FIRST, SPICLK);

dht11 <- DHT11(spi, clkspeed);
////////////////////////////////////////////////////////////////////////////////////
function ping(data_temp) 
{
    // Send a 'ping' message to the server with the current millis counter
    
    agent.send("ping", data_temp);
}

function returnFromImp(startMillis)
{
}

agent.on("pong", returnFromImp);
 
// Start the ping-pong

//ping();

//////////////////////////////////////////////////////////////////////////////
loop();

 

 

接著在agent code pane(代理人程式碼區)使用device.on(string, function)http.onrequest(function)這兩個函式,

1、使用device.on(“ping”, startTime)函式等待從device code pane(裝置程式碼區)傳來的識別資訊”ping”並將溫度資訊data_temp傳送至副函式startTime

2、副函式startTime會先在網頁下方的 log pane(記錄區)顯示一次接收到的溫度數值

3、http.onrequest(requestHandler)會更新這個裝置專屬網頁的內容,每當我們對網頁進行重新整理,http.onrequest(requestHandler),便會到副函式requestHandler抓取最新數值response.send(200, format(“Temperature: %0.1f C”,global_data_temp));

 

agent code pane(代理人程式碼區)的完整程式碼

global_data_temp <- 45.5;
global_data_hum <- 45.5;

function startTime(data_temp)
{
    server.log(format("agent Temperature: %0.1f C",data_temp));
    server.log(data_temp);
    
    global_data_temp = data_temp;
    // Send the device a 'pong' message immediately
    //device.send("pong", time);
}


function requestHandler(request, response) {
  // send a response back to whoever made the request
  server.log("http refresh");
  response.send(200, format("Temperature: %0.1f C",global_data_temp));
  //response.send(200, "LED OK ");
}
http.onrequest(requestHandler);


device.on("ping", startTime);

 

device code pane(裝置程式碼區)的完整程式碼

// Copyright (c) 2014 Electric Imp
// This file is licensed under the MIT License
// http://opensource.org/licenses/MIT
// Class for DHT11/RHT03 Temp/Humidity Sensor

const SPICLK = 937.5;
const INTERVAL = 5; // time between readings in seconds


// Class to read the DHT11/DHT22 family of temperature/humidity sensors
// See http://akizukidenshi.com/download/ds/aosong/DHT11.pdf
// These sensors us a proprietary one-wire protocol. The imp
// emulates this protocol with SPI. 
// To use:
//  - tie MOSI to MISO with a 10k resistor
//  - tie MISO to the data line on the sensor
class DHT11 {
    static STARTTIME_LOW     = 0.020000;    // 20 ms low time for start
    static STARTTIME_HIGH    = 0.000020;  // 20 us min high time for start
    static STARTTIME_SENSOR  = 0.000080;  // 80 us low / 80 us high "ACK" from sensor on START
    static MARKTIME          = 0.000050;  // 50 us low pulse between 0 or 1 marks
    static ZERO              = 0.000026; // 26 us high for "0"
    static ONE               = 0.000075;  // 70 us high for "1"
    
    _spi                 = null;
    _clkspeed            = null;
    _bittime             = null;
    _bytetime            = null;
    _start_low_bits      = null;
    _start_low_bytes     = null;
    _start_high_bits     = null;
    _start_high_bytes    = null;
    _start_ack_bits      = null;
    _start_ack_bytes     = null;
    _mark_bits           = null;
    _mark_bytes          = null;
    _zero_bits           = null;
    _zero_bytes          = null;
    _one_bits            = null;
    _one_bytes           = null;
    
    // class constructor
    // Input: 
    //      _spi: a pre-configured SPI peripheral (e.g. spi257)
    //      _clkspeed: the speed the SPI has been configured to run at
    // Return: (None)
    constructor(spi, clkspeed) {
        _spi = spi;
        _clkspeed = clkspeed;
    
        _bittime     = 1.0 / (_clkspeed * 1000);
        _bytetime    = 8.0 * _bittime;
        
        _start_low_bits      = STARTTIME_LOW / _bittime;
        _start_low_bytes     = (_start_low_bits / 8);
        _start_high_bits     = STARTTIME_HIGH / _bittime;
        _start_high_bytes    = (_start_high_bits / 8);
        _start_ack_bits      = STARTTIME_SENSOR / _bittime;
        _start_ack_bytes     = (_start_ack_bits / 8);
        _mark_bits           = MARKTIME / _bittime;
        _mark_bytes          = (_mark_bits / 8);
        _zero_bits           = ZERO / _bittime;
        _zero_bytes          = (_zero_bits / 8);
        _one_bits            = ONE / _bittime;
        _one_bytes           = (_one_bits / 8);
        
        // // Pull the signal line up
        _spi.writeread("\xff");
        imp.sleep(STARTTIME_LOW);
    }
    
    // helper function
    // given a long blob, find times between transitions and parse to 
    // temp and humidity values. Assumes 40-bit return value (16 humidity / 16 temp / 8 checksum)
    // Input: 
    //      hexblob (blob of arbitrary length)
    // Return: 
    //      table containing:
    //          "rh": relative humidity (float)
    //          "temp": temperature in celsius (float)
    //      if read fails, rh and temp will return 0
    function parse(hexblob) {
        local laststate     = 0;
        local lastbitidx    = 0;
        
        local gotack        = false;
        local rawidx        = 0;
        local result        = blob(5); // 2-byte humidity, 2-byte temp, 1-byte checksum
    
        local humid         = 0;
        local temp          = 0;
        
        // iterate through each bit of each byte of the returned signal
        for (local byte = 0; byte < hexblob.len(); byte++) {
            for (local bit = 7; bit >= 0; bit--) {
                
                local thisbit = (hexblob[byte] & (0x01 << bit)) ? 1:0;
                
                if (thisbit != laststate) {
                    if (thisbit) {
                        // low-to-high transition; watch to see how long it is high
                        laststate = 1;
                        lastbitidx = (8 * byte) + (7 - bit);
                    } else {
                        // high-to-low transition;
                        laststate = 0;
                        local idx = (8 * byte) + (7 - bit);
                        local hightime = (idx - lastbitidx) * _bittime;
                        
                        // we now have one valid bit of info. Figure out what symbol it is.
                        local resultbyte = (rawidx / 8);
                        local resultbit =  7 - (rawidx % 8);
                        //server.log(format("bit %d of byte %d",resultbit, resultbyte));
                        if (hightime < ZERO) {
                            // this is a zero
                            if (gotack) {
                                // don't record any data before the ACK is seen
                                result[resultbyte] = result[resultbyte] & ~(0x01 << resultbit);
                                rawidx++;
                            }
                        } else if (hightime < ONE) {
                            // this is a one
                            if (gotack) {
                                result[resultbyte] = result[resultbyte] | (0x01 << resultbit);
                                rawidx++;
                            }
                        } else {
                            // this is a START ACK
                            gotack = true;
                        }
                    }
                }
            }
        }
        
        //server.log(format("parsed: 0x %02x%02x %02x%02x %02x",result[0],result[1],result[2],result[3],result[4]));
        humid = (result[0] * 1.0) + (result[1] / 1000.0);
        if (result[2] & 0x80) {
            // negative temperature
            result[2] = ((~result[2]) + 1) & 0xff;
        }
        temp = (result[2] * 1.0) + (result[3] / 1000.0);
        if (((result[0] + result[1] + result[2] + result[3]) & 0xff) != result[4]) {
            return {"rh":0,"temp":0};
        } else {
            return {"rh":humid,"temp":temp};
        }
    }
    
    // read the sensor
    // Input: (none)
    // Return:
    //      table containing:
    //          "rh": relative humidity (float)
    //          "temp": temperature in celsius (float)
    //      if read fails, rh and temp will return 0
    function read() {
        local bloblen = _start_low_bytes + _start_high_bytes + (40 * (_mark_bytes + _one_bytes));
        local startblob = blob(bloblen);
        for (local i = 0; i < _start_low_bytes; i++) {
            startblob.writen(0x00,'b');
        }
        for (local j = _start_low_bytes; j < bloblen; j++) {
            startblob.writen(0xff,'b');
        }
        
        //server.log(format("Sending %d bytes", startblob.len()));
        local result = _spi.writeread(startblob);
        return parse(result);
    }
}



function loop() {
    imp.wakeup(INTERVAL, loop);
    local data = dht11.read();
    local data_hum,data_temp;
    server.log("Running "+imp.getsoftwareversion()+", Free Memory: "+imp.getmemoryfree());
    data_hum= data.rh;
    server.log(format("Relative Humidity: %0.1f",data_hum)+" %");
    //server.log(format("Relative Humidity: %0.1f",data.rh)+" %");
    data_temp= data.temp;
    server.log(format("Temperature: %0.1f C",data_temp));
    //server.log(format("Temperature: %0.1f C",data.temp));
    ping(data_temp);
}

spi         <- hardware.spi257;
clkspeed    <- spi.configure(MSB_FIRST, SPICLK);

dht11 <- DHT11(spi, clkspeed);
////////////////////////////////////////////////////////////////////////////////////
function ping(data_temp) 
{
    // Send a 'ping' message to the server with the current millis counter
    
    agent.send("ping", data_temp);
}

function returnFromImp(startMillis)
{
}

agent.on("pong", returnFromImp);
 
// Start the ping-pong

//ping();

//////////////////////////////////////////////////////////////////////////////
loop();

Raspberry Pi 教學-燒錄SD卡(For Mac OS X)

本篇內容是cavedu實習生-袁佑緣使用MAC學習樹莓派的心得,使用Mac內建的終端機就可以燒錄樹莓派的IMG檔案到樹莓派,我們一起來看看吧~~

一、準備材料:

1.Raspberry Pi BB+

2.下載最新Raspbian作業系統的映像檔(官方版本)(cavedu樹莓派opencv版本)

3.一張容量大於4GBSD卡(使用opencv版本容量最少需要8G)

4.網路線(於網路連線和電腦連線時使用)

5.micro USB傳輸線+USB充電器

Rpi_mac01

二、燒錄Raspbian映像檔

1.SD卡插入mac筆電

2.在mac的系統程式開啟終端機(Termminal)

3.輸入指令:diskutil list,查詢筆電的硬體狀態,列出如下圖的表

Rpi_mac02

 

這個表會列出這台mac筆電所擁有的硬碟,也包括Mac筆電內建的SSD固態硬碟

 

我們所使用的是16GBSD卡,上表所顯示的記憶體容量可以判斷disk1是SD卡,而它的位置為/dev/disk1,請記下這個位置

4.輸入指令:diskutil unmountDisk “SD卡的位置,將SD卡卸除,

例如:diskutil unmountDisk /dev/disk1

Rpi_mac03

 

5.輸入指令:sudo dd if=”要燒錄的映像檔的位置“ of=”SD卡的位置” bs=2m,將映像檔燒進去SD卡,

dddisk dumpifinput fileofoutput filebsblock size

    小技巧1:要得到燒錄的映像檔的位置可以直接將.img檔的圖示拖曳進終端機裡就可以了

    小技巧2dd指令通常都需要等一段時間,而且終端機的畫面會一直停留在那裏,請大家稍安勿躁,千萬不要以為它失敗就強制取消!但如果想要加快燒進去的速度的話,可以將“disk“改成“rdisk”rraw的意思,原理是raw disk會有較高的讀寫速度

例如:sudo dd if=~/Desktop/2014-12-24-wheezy-raspbian.img of=/dev/rdisk1 bs=2m ,幾分鐘後便燒錄完成了!

Rpi_mac04

 

下一篇是使用網路線讓筆電可以直接控制樹莓派,敬請期待~~~

Scratch設計:射擊遊戲:火龍鬥勇者

這次分享的是之前製作的專題-火龍鬥巫婆,這次讓這個射擊遊戲增加了主角可以累積必殺技量表,發射必殺技

圖片2

除了發射必殺技之外,火龍的攻擊也有普通攻擊,每擊敗一隻巫婆就可以一點累積能量表

圖片1

累積量表是使用Scratch的畫筆功能,在想要的座標點上面往右邊畫一條線,每每積一點就畫一截

累積滿五點的時候,必殺技量表彙編成紅色的,並且不會再累計能量表

圖片3

圖片4

 

火龍按下鍵盤的上移鍵發出大絕招

圖片6

當巫婆碰到火龍的普通攻擊或必殺攻擊就會被消滅

圖片5

 

 

下載的檔案在這邊-火龍鬥巫婆

下次再繼續分享相關的功能~~~

[Mindsensors] NXTTouchPanel測試-小鋼琴七音階

Mindsensors有出一款觸碰面板叫作NXTTouchPanel,可觸碰對應液晶螢幕的像素點並提供8個虛擬按鍵,今天我們就要用它來做成 NXT-小鋼琴,先來看一下我們的主角長什麼樣子

nxttouchpanel

就像這樣固定在NXT的螢幕上,感覺像小時候在玩GameBoy…

nxt+touchpanel

要做出NXT-小鋼琴,要先下載以下三個程式

1.NXTTouchPanel NXT-G Block:觸碰面板程式。要使用NXTTouchPanel的必要Block

2.NXTRICedit V2:圖片編輯程式。因為本篇使用的是NXT-G 2.1版,不像2.0版有內建圖片編輯程式,所以要額外下載

3.Wav 2 Rso:音效轉檔程式。將下載的音效檔轉為可在NXT播放的sound檔(進入網頁後往下找到Wav 2 Rso)

下載安裝好之後,首先我們需要使用NXTRICedit V2來編輯出鋼琴的琴鍵,程式的使用介面如下:

ricedit

NXTRICedit算是滿好上手的圖片編輯程式,且本篇重點不在此,故不多加介紹,可自行上NXTRICedit的網站閱讀相關教學,繪製完成的琴鍵圖如下:

pianokeyboard

編輯好的圖片可另存到NXT-G目錄下的engine\picture資料夾中,接著使用Display加上Loop顯示在螢幕上

piano2

執行後顯示

keyboard

接下來要能夠觸碰琴鍵發出聲音,這邊可以分為1.觸碰到琴鍵的座標位置  2.發出聲音,先來解決第一個觸碰琴鍵的問題,在這邊要使用到剛才下載的Touch Block,有分為Read Current Stylus Point(讀取目前座標點)、Read Buttons(讀取按鍵),本篇是使用Read Current Stylus Point讀取座標點來對應琴鍵的座標,概念是希望觸碰琴鍵下半部白色區域範圍

PIANO4

PIANO3

使用Range讓x與y在琴鍵範圍內時就觸發條件,再加上Logic讓x與y同時成立(選擇and)才觸發

piano5

在這邊的x與y座標範圍是剛才所編輯的琴鍵座標,每一個琴鍵分別需要範圍內左下角和右上角的二點座標,使用nxtRICedit的好處就是它會顯示出座標位置,不必再一點一點去算座標,再來加上聲音條件,本篇是網路上的wav音效檔,再使用Wav 2 Rso轉成nxt可用的聲音檔,先讓第一個琴鍵發出Do的音

piano6

最後將其餘的六個音按此法寫入,更改x的座標範圍即可,本篇是將七個音分別用My Block包起來後再用多工執行,以下影片示範完成後的NXT-小鋼琴

最後附上NXT-G的小鋼琴程式piano七個音的wav檔,希望大家可以做出更多好玩的樂器。

舊文章連結

[MindSensors測試]追蹤物件顏色的利器-NXT-Cam-v4

麻花救星 – MindSensors 滾珠軸承座,特價$750

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

 

《自造世代》自造者市集

十月十一日在士林區的台灣科學教育館舉辦了自造世代的活動~

為了讓一般人能更深入了解自造者(Maker)究竟在做些什麼,科教館與未來產房還有繆思製作團隊

合作舉辦了自造世代這個活動,在星期六下午開始囉,透過「自造者運動」的國際紀錄片,訪問美國自造者運動主要靈魂人物、

科技領域中世界級的思想領袖,探討這樣的運動將為社會經濟及製造業,如何帶來重大影響。有許多

爸爸媽媽帶著小朋友來看電影,了解Maker究竟是什麼,電影觀賞後,也有自造者市集讓人們體驗自己做東西的樂趣~

20141011_160205 20141011_161036

2014-10-11 12.53.58 2014-10-11 13.13.04

20141011_155301 20141011_160010

 

 

 

 

 

 

跟自造者有關的活動,CAVEDU是一定會參與在其中囉,這次展示的有音頻放大器(音響),有感光功能的南瓜感應燈,可以自己調整感光能力,

搖身一變還可以變成小夜燈~接下來是使用Arduino製作的音樂撥放器,還有上一首、下一首音樂的功能鍵,簡直就跟外面賣的一樣的功能,接著

是用樹梅派做的Notebook以及Arduino製作的遙控機械手臂。天啊,希望以後會開課,我也想學一下怎麼做這些作品= =+

20141011_160051 20141011_160110

20141011_160128 20141011_160133

20141011_160040

 

 

 

 

 

 

 

這是親子天下的攤位,展示了日本大人的科學雜誌附贈的作品,有牛頓反射式望遠鏡、電子吉他、掃地機器人、膠捲式照相機,

還有與日本電波對時的翻頁式時鐘,這些都可以現場拿來玩一玩,好想要阿~~只不過想要的話就要自己動手做囉。

20141011_162139 20141011_162123

20141011_162216 20141011_162150

20141011_162204

 

 

 

 

 

 

接下來是好玩科藝,他們用雷射切割做出好多好玩的玩具阿,有兩人對戰用的彈珠台、針筒控制的氣壓式手臂、所有滾輪都會動的戰車履帶、

接著是十發裝的橡皮筋手槍,還附雷射瞄準器,有沒有這麼專業啊!

20141011_155714 20141011_155832

20141011_161936  20141011_155545

最後是以馬達為動力的乓乓球射擊手槍,還有最讓我驚豔的隱藏作品,以橡皮筋作為發射動力的憤怒鳥發射台!!!

來到這個攤位真的會喚起童心

20141011_155656 20141011_163337

 

 

 

 

這個活動感覺得很適合帶小朋友來玩耶,接下來是比較大人來玩的攤位了,這個攤主教大家如何將玻璃瓶加工,做出

許多美麗的作品,看了這個牆上的展示品,會想做幾個放在自己家裡,果然自己做的就是跟外面買的意義就是不一樣,

我想這就是自造者的精隨啦!!

02 20141011_160531

 

 

現場還有木工、金工、電路焊接的教學攤位喔~看了這些照片,是不是也燃起你的自造魂呢?

20141011_160229 20141011_160300

20141011_160615 20141011_160734

這次就介紹到這邊囉,如果還有有趣的活動,小編小五十我,會在騎著我的小五時到現場體驗跟大家分享,886~