Jumat, 04 November 2016

Tutorial NodeMCU: Memulai WeMos D1 mini dengan LUA (ESP8266, WeMos, Lua)

Tulisan ini saya buat berdasarkan pengalaman ketika bekerja dengan WeMos D1 mini dengan menggunakan firmware NodeMCU versi 0.9.6. Dengan diperkaya dengan berbagai petunjuk yang ada di Internet ketika menghadapi kendala-kendala.

WeMos D1 mini merupakan board berbasis ESP8266 yang memiliki ukuran yang relatif kecil dibandingkan dengan board ESP8266 lainnya seperti NodeMCU V1.0 dengan keunggulan tersedianya sumber tegangan 5Volt (USB) yang memungkinkan anda menghubungkan board anda dengan berbagai modul elektronik yang membutuhkan sumber tegangan 5Volt.

Pengembangan aplikasi pada WeMos sebagaimana board ESP8266 lainnya dapat menggunakan Arduino maupun LUA. Untuk pengembangan menggunakan bahasa pemrograman LUA anda perlu menginstalasi firmware NodeMCU pada board anda.

Interface antara board WeMos D1 mini dengan  komputer dilakukan melalui Micro USB, dimana pada komputer diinstalasi driver USB to UART driver CH340 yang dapat didownload pada https://www.wemos.cc/downloads.

Gambar  1. USB to UART driver CH340

Setelah proses instalasi, maka pada Device Manager komputer anda, akan bertambah COM port yang nantinya akan digunakan untuk proses flash firmware NodeMCU maupun proses upload aplikasi ke board.

Gambar 2. USB-SERIAL CH340 (COM8)

Untuk proses flash firmware NodeMCU, anda membutuhkan software nodemcu-flasher-master yang dapat diperoleh di https://github.com/nodemcu/nodemcu-flasher, jalankan dan klik pada Flash.

 
Gambar 3. Muncul Waiting MAC pada saat Flash

Jika sewaktu melakukan flash firmware NodeMCU tidak berhasil dilakukan, dengan pesan Waiting MAC terus menerus, maka berarti bahwa broad anda tidak berhasil memasuki flash mode. Langkah yang dapat dilakukan adalah melakukan pull-down pin D3 atau GPIO 0 ke LOW (dengan menghubungkan pin D3 ke GND).

Gambar 4. Pull Down pin D3 ke LOW

Jika proses flash firmware berhasil dilakukan, maka akan tampil sebagaimana gambar 5.

Gambar 5. Proses flash firmware berhasil dilakukan.

Sesaat setelah flash firmware berhasil dilakukan, ingat untuk mencabut kembali kabel pin D3 ke GND.
Selanjutnya adalah silakan download software Esplor yang berfungsi untuk sebagai editor, dan upload aplikasi LUA ke board yang dapat didownload di https://esp8266.ru/esplorer/

Gambar 6. Paket Esplor ESP8266

Untuk koneksi ke firmware NodeMCU, maka isikan nomor port, dan kecepatan 9600 baud untuk firmware NodeMCU versi 0.9.6 atau 115200 baud untuk versi yang lebih baru, dan klik Open. Jika koneksi tidak berhasil dilakukan, maka tekan tombol reset pada board.
Gambar 7. Reset Button WeMos D1 mini

Pada tulisan ini saya menggunakan firmware NodeMCU 0.9.6, sehingga kecepatan yang saya gunakan adalah 9600 baud.

Jika koneksi anda tidak berhasil dengan pesan dibawah ini, maka silakan tekan tombol reset.

PORT OPEN 9600

Communication with MCU..
Jika koneksi berhasil dilakukan, maka akan muncul pesan dan tanda prompt (>):
NodeMCU 0.9.5 build 20150318  powered by Lua 5.1.4
lua: cannot open init.lua
>  
Jika setelah reset juga tidak berhasil muncul prompt dengan pesan dibawah, maka coba pull-up pin D3 dengan cara menghubungkan pin D3 ke 3V3, dan coba tekan reset sekali lagi.
Can't autodetect firmware, because proper answer not received (may be unknown firmware).
Please, reset module or continue.
Jika pada layar muncul ASCII acak seperti berikut ini, maka pastikan kecepatan adalah 9600 baud (versi 0.9.6) atau 115200 baud (versi setelah 0.9.6)
ÙVíbÕˆÃaÁaEÁÿÁQÔa�„Á!ÁsáÁÿÑQÔá£âø

