2020年11月24日 星期二

[Arduino] LED Bar 顯示

在 Arduino 有個範例是 LED Bar Graph ,使用 LED Bar 來模擬音頻信號的顯示器。當音量低的時候顯示些許格數的 LED ,音量大的時候顯示接近滿格的 LED。今天,修改一下這個範例。
這裡來個學習提示。因為朋友的小孩在學習上遇到一些問題後的感覺。主要用來理解 數位系統的表示方法,透過這個方式,方便好理解 二進制、16 進制與硬體之間的關係。在早期要做這個實驗,整個麵包板是插滿整個 TTL IC。因為是初學剛理解,有些同學光是 DEBUG 線路就花費好多時間,只是為了要理解及驗證書本上的數位知識。在更進階一點,這個練習還可以做基本運算的驗證,例如: 左移 , 右移 , OR 及 AND 運算

所需材料

  • Arduino UNO     x  1
  • RED LED           x  8
  • 330 ohm 電阻    x   8
  • 些許導線及跳線

參考電路

麵包板


byte value;

void setup() {

DDRD = B11111111;

value = B01010000; //  給於 0x50 值


PORTD = value;


}

void loop() {

}

顯示甚麼?
如果加個 OR 運算

byte value;

void setup() {

DDRD = B11111111;

value = B01010000; // 0x50

PORTD = value | 0x3;


}

void loop() {

}


換個 AND 運算

byte value;

void setup() {

DDRD = B11111111;

value = B01010000; // 0x50

PORTD = value & 0x10; // AND 運算


}

void loop() {

}


有時候在做比較複雜的情境時,用 Windows 小算盤 的程式設計師 模式 可以幫助驗算。


如果要左移,右移 跑馬燈 要如何做呢?

void setup() {
DDRD = B11111111;
PORTD = B10000000; //0x80
}

void loop() {

for(byte x = 0; x <7 portd="" x="">>= 1;  //右移1個位元
 delay(500); 
}

for(byte x = 0; x <7 1="" code="" delay="" portd="" x="">

這是直接使用 PORT 的做法,當然也可以使用 74HC595。這裡只是方便好理解位元的操作

這裡注意一下: 因為 D0 腳有接線出來,所以可能在上傳程式時會出現問題。只要上傳前先移走D0 的導線再上傳,上傳完畢後再接回來即可


2020年11月17日 星期二

[Arduino] Blink LED

 Blink LED / 閃爍 LED 通常是初學者的第一個應用,其實即使是老手在拿到未曾使用過的 MCU 或是新板子時也會從這裡開始。通常會先了解基本的 I/O 驅動能力 及 I/O 在 Timing 的表現如何。所以, 這個是常用的例子。

I/O 輸出有分兩種方式, Sink current 及 Source current 。區別是 電流流動方向的不同,Sink current 是電源電流經過負載流向 MCU, Source current 是MCU 輸出電流經過負載流向接地。需要注意地方是兩者的邏輯剛好是相反。

Sink Current:

Arduino sink current 教學

Source Current:



Arduino source current 教學

在這裡只要注意官方的參數。 官方的建議是 電流均不要超過 20 mA (UNO 版本),如果預期可能超出的情況則會需要連接 Driver 輸出電路。

在 Arduino 裡,通常我們會使用 File / Examples / 01.Basics / Blink 做為範本,當中會使用 delay() 函式做為延遲的主要方法。delay() 的特性是停止一段時間不做任何事,然後時間到之後就繼續走。如果電路的控制項目不多,使用 delay() 倒是沒甚麼大問題。但如果同時有其他不同應用的 I/O 時就不太適用了,例如,當有 INPUT (按鍵) / OUTPUT (LED) 同時應用時,會遇到跳過按鍵有時沒反應的問題,就是因為 delay() 剛好跳過 INPUT 的程式段。


int ledPin = 13;             

void setup() {
  pinMode(ledPin, OUTPUT); //將 pin 13設定輸出模式
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);       //延遲 1 秒        
  digitalWrite(ledPin, LOW); 
  delay(1000);       //延遲 1 秒 
}


我們可以使用 File / Examples / 02.Digital / BlinkWithoutDelay 的範例,可能在思路上可能會不習慣。但在基礎邏輯上會很有幫助。尤其在中大型的 Project 時,會需要使用類似的方法。

所需材料

  1. Arduino UNO      x  1
  2. 電阻: 330 ohm     x  1
  3. 麵包板                 x   1

參考連接

Arduino LED 教學


程式碼 

採 Source current 連接LED 及 連接 Arduino UNO 的 PIN 12 腳位




/*const 常數 */
/* I/O Pin 選擇使用 12*/
const int ledPin = 12;
/*間隔 1000ms / 1秒*/
const long interval = 1000;
/*LED I/O 狀態,等於是 ledPin 的I/O狀態*/
int ledState = LOW;

/*儲存下次的 clock cycle 時間*/
unsigned long previousMillis = 0;


void setup() {
  // put your setup code here, to run once:
  
  pinMode(ledPin,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  //儲存目前的 clock cycle 時間
  unsigned long currentMillis = millis();

  //確認是否已經到預期時間
  if(currentMillis - previousMillis >= interval ){
    /*儲存下次的 clock cycle 時間*/
     previousMillis = currentMillis;
  
     ledState == LOW ? ledState = HIGH : ledState = LOW;

     digitalWrite(ledPin,ledState);
  }
}

2020年11月7日 星期六

[Nuvoton] M263KI Board 的 Micropython 體驗

 最近剛入手 Nuvoton 的 M263KI 開發板,其實是想要體驗 MicroPython 上的運作情況。官方這裡也很貼心已經將初步的 Binary file 準備好,只要你將板子接上電腦就好,就可以做簡單的測試。

在 https://github.com/OpenNuvoton/NuMicroPy 官方的 GITHUB 網頁已經敘述好整個步驟,我這裡只是來驗證一下,就不重複相同的步驟。

板子上的 Nu-Link2-Me 區塊上面有 Switch 按照指示 1、2、3、4 全部切到 On 的位置, USB 接頭是 Micro USB Type,直接接入電腦。等待一下,電腦系統會多出新的 UART 及 新的磁碟機名稱為 "NuMicro MCU"。

在 github 上進入 build / NuMaker-M263KI 的路徑,將 firmware.bin 下載下來。並直接丟入 "NuMicro MCU" 磁碟裡。等待一下,它會自動燒錄到MCU裡。

同時,準備好 UART Terminal 軟體及將 port 設定好。


此時,按一下板子上的 Reset 按鈕。在 Terminal 會出現 REPL 提示

Nuvoton




表示載入 Micropython 成功。

我研究一下這個板子電路,找找看有沒有可以讓我簡單測試一下可以控制硬體的指令。我發現有個在 PB10 腳位有掛一個 LED,立馬下以下指令。

Nuvoton

嘿,是個紅色 LED。

可以控制LED 明滅,太好了。可以繼續接下來的Micropython 測試

M263KI,NUVOTON