2016年1月31日 星期日

Arduino UNO學習141.數字LED燈共陽5611BH

 Arduino UNO學習141.數字LED燈共陽5611BH

數字LED燈有7段顯示器和8段顯示器多個小數點,並分共陰或共陽,
可取3V水銀電池,直接引線負極到顯示器中間共腳,正極隨意接一腳,
即可知各接腳訂義,此說明使用共陽型8段顯示器,↓

數字LED燈*1共陽型5611BH
220或330歐電阻*8,
 

燈有10支腳,除了中間共腳為負,其他腳位都設為正,
便會讓8個燈都點亮,ArduBlock拼圖塊↓
 


www.ee543.com

Arduino UNO學習160.傾斜開關+有源蜂鳴器



Arduino UNO學習160.傾斜開關+有源蜂鳴器

傾斜開關是一種利用地球引力重力來控制電路打開或閉合的元件,
就和開關被壓下啟動的功能相同的,運用於控制平衡的元件,
以往是內置水銀來製作,稱為水銀開關,由於水銀有毒,現多改用鋼珠來製做,
接腳和一般壓按開關一樣接法,

”源”蜂鳴器指的是內部有震盪源,只要有範圍內的電壓即可發出聲音,
請選用5V內的蜂鳴器搭配Arduino使用,
有源蜂鳴器有長短腳,長腳為正短腳為負,安裝時注意腳位,

玩多了LED燈,這次改用蜂鳴器來取代LED燈,可免除電阻的安裝,
傾斜開關*1
蜂鳴器*1

ArduBlock程式部分也是和按鍵控制燈號一樣,
void setup()
{
        pinMode( 2 , INPUT);
        pinMode( 13 , OUTPUT);
}

void loop()
{
        if (    digitalRead( 2))
        {
                digitalWrite( 13 , LOW );
        }
        else
        {
                digitalWrite( 13 , HIGH );
        }
}

把麵包板拿水平或反面,當開關感應到傾斜時蜂鳴器就會發出聲音,
若改成馬達或其他元件,就可控制物件的平衡,或是震動時啟動某元件,
以下為Arduino官方教學


2016年1月30日 星期六

Arduino UNO學習510.密碼開關EEPROM

Arduino學習510.密碼開關EEPROM

硬體
按鍵或指撥開關*4,圖片中的開關都可以
 

UNO中有一個可複寫唯讀記憶體EEPROM,
容量1kb=1024Byte,位址由0~1023,
程式前段先顯示原本位址10中的資料於監控視窗,
再寫入自定數字密碼9並顯示,及設定初始腳位↓
 

使用2進位計算方式設定4個Pin腳為1,2,4,8,
因為是輸入負低電壓訊號,因此需設成沒訊號時為0,按通後分別為1,2,4,8,
並計算開關的總計是否符合密碼9,若不符密碼就顯示錯誤,可運用在密碼正確時啟動設備
#include <EEPROM.h>

int _ABVAR_2_PIN3 = 0 ;
int _ABVAR_4_PIN5 = 0 ;
int _ABVAR_5_Total = 0 ;
int _ABVAR_1_PIN2 = 0 ;
int _ABVAR_3_PIN4 = 0 ;

void setup()
{
    pinMode( 2 , INPUT);
    pinMode( 3 , INPUT);
    pinMode( 4 , INPUT);
    pinMode( 5 , INPUT);
Serial.begin(9600);
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
Serial.print( EEPROM.read( 10 )  );
Serial.println();

    delay( 1000 );

EEPROM.write( 10 , 9 );

Serial.print( "SAVE=" );
 Serial.print( EEPROM.read( 10 )  );
Serial.println();

    delay( 2000 );


}

