顯示具有 MTADRL293D 標籤的文章。 顯示所有文章
顯示具有 MTADRL293D 標籤的文章。 顯示所有文章

2014年3月10日 星期一

Arduino藍芽遙控小車

使用Arduino搭配兩個模組

  1. MTADRL293D 馬達控制板
    1. http://ddddiy.blogspot.tw/2014/02/mtadrl293d.html
  2. HC-05 藍芽模組
    1. http://ddddiy.blogspot.tw/2014/02/hc-05-bt-module.html

做法:
  1. 參考這裡將HC-05 藍芽模組設定好,接上VCC/GND,並將HC-05的TX/RX接到Leonardo的RX/TX
  2. 將MTADRL293D插上Leonardo
  3. 將MTADRL293D的M1/M4(在這張版子上這兩顆馬達吃BATT的電,另外兩顆吃5V)接到車子左右兩顆馬達的正負極
  4. MTADRL293D接上電池

車身/履帶/減速機: 田宮 工作樂系列

範例程式碼:

2014年2月26日 星期三

74HCT595N工作原理

這是一顆計數暫存晶片

可以使用序列的方式傳入Q0~Q7的狀態(high or low)到內部register,然後輸出時chip依照register值去拉Q0~Q7的狀態

可以使用少數腳位一次控制Q0~Q7的狀態,此外由於此chip可以串接,所以可以一次控制更多腳位


下列圖來源: http://arduino.cc/en/uploads/Tutorial/595datasheet.pdf



74HCT595N腳位:

  • VCC:5V
  • GND
  • Ds: serial data in
  • Q0~Q7: 8根輸出pin
  • Q7': storage register對應到Q7的bit,最為多顆chip 串接用
  • MR: (active low) 清空shift register
  • OE: (active low) 
    • OE拉low,STcp raising時,將storage輸出至Q0~Q7 
    • OE拉high,Q0~Q7輸出為高阻抗(相當於沒接上這顆chip)
  • SHcp: raising edge trigger, 觸發shift register shift 1 bit(新的1bit資料由Ds取)
  • STcp: raising edge trigger


從文件可以知道,74HCT595N有兩個register(8bit):
  1. shift register - 序列資料輸入時使用
  2. storage register - 控制Q0~Q7輸出時為high or low

從文件可以知道,SHcp/STcp最高可運作在100Mhz(每個clock 10ns)

  • 由此可得知下面範例SHcp/STcp拉high/low時,每次delay只要5ns,不過由於Arduino delay最小只能用1 micro second,所以設定delayMicroseconds(1)即可


基本原理
  1. 透過序列的方式將資料傳入shift register
  2. 將shift register資料傳入storage register
    1. 每個SHcp raising edge,資料會一直輸入進去chip的shift register
      1. Q0'~Q7'代表shift register的值
      2. Serial date寫入方向:
        1. Ds > Q0' > Q1' > Q2' > Q3' > Q4' > Q5' > Q6' > Q7'
  3. 輸出到Q0~Q7
範例:
  1. 連接
    1. chip 接上VCC/GND
    2. micro controller gpio 接上Ds/MR/OE/SHcp/STcp
  2. 初始化:
    1. Ds/MR/OE/SHcp/STcp全部拉low
      1. 此時由於MR為low,shift register全部清為0
    2. STcp LOW->HIGH->LOW,將shift register的值寫入storage register
      1. 此時由於OE為LOW,storage register的值馬上會輸出至Q0~Q7
  3. 資料寫至shift register
    1. MR 拉HIGH
    2. 將Q7的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    3. 將Q6的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    4. 將Q5的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    5. 將Q4的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    6. 將Q3的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    7. 將Q2的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    8. 將Q1的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    9. 將Q0的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
  4. 將資料從shift register移到storage register
    1. STcp LOW->HIGH->LOW
      1. 此時由於OE為LOW,storage register的值馬上會輸出至Q0~Q7


實做:

  • 使用MTADRL293D 電機驅動模組,其中
    • Ds: Arduino pin 8
    • MR: 固定拉high
    • OE: Arduino pin 7
    • SHcp: Arduino pin 4
    • STcp: Arduino pin 12

Arduino可使用我寫的library操作74HCT595N:



簡單控制74HCT595N的範例程式碼:
const int DS = 8;
const int OE = 7;
const int SHCP = 4;
const int STCP = 12;

void setup(){
  Serial.begin(115200);

  while (!Serial){
    ;
  }

  delay(1000);
  Serial.println("=== setup() ===");

  pinMode(DS, OUTPUT);
  pinMode(OE, OUTPUT);
  pinMode(SHCP, OUTPUT);
  pinMode(STCP, OUTPUT);

  digitalWrite(DS, LOW);
  digitalWrite(OE, HIGH); //Q0~Q7 維持高阻抗
  digitalWrite(SHCP, LOW);
  digitalWrite(STCP, LOW);
}

