2016年5月29日 星期日

什麼是脈波寬度調變PWM

Arduino提供PWM輸出,分別是 PIN 3,5,6,9,10,11只要板子上有~符號的腳位都能用於提供PWM輸出。

PWM 是使用脈波的工作率(duty cycle)來模擬0-5V之間的類比訊號效果以方波來說它有50% 的時間輸出高電位 5V,而 50% 輸出的時間輸出低電位 0V工作率為50%因此對應的類比電壓可視為 2.5V同樣的,如果工作率為90% (90% 的時間輸出高電位 5V),那麼對應的類比電壓可視為 4.5V依此類推

Arduino可以使用analogWrite函式來設定輸出PWM工作率值,由於輸出是8位元的架構因此對應的值為 0 ~ 255如同下面的圖例,
1. analogWrite(0) 會輸出工作率 0% PWM脈波
2. analogWrite(64) 會輸出工作率 25% PWM脈波
3. analogWrite(127) 會輸出工作率 50% PWM脈波

4. analogWrite(255) 則是會輸出工作率 100% PWM脈波



我們在void loop()中放兩個for-loop但可以達到控制LED漸亮與漸暗的效果:

int led = 9;           // the PWM pin the LED is attached to

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

void loop()
{
  for (int i=0; i<=255; i=i+5)
  {
    analogWrite(led, i);
    delay(30);
  }

  for (int i=255; i>=0; i=i-5)
  {
    analogWrite(led, i);
    delay(30);
  }
}

相同的功能,在Fade這個example裡,也介紹了使用PWMLED燈泡漸暗與漸亮:
int led = 9;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

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

void loop()
{
  analogWrite(led, brightness);
  delay(30);

  brightness = brightness + fadeAmount;

  if (brightness == 0 || brightness == 255)
{
    fadeAmount = -fadeAmount ; 
}
}





2016年5月27日 星期五

直流馬達控制

直流馬達為兩個輸入的驅動界面,一般稱為MOTOR+MOTOR-,一般直流馬達
兩極的電壓差越大轉速越快,電壓差越小轉速越慢。同樣的,兩極的電流量越大扭力越強,電流量越小扭力越弱。

我們知道了馬達的兩極電壓差會影響馬達的轉速,那直流馬達的轉向控制只要調整兩極電壓差的正負就可以改變馬達的正反轉向了。例如MOTOR+的電壓大於MOTOR-的電壓,則為正轉,MOTOR+的電壓小於MOTOR-的電壓,則為反轉。


直接輸出電壓以控制直流馬達開或關



1. 利用TIP 120電晶體放大電流,以驅動直流馬達
2. 數位輸出(高電位和低電位兩種電壓),開、關時間各一秒 (1000 ms)
int motorPin = 9;
void setup() {
pinMode(motorPin, OUTPUT);
}
void loop() {
 digitalWrite(motorPin, HIGH);
 delay(1000);
 digitalWrite(motorPin, LOW);
 delay(1000);

}







1. 利用TIP 120電晶體放大電流,以驅動直流馬達
2. 類比輸出(0-255種不同的數值),此處我們選擇255 153兩種不同的類比值,旋轉時間各2 (2000 ms)

int motorPin = 9;
void setup() {
pinMode(motorPin, OUTPUT);
}
void loop() {
 analogWrite(motorPin, 255);
 delay(2000);
 analogWrite(motorPin, 153);
 delay(2000);
}




利用可變電阻調整直流馬流的轉速
1. 加上可變電阻,A0讀入類比數值(0-1023),轉換成PIN 9的類比輸出(0-255),控制直流馬達的轉速類比值愈高,則轉速愈快。



int motorPin = 9;
int potValue=0;
byte val=0;

void setup() {
pinMode(motorPin, OUTPUT);
}
void loop() {
 potValue=analogRead(A0);
 val=map(potValue, 0, 1023, 0, 255);
 analogWrite(motorPin, val);
}




2016年5月25日 星期三

紅外線動作感測器應用

紅外線動作感測器是一種可以偵測物體移動的電子零件日常生活中,燈泡、蠟燭或人體都會發射紅外線,紅外線動作感測器的工作原理,便是利用人體發射出來的紅外線變化情況來感應物體的移動。


紅外線動作感測器有三支接腳,外觀如下圖:



腳位名稱
功能
GND
接到接地
VCC
接到 +5V 電源
OUT
輸出訊號

偵測到移動物體則警示燈開始閃爍

1. LED長腳 (陽極) 接到Arduino 板子上 pin13,短腳 (陰極) 接到 GND

2. 把紅外線動作感測器 GND 腳位接到 GNDV+ 腳位接到 +5V,然後 OUT 腳位接到數位輸入(Digital pins) pin 2





const int PIRSensor = 2;     // 紅外線動作感測器連接的腳位
const int ledPin =  13;      // LED 腳位

int sensorValue = 0;         // 紅外線動作感測器訊號變數

void setup()
{
  pinMode(PIRSensor, INPUT);    // 紅外線動作感測器連接的腳位
  pinMode(ledPin, OUTPUT);      // LED 腳位
}

void loop()
{
  // 讀取 PIR Sensor 的狀態
  sensorValue = digitalRead(PIRSensor);

  // 判斷 PIR Sensor 的狀態
  if (sensorValue == HIGH)
  {   
    digitalWrite(ledPin, HIGH);  // 偵測到有人,LED燈閃爍
    delay(50);
    digitalWrite(ledPin, LOW);
    delay(50);
  }
  else
  {
    digitalWrite(ledPin, LOW);   // 沒偵測到人,LED off
  }
}




偵測到移動物體則警示燈開始閃爍,且警報器響起

1. LED長腳 (陽極) 接到Arduino 板子上 pin13,短腳 (陰極) 接到 GND
2. 把紅外線動作感測器 GND 腳位接到 GNDV+ 腳位接到 +5V,然後 OUT 腳位接到數位輸入(Digital pins) pin 2

3. 把蜂鳴器長腳接到Arduino 板子上pin8,短腳接到GND




const int PIRSensor = 2;     // 紅外線動作感測器連接的腳位
const int ledPin =  13;      // LED 腳位
const int BUZZERpin= 8;   // Output pin for the Buzzer

int sensorValue = 0;         // 紅外線動作感測器訊號變數

void setup()
{
  pinMode(PIRSensor, INPUT);    // 紅外線動作感測器連接的腳位
  pinMode(ledPin, OUTPUT);     // LED 腳位
  pinMode(BUZZERpin, OUTPUT);  // declare LEDpin as output
}

void loop()
{
  // 讀取 PIR Sensor 的狀態
  sensorValue = digitalRead(PIRSensor);

  // 判斷 PIR Sensor 的狀態
  if (sensorValue == HIGH)
  {   
    digitalWrite(ledPin, HIGH);  // 偵測到有人,LED燈閃爍
    digitalWrite(BUZZERpin, HIGH);  // turn Buzzer on if motion detected
    delay(50);
    digitalWrite(ledPin, LOW);
    digitalWrite(BUZZERpin, LOW);   // turn Buzzer off
    delay(50);
  }
  else
  {
    digitalWrite(ledPin, LOW);   // 沒偵測到人,LED off
    digitalWrite(BUZZERpin, LOW);   // turn Buzzer off
  }
}

NUMPY的Array介紹與Matplotlib的繪圖功能

NumPy 的 Array 介紹與 Matplotlib 的繪圖功能   1. A rray 的基本運算 :   適用於科學和數學運算的 NumPy 套件中,有一個 Array 的資料結構。 Array 是一個非常類似 list 的序列型態。 但是 Arr...