目前分類:程式設計 (17)

瀏覽方式: 標題列表 簡短摘要
下載安裝請看此篇


本篇文在說明如何讓 Arduino IDE 可以使用 ESP32 開發板。

我手上目前的這兩塊 ESP32 開發板,都同時具有 WiFi 和藍芽功能,個人覺得大塊的這片(ESP32 Wemos D1) 比較好用,因為它可以適用 Arduino UNO 擴展板。


 

1.jpg

2.jpg

文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

我們在研究散熱器和風扇的時候往往會講到PWM,而且很多時候支持PWM的產品會比不支持PWM的顯得更高級一些。而在主板、顯卡還有電源評測中也會提到有PWM控制晶片,顯然對於PC來說PWM已經是一個很普遍的存在。然而PWM是什麼?PWM為什麼會那麼重要?我們相信很多玩家可能連「知其然」都做不到,更別說「知其所以然」了。為此今天的超能課堂我們就來捋一捋關於PWM的二三事,看看這個在PC中似乎無處不在,看著有點臉熟但實際上還是很陌生的PWM到底是何方神聖。
1.jpg

主板上的PWM供電控制晶片
什麼是PWM?
PWM的全稱是Pulse Width Modulation,即脈衝寬度調製,其本質是一種數位訊號,主要由兩個組成部分來進行定義,分別是占空比和頻率,其中占空比值得是信號為高電平狀態的時間量占據總周期時間的百分比,而頻率則代表著PWM信號完成一個周期的速度,也就是決定信號在高低電平狀態之間的切換速度。

2.jpg

圖片源自National Instruments

把握機會 絕版典藏|MINI 60週年限量紀念版
Sponsored by MINI台灣總代理 汎德
目前PWM已經被廣泛應用在各種控制系統中,特別是各種模擬電路的控制,多數離不開PWM信號。可能大家對此會感到疑惑,PWM既然是一種數位訊號,那怎麼會用在模擬電路的控制上呢?實際上PWM很大程度上就是為了實現模擬電路數字化控制而誕生的,我們不妨舉例說明,當一個數位訊號源的高電平為5V、低電平為0V的情況下,如果想要用這個數位訊號源輸出相當於3V的模擬信號,那麼我們就可以將這個數位訊號以PWM占空比60%的方式進行輸出,也就是說一個信號周期內有60%的時間輸出5V,剩下40%的時間輸出0V,此時只要信號周期足夠短,也就是PWM頻率足夠快,那麼我們將獲得一個輸出電平無限接近於5V*60%=3V的信號源,這就是PWM能夠以數位訊號的身份控制模擬電路的主要原因。

以往模擬電路的精確控制往往需要一個相對大規模的電路,不僅笨重而且功耗與發熱都不低。相比之下通過PWM這種數位訊號來控制模擬電路,既可以確保精準度,又可以有效降低控制電路的體積與功耗,因此PWM很快就成為了目前一種主流的電路控制模式,直流電機、閥門、液壓系統、電源等各個領域中我們都能看到PWM的身影,在PC上也是如此,PC主板、顯卡都採用了PWM進行供電控制,散熱風扇也廣泛應用PWM技術,PC電源裡面也少不了PWM的身影。


散熱風扇的PWM技術
常見的散熱風扇調速有兩種,分別是DC調速和PWM調速,其中DC調速又可以叫做電壓調速,簡單來說就是直接調整加載於風扇上的電壓來進行轉速控制。而控制風扇電壓的方式有很多種,比較直接的方式就是外接電阻來進行分壓,例如各種風扇減速線採用的就是這個方式。不過這種電壓控制方式也有一個很明顯的缺點,那就是由於風扇的轉速未必與電壓呈線性關係,例如一把風扇的標稱電壓為12V,當你只給它6V電壓時其轉速未必為一半,更多的可能是因為其啟動電壓至少為7V,只加載6V的話會電壓不足而無法啟動,因此想要精準地控制風扇的轉速,直接調整風扇的輸入電壓往往不是一個理想選擇。

