2013/01/06

Arduino文章列表

Arduino相關文章,整理如下:

一般:
  1. Arduino簡介,概略介紹。
  2. Arduino Uno開箱文與安裝設定,軟硬體的安裝與設定,在Windows XP與Mac OS X上。
  3. Arduino Leonardo的安裝設定(過時開箱文),軟硬體的安裝與設定,在Windows XP上。 
  4. Arduino:Leonardo與Uno的差異比較,內在總是比外在還有層次。
  5. Arduino與AVR微控制器相關詞彙,簡單介紹一些與Arduino與AVR有關的詞彙。
  6. Arduino Sketch基本架構與序列埠輸出,講解Arduino程式碼(sketch)的基本結構,並且將Hello World透過序列埠輸出到電腦上。
  7. Arduino軟體開發環境的設定檔preferences.txt,說明各種設定值的意義。
  8. Arduino:為IDE換套顏色配置吧,換套酷一點的佈景主題。
  9. Arduino:stk500_getsync(): not in sync,很常見的燒錄失敗錯誤訊息。
  10. Arduino一個好用的計時器程式庫,Dr. Monk寫的計時器程式庫。
  11. Arduino撰寫自己的程式庫,簡單介紹如何把功能包起來放進Arduino程式庫裡,不介紹C++。
  12. Arduino IDE 1.5:程式庫規格書,Arduino 1.5.x版制定的程式庫格式。
  13. Arduino:關於記憶體之二三事,介紹各種記憶體Flash、SRAM、EEPROM的用途。
  14. 在Raspberry Pi上開發Arduino,在Raspberry Pi上安裝Arduino軟體開發環境。
  15. Arduino IDE 1.5字串翻譯工作需要您的幫忙,大家一起來幫忙吧。 
  16. Arduino:9V電池扣+開關+2.1mm DC電源插頭。 
  17. 試用Arduino.org的Arduino Studio 0.0.1版,Arduino鬧分家,嘗鮮試用Arduino Studio。 
  18. 【作品分享】德霖李老師之水舞鋼琴,李老師的作品,不是我的。
  19. LED Goggle,照著Adafruit精美的步驟指引,打造動感十足的絢麗LED炫目鏡〈沒有護目功能〉。
開發板、擴充板:
  1. Adafruit穿戴式電子開發平台FLORA,簡單介紹一下Adafruit的產品FLORA。
  2. 簡介Adafruit的Gemma與Trinket,使用ATtiny85的迷你開發板。  
  3. 123Duino:開箱介紹,玩玩123Duino的試用品,這塊板子內建OLED、溫溼度感測器、RGB LED、蜂鳴器、加速度與多軸感測器、光敏電阻、兩個按鈕。
  4. 開箱文:Arduino原型擴充板Adafruit Proto Shield for Arduino Kit。 
  5. Arduino擴充板:Adafruit的2.8吋觸控式TFT螢幕擴充板,簡短的開箱試用文。
小知識:
  1. Arduino小知識:int為2 bytes
  2. Arduino小知識:enum與函式,函式以enum為參數,或回傳型別為enum,會有問題。
  3. Arduino小知識:LED串聯電阻為什麼是220 ohm?,顧名思義。
  4. Arduino小知識:須在主草稿碼檔案裡#include全部所需的程式庫標頭檔,這點跟一般的整合式軟體開發環境不太一樣。 
  5. Arduino小知識:error: 'TKD2' was not declared,1.5.5-r2加入的程式庫RobotIRremote會與IRremote起衝突。 
  6. Arduino小冷門知識:char不一定是-128到127,嗯,我第一次遇見,C語言暗處真多啊。
練習:
  1. Arduino練習:以開關切換LED明滅狀態,以開關點亮、熄滅LED,並且解決bounce問題。
  2. Arduino練習:以開關切換LED是否閃爍,沒有太多說明,示範兩種技巧達成想要的功能,一種不使用delay只使用millis,一種使用現成的程式庫,。
  3. Arduino練習:呼吸燈,以PWM讓LED漸亮漸暗,顯現呼吸效果,類似於蘋果電腦的電源指示燈;以可變電阻控制呼吸循環週期的時間長短。
  4. Arduino練習:光敏電阻, 以光敏電阻控制LED的明滅。
  5. Arduino練習:RGB LED,可發出各種顏色光芒的RGB LED。
  6. Arduino練習:loudspeaker揚聲器,利用小小的蜂鳴器,演奏周杰倫的青花瓷。
  7. Arduino練習:使用tone()播放RTTTL,播放鈴聲格式RTTTL。
  8. Arduino練習:霹靂車燈,以16個LED,製作霹靂車燈來回跑的效果,以兩顆74HC595控制16個LED。
  9. Arduino練習:seven-segment display七段顯示器與時鐘,以四個七段顯示器,四個4511,製作具有小時與分鐘的時鐘。
  10. Arduino練習:四合一的七段顯示器,四合一型的七段顯示器,讓它從0000開始計數,0001、0002、0003、依此類推。
  11. Arduino練習:以LiquidCrystal程式庫控制LCD(相容於Hitachi HD44780),顧名思義,以程式庫LiquidCrystal,在2x16 LCD上顯示文字訊息。
  12. Arduino練習:Simon Says請你跟我這樣做,一個小遊戲,有四個LED、四個按鈕,程式會亂數閃爍LED,你要記住順序,然後依序按下按鈕。
  13. Arduino練習:猜猜哪一個,讓使用者從5個開關中,猜猜哪個才是正確的。
  14. Arduino練習:溫度感測DS18B20,使用OneWire與DallasTemperature程式庫,輕鬆讀取溫度感測器DS18B20。
  15. Arduino練習:RTC即時時鐘DS1307,由鋰電池供應DS1307的電力,在Arduino板子沒電源不運作時,仍然保持正確的時間日期。
  16. Arduino練習:RTC即時時鐘PCF8523,Adafruit的PCF8523模組產品。
  17. Arduino練習:電容式麥克風與運算放大器LM358,以運算放大器放大麥克風的訓輸出訊號。
  18. Arduino練習:紅外線傳送與接收,練習使用紅外線發射器(IR LED)與接收器(感測器IC)。 
  19. Arduino練習:伺服馬達以Tower Pro SG90為例,簡介伺服馬達,以便宜的Tower Pro SG90為範例。
  20. Arduino練習:連續旋轉伺服馬達GWS S35,可控制旋轉速度。 
  21. Arduino練習:霍爾效應感測器,單磁極感測器Melexis US5881LUA。 
  22. Arduino練習:傾斜感測器Tilt ball switch,很簡單的傾斜感測器。 
  23. Arduino練習:壓力感測器(Force-Sensitive Resistor),根據施加的力量(擠壓、重量),FSR的電阻會隨之改變,藉以控制LED的亮度。 
  24. Arduino練習:彎曲感測器(flex/bend sensor),越折越彎,電阻值就越大。
  25. Arduino練習:明度感測器TSL2561,精準地量測光線明度。 
  26. Arduino練習:三軸加速度感測器ADXL335,可量測正負3g,算是一般。 
  27. Arduino練習:旋轉編碼器,機械式、增量型旋轉編碼器模組。 
  28. Arduino練習:二軸加速計Mx2125,很簡略。 
  29. Arduino練習:三軸陀螺儀L3G4200D,很簡略。
  30. Arduino練習:打字小遊戲,使用矩陣鍵盤和文字型LCD,LCD會不斷冒出數字(與其他),必須趕緊按矩陣鍵盤的鍵消去,按得越快分數越高。
進階:
  1. Arduino在Windows的Cygwin命令列模式下進行編譯與上傳,顧名思義。
  2. Compile and Upload Arduino sketches under Windows and Cygwin,as the name says。
  3. 將Arduino Uno當做一台ISP線上燒錄器,燒錄sketch到麵包板上的ATtiny85-20PU晶片
  4. 將Arduino Uno當做一台ISP線上燒錄器,燒錄bootloader或sketch到麵包板上的ATmega328P-PU晶片
  5. 在麵包板上建構Arduino,ATmega微控制器晶片加USB轉TTL Serial,就可以算是Arduino了。 
  6. 自己以ATtiny85建構Adafruit Trinket,在洞洞板上以ATtiny85建構相容於Adafruit Trinket 5V的Arduino。
  7. Arduino:自製並列埠燒錄線,自己製作便宜的燒錄線。
  8. 開箱文:AVR ISP燒錄器Adafruit USBtinyISP,購買套件自己焊接組裝。 
  9. 讓Arduino Uno變成USB鍵盤,燒錄新韌體,變成USB鍵盤,傳送按鍵給電腦。 
  10. Arduino藍牙無線燒錄:使用Adafruit公司的Bluefruit EZ-Link,經由藍牙無線燒錄草稿碼。 
  11. Arduino:自訂整組資料讀寫EEPROM,使用C++的template,直接傳入一個結構作為存取EEPROM的單位。 
  12. Arduino:在Windows裡使用Python語言經由Firmata協定控制Arduino開發板,簡略介紹Firmata,僅是簡單試用而已。
Arduino Yún(新):
  1. Arduino Yún:基本介紹與設定Wi-Fi無線網路組態,設定WiFi組態,無線進行燒錄。
  2. Arduino Yún:更新OpenWrt-Yun映像檔,更新韌體。 
  3. Arduino Yún:範例草稿碼YunSerialTerminal與套件管理指令opkg,從電腦端以終端機介面存取Yun的Linux系統,安裝新套件。
  4. Arduino Yún:Bridge程式庫入門之Console,初步使用Bridge程式庫的Console。
  5. Arduino Yún:Bridge程式庫入門之Process,初步使用Bridge程式庫的Process。
  6. Arduino Yún:Bridge程式庫入門之Bridge類別的put與get方法,顧名思義。
  7. Arduino Yún:Bridge程式庫入門之Mailbox,初步使用Bridge程式庫的Mailbox。 
  8. Arduino Yún:Bridge程式庫入門之FileIO,初步使用Bridge程式庫的FileIO。
  9. Arduino Yún:範例草稿碼Bridge、從瀏覽器操控腳位,從其他台電腦的瀏覽器,控制Yún的腳位(設定模式、讀取、輸出)。
