2018年1月31日 星期三

Arduino (15) 麥克風聲音感測模組控制LED燈。


聲音感測模組

聲控設備都會用到的東西。

除了DC正負外,有數位輸出DO和類比輸出AO,這次我們玩數位輸出就好囉。

上面也有電位器控制靈敏度。






程式我沒有加Delay,很即時的呈現聲音控制LED。


程式如下:

const int LED=8;
const int sound=2;

void setup(){
 pinMode(LED,OUTPUT);
 pinMode(sound,INPUT);
}

void loop(){
  if(digitalRead(sound)==LOW){
    digitalWrite(LED,HIGH);
    delay(100);
  }else if(
    digitalRead(sound)==HIGH){
      digitalWrite(LED,LOW);
      delay(100);
//值得注意的是這模組是觸發後發出低電位,所以要寫讀到LOW時LED燈亮。
    }
}


Arduino (14) CDS5m/m 光敏電阻+RGB LED模組。



右邊有兩根PIN元件的是CDS5m/m光敏電阻,就是以光感控制電阻值。

左邊是RGB 三色LED模組,分別有紅、綠、藍,也可個別點亮合成其他顏色。



擋住光線呈現藍色,手移開呈現綠色,拿光去照呈現閃爍,因為在綠與紅的臨界值。

要刻意寫出閃爍也可以的。


程式如下:

const int CDS=A0;
//記得宣告類比訊號。

const int red_led = 8;
const int green_led = 9;
const int blue_led = 10;


void setup()
{
  pinMode(red_led,OUTPUT);
  pinMode(green_led,OUTPUT);
  pinMode(blue_led,OUTPUT);
}
void loop()
{
  int val;
  val=analogRead(CDS);
  if(val>=700){
  digitalWrite(blue_led, HIGH);  
  digitalWrite(green_led, LOW);  
  digitalWrite(red_led, LOW);  
  delay(100); 
  //電阻分配值大於700亮藍色。

  }
  if(val<650){
  digitalWrite(red_led, LOW);  
  digitalWrite(blue_led, LOW);  
  digitalWrite(green_led, HIGH);  
  delay(100); 
  }
 //電阻分配值小於650亮綠色。

  if(val<500){
  digitalWrite(red_led, HIGH);  
  digitalWrite(green_led, LOW);  
  digitalWrite(blue_led, LOW);  
  delay(100); 
  }
//電阻分配值小於500亮紅色。
}


2018年1月30日 星期二

Arduino (13) 接觸式液位計模組+IIC/I2C1602顯示器


接觸式液位計模組,

就是一般的接觸式水位計。

只有三根PIN,DC正負、DATA。



我結合了LCD螢幕來顯示數據,單位是"mm"。


程式如下:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
const int val = A3;
//記得宣告類比PIN腳。

void setup() {
  lcd.begin(16, 2);
 
}
void loop() {
    int water = analogRead(val);
//回傳水位數值。

    lcd.setCursor(0,0);
    lcd.print("Water Level:");
    lcd.setCursor(0,1);
    lcd.print(water);
    delay(100);
}

程式看來也沒什麼難度。

Arduino (12) 火焰感測器+有源蜂鳴器。

Arduino新手包一定會有的感測器模組,

其實我也不知道為什麼一定要有火焰感測器,

成本便宜嗎?

對於學習來說我覺得反射式避障模組可能還比較好。




火焰感測器

上面有電位器可以調整靈敏度,跟訪間上的安防設備原理一樣。

四根PIN,DC5V+-、數位輸出DO、類比輸出AO,我們只判別高低電位所以只用DO即可。





















有源蜂鳴器,

做為警報器,因為內建震盪器,所以不用額外給頻,只要給個HIGH就會響。




影片中我多接了一顆LED,點火蜂鳴器和LED就會做動,我延遲寫了3秒。


程式如下:


#include <pitches.h>
const int buzzer = 2;
const int Led=3;                                             
const int fireSensor=7;                                      
int val;  

void setup(){ 
  pinMode(Led,OUTPUT);
  pinMode(buzzer,OUTPUT);
  pinMode(fireSensor,INPUT);
}