3.jpg

支持PWM調速的風扇都採用4pin接口

你的提案讓台灣更美好-2020年總統盃黑客松報名開跑
Sponsored by 經濟部中小企業處
而採用PWM控制的風扇就沒有上述的問題,雖然從原理上說,風扇所用的PWM調速也算是一種電壓調速,只是其表現出來的是「等效電壓」而非「實際電壓」。由於PWM是通過占空比來調整輸出信號的電平高低,因此轉換為風扇電壓時也就只有12V和0V的區別,只是通電時間長短有所不同,簡單來說就是風扇上雖然加載的是等效6V的電壓,但其實際上是占空比為50%的12V電壓,這個時候風扇就不存在「啟動電壓」的問題了,而且風扇轉速與PWM的占空比基本呈線性關係,這使得風扇轉速的控制變得非常簡單。

當然了這個PWM信號並非作為驅動風扇的電源使用,而是用來驅動風扇內部的三極體或者MosFET,以此實現對風扇的輸入控制,因此支持PWM控制的風扇除了有供電、檢測和接地三根線外,還會有一根額外的PWM控制線。而受PWM控制風扇轉速的啟發,有部分主板也在風扇接口上加入了PWM控制模塊,通過PWM來控制風扇的輸入電壓,讓3pin接口的風扇也能實現近乎線性的轉速控制。不過這種配置基本上只有中高端主板才會享用,真正普及的仍然是直接支持PWM控制的4pin風扇接口。


供電電路的PWM技術
主板、顯卡和PC電源雖然是三個截然不同的硬體,但是就供電所用的技術來說卻是大同小異,PC電源是通過各種拓撲架構和PWM技術將市電的交流輸出變為12V、5V、3.3V、-12V等不同的輸出電壓,而主板和顯卡則是將PC電源的供電通過PWM技術轉變為CPU和GPU等晶片所需要的電壓和電流,因此目前主板、顯卡和PC電源基本上都應用了PWM供電控制技術。

4.jpg

PC電源中的PWM控制晶片
PWM控制電壓的技術放在什麼硬體上都是一樣的,就是通過控制占空比來控制「等效電壓」。顯卡、主板和PC電源上的自然也是如此,只是由於它們所帶的負載對電壓和電流的穩定度要求很高,因此低速的PWM不適合用在供電控制上。目前業內普遍做法是,電源的PWM控制需要使用不低於20kHz的頻率,建議是使用200kHz或以上的,因為越高的頻率越有利於調整的響應速度。

5.jpg

電壓控制型PWM
當然用在供電上的PWM控制比起風扇上的顯然會複雜很多,因為供電電路面對的大多數是恆定電壓、動態電流的負載,因此用在供電上的PWM控制就不僅要考慮設備的輸入電壓,還要考慮到輸入電流。供電電路所用的PWM控制大體上可以分為電壓控制型PWM和電流控制型PWM,前者是通過電壓反饋線路對比基準電壓和實際輸出電壓,然後通過調整PWM的占空比來穩定輸出電壓。這種電路的組成比較簡單,但是用在供電電路中會有一個明顯的缺點,那就是由於實際電路中往往會存在電容和電感等元件,電流與電壓的變化會不一致,對於低功耗、低響應需求的電路來說還問題不大,但是對於高功耗和動態變化豐富的電路來說,電壓控制型PWM往往不能馬上響應設備對供電變化的需求,從而導致電路不穩定,無法正常工作。


 

文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

上傳測試HelloWorld:
環境設定完成後,就可以來寫程式測試,這裡就先用HelloWorld先做個簡單練習。
文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

用ESP32 PWM實現LED慢慢亮起。

程式的部份主要分成三個:1.設定頻道LEDchannel、2.附加到PIN腳、3.決定輸出大小。

1.設定頻道LEDchannel屬性