void loop()
{
    if (    digitalRead( 2))
    {
        _ABVAR_1_PIN2 = 0 ;
    }
    else
    {
        _ABVAR_1_PIN2 = 1 ;
    }
    if (    digitalRead( 3))
    {
        _ABVAR_2_PIN3 = 0 ;
    }
    else
    {
        _ABVAR_2_PIN3 = 2 ;
    }
    if (    digitalRead( 4))
    {
        _ABVAR_3_PIN4 = 0 ;
    }
    else
    {
        _ABVAR_3_PIN4 = 4 ;
    }
    if (    digitalRead( 5))
    {
        _ABVAR_4_PIN5 = 0 ;
    }
    else
    {
        _ABVAR_4_PIN5 = 8 ;
    }
    _ABVAR_5_Total = ( ( _ABVAR_1_PIN2 + _ABVAR_2_PIN3 ) + ( _ABVAR_3_PIN4 + _ABVAR_4_PIN5 ) ) ;
    if (( ( _ABVAR_5_Total ) == ( EEPROM.read( 10 )  ) ))
    {
    Serial.print( _ABVAR_5_Total );
Serial.println();
    Serial.print( "WELCOME" );
Serial.println();
    }
    else
    {
    Serial.print( _ABVAR_5_Total );
Serial.println();
    Serial.print( "ERROR" );
Serial.println();
    }
    delay( 5000 );
}



www.ee543.com

Arduino UNO學習440.8*8點陣LED燈16腳1088BS

Arduino UNO學習440.8*8點陣LED燈16腳1088BS

點陣8*8共64個燈,由8+8個腳位控制,
也有12+12腳位控制雙色8*8燈,
以下為1088BS點陣燈腳對應圖,接腳位順序不等同燈號順序,
當X13,Y9一正一負交叉時左上燈亮起,由於燈有分正負,
需依共陽或共陰,來調整X列為正或負,以及Y列為正或負,↓
 

燈在裝上麵包板時會發現,燈太大了,所以此學習需使用2個麵包板,
點陣8*8共有8+8=16支腳,而Arduino UNO的數位腳只有D0~D13,
因此需用到類比腳位A0~A5,來代替為第A14~A19,
為避免用到D0和D1的通訊腳位,所以從D2腳位開始接起,
也就是燈1腳接D2,,燈2腳接D3,,依序到燈12接D13,,
再轉到燈13腳接A0,,一樣依序接到燈16腳接A3,,共16腳位,
此範例是作動態閃燈,每顆亮燈時間不長,故省略了電阻,
若要長時間點亮還是要加上電阻保護,以免燒燈↓
 
燈的順序和腳位順序是不同步的,故接好後的燈對應Arduino腳位圖↓
 
ArduBlock先寫副函式,手邊的燈X負Y正時點亮,想要將燈關閉,所以X列設高Y列設低,
並將X列和Y列熄燈腳位設定為副程式以便每燈亮後作熄燈用,↓
 
依序要點亮每個燈,X列腳位順序即為D14,D4,D5…一直到D17,因為要亮8排,
所以可設成副程式以便亮8次,每顆燈亮100毫秒就熄燈,再亮下一顆燈,
若要讓燈由右燈亮起,也可設成反順序D17,D16,D12…一直到D14,
要換下一排前記得讓燈全部熄滅,所以在程式尾要呼叫對映副函式X1和Y0↓
 

主程式部分每次開始前先讓點亮的燈熄滅,所以先呼叫對映副函式X1和Y0,
Y列第一排腳為D10,加上X列由D14腳逐一往右亮起,
再亮Y列下一排D15一樣加上X列由D17由右往左亮起,
如此便可讓Y列8排都逐一亮點亮,ArduBlock的主程式拼圖↓
 
void Y0();
void X1();
void X14();
void X17();

void setup()
{
    pinMode( 10 , OUTPUT);
    pinMode( 15 , OUTPUT);
    pinMode( 9 , OUTPUT);
    pinMode( 13 , OUTPUT);
    pinMode( 2 , OUTPUT);
    pinMode( 8 , OUTPUT);
    pinMode( 3 , OUTPUT);
    pinMode( 6 , OUTPUT);
    pinMode( 17 , OUTPUT);
    pinMode( 16 , OUTPUT);
    pinMode( 12 , OUTPUT);
    pinMode( 7 , OUTPUT);
    pinMode( 11 , OUTPUT);
    pinMode( 5 , OUTPUT);
    pinMode( 4 , OUTPUT);
    pinMode( 14 , OUTPUT);
}