void loop(){
  val=digitalRead(fireSensor);
  if(val==LOW)
  { 
    digitalWrite(Led,HIGH);  
    digitalWrite(buzzer,HIGH); 
    delay(3000);
  }else{ 
    digitalWrite(Led,LOW);
    digitalWrite(buzzer,LOW);
  }
  delay(100);
}

程式簡單到應該不需要註解吧。





2018年1月29日 星期一

Arduino (11) 紅外線收發器+MAX7219+8X8 LED點陣模組。

這次要玩的是用紅外線去控制8X8點陣LED模組。





















首先先看紅外線接收器和紅外線發射器

接收器看起來就像一個電晶體,三個PIN分別是DC+-和Vout。

發射器看起來就是一個普通的遙控器,可以用其他遙控器代替。






















再來就是8X8點陣模組,這模組有搭配MAX7219顯示驅動器

其實我學習套件裡的8X8LED沒有包含MAX7219,但看了佈線圖讓我卻步了,

於是我額外買了模組化的套件,複雜的腳位變成五根PIN。

分別是DC正負、DIN、CS、CLK。





















按下紅外線發射器任何鍵,序列阜解碼的資料都不一樣,Protocol屬NEC。

32 bits是解碼資料的單位大小,也是4 bytes。





影片中按0顯示0,按1顯示1,按8顯示8,按"CH-"燈跑馬全亮,按"CH"燈跑馬全暗。

我只設定五種按鍵而已,太多真的會寫到死。



程式如下:

#include <IRremote.h>
#include <LedControl.h>
//需要拉出紅外線和MAX7219的資料庫。

const int irReceiverPin = 2;
const int trigger =7;
IRrecv irrecv(irReceiverPin);
decode_results results; 
LedControl lc=LedControl(12,11,10,1); 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(trigger, OUTPUT); 
  lc.shutdown(0,false);  
  lc.setIntensity(0,8);  
  lc.clearDisplay(0);     
}
//一些既定的宣告和定義。


void loop() 
{
  if (irrecv.decode(&results)){ 
            Serial.print("Protocol: ");   

            switch(results.decode_type) {
        case NEC:
          Serial.print("NEC");
          break;
        case SONY:
          Serial.print("SONY");
          break;
        case RC5:
          Serial.print("RC5");
          break;
        case RC6:
          Serial.print("RC6");
          break;
        default:
          Serial.print("Unknown encoding");  

//分類帽是確認你的遙控器的Protocol。
    }  

    Serial.print("  irCode: ");            
    Serial.print(results.value); 
//序列阜會顯示你用紅外線發射器按的解碼資料。

    if (results.value == 16753245) { 
//接收到解碼16753245,執行以下邏輯。

        digitalWrite(trigger, HIGH);
        
          for (int row=0; row<8; row++)
           {
            for (int col=0; col<8; col++)
             {
              lc.setLed(0,col,row,true); 
                delay(25);
          }
       }
    }  
//LED用跑馬燈方式全亮。

    if (results.value == 16736925) {  
        digitalWrite(trigger, LOW);
        
          for (int row=0; row<8; row++)
           {
            for (int col=0; col<8; col++)
             {
              lc.setLed(0,col,row,false);
                delay(25);
         }
      }
   }
//LED用跑馬燈方式全暗。


   if (results.value == 16738455){
    for (int row=2; row<6; row++){
        lc.setLed(0,2,row,true);
        lc.setLed(0,5,row,true);
      }
    for (int col=3; col<5; col++){
        lc.setLed(0,col,1,true);
        lc.setLed(0,col,6,true);
     }
   }
//顯示數字"0"。

      if (results.value == 16724175){
    for (int row=1; row<7; row++){
        lc.setLed(0,3,row,true);
      }
    for (int col=2; col<5; col++){
        lc.setLed(0,col,7,true);
     }
     lc.setLed(0,4,2,true);
   }
//顯示數字"1"。

      if (results.value == 16730805){
    for (int row=2; row<7; row++){
        lc.setLed(0,2,row,true);
        lc.setLed(0,5,row,true);
      }
    for (int col=3; col<5; col++){
        lc.setLed(0,col,1,true);
        lc.setLed(0,col,4,true);
        lc.setLed(0,col,7,true);      
     }
     lc.setLed(0,5,4,false);
     lc.setLed(0,2,4,false);
   }
//顯示數字"8"。

    Serial.print(",  bits: ");           
    Serial.println(results.bits);  
    delay(500);
    irrecv.resume();         
  }  
}

