Quantcast
Channel: 可丁丹尼 @ 一路往前走2.0
Viewing all 79 articles
Browse latest View live

ESP8266 自定EEPROM起始位址存資料

$
0
0

ESP8266 自定EEPROM起始位址存資料

撰寫ESP8266 library時需要將設定資透過EEPROM library儲存,但又想要避免使用者在使用我寫的library配合EEPROM library時將資料蓋掉而興起研究ESP8266 EEPROM library的念頭,看看是否有可以利用且不需要自行重寫一個將資料儲存的方式。

原理

EEPROM library在Arduino中是經常使用於斷電儲資料,相容Arduino的ESP8266也不例外,但ESP8266所用的是將flash中某一塊4K的連續位址給予模擬成EEPROM library,至於為什麼是4K呢?主要原因是flash刪除時是以sector為單位1 sector等於4096Bytes(4K),透過ESP8266 SDK提供的API將flash中的資料一次讀取至Buffer中是沒有限制一次就要將4K全讀進Buffer,而Buffer大小由EEPROM.begin()決定,但Buffer大小會佔用記憶體,務必依照自行使用的大小進行宣告才能節省記憶體。

寫入的動作透過commit將flash定址的4K資料刪除後才將Buffer中寫入資料,原理大致上如下圖:

所以要確保資料都會存到flash中,請自行考量commit指令的時機,讓Buffer會寫入flash中。

讀/寫/提交

例如,我確定使用的空間為256bytes時,像下宣告:

    EEPRON.begin(256);

讀位址0的資料:

    byte value = EEPROM.read(0);

寫入資料至位址0:

    byte value;
    value = 'a';
    EEPROM.write(0,value);

範例中的讀、寫資料動作是不會寫入flash,而是對Buffer進行操作,只有commit()時才會寫入flash,這點需要再度強調。

節錄EEPROM.cpp中的read()內容:

    uint8_t EEPROMClass::read(int address) {
      if (address < 0 || (size_t)address >= _size)
        return 0;
      if(!_data)
        return 0;

      return _data[address];
    }

讀取是由address當索引至_data陣列中也就是EEPROM Buffer取得資料,寫入也是寫到陣列中:

    void EEPROMClass::write(int address, uint8_t value) {
      if (address < 0 || (size_t)address >= _size)
        return;
      if(!_data)
        return;

      // Optimise _dirty. Only flagged if data written is different.
      uint8_t* pData = &_data[address];
      if (*pData != value)
      {
        *pData = value;
        _dirty = true;
      }
    }

如果變動的資料與Buffer中的不同就將_dirtytrue,之後commit()就會對flash進行刪除後再將Buffer寫入flash。

    bool EEPROMClass::commit() {
      bool ret = false;
      if (!_size)
        return false;
      if(!_dirty)
        return true;
      if(!_data)
        return false;

      noInterrupts();
      if(spi_flash_erase_sector(_sector) == SPI_FLASH_RESULT_OK) {
        if(spi_flash_write(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast<uint32_t*>(_data), _size) == SPI_FLASH_RESULT_OK) {
          _dirty = false;
          ret = true;
        }
      }
      interrupts();

      return ret;
    }

以上理解原理後在資料儲存至flash的時機點應該就能掌握,避免增加資料遺失的風險。

位址/初始化

Arduino中使用EEPROM是利用EEPROM.begin(size)進行宣告容量,先前已提到這是使用Buffer模擬的,那我們來看一下原始碼:

void EEPROMClass::begin(size_t size) {
  if (size <= 0)
    return;
  if (size > SPI_FLASH_SEC_SIZE)
    size = SPI_FLASH_SEC_SIZE;

  size = (size + 3) & (~3);

  if (_data) {
    delete[] _data;
  }

  _data = new uint8_t[size];
  _size = size;

  noInterrupts();
  spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast<uint32_t*>(_data), _size);
  interrupts();
}

整個EEPROM.cpp主要Class為EEPROMClass之後再宣告成EEPROM,不過先看一下主要的EEPROMClass內容。

上面程式內容知道,經由size設定至內部變數_size,並且由spi_flash_read讀取flash中的內容至_data陣列中,所以_data大小由size來決定, 這也就是為什麼要強調必需注意你宣告的大小,避免記憶體不足的現像產生。

當看到spi_flash_read的第一個參數_sector * SPI_FLASH_SEC_SIZE則是決定位址,從內容一追之後發現_sector由下列程式內容決定:

        EEPROMClass::EEPROMClass(uint32_t sector)
        : _sector(sector)
        , _data(0)
        , _size(0)
        , _dirty(false)
        {
        }

一開始宣告Class時的預設值只有sector需要被指派,接下去再看一下是在哪決定的?程式中的最下面一行能得到答案:

    EEPROMClass EEPROM((((uint32_t)&_SPIFFS_end - 0x40200000) / SPI_FLASH_SEC_SIZE));

0x40200000代表的是flash的0x00000,所以EEPROM是接續在_SPIFFS_end之後,而_SPIFFS_end定義為你經過Arduino IDE選擇SPIFFS的大小後,再從設定檔中取得已設定好的值:

