2016年3月26日 星期六

Arduino UNO學習450.馬達控制晶片L293D



Arduino UNO學習450.馬達控制晶片L293D

UNO板接USB供電,輸出電流低於300mA無法直接驅動電機,
需加其他裝置增加電流,需由5.5mm圓口接9V電或外接電力,
此晶片L293D可控制最多4個DC馬達或單個步進馬達,
一般用來控制2個馬達作正轉及反轉,並可由PWM控制轉速,
共16針腳,最大36V 1200mA電力,↓
.Pin1,,Enable1=2.3V~Vss~PWM,高電時Pin2~7左半邊IC運作,低電時停用
.Pin2,,INPUT1=2.3V~Vss,當高電時啟動Output1輸出Vs
.Pin3,,OUTPUT1=Vs~Vss/600mA,接馬達設備一接腳
.Pin4/5,,GND=接地
.Pin6,,OUTPUT2=Vs~Vss/600mA,接馬達設備一接腳
.Pin7,,INPUT2=2.3V~VssV,當高電時啟動Output2輸出Vs
.Pin8,,VS=Vss~36V,搭配馬達使用電壓,外部供應馬達使用的電力
.Pin9,,Enable2=2.3V~Vss~PWM,高電時Pin10~15右半邊IC運作,低電時停用
.Pin10,,INPUT3=2.3V~VssV,當高電時啟動Output3輸出Vs
.Pin11,,OUTPUT3=Vs~Vss/600mA,接馬達設備一接腳
.Pin12/13,,GND=接地
.Pin14,,OUTPUT4=Vs~Vss/600mA,接馬達設備一接腳
.Pin15,,INPUT4=2.3V~VssV,當高電時啟動Output4輸出Vs
.Pin16,,VSS=4.5V~36V,提供給晶片工作的電源

在了解接腳後開始安裝硬體,此練習安裝單顆5V直流馬達,
由於馬達耗電高,可能因USB電力供應不足而造成UNO板不正常,
因此需搭配額外電力,可搭配電池盒或外接電源,
注UNO板上有個電源Vin的輸入腳位,
另若要馬達長時間轉動,要注意L293D的溫度,可加裝散熱片↓
當腳位D9高位時,控制晶片上的E2開始運作,當D10高D11低時,
則晶片O3和O4馬達腳位轉動,當D10和D11高低電交換時,則馬達轉另一方向,
Arduino Block拼圖程式,簡單的使馬達轉動3秒後,停1秒再轉另一方向↓
由於晶片有16針腳,在安裝上要注意所有腳位是否都有導通,
可使用電表量測晶片腳位來確認是否與麵包板有確實接觸,
上傳後若轉動不明顯可在馬達轉軸貼上貼紙膠帶或風扇轉輪等,
若沒有問題,下則拼圖程式改為PWM來控制晶片L293D的Pin9腳,
以控制馬達的轉速,要注意在UNO板上的腳位需有PWM功能 ↓
Arduino UNO的PWM輸出值在0~255之間,
可試著調整數值,以達到馬達轉動的最低電力需求,
若需要高扭力轉動可搭配減速器或減速馬達使用,
若以上練習沒有問題,可試著在另一邊也加上另一顆馬達,
或是控制4個馬達,但是4個馬達只能控制轉動,而無法控制轉向,

void setup()
{
  pinMode( 9 , OUTPUT);
  pinMode( 10 , OUTPUT);
  pinMode( 11 , OUTPUT);
}

void loop()
{
  analogWrite(9 , 250);
  digitalWrite(10 , HIGH);
  digitalWrite(11 , LOW);
  delay( 3000 );
  digitalWrite(10 , LOW);
  delay( 1000 );
  digitalWrite(10 , LOW);
  digitalWrite(11 , HIGH);
  delay( 3000 );
  digitalWrite(11 , LOW);
  delay( 1000 );
}


2016年2月28日 星期日

Arduino UNO學習411.電位器調頻蜂鳴器



Arduino UNO學習411.電位器調頻蜂鳴器

請找2腳一樣長的5V的無源蜂鳴器,安裝時注意正負腳位,
無源蜂鳴器由不同頻率訊號產生音效,頻率可參照Arduino.cc官網資訊,
此學習要由可調電阻輸入數值,再轉換成數據產生頻率並調整LED亮度,

硬體
無源蜂鳴器*1
電位器*1(可調電阻)
LED燈+220或330電阻*1
Arduino的類比輸入數值為0~1023,將其轉換為音頻50~2000,
而PWM輸出值為0~255,故1023/4=255,轉算給LED燈, ↓
完成後上傳,並調整電位器電阻值,蜂鳴器將產生不同頻率的聲音,
並同時調整LED的亮度,

int _ABVAR_1_TONE = 0 ;

