2019年12月28日 星期六

[WS2812] 1-Bit WS2812 RGB LED

很久以前有做過 8-Bit WS2812 RGB LED,最近有朋友跟我回應不知道如何做 1-Bit WS2812 RGB LED,今天趁著假日閒閒沒事做來解決這個問題。



準備材料

1. 1-Bit WS2812 RGB LED  燈珠
2. 公排針 3P
3. 杜邦線母母頭 3P



焊接

取出燈珠和公排針將他們焊在一起。

在焊接之前請您注意下列事項:
1. 由於 WS2812 這類的 LED 燈珠可以多顆串接使用,它們在數據傳輸方面都有一個方向性,Din 是輸入端;Dout 是輸出端。
2. 燈珠和公排針在平躺時沒有等高,所以我隨手取一片 3mm 的壓克力墊著,您也可以拿其他東西墊。



另外,為了可以多顆續接燈珠,您也可以拿 3P 母排針焊在燈珠的 Dout 端,不過我沒有在這裡示範。建議您可以自行練習,多焊幾組燈珠串接在一起。


電路接線

Arduino     燈珠
5V              5V
GND          GND
D6              Din


下載與設定函式庫

2. 將它解壓縮,複製到 Arduino IDE 路徑下的 libries 資料夾裡,並更名為 Adafruit_NeoPixel。


程式

這個函式庫裡面有很多不錯的範例程式,我們只要找到  strandtest.ino 這個程式,用它來測試燈珠就可以了。

1. 在 Arduino IDE 裡用滑鼠點擊 File > Examples > Adafruit NeoPixel > strandtest。


2. 在程式碼裡找到這一行,確定燈珠是要接到 Arduino 的脚位 6。

#define LED_PIN    6

3. 在程式碼裡找到這一行

#define LED_COUNT   60

由於我們現在只接 1 顆燈珠,所以要將它改成

#define LED_COUNT   1

4. 現在您可以上傳程式了。


觀看影片



採購資訊

1. 1-Bit WS2812 RGB LED https://goods.ruten.com.tw/item/show?21721367976483



2019年12月18日 星期三

[機構] DIY推桿(2)

我們在 前一篇文 介紹了一款伺服馬達機構,簡易做出了具有稍稍精確行程的推桿,
本篇文將繼續介紹它的進化版本。


這款進化版本改良了它的推桿穩定性,在推桿中間開挖了一條導槽,使得推桿在運動時更加順利穩定。



材料介紹

此部分是為了一位台大的學生寫的,他說他不認識螺帽,無法分辨。
1. 螺絲規格可以用尺量螺桿粗細和長度,目視的話粗的是 M3,細的是 M2。
2. 螺帽規格可以用尺量螺帽孔洞直徑,目視的話大的是 M3,小的是 M2。
3. 如果想暸解更多螺絲性質,例如螺頭外觀有區分為平頭、圓頭...,螺牙有區分為粗牙與細牙,還有材質成分是一般金屬或不銹鋼做的(不鏽鋼還有區分為很多成分組成),還有表面處理是鍍鋅、鍍鎳還是鍍黑,最重要的還有它的機械性質...,建議可以去看一下機械便覽維基百科

提醒您:如果經過上述方法還是無法幫助您認識螺絲、螺帽,表示這個商品不值得您購買,建議您跟賣家溝通辦理退貨退款。

4. 壓克力顏色有很多種,它還可以區分為不透明、半透明和全透明。本套件壓克力雖然標示厚度為 3mm,但市售品通常不會做足到 3mm,甚至有些只有 2.7mm。如果您認為厚度不足是賣家欺騙您,建議您可以跟賣家溝通辦理退貨退款。如果想瞭解更多壓克力,建議可以去看一下維基百科

5. 伺服馬達也稱為舵機,如果您認為商品說明它可以轉180度,但實際上卻不到180度,建議您可以跟賣家溝通辦理退貨退款。這個東西更複雜也更專業了,請原諒我無法花太多篇幅詳細說明,如果想瞭解更多伺服馬達,建議可以去看一下維基百科

再次提醒您:如果經過上述說明,您還是有一丁點不能理解,表示這個商品不值得您購買,建議您跟賣家溝通辦理退貨退款。



組裝步驟

提醒您:
1. 請先移除所有壓克力雙面的保護紙膜,以利推桿順利運動。撰寫本文時,因壓克力是透明或黑色的不易顯示組裝細節,因此我們才保留保護紙膜。