對於_SPIFFS_end的值想要了解請查閱ESP8266/Arduino中的ld宣告, 這裡選擇一個eagle.flash.4m.ld內容來理解(此為上圖中所選擇的4M(3M SPIFSS):

/* Flash Split for 4M chips */
/* sketch 1019KB */。
/* spiffs 3052KB */
/* eeprom 20KB */

MEMORY
{
  dport0_0_seg :                        org = 0x3FF00000, len = 0x10
  dram0_0_seg :                         org = 0x3FFE8000, len = 0x14000
  iram1_0_seg :                         org = 0x40100000, len = 0x8000
  irom0_0_seg :                         org = 0x40201010, len = 0xfeff0
}

PROVIDE ( _SPIFFS_start = 0x40300000 );
PROVIDE ( _SPIFFS_end = 0x405FB000 );
PROVIDE ( _SPIFFS_page = 0x100 );
PROVIDE ( _SPIFFS_block = 0x2000 );

INCLUDE "../ld/eagle.app.v6.common.ld"

經轉換後的宣告為:

    EEPROMClass EEPROM(((0x405FB000 - 0x40200000) / SPI_FLASH_SEC_SIZE));

因必需由位址轉換成sector,所以(起始位址-結束位址)後必需要再除於每1個sector大小,SPI_FLASH_SEC_SIZE值能從spi_flash.h定義中取得值為4096(4K),經過計算後才是sector位址:

    EEPROMClass EEPROM(1019);

整個結論可以得到,重新宣告EEPROMClass就有機會指定位址來另外產生一組類似EEPROMclass,所以接下來就是要建立自已專屬的位址並操作方式與 EEPROM相同。

## 自定EEPROM位址

Danny將自定位址定於SPIFFS中的最後一個sector,也就是之前結論得到的值:

    EEPROMClass EEPROM(1019 - 1);

那反推回去就會變成:

    EEPROMClass EEPROM(((0x405FB000 - 0x40200000) / SPI_FLASH_SEC_SIZE) - 1);

再往回推:

    EEPROMClass EEPROM((((uint32_t)&_SPIFFS_end - 0x40200000) / SPI_FLASH_SEC_SIZE) - 1);

最後就得到整個公式算法,EEPROM已經被宣告過了,此時改成你要選宣告的名稱就完成,Danny命名為DYEEPROM

    EEPROMClass DYEEPROM((((uint32_t)&_SPIFFS_end - 0x40200000) / SPI_FLASH_SEC_SIZE) - 1);

未來SPIFFS最後一個sector的整個4Kbytes就被DYEEPROM所使用,也不會與EEPROM重覆使用,在使用時只要與使用者提醒會佔用SPIFSS最後的4Kbytes,整體下來的完整性也有,也能避免一些問題的產生。

參考資料

SPI Flash Mapping

ESP8266/Arduino


Arduino 進階 – digitalWrite 速度有點慢?

$
0
0

Arduino 進階 – digitalWrite 速度有點慢?

當在更新Arduino_DY_Daikin功能過程中,一些相容的Arduino板子無法使用PWM來產生38kHz,必需要使用軟體產生紅外線所需的38kHz波形,波形的產生是以方波來完成,波形的高、低算一個週期,而38khz代表的是一秒有3800次的波形高、低。,所以利用輸出的HIGHLOW及加上延遲就能完成方波的模擬,模擬的方式類似下面程式(範例產生50kHz波形):


void setup() { pinMode(4,OUTPUT); digitalWrite(4,LOW); } void loop() { digitalWrite(4,HIGH); delayMicroseconds(10); digitalWrite(4,LOW); delayMicroseconds(10); }

從LOOP程式中能理解當輸出HIGH時會延時10微秒後再LOW延時10微秒,產生的波形可能會如此:

HIGHLOW各維持10微秒(uS),所產生的是50kHz,但實際上的波形是如下:

沒錯,實際上卻是如此,整個誤差非常大!其實除了delayMicroseconds本身的延遲外,digitalWrite的延遲才是重要問題!

digitalWrite 延遲

Arduino為了保持各式各樣平台的共通性所產生出來的一組函數,此函數可以指定pin腳輸出HIGHLOW狀態,所以Arduino相容板也必需要實做所有相關的函數,所有函數列表參照官方網站。以UNO設計此函數是透過幾個對照表對照後再經過對照表產生的值來比較、運算完成輸出的動作,其實較耗時的則是對照表,對照表是寫入程式記憶體後再經過讀取的方式取得,並非是從記憶體中直接取得,接下來看看digitalWrite的程式碼,它是位於wiring_digital.c


void digitalWrite(uint8_t pin, uint8_t val) { uint8_t timer = digitalPinToTimer(pin); uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *out; if (port == NOT_A_PIN) return; // If the pin that support PWM output, we need to turn it off // before doing a digital write. if (timer != NOT_ON_TIMER) turnOffPWM(timer); out = portOutputRegister(port); uint8_t oldSREG = SREG; cli(); if (val == LOW) { *out &= ~bit; } else { *out |= bit; } SREG = oldSREG; }

程式中能解理,利用digitalPinToPort取得PORT索引,digitalPinToBitMask取得遮罩位元,因每個PIN對照至1bit,而UNO是8bit MCU,每組為8bit,需要用遮罩位元取得該bit狀態,portOutputRegister則是利用取得的PORT名稱,將名稱帶入後取得輸出PORT的真正位址,因UNO是屬Atmel的AVR系列,輸出、輸入是有各自的暫存器,例如:PORTD是指輸出PORT的D,PIND是指輸入的PORT的D,必需要使用portOutputRegister取得輸出PORT的暫存器。那麼應該會好奇是如何參照的?那來看首digitalPinToPort怎麼宣告的,開啟Arduino.h,程式約177行看到宣告:


#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) #define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) ) #define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ) #define analogInPinToBit(P) (P) #define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) ) #define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) ) #define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) )

digitalPinToPort經過pgm_read_byte讀取表格digital_pin_to_port_PGM


const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PD, /* 0 */ PD, PD, PD, PD, PD, PD, PD, PB, /* 8 */ PB, PB, PB, PB, PB, PC, /* 14 */ PC, PC, PC, PC, PC, };

因表格宣告包含PROGMEM,表格會存入程式記憶體中,再利用pgm_read_byte取得其值,例如:D0代表的是索引0,其中對照的是PD,而PD的值是4:


#define PA 1 #define PB 2 #define PC 3 #define PD 4 #define PE 5 #define PF 6 #define PG 7 #define PH 8 #define PJ 10 #define PK 11 #define PL 12

再利過portOutputRegister帶入PD值4當索引,從表格port_to_output_PGM得到的是PORTD


const uint16_t PROGMEM port_to_output_PGM[] = { NOT_A_PORT, NOT_A_PORT, (uint16_t) &PORTB, (uint16_t) &PORTC, (uint16_t) &PORTD, };

在這所看到的port_to_output_PGM會依照每個板子的不同於pins_arduino.h進行不同的宣告,例子是以UNO為主,UNO屬於standard類型,所以pins_arduino.h位於variants/standard目錄中,如果是Leonardo則定義於variants/leonardo

digitalWrite函數中out = portOutputRegister(port);取得的就是PORTD的指標位址(定址位址),再將取得的值當做out指標的位址,運用指標寫入*out將狀態輸出,如此一來就完成改變輸出狀態的動作,整體下來整個函數要經過很多的對照後才能改變輸出的態狀,看似覆雜,但也提供了極大的相容性及節省記憶體空間,當然代價就是耗費較長的時間完成。

加快digitalWrite

前面說明能理解整digitalWrite的運作方式,那要如何加快digitalWrite呢?其中最直接的方式是直接自行操作輸出狀態,以UNO為例,D0 ~ D7使用的輸出是PORTDpins_arduino.h的註解中能得到訊息:

以D4當輸出為例,D4位於PORTD中的第4個bit,也就是第5個位置(這裡都是由0當起始),

當你要將D4輸出LOW(0)時:


PORTD &= B11101111;

D4輸出HIGH(1)


PORTD |= B00010000;

最終將程式改變為:


void setup() { pinMode(4,OUTPUT); digitalWrite(4,LOW); } void loop() { PORTD &= B11101111; delayMicroseconds(10); PORTD |= B00010000; delayMicroseconds(10); }

再來量測一下結果:

原先的結果:

從圖中能明確的知道一點,將digitalWrite取代後整體的反應就非常的理想,其中的誤差就在於delayMicroseconds是否夠精確,當然也有其他方式可以取代delayMicroseconds的,但因此篇主要是改進digitalWrite的方法,暫時不討論。

結論

digitalWrite所造成的輸出延遲經過簡化digitalWrite後的確可以改善輸出延遲,但所伴隨而來的是相容性問題,每個Arduino的D0所對應到實體MCU中的接腳並非相同,此時實作的僅相容於使用MCU的Atmega 8Atmega 168/328,也就是Arduino UNO/NANO/MINI,其他的像Arduino Mega、Arduino Leonardo`…..等,就必需要另外看它對應到的實際接腳再做改變才行。

如果您本身對於8051或是其他MCU的操作都有相當解理後,對於本篇提供的方法應該不覺的有什麼特別的,很多環境所帶來的便利所引發出來的就是您對於此環境所產生的應用方式的來源是否夠清楚明白,如你能清楚明白時,當你發生Library有問題時或是想將程式再精簡化時,這些問題都不足難道你的!

提升 Xcode 反應速度

$
0
0

提升 Xcode 反應速度

不論是老手還是新手,使用Xcode開發都會有個問題,每次鍵入程式碼時,Xcode會提示來輔助你自動完成,但這速度反應往往不盡理想,尤其是使用傳統硬碟更是明顯,慢的話整個Xcode還會頓頓的。

現在有方法可以提升整體的速度,那就是利用RAM DISK的方法,將DerivedData配置至RAM DISK,在Xcode開啟專案後,需要重新製作索引及建立需要的資料快取時都會將它存在RAM DISK,如此一來,整個Xcode讀取/寫入都在RAM DISK之中,整體速度就會加快許多!

新增RAM DISK

新建一檔名ramdisk.sh並將下內容複制貼上,這是建立1GB RAM DISK的script


#!/bin/bash RAMDISK=”ramdisk” SIZE=1024 #size in MB for ramdisk. diskutil erasevolume HFS+ $RAMDISK \ `hdiutil attach -nomount ram://$[SIZE*2048]`

貼上完成後儲存檔案,並且變更檔案為可執行:


chmod a+x ramdisk.sh

之後再執行該script建立一個名為ramdisk名稱、檔案容量1GB的RAM DISK


EDY-MacBookPro:~ danny$ ./ramdisk.sh Started erase on disk5 Unmounting disk Erasing Initialized /dev/rdisk5 as a 1024 MB case-insensitive HFS Plus volume Mounting disk Finished erase on disk5 ”ramdisk” EDY-MacBookPro:~ danny$

此時你可以開啟finder看到建立完成的ramdisk磁碟。

設定Xcode

開啟Xcode並且進入Preferences進行設定

進入設定後選擇Location設定DerivedData的位置

將原先的Default變更為Custom並且按下紅框處進行路徑的選擇

選擇剛剛建立名稱為ramdisk的RAM DISK,按下Choose選擇此路徑

選擇完成後按下Advanced確定細節

細節的設定必需要如下圖一樣,確定無誤後按下Done完成設定

此時重新開啟Xcode後就可以享受Xcode的反應變快!

結論

加快Xcode的速度有幫助於開發時的順暢度,至於DerivedData存於RAM DISK後,重新開機或關機時DerivedData資料的消失並不會對於專案造成影響,但DerivedData資料消失時,重新開啟專案後,Xcode會再次進行相關快取的建立,如:索引…等,必需要等待完成後才能進行開發,此時必兇要耐心等待一些時間,其他則不受影響。

例子中建立的是1GB RAMDISK,如果你有更多的記憶體像16GB或更多時,可以考慮將1GB提升,如果您記憶體不足於4GB,那可能要考慮擴充記憶體或是將1GB RAM DISK縮小,但要注意的是,每開啟不同的專案就會有一份快取於DerivedData中,RAM DISK太小時必需要手動將DerivedData裡的資料刪除後再開啟專案,否則Xcode可能會提示或出錯!

參考資料

Performance Considerations for macOS/iOS Development in the “New Frontier”

Cache In Your Pocket: Use a RAM disk for Xcode

ESP8266 電源電路研究

$
0
0

ESP8266 電源電路研究

一開始接觸ESP8266的使用者必需要面對的就是電源電路,如何最小化連接電源電路讓ESP8266正常運作並與自已的電路連接,接下來分享一些個人心得供參考。

穩定電壓、充足電流

ESP8266第一次電源開啟後因連帶WiFi也會啟動,所以電流要求非常的大,至少要提供3.3V電壓,電流300ma以上的才能讓它順利的啟動,如果還有接其他電路的話可能就要充足的電流500ma否則可能會看到啟動時發生錯誤,引發看門狗(WDT)事件讓ESP8266不斷的重新啟動。

Soft WDT reset

ctx: cont
sp: 3ffef620 end: 3ffef7f0 offset: 01b0

>>>stack>>>
3ffef7d0:  feefeffe 00000000 3ffee7b4 402027c0
3ffef7e0:  feefeffe feefeffe 3ffee7d0 40100718
<<<stack<<<

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v6000001c
~ld

上圖為引發看門狗內容,如果遇到此類的可能是程式有問題或是電源不穩定造成的。

現今在設計電路時會使用穩壓IC來將輸入電壓調整至需要的電壓並穩定輸出,以ESP8266來說會使用LDO來穩定電壓輸出,以下列出ESP8266開發板常看到的3.3V輸出LDO

LM1117/AMS1117

LM1117AMS1117提供寬電壓輸入的LDO,並且該系列支援多種電壓輸出(1.8V、2.5V、3.3V、5V),並有可調整電壓的類型,一般實驗電路或其他產品電路需要3.3V輸出時都會使用這類型的,IC非常普遍且價格低,受到很多歡迎。

RT9013

RT9013是一款高性能、輸出電流能力 500mA 的線性穩壓器,在當電路愈來愈小時,LM1117/AMS1117元件無法被考慮擺放時就可以考慮這款體積小的LDO

大小電容確實

濾波電容

Vcc與GND至少要有10 uF以上的電容連接,電容正端接Vcc,電容負端接GND,讓啟動時的突波及電壓可以較穩定於3.3V,如果電壓突然間因大電流下降的電壓太快也會造成重啟。

上圖為官方文件中的建議

去耦電容

至少要有0.1uF(100nF)去耦電容來防止電源被干擾

上圖為官方建議對於電源中需增加2種電容值來改善電源穩定性

致能角電路確實

CH_EN 是在電路中代表致能IC的接腳,當IC上電時會依據此CH_EN來決定IC功能是否開啟,單純隨電源來致能IC時必需要串接電阻後接VCC電源,不過也可以利用此角來改變HIGHddd/LOW讓IC RESET功能,不管如何,此角必需要串接電阻後接VCC(致能)或GND(關閉),不能空接

NODE MCU電路圖當參考,圖中能看到CH_EN串接電阻,電阻大部分使用10K、12K、5.1K這些常用的阻值,自行接電路時務必要注意到這一點

官方建議電路中使用的是5.1K的串接電阻

GPIO15/MTDO 接地

GPIO15/MTDO 在FLASH燒寫及正常模式下最大集合就是串接電阻後接地使用是最實用的方式,電阻值10K、12K、5.1K都能使用,

結論

總合上述說明後,可以參考NODE MCU提供的電路,此電路是搭配安信可的ESP-12F模組

如此一來使用一些GPIO時也能清楚的了解是否有提升電阻,平常的狀態是HIGHLOW

KiCad-電子電路設計軟體

$
0
0

KiCad-電子電路設計軟體

KiCad是一套可以提供建立電子電路圖及PCB繪制電路Layout的開放源始碼工具軟體,軟體本身分為好幾個子軟體來構成KiCad,每個軟體功能定義如下:

子程式名稱 說明 副檔名
KiCad 專案管理 *.pro
Eeschema 電路圖、電路元件編輯 *.sch, *.lib, *.net
CvPcb Footprint選擇管理,將元件與Footprint的接腳關連性的選擇 *.net
Pcbnew 電路板編輯(layout工具) *.kicad_pcb
GerbView Gerber 預覽器 All the usual gerbers
Bitmap2Component 轉換點陣圖檔為元件或footprint *.lib, *.kicad_mod, *.kicad_wks
PCB Calculator 各種製成PCB前的統計資料,像元件數量、色碼、線路寬度、線路間隔…等 None
Pl Editor Page layout editor *.kicad_wks

官網下載區提供各種平台及Linux各種分支的安裝方式,依照你的作業系統來選擇安裝方式的說明,安裝好後執行KiCad就能看到軟體畫面:

紅框處為KiCad提供的子應用程式,每個功能都是單獨的應用程式,但子程式只能透過已開啟的KiCad來啟動,無法自行單獨啟動。

使用Eeschema繪製電路圖,還有蠻多功能還未探索,有興趣可以參考官方文件或軟體的相關擷圖

ESP8266 理解Flash更新電路

$
0
0

ESP8266 理解Flash更新電路

ESP8266電源電路有一定了解後,接下來就必需要理解ESP8266(簡稱ESP)的開機模式,ESP將MTDOGPIO0GPIO2組成一個3bit的設定模式,透過設定模式來告知ESP要用什麼樣的方式啟動,下面為3bit的組合設定:

MTDO GPIO0 GPIO2 Value 內容
0 0 0 0 unknown
0 0 1 1 UART0啟動
0 1 0 2 Jump start
0 1 1 3 Flash啟動
1 0 0 4 SDIO 低速 V2
1 0 1 5 SDIO 高速 V1
1 1 0 6 SDIO 低速 V1
1 1 1 7 SDIO 高速 V2

如果你的應用中不使用到SDIO功能的話,那就直接忽略MTDO的值,直接將它串接電阻接地,再來就是GPIO0GPIO2來決定啟動的模式,依照目前的應用來說,需要觀注的是從Flash啟動UART0啟動

GPIO0 GPIO2 內容
0 1 UART0啟動
1 1 Flash啟動

那這兩種模式是什麼呢?

  • Flash啟動

    此啟動會透過SPI與Flash進行讀、寫動作,ESP8266執行Flash的程式碼

  • UART0 啟動

    啟動後會接收來自UART0的命令進行操作,透過命令讀、寫Flash進行燒寫程式碼至Flash或是讀取Flash內容轉存成檔案

結論就是:

  • MTDO(GPIO15) 串接電阻至LOW(GND)

  • GPIO2 串接電阻至HIGH(Vcc)

未來切換模式只需透過GPIO0HIGHLOW來控制是Flash啟動或是UART0啟動,下面電路供參考:

GPIO0設計成JUMP/開關方式,切換JUMP/開關讓GPIO0接地進入UART0啟動反之則進入Flash啟動執行程式碼,以上為最簡易的手動切換模式的電路圖,不過要透過Flash更新程式自動切換模式的話那就要另外再加電路,此電路是由NODE MCU的電路圖中所取得的:

紅框處的電路就是可以利用程式控制串列埠(Serial Port)DTR/RTS的方式讓ESP進入UART0啟動模式,其他類似的ESP開發板也是參考此電路達成的,像WeMos mini D1MiniPlan,你可以依照你的成本還有設計考量來決定要不要使用程式自動切換的方式,所以當你Flash更新程式在使用上時就要注意選擇切換模式的方法,你使用自動切換的電路就要在Flash更新程式上選擇nodemcu的切換,像Arduino IDE上面會看到此設定:

另外,透過UART0啟動的方式來更新Flash的工具有蠻多種的,在後面會有章節介紹,在此不詳加解說。

ESP8266 UART連接電路

$
0
0

ESP8266 UART連接電路

ESP所使用的電壓為3.3V,意謂著GPIO輸出電壓HIGH準位3.3V,然而輸入容忍最大電壓也是3.3V,如果要透過ESP提供的UART與其他開發板連接時就要注意電壓準位問題,

Arduino UNO板子為例,它主要是以5V電壓為主,輸出電壓HIGH準位為5V。這種有輸入與輸入的電壓差需要轉換叫作Logic Level Shift,作法有很多種,依照你連接電路的方式選擇適合你的,下面提供幾個作法:

分壓法

分壓法與其名稱一樣,是利用電阻分壓的方式讓最高準位為3.3V,所以這理使用的是10K、20K電阻串聯,一端接到Arduino的輸出,另一端接地,串聯兩端另外接線至ESP輸入,如下:

當Arduino輸出時,經過分壓的方式:

out = Vcc * (R2/(R1 + R2)


得到約為3.3333333333的電壓,剛好與3.3V接近,如此一來就能當做ESP的輸入。

穩壓法

使用齊納(Zener)二極體穩壓的方法,讓電壓超過3.3V時電壓穩定輸出在3.3V,如此就能保護輸入至RX的電壓不會超過3.3V

二極體法

二極體具有順向導通與逆向不導通的特性,所以利用Arduino UNO TX輸出時產生的5V讓二極體順向導通,導通後就像開關打開一樣。

電路中二極體採用1N4148,其順向壓降約為0.45V~0.55V,所以先計算在電阻上所產生的壓降:

電阻壓降 = 總電壓 – 二極體順向壓降 – 終點電壓

    5v - 0.45v - 3.3v = 1.25v


計算得到壓降後再用輸入電壓減掉壓降得到端點電壓:

    5v - 1.25v = 3.75v


或是用推導的方式,可以更快算出結果,終點電壓3.3v,再加上二極體順向壓降0.45v得到3.75v的端點電壓。

ESP8266 Datasheet的4.3版本中的GPIO章節曾經提到一點有關於保護電路的說明:

All digital IO pins must add an overvoltage protection circuit (snap back circuit) between the pin and ground. Usually bounce (snap back) voltage is about 6V, while maintaining the voltage is 5.8V. This prevents excessive voltage and generating ESD. Diodes also avoid reverse voltage output devices.


所以上述結果得到3.75v輸入到ESP8266是可被接受的。

匯流排收發器(BUS TRANSCEIVER)

使用匯流排收發IC對於數位輸出波形來說是最接近方波,在數位電路是較可靠的,但此類的IC體積還有價格上或許不那麼容易被考慮,以下為電路連接方式:

結論

此篇介紹許多邏輯位準轉換的方法應用在ESP上連接UART的使用,對於後面會介紹如何將程式碼燒寫於Flash及使用官方支援AT command控制WiFi來說是必需要了解,當然你也可以將此篇的邏輯位準轉換方法應用在其他開發板上面也是可行的。

參考資料

5V to 3.3V Logic Level Shifting Stragety Notes

Effects of Varying I2C Pull-Up Resistors

Pinta-簡單易用的繪圖軟體

$
0
0

Pinta-簡單易用的繪圖軟體

Pinta 是一款免費、開放源始碼且跨平台的繪圖與圖片編輯軟體,主要提供簡單且強大的方式來繪圖與編輯圖片,比小畫家來的功能強但操作又不會太覆雜。。

一開始接觸GNOME時想要找一些對應的軟體,像繪圖軟體選擇中,丹尼Windows用的是PhotoImpact、macOSX用的則是Pixelmator,Linux呢?

Linux 中的繪圖軟體非常的多,但因個人習慣的關系,會以PhotoImpact的經驗看看是否有較簡單的選擇,最後所選擇的就是Pinta,有圖層的概念,方塊選擇、繪製邊框都蠻容易的,軟體開啟的速度也比GAMP快一點點(個人感覺),剛開始要選擇繪圖軟體的可以先安裝Pinta評估看看,如果想要像Photoshop功能這麼強大的可以試試看GIMP或是另一款以插畫家為主的Krita也可以參考看看!

上圖為丹尼利用Pinta修改NodeMcu提供的電路圖並加上紅色方框標示

The post Pinta-簡單易用的繪圖軟體 appeared first on 可丁丹尼@一路往前走2.0.


Arch Linux pacman 找不到 libcrypto.so.1.1 libcurl.so.4

$
0
0

Arch Linux pacman 找不到 libcrypto.so.1.1 libcurl.so.4

最近更新完Arch後執行pacman -Sy時出現錯誤


pacman: symbol lookup error: /usr/lib/libcurl.so.4: undefined symbol: SSLCTXsetalpnprotos


pacman: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file

這時候判斷應該是pacman出問題了,查詢一下pacman使用什麼函數庫依賴

$ sudo ldd $(which pacman)


ldd指令會將程式用到的函數庫列表出來並顯示出對應的位址及檔案路徑,可以透過此方法看看是不是有哪些函數庫缺少的:

    linux-vdso.so.1 (0x00007fff4a3ff000)
    libalpm.so.7 => /usr/lib/libalpm.so.7 (0x00007f16be091000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007f16bdce4000)
    libcurl.so.4 => not found
    libgpgme.so.11 => /usr/lib/libgpgme.so.11 (0x00007f16bdab1000)
    libarchive.so.12 => /usr/lib/libarchive.so.12 (0x00007f16bd81c000)
    libcrypto.so.1.1 => not found
    /lib/ld-linux-x86-64.so.2 (0x00007f16be2bd000)
    libassuan.so.0 => /usr/lib/libassuan.so.0 (0x00007f16bd202000)
    libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0x00007f16bcfff000)
    libacl.so.1 => /usr/lib/libacl.so.1 (0x00007f16bcdf6000)
    libattr.so.1 => /usr/lib/libattr.so.1 (0x00007f16bcbf1000)
    libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f16bc9c7000)
    liblzma.so.5 => /usr/lib/liblzma.so.5 (0x00007f16bc7a4000)
    libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007f16bc594000)
    libz.so.1 => /usr/lib/libz.so.1 (0x00007f16bc37e000)
    libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f16bc17a000)
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f16bbf5e000)