紅外線的應用很多很廣,下次再拿來結合其他模組來玩。




2018年1月28日 星期日

Arduino (10) 紅外線收發器+4位元七段LED顯示器。



4位元七段LED顯示器

就是1位元的顯示器結合4個。

市面上有賣一種整合上TM1637晶片的模組,接線上會比較方便。

下圖是顯示器的接腳定義。




其實我這篇本來是沒有紅外線收發的,只是覺得單單跑數字這樣有點單調,

後來多結合了紅外線控制數字變化。

所以紅外線介紹可以看第(11)篇。






影片中大概就是,

按"CH-":4位元顯示器同時跑0~9。

按"CH":自己發明的規則跑數字。




程式如下:

#include <IRremote.h>
#include <LedControl.h>
const int irReceiverPin = A0;
IRrecv irrecv(irReceiverPin);
decode_results results; 
const byte port[4] = {13, 12, 9, 8};
const byte led[8] = {5, 7, 4, 11, 10, 3, 6, 2};

#define H 1
#define L 0
const boolean data[10][8] = {
{H,H,H,H,H,H,L,L},//0
{L,H,H,L,L,L,L,L},//1
{H,H,L,H,H,L,H,L},//2
{H,H,H,H,L,L,H,L},//3
{L,H,H,L,L,H,H,L},//4
{H,L,H,H,L,H,H,L},//5
{H,L,H,H,H,H,H,L},//6
{H,H,H,L,L,L,L,L},//7
{H,H,H,H,H,H,H,L},//8
{H,H,H,H,L,H,H,L},//9
};
//宣告0~9亮燈方式。

void LED1(int N)
{
  for(int j=0;j<=6;j++){
   digitalWrite(led[j],data[N][j]);
  }
}
//使LED作動的函式。


void setup()
{
 for(int i=0;i<7;i++){
   pinMode(led[i],OUTPUT);
 } 
  for(int i=0;i<4;i++){
   pinMode(port[i],OUTPUT);
}
 digitalWrite(port[0],HIGH);
 digitalWrite(port[1],HIGH);
 digitalWrite(port[2],HIGH);
 digitalWrite(port[3],HIGH);
 Serial.begin(9600);
 irrecv.enableIRIn();
}
void loop(){
   if (irrecv.decode(&results)){ 
            Serial.print("Protocol: ");   
            switch(results.decode_type) {
        case NEC:
          Serial.print("NEC");
          break;
        case SONY:
          Serial.print("SONY");
          break;
        case RC5:
          Serial.print("RC5");
          break;
        case RC6:
          Serial.print("RC6");
          break;
        default:
          Serial.print("Unknown encoding");  
    }  
//確認Protocol。

  if (results.value == 16753245) { 
     for(int k=0;k<=9;k++){
       delay(500);
       LED1(k);
         } 
       delay(1000);
     }  
//按"CH-":4位元顯示器同時跑0~9。


  if (results.value == 16736925){
     for(int k=1;k<=10;k++){
       digitalWrite(port[0],HIGH);
       digitalWrite(port[1],LOW);
       digitalWrite(port[2],LOW);
       digitalWrite(port[3],LOW);
       delay(100);
       LED1(k);}
     for(int k=1;k<=10;k++){
       digitalWrite(port[0],HIGH);
       digitalWrite(port[1],HIGH);
       digitalWrite(port[2],LOW);
       digitalWrite(port[3],LOW);
       delay(300);
       LED1(k);}
     for(int k=1;k<=10;k++){
       digitalWrite(port[0],HIGH);
       digitalWrite(port[1],HIGH);
       digitalWrite(port[2],HIGH);
       digitalWrite(port[3],LOW);
       delay(900);
       LED1(k);}
     for(int k=1;k<=10;k++){
       digitalWrite(port[0],HIGH);
       digitalWrite(port[1],HIGH);
       digitalWrite(port[2],HIGH);
       digitalWrite(port[3],HIGH);
       delay(1200);
       LED1(k);
        }
      }
    //按"CH":自己發明的規則跑數字。

    Serial.print("  irCode: ");            
    Serial.print(results.value); 
    Serial.print(",  bits: ");           
    Serial.println(results.bits);  
    delay(500);
    irrecv.resume();    
   }
}

