2016年8月2日 星期二

Ameba Arduino: I2C – 利用I2C讓Ameba與Arduino UNO溝通



I2C介紹
  • I2C裡有兩個角色,一個是Master,另一個是Slave。Master的角色只能有一個,而Slave可以有很多個。每個Slave都有自己的位址(address)編號,所以當Master要與特定的Slave溝通時,就會使用這個位址。I2C使用了兩根接腳,一根是資料線(SDA),另一根是時脈線(SCL)。Master藉由控制SCL讓Slave知道有東西要傳,而資料就可以在SDA上面傳送。I2C在當初Arduino的範例裡,為了親易近人而稱呼I2C為Wire,雖然後來Arduino也承認取名為Wire看來是個錯誤,但在Arduino的example仍然常常看到。(Wire取名的細節請參考此篇中的”Use full, everyday words.”)
這個範例裡,我們將Ameba當作I2C Master Writer, 而Arduino為I2C Slave Receiver。
I2C Master會傳字串到I2C Slave,並且I2C Slave將字串印出來。
  • 準備Arduino Uno為 I2C Slave

首先我們先準備 Arduino,先將Arduino IDE選成Arduino, “Tools” -> “Board” -> “Arduino/Genuino Uno”: 

接著打開 Slave Receiver 的範例,”Examples” -> “Wire” -> “slave_receiver” 

然後點選 “Sketch” -> “Upload” 將程式編譯並上傳到 Arduino Uno。

準備Ameba 為 I2C Master

我們額外再開一個Arduino IDE,確定板子是 Ameba, “Tools” -> “Board” -> “Arduino Ameba” 

然後打開 Master Writer 的範例, “File” -> “Examples” -> “AmebaWire” -> “master_writer”

後點選 “Sketch” -> “Upload” 將程式編譯並上傳到 Ameba。
  • 接線

Arduino的範例裡,使用A4當作I2C SCL, A5為I2C SDA。這些接腳與Ameba一樣。
另外很重要的是,兩塊板子的GND要互接。

打開包含Arduino Uno的Arduino IDE,開啟Serial Monitor, “Tools” -> “Serial Monitor”, 會出現Serial Monitor的視窗,這個視窗可以讓你看到Arduino Uno印出來的訊息。 

接著按下Arduino Uno的Reset按鈕,讓Arduino Uno等待I2C master連接。
再按下Ameba的Reset按鈕,讓Ameba開始傳訊息。這時候會看到Serial Monitor每隔0.5秒出現新的訊息,這樣就代表成功了。
 



程式碼說明
Ameba使用同樣的Arduino範例,Ardunio官方網站的範例說明可以參考這裡:
https://www.arduino.cc/en/Tutorial/MasterWriter

首先Wire.begin()會先設定address, 如果是Master可以不用設定address:
https://www.arduino.cc/en/Reference/WireBegin
接著Master使用Wire.beginTransmission()來設定要傳到哪一個Slave:
https://www.arduino.cc/en/Reference/WireBeginTransmission
使用Wire.write()送資料, 並且最後使用Wire.endTransmission()將所有資料傳出去:
https://www.arduino.cc/en/Reference/WireEndTransmission


master write
#include <Wire.h>

void setup() {
  Wire.begin(); // join i2c bus (address optional for master)
}
byte x = 0;
void loop() {
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte
  Wire.endTransmission();    // stop transmitting

  x++;
  delay(500);
}


           master read

       

#include <Wire.h>

