總瀏覽量

2016年5月31日 星期二

更新 Motoduino WiFi Terminal (ESP8266) 韌體 步驟(Update Firmware)


刷新 Motoduino WiFi Terminal 韌體 步驟如下 :




使用材料:

1. Micro USB   x 1
2. USB TO TTL 轉接線  x 1
3. RJ114pin杜邦線  x 1
4.軟體功具 ESP DOWNLOAD TOOL V2.4 



大致上步驟:
1. 硬體接線如下圖:
黑色接 GND   黃色接 TX    綠色接 RX






   


2.  設定WiFi 模組為PRG 模式(燒錄韌體模式)。把UCB TO TTL接到PC,然後WiFi模組開關撥到PRG位置,如下圖







  

3.  開啟FLASH TOOL (ESP_DOWNLOAD_TOOL_V2.4.exe),設定如下面畫面!





  


4.  燒錄韌體成功畫面如下








  
5.  關閉 FLASH TOOL 燒錄功具, 開啟Arduino IDE Serial Monitor, 且設定如下圖!






6.  修改 baud rate 9600





7.  檢查是否修改成功,修改Serial Monitor baud rate 9600, 然後輸入 AT 命令, 如回應 OK, 表示修改成功! 接下來就可以接到Arduino 板子上使用!




前往 Motoduino 
FB: Motoduino Taiwan

2016年2月19日 星期五

AT Commands sending to ESP8266 from Arduino IDE Serial

This is a Arduino sketch for AT Commands sending from Arduino Serial(TxRx) to ESP8266.
When AT commands is received by arduino, they will bypass arduino to ESP8266!



Connection examples: Motoduino WiFi Module(ESP8266) with S4A IO Board

Connections example: ESP-12


Copy and paste the following sketch to Arduino IDE! Enjoy!

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <SoftwareSerial.h>
SoftwareSerial esp8266(3,2);  // use pins (3,2) for software serial  S4A IO board
                                                // Rx : D3,  Tx: D2
#define DEBUG true
#define BUFFER_SIZE 512
char serBuffer[BUFFER_SIZE];
char command[128];

void setup() {

    Serial.begin(9600); // start serial communication at 9600bps
    esp8266.begin(9600); // Modify it for your esp8266 module

    Serial.println("Ready...");
}

void loop() {
  char ser_char;

    if(Serial.available()>0){
       Serial.readBytesUntil('\n', serBuffer, BUFFER_SIZE);
       int len = strlen(serBuffer);

       if(3 == len)
       {
           serBuffer[len]='\n';
           if(!strncmp(serBuffer, "AT\r\n",4))
             sendData(serBuffer, 1000, DEBUG);
       }
       else if(( len > 3)&&(serBuffer[2]=='+'))
       {
            Serial.readBytesUntil('\n', serBuffer, BUFFER_SIZE);
            len = strlen(serBuffer);
            serBuffer[len]='\n';
            //Serial.println(serBuffer);          
            sendData(serBuffer, 2000, DEBUG);
       }
          clearBuffer();
    }
}

String sendData(String command, const int timeout, boolean debug)
{
    String response = "";
   
    esp8266.print(command); // send the read character to the esp8266
    long int time = millis();
    while( (time+timeout) > millis())
    {
      while(esp8266.available())
      {      
        // The esp has data so display its output to the serial window
        char c = esp8266.read(); // read the next character.
        response+=c;
      }
    }
    if(DEBUG){
      Serial.print(response);
    }
    return response;
}

void clearBuffer(void) {
       for (int i =0;i<BUFFER_SIZE;i++ ) {
         serBuffer[i]=0;
       }
}

2016年2月5日 星期五

Motoduino WiFi Terminal Esp8266(ESP-12)


"硬"式要它更簡單!
今天要來介紹新設計的無線模組Motoduino WiFi Terminal(下圖), 此模組主要元件為 ESP8266(ESP-12). 其實用法與原始模組ESP8266一樣! 不過在此設計就是希望接線簡單化配合Motoduino 一些模組應用更方便!


主要有兩種方式可以使用此WiFi Terminal.