紅外線的程式說明可以參考第11篇喔。

2018年1月27日 星期六

Arduino (9) 高精度時鐘模組 DS3231+IIC/I2C1602顯示器。

購買DS3231時的情況蠻無言的,

當時買了網路上的學習套件其實是應該要給DS1302,

結果點料時發現是DS3231,

後來反映給商家說給錯料,結果過一星期送來又是DS3231???

結果我現在有兩顆DS3231   XD





DS3231高精度時鐘模組本體,有一顆鈕扣3V電池。

杜邦線接法要注意SDA->A0,SCL->A1。

電壓給3.3V。


再來就與LCD1602做結合。



程式如下:


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);

#include <DS3231.h>
DS3231 rtc(A0, A1);

void default_Clack()
{
rtc.setDOW(SATURDAY); 
rtc.setTime(17, 41, 55);    
rtc.setDate(27, 01, 2018);   
}
//這是時間預設值函式。

void setup()
{
Serial.begin(115200);
rtc.begin();
 lcd.begin(16, 2);

default_Clack();
//時間預設函式執行,如果不執行預設可以忽略"//"。
}
void loop()
{
Serial.print("Week:");
Serial.println(rtc.getDOWStr());
Serial.print("Data:");
Serial.print(rtc.getDateStr());
Serial.print(", Time:");
Serial.println(rtc.getTimeStr());
//使用序列阜監控。

lcd.setCursor(0,0);
lcd.print("Time:");
lcd.setCursor(0,1);
lcd.print(rtc.getTimeStr());
//LCD只顯示時間就好。

delay (1000);
//1秒更新時間一次。
}


序列阜監視顯示時間、日期和週別。




LCD只顯示時間。

就是一個數位電子鐘。





2018年1月26日 星期五

Arduino (8) 超聲波模組HC-SR04+1位元七段LED顯示器+74HC595+無源蜂鳴器。

講到現實上的超聲波應用,首先先想到倒車雷達,就來做倒車雷達囉。

再多加個LED七段顯示器來顯示距離變化吧!!



超聲波模組HC-SR04。


市面上有賣一種收發合一的版本,但這種收發分開的版本比較便宜。




再來是LED七段顯示器,加了一顆74HC595,這暫存器可減少過多連接處理器的線路。

但線路看起來還是很多啊,

LED七段顯示器每一段記得加1個330歐姆的電阻來限流,不然用久了會罷工。




我寫成10個階段(0~9),雷達越遠顯示器的數字越大。

我還加了個蜂鳴器,這樣更像倒車雷達了。


程式如下:

const int trigPin=10;
const int echoPin=9;
const int mike=5;
unsigned long data;

const byte dataPin  = 2;    
const byte latchPin = 3;   
const byte clockPin = 4;  
//74HC595的數位PIN宣告。

const byte num[10]={
    B01111110,  
    B00110000,  
    B01101101, 
    B01111001, 
    B00110011,  
    B01011011,  
    B01011111,  
    B01110000,    
    B01111111, 
    B01110011     
};
//LED顯示器的數字陣列宣告。

void LED7(int N){
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,LSBFIRST,N);
    digitalWrite(latchPin,HIGH);
    delay(10);
//控制七段LED的函式。
}