2. 請先將伺服馬達設置到 90 度狀態,詳細步驟可參考 http://pizgchen.blogspot.com/2018/07/blog-post.html



Step1 準備壓克力主板、 MG90S 伺服馬達、2只 M2 螺絲和 2只 M2 螺帽。


將 MG90S 伺服馬達置入矩形孔,用螺絲和螺帽固定。

提醒您:此處務必要將螺絲鎖緊(甚至可以點上膠水),避免日後鬆動還得將機構拆開才能鎖緊螺絲。



Step2 準備齒輪壓克力、伺服馬達塑膠搖臂、搖臂固定螺絲和 2只自攻螺絲。


用 2只自攻螺絲將搖臂固定到齒輪上面。

提醒您:自攻螺絲是舵機自附的,因螺絲比較粗而且塑料搖臂比較硬,所以需要用力鎖,但須注意避免螺絲突牙或是讓自己受傷。


這是鎖好後的背面。


使用 M2.5 螺絲將搖臂與齒輪安裝到伺服馬達上面並鎖緊。

提醒您:在將齒輪放置到伺服馬達上面時,建議讓搖臂與推桿方向成垂直角度,如此可以讓我們知道伺服馬達大概轉了幾度,並且也易於安裝推桿的位置。



Step3 準備 3只推桿導板和 2只 M2 螺絲。


依圖示用螺絲將 2只小導板夾住大導板固定。

提醒您:這 2只小導板外形是一樣的,但它的螺絲孔大小不一樣,螺絲方向必須從鬆孔穿過到緊孔。這部份由於是利用壓克力的緊孔來結合固定,因此需注意不要鎖緊過頭,以至於破壞緊孔的鎖固能力。


將導板安置到主板上



Step4 準備 4只尼龍柱、4只 M3 螺絲和推桿。


用螺絲將尼龍柱鎖緊固定,並將推桿安置到導板上方。

提醒您:在將推桿安置到導板上方時,請盡量將推桿中間對準搖臂。




Step5 準備蓋板和 4只 M3 螺絲,用螺絲將蓋板固定到尼龍柱上鎖緊。


這是完成圖。





提醒您:
1. 主板上其它螺絲孔可以讓您將推桿組件用 M3 螺絲固定到其它地方。
2. 程式部份請詳 前一篇文



採購資訊

推桿 https://goods.ruten.com.tw/item/show?21937759056891

2019年12月9日 星期一

[18650 電池盒] 行動電源盒 DIY


1:行動電源盒裝配的3個主要部件是電池、電路板、外殼。 

A)裝配前最好能測量好電壓,電池電壓相差最好不要超過0.3V,(一般新電池的電壓斗毆控制在3.7V左右)每個電池的電壓不要低過3.0V。

B)每個電池都有正,負極之分。不能插反,否則會燒電路板。
電池應並聯,即正極都對充電寶的彈片,負極都對彈簧。
警告:不能一正一反,那樣會直接短路,導至起火!直接結果是彈簧有時會燒斷,外殼塑料也能看到燒熔!這種情況不屬保修範圍。


電池的負極是平的,沒有小的孔

C)新舊電池不能混裝,容量不同的電池不能混裝,好壞電池不能混裝。這3種情況都會損壞電池,損壞電路板,均不屬保修範圍,大家一定要注意。

D)蓋蓋板,因為設計外殼和內框較緊,在裝配時先按下二頭,再壓進中間。

2:有關電池裝配成行動電源盒後能放出多少電量為正常?

一. 實際功率
目前市售的移動電源的電芯標准電壓一般都維持在3.7V左右,因此10000毫安的移動電源實際功率為3.7V×10000mAh=37000Wh,而手機充電的電壓為5V,根據能量守恆定律,在移動電源將輸出電流升壓為5V的狀態下,該移動電源的電容為37000Wh÷5V=7400mAh。

二. 轉化率
這裡的7400毫安並非手機所得的最終能量,在移動電源為手機充電的過程中,電路板升壓及安全芯片的運行等情況都會損耗一部分電量,因此移動電源的轉化率一般為85%左右,按照85%計算,該移動電源的實際輸出最大電量為7400mAh×85%=6290mAh。
簡單總結就是電池放電到手機的的容量打6折是正常狀態,當您裝上電池到充電寶後,放出的電量沒電池標稱的容量是正常的,一般不低如6折就是對的!

