作者:小波、Lance KKo/Aeroprobing
日前參與了由MakerPRO舉辦的Ameba開發板課程,得到了不少心得,由於最近正好在研究TFTLCD螢幕的驅動,所以我們將所學直接派上用場,透過Web端來操控Ameba驅動LED亮度,並同步將控制狀況顯示於LCD面板上頭,本文即為這次入門IoT開發實作的心得分享。
1. Ameba-Arduino IDE Set Up
首先我們需要先安裝開發環境,由於Ameba已支援Arduino的開發環境,所以我們就選用簡單易上手的Arduino IDE來作程式開發。1.6.4版本開始可用板子管理員(board manager),直接從網路上進行Ameba-Arduino 相關裝載,以下就是Ameba的Arduino IDE安裝方法:
(1) 先進行Arduino 1.6.7下載(註:1.6.5版本會有遺漏檔案的情形!)
(2) 打開 Arduino 後,開啟上方選項的[檔案]=>[偏好設定]

(3) 於[額外的板子管理員網址]處輸入以下路徑:
https://github.com/neojou/arduino-ameba/raw/master/release/package_njiot.com_ameba_index.json

(4) 開啟上方選項:[工具]=>[板子]=>[板子管理員]

(5) 等待幾秒後,將拉桿拉到最下方會看到Realtek Ameba Boards的區塊,點選區塊後會出現[安裝]的字樣,接著再點選安裝:

安裝完成後會出現以下畫面:

(6) 最後點選上方選項[工具]=>[板子]往下找到[Arduino Ameba]即完成 Ameba-Arduino 環境設定。
2. 完成LCD與Ameba佈線圖
完成了Ameba-Arduino IDE Set Up 後,我們就可以開始測試Ameba的一些功能,既然現在是 IoT 的時代,那就讓我們試試看用Wi-Fi建立一個Web連線,並且設計簡單的Button去控制Ameba PWM,最後我們再把目前PWM的狀態顯示在LCD上。
首先完成我們的佈線圖,將LCD上面的VCC以及背光(LED)接至3.3V;同時利用D4(PWM)去控制LED燈:

用Ameba控制LCD的佈線圖
3. 撰寫控制程式碼
接著開始撰寫我們的程式碼,其中LED的pin腳位,在上圖中是用D4,但寫程式請用pin 3(line 5);此外,SSID及Passward可改為自己的(line 13, 14)。程式碼如下:
#include <WiFi.h>
#include "SPI.h"
#include "AmebaILI9341.h"
#define LED_pin 3
#define TFT_RESET 8
#define TFT_DC 9
#define TFT_CS 10
#define ILI9341_SPI_FREQUENCY 20000000
int flag=0;
int duty_LED=0;
char ssid[] = "55424255";
char pass[] = "55424255";
int status = WL_IDLE_STATUS;
AmebaILI9341 tft = AmebaILI9341(TFT_CS, TFT_DC, TFT_RESET);
WiFiServer server(80);
void setup() {
Serial.begin(9600);
pinMode(LED_pin, OUTPUT);
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
while (true);
}
while (status != WL_CONNECTED) {
Serial.print("/n-->Network named: ");
Serial.println(ssid);
status = WiFi.begin(ssid,pass);
delay(15000);
}
server.begin();
SPI.setDefaultFrequency(ILI9341_SPI_FREQUENCY);
tft.begin();
Serial.println("\nTFT is OK !!");
}
void loop() {
flag++;
WiFiClient client = server.available();
Serial.println(client);
if (client) {
Serial.println("Start client");
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n') {
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.println("<html>");
client.print("<table align='center' border='5'>");
client.print("<tr>");
client.print("<td colspan='2' align='center'>Control the PWM</td>");
client.print("</tr>");
client.print("<td><input type='button' value='DOWN' onclick=self.location.href=\"/slow\" style='width:90px;height:30px;font-size:20px;'></td>");
client.print("<td><input type='button' value='UP' onclick=self.location.href=\"/quick\" style='width:90px;height:30px;font-size:20px;'></td>");
client.print("</table>");
client.println();
client.println("</html>");
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
if (currentLine.endsWith("GET /quick")) {
duty_LED += 1;
if (duty_LED > 10)
duty_LED=10;
analogWrite(LED_pin,(255/10)*duty_LED);
}
if (currentLine.endsWith("GET /slow")) {
duty_LED -= 1;
if (duty_LED <= -1)
duty_LED=0;
analogWrite(LED_pin,(255/10)*duty_LED);
}
}
}
// close the connection:
client.stop();
Serial.println("client disonnected");
}
if (flag ==2)
{
testText();
flag=0;
}
}
unsigned long testText() {
tft.clr();
tft.setRotation(1);
tft.setCursor(0, 0);
tft.setForeground(ILI9341_GREEN);
tft.setFontSize(3);
tft.println("Ameba_ILI9341");
tft.println(" ");
tft.setForeground(ILI9341_WHITE);
tft.setFontSize(2);
tft.print("Duty Cycle is:");
tft.setForeground(ILI9341_RED);
tft.setFontSize(3);
tft.print(duty_LED*10);
tft.println("%");
tft.setForeground(ILI9341_YELLOW);
tft.setFontSize(3);
tft.println("\n2016 presented by");
tft.setForeground(ILI9341_GREENYELLOW);
tft.println("Aeroprobing Inc.");
}
4. 遠端控制LED亮度並驅動LCD顯示
在完成測試程式碼撰寫並燒入開發板後,打開我們的監視視窗並且按下chip reset ,我們會先看到由Wi-Fi所產生的IP Address,接著LCD作初始化需經過一小段時間,在完成初始化後電腦終端視窗會顯示出”TFT is OK”,如下圖:

接者我們將這組IP Address 輸入至Google Chrome 就可以看到我們所設計的網頁了。

若網頁頁面正常顯示,我們可以看一下LCD目前的狀態,目前Duty Cycle為0,所以LED未亮。

若我們按下網頁的[UP],我們可以增加Duty Cycle的值,讓LED越來越亮。


小結
整體來說,Ameba這個平台可以說是近期配備了Wi-Fi功能的CortexM3核心模組中,性價比(C/P)相當高的一個方案,在支援了Arduino IDE後,開發起來也很容易上手,十分符合像我們這樣預算不高卻又想嘗試做出完整解決方案的Maker用來自由發揮及做開發應用。
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!



2020/05/29
為什麼用D4腳位,寫程式卻是用PIN 3