void setup() {
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop() {
  Wire.requestFrom(8, 6);    // request 6 bytes from slave device #8

  while (Wire.available()) { // slave may send less than requested
    char c = Wire.read(); // receive a byte as character
    Serial.print(c);         // print the character
  }

  delay(500);
}

Ameba Arduino: 使用 Ameba 作為 Server 與 Client 通信

Ref : http://www.amebaiot.com/ameba-arduino-server-client/


範例說明

這個範例裡,我們使用 Ameba 連上 WiFi,作為 Server,與連接過來的 Client 進行對話。
首先確定板子是 Ameba, “Tools” -> “Board” -> “Arduino Ameba”

然後打開 Simple WiFi Server的範例, “File” -> “Examples” -> “AmebaWiFi” -> “SimpleServerWiFi”


修改  ssid..  pass ..  和  status = WiFi.begin();
將 WiFi 連線的相關訊息進行修改,將下圖中黃色標註的地方進行對應的修改。
上傳程式碼之後,按下 Ameba 的 Reset 按鈕, 這時會看到 WiFi 連線後的信息。

在 laptop 上的 socket 工具上(本示例中使用的工具為 “sokit” )通過獲取的IP地址以及範例中設定的 port 5000 來進行連線。


選取 Client 模式,填寫 Server IP 和 port 信息,點擊 “TCP Connect”
連接成功后會顯示 ”A client connected to this Server”,以及Client的IP和port訊息。
從 Client 發送一個字串過來,Ameba收到後,會將這個字串再發給 Client。
客戶端會顯示收到這個字串。

程式碼說明

在連線WiFi時會使用到WiFi.begin();
https://www.arduino.cc/en/Reference/WiFiBegin


連線成功后會讀取WiFi的信息:
顯示WiFi的名稱WiFi.SSID()
https://www.arduino.cc/en/Reference/WiFiSSID

顯示WiFi的訊號強度WiFi.RSSI()
https://www.arduino.cc/en/Reference/WiFiRSSI
顯示Ameba的IP信息WiFi.localIP()
https://www.arduino.cc/en/Reference/WiFiLocalIP
設定服務器的端口號WiFiServer server(5000)
https://www.arduino.cc/en/Reference/WiFiServer
開始服務器的監聽server.begin();
https://www.arduino.cc/en/Reference/WiFiServerBegin
判斷是否有客戶端連線server.available()
https://www.arduino.cc/en/Reference/WiFiServerAvailable
從Server讀取數據client.read()
https://www.arduino.cc/en/Reference/WiFiClientRead
對Server發送數據client.write()
https://www.arduino.cc/en/Reference/WiFiClientWrite
與Server斷開連線client.stop();
https://www.arduino.cc/en/Reference/WiFIClientStop

========================================================
code study

char ssid[] = "jacky";      //  your network SSID (name)
char pass[] = "your pass";   // your network password
int keyIndex = 0;                 // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
WiFiServer server(5000);

重點是
WiFiServer server(5000);  ->  port 5000
  server.begin();       
void setup() {
  Serial.begin(9600);      // initialize serial communication
  pinMode(9, OUTPUT);      // set the LED pin mode

  // 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
}


重點是  
 WiFiClient client = server.available();

char buffer[256]
void loop() {
  WiFiClient client = server.available();
  int n = client.read((uint8_t*)(&buffer[0]), sizeof(buffer));
   n = client.write(buffer, n);
     while (true) {
        memset(buffer, 0, 256);
        int n = client.read((uint8_t*)(&buffer[0]), sizeof(buffer));
        if (n <= 0) break;

        n = client.write(buffer, n);
        if (n <= 0) break;
    }
        
    client.stop();
}



Ameba Arduino: 使用 Ameba 連接WiFi

Ref : http://www.amebaiot.com/ameba-arduino-connect-wifi/


範例說明
常見的WiFi有三種加密方式,一種為OPEN,即沒有密碼,第二種為WPA,即我們通常使用的密碼,第三種為WEP,會需要十六進制的密碼以及一個初向量(keyindex)。
下面我們將分別介紹這三種加密方式的WiFi連線方法。
首先確定板子是 Ameba, “Tools” -> “Board” -> “Arduino Ameba”

  • Open (即無密碼的WiFi連線)
打開 Connect No Encryption 的範例, “File” -> “Examples” -> “AmebaWiFi” -> “ConnectNoEncryption”

 status = WiFi.begin(ssid);

在SSID後修改“yourNetwork”為要連線的WiFi名稱。
修改之後上傳程式碼,按下Ameba的Reset按鈕, 這時候會看到You’re connected to the networkSSID: XXXXX,以及後面會每十秒列印出WiFi信息。

  • WPA加密模式的WiFi連線
打開 Connect With WPA 的範例, “File” -> “Examples” -> “AmebaWiFi” -> “ConnectWithWPA” 

 status = WiFi.begin(ssid, pass);
在SSID後修改“yourNetwork”為要連線的WiFi名稱, “secretPassword”改為對應的密碼。
修改之後上傳程式碼,按下Ameba的Reset按鈕, 這時候會看到You’re connected to the networkSSID: XXXXX,以及後面會每十秒列印出WiFi信息。


  • WEP加密模式的WiFi連線
打開 Connect With WEP 的範例, “File” -> “Examples” -> “AmebaWiFi” -> “ConnectWithWEP”

在SSID後修改“yourNetwork”為要連線的WiFi名稱, key改為對應的十六進制的密碼,keyIndex 修改為對應的數字。

修改之後上傳程式碼,按下Ameba的Reset按鈕, 這時候會看到You’re connected to the networkSSID: XXXXX,以及後面會每十秒列印出WiFi信息。

 status = WiFi.begin(ssid, keyIndex, key);

程式碼說明
在連線WiFi時會使用到WiFi.begin();
https://www.arduino.cc/en/Reference/WiFiBegin

連線成功後會讀取WiFi的信息:
顯示WiFi的名稱WiFi.SSID()
https://www.arduino.cc/en/Reference/WiFiSSID
顯示WiFi的訊號強度WiFi.RSSI()
https://www.arduino.cc/en/Reference/WiFiRSSI
顯示WiFi的加密方式WiFi.encryptionType()
https://www.arduino.cc/en/Reference/WiFiEncryptionType
顯示連線的路由器的物理地址即BSSID WiFi.BSSID()
https://www.arduino.cc/en/Reference/WiFiBSSID
也會讀取Ameba自己的信息:
顯示Ameba的MAC信息WiFi.macAddress()
https://www.arduino.cc/en/Reference/WiFiMACAddress
顯示Ameba的IP信息WiFi.localIP()
https://www.arduino.cc/en/Reference/WiFiLocalIP
顯示子網掩碼WiFi.subnetMask()
https://www.arduino.cc/en/Reference/WiFiSubnetMask
顯示網關信息WiFi.gatewayIP()
https://www.arduino.cc/en/Reference/WiFiGatewayIP
與Arduino的差異
Arduino在完成WiFi的操作時,需要另外使用WiFi Shield來作為WiFi模塊,因此在使用WiFi是需要#include 來使用SPI與WiFi模塊進行通訊。
但是Ameba自身就具有WiFi模塊的功能,因此,不需要#include 。若想要使用Arduino的範例,要先刪掉這一項。

code study  


char ssid[] = "jacky_0328";     //  your network SSID (name)
char pass[] = "your password";  // your network password
int status = WL_IDLE_STATUS;     // the Wifi radio's status


先等 serial windows 開啟
然後利用一個while loop 去check 連線
 status = WiFi.begin(ssid, pass);
ssid 和pass 就是開始code設定
然後呼叫  printCurrentNet() 和 printWifiData();

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

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

  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 WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }

  // you're connected now, so print out the data:
  Serial.print("You're connected to the network");
  printCurrentNet();
  printWifiData();

}