void setup()
{
  pinMode( 5 , OUTPUT);
}

void loop()
{
  _ABVAR_1_TONE = map ( analogRead(A0) , 0 , 1023 , 50 , 2000 )  ;
  tone(7, _ABVAR_1_TONE);
  analogWrite(5 , ( analogRead(A0) / 4 ));
  delay( 50 );
  noTone(7);
}
 
 

Arduino UNO學習151.PWM呼吸燈



Arduino學習151.PWM呼吸燈

在Arduino內建範例中有呼吸燈程式,檔案>範例>Basics>Fade,
此學習則使用ArduBlock來編寫呼吸燈↓
 
注意數位腳位有標示著~的3,5,6,9,10,11腳位,才有PWM訊號功能,
PWM是輸出模擬類比訊號,讓數位訊號不再只是開和關,
在積木上主要讓輸出值在0~255之間逐加,到255時再逐減輸出值,
因此用到許多的數學運算,當正數*-1時轉為負數,當負數*-1時轉為正數,↓

上傳程式後LED燈是否是漸亮後再漸暗,試著比對Arduino的內建範例,
檔案>範例>Basics>Fade,比較2個程式的差異,
把硬體和軟體腳位改為D8非PWM腳位,比較其差別,

int _ABVAR_1_Bright = 0 ;
int _ABVAR_2_Fade = 0 ;

void setup()
{
  pinMode( 9 , OUTPUT);
  _ABVAR_1_Bright = 0 ;

  _ABVAR_2_Fade = 5 ;

}

void loop()
{
  analogWrite(9 , _ABVAR_1_Bright);
  _ABVAR_1_Bright = ( _ABVAR_1_Bright + _ABVAR_2_Fade ) ;
  if (( ( ( _ABVAR_1_Bright ) == ( 0 ) ) || ( ( _ABVAR_1_Bright ) == ( 255 ) ) ))
  {
    _ABVAR_2_Fade = ( _ABVAR_2_Fade * -1 ) ;
  }
  delay( 30 );
}


2016年2月27日 星期六

Arduino UNO學習540.多工函式庫scoop



Arduino UNO學習540.多工函式庫scoop

之前的學習在loop程式裡是逐一執行的,
若要讓不同燈不同速度同時閃動,或和馬達蜂鳴器等其他設備同時運作,
則需要使用到函式庫scoop.h,來利用delay時的空檔運作其他程式列,
以達到多設備同時運作,
先下載外部函式庫scoop.h,以下載點擇一下載,
下載後copy安裝於Arduino的目錄之下..\Arduino\libraries
再重新執行Arduino,於範例會多出SCoop↓

另外檢查ArduBlock版本,需要20140704之後的版本才有多工SCoop拼圖塊,
若沒有則請更新版本,
下載後放在.. \Arduino\tools\ArduBlockTool\tool
或是..\Administrator\My Documents\Arduino\tools\ArduBlockTool\tool
一樣重新執行Arduino後執行ArduBlock,確認是否有SCoop拼圖塊↓

完成scoop.h及ArduBlock版本安裝後,程式才能正確對應,
以下學習簡單的讓2個燈及蜂鳴器以各自不同速度運作,↓




www.ee543.com

2016年2月25日 星期四

Arduino UNO學習530.74HC595N移位暫存器


Arduino UNO學習530.74HC595N移位暫存器

Arduino UNO的輸出接口不多,可利用其他晶片如74HC595/N,
來減少腳位的使用,以下為腳位圖,並依說明接上硬體↓
晶片腳位
名稱
功能
硬體對應
1~7
Q1~Q7
輸出
各電阻接燈正腳
8
GND
接地
GND
9
Q7S
串接輸出
 
10
MR
低電位清除資料
+5V
11
SHCP
clock移位時脈
D5
12
STCP
latch暫存時脈
D4
13
OE
低電輸出
 
14
DS
data資料輸入
D2
15
Q0
輸出
各電阻接燈正腳
16
VCC
輸入電壓
+5V


直接引用晶片時脈0~256,作內存8位元資料的閃燈測試↓

int clockPin = 5;
int latchPin = 4;
int dataPin = 2;
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
void loop() {
  for (int numb = 0; numb < 256; numb++) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, numb);
    digitalWrite(latchPin, HIGH);
    delay(50);
  }
}

在實作時經常會有失敗的情形,多半是接錯或晶片腳與麵包板的接觸問題,
請確認接腳或手壓觸動晶片,或另接外部電源6V1A~9V2A使用,
若上面的程式沒問題,再來用陣列方式來指定控制亮燈↓
int clockPin = 5;
int latchPin = 4;
int dataPin = 2;
byte index = 0;