ledcSetup(LEDChannel, freq, resolution);
//LEDChannel設定為0,不同輸出要設定到不同頻道,例如RGB LED就要開三個頻道分別管理R、G、B
//freq輸出頻率,建議值5000 Hz
//resolution代表輸出解析度,例如8代表0-255,10代表0-1023

2.附加到PIN腳

ledcAttachPin(ledPin, LEDChannel);
//ledPin代表腳位,看你把設備接在哪個腳位上面
//LEDchannel代表步驟1所宣告的LEDchannel,也就是說把設定好的LEDchannel屬性附加到某個腳位上

3.決定輸出大小。

ledcWrite(LEDChannel, dutyCycle);
//將LEDchannel輸出dutyCycle的值。

範例程式將使接在Pin16的LED逐漸亮起並熄滅,範例複製於 https://randomnerdtutorials.com/esp32-pwm-arduino-ide/

1.jpg

  1. // the number of the LED pin
  2. const int ledPin = 16;  // 16 corresponds to GPIO16
  3.  
  4. // setting PWM properties
  5. const int freq = 5000;
  6. const int ledChannel = 0;
  7. const int resolution = 8;
  8.  
  9. void setup(){
  10.   // configure LED PWM functionalitites
  11.   ledcSetup(ledChannel, freq, resolution);
  12.   
  13.   // attach the channel to the GPIO to be controlled
  14.   ledcAttachPin(ledPin, ledChannel);
  15. }
  16.  
  17. void loop(){
  18.   // increase the LED brightness
  19.   for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
  20.     // changing the LED brightness with PWM
  21.     ledcWrite(ledChannel, dutyCycle);
  22.     delay(15);
  23.   }
  24.  
  25.   // decrease the LED brightness
  26.   for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
  27.     // changing the LED brightness with PWM
  28.     ledcWrite(ledChannel, dutyCycle);   
  29.     delay(15);
  30.   }
  31. }
文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

1.png

 

文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

RGB LED依序為紅、最長腳、
RGB LED的共陽極(最長腳)串接一個330的電阻後再接地(GND)。

1.png

RGB LED的R接Arduino GPIO腳位16。
RGB LED的G接Arduino GPIO腳位17。
RGB LED的B接Arduino GPIO腳位5。

程式碼
1.每隔一秒改變LED的顏色,紅、綠、藍、黃、青、洋紅、白


 

文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

ESP32 腳位34 連接到可變電阻腳位 2
ESP32 腳位VIN 連接到可變電阻腳位 1
ESP32 腳位GND 連接到可變電阻腳位 3
1.jpg


讀取數值為12 bits = 4096
0 - 4095

程式碼:

  1. const int potPin = 34;
  2. int val=0;
  3. void setup() {
  4.   Serial.begin(115200); //連線速率
  5.   delay(1000);
  6. }
  7.  
  8. void loop() {
  9.   // put your main code here, to run repeatedly:
  10.   val = analogRead(potPin); //讀取電壓數值
  11.   Serial.println(val); //印出電壓數值
  12.   delay(500); //延遲0.5秒
  13. }
文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

ESP32 腳位 34 對應10K歐姆電阻與光敏電組連接處
ESP32 腳位 27 對應LED 正極
10K歐姆電阻另一腳接VCC
LED腳負極接地
光敏另一腳接地
光敏電阻與10K歐姆電阻連接
如圖:

1.jpg

文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

影片



伺服馬達接線圖
1.png

黃線  GPIO27  紅線  5V  黑線  GND
ESP32 電力只能推動一個馬達,如果要推動兩個馬達就要外接電源了