void loop()
{
    X1();
    Y0();
    digitalWrite( 10 , HIGH );
    X14();
    digitalWrite( 15 , HIGH );
    X17();
    digitalWrite( 9 , HIGH );
    X14();
    digitalWrite( 13 , HIGH );
    X17();
    digitalWrite( 2 , HIGH );
    X14();
    digitalWrite( 8 , HIGH );
    X17();
    digitalWrite( 3 , HIGH );
    X14();
    digitalWrite( 6 , HIGH );
    X17();
}

void X17()
{
    digitalWrite( 17 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 16 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 12 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 7 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 11 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 5 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 4 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 14 , LOW );
    delay( 10 );
    X1();
    Y0();
}

void X1()
{
    digitalWrite( 14 , HIGH );
    digitalWrite( 4 , HIGH );
    digitalWrite( 5 , HIGH );
    digitalWrite( 11 , HIGH );
    digitalWrite( 7 , HIGH );
    digitalWrite( 12 , HIGH );
    digitalWrite( 16 , HIGH );
    digitalWrite( 17 , HIGH );
}

void X14()
{
    digitalWrite( 14 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 4 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 5 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 11 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 7 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 12 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 16 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 17 , LOW );
    delay( 10 );
    X1();
    Y0();
}

void Y0()
{
    digitalWrite( 10 , LOW );
    digitalWrite( 15 , LOW );
    digitalWrite( 9 , LOW );
    digitalWrite( 13 , LOW );
    digitalWrite( 2 , LOW );
    digitalWrite( 8 , LOW );
    digitalWrite( 3 , LOW );
    digitalWrite( 6 , LOW );
}


以下世界高手的作品分享,遵循Arduino精神把大家的作品放上網路分享吧
http://blog.bsoares.com.br/arduino/ping-pong-with-8x8-led-matrix-on-arduino


www.ee543.com

2016年1月25日 星期一

Arduino UNO學習430.控制伺服馬達



Arduino UNO學習430.控制伺服馬達

直流馬達,步進馬達,伺服馬達,是機器人及移動機具重要的元件,
馬達在搭配Arduino板使用建議另加電源,以免過載燒板,
各馬達有不同的扭力及速度,依需求搭配,不要把馬達操壞了,
一般伺服馬達多是0~180度,此款接線為橙訊號/紅正電/棕負電,
 
伺服馬達是透過PWM控制的,所以接腳務必選擇有”~”的腳位↓

這麼重要的元件,在ArduBlock中當然有對應的角度積木塊及模組,
就讓馬達由0轉到180度,由於伺服馬達並不會轉360度,
所以程式結束後的位置在180度處,再次執行程式後再轉回到0度位置,
可自行調整角度以了解伺服馬達的控制方式↓
#include <Servo.h>

Servo servo_pin_9;

void setup()
{
servo_pin_9.attach(9);
}

void loop()
{
servo_pin_9.write( 10 );
        delay( 1000 );
servo_pin_9.write( 190 );
        delay( 1000 );
}


UNO板的電流輸出約僅200mA,在實作中會發現舵機出現抖動的情形,
可使用9V1A電源供應給UNO,或舵機電源外接,以提供較大電力,
並注意搭配的電線是否可通過1A以上電力,一般杜邦線是無法過1A的,


2016年1月24日 星期日

Arduino UNO學習420.控制步進馬達


Arduino UNO學習420.控制步進馬達

步進馬達有分電壓及線腳數及步角,內有減速齒輪,
在此不說明步進馬達的運作原理,注意馬達高功率,
如長時連續使用建議外接電源,以免過載燒板,
在此以5線步進馬達28BYJ-48為例
 

