2015年10月31日 星期六

ROSA 系統開發 11 ─ PS2 搖桿控制

http://4rdp.blogspot.tw/2015/10/rosa-11-ps2.html

圖片來自 http://www.ltc.com.tw/
能與 Arduino 相連接的遊戲模組,以 PS2 搖桿最常見,俗稱香菇頭,它有 5 pin 端子,為 +, -, B, X, Y,分別與 Arduino 的 5V、GND、Dx、Ax、Ax 相接,Dx 是數位輸入腳,平時為 0當有按壓時為 1,Ax 為類比輸入腳,平常讀值約為 512,當搖桿偏一邊為 <200 或 >800,所以可以用這判斷搖桿偏向何處。










// (C) 2015, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)

// normal pin control
byte D_IN(byte p){
  pinMode(p, INPUT);
  return digitalRead(p);
}
unsigned int A_IN(byte p){
  pinMode(p, INPUT);
  return analogRead(p);
}

void PROCESS_1sec(void){
  Serial.print("A0 - (Y) ");
  Serial.println(A_IN(A0));
  Serial.print("A1 - (X) ");
  Serial.println(A_IN(A1));
  Serial.print("A2 - (B) ");
  Serial.println(D_IN(A2));
}

2015年10月28日 星期三

訓練數學感 77 ─ 平方數和

http://4rdp.blogspot.tw/2015/10/77.html

話說數學家高斯在小時候就懂 1 到 100 總和速解,我的小朋友也對我出題,有沒有 1 到 100 的平方數和的公式解?

也就是 12 + 22 + 32 + ..... + 1002 = ?

2015年10月24日 星期六

ROSA 系統開發 10 ─ 蜂鳴器 (Buzzer)

http://4rdp.blogspot.tw/2015/10/rosa-10-buzzer.html

蜂鳴器在嵌入式系統中,是很常見的硬體裝置,因為它可以發出聲音,提示操作者目前系統的狀態,本文將說明如何加入蜂鳴器功能。

// (C) 2015, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)

// pin 8    Buzzer
#include "MeBuzzer.h"
MeBuzzer buzzer;

byte pitch = 0;
const PITCH[] = {
  // C    C#   D    D#   E    F    F#   G    G#   A    A#   B
  0, 131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247,
};

// pin 2,3   IR
#include "MeIR.h"
MeIR ir;


const byte IR_CODE[][13] = {
  //X,  1,  2,  3,  4,  5,  6,  7,  A,  B,  C,  D,  E, 
    0, 12, 24, 94,  8, 28, 90, 66, 69, 70, 71, 68, 67, 
    0,  1,  3,  5,  6,  8, 10, 12,  7,  9, 11,  2,  4, 
};

void IR_CHECK() {   // for mBot car
  static byte sound = 0;
  static byte pre_ir;
  byte i;
  byte j;
  if (sound != 0){
    if (--sound == 0) {
      buzzer.noTone();
      ir.loop();
    }
  } 
  if (sound==0) {
    j = ir.key();
    for (i = 12; i<13; i--) {
      if (j == IR_CODE[0][i] && pre_ir != j) {
pre_ir = j;
if (i==0)
         ;
else {
         pitch = IR_CODE[1][i];
         buzzer.tone(PITCH[pitch]);
         sound = 2;    // 2 x 100ms
         // Serial.print("IR - ");
         // Serial.println(pitch);
}
break;
      }
    }
  }
  if (sound == 0)
    ir.loop();
}

2015年10月20日 星期二

數學之美 3 ─ 圖解三角函數角和差

http://4rdp.blogspot.tw/2015/10/blog-post.html

有些東西,只要欣賞就好,這張圖對剛學三角函數的中學生,非常實用。

2015年10月17日 星期六

ROSA 系統開發 9 - LED 顯示

http://4rdp.blogspot.tw/2015/10/rosa-9-led.html

mBot 電路示意圖
在 mBot 本體上有三顆 LED 可被 ROSA 控制,這三顆 LED 皆由 D13 腳輸出控制,L 為一般 LED,D13 HIGH 時燈亮,LOW 時燈滅,而 RGB LED1 及 RGB LED2,則是 WS2812 4 pin RGB LED,最多可以串聯四顆同型 LED,只要串聯傳送控制訊號即可。