程式碼

  1. #include <Servo.h>
  2. Servo myservo;  // 建立伺服馬達控制
  3.  
  4. // 伺服馬達的連接 GPIO
  5. static const int servoPin = 27;
  6. int pos = 0;
  7. void setup() {
  8.   // put your setup code here, to run once:
  9.   myservo.attach(servoPin);  // 將伺服馬達連接的GPIO pin連接伺服物件
  10.   Serial.begin(115200);//序列阜連線速率
  11. }
  12.  
  13. void loop() {
  14.   // put your main code here, to run repeatedly:
  15.   if(Serial.available()){                 //
  16.     int num = Serial.parseInt();     // case 前置 num(數字鍵)
  17.    
  18.     switch(num) {                            //   
  19.    
  20.       case 1 :   //1~9
  21.         for(pos = 0; pos < 180; pos += 1) // 一度一度由 0 度旋轉到 180 度
  22.         myservo.write(pos);
  23.         delay(200);
  24.         break;
  25.       
  26.       case 2 : // 1~9
  27.         for(pos = 180; pos>=1; pos-=1) // 一度一度由 180 度旋轉到 0 度
  28.         myservo.write(pos);
  29.         delay(200);
  30.         break;
  31.     }
  32.   }
  33. }
文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

學會Arduino基本操控後
一定會想學會無線遙控,如藍芽Bluetooth, Wifi
這篇說明藍芽Bluetooth操控

結果圖
1.png


影片


代碼:

  1. // Include necessary libraries
  2. #include <BLEDevice.h>
  3. #include <BLEServer.h>
  4. #include <BLEUtils.h>
  5. //#include <BLE2902.h>
  6. //#include <Wire.h>
  7.  
  8. // 定義 UUIDs (注意要與App Inventor內容對應)
  9. #define SERVICE_UUID            "C6FBDD3C-7123-4C9E-86AB-005F1A7EDA01"
  10. #define CHARACTERISTIC_UUID_RX  "B88E098B-E464-4B54-B827-79EB2B150A9F"
  11. #define CHARACTERISTIC_UUID_TX  "D769FACF-A4DA-47BA-9253-65359EE480FB"
  12.  
  13. // 定義LM35 ESP32 GPIO接腳
  14. const int analogIn = A0;
  15.   
  16. int RawValue= 0;
  17. double Voltage = 0;
  18. double tempC = 0;
  19. double tempF = 0;
  20. String BLE_Code;
  21. BLECharacteristic *pCharacteristic;
  22. bool deviceConnected = false;
  23. // Handle received and sent messages
  24. boolean ledState=false;
  25. String message = "";
  26. char incomingChar;
  27.  
  28. // Temperature Sensor 與led接腳變數
  29. float temperature = 0;
  30. const int ledPin = 2;
  31.  
  32. // 設定 callbacks onConnect & onDisconnect函數
  33. class MyServerCallbacks: public BLEServerCallbacks {
  34.   void onConnect(BLEServer* pServer) {
  35.     deviceConnected = true;
  36.   };
  37.   void onDisconnect(BLEServer* pServer) {
  38.     deviceConnected = false;
  39.   }
  40. };
  41.  
  42. // 設定 callback function 當收到新的資訊 (from the Android application)
  43. class MyCallbacks: public BLECharacteristicCallbacks {
  44.   void onWrite(BLECharacteristic *pCharacteristic) {
  45.     std::string rxValue = pCharacteristic->getValue();
  46.     BLE_Code="";
  47.     if(rxValue.length() > 0) {
  48.       Serial.print("接收資料為 : ");
  49.       for(int i = 0; i < rxValue.length(); i++) {
  50.         BLE_Code+=rxValue[i];
  51.         Serial.print(rxValue[i]);
  52.       }
  53.       Serial.println();
  54.       BLE_Code.toUpperCase();
  55.       Serial.println(BLE_Code);
  56.       if(BLE_Code.indexOf("LED")==0)
  57.       {
  58.         ledState=!ledState;
  59.       Serial.println(ledState);
  60.       }
  61.       if(BLE_Code.indexOf("ON")==0)
  62.       {
  63.         Serial.println("LED 點亮!");
  64.         ledState=true;
  65.       }
  66.       else if(BLE_Code.indexOf("OFF")==0) {
  67.         Serial.println("LED 熄滅!");
  68.         ledState=false;
  69.       }
  70.     }
  71.   }
  72. };
  73.  
  74. void setup() {
  75.   Serial.begin(115200);
  76.   pinMode(ledPin, OUTPUT);
  77.    
  78.   // 建立BLE Device
  79.   BLEDevice::init("ESP32_WeMos1");
  80.  
  81.   // 建立BLE Server
  82.   BLEServer *pServer = BLEDevice::createServer();
  83.   pServer->setCallbacks(new MyServerCallbacks());
  84.  
  85.   // 建立BLE Service
  86.   BLEService *pService = pServer->createService(SERVICE_UUID);
  87.  
  88.   // 建立BLE Characteristic
  89.   pCharacteristic = pService->createCharacteristic(
  90.                       CHARACTERISTIC_UUID_TX,
  91.                       BLECharacteristic::PROPERTY_NOTIFY);                     
  92. //  pCharacteristic->addDescriptor(new BLE2902());
  93.   BLECharacteristic *pCharacteristic = pService->createCharacteristic(
  94.                                          CHARACTERISTIC_UUID_RX,
  95.                                          BLECharacteristic::PROPERTY_WRITE);
  96. pCharacteristic->setCallbacks(new MyCallbacks());
  97.  
  98.   // 開始(起)service
  99.   pService->start();
  100.  
  101.   // 開始(起)advertising
  102.   pServer->getAdvertising()->start();
  103.   Serial.println("等待BLE手機連線....");
  104.   
  105.   digitalWrite(ledPin,LOW);
  106.   delay(500);
  107.   digitalWrite(ledPin,HIGH);
  108.   delay(500);
  109.   digitalWrite(ledPin,LOW);
  110. }
  111.  
  112. void loop() {
  113.   // Check received message and control output accordingly
  114.     if (ledState)
  115.         digitalWrite(ledPin, HIGH);
  116.       else
  117.         digitalWrite(ledPin, LOW);
  118.   delay(20);
  119. }