這邊就和 scan wifi 的例子很像...
void printCurrentNet() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print the MAC address of the router you're attached to:
  byte bssid[6];
  WiFi.BSSID(bssid);
  Serial.print("BSSID: ");
  Serial.print(bssid[5], HEX);
  Serial.print(":");
  Serial.print(bssid[4], HEX);
  Serial.print(":");
  Serial.print(bssid[3], HEX);
  Serial.print(":");
  Serial.print(bssid[2], HEX);
  Serial.print(":");
  Serial.print(bssid[1], HEX);
  Serial.print(":");
  Serial.println(bssid[0], HEX);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(rssi);

  // print the encryption type:
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type:");
  Serial.println(encryption, HEX);
  Serial.println();
}


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

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  Serial.print(mac[5], HEX);
  Serial.print(":");
  Serial.print(mac[4], HEX);
  Serial.print(":");
  Serial.print(mac[3], HEX);
  Serial.print(":");
  Serial.print(mac[2], HEX);
  Serial.print(":");
  Serial.print(mac[1], HEX);
  Serial.print(":");
  Serial.println(mac[0], HEX);

}





realtek scan wifi sample

http://www.amebaiot.com/ameba-arduino-scan-wifi/




範例說明
這個範例裡,我們使用Ameba來檢測周圍的WiFi訊號,並將檢測到WiFi的名稱,加密方式,信號強度等信息打印出來。
首先先確定天線已經接上,
接著確定板子是 Ameba, “Tools” -> “Board” -> “Arduino Ameba”