3)行動電源盒的充電時間?

一.充電器對行動電源盒充電,您裝好充電寶後,先用充電頭對行動電源盒充電.一般充8小時左右就能充滿.充電時間長點沒關系.電路會自動控制的,不會損壞行動電源盒。

二.充滿電後,就可以向手機或其他電器產品充電了.您的行動電源盒就能正常使用了!


產品規格:
輸入電壓:MicroUSB 5.0V±0.5V
輸入電流:1000mA
輸出電壓:USB 5.0V±0.5V
輸出電流:1000mA
保護功能: 短路、過流、過充、過放、欠壓保護

2019年8月19日 星期一

[ESP32] 在 Arduino IDE 上面安裝 ESP32

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

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




開始安裝

在開始前請先安裝妥 CH340G USB to UART 驅動程式。

STEP1 啟動 Arduino IDE 並點擊下拉功能表「File」>「Preferences」。



STEP2 將下面一行複製到 Additional Boards Manager URLs: 裡(註A),然後點擊「OK」鈕。

https://dl.espressif.com/dl/package_esp32_index.json

註A:如果您之前有使用 esp8266 相關板子,可以在原網址後方加一個逗號隔開,然後再貼入 esp32 的網址,完整網址如下方

https://dl.espressif.com/dl/package_esp8266_index.json,https://dl.espressif.com/dl/package_esp32_index.json


接著,關閉 Arduino IDE。


STEP3 再次啟動 Arduino IDE 並點擊下拉功能表「Tools」>「Board」>「Board Manager...」,在 Type 右方空白欄位輸入「esp32」。

提醒您:您的電腦畫面如果與下方畫面不同,有可能是因為 Arduino IDE 的版本不同,或是 ESP32 開發板資料庫已經改版,本部落格資料並不會隨上述物件版本的更新而更新,但它並不會影響 ESP32 開發板的安裝。


點擊「Install」,然後等待幾分鐘下載完畢後點擊右下角落的「Close」鈕關閉視窗。


STEP4 點擊下拉功能表「Tools」>「Board」,捲動到下方找到適合您的開發板,然後再選擇連接埠。
我目前是使用大板子,所以選擇「"WeMos" WiFi & Bluetooth Battery」。



STEP5 開啟範例檔,點擊下拉功能表「File」>「Examples」>「WiFi」>「WiFiScan」,點擊「Upload」上傳程式。





STEP6 等待程式順利完成上傳後,開啟「Serial Monitor」,將 Baud Rate 調到 115200,然後您可以看到 esp32 板子開始掃描 WiFi。在這個例子中 esp32 板子掃描到 3 個 WiFi 訊號。




相關連結

ESP32 核心資料包 https://github.com/espressif/arduino-esp32



購買資訊

ESP32 Wemos D1 WiFi+藍芽 開發板 https://goods.ruten.com.tw/item/show?21934513259341

2019年7月10日 星期三

[Robot] 圓形雙層小車底盤組裝(一)

這款圓形小車底盤有一組橡膠輪和一組方向輪,提供較佳的行走穩定性。一般小車底盤只有一層,在安置 Arduino 開發板、馬達驅動板和電池之後,已無多餘空間裝置其他模組,而這組小車底盤有兩層壓克力底板,恰巧可以解決空間不足的問題。



組裝步驟

Step1 撕除壓克力表面保護紙。不撕除也沒關係。

Step2 準備下列材料:

方向輪 *2
M3*12mm 尼龍柱 *8
M3*6mm 螺絲 *8
M3*8mm 螺絲 *8

用 4只 M3*6mm 螺絲將 4支尼龍柱鎖上方向輪,做 2 組下圖組件。


將 2 組方向輪組件各用 4只 M3*8mm 螺絲鎖到底板,如下圖。


這是另一面



Step3 準備下列材料:

M3*30mm 尼龍柱 *4
M3*8mm 螺絲 *4

用 4只 M3*8mm 螺絲將 4支尼龍柱鎖上底板,如下圖。



Step4 準備下列材料:

TT馬達 *2
馬達固定片 *4
M3*30mm 螺絲 *4
M3 螺帽 *4

將 1 只馬達固定片穿過底板,另一只固定片靠著底板側邊,兩片固定板中間夾著馬達,用 2 只 M3*30mm 螺絲穿過固定片和馬達的洞。

