2016年12月16日 星期五

Arduino學習.可變電阻控制伺服馬達機器爪



Arduino學習.可變電阻控制伺服馬達機器爪

伺服馬達,各有不同的扭力及速度,有180度角PWM訊號控制,
也有360度及數位控制型,此篇為180度角PWM訊號控制的馬達,
馬達耗電可能超過Arduino板範圍,因此建議另外接電源,
由USB提供電力給Arduino,只支援500mA,扣除本身需求,只能輸出約300mA,
由5.5mm接口供應DC9V電力,扣除基本需求,約輸出700mA,超過需求則需另接電源,
以免過載燒板,或馬達運作不正常等抖動等情形,
記得要將控制線接在有~記號的PWM腳位,

硬體準備
Arduino UNO R3
可調電阻,10K或5K或1k皆可
伺服馬達
DC9V1A電源器
接線數條
安裝時要注意接線以免燒毀電機,此例款接線為橙訊號/紅正電/棕負電

程式變數由A0接腳的電位器輸入訊號值0~1023,再轉換成要控制電機的角度,
因機器爪單邊的開合角約90度左右,因此轉換成0~100度,
若要安裝機器爪要注意調整好位置再鎖螺絲

#include <Servo.h>

int _ABVAR_1_A0 = 0 ;
Servo servo_pin_9;

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

void loop()
{
_ABVAR_1_A0 = map ( analogRead(0) , 0 , 1023 , 0 , 100 )  ;
servo_pin_9.write( _ABVAR_1_A0 );
delay( 50 );
}

若要安裝多軸的機器人手或腳,就增加電機就可增加轉動的關節了,
完成影片參考↓

 

2016年12月2日 星期五

Arduino UNO學習610.照度計模塊GY-30

Arduino UNO學習610.照度計模塊GY-30

”光”的感應元件多是用光敏電阻,但光敏電阻的感應範圍較窄,
當要接收強光時,就需要BH1750這類的晶片,最亮可接收到60000以上的Lx,
Lux勒克斯Lx是一種光的亮度單位,請自上網搜知,此處不作解釋,
此模塊GY30便搭載了BH1750晶片,並使用3-5V電力
 
準備以下硬體並安裝
Arduino UNO R3
照度計模塊GY-30
接線

VCC=電源正輸入
SCL=IIC時脈
SDA=IIC數據
ADD=驅動位址,可不接或接地
GND=低平電源共端


需先安裝資料庫到libraries中,參考下載點
下載目錄安裝到C:\Program Files\arduino\libraries
再開啟arduino程式,於範例中會多個BH1750,選擇BH1750test上傳,
 
  以下測試環境為Win7+Arduino1.6.7版本+硬體Arduino Uno R3
#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;

void setup(){
  Serial.begin(9600);
  lightMeter.begin();
  Serial.println("Running...");
}

void loop() {
  uint16_t lux = lightMeter.readLightLevel();
  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(1000);
}

完成上傳後打開監控視窗,開始回傳顯示亮度數據

大神網址參考
www.homautomation.org/2014/06/15/measure-light-with-arduino-and-bh1750-module


WinXP測試時有編譯錯誤的情況,換了主機及Arduino IDE軟體版本有些可以,
原因是XP部分程式與Arduino版本的相容問題,目前還找不到簡單的處理方式,
 建議使用Win7上傳,
 



2016年7月26日 星期二

Arduino UNO學習522.紅外線搖控器控制元件



Arduino UNO學習522.紅外線搖控器控制元件

此篇要用搖控器來控制LED燈及蜂鳴器,
目前ArduBlock與該外部函式庫IRremote無法完全搭配,
因此由ArduBlock編寫部分程式,再手寫修改加入內建範例程式中,
確認已學習安裝IRremote函式庫,並已學會取得搖控器的編碼,
請參考學習520.紅外線搖控器,並將IRrecvDemo的程式碼取出待用,
下圖安裝了2種元件,自行預設搖控器找2個按鍵的編碼作對應,
分別左為紅外線接收器,蜂鳴器,LED燈另外加上野生遙控器一支



