2016年2月2日 星期二

Arduino遙控車.

買了Seeeduino Lotus, 這片板子 其實就是Arduino UNO的表親.
相當於Arduino UNO + Grove shield的組合

Seeeduino Lotus photo.jpg
既然如此,這樣應該可以把原先的樹莓派小車,改成廉價版本的Arduino小車.
但考慮到Arduino無法直接使用藍芽搖桿連線.腦筋就動到 AT89S525萬用遙控器身上
在此跟賣家盜圖,點圖就是賣家的賣場.有興趣的朋友可以去買.
至於零件的部分,露天拍賣上可以找到大概花費1000有找.
自走車 車體套件 L298N馬達驅動模組
NTD: 650
雙頭母對母 20CM杜邦線 * 10 Pcs
NTD 28
Arduino Nano V3.0
NTD 100
無線遙控模組 AT89S52 315MHz (點控式)
NTD 110


就四個按鈕先定義小車的行為 先做以下動作定義





A
B
C
D
動作定義
0
0
0
0
停止
0
0
0
1
原地左轉
0
0
1
0
原地右轉
0
0
1
1
無定義
0
1
0
0
後退
0
1
0
1
後退左轉
0
1
1
0
後退右轉
0
1
1
1
無定義
1
0
0
0
前行
1
0
0
1
前行左轉
1
0
1
0
前行右轉
1
0
1
1
無定義
1
1
0
0
無定義
1
1
0
1
無定義
1
1
1
0
無定義
1
1
1
1
無定義


定義好 就開始組裝接線 就些接線的部分

Arduino Nano
 L298N
AT89S52
Remark
D2
IN1
 
 
D3
IN2
 
 
D4
IN3
 
 
D5
IN4
 
 
D6
 
 
 
D7
 
 
 
D8
 
D0
 
D9
 
D1
 
D10
 
D2
 
D11
 
D3
 
GND
GND
GND
 L298N /  AT89S52 GND都要接到ArduionGND,GND需等位準