提醒您:
1. 雖然此處還沒焊,但建議您在安裝馬達之前,先焊好馬達的電源線。
2. 要注意馬達的方向,也就是齒輪箱的轉軸必須是在底板的十字孔洞那邊。
3. 建議 2 只馬達的電源銅片都朝內,或者是朝外。



用 2 只 M3 螺帽鎖緊。


另一邊的馬達也如法泡製固定。



Step5 準備下列材料:

編碼輪 *2

將 2 只編碼輪小心安裝到馬達轉軸。

提醒您:
1. 如果您沒有紅外線對射模組,此處的編碼輪是可以不必安裝的。
2. 編碼輪最好要移動到十字孔洞的中間,如此才不會與底板產生干涉。



Step6 將 2 只輪胎安裝到馬達轉軸。



Step7 找個地方用螺絲把電池盒固定住。如果底板上沒有適合的孔,需自行鑽孔。



Step8 準備下列材料:

M3*8mm 螺絲 *4

用 4只 M3*8mm 螺絲將上層板鎖到尼龍柱上,如下圖。



Step9 完成,如下圖。



結論

此款小車底盤套件非常容易組裝,但在組裝的過程當中還是有一些細節需要注意,才不會陷入拆拆裝裝的困境。尤其是在加上 Arduino 開發板、馬達驅動板、電池盒、紅外線循跡模組和超音波避障模組等物件後,更應該注意組裝順序,這在下一篇文當中會更加詳細說明。



採購資訊

小車底盤套件 https://goods.ruten.com.tw/item/show?21928032117826




2019年6月21日 星期五

[Arduino] 實做一個文字跑馬燈(二) -- 使用手機發送訊息給 8*32 點陣 LED

在上一個實驗 (https://pizgchen.blogspot.com/2019/06/arduino-led-max7219-832-led.html)
當中文內有提到,可以用 Serial Monitor 視窗輸入文字改變顯示訊息,由此可知應該也可以手機透過藍牙傳送資料來改變顯示的訊息,這樣的話能讓使用者更加方便切換訊息,另一方面也能有更多的應用。本實驗就是修改上一個實驗,讓我們可以用手機來改變顯示的訊息。



在硬體方面,您需要一支智慧型手機、一片藍牙模組和杜邦線4P。HC-05 是具有主從模式的模組,此處我們採用 BT06 藍牙模組,它相容於 HC-06 ,只有"從"模式。有兩點理由讓我們採用 BT06 藍牙模組,一是這個實驗在 Arduino 點陣 LED 這端不需要主動連線手機,因此只需要"從"模式就可以;二是它價錢比 HC-05 便宜。




接線

接續上個實驗,現在把4P杜邦線再接上 BT06 藍牙模組,另一頭如下接法:

Arduino      BT06
Vcc             Vcc
Gnd            Gnd
D8              TXD
D9              RXD

藍牙模組的 STATE 和 EN 針脚可以省略不用。

原始 Software Serial 函式庫裡的範例是接 D10 & D11,這裡之所以改接 D8 & D9 是因為 D10、D11、D13 已被點陣 LED 佔用。

另外,這片藍牙模組的預設參數如下所示:

NAME = BT04-A
BAUD RATE = 9600
PASSWORD = 1234

瞭解這些參數有利於您在手機端的藍牙設定,還有 Arduino 端的程式設定。


Arduino 程式

我們參考了 Software Serial 函式庫裡的範例,把下列幾行程式碼加入上個實驗的程式內:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 9); // RX, TX
mySerial.begin(9600);

並修改函示 readSerial() 部份內容,完整 Arduino 程式碼如下:

#include <SoftwareSerial.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

// set to 1 if we are implementing the user interface pot, switch, etc
#define USE_UI_CONTROL 0

#if USE_UI_CONTROL
#include <MD_UISwitch.h>
#endif

// Turn on debug statements to the serial output
#define DEBUG 0

#if DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTX(x) Serial.println(x, HEX)
#else
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTX(x)
#endif

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10

SoftwareSerial mySerial(8, 9); // RX, TX

// HARDWARE SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// SOFTWARE SPI
//MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// Scrolling parameters
#if USE_UI_CONTROL
const uint8_t SPEED_IN = A5;
const uint8_t DIRECTION_SET = 8;  // change the effect
const uint8_t INVERT_SET = 9;     // change the invert