上面結果的確是有看到2個函數庫是找不到的,先從libcurl.so是由哪個套件所產生的


pacman -Ql|grep libcurl.so

利用Q查詢,並加上l將所有套件內的檔案全部列出,再透過grep將符合關鍵字的內容列出,結果如下:


curl /usr/lib/libcurl.so

原來是curl套件包含libcurl.so函數庫,可能會有新版的,查詢一下:


pacman -Qu curl

Q後加個u會將該套件是否有新的更新列出來


curl 7.54.0-2 -> 7.54.0-3

果然有新版的,那就更新一下


sudo pacman -Ss core/curl

上面指令主要是將curl套件更新,更新之時也會順帶將所有套件依賴一起更新


resolving dependencies... looking for conflicting packages... Packages (1) curl-7.54.0-3 Total Installed Size: 1.39 MiB Net Upgrade Size: 0.02 MiB

此時就按下y更新吧!經過一段時間後更新完成後,依照此方式將剩下的libcrypto.so也一起更新,更新完成後再重新開機後,執行pacman應該就解決問題。

上述的做法只是一個例子,如果還有其他套件有類似的問題時也能這麼處理。

The post Arch Linux pacman 找不到 libcrypto.so.1.1 libcurl.so.4 appeared first on 可丁丹尼 @ 一路往前走2.0.

