顯示具有 Digispark 標籤的文章。 顯示所有文章
顯示具有 Digispark 標籤的文章。 顯示所有文章

2018年6月4日 星期一

Digispark chap2.通訊應用-3.1 IR紅外線遙控器控制RGB LED WS2811 WS2812

既然在上一章中我們有讀取到遙控器每個按鍵的碼,那我們就利用這個碼來控制RGB LED
其實在遙控器的按鍵中,有兩種模式,1.按一次發射一次2.連續發送,比方說上下左右的按鍵,通常都會連續發射,而其他的功能鍵,一般按一次只會發射一次
我們本次要利用按鍵來做RGB三個顏色的個別調光,上下來調整紅光,左右調整綠光、keystone+-兩顆按鍵調整藍光






相關接線方式:



程式範例:

========================================================
#include <SoftSerial.h>
#include <WS2811.h>

DEFINE_WS2811_FN(WS2811RGB, PORTB, 3)
//設定PIN3控制RGB LED
RGB_t rgb[8]; //1 for 1 pixel
int RGB_NUM;

uint8_t situation = 0;
uint8_t START = 0;
uint8_t x = 0;
uint8_t BIT = 0;
uint8_t Id = 0;
uint8_t Id_inv = 0;
uint8_t Data = 0;
uint8_t Data_back = 0;
uint8_t Data_inv = 0;
uint8_t Repeat = 0;
uint8_t sended = 0;

uint16_t Time_old = 0;
uint16_t Time = 0;
uint16_t TimeDelta = 0;

SoftSerial Serialport(5, 0 );      //設定Rx/Tx對應的PIN
unsigned char Serialdata[32],Serial_DATA;
int Serial_num;


void setup(void) {
  attachInterrupt(0, IR_Read, FALLING);
  pinMode(1,OUTPUT);
  digitalWrite(1,LOW);

 pinMode(3,OUTPUT);  //for WS2811 RGB LED

  Serialport.begin(9600);
  Serialport.write("SoftSerial Test \r\n");

   rgb[0].r-=15;
}

void loop(void) {
  if(sended == 1) {

    Serialport.write("IR data:");  //傳送字串
    Char_to_Uart((unsigned char)Id);
    Serialport.write(",");  //傳送字串
    Char_to_Uart((unsigned char)Id_inv);
    Serialport.write(",");  //傳送字串
    Char_to_Uart((unsigned char)Data_back);
    Serialport.write(",");  //傳送字串
    Char_to_Uart((unsigned char)Data_inv);
    Serialport.write(",\r\n");  //傳送字串
 
    if((uint8_t) Data_back==33){  rgb[0].r=0;  rgb[0].b=0;   rgb[0].g=0; }
    if((uint8_t) Data_back==65 &&  rgb[0].r<100)  rgb[0].r+=2;
    if((uint8_t) Data_back==161 &&  rgb[0].r>0)  rgb[0].r-=2;
 
    if((uint8_t) Data_back==129 &&  rgb[0].g<100)  rgb[0].g+=2;
    if((uint8_t) Data_back==19 &&  rgb[0].g>0)  rgb[0].g-=2;
 
    if((uint8_t) Data_back==97 &&  rgb[0].b<100)  rgb[0].b+=2;
    if((uint8_t) Data_back==81 &&  rgb[0].b>0)  rgb[0].b-=2;
 
    sended = 0;
  } else {

  }


 updatePixels(); //show the change
  delay(20);
}

void updatePixels(){
  WS2811RGB(rgb, ARRAYLEN(rgb));
}