const uint8_t SPEED_DEADBAND = 5;
#endif // USE_UI_CONTROL

uint8_t scrollSpeed = 25;    // default frame delay value
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 2000; // in milliseconds

// Global message buffers shared by Serial and Scrolling functions
#define BUF_SIZE 75
char curMessage[BUF_SIZE] = { "" };
char newMessage[BUF_SIZE] = { "Robot Wolf Group" };
bool newMessageAvailable = true;

#if USE_UI_CONTROL

MD_UISwitch_Digital uiDirection(DIRECTION_SET);
MD_UISwitch_Digital uiInvert(INVERT_SET);

void doUI(void)
{
  // set the speed if it has changed
  {
    int16_t speed = map(analogRead(SPEED_IN), 0, 1023, 10, 150);

    if ((speed >= ((int16_t)P.getSpeed() + SPEED_DEADBAND)) ||
      (speed <= ((int16_t)P.getSpeed() - SPEED_DEADBAND)))
    {
      P.setSpeed(speed);
      scrollSpeed = speed;
      PRINT("\nChanged speed to ", P.getSpeed());
    }
  }

  if (uiDirection.read() == MD_UISwitch::KEY_PRESS) // SCROLL DIRECTION
  {
    PRINTS("\nChanging scroll direction");
    scrollEffect = (scrollEffect == PA_SCROLL_LEFT ? PA_SCROLL_RIGHT : PA_SCROLL_LEFT);
    P.setTextEffect(scrollEffect, scrollEffect);
    P.displayClear();
    P.displayReset();
  }

  if (uiInvert.read() == MD_UISwitch::KEY_PRESS)  // INVERT MODE
  {
    PRINTS("\nChanging invert mode");
    P.setInvert(!P.getInvert());
  }
}
#endif // USE_UI_CONTROL

void readSerial(void)
{
  static char *cp = newMessage;

  while (mySerial.available())
  {
    *cp = (char)mySerial.read();
    if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE-2)) // end of message character or full buffer
    {
      *cp = '\0'; // end the string
      // restart the index for next filling spree and flag we have a message waiting
      cp = newMessage;
      newMessageAvailable = true;
    }
    else  // move char pointer to next position
      cp++;
  }
}

void setup()
{
  Serial.begin(57600);
  Serial.print("\n[Parola Scrolling Display]\nType a message for the scrolling display\nEnd message line with a newline");

  mySerial.begin(9600);
  mySerial.println("Robot Wolf Group -- LED Matrix");
  
#if USE_UI_CONTROL
  uiDirection.begin();
  uiInvert.begin();
  pinMode(SPEED_IN, INPUT);

  doUI();
#endif // USE_UI_CONTROL

  P.begin();
  P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);
}

void loop()
{
#if USE_UI_CONTROL
  doUI();
#endif // USE_UI_CONTROL

  if (P.displayAnimate())
  {
    if (newMessageAvailable)
    {
      strcpy(curMessage, newMessage);
      newMessageAvailable = false;
    }
    P.displayReset();
  }
  
  readSerial(); 
  
}


手機 APP

下載並安裝手機 APP (Android) 

https://www.dropbox.com/s/fe3vuxl7d1w0bk8/LED_Matrix.apk?dl=0

開啟 APP 後會先出現要求您啟用藍牙設備的訊息,您同意後再選擇要連線的藍牙裝置,然後會出現下列畫面:


點按 [Connect] 鈕連線藍牙,連線後在 Display 文字欄內輸入文字,按下 [Send] 鈕就可以改變點陣 LED 上的訊息。

在 [Send] 鈕下方有三個按鈕,按下後會直接把預設好的訊息傳出,
[<<<] 鈕會傳出 "<<<",這可以代表自行車的左轉燈;
[>>>] 鈕會傳出 ">>>",這可以代表自行車的右轉燈;
[STOP] 鈕會傳出 "STOP",這可以代表自行車的煞車燈。



結論

由於點陣 LED 目前的動態顯示方式是由右而左捲動文字,在操作過程當中可以感覺到左右轉燈和煞車燈顯示的方式並非是我們所想要的。其實,原始程式預留多種動態顯示方式,這部份我們留待下回再來做個探討。


延伸資料

Arduino bluetooth controled 8*32 LED Matrix https://electronoobs.com/eng_arduino_tut14.php


採購資訊