更新 known_host 內容

$
0
0

更新 known_host 內容

當你使用ssh用戶端登入IP或網域名稱,發生如下的警告而無法登入:


[danny@lab-p5e-vm ~]$ ssh root@192.168.9.86 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:ifadanbrGuSaIBz00KO8GvU2FyxvCBNLtSpjL+pngxs. Please contact your system administrator. Add correct host key in /home/danny/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /home/danny/.ssh/known_hosts:22 ECDSA host key for 192.168.9.86 has changed and you have requested strict checking. Host key verification failed. [danny@lab-p5e-vm ~]$

這主要的原因為與ssh server連接的公鑰指紋碼已經變更,與儲存公鑰指紋碼的known_hosts內容不同而無法登入,

那要如何才能登入?首先你要先用指令將已儲存該網域/IP的公鑰指紋碼移除:


ssh-keygen -R 192.168.9.86

之後再重新登入就會再詢問你要不要儲存新的公鑰指紋碼:


[danny@lab-p5e-vm ~]$ ssh root@192.168.9.86 The authenticity of host '192.168.9.86 (192.168.9.86)' can't be established. ECDSA key fingerprint is SHA256:ifadanbrGuSaIBz00KO8GvU2FyxvCBNLtSpjL+pngxs. Are you sure you want to continue connecting (yes/no)?