void IR_Read(void) {
  digitalWrite(1,HIGH);
  Time = micros();
  if (Time_old != 0) {
    TimeDelta = Time - Time_old;
    if ((TimeDelta > 12000)&&(TimeDelta < 14000)) {
      START = 1;
      x = 0;
      situation = 1;
      Id = 0;
      Id_inv = 0;
      Data = 0;
      Data_inv = 0;
    } else if ((TimeDelta > 10000)&&(TimeDelta < 12000)) {
      situation = 2; // repeat
    } else if ((TimeDelta > 1500)&&(TimeDelta < 2500)) {
      situation = 3; //"1"
      BIT = 1;
    } else if ((TimeDelta > 1000)&&(TimeDelta < 1500)) {
      situation = 3; //"0"
      BIT = 0;
    } else situation = 5;
 
    if (situation == 3) {
      if (x < 8) {
        Id |= BIT;
        if (x < 7) Id <<= 1;
        x++;
      } else if (x < 16) {
        Id_inv |= BIT;
        if (x < 15) Id_inv <<= 1;
        x++;
      } else if (x < 24) {
        Data |= BIT;
        if (x < 23) Data <<= 1;
        x++;
      } else if (x < 32) {
        Data_inv |= BIT;
        if (x < 31) {
          Data_inv <<= 1;
        } else { 
          /* DO SOMETHING HERE */
          sended = 1;
       
          Data_back = Data;
          Repeat = 0;
        }
        x++;
      }
    } else if (situation == 2) {
      if(Repeat == 1) {     
        /* DO SOMETHING HERE */
        /*sended = 1;*/
      } else {
        Repeat = 1;
      }
    }
  }
  Time_old = Time;
  digitalWrite(1,LOW);
}

void Char_to_Uart(unsigned char ChartoUart_NUM) {
unsigned char ChartoUart_TEMP;

ChartoUart_TEMP=ChartoUart_NUM/100;
Serialport.write(ChartoUart_TEMP+'0');
ChartoUart_NUM=ChartoUart_NUM-(ChartoUart_TEMP*100);
 
ChartoUart_TEMP=ChartoUart_NUM/10;
Serialport.write(ChartoUart_TEMP+'0');
ChartoUart_NUM=ChartoUart_NUM-(ChartoUart_TEMP*10);
 
ChartoUart_TEMP=ChartoUart_NUM;
Serialport.write(ChartoUart_TEMP+'0');
}

========================================================

實際測試影片








Digispark chap2.通訊應用-3 IR紅外線遙控器按鍵讀取(UART to PC)

對於一般的專題製作,如果希望有無線遙控的功能
最簡單而且低成本的方式,就是運用加裡老舊的紅外線遙控器
Digispark搭配一個紅外線接收器就可以簡單地達到遙控的功能
如同家裡的冷氣、電視遙控器

學會了這個簡單的IR遙控器後,還可以控制不少東西,可能實現的範例如下
1.居家的燈光控制:搭配一個繼電器,就可以簡單的控制家中的燈光
2.搭配一個輪型平台,LM298就可以做成簡單的遙控車
3.搭配WS2812 RGB LED,可以簡單的控制RGB 3色的燈光
這幾個都是非常簡單可以達成的小實驗,如果下次有機會,會再補充在網誌上

本篇文章,希望運用Digispark搭配紅外接收(IRM0208-A538),讀取一般遙控器的協定
將資料再透過UART傳到電腦端,這個實驗可以幫助我們判讀遙控器每個按鍵的碼
將來在實際上製作東西的時候,就可以透過判讀這個碼來控制其他東西



相關接線方式:



範例程式碼:
 1  
 2 #include  <SoftSerial.h>
 3  
 4 uint8_t situation = 0;
 5 uint8_t START = 0;
 6 uint8_t x = 0;
 7 uint8_t BIT = 0;
 8 uint8_t Id = 0;
 9 uint8_t Id_inv = 0;
