分類存檔:Arduino

用Arduino 控制全彩LED(紅,綠,藍) 三原色調配顏色

我們先準備一些材料 , arduino nano , 紅綠藍LED各一, 一粒全彩LED, 3個按鈕,3粒10KΩ電阻(按鈕用) , 6粒150Ω(保護LED用) . 注意我的圖片是用了470Ω , 因為我找不到150Ω

先看看以下是我的材料圖片

我用了模擬器製作了一個接線圖給大家參考

首先我們先了解一下, 脈波寬度調變(英語:Pulse-width modulation,縮寫:PWM)參考網址 : https://zh.wikipedia.org/wiki/脈衝寬度調變 , https://a091234765.pixnet.net/blog/post/399625162-%5B筆記%5Darduino實驗五%3Apwm調控

我嚐試去表達一下自己的理解 , 如果不正確請不要駡我, 只是我個人的理解能力有限 !

首先我們假設10秒是一個周期 , 我們有個水桶 , 有一個水龍頭 . 例子1: 打開水龍頭, 水桶開始注水 , 10 秒周期水龍頭都是開著的,水桶就滿了 . 例子2 : 打開水龍頭, 10 秒周期裏水龍頭只開了9秒, 那水桶就只有90%滿 , 例子3 : 打開水龍頭, 10 秒周期裏水龍頭只開了8秒, 那水桶就只有80%滿 以此類推 .

PWM 用上述例子解釋 , 占空比= 水龍頭開 , 水龍頭開=5V , 水龍頭關=0V , 如果周期內占空比滿戴 , 結果就是 5V , 如果占空比只有75% , 那麼結果是3.75V , 如果占空比只20%, 那麼結果是1V 了 ! 說白了就是控制占空比 , 控制輸出的電壓來控制LED亮度 , 這就是我們今次的目的 , 得出三原色不同亮度的組合來合成各種顏色

講完構思, 現在實作吧 ! 開始 …… LED 燈加上限流電阻來保護

按鈕部分 , 一端接 GND , 一端接5V+10K電阻作為 Arduino 輸入訊號端. 平時不按下去 Arduino 輸入訊號端 會是高電壓 , 按下去的時候接地道通, Arduino 輸入訊號端 會是低壓 ! 高低電壓的輸入就會控制 Arduino 程序的流向

以下是 Arduino 的程序代碼 , 如有興趣的朋友可以下載來玩玩 下載

以下是本人寫的代碼 , 不是寫得好好 ! 請見諒 :

int redled = 15; // 紅色LED接腳
int greenled = 16; // 綠色LED接腳
int blueled = 17; // 藍色LED接腳
int rled = 3; // 全彩LED紅色接腳 PWM
int gled = 5; // 全彩LED綠色接腳 PWM
int bled = 6; // 全彩LED藍色接腳 PWM
int ranum =0; // 全彩LED紅色亮度參數 0 – 255
int ganum =0; // 全彩LED綠色亮度參數 0 – 255
int banum=0; // 全彩LED藍色亮度參數 0 – 255
int rgbbutt=14; // 轉換”紅綠藍”燈按鈕接腳
int upbutt=7; // 增加亮度按鈕接腳
int downbutt=8; // 減少亮度按鈕接腳
int val=0; // 儲存紅綠藍按鈕狀態
int valup=0; // 儲存增加亮度按鈕狀態
int valdown=0; // 儲存減少亮度按鈕狀態
int ledstat=0; // 儲存 “紅綠藍” 當前參數,全滅=0, 紅色=1 , 綠色=2, 藍色=3

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

pinMode (redled, OUTPUT); // 設定為輸出狀態
pinMode (greenled, OUTPUT); // 設定為輸出狀態
pinMode (blueled, OUTPUT); // 設定為輸出狀態
pinMode (rled, OUTPUT); // 設定為輸出狀態
pinMode (gled, OUTPUT); // 設定為輸出狀態
pinMode (bled, OUTPUT); // 設定為輸出狀態
pinMode (rgbbutt, INPUT); // 設定為輸入狀態
pinMode (upbutt, INPUT); // 設定為輸入狀態
pinMode (downbutt, INPUT); // 設定為輸入狀態
}