此時再按下yes就會將新的公鑰指紋碼儲存後更新,再輸入登入密碼就完成登入。

參考資料

關鍵字:REMOTE HOST IDENTIFICATION HAS CHANGED

The post 更新 known_host 內容 appeared first on 可丁丹尼 @ 一路往前走2.0.

ESP8266 韌體

$
0
0

ESP8266 韌體

韌體類型

ESP必需透過外接SPI介面的FLASH才能運作,搭配SDK的關系,對於FLASH有對應的佈局,所以支援幾種FLASH容量:512Kbytes、1024Kbytes、2048Kbytes、4096Kbytes,總共四種容量,其中官方也將SDK分為Non-FOTA、FOTA(Firmware On The Air),字面的意思是FOTA指可以透過網路線上更新,Non-FOTA無法透過網路更新,必需要透過連接的方式更新,下面針對於這兩種提供官方的佈局表:

  • Non-FOTA

  • FOTA

官方將韌體分成數多的小檔,每個檔案都對應到其燒錄的位址,如果需要更新韌體時就必需要依照Flash容量查表得知各檔案的寫入位址進行寫入,第一次需每個都寫入完成,第二次更新時只需要依照有變動的檔案執行更新寫入,像FOTA來說,它只更新程式碼的區段並寫入user2.bin,待ESP重開機後執行boot.bin程式內容再根據boot.bin程式內容的規則再將user2.bin程式內容搬移至user1.bin位址後再執行user1.bin

整合型韌體

韌體類型除了分為Non-FOTAFOTA之外,在燒錄時必需要準備非常多的檔案,因此在某些客製化韌體提供者會將所有的檔案整合成單一檔適合Flash容量大小的檔案,如此一來在燒錄時只需要指定位址從0x00000開始燒錄至整個Flash,例如安信可提供的韌體檔案會根據出貨的2種容量大小1024KBytes(8Mbits)4096Kbytes(32Mbits)

  • Ai-Thinker_ESP8266_DIO_8Mbit_AiCloud_0.0.0.5_20170324.bin

  • Ai-Thinker_ESP8266_DIO_32Mbit_AiCloud_0.0.0.5_20170324.bin

燒錄時就只需要指定位址為0X00000進行燒錄,這樣的好處是可以避免位址指定錯誤,但缺點是未來有更新檔必需要再重新燒錄一次,而不是只需要更新部分內容,這可能會讓升級過程增加許多的時間。

上圖為安信可韌體檔中提供燒錄1024Kbytes(8Mbits)的設定畫面擷圖

對於韌體的格式跟種類有些許了解後,對於接下來使用軟體更新韌體時就會比較了解設定些什麼。

官方韌體

官方因應各種應用,所以提供一種以AT命令的官方韌體,透過官方提供的AT命令來使用ESP進行網路應用,許多客製化韌體也是以此為基礎增加許多客製化的AT命令,像安信可就是一個非常好的例子, 它提供許多客製化的命令像:AT+CIOREAD來讀取I/O狀態及AT+CIOADC讀取ADC類比轉數位的值,透過這些客製化的命令就能變化出許多功能,不需要自已透過SDK再做二次開發。

參考資料

The post ESP8266 韌體 appeared first on 可丁丹尼 @ 一路往前走2.0.

Xcode 開啟支援模組編譯

$
0
0

Xcode Use of ‘@import’ when modules are disabled

這幾天在使用Google AdMob SDK,替APP加入廣告,在使用後編譯發生Use of '@import' when modules are disabled的提示:

原來現在Framework還有使用一種模組的型態,模組型態會使用@import關鍵字將模組引入,但目前的專案沒有將此功能開啟,

所以將它開啟就能解決問題:

最後,重新編譯你的APP。

The post Xcode 開啟支援模組編譯 appeared first on 可丁丹尼 @ 一路往前走2.0.

如何讓 Samba 使用 SMBv2 版本

$
0
0

如何讓 Samba 使用 SMBv2 版本