Arduino Yún(舊):
  1. Arduino Yún:基本設定與無線燒錄,設定WiFi組態,無線進行燒錄。
  2. Arduino Yún:更新Linino映像檔,更新Linino(Linux發行套件)。
  3. Arduino Yún:Bridge程式庫入門(Console與Process),初步使用Bridge程式庫的Console與Process這兩個類別。
  4. Arduino Yún:Bridge程式庫入門(使用Process執行命令列模式下的指令),介紹同步與非同步兩種執行方式。 
  5. Arduino Yún:Bridge程式庫入門(Bridge類別的put與get方法),顧名思義,試試看玩一玩。 
  6. Arduino Yún:Bridge程式庫入門(FileIO類別),把資料(日期時間與腳位狀態)存放在檔案裡,檔案可位於micro SD卡或Linux端本身的Flash快閃記憶體。 
  7. Arduino Yún:Bridge程式庫入門(YunServer與YunClient),從其他台電腦的瀏覽器,控制Yún的腳位(設定模式、讀取、輸出)。
書籍、教材:
  1. 新書發表:Arduino輕鬆入門:範例分析與實作設計,拙作,我寫的Arduino入門書。。
  2. 超棒Arduino入門書:超圖解Arduino互動設計入門,圖文並茂,繪圖精美,從最基本開始介紹。 
  3. [廣告] Arduino機器人製作聖經(Arduino Robot Bonanza),這本書以Arduino微控制器開發板為中心,打造各種機器人,包括自走車、尋跡車、機器手臂、在地上扭來扭去的蛇機 、承載樂隊的履帶坦克、等等。 
  4. [廣告] 初探 NFC:近距離無線通訊與Arduino、Android 和 PhoneGap (Beginning NFC: Near Field Communication with Arduino, Android, and PhoneGap),介紹NFC的絕佳入門書,範例超棒,內容包含Android、PhoneGap、Arduino、Raspberry Pi、BeagleBone、Node.js。 
  5. 【翻譯新作】 Arduino物聯網專案實作(Internet of Things with Arduino Blueprints),Arduino與物聯網,電源開關、Wi-Fi訊號強度、智慧型水表、動作偵測與監視攝影機、太陽能面板電壓記錄、GPS位置追蹤、推文控制燈光、紅外線。
  6. 【翻譯新作】Arduino穿戴式裝置專案製作(Arduino Wearable Projects ),自行車手套、LED眼鏡、GPS手錶、無鑰門鎖、NFC標籤、健身資訊追蹤裝置、Spark開發板、智慧型手錶。 
  7. 【翻譯新作】 iPhone & iPad電子專案製作|透過techBasic開發Arduino、感測器與藍牙應用(Building iPhone and iPad Electronic Projects ),主要以iOS平台與techBasic語言為主,但也有運用Arduino。 