unsigned long ping(){
  digitalWrite(trigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin,LOW);
  return pulseIn(echoPin,HIGH);
//超聲波回傳變數的函式。


}
void setup(){
  pinMode(trigPin,OUTPUT);
  pinMode(echoPin,INPUT);
  pinMode(mike,OUTPUT);
  pinMode(dataPin,OUTPUT);
  pinMode(latchPin,OUTPUT);
  pinMode(clockPin,OUTPUT);
  Serial.begin(9600);
}
void loop(){
  data=ping()/58;
 //算出距離值
  int A=abs(data/10);
 //算出分類帽變數。

  switch(A)
  {
    case 1:
    tone(5, 1047,100);
    LED7(num[1]);
    break;   
    case 2:
    tone(5, 1047,100);
    LED7(num[2]);
    break;   
    case 3:
    tone(5, 1047,100);
    LED7(num[3]);
    break; 
    case 4:
    tone(5, 1047,100);
    LED7(num[4]);
    break; 
    case 5:
    tone(5, 1047,100);
    LED7(num[5]);
    break; 
    case 6:
    tone(5, 1047,100);
    LED7(num[6]);
    break; 
    case 7:
    tone(5, 1047,100);
    LED7(num[7]);
    break; 
    case 8:
    tone(5, 1047,100);
    LED7(num[8]);
    break; 
    case 9:
    tone(5, 1047,100);
    LED7(num[9]);
    break; 
    case 0:
    tone(5, 1047,100);
    LED7(num[0]);
    break; 
    default:
    noTone(5);
//分類帽定義。

  }
  Serial.print("Distance  ");
  Serial.print(data);
  Serial.print("cm");
  Serial.println();
//序列阜監控。
  delay(300);
}

感覺不像市面上的倒車雷達來的快和準,可能是我程式Delay那邊沒有寫好,

但是有一定的功能了,差不多就好。



2018年1月25日 星期四

Arduino (7) 微波雷達感應模組 RCWL-0516+繼電模組控制風扇。

這篇很特別。

因為"微波"就跟我的工作相關,微波雷達偵測器。

微波Microwave,波長短於無線電波,長於紅外線,頻率也屬超高頻。

而我們公司都是24GHz的產品,這東西頻率落在哪,下次再帶到公司試試看。

微波其實比紅外線厲害很多,他不但不受氣候溫度影響,也可穿透非金屬的物質,

埋在牆壁也可以偵測。



微波雷達感應模組 RCWL-0516


看起來就一顆16Pin的IC打天下,那顆電晶體應該是比較器,把AC訊號轉DC,

板子上看起來有微帶天線。

應該就純屬CW而已,測試Motion。

來試試看功能吧。




果然厲害,也是非常靈敏,身體動一點就觸發。





一樣測試遠距離,果然一樣靈敏,這模組沒有硬體延遲和靈敏度的功能,

不過延遲可以用程式設定,來看程式,

基本上就跟上一篇相同,就多加個延遲10秒吧。




const int Sensor= 7;
const int trigger= 8;
int data;

void setup() {
  pinMode(Sensor,INPUT); 
  pinMode(trigger,OUTPUT);   
}

void loop() {
  data=digitalRead(Sensor); 
  if(data==1){                   
    digitalWrite(trigger,HIGH);
    delay(10000);    
//延遲10秒。    
  }
  else{
    noTone(trigger);

  }
}





Arduino (6) 人體紅外線感測器模組 HC-SR501+繼電模組控制風扇。

市面上感測器有很多種類,

這篇要說關於超高頻的紅外線,紅外線簡稱IR,波長短於微波長於可見光,

頻率高於微波,低於可見光,屬超高頻(最高至300GHz),

至於這東西頻率是幾GHz,下次帶去公司用頻譜掃看看。

我直接沿用上一篇的配置,觸動繼電器控制風扇。


來看模組,

人體紅外線感測器模組 HC-SR501


上面有兩顆電位器,分別是調整靈敏度(左)和時間(右)。





影片看下來,這東西還蠻厲害的,非常靈敏。






我們把時間的電位器調了一下,發現真的延遲挺久的。





看看遠距離表現如何。

哇喔,還挺遠的呢。




程式超簡單,

基本上就是INPUT輸出給數位訊號HIGH,觸發繼電器。

const int Sensor= 7;
const int trigger= 8;
int data;

void setup() {
  pinMode(Sensor,INPUT); 
  pinMode(trigger,OUTPUT);   
}
void loop() {
  data=digitalRead(Sensor); 
  if(data==1){                   
    digitalWrite(trigger,HIGH);         
  }
  else{
    noTone(trigger); 
  }
}

下一篇來講微波吧。




2018年1月24日 星期三

Arduino (5) 反射式紅外線壁障模組+繼電模組控制風扇。

這組合是我一開始就想弄的,因為是最基本的應用。

但是外接電源很難買(2.5mm轉usb頭+5v2A變壓器),最後終於從網路上買到了。

先看重要模組。



反射式紅外線避障模組