Jika tetap gagal Boot, maka Boot log dapat dibaca dengan 74880 baud untuk membaca log boot rom:
ets Jan  8 2014,rst cause 1, boot mode:(3,7)

load 0x40100000, len 24236, room 16
tail 12
chksum 0xb7
ho 0 tail 12 room 4
load 0x3ffe8000, len 3008, room 12
tail 4
chksum 0x2c
load 0x3ffe8bc0, len 4816, room 4
tail 12
chksum 0x46
csum 0x46
Jika segalanya sudah Ok, maka anda dapat memulai membuat aplikasi untuk startup yang defaultnya adalah init.lua. Sesuatu hal yang penulis ingatkan terkait dengan file init.lua adalah file yang secara otomatis akan dieksekusi oleh platform NodeMCU setiap kali booting.

Perhatian:
Jangan menulis script langsung pada file init.lua, karena jika terdapat bugs didalam script anda, bisa menyebabkan sistem reboot dan terjebak pada reboot loop tak terhingga, sehingga anda terpaksa harus melakukan flash ulang firmware anda.

Berikut ini adalah contoh yang dapat menyebabkan terjebak pada reboot loop tak terhingga jika script berikut ini terjadi pada init.lua (jangan dicoba).

while true do
   ...
end

Kode diatas akan mengakibatkan watchdog timer membangkitkan suatu wdt timeout pada karena proses looping memakan keseluruhan waktu CPU karena bekerja secara non-interrupt mode sehingga kode lainnya akan terblokir. Watchdog timer merupakan mekanisme pemantauan untuk mencegah proses menggunakan waktu processor melampaui 5 detik, Watchdog timer akan memicu wdt timeout yang menyebabkan reboot ulang.

Perintah lainnya yang juga perlu menjadi perhatiaan anda karena bekerja secara non-interrupt mode adalah perintah tmr.delay(uSecond),  jika pada task berjalan (callback) memakan waktu lebih dari 10 mSec, maka menyebabkan kegagalan pada stacks Wifi dan TCP, sehingga jika anda menginginkan delay lebih dari 8 mSec atau lebih, maka pemakaian tmr.delay() adalah pendekatan yang salah (anda dapat mensiasati dengan menggunakan tmr.alarm silakan lihat contoh pada app.lua dibawah).

Karena dikembangkan dengan  ukuran menjadi masalah, pemakaian perintah yang salah script yang dapat dapat dengan mudah memicu "PANIC" pada sistem dan menyebabkan reboot ulang:
PANIC: unprotected error in call to Lua API (app.lua:4: attempt to call field 'mode1' (a nil value))

Script init.lua ini saya ambil dari internet dan lakukan modifikasi untuk pemakaian praktis, dimana script pada init.lua berfungsi untuk mendeteksi keberadaan file credentials.lua, file credentials.lua menyimpan setting SSID dan PASSWORD wifi, jika file ini tersedia, maka akan dijalankan, dan dilanjutkan untuk melakukan koneksi ke wifi dan menjalankan file app.lua, jika file credentials.lua tidak tersedia maka proses akan dilanjutkan untuk menjalankan app.lua.

init.lua
-- aplikasi ini berfungsi menghindarkan module anda terjebak
-- pada kondisi restart tak terhingga jika terjadi bugs pada
-- init.lua.

-- aplikasi dapat berjalan pada dua modus, yaitu standalone
-- atau terkoneksi ke wifi.

-- agar dapat terkoneksi ke wifi, maka username dan password
-- didefinisikan pada file credentials.lua

-- aplikasi akan menunggu selama 3 detik sebelum file app.lua
-- dieksekusi, jika terjadi bugs pada app.lua, maka anda
-- dapat menjalankan file.remove("app.lua") sehingga tidak
-- terjebak pada kondisi restart tak terhingga.

function startup()
    print("Running")
    -- aplikasi autoexec anda  sekarang adalah 'app.lua'
    if file.open("app.lua") == nil then
        print("app.lua tidak tersedia atau terhapus.")
    else 
        file.close("app.lua")
        dofile("app.lua")
    end
