分類: 硬件

  • 用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 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 的板子了 !

  • OrangePi 另類玩法

    OrangePi 另類玩法

    OrangePi 除了可以用來當 Linux Server , Media Player , 懷舊遊戲機之外 ….. !

    還可以用 python / C 寫一些程式用來控制 OrangePi 的 GPIO , 類似單片機 MCU

    今次我分享自己用 python 寫的小程式 , 用 GPIO 來控制 8X8 LED 點陣光亮 ,把當前的時間, 星期用二進制方式顯示出來

    例如 : 時間 16:35:42 我們用八組 2 進制來顯示

    小時 16 , 分開十位及個位 即是1 &6 十位 1 二進是 0001個位 6 二進是0110
    分鐘 35 , 分開十位及個位 即是3 &5 十位 1 二進是 0011個位 5 二進是0101
    秒 49 , 分開十位及個位 即是 4& 9 十位 1二進是 0100個位 9 二進是 1001
    星期 3 , 個位即是 3 個位3 二進是 0011

    我用4 行代表二進制的4個位 , 用 7 列分別代表 [時(2列) 分(2列) 秒(2列) 星期(1列)]

    大家可以看看以下的圖片, H2 及 H3 CPU GPIO 分佈圖,
    我替供的程式碼是以 H3 GPIO 寫, 如果用 H2 CPU 的朋友要自己再更改 PORT 對應了

    CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90

    再來大家了解一下 8X8 LED 點陣 , 我用的是 1088BS 共陽點陣

    大家可能會發現上圖和下圖描述的 “行” 及 “列” 有所不同 ? 上圖是我使用麵包條所以1088BS 插腳是由左至右方式插 , 下圖插腳是由下至上方式插 , 整塊1088BS 轉了90度 , “行” “列” 會互換了 , 如果你們是左右就參考上圖 , 上下的就參考下圖了 .

    上圖是 “行””R” 為接地 , “列””C” 為正極 , 最好在正極接上一個1k電阻保護LED , 那麼下圖就是 “行””R” 為正極了 , “列””C” 接地

    現在 OrangePi 要安裝 GPIO 資料庫 , 我用這個 pyH3 Python Library
    https://www.instructables.com/id/Orange-Pi-One-Python-GPIO-basic/

    還有很多 Library 用的 , 其他參考 !
    https://pypi.org/project/OrangePi.GPIO/

    當然引用時有不同的呼叫方法 !

    以下是我寫的程序 , 不是寫得好好, 應該可以用 CALL FUNCTION 的方式去處理十個及個位轉二進制的 !
    以後再修改一下
    下載程式碼

    稍為改良用了 call function 的程式碼

    下載程式碼

    如果把 FILE 改為可執行檔

    chmod +x bin2clock.py

    ./bin2clock.py

    應該會發現如下圖 : 顯示時間是 14點15分43秒 星期五

    顯示時間是 14點16分00秒 星期五

    你們看見有7個1K電阻, 因為正極要拉一個電阻才能保護 LED 燈, 你們看見我寫了
    1248 那一列是我弄燒了那列 LED 所以星期用了第八列做 , 同樣第四行都是燒了 所以跳過了

    其餘那4個沒有電阻用釘書釘連接是陰極所以不用電阻 !

  • OrangePi 當懷舊遊戲機

    OrangePi 當懷舊遊戲機

    先下載 OS 影像檔 URL http://www.retrorangepi.org/
    找你自己所買的 OrangePi 型號

    之後要下載寫入軟件
    用來把 OS IMAGE 寫入 SD CARD 內 Balena
    Etcher
    Win32diskmanger

    完成後把 SD CARD 插入 ORANGEPI 內開機
    記得要插 NETWORK 因為要從 WINDOWS 電腦把 GAME ROM COPY 入去 RETRORANGPI 內
    在WINDOWS NETWORK 找找有沒有 RETRORANGE 或者知道 IP 就在檔案總管 \\192.X.X.X

  • 研究 OrangePi 安裝及設定

    raspberry pi 好多人都聽過 orangepi 又幾多人聽過呢?

    orangepi 相對價錢比 raspberrypi 平 , 當然RAM & CPU
    是有分別的 !

    orangepi 用來做簡單的 SERVER 都很有趣 , 用來學習成本相對底 !

    我本人就用來學習 Linux 之用

    我自己用了 orangepi zero 做了一個 WEB SERVER 用來做 Traffic Report Server

    軟件是 CACTI

    參考 CACTI 安裝方法 URL : https://computingforgeeks.com/how-to-install-and-configure-cacti-on-ubuntu-18-04/

    如果你有 SWITCH 是有 SNMP 的那就可以用來產生 SNMP LOG , 用 CACTI 分柝

    如果沒有那種 SWITCH 都不要緊可以用 orangepi 本機 LAN CARD 產生 SNMP 分柝

    準備的軟硬件
    1. orangepi zero ( 沒有
    HDMI , VGA 輸出, 有買擴展板有 AV
    輸出[即是黃白紅三色線] )
    或都用 USB DATA CABLE 即是可以傳數據的那種(可以用電腦連接時做個
    serial port 來做 console ), 有些只供電的 USB CABLE 不會有 serial port 的

    2. macro sd card (
    用來裝 OS 用 )


    3. FT232RL/PL2303HX
    USB转串口线
    (這個是可選的, 不一定要 ) 因為我不想駁AV線及不想老是駁電腦供電所以分開供電同console , 所以用TTL CABLE 做 serial port console !

    這三樣東西都是淘寶網購的 !

    首先下載 OS , 我用的是 ARMBIAN LINUX FOR ORANGEPI ZERO

    之後要下載寫入軟件 ( 用來把OS IMAGE 寫入 SD CARD 內)
    軟件 Balena Etcher

    裝了 OS 的 SD CARD 準備好了 , 如果你是用 AV 線就駁好電視 , keyborad ,mouse

    如果用 TTL 的先把 USB TTL CABLE 連接 ORANGEPI ZERO 了
    參考網址

    準備你的電腦, 插入TTL USB
    CABLE 看看是什麼COM PORT

    我的是 COM6 , COM8 是電腦 USB 供電給 ORANGEPI 時同可以做 CONSOLE 的, 兩個都可以連上 ORANGEPI

    PUTTYTeraTerm 連接 COM PORT , SPEED 選115200

    就會出現 LOGIN 畫面了

    login
    name :root , default password : 1234

    記得一定要改 PASSWORD 呀 !

    之後的你們懂的 , 裝上 APCHE2, PHP , MYSQL
    , SNMP , CACTI 就是了
    ! 因為 ARMBIAN 是 BASE DEBIAN 的裝軟件用 APT

    例如: apt install apache2

    自由發揮就是 LINUX 好玩的地方