然後打開 Scan Networks 的範例, “File” -> “Examples” -> “AmebaWiFi” -> “ScanNetworks” :

上傳程式碼之後,按下Ameba的Reset按鈕, 這時候會看到**Scan Networks**下會有搜索到WiFi的數目以及每一個WiFi的訊息。




程式碼說明
1.首先使用的是顯示Ameba自己的物理地址WiFi.macAddress(mac):
https://www.arduino.cc/en/Reference/WiFiMACAddress

2.然後開始搜索周圍WiFi環境的WiFi.scanNetworks()
https://www.arduino.cc/en/Reference/WiFiScanNetworks
3.在打印WiFi具體訊息時使用到的有:
4.顯示WiFi的名稱WiFi.SSID(thisNet):
https://www.arduino.cc/en/Reference/WiFiSSID
5.顯示WiFi的訊號強度WiFi.RSSI(thisNet):
https://www.arduino.cc/en/Reference/WiFiRSSI
6.顯示WiFi的加密方式WiFi.encryptionType(thisNet):
https://www.arduino.cc/en/Reference/WiFiEncryptionType
與Arduino的差異
Arduino在完成WiFi的操作時,需要另外使用WiFi Shield來作為WiFi模塊,因此在使用WiFi是需要#include 來使用SPI與WiFi模塊進行通訊。
但是Ameba自身就具有WiFi模塊的功能,因此,不需要#include 。若想要使用Arduino的範例,要先刪掉這一項。



setup(){


printMacAddress();
}

重點是copy  WiFi.macAddress(mac);

然後把答案放到 mac 這個 byte array


void printMacAddress() {
  // the MAC address of your Wifi shield
  byte mac[6];

  // print your MAC address:
  WiFi.macAddress(mac);
  Serial.print("MAC: ");
  Serial.print(mac[5], HEX);
  Serial.print(":");
  Serial.print(mac[4], HEX);
  Serial.print(":");
  Serial.print(mac[3], HEX);
  Serial.print(":");
  Serial.print(mac[2], HEX);
  Serial.print(":");
  Serial.print(mac[1], HEX);
  Serial.print(":");
  Serial.println(mac[0], HEX);
}


接下來看 loop

void loop() {
  // scan for existing networks:
  Serial.println("Scanning available networks...");
  listNetworks();
  delay(10000);
}



重點就是呼叫了    listNetworks(),  接下來看 listNetworks()



呼叫WiFi.scanNetworks() 得到ssid 的 num

然後用一個loop  ...把所有的ssid 都掃出來

WiFi.SSID(thisNet) 會得到ssid...

WiFi.RSSI(thisNet) 會得到訊號的強度