完成硬體後,第一步打開內建範例IRremote\IRrecvDemo,上傳後打開監控視窗,
隨便找遙控按鍵取得編碼,取紙張記錄下按鍵的編碼,並將範例檔案取出備用,
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

第二步,打開ArduBlock編寫部分程式如下,將取得的遙控編碼加上0x00,
FF30CF改為0x00FF30CF,並設定當遙控器碼FF30CF按下時則Pin2燈高3秒,
當遙控器碼FF18E7時Pin4蜂鳴器叫1秒,依圖找出ArduBlock的拼圖塊吧


上傳後先取得由ArduBlock作成的程式碼到筆記本或其他編輯軟體上,
unsigned long _ABVAR_1_IR = 0UL ;
void setup()
{
  pinMode( 2 , OUTPUT);
  pinMode( 4 , OUTPUT);
}

void loop()
{
  if (( ( _ABVAR_1_IR ) == (0x00FF30CFUL ) ))
  {
    digitalWrite(2 , HIGH);
    delay( 3000 );
    digitalWrite(2 , LOW);
  }
  if (( ( _ABVAR_1_IR ) == (0x00FF18E7UL ) ))
  {
    digitalWrite(4 , HIGH);
    delay( 1000 );
    digitalWrite(4 , LOW);
  }
}

第三步要將內建的程式碼和ArduBlock編寫的程式碼二合一修改,
依內建的程式碼為主,加上setup宣告pin2和pin4,並將變數名稱_ABVAR_1_IR
修改為results.value,及ArduBlock的loop部分加入到程式中,變成如下
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode( 2 , OUTPUT); //設定
  pinMode( 4 , OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
//加入遙控編碼動作
    if (( (results.value) == ( 0x00FF30CFUL ) ))
  {
    digitalWrite(2 , HIGH);
    delay( 3000 );
    digitalWrite(2 , LOW);
  }
    if (( (results.value) == ( 0x00FF18E7UL ) ))
  {
    digitalWrite(4 , HIGH);
    delay( 1000 );
    digitalWrite(4 , LOW);
  }
    irrecv.resume(); //準備下一訊號
  }
}

上傳後打開監控視窗,按下預設的遙控器鈕,是否可正常操作,
遙控器太遠時會接收到錯誤的編碼,試試家中其他的遙控器吧,
可近一步透過繼電器來控制其他家電啟動,或製作壓按式的自動門試試,




2016年5月30日 星期一

Arduino UNO學習262.螢幕轉接板IIC/I2C



Arduino UNO學習262.螢幕轉接板IIC/I2C

在學習260261使用了1602螢幕,會發現佔用了太多的Arduino接口,
而且接線易接觸不良,文字亮度不易控制等等問題,
所以有業者開發了IIC(I2C)螢幕轉接板,來串接多達16Pin的螢幕,
有內建的電位器來調整亮度,另有跳腳可開關背光,
最重要的是接上Arduino16針腳縮減為4,

硬體除了接上5VGND,2腳的SDASCL直接在Arduin上左的腳位,
SDASCL,如圖 ,由於類比腳A4A5也相通於該2腳位,因此也可接於A4A5,, SDA=A4,,SCL=A5
 

軟體需先安裝I2C資料庫,以下連結擇一下載解壓後安裝到Arduino\libraries
https://drive.google.com/open?id=0B_hzaKBiDSLgQ1I4NURadUV2WTA
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

完成軟硬體安裝後執行Arduino程式,在範例裡會多出NewliquidCrystal,
在此學習不使用該範例,

回到編寫視窗上將程式貼上後上傳

#include <Wire.h>
#include <LiquidCrystal_I2C.h> //務必先安裝資料庫

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //設定位址

void setup() {
  Serial.begin(9600); //監控視窗通訊速率
  lcd.begin(16, 2); //初始化16字元2

  for(int i = 0; i < 3; i++) {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); //閃爍三次後點亮背光

  lcd.setCursor(0, 0); //第一行顯示
  lcd.print("Hello, world!");
  lcd.setCursor(0, 1); //第二行顯示
  lcd.print("www.ee543.com");
}