就Coding的部分先假設會成功...以下程式還沒正式上路.但可藉由UART監控 遙控器的作動
以下為程式碼,使用Arduino的軟體將下文複製到編輯區,上傳到Arduino.上傳完畢後.
順利的話應該車就會順著遙控器的指令行動了
(Arduino的編輯器網址:https://www.arduino.cc/en/Main/Donate,網頁上有下載點Just Download,點選即可下載安裝)


// defines pins numbers
const int PinIN1 = 2; // D2 link to L298N IN1
const int PinIN2 = 3; // D3 link to L298N IN2
const int PinIN3 = 4; // D4 link to L298N IN3
const int PinIN4 = 5; // D5 link to L298N IN4
const int PinD0 = 8; // D8 link to AT89S52 315M AVR D0
const int PinD1 = 9; // D9 link to AT89S52 315M AVR D1
const int PinD2 = 10; // D10 link to AT89S52 315M AVR D2
const int PinD3 = 11; // D11 link to AT89S52 315M AVR D3
const int Pulses = 200; //Define delay time 1000 = 1 sec
int BTN_A = 0;
int BTN_B = 0;
int BTN_C = 0;
int BTN_D = 0;
int BTN[4] = {0, 0, 0, 0};
//Sub Function for Moto Ctrl L298N
void StopMoving(){ // L298N asking Motor STOP
    digitalWrite(PinIN1, LOW);
    digitalWrite(PinIN2, LOW);
    digitalWrite(PinIN3, LOW);
    digitalWrite(PinIN4, LOW);
    }
void TurnRight(){  // L298N asking Motor Turn Right
    digitalWrite(PinIN1, LOW);
    digitalWrite(PinIN2, HIGH);
    digitalWrite(PinIN3, LOW);
    digitalWrite(PinIN4, HIGH);
    }
void TurnLeft(){ // L298N asking Motor Turn Right
    digitalWrite(PinIN1, HIGH);
    digitalWrite(PinIN2, LOW);
    digitalWrite(PinIN3, HIGH);
    digitalWrite(PinIN4, LOW);
    }
void Backward(){ // L298N asking Motor Go Backward
    digitalWrite(PinIN1, LOW);
    digitalWrite(PinIN2, HIGH);
    digitalWrite(PinIN3, HIGH);
    digitalWrite(PinIN4, LOW);
    }
void Fordward(){ // L298N asking Motor Go Fordward    
    digitalWrite(PinIN1, HIGH);
    digitalWrite(PinIN2, LOW);
    digitalWrite(PinIN3, LOW);
    digitalWrite(PinIN4, HIGH);
    }
void BackwardRight(){
    digitalWrite(PinIN1, LOW);
    digitalWrite(PinIN2, HIGH);
    digitalWrite(PinIN3, LOW);
    digitalWrite(PinIN4, LOW);
}
void BackwardLeft(){
    digitalWrite(PinIN1, LOW);
    digitalWrite(PinIN2, LOW);
    digitalWrite(PinIN3, HIGH);
    digitalWrite(PinIN4, LOW);
}
void ForwardRight(){
    digitalWrite(PinIN1, HIGH);
    digitalWrite(PinIN2, LOW);
    digitalWrite(PinIN3, LOW);
    digitalWrite(PinIN4, LOW);
}
void ForwardLeft(){
    digitalWrite(PinIN1, LOW);
    digitalWrite(PinIN2, LOW);
    digitalWrite(PinIN3, LOW);
    digitalWrite(PinIN4, HIGH);
}
 
void setup() {
  Serial.begin(9600);
  Serial.println("Hello! I'm Arduino Car.\n");
  // Sets the 4 pins as Output to L298N
  pinMode(PinIN1,OUTPUT);
  pinMode(PinIN2,OUTPUT);
  pinMode(PinIN3,OUTPUT);
  pinMode(PinIN4,OUTPUT);
  // Sets the 4 pins as Input from AT89S52 315M
  pinMode(PinD0,INPUT);
  pinMode(PinD1,INPUT);
  pinMode(PinD2,INPUT);
  pinMode(PinD3,INPUT);
}

void loop() {
  BTN_A = digitalRead(PinD0);
  BTN_B = digitalRead(PinD1);
  BTN_C = digitalRead(PinD2);
  BTN_D = digitalRead(PinD3);
  BTN[0] = BTN_A;
  BTN[1] = BTN_B;
  BTN[2] = BTN_C;
  BTN[3] = BTN_D;

// Serial print the AT89S52 315M D0~D3 Status
  Serial.print("BTN Status: A=");
  Serial.print(BTN_A);
  Serial.print(" ; B=");
  Serial.print(BTN_B);
  Serial.print(" ; C=");
  Serial.print(BTN_C);
  Serial.print(" ; D=");
  Serial.print(BTN_D);    
  Serial.print(". \t");
  Serial.print(". \n");
  if (BTN_A == 0 &&  BTN_B == 0 && BTN_C == 0 &&  BTN_D == 0){ // ABCD=0000 define STOP
    StopMoving();
    }

  if (BTN_A == 1 &&  BTN_B == 0 && BTN_C == 0 &&  BTN_D == 0){ // ABCD=1000 define fordward
    Fordward();
    }

  if (BTN_A == 0 &&  BTN_B == 1 && BTN_C == 0 &&  BTN_D == 0){ // ABCD=0100 define backward
    Backward();
    }

  if (BTN_A == 0 && BTN_B == 0 && BTN_C == 1 &&  BTN_D == 0){ // ABCD=0010 define Turn Right
    TurnRight();
    }

  if (BTN_A == 0 && BTN_B == 0 && BTN_C == 0 &&  BTN_D == 1){ //  ABCD=0001 define Turn Left
    TurnLeft();
    }
 
  if (BTN_A == 1 && BTN_B == 0 && BTN_C == 1 &&  BTN_D == 0){ // ABCD=1010 define Turn Left for forward
    ForwardLeft();
    }

  if (BTN_A == 1 && BTN_B == 0 && BTN_C == 0 &&  BTN_D == 1){ // ABCD=1001 define Turn Right for forward
    ForwardRight();
    }

  if (BTN_A == 0 && BTN_B == 1 && BTN_C == 1 &&  BTN_D == 0){ // ABCD=0110 define Turn Left for backward
    BackwardLeft();
    }

  if (BTN_A == 0 && BTN_B == 1 && BTN_C == 0 &&  BTN_D == 1){ // ABCD=0101 define Turn Right for backward
    BackwardRight();
    }

}

2016年1月22日 星期五

原來網路上有Library可用

網路資訊發達的好處是 原來很多事情都不需要親自coding.
https://www.pjrc.com/teensy/td_libs_AccelStepper.html
就以這網站的說明範例,這位作者也太佛心了吧.
看完之後我都想哭了....
X-Y Table的API都備好了...剩下就是交叉組合使用.

現在想要的是 買片萬用版 Nano的板子好貴唷
http://goods.ruten.com.tw/item/show?21511596464341

可搭配多枚A4988,電容, 12V電源, LDO,二極體  演練一遍這個範例.....

如果是UNO的版本..選擇多又便宜
Arduino cnc shield v3 雕刻機擴展板 

如就電子積木價格上的優勢,Arduino比Raspberry Pi較親切...

2016年1月19日 星期二

不用插電就很好玩的搖桿

大人看到搖桿大概就是想要接上電視 插上電源開機
但小朋友就不一樣囉!小孩最好玩的地方就是想像力.

老大莫約一歲多的時候,看到搖桿因為按鈕顏色很繽紛,
馬上煞有其事的就定位亂按了,但事實上該設備並未與任何裝置連線

光是按按鈕就很歡樂了.大腿還跨在上面壓住綠色按鈕.

兩年後.老爸我又添購新設備,如下.這回是兩姊妹模擬開車,
為啥是模擬開車,這想像力是姐姐的.姐姐叫妹妹來上車要開車囉.

同樣的,此設備在沒有接上電線的狀況下,兩個小孩玩得不亦樂乎.
等長大再回來看,不知道這兩位會不會臉色三條斜線.

但兩個人都很賞臉的,玩了一會之後要回頭玩爸爸之前提供的搖桿.
大概是配色不夠繽紛吧.顏色的問題好解決.

改裝剛好就如下圖,瞧一下子就彩色起來了.
至於為啥會是這個配色.這個啊~~因為SNK那個遊戲商的遊戲剛好有設定
A紅色/B黃色/C綠色/D藍色.就只是剛好套用上去. 黑色就不要去計較了.
至於換的理由還有一個!日系的按鍵比較不傷手.


2016年1月13日 星期三

JAMMA pin define

最近新認識了一個connector叫JAMMA, Pin define 如下
忽然在想 如果弄出一個萬用板 搭配如下Pin define 對應到Raspberry Pi後.
運行recalbox後不就變成了大型電玩機板了.


 這是recalbox的Pin定義,看來有機會..

但問題是JAMMA這一版本看起來button的數量太少
另外一個設定也只是把預留的部分多加兩鍵 但也不到六鍵的狀況....


沒想到 NEOGEO的設定是另外一個狀況,
利用音量的位置.或許這就是一招吧
畢竟當年大型電玩的部分 玩家也不會在意音量啊


Jamma Pinout
Solder SideParts Side
GNDA1GND
GNDB2GND
+5vC3+5v
+5vD4+5v
-5vE5-5v
+12vF6+12V
KEY H7KEY
coin counter #2J8coin counter #1
lock out coil #2K9lock out coil #1
speaker (-)L10speaker (+)
M11
video greenN12video red
video syncP13video blue 
service switchR14video gnd
tilt switchS15test switch
coin switch #2T16coin switch #1
2p startU171p start
2p upV181p up
2p downW191p down
2p leftX201p left
2p rightY211p right
2p button 1Z221p button 1
2p button 2a231p button 2
2p button 3b241p button 3
2p button 4c251p button 4
2p button 5d261p button 5
GNDe27GND
GNDf28GND

2016年1月9日 星期六

透過COM port控制Arduino的辦法

這篇文章 大概就是我需要的解藥了
http://coopermaa2nd.blogspot.tw/2011/02/arduino-serial-led.html

內文提到使用switch (inByte)這指令來判斷按下的鍵盤按鈕為何?
這下對於特殊的ASCII就會有疑惑了,比如說上下左右呢?
果然網路上的資料真多,一查馬上有.

First Character is Escape (27 [0x1B]) followed by...
Key PressedASCII CharacterKey PressedASCII Character
F10x3BINS0x52
F20x3CDEL0x53
F30x3DHOME0x47
F40x3EEND0x4F
F50x3FPAGE UP0x49
F60x40PAGE DOWN0x51
F70x41UP Arrow0x48
F80x42DOWN Arrow0x50
F90x43LEFT Arrow0x4B
F100x44RIGHT Arrow0x4D
F110x57WINDOWS0x5B
F120x58Print Screen0x54

瞧這就是答案了.嘿嘿~距離計畫完成又更進一點了.

 switch(inByte)
        {
            case 0x49:
              Serial.print("[PgUp]");
              break;
            case 0x51:
              Serial.print("[PgDn]");
              break;    

搭配上回的步進馬達控制 組合起來就開心啦...
// defines pins numbers
const int XstepPin = 2;
const int XdirPin = 5;
const int YstepPin = 3;
const int YdirPin = 6;
// Makes pulses for making one full cycle rotation
const  int pulses = 2;

void setup() {
  Serial.begin(9600);
  // Sets the 4 pins as Outputs
  pinMode(XstepPin,OUTPUT);
  pinMode(XdirPin,OUTPUT);
  pinMode(YstepPin,OUTPUT);
  pinMode(YdirPin,OUTPUT);
}
void loop() {

  if (Serial.available() > 0) {
    int inByte = Serial.read();
    switch (inByte) {
    //UP Arrow
    case '0x48':
      digitalWrite(YdirPin,HIGH); // Enables the motor to move in a particular direction
      for(int y = 0; y < pulses; y++) {
        digitalWrite(YstepPin,HIGH);
        delayMicroseconds(50);
        }
        digitalWrite(YstepPin,LOW);
      break;
   
    //DOWN  Arrow
    case '0x50':
      digitalWrite(YdirPin,LOW); // Enables the motor to move in a particular direction
      for(int y = 0; y < pulses; y++) {
        digitalWrite(YstepPin,HIGH);
        delayMicroseconds(50);
        }
        digitalWrite(YstepPin,LOW);
      break;
     
    //LEFT Arrow
    case '0x4B':
      digitalWrite(XdirPin,LOW); // Enables the motor to move in a particular direction
      for(int x = 0; x < pulses; x++) {
      digitalWrite(XstepPin,HIGH);
      delayMicroseconds(50);        
      }  
      digitalWrite(XstepPin,LOW);
      break;

    //RIGHT Arrow
    case '0x4D':
      digitalWrite(XdirPin,HIGH); // Enables the motor to move in a particular direction
      for(int x = 0; x < pulses; x++) {
      digitalWrite(XstepPin,HIGH);
      delayMicroseconds(50);
      }  
      break;
      digitalWrite(XstepPin,LOW);
    }



PS.
文中其中提到沒有直接反應的RS232軟體.感謝Google
馬上找到免費的

AccessPort 1.36 RS232 串列埠存取工具

http://tedmyblog.blogspot.tw/2011/11/accessport-136-rs232.html

2016年1月8日 星期五

Pandoras Box V4 Opening


萬惡的淘寶.竟然出現這樣的東西.讓我們來消滅它.
因此,同事們就發動團購了.

不免俗的一定要來給他開箱,鐵箱體內出現的主機板名稱為月光寶盒


都說要開箱了,繼續給他開下去,裡面出現了一張主機板
CPU是全志A13,ARM Cortex-A8 架構的,單核心
搭配有金手指,這金手指的Pin Define遵照JAMMAspec 但這不是重點.
重點是這裡面搭配的是SD記憶卡.

哈.那不就是跟樹莓派一樣,要搭配記憶卡當作業系統存放的ROM.
(喔~附的還是8G的記憶卡)
一樣都是ARM..會不會這張SD卡可以放進樹莓派..No!!

難道說...這是使用SDLMAME開發出的系統嗎?
想知道很簡單,再Windows下如果想看到Linux的系統,得靠一個軟體"DiskInternals"
http://www.diskinternals.com/download/zd1452349459378/Linux_Reader.exe
下載後安裝,就可以將SD卡的內容讀出.

看來這SD雖說8G,目前使用6.36G,如要更換ROM應該有空間.
就Linux的使用習慣來說,先往usr的目錄看看,一看還有個sd的目錄,這應該就中獎啦.
果真ROM就在此.

為預防損毀 建議先用Win32DiskImager建立起一個SD的image
我是命名為PD4.img
於Linux系統下查看 

可以看到兩個partition的資訊,請注意321300的這個數字 
sudo mount -o loop,offset=$((321300 * 512) PD4.img rootfs
就可以將PD4.img 掛載到rootfs的目錄下
成功後進入rootfs下的/usr/sd的目錄內就可以看到遊戲的roms 跟預覽movies
遊戲是可以刪除的.但推估目錄選單是不會有改變的吧!


題外話說很多,回來繼續討論開箱.

就搖桿的操控性來講,相較於SANWA搖桿按鍵手感以及按鍵的回彈delay的狀況來比較
大陸寶聯的表現是比較差的.差異的點應該在微動開關的部分
方向搖桿的微動開關回彈力過大, 會早成反方向誤擊.
按鍵的微動開關,switch的高度太高,造成delay的時間較長.如果要比連發的速度.這蠻累的.
如果我要改裝的話..算一下價格要花1650 .也是一筆開銷.

清單如下
三和搖桿 SANWA JLW-TM-8 兩支 380*2 = 760
三和 SANWA GT-Y 八方內橘圓盤 150*1 = 150
三和孔塞 SANWA OBSM-24,       40*2 = 80
三和按鈕 (SANWA PUSHBUTTON) OBSF30 紅*2  55*2 = 110
三和按鈕 (SANWA PUSHBUTTON) OBSF30 黃*2  55*2 = 110
三和按鈕 (SANWA PUSHBUTTON) OBSF30 綠*2  55*2 = 110
三和按鈕 (SANWA PUSHBUTTON) OBSF30 藍*2  55*2 = 110
三和按鈕 (SANWA PUSHBUTTON) OBSF30 黑*4  55*4 = 220



PS.
上網查了一下,看來也有玩家也是跟我有一樣的想法,會想要換遊戲.
不過他實驗成功的是 月光寶盒3 英文版....
http://mengxipeng.blog.com/2015/08/07/how-to-change-or-add-games-in-pandoras-box-v3/
還有影片呢.遊戲清單被改寫了.不過這是月光寶盒3,
經網路上的分享文章發現月光寶盒3的名氣蠻大的,因此有盜用品牌的現象.
下圖左為正常版本的月光寶盒3,而右邊呈現L型的版本則是月光寶盒3的複製版本.
也就是可修改的版本.
關於可修改的版本,法國人更猛,還有出完整的破解教學http://openthepandora.ovh/
這影片上是直接將月光寶盒3複製版本裝進營業用框體,
上網查了一下.其實這框體有類似的DIY套件.


2027日本旅遊行程規劃

這回還是請出厲害的Grok + Chatgpt 兩位大神一起討論旅遊計畫,以下是討論結果   京阪神  6 天 5 夜   家族溫馨祈福之旅計畫書( 2027 年 1 月 23 日~ 28 日   國泰版) 四大兩小(含 65 歲長輩與國中生)|住一黑門酒店|全程大眾交通|體力優...