void loop(){
  Serial.println("=== loop() ===");
  delay(1000);

  //serial data input into serial register
  //Q0~Q7: 00001111
  Serial.println("##serial data input into serial register");
  digitalWrite(DS, HIGH);//Q7
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, HIGH);//Q6
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, HIGH);//Q5
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, HIGH);//Q4
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, LOW);//Q3
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, LOW);//Q2
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, LOW);//Q1
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, LOW);//Q0
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);

  delay(1000);

  //serial register -> storage register
  Serial.println("##serial register -> storage register");
  digitalWrite(STCP, HIGH);
  delay(10);
  digitalWrite(STCP, LOW);
  delay(10);

  delay(1000);

  //storage register -> Q0~Q7
  Serial.println("##storage register -> Q0~Q7");
  digitalWrite(OE, LOW);

  delay(1000);

  Serial.println("##finish");
  while(true){
    ;
  }
}






========================================================


相關連結




待續

2014年2月25日 星期二

MTADRL293D 馬達(電機)驅動模組 - 簡介/控制直流馬達

這個模組買來沒有電路圖,也沒有說明,版子又做成Arduino shield的樣式,完全不知道腳位對應

google只找到一些購物網站,只有普通簡介,完全沒有講細節

後來終於在這個網站上找到電路圖,比對了servo控制的部分相同,應該是同一塊電路板

##注意 M3/M4電路圖與控制板是相反的


上面主要有兩種chip:
  1. 74HCT595N *1
    1. 計數器轉換暫存器
    2. 相關連結
  2. L293D *2
    1. 每棵可控制兩顆直流馬達或是一顆四線式步進馬達
    2. 相關連結

MTADRL293D主要功能:
  1. RESET
    1. 與Arduino 的RESET接在一起
  2. POWER JUMP
    1. 接上代表MTADRL293D的電池同時供電給arduino
      •   電池正極(V+)接到Arduino VIN(Arduino內部可以自己轉成5V VCC)
  3. 兩路servo控制(只是幫忙轉換腳位,實際上還是使用Arduino 輸出的PWM控制)
    • servo 1:直接接到Arduino pin 10
    • servo 2:直接接到Arduino pin 9
    • servo VCC: Arduino 5V <==不是直接接到MTADRL293D的BATT,或是由他降壓
  4. 四路馬達控制:
    1. M1 
      • EN: (PWM2A) 接到Arduino pin 11
      • 電源: V+
    2. M2 
      • EN: (PWM2B) 接到Arduino pin 3
      • 電源: V+
    3. M4
      • EN: (PWM0B) 接到Arduino pin 5
      • 電源: V+
    4. M3
      • EN: (PWM0A) 接到Arduino pin 6
      • 電源: V+
  5. 兩路四線式步進馬達控制
    1. 待續...

可使用我寫的Arduino Library控制此模組:

控制範例:

#include "MTADRL293D.h"

MTADRL293D l293d;

void setup(){

  Serial.begin(115200);
  while (!Serial){
    ;
  }
  
  delay(5000);
  
  Serial.println("=== loop() ===");

  l293d.enableDbg(true);
  l293d.begin();

  l293d.setMotorDir(MTADRL293D_M1, MTADRL293D_DIR_POS);
  l293d.setMotorDir(MTADRL293D_M2, MTADRL293D_DIR_POS);
  l293d.setMotorDir(MTADRL293D_M3, MTADRL293D_DIR_POS);
  l293d.setMotorDir(MTADRL293D_M4, MTADRL293D_DIR_POS);

  l293d.setMinMotorSpeed(MTADRL293D_M1, 100);
  l293d.setMinMotorSpeed(MTADRL293D_M2, 100);
  l293d.setMinMotorSpeed(MTADRL293D_M3, 100);
  l293d.setMinMotorSpeed(MTADRL293D_M4, 100);

  l293d.setMotorSpeed(MTADRL293D_M1, 0);
  l293d.setMotorSpeed(MTADRL293D_M2, 0);
  l293d.setMotorSpeed(MTADRL293D_M3, 0);
  l293d.setMotorSpeed(MTADRL293D_M4, 0);
}


void loop(){
  Serial.println("=== loop() ===");

  Serial.println("=== m1 pos 100");
  l293d.setMotorDir(MTADRL293D_M1, MTADRL293D_DIR_POS);
  l293d.setMotorSpeed(MTADRL293D_M1, 100);
  delay(3000);

  Serial.println("=== m1 0");
  l293d.setMotorSpeed(MTADRL293D_M1, 0);
  delay(1000);

  Serial.println("=== m1 neg 100");
  l293d.setMotorDir(MTADRL293D_M1, MTADRL293D_DIR_NEG);
  l293d.setMotorSpeed(MTADRL293D_M1, 100);
  delay(3000);

  Serial.println("=== m1 0");
  l293d.setMotorSpeed(MTADRL293D_M1, 0);
  delay(1000);

  Serial.println("=== m3 pos 100");
  l293d.setMotorDir(MTADRL293D_M3, MTADRL293D_DIR_POS);
  l293d.setMotorSpeed(MTADRL293D_M3, 100);
  delay(3000);

  Serial.println("=== m3 0");
  l293d.setMotorSpeed(MTADRL293D_M3, 0);
  delay(1000);

  Serial.println("=== m3 neg 100");
  l293d.setMotorDir(MTADRL293D_M3, MTADRL293D_DIR_NEG);
  l293d.setMotorSpeed(MTADRL293D_M3, 100);
  delay(3000);

  Serial.println("=== m3 0");
  l293d.setMotorSpeed(MTADRL293D_M3, 0);
  delay(1000);

}