//開啟監控視窗輸入文字顯示在外接螢幕上
void loop() {
  if (Serial.available()) {
    delay(100);
    lcd.clear();
    while (Serial.available() > 0) {
      lcd.write(Serial.read());
    }
  }
}



若一切正常螢幕會先閃爍三下,然後顯示文字如上圖,若只看到黑塊,則取十字起子,調整背面的電位器,若還是沒有,請查看手上的外接板的通信位址,修改第三行的0x3F,調整為0x270x200x38外接板指定的通信位址,再重新上傳,若無誤,打開Arduino的監控視窗,輸入文字試試,目前的軟硬體都不支援中文字碼,相關大神網址參考,
http://arduino-info.wikispaces.com/LCD-Blue-I2C



2016年5月25日 星期三

Arduino學習250.超音波倒車雷達電子尺



Arduino學習250.超音波倒車雷達

此篇運用超音波模組HC-SR04,來量測距離監控顯示,並由蜂鳴器警示,
準備硬體
超音波模組HC-SR04
有源蜂鳴器5V
利用音波每秒346公尺,由發射端Trig發出人耳聽不到的波頻,
碰到物品回聲由Echo接收端接收波頻,再將來回時間透過計算距離,
 


由模塊接腳分別接上線,及加上蜂鳴器,
HC-SR04腳位
Arduino對應
Vcc
+5V
Trig
D2
Echo
D3
GND
GND



超音波模組在ArduBlock有內建模組,依版本不同積木顏色及位置會不同,
將測得的距離數距設定為變數SR,將其顯示在監控視窗,單位為公分,
並套用在蜂鳴器的間斷時間,使距離長斷音長,距離短斷音時間就短,
上傳後記得打開監控視窗



unsigned long _ABVAR_1_SR = 0UL ;
int ardublockUltrasonicSensorCodeAutoGeneratedReturnCM(int trigPin, int echoPin)
{
  long duration;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  duration = duration / 59;
  if ((duration < 2) || (duration > 300)) return false;
  return duration;
}


void setup()
{
  digitalWrite( 2 , LOW );

  Serial.begin(9600);
  pinMode( 7 , OUTPUT);
}

void loop()
{
  _ABVAR_1_SR =      ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 2 , 3 ) ;
  Serial.print(_ABVAR_1_SR);
  Serial.print(" ");
  Serial.println();
  delay( 100 );
  digitalWrite(7 , LOW);
  delay( _ABVAR_1_SR );
  digitalWrite(7 , HIGH);
}


打開監控視窗,可將收到的訊號透過內建程式直接顯示測到的距離CM公分,
超音波模組除了用在倒車雷達警示外,也可用在智慧車,電子尺等等運
 

2016年4月26日 星期二

Arduino UNO學習452.電機擴充板L293D



Arduino UNO學習452.電機擴充板L293D

硬體準備
UNO
電機擴充板L293D
DC直流馬達
5線或4線步進馬達
伺服舵機馬達
電源器7V~12V1A (電池電力可能不足)

Arduino輸出約只300mA左右,接電機超過需求則需另接外接電源,
此板搭配L293D及74HC595N晶片,腳位可直接插上UNO板,
無法單獨使用,像積木一樣和UNO堆疊插上,程式在UNO,電機在擴充板上,
可控制4個直流馬達或2個5線步進馬達,同時控制2個伺服舵機,
並可透過PWM控制直流馬達轉速,馬達電力超過0.5A,務必搭配外部電源使用↓

使用前需先下載安裝外部程式庫,以下擇一載點,
https://github.com/adafruit/Adafruit-Motor-Shield-library
https://github.com/adafruit/AccelStepper
解壓後將整個目錄放在Arduino目錄libraries之中,原始參考,
https://learn.adafruit.com/adafruit-motor-shield/library-install
預設位置為C:\Program Files\Arduino\libraries\AF_Motor