三根PIN分別是DC+-5V、OUTPUT(觸發訊號)。

上面有電位器可以控制靈敏度。

兩個像LED的是紅外線的TX和RX。




5V繼電器模塊

左邊三根PIN分別為DC+-5V、INPUT觸發,右邊是常開(NO)、常閉(NC)、COM(共極),



至於怎麼接,

繼電器原理就是,接NO沒觸發時都開路(與COM),觸發後變閉路,接NC時就相反。

因為我們要預設一開始就沒通,所以選擇長閉。



結果大概就是影片這樣,

我風扇也是支援5V電源,這種高電流的東西千萬不可直接讓處理器輸出DC給風扇,

不然板子會被電流打壞,最起碼也要用電晶體做開關。


來看程式 :

boolean OPEN=false;
//預設關閉。

boolean Press=false;
//預設沒按下

void setup(){ 
  pinMode(7,INPUT);
  pinMode(8,OUTPUT);
  digitalWrite(8,LOW);
}
void loop(){ 
   if(digitalRead(7)!=HIGH&&Press==false){
    OPEN=!OPEN;
    digitalWrite(8,OPEN);
    Press=true;
   }
//如果第7腳沒讀到高電位或按鈕沒按下,關閉。

   else if(digitalRead(7)==HIGH&&Press!=false){
    Press=false;
   }
//如果第7腳讀到高電位或按紐按下,開啟。

   delay(10);
}

因為觸控後要持續開,我直接拿按紐開關的程式來套。

沒有特別的函式需要Include。

紅外線感應器的偵測距離很短,電位器怎麼調都大概只能偵測3~5公分,

不像Datasheet上說的可以到30cm。










2018年1月22日 星期一

Arduino (4) 溫溼度偵測模組DHT11+IIC/I2C1602顯示器。



DHT11溫溼度偵測模組

這種組合顧名思義就是"數位溫濕度計"。

模組有三根PIN,分別為DC5V,DATA輸出。

DATA和DC+需並聯一個4.7K電阻做上拉電阻。

因為我沒有4.7K電阻,所以我串聯兩個2.2K代替(如下圖)。

一開始我以為這個模組已經內建上拉電阻了,仔細看才發現上面的SMD電阻只是給LED分壓

而已。




來看程式 :

#include <dht.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
//LCD+轉換器的的定義設定。

const int dht_dpin A1;
dht DHT; 
//宣告腳位和變數

void setup(){ 

lcd.begin(16, 2);

Serial.begin(9600);
//序列阜9600 bps。
}
void loop(){ 
lcd.setCursor(0, 0);
DHT.read11(dht_dpin);
//偵測器的回傳數值。

lcd.print("Humidity:");     
lcd.print((float)DHT.humidity, 1);     
lcd.print("%");     
lcd.setCursor(0, 1);     
lcd.print("Tempure:");     
lcd.print((float)DHT.temperature, 1);     
lcd.print("oC");   
//LCD顯示規則。

Serial.println((float)DHT.humidity);
Serial.println((float)DHT.temperature);
Serial.println();
//序列阜顯示規則。

delay(2000);
//兩秒回傳一次
}







用手去壓偵測模組溫溼度會上升。






可觀看序列阜數值,delay設定2000,為兩秒偵測一次。

但說真的很不準,當時我房間只有15度,卻顯示20度。






2018年1月20日 星期六

Arduino (3) 4X4薄膜型鍵盤+步進馬達28BYJ-48。


接下來要玩的是用4X4薄型鍵盤控制步進馬達。

介紹一下重要模組。




步進馬達(28BYJ-48-5V)。

這馬達額定電流很高,需要外接電源,而我額外接了

5V 2A的變壓器,但記得要共地讓Offset一致。




驅動板ULN2003。

四顆LED可以大致看出馬達轉動邏輯,排PIN分別裝在處理器的四個數位

腳位。



4X4薄型鍵盤。

很薄一片,需要接8個腳位。




每個按鍵讓步進馬達轉動的幅度和方向都不一樣,

"#"字鍵我寫了正轉+反轉且幅度也不相同。


程式如下:

#include <Keypad.h>    
#include <Stepper.h>
#define STEPS 200
//宣告步進馬達步數。