void loop() {
// put your main code here, to run repeatedly:
val = digitalRead(rgbbutt);
delay(50);
// Serial.println (val);

if (val == LOW) {
val = digitalRead(rgbbutt);
if (val == HIGH){
ledstat=ledstat+1;

        if (ledstat == 1) {
          digitalWrite(redled,1);
          digitalWrite(greenled,0);
          digitalWrite(blueled,0);
        }
        else if (ledstat == 2) {
          digitalWrite(redled,0);
          digitalWrite(greenled,1);
          digitalWrite(blueled,0);  
        }
        else if (ledstat == 3) {
          digitalWrite(redled,0);
          digitalWrite(greenled,0);
          digitalWrite(blueled,1);  
        }
        else {
          digitalWrite(redled,0);
          digitalWrite(greenled,0);
          digitalWrite(blueled,0);
          ledstat=0;
        }
}

}

Serial.println (ledstat);
if (ledstat == 1 ) {
valup = digitalRead(upbutt);
valdown = digitalRead(downbutt);
delay(20);
if (valup == LOW) {
if (ranum < 255 ){ ranum = ranum+1; Serial.println (“紅色”+String(ranum)); } } if (valdown == LOW) { if (ranum > 0 ){
ranum = ranum-1;
}
}
analogWrite(rled,ranum);
}

else if (ledstat == 2) {
valup = digitalRead(upbutt);
valdown = digitalRead(downbutt);
delay(20);
if (valup == LOW) {
if (ganum < 255 ){ ganum = ganum+1; } } if (valdown == LOW) { if (ganum > 0 ){
ganum = ganum-1;
}
}
analogWrite(gled,ganum);
}
else if (ledstat == 3) {
valup = digitalRead(upbutt);
valdown = digitalRead(downbutt);
delay(20);
if (valup == LOW) {
if (banum < 255 ){ banum = banum+1; } } if (valdown == LOW) { if (banum > 0 ){
banum = banum-1;
}
}
analogWrite(bled,banum);
}

Serial.println (String(ranum)+”:”+String(ganum)+”:”+String(banum));
}

以下是我自己完成後做的 DEMO 視頻

理論上可以實現全彩 , 但因為 LED 各色的參數是不一樣 红2.1v,绿2.8v,蓝2.8v,白3.1v ! 我的 DEMO 不能完全的全彩

ARDUINO 模擬器

近期健伍試用一款模擬器 , 等我介紹一下比大家看看, 我都是初學不是太熟識

我用的是 AUTODESK TINKERCARD , 網圵 : https://www.tinkercad.com

我們來CREATE 一個新電路玩玩

新增了一個試驗板 , 加了 6 顆不同顏色 LED , 在每顆發光二極管加上一個150Ω 電阻(我自己會加大一點點, 我會用470Ω 電阻) , 為什麼要加上電阻? 因為可以防止LED承受過大電壓而燒壞

如何計算電阻阻值

LED限流電阻計算公式:限流電阻Ω = (電源電壓V – LED正向穩壓電壓V) / 限流電流A

設紅色LED正向穩壓電壓2V,電流20mA,電源電壓5V,代入公式就是(5V-2V) / 0.02A = 150Ω

你們可以參考以下網址 : https://www.gushiciku.cn/dc_news/digital_ZgNU

用圖塊的方式製作, 就好像積木一樣 , 一顆一顆的接著發亮又關燈

ARDUINO NANO 不能寫入 , 有什麼方法重設成出廠狀態呢?

應該有不少朋友會遇到玩死了 自己的 NANO , 原因例如有 : 寫 program 入NANO 時 arduino java error 跳出了 , 當機了都有可能使 arduino nano 出現錯誤不能再寫入 !

本來諗住要放進垃圾桶內, 但心想上網找找有沒有人同我一樣玩死了 NANO , 找了一會原來可以試吓重新燒錄 bootloader !

紅色麵包板 NANO 是用來當作燒錄器, 綠色麵包板是不能寫入程序的 NANO

我們今次會用 ICSP 來重新寫入 bootloader , ICSP 是什麼 ?

“ICSP 代表電路串行程式設計,這是可用於程式設計 Arduino 板的幾種方法之一。通常,Arduino 引導載入程式用於程式設計Arduino板,但如果引導載入器丟失或損壞,則可以使用ICSP。ICSP 可用於恢復遺失或損壞的引導載入器。”