// (C) 2015, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)

// pin 13   LED
#include "adafruit_neopixel.h"
#define LEDPIN     13
Adafruit_NeoPixel strip = Adafruit_NeoPixel(2, LEDPIN, NEO_GRB + NEO_KHZ800);
void setup() {
  // pin 13
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

}


void PROCESS_100ms(void){
  static byte  led = 0;
  led = 1 - led;
  digitalWrite(13, led);    // LED L
}


void PROCESS_1sec(){
  static byte red = 0;
  static char dir = 100;
  red += dir;
  if (red >= 200) dir = -100;
  else if (red == 0) dir = +100;
  strip.setPixelColor(0, strip.Color(red, 0, 0));   // LED1
  strip.show();

  static byte i = 0;
  i = 1 - i;
  if (i == 0)
    strip.setPixelColor(1, strip.Color(0, 20, 0));  // LED2
  else
    strip.setPixelColor(1, strip.Color(0, 0, 20));
  strip.show();

}


2015年10月13日 星期二

訓練數學感 76 ─ 房貸

http://4rdp.blogspot.tw/2015/10/76.html

圖片來源 中國經濟網
假設要購屋貸款1000萬,固定年利率 2%,並且無寬限期條件,請問貸款 20 年分期本息攤還,與貸款 30 年本息分期攤還,差異在哪?

2015年10月10日 星期六

ROSA 系統開發 8 ─ 程式設計風格

http://4rdp.blogspot.tw/2015/10/rosa-8.html

在繼續進行其它單元內容前,需要說明一下 ROSA 程式設計風格,讓讀者深入了解為什麼 ROSA 採取一些程式獨特風格或是設計技巧,不敢直言這些方法一定是最棒最好,但是個人就是喜歡這樣風格。

從前面小節內容,讀者們已經看過 ROSA 程式範例,眼尖的讀者可能發現,基本上 ROSA 的常數、副程式名稱都是以英文字母大寫表示,記憶變數都是以英文字母小寫表示。ROSA 之所以這樣方式撰寫,是經過多年摸索的經驗,因為可以從名稱上立即判別它是變數、常數或是副程式。不過引用外部程式庫或是特殊用語時,則是依照外部習慣名稱命名方式撰寫,否則依循 ROSA 習慣寫作。

第二點,

2015年10月6日 星期二

訓練數學感 75 ─ 智取金幣

http://4rdp.blogspot.tw/2015/10/75.html

甲乙兩人挖出許多金幣,共有三十袋,第一袋有一枚,第二袋有兩枚,第三袋有三枚,依此排序,也就是編號幾號的袋子裏就有多少枚金幣。

因為是乙先發現的,所以由乙訂出一個分金幣的規則,他要求分金幣規則如下:
每當甲從待分區拿一袋金幣時,乙也可以從待分區拿走甲的號碼因數袋子,如果待分區沒有符合因數的袋子時,乙可以從甲方拿走所有符合因數的袋子。


例如,甲先拿 9 號袋子,乙則可以拿 3、1 號袋子。接著甲拿 6 號袋子,乙可以拿 2 號袋子,甲再拿 27 號袋子,因為乙無法從待分區拿取任何袋子,所以他可以從甲方拿走 27、9 號袋子。

那麼,甲怎樣可以拿到最多的金幣?

2015年10月3日 星期六

ROSA 系統開發 7 ─ mBot 避碰模式

http://4rdp.blogspot.tw/2015/10/rosa-7-mbot.html

前面章節已經介紹 ROSA 應用於 mBot 的紅外線操控車及循跡車,現在繼續加入避碰車功能。

// (C) 2015, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)


void PROCESS_100ms(void){
  IR_CHECK();
  WA_CHECK();
}

// pin 17,16   UltraSound   A3,A2
void WA_CHECK(void){
  if (line_state != LINE_WA) return;
  if (GET_DISTANCE(17, 16) < 15.0)    // cm
    MOTOR(MOVE_RIGHT, car_speed);
  else
    MOTOR(MOVE_FORWARD, car_speed);
}

float GET_DISTANCE(unsigned char trig, unsigned char echo){
  D_OUT(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  pinMode(echo, INPUT);
//               pin   read     us
  return pulseIn(echo, HIGH, 30000) / 58.0;   // cm
}