一. 結合Arduino使用
   透過S4A IO/Sensor Board 的RJ11孔位可以很方便連接Arduino開發板,下圖是配合 S4A IO Board 製作遙控車(Motoduino U1 + S4A IO Board + WiFi Teminal)! 因為ESP8266可以是AP及Station Mode,所以使用上更方便! (此範例使用Software Serial方式)
通常ESP8266有時需要較大的電流安培數(約200mA),往往Arduino本身提供的5V電源不太足夠,尤其如果再加上一些感測元件上去使得板子電流耗損更大,也因此常常聽到使用者談到穩定性問題!大部分原因來自於電源穩定性(在實驗時或從ESP8266官網了解)! 所以此模組提供一個Micro USB的外部電源接頭, 當Arduino提供電流不足給WiFi Terminal時可以利用外部電源! 此Terminal有提供開關可以電源切換!


Youtube 影片!


二. WiFi Terminal 單獨運行(如下圖)!
ESP8266本來就可以獨立運行(Standalone mode), 此WiFi Terminal模組可以利用RJ11接頭接上USB-Serial 傳輸線即可以對WiFi Terminal作programming! (如下圖).



如果只是作個單一控制應用, 也可以利用RJ11接頭接上Motoduino一些Terminal如(Led, Relay, button, 等模組), 如下圖!

Youtube 影片!


如果有更複雜的應用,也可以把兩邊擴充的腳位焊上排針插在麵包板上延伸利用! 另外對Arduino 開發者來說, ESP8266也提供Library給Arduino 使用者, 透過簡單API及範例可以縮短開發時程!



    http://www.motoduino.com



2015年12月15日 星期二

Kozig LED I2C介面的七段顯示器(另一版): 修改I2C Address


此次來說明 Kozig I2C LED 七段顯示器 另一版 如何修改 I2C Address!
此版本出貨時 default I2C address 為 0x51, 可以利用Arduino 的 I2C scan address 找出!




修改步驟與前一版相同! 但是有兩點要注意:
1. I2C Address 設定不一樣,例如 default 0x51 要改成  0x27則
   程式內要寫成

  #define ZTSEG8B4_ADDR  (0x27<<1) // 0x4E // 0100111xB  

 詳細可以看Ztlib library內範例 SEG8B4A036A_SetAddress

2. 因為有些I2C command不一樣, 所以Arduino Ztlib library也不一樣!
   下載處(LED _CA_ version


步驟如下:

1.斷電情況下將SCL接到GND, SDA接A4.
2.接通電源,顯示 _CA_ 時,表示進入設定新地址模式.
3.再將原來SCL接GND改接到A5.
4.執行 SEG8B4A036A_SetAddress, (ztlib example)結束時會顯示新位置.
    例如新位置為 0x27 則顯示 _4E_
5. 移除電源,LED 模組已改成新位址!





2015年10月21日 星期三

LED Web Controls by Intel Edison with I2C LCD1602


I2C devices 加到Intel Edison 其實很簡單,做法與arduino相同, 接上I2C device到 Edison Arduino後(藉由 S4A IO Board容易連接,請接到A4A5 位置),可以試著檢查系統是不是有偵測到裝置,command如 " i2cdetect -y -r 6 " , 直此命令後可以看到裝置的 I2C address. 注意的是Intel Edison 的 I2C bus是在 bus 6(Different to Raspberry Pi).

此實驗LCD顯示 Edison IP address, 然後User透過WIFI在瀏覽器上控制LED ON/OFF.

使用材料(Materials):
1. Intel Edison + Arduino Breakout Kit
2. S4A IO Board
3. I2C LCD1602
4. LED Terminal

首先, 把所有東西都接上去, 如下圖 , LCD1602接到 IO Board的 A4A5 位置, LED Terminal接到 D2D3 孔位.



1. 進入 Edison board system, 然後輸入 如下圖.


  LCD1602的 I2C address is 0x27

2. Open Arduino IDE,  copy the below sketch and paste it to Arduino IDE.

 #include <SPI.h>
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

char ssid[] = "xxxxxxx";      //  your network SSID (name)
char pass[] = "xxxxxxx";         // your network password
int keyIndex = 0;                 // your network key Index number (needed only for WEP)
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

int status = WL_IDLE_STATUS;
WiFiServer server(8080);

void setup() {
  Serial.begin(9600);      // initialize serial communication
  pinMode(2, OUTPUT);      // set the LED pin mode

  lcd.init();                      // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();

  lcd.print("Connecting...");

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while(true);        // don't continue
  }

  String fv = WiFi.firmwareVersion();
  if( fv != "1.1.0" )
    Serial.println("Please upgrade the firmware");

  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:  
    status = WiFi.begin(ssid, pass);
    // wait 10 seconds for connection:
    delay(10000);
  }
  server.begin();                           // start the web server on port 80
  printWifiStatus();                        // you're connected now, so print out the status
}