近日來因為WannaCry勒索病毒的關系,大家開始對於SMB這名詞非常的有興趣,SMB為Server Message Block的縮寫,目的是對於機器與機器之間可以檔案與列印的分享,其中它的演進有許多的版本,這次會爆發的主因是微軟Windows作業系統普遍的使用這個通訊格式進行交換,但在實作驅動過程中因為設計上造成漏洞,而這漏洞又因為許多原因被有心人事取得並使用,造成漏洞為什麼現在才會被修補上,連微軟都破例替原本不再支援的Windows XP製作修補程式就知道市場方面,Windows XP還有存在的必要,在這要建議Windows使用者盡快升級至有支援系統更新維護的版本.

此篇目的要將Samba重新設定其SMB使用的版本,首先在你已經使用Samba的主機中篇輯設定檔,這裡使用的是nano編輯器:


nano /etc/samba/smb.conf

[Global]區段上新增最小支援的SMB版本


[global] : : min protocol = SMB2

修改後並儲存檔案,重新開啟Samba服務,目前的Linux全面改用Systemd管理程式,以它為例子:


systemctl restart smbd.service

或有些Linux分支使用:


systemctl restart smb.service

如此一來你使用的Samba就改用SMB2,至於目前使用SMB各版本的Windows作業系統列表:

  • CIFS – The ancient version of SMB that was part of Microsoft Windows NT 4.0 in 1996. SMB1 supersedes this version.
  • SMB 1.0 (or SMB1) – The version used in Windows 2000, Windows XP, Windows Server 2003 and Windows Server 2003 R2
  • SMB 2.0 (or SMB2) – The version used in Windows Vista (SP1 or later) and Windows Server 2008
  • SMB 2.1 (or SMB2.1) – The version used in Windows 7 and Windows Server 2008 R2
  • SMB 3.0 (or SMB3) – The version used in Windows 8 and Windows Server 2012
  • SMB 3.02 (or SMB3) – The version used in Windows 8.1 and Windows Server 2012 R2

以上資訊是從微軟網站所取得,傳送門在此。

參考資料

The post 如何讓 Samba 使用 SMBv2 版本 appeared first on 可丁丹尼 @ 一路往前走2.0.

mycli:自動完成、高亮度語法 的 MariaDB/MySQL的客戶端工具

$
0
0

mycli:自動完成、高亮度語法 的 MariaDB/MySQL的客戶端工具

平常都是使用phpMyAdmin管理資料庫,但有些情況下必需使用終端連線至資料庫來查看內容,為了加快操作速度(其實是語法不熟)的情況下,剛好找到使用Python撰寫的工具mycli,它具有自動完成填入建議的內容,不光只是語法,連資料表名稱、資料庫名稱都能幫助你,用完後一定會愛上它的。

檢查/安裝Python套件管理工具

首先確定你是否有安裝Python專屬的pip套件管理工具,如果沒有的話立即安裝:


sudo pacman -S extra/python-pip

或Debian系列

sudo apt install python-pip


或RedHat系列


sudo yum install python-pip

安裝mycli

使用剛剛安裝好的套件管理工具:


sudo pip install mycli

使用方法

簡易的使用方法:


mycli -u 使用者名稱 -h 主機位址

執行mycli --help顯示幫助說明:


Options: -h, --host TEXT 資料庫伺服器位址 -P, --port INTEGER 資料庫伺服器連接埠號(預設3306) $MYSQL_TCP_PORT -u, --user TEXT 連接的使用者帳號 -S, --socket TEXT The socket file to use for connection. -p, --password TEXT 連接的使用者密碼 --pass TEXT 連接的使用者密碼 --ssl-ca PATH CA file in PEM format --ssl-capath TEXT CA directory --ssl-cert PATH X509 cert in PEM format --ssl-key PATH X509 key in PEM format --ssl-cipher TEXT SSL cipher to use --ssl-verify-server-cert Verify server's "Common Name" in its cert against hostname used when connecting. This option is disabled by default -v, --version 列出mycli版本資訊 -D, --database TEXT 指定使用的資料庫 -R, --prompt TEXT 指定提示字元的格式(預設值: "\t \u@\h:\d> ") 格式名稱為參數英文字母,u:使用者,h:伺服器位址... -l, --logfile FILENAME 查詢及結果記錄至檔案 --defaults-group-suffix TEXT Read config group with the specified suffix. --defaults-file PATH Only read default options from the given file --myclirc PATH Location of myclirc file. --auto-vertical-output Automatically switch to vertical output mode if the result is wider than the terminal width. -t, --table Display batch output in table format. --csv Display batch output in CSV format. --warn / --no-warn Warn before running a destructive query. --local-infile BOOLEAN Enable/disable LOAD DATA LOCAL INFILE. --login-path TEXT Read this path from the login file. -e, --execute TEXT 直接執行查詢命令至指定的資料庫 --help 顯示幫助訊息並且離開mycli程式

官方有提供動態圖片展示:

The post mycli:自動完成、高亮度語法 的 MariaDB/MySQL的客戶端工具 appeared first on 可丁丹尼 @ 一路往前走2.0.

ESP8266 更新韌體

$
0
0

ESP8266 更新韌體

對於ESP8266的韌體類型有所了解後,接下來就是要利用工具將韌體上傳至ESP8266,首先必需先將更新韌體的電路完成後,就能使用工具將韌體上傳至ESP8266。

更新韌體必需要將ESP8266切換至UART0啟動,之後利用命令去讀、寫ESP8266上的外置FLASH,因命令是公開的,所以有官方及開發者提供的更新工具,這裡會大略說明一下常用的更新工具。

官方

ESP8266 DOWNLOAD TOOL

下載

官方網站下載:

下按完後後為ZIP檔案自行解壓縮後進到flash_download_tools_v3.4.4'目錄中執行ESPFlashDownloadTool_v3.4.4.exe`:

選擇ESP8266 DownloadTool後會進入程式的畫面:

進入畫面後依照下面步驟檢查:

  • 選擇依序選擇檔案並且輸入寫入的位址(Ex:boot.bin 0x0)

  • 選擇Serial埠,COMx,如果你執行程式之前已經連接好ESP8266,那程式會自動選擇,如果沒有就到裝置管理員查看

  • 設定BAUD 可依照你的狀態選擇,一般選擇230400

  • 勾選SpiAutoSet讓程式自動補齊設定(SPI SPEED/MODE/SIZE)

  • 勾選DoNotChgBin不讓程式改變韌體中針整Flash相關設定,如UI上的FLASH SIZE,因為你已經選擇SpiAutoSet

  • 按下START進行上傳

上傳之間會有一個Console視窗顯示進度:

完成後會看到下圖中的Console視窗已經顯示到100%並且有出現提示Wrote 41943xxxxxxx....

基本上SpiAutoSet勾選後,設定值程式會自動偵測,除非你有特定需求,如:32Mbit flash,但要燒錄的韌體是給8Mbit的Flash,那就要手動選擇(SPI SPEED/MODE/SIZE),並且將DoNotChgBinSpiAutoSet勾選取消再進行更新即完成,另外燒錄細節也可以參考安信可官方提供的:如何为 ESP 系列模组烧录固件

esptool.py