417 comments:

  1. 你好 我是最近才學此程式的學生 有些問題想請叫 是否能聯絡方是聊聊

    ReplyDelete
  2. 有問題就直接問吧,我盡量回答。
    聯絡方式不方便給你。
    你可以波在網路上的什麼論壇嗎,然後給我網址,或是直接留言。

    ReplyDelete
  3. 我打算做一個小程式
    多個開關
    然後每次隨機設定不同的開關為特定條件
    簡單的來說
    就像戳戳樂
    每次放大獎得位置不一樣
    戳到就中獎
    我的想法適用 randim跟swiTch來做

    int inpin1=2;
    int inpin2=3;
    int inpin3=4;
    int inpin4=5;
    int inpin5=6;
    int inpin6=7;
    int led=8;
    int val=0;

    void setup() {
    pinMode(inpin1, INPUT);
    pinMode(inpin2, INPUT);
    pinMode(inpin3, INPUT);
    pinMode(inpin4, INPUT);
    pinMode(inpin5, INPUT);
    pinMode(inpin6, INPUT);
    pinMode(led, OUTPUT);
    Serial.begin(9600);
    }

    void loop() {
    long randnum = random(1, 7);

    switch (randnum) {
    case 1:
    val=digitalRead(inpin1);
    if(val==LOW){
    digitalWrite(led,LOW);
    }else{
    digitalWrite(led,HIGH);
    }
    case 2:
    val=digitalRead(inpin2);
    if(val==LOW){
    digitalWrite(led,LOW);
    }else{
    digitalWrite(led,HIGH);
    }
    case 3:
    val=digitalRead(inpin3);
    if(val==LOW){
    digitalWrite(led,LOW);
    }else{
    digitalWrite(led,HIGH);
    }case 4:
    val=digitalRead(inpin4);
    if(val==LOW){
    digitalWrite(led,LOW);
    }else{
    digitalWrite(led,HIGH);
    }case 5:
    val=digitalRead(inpin5);
    if(val==LOW){
    digitalWrite(led,LOW);
    }else{
    digitalWrite(led,HIGH);
    }
    case 6:
    val=digitalRead(inpin6);
    if(val==LOW){
    digitalWrite(led,LOW);
    }else{
    digitalWrite(led,HIGH);
    }
    }

    }
    這是我現在的程式
    根本無法運作
    是我思考的方向有錯誤嗎 還是有更好的方法
    煩請指點

    ReplyDelete
  4. 附帶一提
    我打算等到全部的開關都按過之後 才重新設定另一個開關為新的大獎位置

    這一段我真的想不出來 Orz
    (我是在家裡自學的沒有老師可以問 QAQ

    ReplyDelete
  5. 你想要的功能,我已經做出來寫成一篇了,請看http://yehnan.blogspot.com/2012/04/arduino.html。


    以下說說你原本程式裡的一些問題:
    1. 在loop()裡呼叫long randnum = random(1, 7);,這樣不對,loop會被不斷地執行,這樣正確答案不就會一直改變了嗎。

    2. switch裡,每個case的最後應該要有break。

    ReplyDelete
  6. 你好!!!

    我想請問一下,我目前是有四段開關,我講一下每一段的開關動作

    第一就是74HC595控制LED燈做跑馬燈+蜂鳴器的音樂
    第二就是光敏電阻控制LED燈亮度,然後馬達會隨之旋轉
    第三就是一班的手電筒照明
    第四就是OFF


    可以請求高手給我一點方向或解答嘛!?!?
    謝謝

    ReplyDelete
  7. 回覆上一篇,如果可以給我四段開關的程式以及接線更好。感恩!

    ReplyDelete
  8. to Unknown:
    我看不懂你的問題所在。

    每一部份的功能你都做出來了嗎?

    還是說,使用開關控制四個功能的這部份有問題呢?

    ReplyDelete
  9. 就是我用開關執行四種動作...


    發現74HC595暫存器所控制的跑馬燈不會消失(切換開關的時候)
    我要的是就是切換開關的時候,會執行下一個動作,然後跑馬燈會熄滅。

    ReplyDelete
  10. ㄟ,你都會使用74HC595製作跑馬燈了,我怎麼感覺你問的問題太過簡單?

    你應該可以讀取開關的狀態,然後控制595啊,應該是要控制595的腳位Pin 13(Output Enable),記得沒錯的話,低電位時595才能輸出,高電位時595就無法輸出。

    你用的是有4段的開關嗎?型號?

    ReplyDelete
  11. 您好,想請教一個問題:

    目前使用紅外線感應器做為底下這塊mp3擴張版的Senser來控制音樂播放
    ( http://www.elechouse.com/elechouse/index.php?main_page=product_info&products_id=2193 )

    我想在一首音樂播放完之前,重複感應時不會再觸發下一次的感應,寫法暫時以delay一首歌的時間來做控制是可行的
    但考慮到之後可能會更換音樂,時間長短不一
    請問是否有程式碼可以得到音樂檔案的時間長度呢?

    ReplyDelete
    Replies
    1. 不太懂你的意思,你想要什麼功能,"重複感應時不會再觸發下一次的感應"是什麼意思?

      set_mode的參數可以設定成CYCLE=2,代表重複播放所有歌曲。

      還有個void send_cmd(u8 *cmd);,好像可以檢查"Check Current Playing File"目前播放中的歌曲,

      不過好像都不是你要的。

      我沒看到讀取mp3資訊的API。

      Delete
    2. 我猜你想要的功能是:感應並播放歌曲,若歌曲正在播放中,此時再感應並不會有動作。

      我看了你給的網址裡的手冊(http://www.elechouse.com/elechouse/images/product/Arduino%20MP3%20Shield/Arduino%20MP3%20Shield%20User%20Guide.pdf),

      裡頭有"Check Work State",回傳值是0x01 Playing、0x02 Stop、0x03 Pause,這麼一來你就知道是否正在播放中,感應到紅外線時,就可以作判斷。

      Delete
  12. 謝謝,就是需要讀取這個資訊!
    再請問一下,要如何得到播放狀態呢?
    程式碼裡面只有send_cmd,沒有寫到receive或讀取value的指令

    https://github.com/elechouse/Mp3Shield/blob/master/MP3.h
    https://github.com/elechouse/Mp3Shield/blob/master/MP3.cpp

    因為剛接觸程式,目前還在基礎的應用階段
    請教一下該如何寫呢? 或者哪裡有相關的教學可參考呢?
    謝謝 :)

    ReplyDelete
    Replies
    1. 這種是專屬的擴充板,除了看原廠給的文件資料與範例程式碼,只能找找有沒有別人的使用經驗與心得分享吧。

      MP3.h與MP3.cpp裡面的void stop()、void next()、void set_mode(u8 mode)、等等,其實最後都會去呼叫void send_cmd(u8 *cmd),

      你的程式透過Serial介面與這塊"Arduino USB-SD MP3 Shield"溝通,send_cmd就是會根據手冊裡的所謂的"command",控制這塊擴充板、讀取擴充板目前的狀態,

      你需要的功能class MP3並沒有提供,你必須自己寫,

      首先要傳出Check Work State的指令,查詢手冊裡寫的指令格式後,如下:
      void MP3::checkWorkState()
      {
      cmd_buf[1]=0x02;
      cmd_buf[2]=0xC2;
      send_cmd(cmd_buf);
      }

      送出指令給擴充板後,它也是經由Serial介面的另一條回傳結果,
      根據手冊所述,擴充板會先回傳0xC2,
      然後跟著狀態,有三種可能,
      0x01 Playing
      0x02 Stop
      0x03 Pause

      你必須接收、然後判斷,

      接收的程式碼就是利用Arduino內建程式庫的Serial.read()。

      Delete
  13. 您好,底下是我寫的程式碼

    #include
    #include

    MP3 mp3;
    const int PIRSensor = 2; // 紅外線動作感測器連接的腳位
    const int ledPin = 13; // LED 腳位
    int sensorValue = 0; // 紅外線動作感測器訊號變數

    void setup() {
    /** begin function */
    mp3.begin(); // select software serial
    // mp3.begin(); // select hardware serial(or mp3.begin(MP3_HARDWARE_SERIAL);)

    /** set volum to the MAX */
    mp3.volume(0x1F);

    /** set MP3 Shield CYCLE mode */
    mp3.set_mode(MP3::SINGLE);

    pinMode(PIRSensor, INPUT);
    pinMode(ledPin, OUTPUT);
    }

    void loop(){
    sensorValue = digitalRead(PIRSensor); // 讀取 PIR Sensor 的狀態
    mp3.checkWorkState(); //檢查播放狀態
    Serial.begin(9600);
    byte state = Serial.read(); //讀取播放狀態

    if (sensorValue == HIGH && state == 0x02) {
    mp3.play_usb_disk(0x0001); // 有人且停止播放時,放音樂
    }
    else if (state == 0x01) { //音樂播放中
    sensorValue = 0;
    }


    當我使用Serial.print(state)檢查時,讀取到的資訊是亂碼(¾Ðû),以至於無法辨識狀態~
    請問是哪邊的語法有問題呢?
    另外,音樂播放中紅外線感應不接收訊息可以怎麼寫呢,目前寫的sensorValue = 0好像不太對?

    謝謝~

    ReplyDelete
    Replies
    1. 執行mp3.checkWorkState()後,MP3擴充板應該會回傳兩個byte吧,
      第一個是0xC2,第二個是0x01播放中、0x02停止、0x03暫停。
      當Serial.read()讀到0xC2時,需要再讀取一次,才知道第二個狀態值。

      Serial.print預設會以ASCII印出字元,但這裡的東西不是ASCII碼,請改以Serial.print(state, HEX)印出16進位數字吧。

      一種作法是,檢查有無放音樂,沒有才去讀取PIRSensor。
      另一種是讀取PIRSensor,若是HIGH,再檢查音樂是否播放中。


      Delete
    2. 感謝指點~ 我之前已經把播完整首歌後再進行下一次感應的語法寫出來了:

      #include
      #include

      MP3 mp3;
      const int PIRSensor = 12; // 紅外線動作感測器連接的腳位
      int sensorValue = 0; // 紅外線動作感測器訊號變數

      void setup() {
      /** begin function */
      mp3.begin(); // select software serial
      // mp3.begin(); // select hardware serial(or mp3.begin(MP3_HARDWARE_SERIAL);)

      /** set volum to the MAX */
      mp3.volume(0x1F);

      /** set MP3 Shield CYCLE mode */
      mp3.set_mode(MP3::SINGLE);

      pinMode(PIRSensor, INPUT);
      mp3.stop();
      }
      void loop(){

      // 讀取 PIR Sensor 的狀態
      sensorValue = digitalRead(PIRSensor);
      mp3.checkWorkState(); //檢查播放狀態
      while(Serial.available() > 0 ) {
      int state = Serial.read(); //讀取播放狀態
      if (state == 2) {
      if (sensorValue == HIGH) { // PIR Sensor有人時
      mp3.play_spi_flash(0x0001);
      Serial.println("PLAY");
      }
      }
      }
      }


      但這次的問題為:紅外線感應一直提供高電平給輸入腳位
      (即使沒有感應到,播完一首便馬上再重複)
      交叉測試後,使用按鈕取代紅外線感應時是沒問題的,以紅外線感應來控制LED開關也沒問題~

      另外,如果改以電池作為外接電源,紅外線感應也沒有一直提供高電位的問題,只是電力不持久 @"@

      在之前有一次使用12V 1.2A的變壓器測試過後,才開始有紅外線持續給高電位的問題
      (後來才發現這塊擴充版只需要5V左右,電流範圍未知)
      請問可能是哪邊出狀況,或者該如何測試找出問題呢?
      謝謝~

      Delete
    3. 嗯,光這樣我也不知道問題所在。可能要慢慢嘗試找出哪裡不對勁了。

      加油。

      Delete
    4. 謝謝~ 可能要去找一些有做Arduino販賣或教學的地方做測試吧

      Delete
  14. Anonymous8/1/14 21:12

    請問 如果是無限資料傳輸你會選擇xbee還是bluetooth呢

    ReplyDelete
    Replies
    1. 咳,對這兩項技術有很深入了解才能做出好決定吧,我沒有。

      學習時可選擇bluetooth,有便宜的模組,可是真的要做成產品的話,實際根據需求比較看看才知道合適的是哪個。

      Delete
    2. Anonymous8/1/14 22:18

      嗯嗯 我是要做專題 我已經決定使用藍牙
      我的需求是 rfid透過藍牙傳輸到pc端再上傳server
      以及能在server 從電腦透過藍牙控制及觀察電器狀態
      這樣是用兩組藍牙1對1還是直接使用ethernet shield呢

      Delete
    3. 嗯,聽起來都可以。
      你不是要無線嗎?Ethernet是有線的。為什麼中間還要有pc啊?

      祝你專題順利。

      Delete
    4. Anonymous9/1/14 00:28

      真的很感謝您的回答
      那我就朝bluetooth前進
      會有pc是我目前的認知 用藍牙usb收資料然後(labview or vb)上傳server
      或其他還在尋找
      有方法可以不需經pc??
      感謝您!!

      Delete
    5. 不敢,大家互相討論。

      所以server在很遠的地方囉,嗯,離rfid很遠,那當然就不能用藍牙了,
      改用wifi shield?直接上網,從rfid端網路連線上傳資料,可以嗎?
      不過wifi shield比較貴。

      Delete
  15. 你好 想請問一下
    我想要把arduino serial monitor run出來的資料
    轉換成文字檔(.txt) 或是表格之類的
    存在電腦裡~
    請問要如何辦到????

    ReplyDelete
    Replies
    1. 寫一支電腦端執行的程式,開啟序列埠並接收資料,然後依照你想要的格式存入檔案。

      Delete
    2. 不好意思~可以請你講詳細一點嗎
      像用什麼寫一支電腦端執行的程式?
      程式裡面的內容 大致如何寫?
      謝謝....

      Delete
    3. 譬如用Python寫的話(先安裝pySerial):
      import serial
      ser = serial.Serial('/dev/tty.usbserial', 9600) #修改成你的設定
      while True:
      print ser.readline()

      這樣就可以讀取從Arduino透過序列埠傳來的資料。可以讀取後,再依照你想要的格式存入檔案。

      可參考這份文件http://playground.arduino.cc/Main/Interfacing

      Delete
    4. 請問一下我有一個SD讀寫模組
      http://goods.ruten.com.tw/item/show?21301179665180
      已經可以轉換成文字檔存入sd卡了
      但我想電腦可以直接打開文字檔(而非又拿sd卡插電腦
      可以嗎?
      還是要用你所說的用Python寫?
      如果用vb介面可以嗎?
      謝謝 不好意思 麻煩你

      Delete
    5. 想要電腦可以直接打開文字檔?
      同樣的,電腦端要寫個程式跟Arduino溝通,傳送「我想要哪支檔案」,然後Arduino讀取SD模組、開啟檔案、將檔案內容回傳給電腦端的程式。

      用什麼語言都能寫,重點是該語言應該要有序列埠(COM埠)的程式庫。VB當然可以。

      Delete
  16. 你好! 我想請教關於arduino控制LED燈光的問題
    底下此支影片為參考
    https://www.youtube.com/watch?v=InrQvtUuS2w&index=2&list=PL-5q0isSHMGJnOZTvEDCps5ZmZ2_6HsNe
    我想知道arduino能接收的聲音波段是不是很有限?
    畢竟不像PC那樣運算效能那麼高
    那麼 假設
    我想以processing 的 FFT 結合像上面那部影片的LED控制
    這是有可能的嗎?
    我的主要構想是:
    用processing接收聲音(比如:彈奏吉他)
    交由筆電運算,在連結arduino
    達到用彈奏吉他來改變燈光的閃爍或明亮
    接觸不久,有很多問題
    煩請指教! 謝謝

    ReplyDelete
    Replies
    1. > 我想知道arduino能接收的聲音波段是不是很有限?
      不太懂你的意思,我想答案是:還要接其他零件才能接收聲音。
      你給的影片裡,他就用了MSGEQ7這顆晶片,將聲音送進去後,晶片分析成七個頻段63Hz, 160Hz, 400Hz, 1kHz, 2.5kHz, 6.25kHz, 16kHz。

      > 用processing接收聲音(比如:彈奏吉他)
      怎麼接收?

      你可以電腦裝Processing,裝麥克風,人在旁邊彈吉他,接收後處理,分析頻率振幅,
      然後電腦接Arduino,Processing送出資料給Arduino,Arduino根據資料控制LED的亮度。
      這樣應該有達到你的需求吧。

      Delete
    2. Anonymous3/10/14 18:44

      您好,可以分享利用Processing裝麥克風接收聲音,再由電腦分析頻率,最後輸出到Arduino的CODE嗎?
      我GOOGLE不到相關資料,麻煩了

      Delete
    3. 搜尋「processing microphone frequency」可以找到很多資料與範例吧。

      Delete
  17. 你好,我目前在學習利用Arduino UNO板控制、類比搖桿去控制機械手臂,而手臂有4個馬達分別為S3003(控制夾子)、MG995(底座)、SG-5010(關節部分),以下我寫的程式,但是11跟12腳位,卻不能動作,請問程式哪邊寫錯嗎? 麻煩你了。

    #include
    Servo servoX,servoY,servoC,servoK;
    const byte pinX=A0;
    const byte pinY=A1;

    int valX,posX;
    int valY,posY;
    int valC,posC;
    int valK,posK;


    void setup()
    {
    servoX.attach(9);
    servoY.attach(10);
    servoC.attach(11);
    servoK.attach(12);
    }

    void loop(){
    valX=analogRead(pinX);
    valY=analogRead(pinY);

    posX=map(valX,0,1023,0,179);
    posY=map(valY,0,1023,0,179);
    posC=map(valC,0,1023,0,179);
    posK=map(valK,0,1023,0,179);
    servoX.write(posX);
    servoY.write(posY);
    servoC.write(posC);
    servoK.write(posK);

    delay(100);
    }

    ReplyDelete
    Replies
    1. posC=map(valC,0,1023,0,179);
      posC受valC控制,可是valC一直都是0。

      你的analogRead只會改變valX與valY,
      valC與valK都不會改變,所以posC posK servoC servoK很自然地都不會動。

      Delete
    2. 原來如此,謝謝你!,有問題會在請教!

      Delete
  18. 我請教一個問題....
    用ARDUINO做lcd螢幕顯示器顯示hello, world
    結果都是亂碼 有時接出來還顯示不出來只有背光@@
    這要怎麼辦?

    ReplyDelete
    Replies
    1. 請再提供多一點資訊,否則無法判斷。

      或許可先參考我這篇,
      Arduino練習:以LiquidCrystal程式庫控制LCD(相容於Hitachi HD44780)
      http://yehnan.blogspot.tw/2012/02/arduinoliquidcrystallcdhitachi-hd44780.html

      Delete
  19. 我想問一下,如果把sd卡寫出的值存進bin檔且是二進制(不是0110,是亂碼)

    ReplyDelete
  20. 看不太懂你的問題。

    或許可以注意一下寫入時是使用二進位格式還是ASCII格式吧。

    ReplyDelete
    Replies
    1. 我使用myFile.println(ecg.abc(他是一個變數),BIN);
      輸入到那個檔案她顯示1001 1000 .....(二進制)
      想請問要怎把他變成二進制(就開起內容是亂碼)
      不知道這樣說你看得懂嗎-.-

      Delete
    2. println會以ASCII輸出吧,
      你應該找找名稱為write的函式(or方法)。

      Delete
    3. 用write可以寫進檔案裡面嗎??

      Delete
    4. 我用成功了!!謝謝大大的提醒 感謝你 :)
      如果我還有Arduino的問題 會再來詢問你 :)

      Delete
  21. 請問要怎麼把Arduion 壓力感測器 輸出的值讓手機接收

    ReplyDelete
    Replies
    1. 無線傳輸?藍牙?Wi-Fi?

      Delete
    2. 就是用音源線

      Delete
    3. 我沒有相關經驗。

      拜過孤狗大神後,第一個連結是
      http://code.google.com/p/androino/wiki/AndroinoTerminal
      或許是你要的。

      Delete
    4. 恩 謝謝摟 不過這個已試過XD

      Delete
    5. 試過了?那不就解決了嗎?:D

      Good Luck.

      Delete
  22. 請問 我使用eepromAnything將String寫入 String的長度大概是9~12bytes
    例如 String CmbString="12345678912"'; 我用for 迴圈寫入位址
    for(int n =0;n<600;n+=20)
    {
    if(list[n/20]!=0)
    EEPROM_writeAnything(n,list[n/20]);
    }

    我要做EEPROM的增加 刪除
    程式寫入 第一次開始Serial Monitor時都正常
    但在我把Serial Montor 關閉 再打開 就會錯誤
    從EEPROM讀取出來的值也會錯誤 亂碼

    請問你有相關的經驗嗎 感恩

    ReplyDelete
  23. 抱歉 忘了說
    String list[30];
    我會把String CmbString放進去list
    讓他去寫入

    ReplyDelete
    Replies
    1. 你想寫入EEPROM的東西是什麼?
      位址?你放入的東西是String物件,不是位址吧。

      使用EEPROM_writeAnything時,我覺得後面傳入的東西最好是一般的型別,譬如struct,不要傳入String這種物件。因為EEPROM_writeAnything裡操作的對象都是一個個byte。

      Delete
    2. 對!是String
      好的 我會試著轉格式
      我只是困惑 一開始開Serial monitor 都不會錯誤 關掉monitor再打開就錯誤

      是否會跟我環境建置有關?
      我是在官網有eepromAnything.h
      放進libraries EEPROM資料夾內
      有些教學說要放eeprom_anything.h 跟eeprom_anything.pde
      檔案與所寫的.ino在一起 我的無法compile

      Delete
    3. 要存字串的話,可以把String轉成char陣列,然後再存。

      > 我只是困惑 一開始開Serial monitor 都不會錯誤 關掉monitor再打開就錯誤
      從你給的東西,看不出為什麼。

      官網的可行(http://playground.arduino.cc/Code/EEPROMWriteAnything);

      eeprom_anything.h 跟eeprom_anything.pde?你是看coopermaa嗎,
      因為把c++ template分成兩個檔案了,所以編譯不過,這是因為新版Arduino軟體編譯器改變了的關係。
      可以參考我寫的http://yehnan.blogspot.tw/2014/03/arduinoeeprom.html。

      至於把eepromAnything.h放進libraries EEPROM資料夾內,
      並非正確作法,但似乎可行(沒試過)。

      Delete
  24. 那個我想問C的fseek、fread的函式類型,是否有Arduino上??

    ReplyDelete
    Replies
    1. Arduino開發板本身沒有檔案系統吧,不過底下的AVR C程式庫有fread等函式。

      如果你是要存取SD記憶卡,應該要使用SD程式庫,http://arduino.cc/en/Reference/SD。

      Delete
    2. 不好意思,那個我的程式弄好RUN完,檔案裡面內容前半段都好好的,可是到後半段就變成2124714368
      -857893823
      -718104063
      -2147483648
      856765632
      .
      .
      .

      我不曉得我是哪邊出現問題= = "

      Delete
    3. 抱歉,光這樣完全不知道怎麼幫你。

      Delete
    4. 抱歉,我問題我沒說的很詳細。

      for ( frame = 0; frame < ( c / 64 ); frame++ ) {
      //fseek( fPtrb, byte_ptr*sizeof( char ), SEEK_SET );
      myFile.seek( byte_ptr*sizeof( char ) );
      for ( j = 0; j < 128; j++ ) {
      //fread( &Array_bin, sizeof( char ), 1, fPtrb );
      Array_bin = myFile.read();
      de.dec2bin_unsigned( Array_bin, bin_read );

      for ( i = 0; i < 8; i++ ) {
      Array_decoding[ i + j * 8 ] = bin_read[ 7 - i ];
      }
      }
      de.ECG_decode( Array_decoding );

      for ( i = 0; i < 64; i++ ) {
      de.ecg_reconstrut[ i ] = ( ( de.ecg_2048[ i ] + 0.5 ) );
      myFile1.println( de.ecg_reconstrut[ i ] );
      }
      byte_ptr = byte_ptr + ceil( de.addr_ptr * 0.125 );
      }
      這是我主程式,我RUN完之後,去查看TXT檔內容
      TXT檔的前半部都OK,可是到了第49XX行之後就開始顯示我上面說的數字。
      我TXT檔總共有5760個,我不知道到底是哪邊出問題了

      Delete
    5. 沒給的東西太多了,de、Array_decoding、ECG_decode、ecg_reconstrut等等,沒辦法幫你。

      Good luck debugging.

      Delete
    6. 難道是因為數字太大了,overflow?
      還是byte_ptr指到不對的位置了?
      還是de裡解碼轉換時出錯了?
      其他...

      Delete
    7. 我現在把資料量改成3584筆就不會出現那個問題了,
      謝謝你的指導。

      Delete
    8. 不敢。
      隔空抓藥很困難,多半都要靠自己。

      Best regards.

      Delete
  25. 請問一下大大有沒有使用過 http://arduino.cc/en/Guide/TFTtoBoards 這裡面這格LCD版子
    我想請問一下他有附加的SD卡功能,我使用它的範例去顯示圖片結果都初始SD卡都失敗
    不曉得我哪裡出了問題

    ReplyDelete
    Replies
    1. 沒用過。

      有什麼錯誤訊息嗎?

      Delete
    2. 因為我讀取SD卡的時後都是失敗,
      我都照那個網址所給的腳位接了
      不曉得是哪邊出現錯誤

      Delete
    3. 會不會是我這張記憶卡太大和是HC的問提呢??

      Delete
    4. 換張普通一點的記憶卡試試看吧。重新格式化記憶卡試試看,FAT16或FAT32。

      確定是SD.begin就出問題嗎?有什麼輸出訊息呢?

      譬如底下,若失敗就會輸出"failed":
      if (!SD.begin(sd_cs)) {
      Serial.println("failed!");
      return;
      }
      Serial.println("OK!");

      Delete
    5. 換了普通點的記憶卡,突然就好了==

      Delete
    6. 恭喜。
      我有張擴充卡,也只能用舊的記憶卡。

      Delete
  26. 不好意思,我又來提問題了
    請問你玩過NFC(DFROBOT0231)這個板子嗎??
    我用了範例程式結果不能跑,不曉得哪裡出錯誤
    https://core-electronics.com.au/store/index.php/nfc-module-for-arduino.html
    下面有範例程式的code

    ReplyDelete
    Replies
    1. 沒用過。

      這是DFROBOT的產品,建議您到DFROBOT的網站上詢問。

      Delete
    2. 我看了範例sketch,看來這塊擴充板是以序列介面與Arduino板溝通,sketch裡是使用Serial1,不過只有Mega、DUE、Leonardo才有Serial1吧,Uno必須使用軟體Serial。

      請問你使用哪塊Arduino擴充板,或許問題出在這裡?

      Delete
    3. 我使用UNO板,可能是用這塊版子導致我的編譯時候出現Serial1錯誤吧

      Delete
    4. 這份範例sketch應不能用於Uno板。

      Delete
    5. 或許修改後就可以吧,須使用SoftwareSerial。

      Delete
    6. 我先用最小塊的Leonardo來用看看,謝謝大大

      Delete
  27. 請問 如何寫出 每按下一次按鈕後讓七段顯示器+1

    ReplyDelete
    Replies
    1. 首先讀取按鈕狀態,請參考
      Arduino練習:以開關切換LED明滅狀態
      http://yehnan.blogspot.com/2012/02/arduinoled.html

      在程式裡定義變數儲存七段顯示器顯示的數字,
      當按下一次按鈕後,便讓該變數加一,若大於9就歸零,

      然後更新顯示七段顯示器。

      Delete
    2. 好的 我研究看看 感謝

      Delete
  28. 您好 想請教一下
    我的板子是Yún 正在試寫讀取本身sd卡的資料 我看您的教學http://yehnan.blogspot.tw/2014/04/arduino-yunbridgefileio.html#uds-search-results
    燒錄沒問題 可是之後什麼反應都沒有...
    不管是/mnt/sd/data.txt還是/mnt/sda1/data.txt 都沒變化
    我sd卡裡也有一個名為arduino的資料夾
    我有更新過Linino映像檔
    請問我還有哪裡需注意的地方呢?
    謝謝

    ReplyDelete
  29. micro sd卡會被掛載在/mnt/sda1之下,
    若使用/mnt/sd作為路徑,那麼開檔後會儲存在sd卡的arduino資料夾內,
    我那篇文章使用的路徑與檔名是"/root/data.txt",應該會把檔案儲存在Yun本身的Flash快閃記憶體空間裡。

    ReplyDelete
    Replies
    1. 檔案開檔後,記得最後要close,
      寫入資料後,也可以呼叫flush清空緩衝區,確保資料會被寫入檔案。

      Delete
  30. 我直接複製您那篇的程式 改路徑/mnt/sd或/mnt/sda1
    我用官方的範例也是不行 其怪的是我能更新Linino映像檔 但要跑程式就沒反應 應該不是挑sd卡問題吧(8G c10)
    請問您的IDE是1.5.7嗎?
    arduino官方論壇裡好像不少人有Yún讀sd的問題 不知道是不是bug

    ReplyDelete
    Replies
    1. 我用官方的範例也是不行?沒有錯誤訊息嗎?

      我應該是用1.5.6版。

      我當初使用Bridge時,也是搞了很久。其他程式正常嗎?Console、Process、YunServer與YunClient之類的。

      更新Linino映像檔 與 跑程式就沒反應 之間並無直接的連帶關係。

      我那一篇是寫入到Yun本身的Flash快閃記憶體,先試試這個吧。

      Delete
  31. 我發現我到不了void loop()
    我加入13腳LED去試 都不亮

    #include
    void setup() {
    pinMode(13, OUTPUT);
    Bridge.begin();
    Serial.begin(19200);
    FileSystem.begin();
    while(!Serial);
    }
    void loop () {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
    ...
    ......(後面就是原本的程式碼)

    ReplyDelete
    Replies
    1. #include後面有FileIO.h 這裡加< 好像顯示不出來

      Delete
  32. https://github.com/arduino/YunBridge/issues/12
    不知道是不是他們說的這問題...
    看起來他們後來有解決問題?不過我看不太懂...

    ReplyDelete
    Replies
    1. 既然到不了loop(),那麼在setup()裡就卡住了,可能是Bridge.begin();或FileSystem.begin();出問題。
      建議你在每行程式碼前後都加入Serial的print,輸出一些訊息,這樣可判斷哪行出問題。

      我本來會卡在Bridge.begin();,後來更新Linino映像檔就ok了。
      我那時用的是「Linino 1.0 Upgrade Image」http://yehnan.blogspot.tw/2014/04/arduino-yunlinino.html,
      現在網頁上放的好像是1.3版,我就沒試過了。


      Delete
  33. 您好請教一下,我想要把霍爾感測器與計數器結合,就是每當霍爾偵測到訊號計數器+1,以下程式偵測到霍爾的訊號但磁鐵一直不放開會一直+1,請問如何改程式?

    int i;
    int j;
    int count=0;
    int inPin=A0;
    int val=0;
    int number;
    int type;
    const int debounceDelay=20;
    unsigned long time=0;
    const byte num[10]={
    B11000000, //0
    B11111001, //1
    B10100100, //2
    B10110000, //3
    B10011001, //4
    B10010010, //5
    B10000010, //6
    B11111000, //7
    B10000000, //8
    B10010000}; //9
    const int seg[]={2,3,4,5,6,7,8,9}; //abcdefgp
    const int digit[]={10,11,12,13}; //D0-D3
    void setup()
    {
    for(i=0;i<8;i++)
    pinMode(seg[i],OUTPUT);
    for(i=0;i<4;i++)
    {
    pinMode(digit[i],OUTPUT);
    digitalWrite(digit[i],HIGH);
    }
    }
    void loop()
    {

    number=count;
    for(i=3;i>=0;i--)
    {
    for(j=0;j<8;j++)
    {
    if(bitRead(num[number%10],j))
    digitalWrite(seg[j],HIGH);
    else
    digitalWrite(seg[j],LOW);
    }
    digitalWrite(digit[i],LOW);
    delay(5);
    digitalWrite(digit[i],HIGH);
    number=number/10;
    if(millis()-time>=190)
    {
    time=millis();
    pinMode(inPin,INPUT);
    val=
    digitalRead(inPin);
    if(val==LOW)
    count++;
    if(count>750)
    count=0;
    }
    }
    }

    ReplyDelete
    Replies
    1. http://pastebin.com/jSw1FBL3
      試試看吧,只有編譯過,沒實際跑過。

      Delete
    2. 還是會有磁鐵一直不放開(low)會一直+1的問題.

      Delete
    3. 再try一次吧,
      http://pastebin.com/F8TSpq7q

      如果不行,請自己看看程式碼、試著修改看看囉。:)
      Good Luck.

      Delete
  34. 您好喔 我使用範例程式
    #include

    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    void setup() {
    // set up the LCD's number of columns and rows:
    lcd.begin(16, 2);
    // Print a message to the LCD.
    lcd.print("hello, world!");
    }

    void loop() {
    // set the cursor to column 0, line 1
    // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(0, 1);
    // print the number of seconds since reset:
    lcd.print(millis()/1000);
    }
    腳位都照著他接再DUEMILANOVE的腳位上 但是LCD只有上列有明暗的反應卻沒有hello word 顯示
    真的不知道哪方面有問題 ><

    ReplyDelete
    Replies
    1. 這份程式碼很簡單,並沒有問題。

      只能想到應該是電路出問題,若是照http://yehnan.blogspot.tw/2012/02/arduinoliquidcrystallcdhitachi-hd44780.html接線的話,建立LiquidCrystal物件時應該是LiquidCrystal lcd(12, 11, 2, 3, 4, 5);才對。

      Delete
  35. Anonymous4/10/14 16:12

    您好,我昨天有發問關於麥克風接收音樂頻率
    我搜尋到CODE後編譯,下方顯示
    ==== JavaSound Minim Error ====
    ==== Unable to return a TargetDataLine: unsupported format - PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian
    === Minim Error ===
    === Minim.getLineIn: attempt failed, could not secure an AudioInput.

    我也有安裝MINIM的LIBRARY,不知道問題出在哪
    import ddf.minim.*;
    import ddf.minim.analysis.*;

    Minim minim;
    AudioInput in;
    FFT fft;
    String note;// name of the note
    int n;//int value midi note
    color c;//color
    float hertz;//frequency in hertz
    float midi;//float midi note
    int noteNumber;//variable for the midi note


    int sampleRate= 44100;//sapleRate of 44100

    float [] max= new float [sampleRate/2];//array that contains the half of the sampleRate size, because FFT only reads the half of the sampleRate frequency. This array will be filled with amplitude values.
    float maximum;//the maximum amplitude of the max array
    float frequency;//the frequency in hertz

    void setup()
    {
    size(400, 200);

    minim = new Minim(this);
    minim.debugOn();
    in = minim.getLineIn(Minim.MONO, 4096, sampleRate);
    fft = new FFT(in.left.size(), sampleRate);
    }

    void draw()
    {

    background(0);//black BG

    findNote(); //find note function

    textSize(50); //size of the text

    text (frequency-6+" hz", 50, 80);//display the frequency in hertz
    pushStyle();
    fill(c);
    text ("note "+note, 50, 150);//display the note name
    popStyle();
    }

    void findNote() {

    fft.forward(in.left);
    for (int f=0;f<sampleRate/2;f++) { //analyses the amplitude of each frequency analysed, between 0 and 22050 hertz
    max[f]=fft.getFreq(float(f)); //each index is correspondent to a frequency and contains the amplitude value
    }
    maximum=max(max);//get the maximum value of the max array in order to find the peak of volume

    for (int i=0; i<max.length; i++) {// read each frequency in order to compare with the peak of volume
    if (max[i] == maximum) {//if the value is equal to the amplitude of the peak, get the index of the array, which corresponds to the frequency
    frequency= i;
    }
    }


    midi= 69+12*(log((frequency-6)/440));// formula that transform frequency to midi numbers
    n= int (midi);//cast to int


    //the octave have 12 tones and semitones. So, if we get a modulo of 12, we get the note names independently of the frequency
    if (n%12==9)
    {
    note = ("a");
    c = color (255, 0, 0);
    }

    if (n%12==10)
    {
    note = ("a#");
    c = color (255, 0, 80);
    }

    if (n%12==11)
    {
    note = ("b");
    c = color (255, 0, 150);
    }

    if (n%12==0)
    {
    note = ("c");
    c = color (200, 0, 255);
    }

    if (n%12==1)
    {
    note = ("c#");
    c = color (100, 0, 255);
    }

    if (n%12==2)
    {
    note = ("d");
    c = color (0, 0, 255);
    }

    if (n%12==3)
    {
    note = ("d#");
    c = color (0, 50, 255);
    }

    if (n%12==4)
    {
    note = ("e");
    c = color (0, 150, 255);
    }

    if (n%12==5)
    {
    note = ("f");
    c = color (0, 255, 255);
    }

    if (n%12==6)
    {
    note = ("f#");
    c = color (0, 255, 0);
    }

    if (n%12==7)
    {
    note = ("g");
    c = color (255, 255, 0);
    }

    if (n%12==8)
    {
    note = ("g#");
    c = color (255, 150, 0);
    }
    }

    void stop()
    {
    // always close Minim audio classes when you are done with them
    in.close();
    minim.stop();

    super.stop();
    }

    ReplyDelete
    Replies
    1. 錯誤訊息有說:
      ==== JavaSound Minim Error ====
      ==== Unable to return a TargetDataLine: unsupported format - PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian
      === Minim Error ===
      === Minim.getLineIn: attempt failed, could not secure an AudioInput.

      想要取得LineIn卻失敗了,所以無法生出AudioInput、無法回傳TargetDataLine供你使用,
      大概是因為你沒有去控制台設定麥克風相關裝置吧。

      Delete
    2. Anonymous5/10/14 21:42

      謝謝!
      現在已經可以測得頻率了~
      只剩下最後與ARDUINO的結合
      有問題會再繼續來發問,感恩~

      Delete
  36. 請問一下,如何用mega2560使用bluetooth V3 傳讀到的A0值給手機端顯示??
    第一次使用這種藍芽裝置

    ReplyDelete
    Replies
    1. 看不出來其規格跟一般便宜的藍牙模組有何不同,大概品質有差;都是Bluetooth v2.0 + EDR、傳輸方式也都是Bluetooth serial port。

      首先連接mega2560與bt v3,讓bt v3進入設定模式,設定你想要的名稱與配對密碼;
      然後讓bt v3進入傳輸模式,讓手機與它進行藍牙配對;
      至於要傳資料的話,手機端必須有App負責接收,
      若是Android的話,可以用App Inventor來寫。

      Delete
  37. 想請問一下,我想在我在arduino TFT板上SHOW訊號時,按下一個按鈕(紀錄)可以直接把訊號直存進SD卡裡面,然後再按一下就可以停止他。
    之前有寫可是一直怪怪的,所以想請問大大這邊該如何撰寫才好?

    ReplyDelete
    Replies
    1. 還有如何在那塊板子顯示系統時間?? 是要按照大大樓上文章那一個RTC即時時鐘差不多嗎??

      Delete
    2. > 該如何撰寫才好?
      看不懂你的問題。哪一塊板子?功能是什麼?

      > 顯示系統時間?
      可以加裝RTC,或是裝網路擴充板,上網抓取目前的日期時間。

      Delete
    3. 使用mega2560和TFT LCD板子,想量測訊號值可以在LCD上面顯示出來和設一個按鈕可以記錄/停止,儲存進SD卡裡面,方便我能在SD卡讀取訊號值

      Delete
    4. 設個全域變數,由按鈕來切換其值,大概是0跟1吧,
      根據其值,若是0就不做事,
      若是1就量測訊號。

      Delete
    5. 順帶一提,Arduino的TFT LCD板子應該很多吧。

      Delete
    6. 恩,上次我也這樣寫可是有點bug所以才想跑來問大大有沒有別的寫法,我等等在來測試看看。謝謝

      Delete
    7. 有bug就debug吧。

      Delete
    8. int sensor = analogRead(A0);
      File dataFile = SD.open( "recorddata.txt", FILE_WRITE );

      if( ADRecord == true ) {
      if( dataFile ) {
      dataFile.println( sensor );
      Serial.println( sensor );
      dataFile.close();
      }
      else{
      Serial.println( "error" );
      }
      }

      葉難大哥,請問一下我這樣寫有甚麼錯誤嗎??
      他一直給我出現ERROR 我也不知道是怎麼了ㄒ口ㄒ

      Delete
    9. 大概是開檔失敗吧。請參考http://arduino.cc/en/Tutorial/ReadWrite
      SD程式庫有先呼叫begin嗎?
      SD.open通常會放在setup裡面吧。

      Delete
    10. 如果我是用在按鈕等待我的ADRecord = true 才進來裡面的話
      SD.open我如果放在那裏面,我在下面用那個東西不會引用不道嗎??

      Delete
    11. 看不懂你的問題。

      Delete
    12. 就... 我想靠一個按鈕來啟動那段程式,可是啟動他會一直列印出ERROR
      然後你說File dataFile = SD.open( "recorddata.txt", FILE_WRITE );可以放在setup裡面,那我在那段程是引用那個dataFile可以用嗎?
      我記得好像不能

      Delete
    13. 請參考http://arduino.cc/en/Tutorial/ReadWrite的寫法。File dataFile;放在外面,dataFile = SD.open(...);放在setup裡。

      既然印出error,那就是說dataFile沒東西是false,也就是開檔失敗了。

      Delete
    14. 恩,謝謝葉難大大。
      我來去修改了,辛苦你幫我解答。

      Delete
  38. 想測試藍芽傳輸的數值是否有漏掉,該如何用筆電接收數值來比對??

    ReplyDelete
    Replies
    1. 可是,一個藍牙裝置可以跟另兩台機器配對嗎?
      嘛,你問的太廣了,無法回答。

      Delete
    2. 一排一 = 0x00FFA25D; 一排二 = 0x00FFE01F; 一排三 =0x00FF629D;
      二排一 = 0x00FFA857; 二排二 = 0x00FFE21D; 二排三 = 0x00FF906F;
      三排一 = 0x00FF22DD; 三排二 = 0x00FF6897; 三排三 = 0x00FF02FD;
      四排一 = 0x00FF9867; 四排二 = 0x00FFC23D; 四排三= 0x00FFB047;

      Delete
  39. 你好我要用紅外線控制燈
    並且用遙控器

    ReplyDelete
  40. 我程式打完 燈一直亮著

    ReplyDelete
  41. /*
    * irObjectDetection.pde: 紅外線物體偵測
    */

    const int irReceiver = 2; // 紅外線接收器
    const int irLed = 3; // 紅外線發射器
    const int ledPin = 13; // 紅外線指示燈
    const unsigned int frequency = 38000; // 發射頻率(單位: Hz)

    void setup() {
    Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps
    pinMode(irReceiver, INPUT); // 把 irReceiver 接腳設置為 INPUT
    pinMode(irLed, OUTPUT); // 把 irLed 接腳設置為 INPUT
    pinMode(ledPin, OUTPUT); // 把 ledPin 設置為 OUTPUT

    tone(irLed, frequency); // 產生指定頻率的脈波 (Pulses)
    }

    // 讓指示燈閃爍幾下
    void blinkLED() {
    for (int i=1; i<= 4; i++) {
    digitalWrite(ledPin, HIGH); // 打開指示燈
    delay(100);
    digitalWrite(ledPin, LOW); // 關掉指示燈
    delay(100);
    }
    }

    void loop() {
    int ir_status = digitalRead(irReceiver); // 讀取 irReceiver 的狀態
    Serial.println(ir_status); // 把 irReceiver 的狀態印到 Serial Port

    // 檢查 irReceiver 是否有收到紅外線訊號
    // 有的話,ir_status 會是 0 (因為 Receiver 會把訊號反向, 所以 0 代表有收到訊號)
    if (ir_status == 0)
    blinkLED(); // 讓指示燈閃爍幾下
    }
    並且要用遙控器 控制

    ReplyDelete
    Replies
    1. 這份程式碼是從「Cooper Maa: 紅外線物體偵測 (1)」來的吧,此範例的目標是偵測IR發射器與接收器之間有無障礙物,有的話指示燈會閃爍。

      可是你之前的「一排一 = 0x00FFA25D;」,這是紅外線解碼後得到的資料,應該須使用紅外線程式庫吧,可參考我的另一篇文章「http://yehnan.blogspot.tw/2013/05/arduino.html」。

      Delete
  42. /*
    * irObjectDetection.pde: 紅外線物體偵測
    */

    const int irReceiver = 2; // 紅外線接收器
    const int irLed = 3; // 紅外線發射器
    const int ledPin = 13; // 紅外線指示燈
    const unsigned int frequency = 10000; // 發射頻率(單位: Hz)

    void setup() {
    Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps
    pinMode(irReceiver, INPUT); // 把 irReceiver 接腳設置為 INPUT
    pinMode(irLed, OUTPUT); // 把 irLed 接腳設置為 INPUT
    pinMode(ledPin, OUTPUT); // 把 ledPin 設置為 OUTPUT

    tone(irLed, frequency); // 產生指定頻率的脈波 (Pulses)
    }

    // 讓指示燈閃爍幾下
    void blinkLED() {
    for (int i=1; i<= 4; i++) {
    digitalWrite(ledPin, HIGH); // 打開指示燈
    delay(100);
    digitalWrite(ledPin, LOW); // 關掉指示燈
    delay(100);
    }
    }

    void loop() {
    int ir_status = digitalRead(irReceiver); // 讀取 irReceiver 的狀態
    Serial.println(ir_status); // 把 irReceiver 的狀態印到 Serial Port

    // 檢查 irReceiver 是否有收到紅外線訊號
    // 有的話,ir_status 會是 0 (因為 Receiver 會把訊號反向, 所以 0 代表有收到訊號)
    if (ir_status == 0)
    blinkLED(); // 讓指示燈閃爍幾下
    }






    int d;
    unsigned long v = 0x0;
    case '1':
    v = 0x00FFA25D;
    break;
    case '2':
    v = 0x00FFE01F;
    break;
    case '3':
    v = 0x00FF629D;
    break;
    case '4':
    v = 0x00FFA857;
    break;
    case '5':
    v = 0x00FFE21D;
    break;
    case '6':
    v = 0x00FF906F;
    break;
    }

    if(v != 0x0){
    Serial.print("read ");
    Serial.print(d);
    Serial.print(", IR send ");
    Serial.println(v, HEX);
    irsend.sendNEC(v, 32); // 輸出紅外線訊號
    }
    }
    }
    編譯的怪怪的

    ReplyDelete
    Replies
    1. case應該包在switch之內。

      如果你想收到紅外線遙控器發出的訊號並解析、得到類似0x00FF906F的數值的話,使用紅外線程式庫,譬如IRremote,請參考我的另一篇文章「http://yehnan.blogspot.tw/2013/05/arduino.html」。

      據我所知,這套程式庫無法在同一塊板子上同時使用紅外線發射器與接收器,你想要的功能應該是使用一個紅外線接收器,接收控制器的訊號,根據按下的按鍵不同執行不同的功能。

      Delete
  43. 那個請問一下葉難大大,我用HC-05藍芽模組鮑率38400時,用手機軟體去監看藍芽模組,傳一個數值過去他沒回傳給我數值。然後改鮑率19200結果就可以了 請問是為甚麼呢?? 上禮拜38400還可以現在就不行 我也不曉得

    ReplyDelete
    Replies
    1. 呃,已經到了這個地步,你如果不知道原因,那我也不知道了。
      就我個人經驗而言,用SoftwareSerial本來就有可能出錯,收或發都可能出錯。
      程式裡若有兩個序列埠,若鮑率不同、傳輸量很大、而且互相需要配合,那就有可能漏掉資料;不過就你的程式而言,應該無此問題。

      Delete
    2. 序列埠的鮑率,必須兩端都相同,不過這點你應該早就知道,
      或許一時忘記,沒作修改。

      Delete
  44. 板子:MEGA 2560

    程式碼:
    #include
    #include

    SoftwareSerial I2CBT(10, 11);
    byte serialA;

    void setup() {
    //define pin modes for tx,rx pin
    pinMode(10, INPUT);
    pinMode(11, OUTPUT);
    Serial.begin(57600);
    I2CBT.begin(38400); //與藍牙發射器的鮑率為 9600
    I2CBT.println( "Connection!!" );
    }

    void loop () {
    serialA = I2CBT.read(); //接收 Android 藍牙資料

    if ( serialA == '3' ) {
    for( int xx = 0; xx < 10000; xx++ ) {
    int i=analogRead(A0)*2.5;//讀取感應器值
    I2CBT.print( i/256 );
    I2CBT.print( i%256 );
    I2CBT.write( 'C' );
    //delay(10);
    }
    }
    }

    ReplyDelete
    Replies
    1. 呃,為什麼要for( int xx = 0; xx < 10000; xx++ ) 一萬次?

      Delete
    2. 因為要傳到手機端畫圖,昨天測試好了 很像是因為arduino IDE版本的問題

      Delete
  45. Anonymous5/12/14 18:19

    請問一下葉難大大,我之前利用Processing連結Mic做出的聲音感測頻率已經OK了
    現在想再做,聲音鎖的功能,該怎麼實現聲音比對然後解鎖呢?沒頭緒從哪邊找資料

    ReplyDelete
    Replies
    1. 哇,恭喜你。
      聲音比對?
      我也沒頭緒。

      Delete
  46. 葉難大大! 有個問題困擾我很久了,我想破了頭都無解...
    我在Arduino寫了一個可以運行溫度數值並顯示在LCD16*2上,
    由於想要在手機上同步顯示,上網爬了許多文章,都是以類比訊號,藍芽傳送手機APP,
    可我已寫好溫度數值,想直接將溫度數值經由藍芽傳送至手機顯示...
    墾請葉難大大,Help ! ( 我改來改去,都變成類比訊號A0腳類比訊號的值顯示在手機上 )

    ReplyDelete
    Replies
    1. 我使用的板子是 arduino uno & HC-05 藍芽
      藍芽 code ( 我是參考這個網站來做修改的 )
      http://blog.cavedu.com/appinventor-%E5%9C%96%E5%BD%A2%E5%8C%96android/appinventorandarduinowithbluetooth3/
      這是讀取類比訊號數值再經由藍芽傳送到手機APP( 數值是 0 ~ 1023 ),
      該怎麼修改藍芽 code 可直接經由我寫好的溫度數值發送數值到手機顯示呢? ( 懇請葉難大大指導一下 )
      ( 我只想顯示溫度在手機上 只求溫度數值傳到手機上 溫度code我已完成 藍芽code把我頭搞大了 )
      https://www.youtube.com/watch?v=tZXBnaVVjwM ( 在手機上秀 出溫度 該修改哪裡 懇請葉難大大 指導指導 )

      Delete
    2. 你給的網站波文已經寫好了啊。

      他讀取A0後,
      int i=analogRead(A0);//讀取感應器值

      因為i大於1個位元組,所以他再把i分開成兩個位元組。
      Data[1]=i/256;
      Data[2]=i%256;

      如果你已經把類比訊號轉成兩位數的溫度數值了,那就能以一個位元組儲存,
      毋須上述步驟,呼叫藍牙的write送出。
      手機端收到的就是一個位元組(0~255),然後再想辦法顯示。

      Delete
    3. 如果你溫度數值(兩位數)轉成兩個ASCII碼,那就是兩個位元組。

      Delete
    4. By the way, why not just ask Cavedu directly?

      Delete
  47. 版主 可以教一下用如何控制8x8點矩陣嗎
    陣列搞不懂 不知道怎麼控制動態字元上下左右移
    雖然書上有程式範例 但想改移動方向不知道怎麼下手
    謝謝!

    ReplyDelete
    Replies
    1. 書上?是我的書嗎?
      拙作「Arduino輕鬆入門:範例分析與實作設計」
      http://yehnan.blogspot.tw/2014/02/arduino_21.html

      在5.5有介紹8x8 LED矩陣、MAX7219、程式庫MaxMatrix,
      範例是向左移動的跑馬燈。

      不過沒有你想要的動態上下左右移。

      Delete
  48. 版主您好,最近在做arduino藍芽模組連線,模組是採用HC-06,遇到一些瓶頸,目前已經可以和手機APP連線,想嘗試兩組arduino藍芽模組配對連線。一個是master,另一個是slave,再進行配對在控制LED亮滅,有類似的範例可參考嗎?感恩

    ReplyDelete
    Replies
    1. 嗯,我好像試過,不太記得了,不過有個朋友的確是個讓兩塊Arduino板子透過藍牙模組連線,這是肯定的。

      範例的話,沒找到耶;等您來寫分享文囉,:D。

      Delete
  49. 您好版主,我有問題想請教你 我是自學arduino 以下是我的程式
    板子:arduno uno
    int valuetemp;
    const int RL=2;
    const int GL=3;

    void setup() {
    pinMode(RL, OUTPUT);
    pinMode(GL, OUTPUT);
    Serial.begin (9600);
    }
    void loop() {
    Serial.println (analogRead(0));
    valuetemp = analogRead(1);
    valuetemp = valuetemp *125/256;
    Serial.println(valuetemp);
    delay(500);
    if(analogRead(0) > 90 ) {
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    delay(100);
    }
    else if(analogRead(0) < 90 )
    {
    digitalWrite(3, HIGH);
    digitalWrite(2, LOW);
    delay(100);
    }
    if(analogRead(1) > 25 ) {
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    delay(100);
    }
    else if(analogRead(1) < 25 )
    {
    digitalWrite(3, HIGH);
    digitalWrite(2, LOW);
    delay(100);
    }
    }
    我是做一個感光溫度控制 但是其中一個動作 另一個沒動作怎樣讓它合併說我其中一個動作就可以執行了

    ReplyDelete
    Replies
    1. 看不懂你的問題。

      Delete
    2. 你好我的問題是感光部分數值到了他動作
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      但是我溫度沒到他又跳回去了 他這兩個東西是控制同樣的LED
      我原本的設想是感光到了LED2開LED3關或者溫度到了也可以

      Delete
    3. 不太清楚你要的。


      或許是這樣 http://pastebin.com/4WZwzezP
      不確定。

      Delete
    4. 恩恩 感謝您 你的書我很想借 在我們學校書一直都借不到 我都很想哭, 那我有問題再來問您 謝謝

      Delete
    5. 您好 我想請問一下昨天的那個的程式 加入三個個按鈕開關想讓它強制個別LED開並持續,和跳回感光和溫感的模式,它是用break 還是用continue,我只借到兩本書一本是 踏進互動世界使用arduino 一本是arduino互動設計入門與應用零基礎快速上手指南,這些裡面只教一些
      基本指令及元件介紹和基本程式運用 您昨天給的程式裡合併條件用|| 書裡沒有介紹到所以我才上網來查查有什麼解決辦法,找一找就找到您這裡了

      Delete
    6. 你問的問題屬於C語言,不是Arduino的範疇,幾乎每一本Arduino的入門書,都是以Arduino範例為主,主角是電子零件、感測器、晶片,由淺至深,然後才介紹需要的C程式結構(譬如if、for、break)、以及需要的Arduino核心函式(譬如digitalRead)。

      這些東西,Arduino官網http://arduino.cc/en/Reference/HomePage 都有,但是屬於參考手冊的形式,也就是供人查詢之用。

      Arduino的入門書,我推薦兩本書,一本是拙作:

      Arduino輕鬆入門:範例分析與實作設計
      http://yehnan.blogspot.tw/2014/02/arduino_21.html

      另一本是超圖解Arduino互動設計入門
      http://yehnan.blogspot.tw/2013/04/arduinoarduino.html

      也建議你找本C入門書,先看看C語言程式。

      Delete
    7. 恩 那我知道了 我明天去圖書館看看有沒有 你的書我朋友有推薦過,說那本書好用 可是上次我借的時候書已經被借走了,其他的書我也去找找C語言的書是指基本C語法介紹嗎?式的話我明天去借來看 感謝您

      Delete
    8. 咳咳,買一本比較快。

      就是指C程式語言的入門書。

      Delete
    9. 請問要如何使用紅外線控制R G Bled燈及閃爍,程式碼應該如何下手?
      我是新手

      Delete
    10. 先試著控制RGB LED:Arduino練習:RGB LED,
      再試著以按鈕(開關)控制閃爍與否:Arduino練習:以開關切換LED是否閃爍,
      再加上紅外線接收器,改由它控制:Arduino練習:紅外線傳送與接收。

      Delete
    11. 前面兩種都試了 可是程式碼沒有註解 不曉得每行是在做什麼的
      有註解的版本嗎?

      Delete
    12. 開關 按一次就換一種顏色,哪邊可以學習呢

      Delete
    13. 我並沒有使用奇怪的API吧,都是基本的Arduino核心函式。
      或許可參考拙作,註解多一點。

      你要的功能「開關 按一次就換一種顏色」,我覺得應該可以自己寫寫看,
      上述文章提供的內容已經差不多了不是嗎?再加上一個全域變數,儲存現在的狀態(顏色),按一下開關就換到下一個。

      Delete
    14. 抱歉,我現在已經可以用按鈕控制RGB的燈了
      但什麼是全域變數,要怎麼打才能儲存現在的狀態!!!!

      Delete
    15. 什麼是全域變數

      Delete
    16. 全域變數是從程式開始到結束都存在的變數,而且可被程式裡任何地方存取。

      全域變數不是Arduino的範疇,而是C程式語言的東西。

      Delete
  50. 葉難前輩您好
    我想請問一下,最近在練習使用感測器,是電子羅盤"TDCM3"
    他會回傳三筆資料,
    我想要一次接受三筆資料到SERIAL MONITOR上做顯示
    可是不知道該如何做讀取資料的動作
    希望能請您指點一下該從哪方面下手

    ReplyDelete
    Replies
    1. 沒找到TDCM3的程式庫,所以應該要自己看TDCM3的datasheet、timing diagram(timing chart),自己寫程式與之溝通。

      google 'TDCM3'找到的datasheet裡,滿清楚的,控制TDCM3的RX與RTS,便可設定模式,然後TDCM3會透過TX傳出資料。

      記得序列介面兩端的腳位須跨接,也就是TDCM3的RX須接另一端的TX。

      Delete
    2. 受益良多 感謝指導

      Delete
    3. 再請教一下 如果我要讀取從TX收到的資料 該用Serial.readBytes 還是用Serial.read呢

      Delete
    4. 不都是讀取嗎?
      但兩支函式的介面與行為不同,read若無資料,會回傳-1,呼叫readBytes須提供存放的地方,以及想讀取幾個bytes,可能會timeout。
      請參閱Arduino官方文件http://arduino.cc/en/Serial/ReadBytes

      Delete
  51. 請問我要如何在這程式碼 新增一個led燈 或開關?
    他是一直顯示 該功能不存在
    以下是我修改過的程式碼
    import processing.serial.*;
    import ddf.minim.*;
    import ddf.minim.analysis.*;
    import cc.arduino.*;

    Minim minim;
    AudioPlayer song;
    BeatDetect beat;
    BeatListener bl;
    Arduino arduino;

    int ledPin = 12; // LED connected to digital pin 12
    int ledPin2 = 8; // LED connected to digital pin 1
    int ledPin3 = 2; // LED connected to digital pin 0
    int ledPin4 = 4;

    float kickSize, snareSize, hatSize , fuckSize;

    void setup() {
    size(800, 600, P3D);

    minim = new Minim(this);
    arduino = new Arduino(this, Arduino.list()[1], 57600);

    song = minim.loadFile("aa.mp3", 2048);
    song.play();
    // a beat detection object that is FREQ_ENERGY mode that
    // expects buffers the length of song's buffer size
    // and samples captured at songs's sample rate
    beat = new BeatDetect(song.bufferSize(), song.sampleRate());
    // set the sensitivity to 300 milliseconds
    // After a beat has been detected, the algorithm will wait for 300 milliseconds
    // before allowing another beat to be reported. You can use this to dampen the
    // algorithm if it is giving too many false-positives. The default value is 10,
    // which is essentially no damping. If you try to set the sensitivity to a negative value,
    // an error will be reported and it will be set to 10 instead.
    beat.setSensitivity(100);
    kickSize = snareSize = hatSize = fuckSize = 16;
    // make a new beat listener, so that we won't miss any buffers for the analysis
    bl = new BeatListener(beat, song);
    textFont(createFont("Helvetica", 16));
    textAlign(CENTER);

    arduino.pinMode(ledPin, Arduino.OUTPUT);
    arduino.pinMode(ledPin2, Arduino.OUTPUT);
    arduino.pinMode(ledPin3, Arduino.OUTPUT);
    arduino.pinMode(ledPin4, Arduino.OUTPUT);
    }

    void draw() {
    background(0);
    fill(255);
    if(beat.isKick()) {
    arduino.digitalWrite(ledPin, Arduino.HIGH); // set the LED on
    kickSize = 32;
    }
    if(beat.isSnare()) {
    arduino.digitalWrite(ledPin2, Arduino.HIGH); // set the LED on
    snareSize = 32;
    }
    if(beat.isHat()) {
    arduino.digitalWrite(ledPin3, Arduino.HIGH); // set the LED on
    hatSize = 32;
    }
    if(beat.isFuck()) {
    arduino.digitalWrite(ledPin4, Arduino.HIGH); // set the LED on
    fuckSize = 32;
    }

    arduino.digitalWrite(ledPin, Arduino.LOW); // set the LED off
    arduino.digitalWrite(ledPin2, Arduino.LOW); // set the LED off
    arduino.digitalWrite(ledPin3, Arduino.LOW); // set the LED off
    arduino.digitalWrite(ledPin4, Arduino.LOW);
    textSize(kickSize);
    text("KICK", width/4, height/2);
    textSize(snareSize);
    text("SNARE", width/2, height/2);
    textSize(hatSize);
    text("HAT", 3*width/4, height/2);
    textSize(fuckSize);
    text("FUCK", 5*width/2, height/3);
    kickSize = constrain(kickSize * 0.95, 16, 32);
    snareSize = constrain(snareSize * 0.95, 16, 32);
    hatSize = constrain(hatSize * 0.95, 16, 32);
    fuckSize = constrain(fuckSize * 0.95, 16, 32);
    }

    void stop() {
    // always close Minim audio classes when you are finished with them
    song.close();
    // always stop Minim before exiting
    minim.stop();
    // this closes the sketch
    super.stop();
    }

    ReplyDelete
  52. int ledPin4 = 4; 這是我修改的LED燈

    ReplyDelete
    Replies
    1. 應該不是「int ledPin4 = 4;」的問題,

      你的BeatListener在哪裡?沒有這個class的定義,當然無法編譯。
      By the way, what is the error message?

      Delete
  53. 不好意思,我是參考這個網站做法
    http://site.douban.com/110062/widget/notes/5348693/note/179163604/
    無毒放心
    執行時是利用這個Processing去執行的
    所以我也不知道在哪裡....
    那有沒有辦法讓他一直重複播放呢?

    ReplyDelete
    Replies
    1. 該網站的BeatListener在舊版的Processing的範例程式碼裡。

      Delete
  54. 葉老師您好
    小弟我想透過讀取SD卡裡面的程式碼 來控制LED燈
    我先在SD卡裡面存取控制LED閃爍的程式碼,之後也在板子接上LED燈
    執行之後Serial Monitor會顯示SD卡裡的程式碼
    但似乎卻沒有回傳給LED燈,是不是還少打些甚麼呢?
    以下是我從SD卡的ReadWrite範例去稍微修改的程式碼

    #include
    #include

    const int chipSelect = 4;

    File myFile;

    void setup()
    {

    Serial.begin(9600);
    while (!Serial) {
    ;
    }


    Serial.print("Initializing SD card...");


    if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
    }
    Serial.println("initialization done.");

    myFile = SD.open("song1.txt", FILE_READ);


    myFile = SD.open("song1.txt");


    while (myFile.available()) {
    Serial.write(myFile.read());
    }

    myFile.close();
    //}
    }

    void loop()
    {
    // nothing happens after setup
    }

    ReplyDelete
    Replies
    1. 若以一句話回答你的問題:「做不到」。你的程式就是從SD卡讀出檔案內容,輸出到Serial Monitor,如此而已,並不是執行該檔。

      進一步思考,放在SD卡裡的檔案若是編譯後的形式,那麼就需要進行燒錄,燒錄到Arduino的微控制器晶片的Flash裡,才能執行。若SD卡裡的檔案是原始碼形式,那就需要某種直譯器,讀取檔案並執行。

      Delete
  55. 抱歉 小弟剛接觸Arduino不久,也沒有甚麼c語言的底子.....
    那在請問一下,
    讓SD卡裡的檔案輸出到控制板上執行要怎麼寫呢?

    ReplyDelete
    Replies
    1. 把SD卡裡的程式檔案燒錄到Arduino裡不就好了?

      為什麼你想要這麼做?這並不是Arduino適合的使用情境。

      Delete
    2. 另一種方式是
      SD裡的文字檔案含有指令,由Arduino讀取後進行解析、然後執行。

      Delete
    3. 那這種方式要怎麼寫呢
      能麻煩您寫個範例嗎

      Delete
    4. 我說的這種方式,基本上已經類似於直譯器(interpreter)的形式,不過不必那麼龐大,只需實作控制Arduino腳位的指令即可。

      我說的這種方式應該不適用於你的情況。至於範例的話,最近恐怕沒空閒。


      我覺得,您從PC透過PCI1751來傳輸資料、程式碼、控制FPGA,現在想把PC換掉,
      暫時想到兩種途徑:
      1. 保留PCI1751,那麼就須想辦法讓你的板子連接PCI1751,然後找出PCI1751的介面,原本從PC是如何控制PCI1751的,現在改由板子來做。
      2. 拿掉PCI1751的話,讓板子直接連接FPGA,可是必須重新實現原本PCI1751負責的功能,一般板子都沒有那麼多TTL序列埠吧,若有的話,接下來必須查詢FPGA的控制介面,每個針腳/腳位的意義與功能,然後撰寫程式,該程式的功能應該就等同於原本PC端軟體的功能。

      Delete
  56. 小弟我原本是用PC來控制FPGA,
    想用Arduino來取代PC,
    然後用Arduino這邊的SD卡裡的檔案讓FPGA動作

    ReplyDelete
    Replies
    1. 請問你SD卡裡的檔案是什麼?執行檔?Arduino的程式原始碼檔?

      感覺你應該換用較高等的單板電腦,譬如Raspberry Pi、Beaglebone等。

      Delete
  57. FPGA的原始碼
    譬如小弟我Arduino這邊接個TFT螢幕,
    之後我觸發螢幕上的按鍵讓SD卡輸出原始碼到FPGA,
    來讓接在FPGA上的零件動作

    ReplyDelete
    Replies
    1. 原始碼?我似乎有部分誤會你的問題。

      那你原本PC與FPGA怎麼連接,現在Arduino與FPGA就該怎麼連接。
      是靠序列埠介面嗎?
      之前的程式碼Serial.write(myFile.read());是把檔案內容輸出到Serial Monitor,
      現在也應差不多,但要輸出到與FPGA連接的序列埠。序列埠兩端必須設定相同的傳輸速率。

      Delete
    2. 我也沒有把問題詮釋得很清楚.......
      原本PC是透過PCI1751與FPGA連接的

      Delete
    3. 呃,根據產品網頁
      http://www.advantech.tw/products/1-2MLKCO/PCI-1751/mod_19D4BE9A-35C4-4AA9-B2D6-B7CDE68D60B5.aspx
      PCI1751有48個TTL輸出入,Arduino並沒有那麼多,就算有也是以軟體模擬,不適合。
      而且這麼多線路,你怎麼知道哪個線路負責什麼功能,要傳什麼資料?
      FPGA板子有說明書、手冊嗎?

      Delete
  58. 您好最近想做一個關於ARDUINO的專題研究
    有一些問題想請教您

    ReplyDelete
    Replies
    1. 有問題請留言,盡量回答。

      Delete
  59. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. UTFT_Buttons_Bitmap_123.ino:33:38: error: conflicting declaration 'int reback'
      UTFT_Buttons_Bitmap_123.ino:33:45: error: conflicting declaration 'int song1'
      名稱重複宣告。

      Delete
    2. 才剛PO完問題之後自己就找到了哪裡重複 所以刪掉了...

      Delete
    3. 可先看錯誤訊息,試著找出錯誤。

      Delete
  60. 請問一下,我最近想做一個智慧手環,想請問一下要買 arduino pro mini 還是 arduino nano 還是 arduino pro micro ? 這三者有何差異呢?

    ReplyDelete
    Replies
    1. 呃,請自己看各產品的spec吧,
      http://arduino.cc/en/Main/ArduinoBoardProMini
      http://arduino.cc/en/Main/arduinoBoardNano
      https://www.sparkfun.com/products/12640

      主要是比較價錢、微控制器晶片型號、運作電壓、有無內建USB轉序列傳輸功能、尺寸大小、等等。

      Delete
  61. 謝謝回答(關於之前的問題)
    我再問一個問題:有沒有像這個網頁http://oszine.com/retroband/上的充電電池可以推薦呢?(如果可以的話請提供商品型號或網頁,不知道也沒關係)
    話說我的問題我自己都看不到,是我眼殘還是電腦問題?

    ReplyDelete