void loop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:  
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/H\">here</a> turn the LED on pin 9 on<br>");
            client.print("Click <a href=\"/L\">here</a> turn the LED on pin 9 off<br>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;      
          }
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        }  
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(2, HIGH);               // GET /H turns the LED on
          Serial.println("LED ON");
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(2, LOW);                // GET /L turns the LED off
          Serial.println("LED OFF");

        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);

  lcd.clear();
  lcd.print(ip);

}

然後自行修改 ssid 和 pass 參數符合自己的 Router. (請自行下載 LiquidCrystal_I2C library)

3. Upload sketch to Edison. 等幾十秒鐘LCD會顯示 IP address.
4. 開啟PC瀏覽器輸入IP address and port 8080, 例如  http://192.168.1.28:8080

   請參考影片!

       https://youtu.be/vfpTnySBfiw



2015年3月25日 星期三

利用 Motoduino 修改 HC-06 藍牙模組名稱 (Change bluetooth 2.0 name)


通常在市面上買來的HC-06藍牙模組 名稱大都是 linvor 或 HC-05, 這次來說明利用motoduino來修改模組名稱(其實跟修改baud rate方法一樣,只是AT Command不同)

在 Motoduino上修改藍芽模組Baud Rate很簡單 步驟如下:

範例說明是以藍牙HC-06傳輸速率Baud Rate為 57600 bps例子

1.打開 Arduino IDE 輸入底下程式(下圗)

2.把Motoduino接上PC

3.Compile程式然後upload到板子.

4.等upload完後,移開motoduino跟PC連線,插上藍芽模組(如下圗).



5. 把Motoduino再接上PC, 然後開啟Arduino的Serial Monitor如下圖注意右下角的baud rate欄位選成57600bps,  Serial Monitor內會顯示AT+NAMEMotoduinoOKsetname (如下圗), 此時藍芽模組名稱已改成Motoduino.

6. 可以用android手機連線試試!


ps. 修改藍牙模組 baud rate 請參考這裡 







2014年11月16日 星期日

Arduino NFC/RFID = Arduino UNO + NFC Reader (PN532)


NFC/RFID 實驗在Arduino 上其實也很簡單, 這次利用PN532相容板來做實驗, 此塊板子支援 I2C 和 SPI介面, 我就來用 SPI 跟Arduino連接! 參考下圖:

Arduino       PN532
    D10  ------>  SS
    D11  ------>  MOSI
    D12  ------>  MISO
    D13  ------>  SCK
     5V  ------->  5V
    GND ------>  GND






Sketch 範例程式:

 #include <arduino.h>
#include <PN532.h>

#define SCK 13
#define MOSI 11
#define SS 10
#define MISO 12

PN532 nfc(SCK, MISO, MOSI, SS);

void setup(void) {
    Serial.begin(9600);
    Serial.println("Hello!");

    nfc.begin();

    uint32_t versiondata = nfc.getFirmwareVersion();
    if (! versiondata) {
        Serial.print("Didn't find PN53x board");
        while (1); // halt
    }
    // Got ok data, print it out!
    Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);
    Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);
    Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
    Serial.print("Supports "); Serial.println(versiondata & 0xFF, HEX);

    // configure board to read RFID tags and cards
    nfc.SAMConfig();
}


void loop(void) {
    uint32_t id;
    // look for MiFare type cards
    id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);

    if (id != 0) {
        Serial.print("Read card #"); Serial.println(id);
    }
}


PN532 arduino library 下載點 here.

很簡單! 拿起 NFC tag 感應一下就會跑出 Card id.