10 uint8_t Data = 0;
11 uint8_t Data_back = 0;
12 uint8_t Data_inv = 0;
13 uint8_t Repeat = 0;
14 uint8_t sended = 0;
15  
16 uint16_t Time_old = 0;
17 uint16_t Time = 0;
18 uint16_t TimeDelta = 0;
19  
20 SoftSerial Serialport(5, 0 );      //設定Rx/Tx對應的PIN
21 unsigned char Serialdata[32],Serial_DATA;
22 int Serial_num;
23  
24 void setup(void) {
25   attachInterrupt(0, IR_Read, FALLING);
26   pinMode(1,OUTPUT);
27   digitalWrite(1,LOW);
28  
29   Serialport.begin(9600);
30   Serialport.write("SoftSerial Test \r\n");
31 }
32  
33 void loop(void) {
34   if(sended == 1) {
35  
36     Serialport.write("IR data:");  //傳送字串
37     Char_to_Uart((unsigned char)Id);
38     Serialport.write(",");  //傳送字串
39     Char_to_Uart((unsigned char)Id_inv);
40     Serialport.write(",");  //傳送字串
41     Char_to_Uart((unsigned char)Data_back);
42     Serialport.write(",");  //傳送字串
43     Char_to_Uart((unsigned char)Data_inv);
44     Serialport.write(",\r\n");  //傳送字串
45  
46     sended = 0;
47   } else {
48  
49   }
50 }
51  
52 void IR_Read(void) {
53   digitalWrite(1,HIGH);
54   Time = micros();
55   if (Time_old != 0) {
56     TimeDelta = Time - Time_old;
57     if ((TimeDelta > 12000)&&(TimeDelta < 14000)) {
58       START = 1;
59       x = 0;
60       situation = 1;
61       Id = 0;
62       Id_inv = 0;
63       Data = 0;
64       Data_inv = 0;
65     } else if ((TimeDelta > 10000)&&(TimeDelta < 12000)) {
66       situation = 2; // repeat
67     } else if ((TimeDelta > 1500)&&(TimeDelta < 2500)) {
68       situation = 3; //"1"
69       BIT = 1;
70     } else if ((TimeDelta > 1000)&&(TimeDelta < 1500)) {
71       situation = 3; //"0"
72       BIT = 0;
73     } else situation = 5; 
74  
75     if (situation == 3) {
76       if (x < 8) {
77         Id |= BIT;
78         if (x < 7) Id <<= 1;  
79         x++;
80       } else if (x < 16) {
81         Id_inv |= BIT;
82         if (x < 15) Id_inv <<= 1;
83         x++;
84       } else if (x < 24) {
85         Data |= BIT;
86         if (x < 23) Data <<= 1;
87          x++;
88       } else if (x < 32) {
89         Data_inv |= BIT;
90         if (x < 31) {
91           Data_inv <<= 1;
92         } else {    
93           /* DO SOMETHING HERE */
94           sended = 1;
95  
96           Data_back = Data;
97           Repeat = 0;
98         }
99         x++;
100       }
101     } else if (situation == 2) {
102       if(Repeat == 1) {     
103         /* DO SOMETHING HERE */
104         /*sended = 1;*/
105       } else {
106         Repeat = 1;
107       }
108     }
109   }
110   Time_old = Time;
111   digitalWrite(1,LOW);
112 }
113  
114 void Char_to_Uart(unsigned char ChartoUart_NUM) {
115 unsigned char ChartoUart_TEMP;
116  
117 ChartoUart_TEMP=ChartoUart_NUM/100;
118 Serialport.write(ChartoUart_TEMP+'0');
119 ChartoUart_NUM=ChartoUart_NUM-(ChartoUart_TEMP*100);
120  
121 ChartoUart_TEMP=ChartoUart_NUM/10;
122 Serialport.write(ChartoUart_TEMP+'0');
123 ChartoUart_NUM=ChartoUart_NUM-(ChartoUart_TEMP*10);
124  
125 ChartoUart_TEMP=ChartoUart_NUM;
126 Serialport.write(ChartoUart_TEMP+'0'); 
127 }
128  

電腦端接收到的資料:
每一行代表一個按鍵的資料,第三組資料代表的是按鍵的位置代碼

2018年5月31日 星期四

