樂高發牌機 [2017春季電腦展 創客市集] 4/7~4/10展出

版上是否有跟上的成品嗎?
一起來分享!
進度遠遠落後呀
目前我只能寫到
1. 遙控啟動
2. 轉到設定的1個方向(速度還不能調到最快...要不然常常停不住,就開始原地自轉不停了.....)
3. 停止轉向馬達
4. 啟動發牌馬達
5. 避障模組感應牌張後停止發牌馬達

然後就動不了了.....



之前靠馬達控制(不經過電子羅盤&避障模組)可以設定到
往四個方向發牌
依序發牌剛好發完52張牌停止...
但是很靠運氣....第一張牌都發不順
(而且不曉得為什麼,一樣的設定,過沒幾分鐘後馬達轉動時間參數就都得重新調整)

過幾天上班要開始忙了....看來距離完成還得要好久
哈哈~真有趣~
真想來研究一下~

阿惟爺 wrote:
版上是否有跟上的成品...(恕刪)

目前進度:



stevense wrote:
進度遠遠落後呀目前...(恕刪)

看起來差不多了啊.
大大:
控製程式的部份能稍為說明一下嗎?謝謝。
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);
}
outrunner wrote:
發牌機mini sample code:

相關lib請上所提供的教學範例連結頁面下載.

編譯後上傳, 先按遙控器按鍵[EQ]校正電子羅盤, 連接正確的話是順時針旋轉.
再按[1]~[4]確認是否停在設定的四個位置.
接著按[NEXT]發一張牌確認發牌功能.

都沒問題就可以按[PLAY]發牌了, sample的功能是循序發52張給四家.

outrunner wrote:
相關lib請上所提...(恕刪)

太感謝大大分享程式碼出來
大大:
太感動了,謝謝你的分享//////////。
感謝樓主!! 用了樓主的程式碼後功能正常了~~~
太感動了!! 謝謝~
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 16)

今日熱門文章 網友點擊推薦!