Minggu, 06 November 2016

Tutorial NodeMCU: NodeMCU custom builds firmware (ESP8266, WeMos, Lua)

Tulisan ini mengajari anda untuk bagaimana upgrade firmware NodeMCU yang disertai dengan kustomisasi module, serta troubleshooting terhadap beberapa pesan kesalahan akibat proses kustomisasi firmware.

Peringatan:
Proses flash firmware berpotensi menghapus script Lua yang telah terinstalasi pada board anda.

Tulisan ini saya buat setelah menyadari bahwa binary firmware standard NodeMCU versi 0.9.5 yang saya gunakan adalah basic yang secara default bawaan dari board NodeMCU yang saya beli dan hanya memasukan beberapa module dasar seperti GPIO, net, node, timer, UART dan wifi ketika saya mencoba melakukan sntp.sync(), dan rtctime.get()

stdin:1: attempt to index global 'sntp' (a nil value)
stack traceback:
    stdin:1: in main chunk
stdin:1: attempt to index global 'rtctime' (a nil value)
stack traceback:
    stdin:1: in main chunk
Dengan munculkan pesan error ditas berarti bahwa module sntp dan rtctime adalah tidak tersedia pada firmware yang terinstalasi pada board WeMos yang saya gunakan, sehingga kustomisasi terhadap firmware perlu dilakukan untuk dapat memanfaatkan perintah diatas.

Keuntungan lainnya dari kustomisasi firmware adalah mendapatkan firmware versi terakhir yang telah dilengkapi dengan berbagai bugs fixed yang mungkin ditemukan pada versi sebelumnya.

Setelah melakukan browsing, akhirnya saya mendarat pada website https://nodemcu-build.com/index.php dimana memungkinkan kita untuk melakukan kostumisasi module-module firmware NodeMCU tanpa perlu mempersiapkan lingkungan built pada komputer kita maupun konfigurasi yang rumit. Pemakaian dari situs ini tidak ribet banget, anda hanya perlu memasukan email, dan konfirmasi serta memilih module-module yang ingin anda masukan ke builds firmware anda. Adapun tujuan pemberiaan email adalah memberikan laporan perkembangan proses built, dan link untuk download hasil built.

Secara default module yang dimasukan adalah GPIO, net, node, timer, UART dan wifi. Anda dapat memilih module lainnya sesuai dengan kebutuhan, jangan memasukan semua module karena akan mempengaruhi ukuran binary firmware.

Pada pengujian ini saya menambahkan module RTC time dan SNTP

Gambar 1. Pilihan Module Custom NodeMCU

Setelah memilih module yang dikehendaki, maka selanjutnya lakukan scroll down dan klik pada Start your build.

Gambar 2. Klik pada Start yout build

Silakan tunggu hasil perkembangan build dengan membuka email anda, untuk mendapatkan konfirmasi kemajuan.

Gambar 3. Konfirmasi kemajuan build

Buka email build finish, dan akan disediakan link download untuk versi integer dan float, versi integer adalah lebih kecil dibandingkan dengan versi float, anda dapat menggunakan versi integer jika didalam proses kalkulasi pada aplikasi tidak melibatkan floating point.

Gambar 4. Link download hasil Built

Dalam hal ini saya mendownload yang versi integer. Setelah mendownload, maka selanjutnya adalah melakukan flash firmware ke WeMos D1 mini dengan menggunakan software nodemcu-master-flasher, pilih Config, dan pilih firmware dengan alamat 0x00000.

Gambar 5. Pilih beri tanda check, file binary Firmware dan alamat 0x0000

Selanjutnya adalah melakukan flash dengan klik pada tab Operation, dan klik pada Flash.

Gambar 6. Hasil Flash berhasil

Aktifkan software Esplor, dan set port yang sesuai dan kecepatan adalah115200 baud, dan klik pada open, jika berhasil akan tampil:
PORT OPEN 115200

Communication with MCU..Got answer! Communication with MCU established.
AutoDetect firmware...

Can't autodetect firmware, because proper answer not received (may be unknown firmware).
Please, reset module or continue.

NodeMCU custom build by frightanic.com
    branch: master
    commit: 7b83bbb2ea134cd85ac9d63108603cc02c4e20f7
    SSL: false
    modules: file,gpio,net,node,rtctime,sntp,tmr,uart,wifi
 build     built on: 2016-11-06 08:50
 powered by Lua 5.1.4 on SDK 1.5.4.1(39cb9a32)
lua: cannot open init.lua
>
Jika muncul Binary, maka pastikan kecepatan adalah 115200 baud untuk firmware diatas 0.9.6, sedangkan firmware setelah itu adalah menggunakan 115200 baud. Berikut ini saya akan mencoba menggunakan module sntp dan rtctime pada app.lua.

Bisa juga setelah anda flash firmware baru, ketika boot pertama kali muncul pesan:
Formatting file system. Please wait...
Maka dapat ditunggu sebentar sampai proses format selesai, dan akan boot normal kembali.

credentials.lua
-- Credentials
SSID = "BOLT!Super4G-899A"
PASSWORD = "********"
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 ditemukan, silakan buat app.lua sebagai auto executable.")
    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
app.lua
sntp.sync("1.id.pool.ntp.org",

 function(sec,usec,server)
   print('setting time to:', sec, usec, "from: " .. server)
   rtctime.set(sec, usec)
   utc = rtctime.epoch2cal(rtctime.get())
   print("Waktu adalah UTC:" .. string.format("%04d/%02d/%02d %02d:%02d:%02d", utc["year"], utc["mon"], utc["day"], utc["hour"], utc["min"], utc["sec"]))
   wib = rtctime.epoch2cal(rtctime.get()+7*60*60) -- tambah 7
   print("Waktu adalah WIB:" .. string.format("%04d/%02d/%02d %02d:%02d:%02d", wib["year"], wib["mon"], wib["day"], wib["hour"], wib["min"], wib["sec"]))     
 end,

 function()
   print('failed!')
 end
)
Jika dijalankan akan menghasilkan:
setting time to:    1478434624    204811    from: 202.65.114.202
Waktu adalah UTC:2016/11/06 12:17:04
Waktu adalah WIB:2016/11/06 19:17:04





Tidak ada komentar:

Posting Komentar