Digispark chap2.通訊應用-2 RGD LED串接控制 WS2812 5050

本章要跟大家介紹如何用Digispark控制WS2812的RGB LED
這個LED整合了RGB三個顏色與控制器,可以很簡單用一根IO控制一整排的RGB LED
WS2812是將RGB LED控制IC WS2811跟RGB LED包在5050的封裝裡面

目前市面上很多彩色的廣告燈都是用WS2812的RGB LED
如果學會其實可以應用在不少的地方,比方說做遙控車的煞車燈、霧燈、大燈、七彩霓虹燈..
而且,控制起來非常簡單,只需要一片小小的Digispark,只用其中一隻I/O,串遍整台車的RGB LED就可以控制,線路相當簡單





相關接線方式:




範例程式碼:
 1  
 2 #include 
 3 DEFINE_WS2811_FN(WS2811RGB, PORTB, 1)
 4 RGB_t rgb[6]; //1 for 1 pixel
 5 int RGB_NUM;
 6 
 7 void setup() {
 8 
 9   pinMode(1,OUTPUT);
10 
11 }
12 
13 void loop() {
14 
15   RGB_NUM+=1;
16     switch( RGB_NUM/50 )
17     {
18       case 0:     //第一顆LED,亮紅色
19         rgb[0].r=40;  rgb[0].b=0;   rgb[0].g=0;
20       break;
21       case 1:     //第二顆LED,亮紫色
22         rgb[1].r=40;  rgb[1].b=40;  rgb[1].g=0;
23       break;
24       case 2:     //第三顆LED,亮藍色
25         rgb[2].r=0;   rgb[2].b=40;  rgb[2].g=0;
26       break;
27       case 3:     //第四顆LED,亮青藍色
28         rgb[3].r=0;   rgb[3].b=40;  rgb[3].g=40;
29       break;
30       case 4:     //第五顆LED,亮綠色
31         rgb[4].r=0;   rgb[4].b=0;  rgb[4].g=40;
32       break;
33       case 5:     //第六顆LED,亮黃色
34         rgb[5].r=40;  rgb[5].b=0;  rgb[5].g=40;
35       break;
36       case 6:
37       RGB_NUM=0;
38       break;
39     }
40 
41  updatePixels(); //show the change
42   delay(20);
43 }
44 
45 void updatePixels(){
46  WS2811RGB(rgb, ARRAYLEN(rgb));
47 }
48 


結果影片:上述程式可以達成如下的樣子,可以再依照您的需求修改程式



另外一個型態顯示,但由於程式比較複雜一點點,就沒有把這隻範例放到網路上








影片拍的顏色沒有那麼鮮豔,因為顏色反差太大,拍起來並不漂亮
實際上的顏色是很鮮豔,很漂亮的






Digispark chap2.通訊應用-1 SoftSerial(UART串列傳輸可用在藍芽模組、與電腦溝通、設備遙控、資料傳輸)

本章用最簡單的方式在Digispark上實現SoftSerial(UART)
其實就是我們常在電腦中用的RS232通訊
電壓為準為5V或是3.3V,不過基本上協定是相同的
在Digispark如果可以接收串列(UART)的訊號,其實就有很多用處了

比方說您如果想製作一個無線的環境偵測器(可以接收溫度、濕度、陽光等外部資訊)
就可以簡單的利用UART搭配藍芽模組來實現
溫度或濕度感測器 >> Digispark >> UART(通訊協定) >> 藍芽模組 >> 由電腦或手機接收相關資訊

又或者你想要做一個無線的遙控器,遙控家裡的窗簾或是門的開關
手機APP >> 藍芽模組 >> UART(通訊協定) >> Digispark >> 開關控制電路

本章用軟體的方式實現UART的傳輸,電腦端透過有線的UART to USB的模組接收訊號
當Digispark收到電腦傳來的命令時,回傳對應的字串

如下是我的實驗設備
1.Digispark
2.USB to TTL模組(USB to UART)(紅)
3.杜邦對接線*3條