end

-- periksa keberadaan file credentials.lua yang mendefinisikan
-- 'SSID' and 'PASSWORD' wifi
if file.open("credentials.lua") == nil then
    -- bagian module standalone
    print("Tidak ada file credentials.lua!")
    print("Boot sebagai module standalone")
    print("You have 3 seconds to abort")
    print("Waiting...")
    -- jalankan fungsi startup setelah 3 detik      
    tmr.alarm(0, 3000, 0, startup)
else   
    -- bagian module koneksi wifi
    file.close("credentials.lua")
    -- muat variable SSID dan PASSWORD
    dofile("credentials.lua")
    print("Koneksi ke " .. SSID)
    wifi.setmode(wifi.STATION)
    wifi.sta.config(SSID, PASSWORD)
    -- wifi.sta.connect() not necessary because config() uses auto-connect=true by default

    -- mencoba koneksi setiap detik sampai tmr.stop(1)
    trycount = 1
    tmr.alarm(1, 1000, 1, function()
        if wifi.sta.getip() == nil then
            print("trying " .. trycount .. " second(s)")
            trycount = trycount + 1
        else
            -- berhasil koneksi dan mendapatkan IP Address
            tmr.stop(1)
            print("WiFi connected")
            print("You have 3 seconds to abort")
            print("Waiting...")
            -- jalankan fungsi startup setelah 3 detik      
            tmr.alarm(0, 3000, 0, startup)
        end       
    end)
end 
credentilas.lua

-- Credentials
SSID = "BOLT!Super4G-899A"
PASSWORD = "******"
app.lua

--kontanta
LED_PIN = 4 --pin D4 (led built-in)
SATUDETIK = 1000
SETENGAHDETIK = 500

gpio.mode(LED_PIN, gpio.OUTPUT)

function turnoff()
    gpio.write(LED_PIN, gpio.HIGH)
end

function loop()
   gpio.write(LED_PIN, gpio.LOW) -- turn on selama setengah detik
   tmr.alarm(1, SETENGAHDETIK, 0, turnoff) --penganti tmr.delay(500000)
end

tmr.alarm(0, SATUDETIK, 1, loop)
Koding pada NodeMCU, sesuatu hal yang perlu menjadi perhatian adalah nomor pin yang digunakan adalah berdasarkan nomor pin dari ESP8266 langsung, bukan nomor GPIO yang digunakan pada pemrograman Arduino. LED_PIN = 4 dalam hal ini adalah pin D4.

jika aplikasi diatas dijalankan tanpa file app.lua, dan credentials.lua maka akan muncul pesan:

NodeMCU 0.9.5 build 20150318  powered by Lua 5.1.4
Tidak ada file credentials.lua!
Boot sebagai module standalone
You have 3 seconds to abort
Waiting...
app.lua tidak ditemukan, silakan buat app.lua sebagai auto executable.
 jika aplikasi diatas dijalankan tanpa file app.lua, tetapi file credentials.lua sudah disiapkan
NodeMCU 0.9.5 build 20150318  powered by Lua 5.1.4
Koneksi ke BOLT!Super4G-899A
trying 2 second(s)
trying 3 second(s)
WiFi connected
You have 3 seconds to abort
Waiting...
Running
app.lua tidak ditemukan atau terhapus.
jika semua file diatas lengkap, maka akan nampak led built-in pada board berkedip perdetik.


Gambar 8. Script pada editor Esplor

Catatan:
Bagaimana kalau anda mendapatkan PANIC karena adanya kesalahan script pada app.lua yang juga menyebabkan sistem terjebak pada reboot tak terhingga, nomor baris yang menyebabkan PANIC dapat dilihat pada pesan kesalahan.
PANIC: unprotected error in call to Lua API (app.lua:4: attempt to call field 'mode1' (a nil value))
Pada contoh diatas terjadi kesalahan pada baris 4.

Jika terjebak pada reboot tak terhingga, jalankan perintah file.remove("app.lua"), secara otomatis akan menghapus app.lua, dan pada reboot berikutnya proses berhenti dengan pesan:
app.lua tidak ditemukan atau terhapus.

Tidak ada komentar:

Posting Komentar