安裝後再開啟執行Arduino軟體,在範例中會多一個AFMotor,但在此不使用範例,
先將空迴圈上傳至UNO板上,以確認COM連線是正常的,

確認軟體後將UNO板移除連線,來安裝硬體電機擴充板到UNO板合體,
就像積木一樣往上堆疊,確認各接腳連接後安裝一個DC馬達到M3,
接座有5個口,中央為共GND,由於要控制馬達正反轉,故不安接GND,
共有M1/M2/M3/M4等的4組DC馬達接口,完成後與電腦連線,並接上外部電源
上傳以下程式後可開啟監控視窗,說明接腳座M3,頻率可設定為64K,8K,2K,1K,
PWM視馬達而定,約150~255控制轉速,讓馬達正轉2秒停2秒,再反轉2秒停2秒,
同時發送訊息到監控視窗↓

#include <AFMotor.h>
AF_DCMotor motor(3, MOTOR12_8KHZ); //接腳座及頻率

void setup() {
  Serial.begin(9600);
  Serial.println("Motor test!");
  motor.setSpeed(200);     //可調轉速約150~到255
}

void loop() {
  Serial.print("tick---");
  motor.run(FORWARD);      //正轉
  delay(2000);

  Serial.println("stop");
  motor.run(RELEASE);      //停止
  delay(2000);

  Serial.print("tock---");
  motor.run(BACKWARD);     //反轉
  delay(2000);

  Serial.println("stop");
  motor.run(RELEASE);      //停止
  delay(2000);
}

可試著調整到各M1~M4接口及轉速,或連結減速馬達裝上輪子,製成小車,
原文參考https://learn.adafruit.com/adafruit-motor-shield/using-dc-motors


輸出口M1~M4同時也是步進馬達的接口,5Pin*2組如圖,↓

建議先移除電腦連線,再接馬達後,以下為28BYJ-48步進馬達規格,步腳5.625度角,齒輪減速比63.68395:1,計算一圈360度/5.625=64,再64*64齒比=4096步,
注意原本馬達的排線位置為配合程式庫,故有做跳線注意安裝順序,
紅色接+5V,原橘粉為一組,黃藍為一組,擴充板上的GND為空↓
在上傳程式時建議先將空迴圈上傳至UNO板上,並確認AFMotor.h外掛已安裝,
下例為4096步轉一圈後再反轉,上傳程式後可開啟監控視窗,以了解轉動情形↓

#include <AFMotor.h>
AF_Stepper motor(48, 2);  //48步馬達接第2組接口

void setup() {
  Serial.begin(9600);
  Serial.println("Stepper test!");
  motor.setSpeed(300);  //轉速
}

void loop() {
  Serial.println("Interleave FORWARD");
  motor.step(4096, FORWARD, INTERLEAVE);  //正轉4096為360度一圈
  delay(500);

  Serial.println("Interleave BACKWARD");
  motor.step(4096, BACKWARD, INTERLEAVE);  //反轉4096為360度一圈
  delay(500);
}

試著安裝到Stepper1接口,並控制旋轉角度,注意轉速不要太快以至馬達無轉動,
原文參考https://learn.adafruit.com/adafruit-motor-shield/using-stepper-motors


輸出口SERVO_1/SERVO_2,為伺服馬達3線接口,如圖,↓
此接口較簡單,正負連結電力,SER1_S腳位與Arduino的~D10短路相通,
SER2_S腳位與Arduino的~D9短路相通,此2腳位有~PWM記號,
使用上和接在UNO板上的方式是一樣的,在ArduBlock也有對應的積木塊,
伺服馬達大多不轉360度,就讓馬達由0轉到180度,再轉回到0度位置,
可自行調整角度以了解伺服馬達的控制方式↓
#include <Servo.h>

Servo servo_pin_10;

void setup()
{
  servo_pin_10.attach(10);
}

void loop()
{
  servo_pin_10.write( 0 );
  delay( 1000 );
  servo_pin_10.write( 180 );
  delay( 1000 );
}