公告版位
需要找什麼嗎? 左邊分類或許可以幫助你...

目前分類:[單晶片] Arduino (19)

瀏覽方式: 標題列表 簡短摘要
void setup(){  
    pinMode(9, OUTPUT);
    pinMode(8, OUTPUT);
    Serial.begin(9600);
    Serial.println("Please Keyin y/n To Control LED...");
}

void loop(){  
  if(Serial.available()){
    if(Serial.read()=='y'){
      analogWrite(8, 255);
      analogWrite(9, 0);
      Serial.println("LED is ON.");
    }else{
      analogWrite(8, 0);
      analogWrite(9, 255);      
      Serial.println("LED is OFF.");
    }
  }  
}
 




黃彥霖 發表在 痞客邦 留言(1) 人氣()

本篇文章重點就是用 Arduino 實作類比輸出,可以使 LED 漸漸亮~漸漸暗~。

主要程式碼只有一行 analogWrite(9, i); ,這行程是碼的 9 代表 輸出 腳, i 代表 亮度,0 最暗,255 最亮。

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

void loop(){
    
    for(int i = 0; i < 255; i++){
      analogWrite(9, i);
      delay(3);
    }
    
    delay(50);
    
    for(int i = 255; i > 0; i--){
      analogWrite(9, i);
      delay(3);
    }
    
    delay(50);
}
 




黃彥霖 發表在 痞客邦 留言(0) 人氣()

請先下載 Timer 庫。並解壓縮到 Arduino 專案路徑下 (存檔路徑)

https://github.com/JChristensen/Timer#installation


傳統我們要控制 LED 閃爍頻率則是修改 delay() 延遲時間,但是如果之後要讓 10 個 LED 以不同頻率閃爍則非常困難。如果之後只是要修改其中一個LED頻率,那麼其他9個LED也要修改,而且還要大量計算好時間,這是非常不容易維護的。如下是使用傳統作法:

int pin = 13;

void setup()
{
    pinMode(13, OUTPUT);
    digitalWrite(pin, HIGH);
    delay(10 * 60 * 1000);
    digitalWrite(pin, LOW);
}

void loop()
{
}

下面程式碼是使用 Timer 庫,而達到與上面程式碼相同的結果,但更好維護。下方程式碼是Arduino啟動後 10分鐘後,切換 pin 13 狀態 ( 只做一次 )

#include "Timer.h"

Timer t;
int pin = 13;

void setup()
{
    pinMode(pin, OUTPUT);
    t.pulse(pin, 10 * 60 * 1000, HIGH); // 10 minutes  
}

void loop()
{
    t.update();
}

下面程式碼是每 100毫秒 切換 Pin 13 狀態 (無限循環)。並每 1 秒呼叫 takeReading() 函式(方法) ,將讀取 類比 Pin 0 信號並方送至PC端。

黃彥霖 發表在 痞客邦 留言(7) 人氣()

請勿使用 Aduino 內建的 COM 輸入,內建有些BUG可能無法正確輸出。這裡我是用 Access Port 軟體,也是將資料從COM輸出至Arduino軟體。

下載:http://www.sudt.com/en/ap/download.htm

打開  Access Port 從左上角的齒輪圖案設定 COM 與 包率 (9600、115200...等等)。

OK後按下電源圖案即可與 Arduino通信

在下方的框框輸入 ABC 並按下 Enter 後,點選 [發送資料按鈕] 即可看見 第12腳 LED 發光發亮。

黃彥霖 發表在 痞客邦 留言(1) 人氣()

ADXL345 是一種常見、便宜、簡單、好用的 3 軸加速度計。我這片 ADXL345 模組是我在露天拍賣買的,約台幣 110 元...,比起之前買的 LSM303DLH 就要台幣 6、7 百元要來的便宜多了...Orz