文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

影片



TB6612FNG是東芝生產的馬達驅動與控制IC,內部包含兩組H橋式電路,可驅動和控制兩個小型直流馬達,或者一個雙極性步進馬達。

1.jpg

文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()



ESP32 控制 TB6612FNG 直流馬達驅動∕控制板 請看這篇

 

使用Android手機如何用Arduino藍芽連線ESP32控制蜘蛛機器人
需要使用雙電源
如果使用單電源,電流會被馬達抽走
ESP32晶片電流不足會無法正常運作
文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

最近電腦重灌WIN10
arduino重新安裝及設定
發現輸入開發管理員網址時會出現錯誤

  1. https://dl.espressif.com/dl/package_esp32_index.json
文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

1.png

程序員的迷茫-找尋不到價值

在浩大的軟件世界裡,作為一名普通程序員,顯得十分渺小,甚至會感到迷茫。我們內心崇拜技術,卻也對日新月異的技術抱有深深的恐懼。技術市場就像這喜怒不定的老天爺,今天下個大數據雨,明天掛個人工智能風,面對琳瑯滿目的技術浪潮的衝擊,程序員難免深感無力,深怕錯過了技術潮流從而失去了職場競爭力。
有時候我會思考難道在技術領域內不斷緊跟新潮,不斷提陞技能就是我的價值所在?那麼我是技術的主人還是技術的奴隸?人之所以迷茫往往是找不到工作生活的重心,感受不到工作或生活的價值。那麼什麼是價值呢?說的大一點就是我改變了世界,說的小一點就是我的所作所為改善了某些問題。如果不清楚自己的行為、目標、價值三者的關係,那麼又何來重心?又如何能分得清重要性與優先級呢?

