2016年5月30日 星期一

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



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

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

硬體除了接上5V及GND,另2腳的SDA及SCL直接在Arduin上左的腳位,
SDA和SCL,如圖 ↓,由於類比腳A4和A5也相通於該2腳位,因此也可接於A4和A5,, 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,調整為0x27或0x20或0x38外接板指定的通信位址,再重新上傳,若無誤,打開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 );
}


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