WiFi.encryptionTypeEx(thisNet) 會得到加密的方式

WiFi.encryptionType(thisNet)    會得到加密的方式

void listNetworks() {
  // scan for nearby networks:
  Serial.println("** Scan Networks **");
  int numSsid = WiFi.scanNetworks();
  if (numSsid == -1) {
    Serial.println("Couldn't get a wifi connection");
    while (true);
  }

  // print the list of networks seen:
  Serial.print("number of available networks:");
  Serial.println(numSsid);

  // print the network number and name for each network found:
  for (int thisNet = 0; thisNet < numSsid; thisNet++) {
    Serial.print(thisNet);
    Serial.print(") ");
    Serial.print(WiFi.SSID(thisNet));
    Serial.print("\tSignal: ");
    Serial.print(WiFi.RSSI(thisNet));
    Serial.print(" dBm");
    Serial.print("\tEncryptionRaw: ");
    printEncryptionTypeEx(WiFi.encryptionTypeEx(thisNet));
    Serial.print("\tEncryption: ");
    printEncryptionType(WiFi.encryptionType(thisNet));
  }
}




2016年8月1日 星期一

realtek 8195am study

Ref : http://www.amebaiot.com/



Step 1. 安裝Driver  

首先將Micro USB接上Ameba,另一端接上電腦:



第一次接上Ameba需要安裝USB驅動程式,Ameba使用標準的ARM MBED CMSIS DAP driver,
你可以在這個地方找到安裝檔及相關說明:
https://developer.mbed.org/handbook/Windows-serial-configuration
在 "Download latest driver" 下載 “mbedWinSerial_16466.exe” 並安裝之後,會在裝置管理員看到mbed serial port:



Step 2. 安裝Arduino IDE開發環境

Arduino IDE在1.6.5版之後,支援第三方的硬體,因此我們可以在Arduino IDE上開發Ameba,並共享Arduino上面的範例程式。
在Arduino官方網站上可以找到下載程式:
https://www.arduino.cc/en/Main/Software
安裝完之後,打開Arduino IDE,為了讓Arduino IDE找到Ameba的設定檔,先到 “File” -> “Preferences”

然後在 Additional Boards Manager URLs: 填入:
https://github.com/Ameba8195/Arduino/raw/master/release/package_realtek.com_ameba_index.json
並且將 “編輯器語言” 從 “中文(台灣)” 改成 English,因為Arduino IDE在中文環境下有問題,也許在Arduino IDE 1.6.7會解決,
Issue內容可參考底下網址:




填完之後按OK,然後因為改編輯器語言的關係,我們將Arduino IDE關掉之後重開。

接著準備選板子,到 “Tools” -> “Board” -> “Boards Manager”

在 “Boards Manager” 裡,它需要約十幾秒鐘整理所有硬體檔案,如果網路狀況不好可能會等上數分鐘。
每當有新的硬體設定,我們需要重開 “Boards Manager”,所以我們等一會兒之後,關掉 “Boards Manager”,然後再打開它,
將捲軸往下拉找到 “Realtek Ameba Boards”,點右邊的Install,這時候Arduino IDE就根據Ameba的設定檔開始下載Ameba所需要的檔案:







Arduino 不只提供許多範例,也提供每個範例的說明文件,包括如何接線,程式碼的說明,技術內容等等……。
這些範例不只是可以在Arduino的板子上使用,也可以在Ameba上面使用。
所以我們可以在Arduino 網站上找到 Blink 的相關說明:
簡單來說,Blink 這個讓 LED 燈泡閃爍,它使用的GPIO接腳是13
Ameba的Pin一樣在D13的位置,根據Ameba的接腳位置圖:





於是我們將電阻以及LED燈泡連接如下圖:
(NOTE:LED裡,長腳的是正極,接到D13的地方,短腳的是負極,接到GND的地方)


Trouble shouting





================================================================