程序員的迷茫不僅僅是面對技術繁雜的無力感,更重要的是因為長期埋沒於軟件世界的浩大的分工體系中,無法看清從業務到軟件架構的價值鏈條,無法清楚定位自己在分工體系的位置,處理不好自身與技術、業務的關係所致
很多程序員打心底不喜歡業務,這一點我曾經也經歷過,我更寧願從事框架工具、技術組件研究的相關事情。我有個朋友經常吐槽我說:"你們天天加班加點寫了那麼多代碼,然後呢?有改變什麼嗎?還不是寫出了一堆垃圾。"仔細想想很多時候業務在我們腦海中存留的只是邏輯和流程,我們丟失的是對業務場景的感受,對用戶痛點的體會,對業務發展的思考。這些都是與價值緊密相關的部分。我們很自然的用戰術的勤快掩蓋戰略的懶惰!那麼這樣的後果就是我們把自己限死在流水線的工位上,閹割了自己能夠發現業務價值的能力,而過多關注新技術對職場競爭力的價值。這也就是我們面對繁雜技術,而產生技術學習焦慮症的根本原因


業務、技術與軟件系統的價值鏈


那麼什麼是業務呢?就是指某種有目的的工作或工作項目,業務的目的就是解決人類社會與吃喝住行息息相關的領域問題,包括物質的需求和精神的需求。
使開展業務活動的主體和受眾都能得到利益。通俗的講業務就是用戶的痛點,是業務提供方(比如公司)的盈利點。而技術則是解決問題的工具和手段。
比如為了解決用戶隨時隨地購物的業務問題時,程序員利用web技術構建電子商務App,而當需求升級為幫助用戶快速選購商品時,程序員會利用數據算法等技術手段構建推薦引擎。
技術如果脫離了業務,那麼技術應用就無法很好的落地,技術的研究也將失去場景和方向而業務脫離了技術,那麼業務的開展就變得極其昂貴和低效

所以回過頭來我們想想自己沒日沒夜寫了那麼多的代碼從而構建起來的軟件系統,它的價值何在呢?
說白了就是為了解決業務問題,所以當你所從事的工作內容並不能為解決業務問題帶來多大幫助的時候,你應該要及時做出調整。
那麼軟件系統又是如何體現它自身的價值呢?在我看來由如下方面體現:

文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

1.先安裝NANO的驅動程式
找到Tools - > Boards manager
1.png

2.左側輸入nano
安裝 Arduino AVR Boards 1.8.X
2.png


3. 找到正確型號
Tools -> Processor -> ATmega328P(Old Bootloader)
3.png


4. 更換COM PORT
Tools -> Port -> COM 10(每台電腦顯示不同)
這時插上Arduino nano 已顯示連線
4.png


5.安裝LIB (liquid-crystal-i2-c.h)
載點
https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c


SKETCH -> ADD .ZIP Library...
把檔案上傳即可

5.png

果燒錄出現錯誤請看這篇
錯誤訊息:stk500_getsync() attempt 10 of 10: not in sync: resp


文章出處:網頁設計,網站架設 ,網路行銷,網頁優化,SEO - NetYea 網頁設計

 

文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

如果編譯直行時出現下列訊息,就是電腦與 Arduino 板子無法溝通

1.png

avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x9f


1.USB 有沒有連接。(看 Arduino 板子上的燈有沒有亮就可以確認這點)
2.有沒有設定 Arduino 的驅動程式。

3.Arduino Board 的板型是否正確 (選擇 Arduino IDE 功能表中的 Tool/Board 確認板型)
4.COM port 設定是否正確。
選擇 Arduino IDE 功能表中的 Tool/Serial port 確認 port
您可以用裝置管理員看看 (Windows 中選 裝置管理員/連接埠/),由於我的 Arduino-UNO 用 USB 模擬為 COM11,因此我在 Tool/Serial port 必須選擇 COM11


5.最後是PROCESSOR是否選取正確

文章出處:網頁設計,網站架設 ,網路行銷,網頁優化,SEO - NetYea 網頁設計

文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()

完成圖
3.png
文章標籤

NetYea 網頁設計 發表在 痞客邦 留言(0) 人氣()