|
小弟不才 最近專題要繳交了 可是東西還是弄不出來 所以想來麻煩板上大大幫忙 拜託了!!
我是想用腦波來控制直流馬達,而我再網路上有找到人家已經打好的程式,不過他是用"伺服馬達"而我想用"直流馬達"
其實我對腦波也不懂,不過這個腦波器會回傳來的值是從0~100,所以我從這裡去控制
而我比較大的問題就是
當我有訊號傳進來的時候,我的直流馬達他是會動的
而沒有訊號的時候,我想讓馬達停止
可是我只要一把它加上馬達的部份,他就會不停止,還是照轉
這是他的原始程式,他有用到蜂鳴器&LED,不過我都刪掉了 我只要用到馬達的部份
ps1.txt
(3.18 KB, 下載次數: 1249)
這是他的電路圖
再來這個是腦波器要和Arduino所連結的dongle
程式碼:
int dir1PinA = 13;
int dir2PinA = 12;
int speedPinA = 10;
int speed;
const int tinyLedPin = 13;
int tinyLedState = HIGH;
void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(tinyLedPin, OUTPUT);
pinMode(dir1PinA, OUTPUT);
pinMode(dir2PinA, OUTPUT);
pinMode(speedPinA, OUTPUT);
int speed = 0;
Serial.begin(115200); // bit/s //dd
connectHeadset(); //
}
void loop()
{
float att = getAttention(); //
if (att > 0) //
{
for (speed=64;speed<128;speed++) 這邊是我自己馬達加進去的地方
analogWrite(speedPinA, speed);
digitalWrite(dir1PinA, LOW);
digitalWrite(dir2PinA, HIGH);
}
toggleTinyLed(); //
}
/*** Headset ***/
void connectHeadset() 連結腦波
{
delay(3000);
Serial.write(0xc2); //
}
byte readOneByte() 腦波連結的地方,我沒改
{
while (!Serial.available()) { //
delay(5); // ms
};
return Serial.read();
}
float getAttention() 他要執行的副程式,裡面也有腦波連結的部份,我也都沒改
{ // return attention percent (0.0 to 1.0)
// negative (-1, -2...) for error
byte generatedChecksum = 0; //
byte checksum = 0;
int payloadLength = 0;
byte payloadData[64] = {
0
};
int poorQuality = 0;
float attention = 0;
Serial.flush(); // prevent serial buffer from filling up //
這是他連節的一些資料,也都是不用改的
/* Sync */
if (170 != readOneByte()) return -1; //
if (170 != readOneByte()) return -1;
/* Length */
payloadLength = readOneByte();
if (payloadLength > 169) return -2; //
/* Checksum */
generatedChecksum = 0;
for (int i = 0; i < payloadLength; i++) { //
// Read payload into array:
payloadData = readOneByte();
generatedChecksum += payloadData;
}
generatedChecksum = 255 - generatedChecksum;
checksum = readOneByte();
if (checksum != generatedChecksum) return -3; //
/* Payload */
for (int i = 0; i < payloadLength; i++) { //
switch (payloadData) {
case 0xD0:
case 4: //
i++; //
attention = payloadData; //
//if ( attention > 50 && attention <= 100)
//{return 1;}
break;
case 2:
i++;
poorQuality = payloadData;
if (200 == poorQuality) {
return -4;
}
break;
case 0xD1:
case 0xD2:
case 0xD3:
case -70:
case 0x80: // skip RAW //
i = i + 3;
break;
case 0x83: // skip ASIC_EEG_POWER
i = i + 25;
break;
} // switch
} // for
return (float)attention/100 ; //
} |
|