另外記得 信號線 都要接 10K 上拉電阻,不然會讀不到...( 只要是走 i2c 協定的都要接上拉電阻

實際接線圖 (右邊小塊板子就是 ADXL345 )

3

特寫 ADXL345 模組:

黃彥霖 發表在 痞客邦 留言(46) 人氣()

還有一篇基本篇可參考:http://lolikitty.pixnet.net/blog/post/163032620

 

#include <Wire.h>

// LSM303DLHC 的 i2c 地址。由於 Arduino i2c 資料空間是 7 bit 所以要右移一個位元
int i2cAddress = 0x32 >> 1; 

void setup() {
    Serial.begin(9600);
    Serial.println("-------------------");
    Wire.begin(); // 啟用 i2c
    
    writeReg(0x20,0b00100111); // 打開三軸加速計的電源 ,設定每秒讀取10次,啟用XYZ軸
}

void loop() {
  Wire.beginTransmission(i2cAddress);
  Wire.write(0x28 | (1 << 7));
  Wire.endTransmission();
  Wire.requestFrom(i2cAddress, 6);
  
 

  byte xla = Wire.read();
  byte xha = Wire.read();
  byte yla = Wire.read();
  byte yha = Wire.read();
  byte zla = Wire.read();
  byte zha = Wire.read();
  
  int x = (xha << 8 | xla) >> 4;
  int y = (yha << 8 | yla) >> 4;
  int z = (zha << 8 | zla) >> 4;
    
  Serial.print("X : ");
  Serial.print(x);
  Serial.print("       Y : ");
  Serial.print(y);
  Serial.print("       Z : ");
  Serial.println(z);
    
    delay(500);
}

/************************************************************* 
* 寫入佔存器:writeReg(int reg, int value)
* reg:佔存器地址
* value:要寫入的值
*/
void writeReg(int reg, int value){
    Wire.beginTransmission(i2cAddress);   
    Wire.write(reg);
    Wire.write(value);
    Wire.endTransmission();
}

/************************************************************* 
* 讀取佔存器:readReg(int reg)
* reg:要讀取的佔存器地址
*/
int readReg(int reg){
    Wire.beginTransmission(i2cAddress);   
    Wire.write(reg);
    Wire.endTransmission();
    
    Wire.requestFrom(i2cAddress, 1);
    int value = Wire.read();
    Wire.endTransmission();
    
    return value;
}


執行結果:

11111111111  

 

 

 


黃彥霖 發表在 痞客邦 留言(1) 人氣()

還有一篇進階篇可參考:http://lolikitty.pixnet.net/blog/post/163257851

 

#include <Wire.h>

// LSM303DLHC 的 i2c 地址。由於 Arduino i2c 資料空間是 7 bit 所以要右移一個位元
int i2cAddress = 0x32 >> 1; 

void setup() {
    Serial.begin(9600);
    Serial.println("-------------------");
    Wire.begin(); // 啟用 i2c
    
    writeReg(0x20,0b00100111); // 打開三軸加速計的電源 ,設定每秒讀取10次,啟用XYZ軸
}

void loop() {
    Serial.print("X : ");
    Serial.print(readReg(0x29));
    Serial.print("    Y : ");
    Serial.print(readReg(0x2B));
    Serial.print("    Z : ");
    Serial.println(readReg(0x2D));
    delay(500);
}

/************************************************************* 
* 寫入佔存器:writeReg(int reg, int value)
* reg:佔存器地址
* value:要寫入的值
*/
void writeReg(int reg, int value){
    Wire.beginTransmission(i2cAddress);   
    Wire.write(reg);
    Wire.write(value);
    Wire.endTransmission();
}

/************************************************************* 
* 讀取佔存器:readReg(int reg)
* reg:要讀取的佔存器地址
*/
int readReg(int reg){
    Wire.beginTransmission(i2cAddress);   
    Wire.write(reg);
    Wire.endTransmission();
    
    Wire.requestFrom(i2cAddress, 1);
    int value = Wire.read();
    Wire.endTransmission();
    
    return value;
}


輸出結果:

I2C1  

 

 資料手冊說明:(查看完整請資料手冊請點我)


 針對上面 writeReg(0x20,0b00100111); 程式碼的說明

黃彥霖 發表在 痞客邦 留言(2) 人氣()

// 資料手冊 i2c 的 TC74 A0 地址是寫 1001000
 
#include <Wire.h>

int i2cAddress = 72; // TC74 A0 的 i2c 地址 ( 2 進制 1001000  轉成 10 進制後為 72 )

void setup() {
    Serial.begin(9600);
    Serial.println("-------------------");
     Wire.begin(); // 一定要寫
}

void loop() { 
    
    Wire.beginTransmission(i2cAddress);
    Wire.write(0);
    Wire.endTransmission();

    Wire.requestFrom(i2cAddress, 1); // 一定要寫
    
    while(Wire.available() == 0); // 等待回應
        
    Serial.println(Wire.read()); // 讀取溫度並傳送至電腦顯示
    
    delay(500); // 延遲0.5秒
}





黃彥霖 發表在 痞客邦 留言(0) 人氣()

本次使用 CSR BC-4 藍牙模組 ,是一款常見的藍芽模組,個人覺得便宜好用...


21301307863059_305

程式碼: 

void setup(){
  Serial.begin(9600);
  Serial3.begin(9600);
  Serial.println("Start...");
}

void loop(){
  Serial3.println("AT");    // AT 指令
  
  if(Serial3.available()){    // 如果 Serial3 有資料,則進入 if
    Serial.println(readLine3()); // 輸出結果到電腦
  }

  delay(1000);    // 延遲一秒
}

String readLine3(){  // 讀取一整行
      String s =  "";
      char c;
      while((c = Serial3.read()) !='\n'){
          s += c;
      }  
      return s;
}
 


輸出結果:

黃彥霖 發表在 痞客邦 留言(2) 人氣()

Arduino 官方的 Serial.read() 一次只能讀取一個字元 ( char ) ,但是在很多應用上都是使用字串 ( String ) 操控比較多,另外一整行寫入官方已經有實作 Serial.println() 了,所以這裡不再講解。今天來介紹如何使 Arduino UART 讀取 一整行字串的程式碼,如下:

 

String readLine3(){
      String s =  "";
      char c;
      while((c = Serial3.read()) !='\n'){
          s += c;
      }  
      return s;
}
 

要用的時候只要 String msg = readLine3() ; 就可以讀取一整行字串囉!!






黃彥霖 發表在 痞客邦 留言(2) 人氣()

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

    Serial.println("Start...");
}