const byte LED_A[10] = {
  B11111111,
  B00000001,
  B00000011,
  B00000110,
  B00001100,
  B00011000,
  B00110000,
  B01100000,
  B11000000,
  B10000000,
}; // 8顆10種亮燈方式可自行修改測試

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, LED_A[index]);
  digitalWrite(latchPin, HIGH);
  delay(100);
  index ++;
  if (index == 10) {
    index = 0;  // 10種亮燈後歸0
  }

2016年2月13日 星期六

Arduino學習520.紅外線搖控器IRremote



Arduino學習520.紅外線搖控器IRremote

人類可見光的波長約390~ 700 nm奈米左右,而紅外光的波長超過760 nm,
人眼看不見,各種電器也各用不同的頻率協定以免錯誤搖控,
此篇搭配已開發開放的IRremote程式庫指令解碼,
先到Maker大神Ken Shirriff的部落格網站下載程式庫,以下位址擇一下載,
http://www.righto.com/2010/11/irremote-library-now-runs-on-teensy.html
https://github.com/shirriff/Arduino-IRremote/zipball/master
https://github.com/z3t0/Arduino-IRremote
https://drive.google.com/file/d/0B_hzaKBiDSLgUzFjMmFDZ2I4RFU
將壓縮檔Arduino-IRremote-master.zip解開後,修改目錄名稱更名為IRremote,
並將整個目錄放在安裝Arduino的目錄libraries之中,注意可能為次次目錄,
預設位置為C:\Program Files\Arduino\libraries\IRremote ↓

重新執行Arduino,在範例中會多一個IRremote,並選擇打開IRrecvDemo ↓

跳出另一視窗,查看程式內容得知,訊號腳位為Pin11 ↓

搭配寫好的程式來安裝硬體,注意各種IR接收器的腳位不一定相同,
以下為訊號/Gnd/Vcc ,將訊號腳位接Pin11及分別Gnd及+5V↓

完成硬體後回到電腦上連線上傳程式,並打開監控視窗,
搭配學習套件中的搖控器,或是家中任何的紅外線搖控器,


任意按幾個鍵,Arduino會把接收到的訊號顯示在監控視窗上,
該編碼即是按鍵的指令,取得按鍵編碼後再進一步做對應控制元件,
內建範例HEX為8位元16進位模式,當搖控按太久或是太遠錯誤等,
則會顯示FFFFFFFF ,也可改成DEC為10進位模式以符其他需求,↓
ArduBlock在201407版之後雖有紅外線接收搖控器拼圖模塊,
但由於紅外線解碼程式並非Arduino內建程式庫,
故外掛資料庫和ArduBlock無法完全相容對應,
若對Arduino IDE已有一定程度了解,可試著安裝ardublock-beta-20140702.jar,
或最後版本ardublock-beta-20140828.jar試試


接著打開另一範例IRrecvDump



上傳後一樣打開監控視窗,取遙控器按任一鍵,一樣由P11接收訊號,取得更完整的資料,可得編碼協定及位元波形等等,可先記錄下需要的資料以便運用,
建議多按幾次確認,以免收到不完整的編碼↓













www.ee543.com 

Arduino UNO學習360.火災警報器

Arduino UNO學習360.火燄傳感器+蜂鳴器=火災警報器

準備硬體
火燄傳感器*1
1K或10K電阻*1  (接傳感器)
蜂鳴器*1  (或LED燈加電阻)

火燄傳感器長的像二極管LED燈,但顏色為黑色,一樣有長短腳,
用來檢測760nm~1100nm奈米波長內的火源或光源,
由於每款火燄傳感器輸出數值不大相同,故先量測手上的傳感器數值範圍,
將短腳接上5V電源,長腳接電阻到GND及A0,
並套用Arduino的內建範例,,檔案>範例>Basics>AnalogReadSerial,
執行後取打火機點火靠近感應器得到數據,↓

得到基本數據後接上蜂鳴器↓
 

因手邊測得數據為0~900左右,火源越接近感測器數據越大,
所以將啟動值設定為20,可自行修改數值來啟動蜂鳴器,
並斷音300毫秒警告,為方便取數另加了視窗監控數據,
找出ArduBlock程式執行後取打火機點火測試,務必注意安全↓
 
int _ABVAR_1_A0 = 0 ;

void setup()
{
Serial.begin(9600);
    pinMode( 13 , OUTPUT);
}

void loop()
{
    _ABVAR_1_A0 = analogRead(0) ;
Serial.print( _ABVAR_1_A0 );
Serial.println();
    if (( ( _ABVAR_1_A0 ) > ( 20 ) ))
    {
        digitalWrite( 13 , HIGH );
        delay( 300 );
        digitalWrite( 13 , LOW );
    }
    else
    {
        digitalWrite( 13 , LOW );
    }
    delay( 300 );
}

www.ee543.com