分類存檔:硬件

ORANGEPI + “MOS場效應管” 控制風扇開關

我平時試程式或其他Linux service , 都會用 orange pi zore 安裝 armbian 作為 server , 但這板子有點燙 , 所以我就想用板上的 GPIO 上的 5V , 推動5V風扇用作散熱

把風扇直接接上 pin4 正極 及 pin6 接地 , 風扇就會轉動 , 但在家中安靜時風扇的噪音有點大

所以我就想用温度控制風扇的開關 , 減少噪音的時間, 但兩腳的風扇開關只能用通電及斷電來控制 .

我可以選擇 “三極管” 或 “MOS管” 來作開關 , 我手頭上有些 A2SHB N-MOS , 所以我今次用 MOS管 做示範 .

以我所理解 MOS管用電壓來控制開關 , 三極管用電流控制開關 . 如果想詳細了解可以上網找相關內容, 我提供一個給大家參考

URL = 用理论告诉你 三极管和MOS管的区别在哪-KIA MOS管 (kiaic.com)

今次我用的 MOS 是 SI2302 印有 A2SHB 字樣 (好細粒)

想了解一吓 MOS 管原理, 所以看看以下 youtube 視頻

我的構想圖如下:

不是每款MOS管的 vgs(th) 都是 1.2V , 我手上的 SI2302 的 vgs(th) 是1.2V 就能打開MOS管, 其他型號你要上網找找 vgs(th) 參數

好了我們開始實作吧 , 先把細小的 A2SHB 焊在電路板固定 , MOS管D極焊同風扇負極接上 , MOS管S極同 GPIO (GND) 焊上 , MOS管G極同GPIO控制端口接上(我用了pin7 作為控制端口)

記住 orangepi zero pin 4 正極 , pin 6 負極 , 我用 pin 7 控制風扇

把風扇控制板與 orangepi zero 連接後, 以下就來寫控制風扇的程序了 !

我的 orangepi 是行 armbian linux , 所以我的程序會用 python 3.x 所寫 , 先用 python 的安裝程式 pip , 裝上 OPi.GPIO library

https://pypi.org/project/OPi.GPIO/

下載 onoff_fan.zip 內有 onoff_fan.py 程序

稍微講解程序內一些段落

def get_temp():
         with open(‘/sys/class/thermal/thermal_zone0/temp’) as fp: 
                   return int(fp.read()) // 1000

這一段定義 get_temp()  function  , 內容是讀取系統內CPU溫度的數據 , 之後 result 時把數據   / 1000  , 就會得出我們平時多少  XX 度了

#循環開始
        while True: 

#CALL function 讀取溫度數據 
            cputemp = get_temp() 

#判斷溫度是否低於我們設定風扇停轉的數值, 如果 “TRUE” 就把 pin7 輸出設定為低電壓, MOS 管截止 , 風扇迴路成為開路, 沒有電流流過而停轉
            if cputemp < stop_temp_value:
                 GPIO.output(FAN_PIN, GPIO.LOW) 

#判斷溫度是否高於我們設定風扇開啟的數值, 如果 “TRUE” 就把 pin7 輸出設定為高電壓, MOS 管導通 , 風扇迴路成為閉路, 有電流流過而轉動
            elif cputemp > start_temp_value:
                GPIO.output(FAN_PIN, GPIO.HIGH)

#程序暫停10秒才進入下一個循環
             time.sleep(10) 

 

用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 好玩的地方