2015年9月30日 星期三

訓練數學感 74 ─ 倒水剩多少?

http://4rdp.blogspot.com/2015/09/74.html?m=0

有 A、B 兩個容器,A 裝滿一公升,而 B 則是空空的,
第一次,A 往 B 倒 A 容器內 1/2 水量
第二次,B 往 A 倒 B 容器內 1/3 水量
第三次,A 往 B 倒 A 容器內 1/4 水量
    :
    :
請問倒完第一百次水,A 容器裡面有多少水?

2015年9月26日 星期六

ROSA 系統開發 6 ─ mBot 循跡自走

http://4rdp.blogspot.com/2015/09/rosa-6-mbot.html?m=0

mBot 的循跡功能是藉由尋線感應器 (Line Sensor) 感知黑色與白色狀態,只要檢知不是黑色的情形,尋線感應器就會亮燈,並回傳檢知狀態到控制板,檢知黑色時,數位輸入訊號為 low (0 V),反之為 high (5 V)。

mBot 的循線感應器有兩個感知端點,以車體俯視角度來看,兩個檢知燈都亮時,表示車子不在線上,兩個燈都滅時,表示車子壓在線上,亮右燈表示車子偏右邊,亮左邊則偏左邊。

根據上述說明,先加入前面章節程式碼,下面為循跡自走範例:


// (C) 2015, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)
// pin 9,10  line
enum {
LINE_STOP,   // MANUAL CONTROL
LINE_WA,     // WALL AVOIDANCE
LINE_IN,     // LINE START
LINE_LEFT,
LINE_RIGHT,
LINE_OUT
};
enum {
LEFT_IN,
LEFT_LEFT,
LEFT_RIGHT,
LEFT_OUT,

RIGHT_IN,
RIGHT_LEFT,
RIGHT_RIGHT,
RIGHT_OUT,
};

byte line_alteration;
byte line_state;
byte car_speed = 255;

void LINE_CHECK(void) {
byte i;
if (line_state >= LINE_IN) {
if (D_IN(9) == LOW)
i = (D_IN(10) == LOW) ? LINE_IN : LINE_RIGHT;    // LH  @ line right side
else
i = (D_IN(10) == LOW) ? LINE_LEFT : LINE_OUT;     // HL  @ line left side
line_alteration = (line_state - LINE_LEFT) * 4 + i - LINE_IN;
if (i == LINE_LEFT || i == LINE_RIGHT)
line_state = i;
LINE_RULE();
}
}
void LINE_RULE(void){
switch (line_alteration){
case LEFT_IN:
MOTOR(MOVE_FORWARD, car_speed);
break;
case LEFT_LEFT:
MOTOR(MOVE_FORWARD, car_speed);
break;
case LEFT_RIGHT:
MOTOR(MOVE_FORWARD, car_speed);
break;
case LEFT_OUT:
MOTOR(MOVE_RIGHT, car_speed);
break;
case RIGHT_IN:
MOTOR(MOVE_FORWARD, car_speed);
break;
case RIGHT_LEFT:
MOTOR(MOVE_FORWARD, car_speed);
break;
  case RIGHT_RIGHT:
MOTOR(MOVE_FORWARD, car_speed);
break;
case RIGHT_OUT:
MOTOR(MOVE_LEFT, car_speed);
break;
default:
MOTOR(MOVE_FORWARD, car_speed);
break;
}
}

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

void IR_CHECK() {   // for mBot car
byte i;
switch (ir.key()) {
case 64: // mBot-up
MOTOR(MOVE_FORWARD, car_speed);
line_state = LINE_STOP;
break;
case 25: // mBot-down
MOTOR(MOVE_BACK, car_speed);
line_state = LINE_STOP;
break;
case 7:  // mBot-left
MOTOR(MOVE_LEFT, car_speed);
line_state = LINE_STOP;
break;
case 9:  // mBot-right
MOTOR(MOVE_RIGHT, car_speed);
line_state = LINE_STOP;
break;
case 69: // mBot-A      MANUAL CONTROL
MOTOR(MOVE_STOP, 0);
line_state = LINE_STOP;
break;
case 70: // mBot-B      WALL AVOIDANCE
MOTOR(MOVE_STOP, 0);
line_state = LINE_WA;
break;
case 71: // mBot-C      LINE START
MOTOR(MOVE_STOP, 0);
line_state = LINE_IN;
break;
    case 68: // mBot-D
              break;
    case 67: // mBot-E
              break;
    case 13: // mBot-F
              break;
    case 22: // mBot-0
              break;
    case 12: // mBot-1
      car_speed = 50;
      break;
    case 24: // mBot-2
      car_speed = 75;
              break;
    case 94: // mBot-3
      car_speed = 100;
              break;
    case  8: // mBot-4
      car_speed = 125;
              break;
    case 28: // mBot-5
      car_speed = 150;
              break;
    case 90: // mBot-6
      car_speed = 175;
              break;
    case 66: // mBot-7
      car_speed = 200;
              break;
    case 82: // mBot-8
      car_speed = 225;
              break;
    case 74: // mBot-9
      car_speed = 255;
              break;
    case 21: // mBot-setup
              break;
default:
break;
}
ir.loop();
}