一般步進馬達會搭配ULN2003晶片來作訊號放大,以免馬達功率大而無法轉動,
可直接搭配步進馬達驅動板使用↓

馬達+驅動板+UNO板硬體連接,為了使馬達轉動明顯,可貼上膠布或紙片↓
 



在此不介紹步進馬達運作原理,只需知道4條訊號線依序給電即可使馬達轉動,
因是5線馬達,除了紅色為電源之外,需讓其他4線各一次高電位,以轉動馬達,
其轉動依序如下列表,在此為簡化程式,故省去了列表中第2.4.6.8的電磁配置↓

上圖示為half step共4條線的第4條Orange高位其他3腳低位,
再來是第4和第3的Yellow高位其他3腳低位,依序共8步驟為1個步角循環,
每步驟中可加入時間來控制轉速,若要反向就反著調整高位順序,
以下縮減作full step即省去半個電位變成4步驟,
注意作full step馬達反應時間過短會有漏步現像,以及建議加上外部電源提供電力↓
 
void setup()
{
        pinMode( 4 , OUTPUT);
        pinMode( 5 , OUTPUT);
        pinMode( 6 , OUTPUT);
        pinMode( 7 , OUTPUT);
}

void loop()
{
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , HIGH );
        delay( 10 );
}

28BYJ-48步進馬達規格,步腳5.625度角,360度/5.625=64,
齒輪減速比為1/64=0.015625,額定半步模式,
(360度/5.625)/(齒輪比1/64)=4096/8步=512,
可把上面程式4位一循環打包成副程式
去控制值行次數以達指定角度,如512次則可繞360度一圈↓

void setup()
{
        pinMode( 4 , OUTPUT);
        pinMode( 5 , OUTPUT);
        pinMode( 6 , OUTPUT);
        pinMode( 7 , OUTPUT);
  for (int i = 0 ; i < 512  ; ++i )
    {
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , HIGH );
        delay( 10 );
    }
  }
void loop(){}


若是half step作更精密的控制來轉動180度則為
void setup()
{
        pinMode( 4 , OUTPUT);
        pinMode( 5 , OUTPUT);
        pinMode( 6 , OUTPUT);
        pinMode( 7 , OUTPUT);
  for (int i = 0 ; i < 256  ; ++i )  //256轉180度
    {
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , HIGH );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , LOW );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , HIGH );
        digitalWrite( 7 , HIGH );
        delay( 10 );
        digitalWrite( 4 , LOW );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , HIGH );
        delay( 10 );
        digitalWrite( 4 , HIGH );
        digitalWrite( 5 , LOW );
        digitalWrite( 6 , LOW );
        digitalWrite( 7 , HIGH );
        delay( 10 );
    }
  }
void loop(){}



詳細拆解內部參考它網

Arduino UNO學習410.無源蜂鳴器



Arduino UNO學習410.無源蜂鳴器


蜂鳴器有分電壓,此學習請找5V的無源蜂鳴器搭配UNO使用,
蜂鳴器,指的是內部無震盪源,是由訊號發送不同頻率產生音效,
而有源蜂鳴器是通電後就會鳴叫,有分正負腳,
無源蜂鳴器2腳一樣長,安裝無分正負腳位,二者使用方式完全不同,
參照Arduino.cc官網資訊對照音頻數據,
Do=523
Re=587
Mi=659
Fa=698
So=784
La=880
Si=988
Do=1047
將中音階跑完一次,再自己找簡單的樂譜試試吧

硬體
蜂鳴器*1
 
 ArduBlock的拼圖塊
 

void setup()
{
}

void loop()
{
        tone(7, 523);
        delay( 1000 );
        tone(7, 587);
        delay( 1000 );
        tone(7, 659);
        delay( 1000 );
        tone(7, 698);
        delay( 1000 );
        tone(7, 784);
        delay( 1000 );
        tone(7, 880);
        delay( 1000 );
        tone(7, 988);
        delay( 1000 );
        tone(7, 1047);
        delay( 1000 );
}