[esptool](esptool原先由Fredrik Ahlberg利用Python所開發的工具,它具有跨平台的特性,只要有安裝Python 及 pySerial函數庫都能運作的很正常,丹尼已在Windows、Linux、macOS都使用過,Windows使用必需要注意先安裝python for windows版本,因普遍率及功能性,目前已經納入樂鑫官方專案,esptool新版1.3已支援python 2.7與python 3。。

esptool.py v1.3 - ESP8266 ROM Bootloader Utility

positional arguments:
  {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash,verify_flash,erase_flash,version}
                        Run esptool {command} -h for additional help
    load_ram            將映像檔載入RAM中並行執行
    dump_mem            轉存記憶體資料至檔案(轉存ESP資料)
    read_mem            讀取記憶體指定位址並存至檔案
    write_mem           讀取檔案內容並寫入至記憶體指定位址
    write_flash         將檔案內容寫入至SPI Flash
    run                 執行Flash裡的應用程式碼
    image_info          轉存可執行應用映像檔的標頭
    make_image          從二進位檔建立可執行的應用
    elf2image           從ELF檔建立可執行的應用
    read_mac            從OTP ROM讀取MAC位址
    chip_id             從OTP ROM讀取晶片資訊
    flash_id            讀取Flash出廠資訊(可透過此ID得知容量大小)
    read_flash          取讀SPI Flash內容
    verify_flash        驗證bin與Flash
    erase_flash         抹除SPI Flash
    version             列印出esptool版本

optional arguments:
  -h, --help            show this help message and exit
  --port PORT, -p PORT  Serial埠名稱(Linux ttyxxx,macOS cu.xxx,Windows COMx)
  --baud BAUD, -b BAUD  Serial埠速度


韌體上傳命令示範:


./esptool.py -p /dev/ttyUSB0 write_flash 0x00000 Ai-Thinker_ESP8266_DOUT_32Mbit_AiCloud_0.0.0.6_20170517.bin

其中-p後所接的是你的通訊埠名稱(macOS以cu.命名規則,Linux以ttyXXX,Windows以COMx),韌體寫入位址從0x00000開始,來源檔為Ai-Thinker_ESP8266_DOUT_32Mbit_AiCloud_0.0.0.6_20170517.bin,一切順利後就會更新完成:


./esptool.py -p /dev/cu.usbmodem5d11 write_flash 0x00000 Ai-Thinker_ESP8266_DOUT_32Mbit_AiCloud_0.0.0.6_20170517.bin Connecting... Erasing flash... Writing at 0x0007ef00... (100 %)

非官方

NodeMCU Flasher

ESP8266一開始會受歡迎也是因為有名為NodeMcu所製作的開發板,它內建支援Lua語法,可以利用Serial console進行程式的線上編寫,該官方也提供一款專為NodeMcu使用的上傳程式,不過它也可以使用在其他的ESP8266開發板。,主程式分為:

開啟後選擇你連接的Serial埠名稱。

Config頁面,每個firmware更新方式不同,依照官方SDK所產生出來的是多個檔案並且指定位址的,要記得依照位扯選定檔案後後再輸入寫入的位址,不過有的像安信可提供的韌體大小是符合整個flash大小,不需要分段更新,所以只要設定寫入從0x00000,並且選擇好檔案:

選擇好檔案後再回到Operation頁面按下Flash開始升級韌體,要記得進入UART0啟動(升級模式)。

上傳過程中切換至Log能看到更新韌體所進行的過程

更新一切正常後就能看到左下方圖示為綠色打勾,代表已經將韌體更新成功。

注意事項

官方提供的程式已經非常久沒更新,據丹尼實測結果,韌體檔案超過512KBytes就會無法上傳。丹尼推測更新程式應該只是針對當時SDK編譯出來的程式碼大小(通常都<512KBytes)進行規範,再加上一些系統設定(esp_init_data_default.bin、eagle.irom0text.bin…)是分開燒錄,所以限制在512KBytes,所以,要記住,如果你的檔案超過512KBytes就可能無法使用。

參考資料

The post ESP8266 更新韌體 appeared first on 可丁丹尼 @ 一路往前走2.0.


Linux dmidecode 檢查系統是否在虛擬環境中

$
0
0

Linux dmidecode 檢查系統是否在虛擬環境中

現今虛擬化的效率也相當的不錯,沒有特別的記錄可能比較不易查覺目前遠端登入的機器是實體還是虛擬環境,而 dmidecode 工具會根據SMBIOS標準轉譯BIOS的資訊,從轉譯的資訊中就能知道硬體資訊描述中是屬於實體機器或是虛擬機,像廠牌、產品名稱…等。

安裝 dmidecode

dmidecode已經包含在套件中,依據你的平台進行安裝:

Arch


sudo pacman -S dmidecode

Debian/Ubuntu/Mint


sudo apt-get install dmidecode

執行 dmidecode

安裝完成後執行dmidecode並加入參數-s system-manufacturer


sudo dmidecode -s system-manufacturer

丹尼當時機器執行結果:


Acer

-s後所加入的是關鍵字,範例加入system-manufacturer指可以從dmidecode解譯出來的資訊中抓取system-manufacturer, 這代表抓取此機器製造的廠商,像ASUSAcer…等,虛擬環境時則會回報虛擬環境所產生的資訊,像丹尼在虛擬機器中抓到的是:


VMware, Inc.

或者找尋關鍵字Product Name也能透過產品名稱分辨:


sudo dmidecode | grep "Product Name"

執行結果:


Product Name: Aspire 1410 Product Name: JM11-MS

以上,利用此些方式抓取資料就能知道你所在的環境是否為虛擬環境。

參考資料

The post Linux dmidecode 檢查系統是否在虛擬環境中 appeared first on 可丁丹尼 @ 一路往前走2.0.

Linux Quod Libet 輕量小巧的音樂播放軟體

$
0
0

Linux Quod Libet 輕量小巧的音樂播放軟體

Quod Libet 是一套GTK+-基礎,使用Python開發的輕量功能強大的播放軟體,除了播放軟體外還能編輯mp3 tag、管理音樂檔案、網路聲音串流,並且支援多國語言碼,中文可以正常顯示, 利用Plugin方式增加許多的功能,是一套在Linux上值得試試的音樂播放軟體。

安裝

Arch

    $ sudo pacman -S quodlibet

Debian

    $ sudo add-apt-repository ppa:lazka/ppa
    $ sudo apt update 
    $ sudo apt install quodlibet

Debian

    $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5A62D0CAB6264964
    $ sudo apt-get update
    $ sudo apt-get install quodlibet

使用

安裝完成後執行

開啟後就看到整個畫面

可以自行將音樂加人

音樂檔有提供音樂資訊的話,Quod Libet會自行抓取,如上圖是我自行購買的音樂當範例,它可以正確的將專輯封面顯示還有專輯名稱、年份.

在歌曲上面按下滑鼠右鍵能針對此首歌曲進行處理,像編輯Tag內容,或是上面所選擇的Information,查看此首歌典的資訊,

一切功能很齊全,除這些外還支援Plugin,很多功能都是需要從Plugin開啟才行,像是常駐系統列就是如此,從File->Plugins開啟它:

開啟後會在系統列中看到圖示:

此時你按下Quod Libet程式畫面右上角的X關閉圖示只會將程式畫面縮小後隱藏並不會關閉,當你要簡單的控制時,就可以點選系統列上的圖示並按下滑鼠右鍵

對於目前播放的歌曲控制暫停(Pause)上一首(Previous)下一首(Next)等功能,或是連點2下滑鼠左鍵將程式重新呼叫出來。

結語

Quod Libet 透過Plugin增強許多的功能,像是Equalier選擇模擬音場或是Waveform Seek Bar會在程式本身增加一個顯示音樂資料波型的畫面,還有許許多多的Plugin等著你自行去發掘.

參考資料

更新日誌

日期 內容
2017/06/06 初版

關鍵字

  • Quod Libet quodlibet
  • Linux 音樂播放軟體 音樂編輯軟體 音樂資料庫 音樂管理

The post Linux Quod Libet 輕量小巧的音樂播放軟體 appeared first on 可丁丹尼 @ 一路往前走2.0.

Arch Linux ca-certificates-utils 更新失敗

$
0
0

Arch Linux ca-certificates-utils 更新失敗

近幾次在更新Arch時都看到ca-certificates-utils出現沖突(conflict)無法更新,丹尼每次選擇跳過不更新,後來再仔細的查看資訊後才清楚的要手動處理,無法透過pacman自動解決。

$ sudo pacman -S ca-certificates-utils
[sudo] password for danny:
resolving dependencies...
looking for conflicting packages...

Packages (1) ca-certificates-utils-20170307-1

Total Installed Size:  0.01 MiB
Net Upgrade Size:      0.00 MiB

:: Proceed with installation? [Y/n] y
(1/1) checking keys in keyring                     [######################] 100%
(1/1) checking package integrity                   [######################] 100%
(1/1) loading package files                        [######################] 100%
(1/1) checking for file conflicts                  [######################] 100%
error: failed to commit transaction (conflicting files)
ca-certificates-utils: /etc/ssl/certs/ca-certificates.crt exists in filesystem
Errors occurred, no packages were upgraded.

下載更新套件

下一個步驟解決沖突會影響到線上更新,所以必需先將需要更新的套件下載至本機快取中,執行以下指令:

    pacman -Syuw

執令中包含更新套件資料庫( y )、系統更新( u )、只下載更新套件不安裝( w ),執行完成後代表準備工作已經完成。

解決沖突

當丹尼執行一般更新時出現下面這問題訊息:

$ sudo pacman -S ca-certificates-utils
:
:
:
error: failed to commit transaction (conflicting files)
ca-certificates-utils: /etc/ssl/certs/ca-certificates.crt exists in filesystem
Errors occurred, no packages were upgraded.

從錯誤訊息中看到主要的沖突是ca-certificates.crt這個檔,試著將此檔案刪除,刪除前需要用root權限刪除:

sudo rm -rf /etc/ssl/certs/ca-certificates.crt

再次強調,pcman下載更新的流程是使用https會使用到ssl認證的檔案,您必需先確實完成下載更新套件中先將更新套件下載至本機端,否則刪除後再進行更新會看到下面的問題:

error: failed to update testing (download library error)
error: failed retrieving file 'core.db' from delta.archlinux.org : error setting certificate verify locations:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none

如果你真的不小心已經產生上圖的錯誤時,先只安裝ca-certificates-utils套件:

sudo pacman -S ca-certificates-utils

再重新照著解決沖突的方式重新做一次。

開始更新

務必解決沖突後再進行更新,先前已將更新檔下載完成,這次進行更新時會離線更新,速度會比較快一點

pacman -Su

完成後請重新啟動電腦讓系統使用新版本套件執行。

更新日誌

日期 內容
2017/06/07 初版

參考資料

關鍵字

  • ca-certificates-utils conflict 無法更新 更新失敗 沖突
  • error: failed to commit transaction (conflicting files)

The post Arch Linux ca-certificates-utils 更新失敗 appeared first on 可丁丹尼 @ 一路往前走2.0.

Linux Typora 簡潔容易使用的Markdown 編輯軟體

$
0
0

Linux Typora 簡潔容易使用的Markdown 編輯軟體

Typora執行畫面

從有Markdown語法之後,許多開發者為Markdown開發的編輯器非常多,這些編輯軟體大都採用分割視窗來展現編輯與預覽結果,這樣的方式好不好呢?每個人都有它的主張,丹尼長期使用Markdown寫部落格文章時就覺的這樣設計不夠直覺,最大缺點是預覽與編輯無法同步,預覽後想要編修時卻還要回去原始碼中找到位置去做修改。

haroopad

上圖是丹尼原本用最習慣的Markdown編輯器haroopad,它具有跨平台且支援很多Markdown額外的語法,像:表格、數學公式,但它的缺點是除了文字即時更新外,圖片類型如果加入之後,圖片內容更新時它不會馬上更新,有時需要重開haroopad的方式才能看到已更新內容的圖片。

不一樣的編輯方式

Typora採用所見即所得(WYSIWYG)的編輯方式,它將編輯、預覽畫面合而為一,自動判斷你輸入的語法是否為Markdown而自動轉換成結果蠻直覺的。

Typora所見即所得

上圖為官方提供的動畫,原先為mov檔案,丹尼將它轉成gif圖片方便預覽,從畫面操作就能理解它與其他Markdown編輯器的不同之處。

安裝

Arch

$ sudo pamcna -S typora

Ubuntu

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE
$ sudo add-apt-repository 'deb https://typora.io ./linux/'
$ sudo apt-get update
$ sudo apt-get install typora

使用

執行Typora的實際畫面如下:

Typora執行畫面

它還有個丹尼很喜歡的功能Outline ,與GitBook功能非常像,如果你是個原始碼狂人,按下</>圖示進入此模式,下圖紅框處:

原始碼模式的畫面也相當的美觀,會有行號、游標位置整行高亮,語法顏色區分…等

Typora支援快速鍵的方式輸入Markdown語法:

除此之外,語法支援方面也支援:

  • Lists 列表式勾選
  • Tables 表格
  • Code Fences 程式語法高亮
  • Math Blocks 數學公式
  • YAML Front Matters 透過它可以設定此篇Markdown的內容像作者、標題,讓程式可以產生相關的效果
  • Toc 標題索引

語法介紹參照官網的Markdown Reference,它提供上述提到的語法範本供以參考。

結語

Typora 目前還是持續在開發中,希望開發者能盡力的改善與新增功能,Typora採用webkit核心的網頁程式,在程式啟動與操作上在較老舊的機器可能反應會比較慢,但好處是提供Windows、Linux、macOSX版本供使用,想要體驗嗎?趕快下載吧!

參考資料

更新日誌

日期 內容
2017/06/08 初版

關鍵字

  • Markdown 編輯器 Editor
  • Linux Markdown
  • haroopad typora mou byword

The post Linux Typora 簡潔容易使用的Markdown 編輯軟體 appeared first on 可丁丹尼 @ 一路往前走2.0.

Linux SMPlayer 內建解碼器的影音播放器

$
0
0

Linux SMPlayer 內建解碼器的影音播放器

SMPlayer 使用MPlayer當播放核心的影音播放軟體,幾乎能支援許多的視訊與音訊格式,它使用Qt為開發工具,可以很容易的支援各種平台,目前提供Windows、Linux版本。

安裝

Arch

$ sudo pacman -S community/smplayer community/smplayer-skins community/smplayer-themes

Ubuntu 16.04

sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/smplayerdev/xUbuntu_16.04/ /' > /etc/apt/sources.list.d/smplayer.list"
sudo apt-get update
sudo apt-get install smplayer

其他Ubuntu版本請參照opensuse官網

特色

  • 支援各種格式avi、mp4、mkv、mpeg、mov、divx、h.264 …. 支援格式
  • 播放Youtube影片
  • 播放速度、字幕指定、音訊調整、視訊調整
  • 跨平台Windows、Linux
  • 播放串流影片

使用

安裝完成後執行SMPlayer:

看到主要畫面非常的簡潔,不做任何操作只需要點選Open再點選File選擇你要播放的檔案就影片就開始播放。需要做更細項的設定執行Options後再選Preferences就能看到設定非常多的畫面,一般是不需要做任何設定的。

播放的影片如果字幕超過1種,按下Subtitles後選擇Primary track會跳出可供選擇的字幕,即選即顯示:

參考資料

更新日誌

日期 內容
2017/06/08 初版

關鍵字

  • Linux 播放軟體 MPlayer SMPlayer 支援各種格式 mkv mov srt

The post Linux SMPlayer 內建解碼器的影音播放器 appeared first on 可丁丹尼 @ 一路往前走2.0.

Viewing all 79 articles
Browse latest View live