2016年6月30日 星期四

使用easy driver驅動步進馬達


步進馬達的接線顏色可以辨別順序,以常見的6線式步進馬達為例,其引出線包含兩條棕色線為共同點;藍色線和黃色線為同一組線圈;白色線和紅色線為同一組線圈。


我們這個實驗是使用easy driver來驅動步進馬達,easy driver需要外接電源,它可以直接與步進馬達的4條線圈引線(A線圈和B線圈)連線,並且利用輸入時脈來精確的控制步進馬達的轉動。



l  基本實驗

圖片來源: www.elecrow.com



接成電路:
1. STEP 接到Arduino的PIN 9 
2. DIR 接到Arduino的PIN 8 (控制旋轉方向)




void setup() {               
  pinMode(8, OUTPUT);    
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

void loop() {
  digitalWrite(9, HIGH);
  delay(3);         
  digitalWrite(9, LOW);
  delay(3);         
}



l  利用開關控制正反轉
圖片摘自 http://www.schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html


1. 開關被按下和放開時,步進馬達的旋轉方向相反。

void setup() {               
  pinMode(8, OUTPUT);    
  pinMode(9, OUTPUT);
  pinMode(3,INPUT);
 
  digitalWrite(9, LOW);
}

void loop() {
 if (digitalRead(3)==LOW)
  { digitalWrite(8, HIGH);}
 else
  { digitalWrite(8, LOW);}

  digitalWrite(9, HIGH);
  delay(3);         
  digitalWrite(9, LOW);
  delay(3);      
  }



l  同時控制兩個步進馬達



void setup() {              
  pinMode(8, OUTPUT);   
  pinMode(9, OUTPUT);
  pinMode(6, OUTPUT);   
  pinMode(7, OUTPUT);
}

void loop()
{
  digitalWrite(8, HIGH);
  digitalWrite(6, HIGH);
  for (int i=0;i<1600;i++)
  {
    digitalWrite(9, HIGH);
    digitalWrite(7, HIGH);    
    delayMicroseconds(2000);
    digitalWrite(9, LOW);
    digitalWrite(7, LOW);   
    delayMicroseconds(2000);
  }
 
  digitalWrite(8, LOW);
  digitalWrite(6, LOW);
  for (int i=0;i<1600;i++)
  {
    digitalWrite(9, HIGH);
    digitalWrite(7, HIGH);    
    delayMicroseconds(2000);
    digitalWrite(9, LOW);
    digitalWrite(7, LOW);    
    delayMicroseconds(2000);
  }     
}








2016年6月13日 星期一

Joy Stick XY搖桿模組操作

Joy Stick XY搖桿模組上頭已標示出 XY 正值方向,你可以使用 模組上的「搖桿」方塊來操作它。

在實際測試之下, X 電壓值從最左的位置最小值0到最右端的位置為最大值1023Y 電壓值在往上推到底時為最小值0往下推到底則為最大值1023隨著搖桿的方向不同,X,Y軸的電阻值隨之變化,得到不同的輸出組合。

向下按搖桿,可以觸動一個開關,數位輸出1





JoyStick_X接到A0腳位
JoyStick_Y接到A1腳位
JoyStick_Z 接到A2腳位
再接妥正負電源即可



int JoyStick_X = A0;
int JoyStick_Y = A1;
int JoyStick_Z = A2; 
void setup()
{
  pinMode(JoyStick_X, INPUT);
  pinMode(JoyStick_Y, INPUT);
  pinMode(JoyStick_Z, INPUT);
  Serial.begin(9600);
}
void loop() {
  int x,y,z;
  x=analogRead(JoyStick_X);
  y=analogRead(JoyStick_Y);
  z=digitalRead(JoyStick_Z);
  Serial.print(x ,DEC);
  Serial.print(",");
  Serial.print(y ,DEC);
  Serial.print(",");
  Serial.println(z ,DEC);
  delay(100);
}



燭火搖曳

利用亂數和PWM來產生類似燭火搖的效果

  analogWrite(9,random(120)+135);
  analogWrite(10,random(120)+135);
  analogWrite(11,random(120)+135);


2016年6月9日 星期四

利用光敏電阻感測外部光線亮度

1. 材料:光敏電阻(light dependent resistor), 10K電阻, LED



2. 光敏電阻在沒有照光時,其電阻值約數百K歐姆,但是照光後電阻值會減少,最小可達幾百歐姆。因此,可以使用光敏電阻設計測試光強度的電路如下:


3. Arduino上接妥電路:



範例:小夜燈程式。
功能說明:光線暗,則LED點亮;光線亮,則LED熄滅。
int value;

void setup()
{
  pinMode(13, OUTPUT);  //設定 Pin 13 LED 輸出
}

void loop()
{
  value=analogRead(A0);
  if  (value > 400)
  {
    digitalWrite(13, HIGH);  //LED燈開啟
  }
  else
  {
    digitalWrite(13, LOW);  //LED燈關閉
  }
}





範例:利用光線強度控制LED亮滅速度。
功能說明:外部光線控制亮滅時間, 光度越強, 閃爍越快
int value;

void setup()
{
  pinMode(13, OUTPUT);  //設定 Pin 13 LED 輸出
}

void loop()
{
  value=analogRead(A0);
  digitalWrite(13, HIGH);  //用量測值控制亮滅時間, 光度越強, 閃爍越快
  delay(value);
  digitalWrite(13, LOW);
  delay(value);
}

影片:



範例:光線的亮度資料顯示在Arduino 軟體的監控視窗中:
int value;

void setup()
{
  pinMode(13, OUTPUT);  //設定 Pin 13 LED 輸出
  Serial.begin(9600);
}

void loop()
{
  value=analogRead(A0);  //光線強,阻值低,輸入電壓小
  Serial.print("light  intensity is: ");
  Serial.println(1023-value);
 
  digitalWrite(13, HIGH);  //用量測值控制亮滅時間, 光度越強, 閃爍越快
  delay(value);
  digitalWrite(13, LOW);
  delay(value);
}



經由序列監控視窗顯示Arduino的資料

我們也可以使用Arduino序列埠來跟電腦交換資訊,通常我們會設定9600 bpsArduino與電腦交換資訊的速率(鮑率)函數如下:

Serial.begin(9600)


Arduino經序列埠傳送資料的輸出函數有Serial.printSerial.printIn兩個函數,利用這些函數可將資料顯示在Arduino 軟體的監控視窗中;這兩個函數的差別在於Serial.printInSerial.print多了換行的功能,意思如同你在鍵盤上打了一些資料後按下Enter

int r=0;
void setup()
{
  Serial.begin(9600);  //指定Arduino 從電腦交換資訊的速率
}

void loop()
{
  Serial.print("Random number between 0 and 1023 is: ");
  r = random(0, 1023);  //產生01023之間的亂數
  Serial.println(r);
 
  Serial.print("Random number between 1 and 255 is: ");
  r = random(1, 255);  //產生1255之間的亂數
  Serial.println(r);
 
  delay(1000);
}


1. 打開Arduino 軟體,載入程式碼後,執行程式上傳,並打開監控螢幕(Serial Monitor)(選擇 [工具]/ [序列埠監控視窗] 便可開啟監控視窗。)

2. 監控視窗顯示的結果:

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 ; 
}
}





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

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