Stepper stepper(STEPS, A0, A2, A1, A3);
#define KEY_ROWS 4 
#define KEY_COLS 4
char keymap[KEY_ROWS][KEY_COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte colPins[KEY_COLS] = {9, 8, 7, 6};   
byte rowPins[KEY_ROWS] = {13, 12, 11, 10}; 
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, KEY_ROWS, KEY_COLS);
//以上都是4X4鍵盤的宣告。 

void setup(){
  Serial.begin(9600);
//序列阜9600。

  stepper.setSpeed(140);
//步進馬達的轉速。
}

void loop(){
 char key = myKeypad.getKey();
 if (key=='1'){  
    stepper.step(200);
    ;}
//按鍵盤"1",正轉200。
 if (key=='2'){  
    stepper.step(-200);
    ;}
//按鍵盤"2",反轉200。
 if (key=='3'){    
    stepper.step(800);
    ;}
 if (key=='4'){  
    stepper.step(-800);
    ;}
 if (key=='5'){  
    stepper.step(1600);
    ;}
 if (key=='6'){    
    stepper.step(-1600);
    ;}
 if (key=='#'){    
    stepper.step(500);
    delay(200);
    stepper.step(-800);
    delay(800);
    ;}
//就是按下什麼鍵就執行什麼邏輯。
}

前面已經用類比搖桿控制伺服馬達了,這篇就用鍵盤控制,也是可以用類比搖桿控制步進馬

達的。




Arduino (2) PS2類比搖桿+雙軸伺服馬達SG90。

伺服馬達就是一種玩具關節,一個馬達就是一個關節。

首先介紹控制伺服馬達的模組。



PS2類比搖桿。

這是PS2上面的香菇頭搖桿。

五根PIN : DC+-5V、XPIN、YPIN、SW。

XPIN、YPIN就把他想成兩個10K的可變電阻就好了,可控制類比訊號。

而伺服馬達控制位置就是要使用類比搖桿,都說類比搖桿了,XY當然要接到類比(Analog)插

座。




伺服馬達SG90,又稱9G舵機。

既然搖桿是兩個可變電阻組成,我當然會使用兩個以上伺服馬達控制,




後來想一想,除了搖桿控制外,加個按鍵讓它有固定的轉法。

就變下圖這樣,多一個觸控按鍵,按一下給個HIGH,觸發邏輯。




來看影片。

一、用搖桿操控兩軸伺服馬達。
二、第一個觸控按鍵讓兩軸馬達一起轉90度。






程式如下 :

#include<Servo.h > 
Servo servo1;
Servo servo2;
const int push=3;
const int pinX = A0;
const int pinY = A1;
int valX, posX;
int valY, posY;
int i = 0; 

//落落長的宣告就不說了。

void setup()
{
  servo1.attach(8);
  servo2.attach(9);
  pinMode(push,INPUT);
 }
//落落長的定義也不說了。

void loop()
{

  if(digitalRead(push)==HIGH){
   for(i = 30; i < 120; i += 1) 
  {                   
    servo1.write(i);         
    servo2.write(i);           
    delay(15);                   
  }
  for(i = 120; i>=30; i-=1) 
  {                 
    servo1.write(i);         
    servo2.write(i);           
    delay(15);                   
  }
  }
  //按鍵讓兩個伺服馬達從30度轉到120度再轉回來。

  valX = analogRead(pinX);
  valY = analogRead(pinY);
  posX = map(valX, 0, 1023, 0, 179);
  posY = map(valY, 0, 1023, 0, 179);
  //可變電阻類比值0~1023轉換成角度0~179度,因為這顆伺服馬達極限只能轉180度。
  //兩伺服馬達轉的角度和方向我是寫一樣,可各自更改方向角度,會有不一樣的轉法。

  servo1.write(posX);
  servo2.write(posY);
  //伺服馬達啟動。

  delay(15);
}

其實我很想買那種1千2千的機械手臂來玩看看,可是真的很花錢。



8051 (6) 紅外線避障模組控制LED七段顯示器。

這篇要做的Project就是感測器測到訊號時,LED七段顯示器會開始計算偵測次數, 到第5次時會讓紅色LED燈發光。 程式如下: #include <reg52.h> unsigned char seg[5]={0xf9,...