void loop(){
    Serial3.write("AT\r\n");    // 下 AT 指令 給 藍芽模組
    if (Serial3.available() >0) {      // 藍芽模組 回傳 的 訊息 給電腦
      String s =  "";
      char c;
      while((c = Serial3.read()) !='\n'){
          s += c;
      }      
        Serial.println(s); 
    }
    delay(500);
}
 

輸出結果:

aaa  

 

 

 


黃彥霖 發表在 痞客邦 留言(1) 人氣()

簡單版:

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

void loop(){

    String s = "";
    if (Serial.available() >0) {

        s = Serial.read();
        Serial.write(s); 

黃彥霖 發表在 痞客邦 留言(1) 人氣()

接線方法:
    1. Arduino 的 SDA 接到 RTC 時鐘模組的 SDA
    2. Arduino 的 SCL 接到 RTC 時鐘模組的 SCL
    3. RTC時鐘模組 接上 3.3V 與 接地 0V

    到這裡基本上就完成了,因為我的模組預設 SCL 與 SDA 都也接上 10K 上拉電阻,所以不用再接電阻只要4條線就可以動了。如果大家發現板子不會動,記得把SCL 與 SDA 兩條線分別接上 10K 上拉電阻 至 3.3V,如圖:

image00

Arduino UNO 接線:

黃彥霖 發表在 痞客邦 留言(9) 人氣()

// 本範例控制了 3 顆六線步進馬達

int i = 2; // 速度 2 ms 切換

// 馬達 A 腳位
int
a1 = 22;
int a2 = 23;
int a3 = 24;
int a4 = 25;

// 馬達 B 腳位
int
b1 = 2;

黃彥霖 發表在 痞客邦 留言(2) 人氣()

★ 設定 4、5、6、7 這 4隻腳為輸出,並可以控制步進馬達。

void setup(){

    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
}

void loop(){

    int i = 50;

黃彥霖 發表在 痞客邦 留言(1) 人氣()

★ 本範例使用 Arduino Mega 開發板。設定 RS232 速度為 9600 ,並且持續循環輸出 Hello

#include <Lib.h>

void setup(){
    Serial.begin(9600); // 使用預設 USB ,設定包率為 9600
    Serial1.begin(9600); // 使用 18 , 19 腳 ,設定包率為 9600
    Serial2.begin(9600); // 使用 16 , 17 腳 ,設定包率為 9600
    Serial3.begin(9600); // 使用 14 , 15 腳 ,設定包率為 9600
}

void loop(){
    Serial.println("Hello...0");

黃彥霖 發表在 痞客邦 留言(1) 人氣()

★ 本範例為第 9 隻腳 輸出

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

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

黃彥霖 發表在 痞客邦 留言(1) 人氣()

 

 


黃彥霖 發表在 痞客邦 留言(0) 人氣()

 讀取類比訊號  int i = analogRead(0); 目前是讀接口 0 類比訊號 

說明 語法 註解
 RS232/COM 設定包率   Serial.begin(9600);   9600 可依需求做改變 
 RS232/COM 輸出  Serial.print("Hello : ");  
 RS232/COM 換行輸出  Serial.println("A");   
 RS232/COM 輸入  char c = Serial.read();  
 RS232/COM
判斷使否有資料輸入
 if( Serial.available() > 0 ) { }  
 延遲 (毫秒)  delay(1);
 delay(1000);
 延遲 1 毫秒
 延遲 1 秒
 延遲 (微渺)  delayMicroseconds(1);
 delayMicroseconds(1000000);
 延遲 1 微秒
 延遲 1 秒
 設定 Pin 為輸出   pinMode(5, OUTPUT);  設定第 5 隻腳為輸出
 輸出 Pin 高電位  digitalWrite(5,HIGH);  設定第 5 隻腳為高電位
 輸出 Pin 低電位  digitalWrite(5,LOW);  設定第 5 隻腳為低電位
 設定 Pin 為輸入  pinMode(7, INPUT);  
 讀取 Pin 電位  boolean b =  digitalRead(7);  讀取第 7 隻腳(TRUE/FALSE)
 輸出類比  analogWrite(5,255);  第 5 隻腳輸出,0-255 為一脈衝的時間(頻率不變) 
 讀取類比  analogRead(0);  讀取第 0 隻腳的類比訊號
     
     
     
     
     

黃彥霖 發表在 痞客邦 留言(8) 人氣()