void PROCESS_100ms(void){
  IR_CHECK();

}

void PROCESS_10ms(void){
  LINE_CHECK();
}

2015年9月23日 星期三

訓練數學感 73 ─ 生日那一天?

http://4rdp.blogspot.com/2015/09/73.html?m=0

Albert and Bernard just become friends with Cheryl, and they want to know when her birthday is.  Cheryl gives them a list of 10 possible dates.

May 15, May 16, May 19,
June 17, June 18,
July 14, July 16,
August 14, August 15, August 17

Cheryl then tells Albert and Bernard separately the month and the day of her birthday respectively.

Albert:  I don't know when Cheryl's birthday is, but I know that Bernard does not know too.
Bernard:  At first I don't know when Cheryl's birthday is, but I know now.
Albert:  Then I also know when Cheryl's birthday is.

So when is Cheryl's birthday?

2015年9月19日 星期六

ROSA 系統開發 5 ─ mBot 自走車驅動

http://4rdp.blogspot.com/2015/09/rosa-5-mbot.html?m=0

ROSA 的基本系統底層已經可以精準計時運作,現在再加入 mBot 自走車驅動,並配合前文紅外線遙控,就可以前進後退左右轉。

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


// normal pin control
void D_OUT(byte p, byte v){
pinMode(p, OUTPUT);
digitalWrite(p, v);
}
void D_PWM(byte p, byte v){
pinMode(p, OUTPUT);
analogWrite(p, v);
}
byte D_IN(byte p){
pinMode(p, INPUT);
return digitalRead(p);
}
unsigned int A_IN(byte p){
pinMode(p, INPUT);
return analogRead(p);
}


// pin 4,5,6,7
enum {
  MOVE_STOP,
  MOVE_FORWARD,
  MOVE_LEFT,
  MOVE_RIGHT,
  MOVE_BACK
};
void MOTOR(byte dir, byte speed) {
  #if TARGET == mBot
    #define M1 6
    #define M2 5
    #define M1D 4
    #define M2D 7
  #elif TARGET == motoduino
    #define M1 5
    #define M2 6
    #define M1D 10
    #define M2D 11
  #else
    #define M1 6
    #define M2 5
    #define M1D 4
    #define M2D 7
  #endif
  switch (dir) {
    case MOVE_FORWARD:
      D_OUT(M1D, HIGH);
      D_OUT(M2D, LOW);
      D_PWM(M1, speed);
      D_PWM(M2, speed);
      break;
    case MOVE_BACK:
      D_OUT(M1D, LOW);
      D_OUT(M2D, HIGH);
      D_PWM(M1, speed);
      D_PWM(M2, speed);
      break;
    case MOVE_RIGHT:
      D_OUT(M1D, LOW);
      D_OUT(M2D, LOW);
      D_PWM(M1, speed);
      D_PWM(M2, 0);
      break;
    case MOVE_LEFT:
      D_OUT(M1D, HIGH);
      D_OUT(M2D, HIGH);
      D_PWM(M1, 0);
      D_PWM(M2, speed);
      break;
    default:
      D_PWM(M1, 0);
      D_PWM(M2, 0);
  }
}

2015年9月16日 星期三

可愛 ROBI 動作影片 1

http://4rdp.blogspot.com/2015/09/robi-1.html?m=0


七十期的 ROBI 機器人雖然組好一段時間了,可惜沒甚麼時間上傳影片與大家分享,今天拍一段 ROBI 對話問答以及仰臥起坐。

