rjhwung wrote:
控製程式的部份能稍為說明一下嗎?謝謝。
紅外線遙控器 Car MP3
電子羅盤 HMC8883L
馬達驅動器 TB6612
紅外線避障模組
發牌機mini sample code:
// OC13 Card Dealer mini sample v1.1
#include <IRremote.h>
#include <Wire.h>
#include <HMC5883L.h>
int recvPin = 12;
int inPin = 11;
IRrecv irrecv(recvPin);
decode_results results;
HMC5883L compass;
int dx = 0;
int dy = 0;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(3, OUTPUT); //play card PWM
pinMode(4, OUTPUT); //play card
pinMode(5, OUTPUT); //play card
pinMode(6, OUTPUT); //
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT); //player PWM
pinMode(inPin, INPUT);
digitalWrite(3, HIGH);
digitalWrite(6, HIGH);
analogWrite(9, 0); // 0~255
Serial.println("OC13 Card Dealer mini sample v1.0");
InitCompass();
}
void InitCompass()
{
Serial.println("Initialize HMC5883L");
while (!compass.begin())
{
Serial.println("HMC5883L not found, check the connection!");
delay(500);
}
compass.setRange(HMC5883L_RANGE_1_3GA);
compass.setMeasurementMode(HMC5883L_CONTINOUS);
compass.setDataRate(HMC5883L_DATARATE_75HZ);
compass.setSamples(HMC5883L_SAMPLES_4);
}
int GetHeading()
{
Vector norm = compass.readNormalize();
int heading = atan2(norm.YAxis - dy, norm.XAxis - dx) / PI * 180;
if (heading < 0) heading += 360;
return heading;
}
void CompassCalibrate()
{
analogWrite(9, 255);
digitalWrite(8, 1); // start player motor
int dx_max = -10000;
int dx_min = 10000;
int dy_max = -10000;
int dy_min = 10000;
unsigned long t = millis();
while (millis() - t < 4000)
{
Vector norm = compass.readNormalize();
if (norm.XAxis > dx_max) dx_max = norm.XAxis;
if (norm.XAxis < dx_min) dx_min = norm.XAxis;
if (norm.YAxis > dy_max) dy_max = norm.YAxis;
if (norm.YAxis < dy_min) dy_min = norm.YAxis;
delay(5);
}
digitalWrite(8, 0); // stop player motor
dx = (dx_max + dx_min) / 2;
dy = (dy_max + dy_min) / 2;
Serial.print("dx = ");
Serial.print(dx);
Serial.print(", dy = ");
Serial.println(dy);
}
int Player(int pos)
{
analogWrite(9, 150);
digitalWrite(8, 1); // start player motor
int prePos = GetHeading() - pos;
unsigned long t = millis();
while (millis() - t < 4000)
{
delay(5);
int curPos = GetHeading() - pos;
if (prePos <= 0 && curPos >= 0)
{
digitalWrite(8, 0); // stop player motor
return 1;
}
prePos = curPos;
}
digitalWrite(8, 0); // stop player motor
return 0;
}
int PlayCard()
{
digitalWrite(5, 1);
unsigned long t = millis();
while (millis() - t < 2000)
{
if (digitalRead(inPin) == LOW)
{
delay(70);
digitalWrite(5, 0);
return 1;
}
}
digitalWrite(5, 0);
return 0;
}
void Deal()
{
int pos = 60;
for (int i = 0; i < 52; i++)
{
if (Player(pos) == 0) break;
if (PlayCard() == 0) break;
pos = (pos + 90) % 360;
delay(200);
}
}
void TranslateIR() // takes action based on IR code received // describing Car MP3 IR codes
{
switch (results.value)
{
case 0xFF22DD:
Serial.println(" PREV ");
break;
case 0xFF02FD:
Serial.println(" NEXT ");
PlayCard();
break;
case 0xFFC23D:
Serial.println(" PLAY/PAUSE ");
Deal();
break;
case 0xFF906F:
Serial.println(" EQ ");
CompassCalibrate();
break;
case 0xFF30CF:
Serial.println(" 1 ");
Player(60);
break;
case 0xFF18E7:
Serial.println(" 2 ");
Player(150);
break;
case 0xFF7A85:
Serial.println(" 3 ");
Player(240);
break;
case 0xFF10EF:
Serial.println(" 4 ");
Player(330);
break;
default:
//Serial.println(" other button ");
break;
}
delay(100);
} //END translateIR
void loop()
{
if (irrecv.decode(&results)) {
// Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
TranslateIR();
}
delay(10);
}
關閉廣告