Arduino UNO學習350.溫度計LM35


Arduino UNO學習350.溫度計LM35

此學習使用LM35DZ元件,是一顆有3隻腳的溫度感測元件,
測量範圍0~100度C,腳位為電源(印字面左)/訊號/GND,接錯會燒壞,

硬體準備
溫感元件LM35*1
 
 
LM35DZ溫感器的訊號關係為C=10mV=0.01V,
換算UNO輸入數據為電壓5V/1024=0.0049V,
即為腳位訊號*0.0049v/0.01v=1度C,
也就是訊號值*0.49就可得到幾度C,
並將得到的C值換算成F華氏=攝氏C*1.8+32,
打開監控視窗分別顯示”輸入訊號值+攝氏C+華氏F”
5秒傳送一次,ArduBlock拼圖如下↓
 
int _ABVAR_1_C = 0 ;

void setup()
{
Serial.begin(9600);
}

void loop()
{
Serial.print( analogRead(0) );
Serial.println();
        Serial.print( ( ( analogRead(0) * 0.0049 ) / 0.01 ) );
        Serial.print(" ");
Serial.print( "C" );
Serial.println();
        _ABVAR_1_C = ( ( analogRead(0) * 0.0049 ) / 0.01 ) ;
        Serial.print( ( ( _ABVAR_1_C * 1.8 ) + 32 ) );
        Serial.print(" ");
Serial.print( "F" );
Serial.println();
        delay( 5000 );
}
上傳執行後會先顯示原本得到的數據,再轉算為攝氏度,再顯示華氏度,
有發現不肖業者將便宜的三極管磨去標簽後重新印字販賣,
接上後數據會有規率性的高低起浮,可參考學習310內建範例-接收類比訊號
先套用內建範例>Basics>AnalogReadSerial
先取得讀取數據是否正常,再進行數據轉換,

簡化半秒顯示度C,加上int整數指令+0.5為四捨五入,方便顯示在液晶上用
 void setup()
{
Serial.begin(9600);
        Serial.begin(9600);
}

void loop()
{
 Serial.print( int ( ( ( analogRead(0) * 0.0049 ) / 0.01 )+0.5 ) );
 Serial.println();
 delay( 500 );
}

補充~非整數顯示小數1位
Serial.print((( analogRead(0) * 0.0049 ) / 0.01 ),1);

2016年1月21日 星期四

Arduino UNO學習340.光控感光燈



Arduino UNO學習340.光控感光燈


光敏電阻和一般電阻一樣有不同大小,Arduino的讀數最大為1023,

因此不同的光敏電阻需搭配各種不同的電阻來得到1023內的數據,

所以依手邊的的材料做不同的電阻搭配並修改參數,使得光感低時亮起LED,

如無法確認手邊的光敏電阻值可先套用程式後,打開監控視窗,

若讀數高於1023則加上不同電阻來修改數據,



準備硬體

光敏電阻*1

1K10K電阻*1接光感器
LED燈*1
220330電阻*1LED
 
找出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 ) < ( 600 ) ))
        {
                digitalWrite( 13 , HIGH );
        }
        else
        {
                digitalWrite( 13 , LOW );
        }
}

上傳後打開監控視窗,並遮住光感元件,
注意視窗的數據,因每個光敏電阻數據不同,故要搭配不同電阻,
或調整程式中的數據,以達到環境暗就亮燈,


www.ee543.com 

材料-麵包板



材料-麵包板

麵包板尺寸有很多種以下是常見的尺寸,此規格的麵包有橫向和直向,
A橫向的孔位是相通的,上2條下2條,有些會分為2邊則共8條,
BC為直向通,代表B5個洞是相通的,但BC是不通的

而擴充板的小麵包板則沒有橫向通的腳位,直向D5孔相通,DE不通