2015年9月12日 星期六

ROSA 系統開發 4 ─ 紅外線遙控接收

http://4rdp.blogspot.com/2015/09/rosa-4.html?m=0

續前文,紅外線遙控很適合室內單機使用,一般距離五公尺內,還可以藉由牆面反射,按遙控器按鍵速度要求並不快,把前文的系統時間建起來後,將紅外線檢查放在 PROCESS_100ms()中就可以了,

// (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();

}


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

void IR_CHECK() {   // for mBot car
  //Serial.println(ir.key());
  switch (ir.key()) {
    case 64: // mBot-up
      //MOTOR(MOVE_FORWARD, car_speed);
              break;
    case 25: // mBot-down
      //MOTOR(MOVE_BACK, car_speed);
              break;
    case 7:  // mBot-left
       //MOTOR(MOVE_LEFT, car_speed);
             break;
    case 9:  // mBot-right
      //MOTOR(MOVE_RIGHT, car_speed);
              break;
    case 69: // mBot-A
      //MOTOR(MOVE_STOP, car_speed);
              break;
    case 70: // mBot-B
              break;
    case 71: // mBot-C
              break;
    case 68: // mBot-D
              break;
    case 67: // mBot-E
              break;
    case 13: // mBot-F
              break;
    case 22: // mBot-0
              break;
    case 12: // mBot-1
              break;
    case 24: // mBot-2
              break;
    case 94: // mBot-3
              break;
    case  8: // mBot-4
              break;
    case 28: // mBot-5
              break;
    case 90: // mBot-6
              break;
    case 66: // mBot-7
              break;
    case 82: // mBot-8
              break;
    case 74: // mBot-9
              break;
    case 21: // mBot-setup
              break;
          default:
              break;
    }
    ir.loop();
}

2015年9月9日 星期三

演算法訓練 10 ─ 幾 A 幾 B

http://4rdp.blogspot.com/2015/09/10-b.html?m=0

在學生時代應該沒有人沒玩過猜數字遊戲,就是兩個人互猜數字,比賽誰先猜到誰就獲勝,每個人先寫下讓別人猜測的數字,但是要保密不能讓對方知道,通常數字為四位數,每位數字是不重複的,有的遊戲是不含零,猜數字的人報出數值後,對方須答覆有多少數字號碼對位置也對,這稱為 A,以及數字對但是位置錯誤,這稱為 B。

大家試寫程式看看,設計讓電腦自動猜數字。

2015年9月5日 星期六

ROSA 系統開發 3 ─ 系統時間

http://4rdp.blogspot.com/2015/09/rosa-3.html?m=0

之前曾提過ROSA 的時間系統,今天解析時間如何精確計數,

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

void SYS_TIMER() {
  static byte  tm_10ms = 0;
  static byte  tm_100ms = 0;
  static byte  tm_1sec = 0;

while (millis() - now >= 10) {
now += 10;
tm_10ms++;
tm_100ms++;
tm_1sec++;
}
if (tm_1sec >= 100) {
tm_1sec -= 100;
PROCESS_1sec();
}
if (tm_100ms >= 10) {
tm_100ms -= 10;
PROCESS_100ms();
}
if (tm_10ms != 0) {
tm_10ms -= 1;
PROCESS_10ms();
}
}

void PROCESS_1sec(){
  static byte  led = 0;
//Serial.println(now);
  led = 1 - led;
  digitalWrite(13, led);  
}

void PROCESS_100ms(){
}

void PROCESS_10ms(){
}


void setup() {
  // system timer0
  now = millis();
}

void loop() {
  SYS_TIMER();      // work on timer0
}

2015年9月2日 星期三

推薦 GeoGebra 幾何繪圖

http://4rdp.blogspot.com/2015/09/geogebra.html?m=0

自己的繪圖
數學幾何免不了要畫圖,可是一般電腦並沒有安裝簡單畫直線、三角形、圓形等製圖標示軟體工具,某日網友行天下私下電郵圖解訓練數學感 71 ─ 世界上最難的簡單幾何題,看到他用 GeoGebra 繪圖,因此前往該網站一探究竟,原來是免費好用的數學圖解工具,我安裝於 Google Chrome 瀏覽器上,可以函數、幾何、統計、3D、試算表等製圖。