範例程式碼:

 1  
 2 #include <SoftSerial.h>
 3 
 4 SoftSerial Serialport(2, 1);      //設定Rx/Tx對應的PIN
 5 char Serialdata[32];
 6 int Serial_num;
 7 
 8 void setup() {
 9  Serialport.begin(9600);          //設定Baudrate為9600  
10  Serialport.write("SoftSerial Test \r\n");  //傳送字串
11  delay(1000);
12 }
13 
14 void loop() {
15 if (Serialport.available())
16  {
17   Serialdata[0] = Serialport.read();        //接收Serial資料
18   // 判斷接收的資料如果是文字A,就回傳字串"DATA: A \r\n"
19   if( Serialdata[0] == 'A' ){  Serialport.write("DATA: A \r\n"); }
20   if( Serialdata[0] == 'B' ){  Serialport.write("DATA: B \r\n"); }
21   }
22  }
23


相關接線方式:



電腦端用AccessPort作為接收軟體,設定好對應的COM port與baudrate
就可以測試功能是否正常



這個小實驗成功後,可以換成藍芽模組,做出其他非常多的變化


2018年5月30日 星期三

Digispark chap1.IO應用-2 BUTTON按鍵偵測

本章來在Digispark上實現按鍵偵測,也可以用來偵測其他外部訊號
這個小實驗很簡單,當P2接腳接地時(模擬一般按鍵被按下),LED就滅

為了可以精簡接線,本章的pinMode是INPUT_PULLUP,就是會開啟IO內部的pull-up電阻
這樣我就可以不用在外部接上pull-up電阻,達成按鍵偵測的效果

程式碼如下
 1  
 2 // the setup routine runs once when you press reset:
 3 void setup() {
 4  pinMode(1, OUTPUT);       // LED on PIN1
 5  pinMode(2, INPUT_PULLUP); // BUTTON on PIN2
 6 }
 7  
 8 // the loop routine runs over and over again forever:
 9 void loop() {
10  if( digitalRead(2) ){     // Read BUTTON(PIN2)
11    digitalWrite(1, HIGH);  // turn on the LED(PIN1)
12  }
13  else
14  {
15    digitalWrite(1, LOW);   // turn off the LED(PIN1)
16  }
17 }
18 


如同之前章節,按下上傳後可以看到效果如下
為了簡單,用一條杜邦對接線,模擬按鍵被按下,接觸的點是GND










Digispark的線路圖

如下是Digispark的線路圖
在開發的過程中,我們必須要看線路了解我們要用哪一PIN來完成專案上的需要

Digispark chap1.IO應用-1 LED閃爍

今天為大家介紹第一個Digispark的程式
由於是第一次使用Digispark,我們採用最簡單的LED亮滅來做這次的實驗

1.先將程式碼貼進Arduino IDE中
程式碼如下:

 1 
 2 // the setup routine runs once when you press reset:
 3 void setup() {                
 4 
 5   pinMode(1, OUTPUT); //設定PIN1(LED)為OUTPUT   
 6 }
 7 
 8 // the loop routine runs over and over again forever:
 9 void loop() {
10   digitalWrite(1, HIGH);  // turn the LED on (HIGH is the voltage level)
11   delay(500);              // wait for a second
12   digitalWrite(1, LOW);   // turn the LED off by making the voltage LOW
13   delay(500);             // wait for a second
14 }
15  


2.按下上傳,這個動作在IDE中會先編譯,完成後再上傳
(在這之前,請不要將Digispark插在USB上)



3.編譯完成會看到如下訊息,此時必須在60秒內將Digispark插入USB Port

草稿碼使用了 700 bytes (11%) 的程式儲存空間。上限為 6012 bytes。
全域變數使用了 9 bytes 的動態記憶體。
Running Digispark Uploader...                                                                    
Plug in device now... (will timeout in 60 seconds)




