磁鐵遙控車 組員: 盧永堃 S0453005 李柏宏 S0453010 王皓正 S0453014 李文 S0453021
旋轉IC上的磁鐵,IC受不同的磁場產生不同的電壓 Arduino再控制L293D去改變車子旋轉的方向 流程圖 旋轉IC上的磁鐵,IC受不同的磁場產生不同的電壓 電壓送回Arduino去計算角度 角度透過藍芽從電腦傳至車上的藍芽 車上藍芽再傳給車上的Arduino Arduino再控制L293D去改變車子旋轉的方向
示意圖(part1) 旋轉IC上的磁鐵 丟給Arduino計算 角度算出透過 藍芽傳至車上
示意圖(part2) 電腦的藍芽傳值到車上 車上Arduino再控制車子的轉動
IC介紹
IC介紹:TLE5009(part1) TLE5009這顆IC主要的功能是隨著周圍磁場的變化去改變電壓,達到偵測磁場變化的效果。
IC介紹:TLE5009(part2)
IC介紹:L293D(part1) 一般控制DC 馬達驅動時,如果只是單一方向轉動,只要控制其電壓正負極的接腳,就可以控制轉向。如果要有正反轉能力的話,就必須在電路運作中將馬達電壓反向,一般常用的是L293D 這顆 IC。
IC介紹:L293D(part2)
程式碼
程式碼(計算角度) #include <SoftwareSerial.h> #include <Wire.h> SoftwareSerial I2CBT(2, 3); int c = 0; byte serialA; void setup() { // put your setup code here, to run once: Serial.begin(9600); I2CBT.begin(9600); } void loop() { // put your main code here, to run repeatedly: int vx = analogRead(A0); int vy = analogRead(A1); int y = c; vx = vx - 515; vy = vy - 510; float a = vy * (5.0 / 1023.0); float b = vx * (5.0 / 1023.0); float d = a / b; c = atan(d) * 180 / 3.14; float p=c; float w = p / 90 * 2000; if (vx<0 & vy>0)c = -c; if (vx > 0 & vy > 0)c = -c + 180; if (vx > 0 & vy < 0)c = -c + 180; if (vx < 0 & vy < 0)c = -c + 360; int Data[4]; char str[256]; Data[0] = 'a'; Data[1] = c / 256; Data[2] = c % 256; Data[3] = (Data[1] + Data[2]) % 7; for (int j = 0; j < 4; j++) I2CBT.write(Data[j]); serialA = 0; Serial.println(c); delay(1000);}
程式碼(控制車子1) #include <SoftwareSerial.h> #include <Wire.h> SoftwareSerial I2CBT(2, 3); float c = 0; byte serialA; void setup() { // put your setup code here, // to run once: Serial.begin(9600); // I2CBT.begin(9600); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); } void loop(){ //put your main code here, //to run repeatedly: //byte d1, d2, d3; if (I2CBT.available() > 0) { if (I2CBT.read() == 'a') { int y = c; delay(100); d1 = I2CBT.read(); d2 = I2CBT.read();
程式碼(控制車子2) d3 = (d1 + d2) % 7; if (I2CBT.read() == d3) { if (d2 < 0) d2 += 256; c = d1 * 256 + d2; float w = 0; int x = c; float z = x - y; w = z / 90 * 2000; Serial.println(w); if (z == 1 || z == -1)z = 0; if (z <= 20 && z >= -20)z = 0; if (z < 0) { analogWrite(5, 0); digitalWrite(10, HIGH); digitalWrite(11, LOW); analogWrite(6, 255); digitalWrite(13, HIGH); digitalWrite(12, LOW); z = -z; w = z / 270 * 2000*4/3; delay(w); } else if (z > 0) { analogWrite(5, 0); digitalWrite(11, HIGH) ; digitalWrite(10, LOW); analogWrite(6, 255); digitalWrite(12, HIGH); digitalWrite(13, LOW); w = z / 270 * 2000*4/3; delay(w); } else { analogWrite(5, 0); digitalWrite(11, LOW); analogWrite(6, 0); digitalWrite(12, LOW); delay(1000); } } } if (I2CBT.available() > 0) { for (int i = 0; i < I2CBT.available(); i++) I2CBT.read(); } } }
仍可改進的部分 1.馬達的部分使用直流馬達,因此於精確度上會顯得較為不夠 ---改用步進馬達 2.由於需要以行動電源提供arduino電源使得車子整體的負重不 均,後車身過重使得摩擦力也是會影響精確度 ---增加/減少負重且平衡車身
組員分工 李文:接藍芽、程式設計、攝影 李柏宏:接電路、治具製作、word檔 盧永堃:接電路、計算IC數據、PPT製作 王皓正:電路設計、程式設計、報告
謝謝觀賞