用杜邦線連上 被燒錄NANO 的 ICSP , 被燒錄的 ICSP RST 腳連接燒錄器上的 D10 腳 , 如下圖 :

如果你用作燒錄器的板子不是 NANO , 那你找出 SPI 的引腳連接就是了 .

另一種接法就是用板子 SPI , 像以下圖片

完成了接線後, 我們先把作為燒錄器的 NANO 連接上 PC

打開 Arduino — > File —> Examples —> 11.ArduinoISP

然後到 Tools 選擇你自己用作 “燒錄器” 的板子 , 我的是 Board: “Arduino Nano” —> Processor: “ATmega328P (Old Bootloader)” —> 我的電腦連接是 Port: “COM12” ( 你的電腦可能是別的 COM PORT )

如果你用作燒錄器板子是別的型號 , 就要選上正確型號: 例如UNO , 就選UNO

按 “箭頭” 把 Arduino ISP 程序寫入燒錄器板子

成功寫入如下圖 :

凖備工作好了 , 現在開始重寫 bootloader 了 , 我們再次選擇要被燒 bootloader 的板子了 , “Arduino Nano” —> “ATmega328p (Old Bootlooder” , 如果要燒的是 UNO 就選 UNO 板子.

再選擇 Programmer : “Arduino as ISP”

之後就可以 Burn Bootloader

如果成功了, 就會出現 “Done burning bootloader. “

完成後可以找一些範例 , 寫一次入去重新燒錄bootloader 的板子了 !

使用 Arduino NANO V3.0 顯示二進制時間

今次要玩的是 arduino nano V3.0 這個版子是什麼東西呢?

Arduino Nano V3.0是一塊基與開放原始代碼的超小Simple i/o平台,與之前的USB版Arduino Diecimila相比較,Arduino Nano在體積上佔很大優勢,Arduino即可以用來開發出需要獨立運行,並且具有互動效果的電子用品;也可以用來開發出與電腦相連接,同 Flash,Processing,Max/Msp,PD,VVVV等軟件一同合作完成的互動作品。

之前用過 orange pi GPIO + python 做過 2 進制的時鐘 , 網址如下 :

今次就是用這版子做 2 進制時鐘 , 大家先要了解這版的引腳先

再來了解 1088BS 引腳代表什麼 ,  但要留意的是那是基於引腳從左至右看 !  

下列是 1088BS 官方引腳定義, 是基如引腳是從下至上看的 ! 

計時方面不同用 orangepi 讀取電腦時間,  Arduino Nano  要用計時模組 , 我今次用的是 DS1307 RTC 

DS1307 這模組同 MCU 用 I2C 連接的, 想了解更多 I2C 協定可以參考以下網址 : 

https://www.itread01.com/content/1545445450.html

https://zh.wikipedia.org/zh-tw/I%C2%B2C

Arduino Nano V3.0  的 I2C 引腳在 A4及A5 

連接 1088BS 的引腳 , 第一列開始分別是  ( 2,3,4,5,6,A1,8)  pin  , 因為我們第7列不使用的, 所以隨便用A1腳, A1不用插東西

第一行開始分別是 ( 13,13,13,9,13,10,11,12) ,   其中 1,2,3,5 行不使用的 , 所以隨便指派13腳代替, 都是不用插東西

如果你們有另一想法想用全部」「 自己相應找其他引腳代替連接 A1 及 13 

下載我編寫的 程式代碼  ( 當然有些是從別人的代碼借來用 , 例如 : 十進轉二進那一段)

這張圖用 RIGHT CLICK , OPEN WITH NEW WINDOWS 睇會清楚一點

更新一下我寫的程式先 , 上面我寫的那段程式碼有點缺陷, 就是不能手動UPDATE 時間, 要 DELETE CACHE 再編譯才能從電腦更新時間 , 所以 21年1月15日更新可以不用重新編譯, 手動更新時間程式碼 .

下載程式碼

下載了程式 , UPLOAD 上去 NANO , 以後要手動 UPDATE 時間, 就開 SERIAL MONITOR , 115200 baud , 按一下 ENTER 就會出現以下畫面 :

之後按 “Y” 設定時間 , 按照指示就可以了 .