4.IDE偵測到Digispark插入USB Port,會自動將我們前面編譯的程式碼,狀態如下
上傳到Digispark,並且自動開始執行,這時候我們會看到開發板上的LED一閃一閃的

草稿碼使用了 700 bytes (11%) 的程式儲存空間。上限為 6012 bytes。
全域變數使用了 9 bytes 的動態記憶體。
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)
> Please plug in the device ... 
> Press CTRL+C to terminate the program.
> Device is found!
connecting: 16% complete
connecting: 22% complete
connecting: 28% complete
connecting: 33% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94  page size: 64
> Erase function sleep duration: 752ms
parsing: 50% complete
> Erasing the memory ...
erasing: 55% complete
erasing: 60% complete
erasing: 65% complete
> Starting to upload ...
writing: 70% complete
writing: 75% complete
writing: 80% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!




程式載入後的效果如下

初次使用Digispark,如何設定IDE環境,安裝軟體&驅動程式 2

在完成驅動程式安裝後,我們要開始對Arduino IDE做一些簡單的設定

1.開啟軟體 Arduino IDE ,點選[ 檔案 >> 偏好設定 ]



2.在[ 額外的開發板管理員網址 ],欄位中填入以下的值
[ http://digistump.com/package_digistump_index.json ]
之後按下[ 確定 ]


3.點選[ 工具 >> 開發板:"XXX" >> 開發板管理員 ]




4.點選[ 工具 >> 開發板:"XXX" >>  Digispark(Default -16.5mhz) ]



接下來會用最簡單的小程式完成我們在Digispark上的第一個程式


















初次使用Digispark,如何設定IDE環境,安裝軟體&驅動程式

如果要使用Digispark這個迷你可愛的開發板
在最初的時候需要做一些簡單的設定與軟體安裝

如下是我平常開發時使用的,那個開關接在USB的5V電源上
在IDE進入燒錄狀態的時候,要在60秒內把Digispark插入電腦
這時候用這個開關斷電再開就很方便



如果在尚未安裝驅動程式的情況下插入電腦,裝置管理員中會顯示"無法識別的裝置"



1.首先是安裝Arduino IDE
請參考.....

2.下載裝驅動程式
位置如下:

點選[ DPinst64.exe ]執行安裝驅動程式















在正確的安裝驅動程式後,會顯示如下的裝置
(有時候需要重新插拔Digispark才會顯示)


在完成驅動程式安裝後
接下來介紹Arduino IDE中的設定,請見如下






2016年3月3日 星期四

Digispark 最迷你的Arduino開發板


今天向大家推薦這個最迷你的Arduino開發板 Digispark

有時候我們需要簡單的控制,但一般的開發板又很大一片,我想這會是你最佳的選擇
Digispark是一個基於ATTINY85 MCU的USB開發板,體積小巧並且價格便宜,功能雖然沒有Arduino完善,但可以簡單的使用Arduino IDE開發程序,並透過USB直接燒綠,非常方便。


Digispark 特色

-支援 Arduino IDE 1.0+
-可透過USB供電,並且板上有5V LDO
-透過USB直接燒錄開發好的程式
-6 I/O Pins (其中兩PIN1必須供USB燒錄用,燒錄後斷開可做I/O使用)
-8k Flash Memory (about 6k after bootloader)
-I2C and SPI (vis USI)
-PWM on 3 pins (more possible with Software PWM)
-ADC on 4 pins
-一個電源LED and 一個測試用LED

尺寸:27mm X 19mm(含USB接口)















專題許願池,請不要吝嗇將你想製作的專題用回覆的方式寫在下方

專題許願池 開這個板是為了幫助一些人,有專題製作需求,但是又不知道要如何實現 如果您有想製作的專題,請您將您的題目回覆在下方,先提出您的需求,進而討論可行性或製做的方向,或是您進行到什麼階段,有遇到什麼樣的問題也可以提出來討論,如果我知道會盡量幫助您順利完成。 不限...